Compare commits

...

67 Commits

Author SHA1 Message Date
Daniel Valdivia
b658301725 Release v0.15.6 (#1763)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-24 17:14:41 -07:00
Lenin Alevski
1417375d99 Tests for Object delete button on SideBar (#1746)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-24 16:22:11 -07:00
Cesar Celis Hernandez
676420a2b3 List Policies With Given Bucket Test (#1765)
List Policies With Given Bucket Test
Incrementing the coverage
2022-03-24 15:25:38 -07:00
adfost
ffa9436276 Delete PVCs upon tenant deletion checkbox (#1752) 2022-03-24 13:17:04 -06:00
adfost
f6d92d50e4 disable legalhold if no locking (#1758) 2022-03-24 10:14:19 -07:00
Lenin Alevski
bc1cb820d1 Multiple files upload refactor (#1755)
- failed uploaded objects progress bar shows in red color
- fixed bug in where failed uploaded objects cannot be removed from
  listed objects in ObjectManager
- display delete button for failed upload objects
- display setErrorSnackMessage component after done uploading all
  objects with number of failed objects
- fixed race condition bug during multiple objects upload, now we are
  using Promise.allSettled to handle synchronization between uploads

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-24 00:11:29 -07:00
Daniel Valdivia
8772c158c6 Github Actions Job Ordering - Longer jobs first (#1761)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-23 22:26:13 -07:00
Daniel Valdivia
d673473d5e Fix Delete Versions Tests Race condition (#1760)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-23 21:47:51 -07:00
Daniel Valdivia
bb22a1d62a Fix bug when selecting storage type for AWS (#1759)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-23 21:01:14 -07:00
Cesar Celis Hernandez
f582d83afc Splitting permission test (#1757) 2022-03-23 18:35:10 -07:00
Lenin Alevski
b12fa5edfd Enable/Disable Object details actions depending on user permissions (#1756)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-23 17:17:57 -07:00
Daniel Valdivia
65eee7c1d0 Updating Operator Dependency (#1753)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-23 17:44:48 -06:00
Alex
de4cf3b554 Updated dependencies for yarn audit issues (#1749)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-23 14:36:11 -07:00
Daniel Valdivia
cca04dca1c Small tweaks (#1754)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-23 14:28:13 -07:00
Alex
bef3897d0a Added tolerations selector to Add Tenant wizard (#1747)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-23 11:49:55 -06:00
adfost
842c3dee5f Bucket rollback if remote bucket creation failed (#1744) 2022-03-22 21:42:31 -06:00
Lenin Alevski
d1d39df71e Fix enable/disable delete button for object (#1745)
- Pass the right resource to SecureComponent wrapper for delete button,
  bucket/object-full-path-including-prefix

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-22 14:36:20 -06:00
Daniel Valdivia
2321343d5e Release v0.15.5 (#1741)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-21 12:12:35 -07:00
Daniel Valdivia
ce4d9310aa AWS Marketplace Integration Updates (#1740)
Makes the create tenant for MK AWS updated with new recommendations
Fixes Back Link icon alignment and color
Adds a helpbox for MK AWS

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-21 10:21:39 -07:00
Daniel Valdivia
58c53cbe0a Release v0.15.4 (#1739)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-20 02:11:09 -07:00
Cesar Celis Hernandez
144979b372 Delete Multiple Service Accounts (#1737)
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-19 17:30:20 -07:00
Alex
e29fa04051 Enabled Delete button for sub resources (#1738)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-19 15:29:27 -07:00
Alex
5ab5232474 Delete Non-current versions (#1735)
- Delete Non-current API
- Delete non current modal implementation
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-18 13:07:34 -07:00
Lenin Alevski
d7fef8d89e Profiling endpoint fixes (#1707)
- Added support to download all profile tests
- profile.zip file was corrupted after download
- Add suspension warning
- Add Checkbox support
- Support for running multiple profiling types at the same time
- fix profiling test

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-18 13:52:42 -06:00
Cesar Celis Hernandez
3a09361899 List tenants by namespace test (#1736) 2022-03-18 10:18:37 -07:00
Prakash Senthil Vel
6ca17a3f9c Log text color styles and empty state (#1733)
Log text color styles and empty state
2022-03-17 22:19:45 -07:00
Alex
6d40ff7e1b Enabled Delete selected version functionality (#1731)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-17 19:21:21 -07:00
adfost
0b29eee9ed Adding bucket object tag tests (#1732)
adding bucket object tests
2022-03-17 19:09:04 -07:00
jinapurapu
c7fdfdd035 Added download all credentials button, added tooltips, removed Done button, Updated test to use corner X instead of Done button (#1704) 2022-03-17 13:30:30 -06:00
Daniel Valdivia
d7626e187c Integration Test: Create Service Account (#1725)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-17 13:15:06 -06:00
Cesar Celis Hernandez
39453de8fb To use DeleteMultipleObjects func and be able to debug via Browser (#1730) 2022-03-17 11:27:45 -07:00
Daniel Valdivia
0c38e93b83 Remove un-used code (#1729) 2022-03-16 22:29:43 -06:00
Prakash Senthil Vel
bf8db812b8 Address review comments (#1709) 2022-03-16 16:47:11 -07:00
Alex
0e35da8370 Added versions pill to versions page elements (#1728)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-16 16:36:53 -07:00
Cesar Celis Hernandez
b11fa26162 Adding test for creating tenant via API (#1727) 2022-03-16 15:57:30 -07:00
Prakash Senthil Vel
e3836538fc UX back button to be consistent in all screens (#1726) 2022-03-16 10:22:02 -07:00
Daniel Valdivia
9301e3b7de Release v0.15.3 (#1724) 2022-03-15 22:42:05 -07:00
jinapurapu
cf5e5a14b5 Updated tenant creation credentials download to allow mc alias import (#1683)
Removed underscore from credentials
Made credentials download output match mc alias import expected format
Added URL to createServiceAccountCreds return
2022-03-15 21:01:03 -07:00
Cesar Celis Hernandez
7f4546e879 Adding Access Rules Integration Test (#1719) 2022-03-15 20:49:17 -07:00
Alex
1a92c59e3f Added background color to selected version (#1723)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-15 20:42:12 -07:00
Alex
ade9731773 Reload main object information after restoring a version (#1720)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-15 21:26:57 -06:00
Cesar Celis Hernandez
cc43b3c743 Add list of tenants integration test (#1722) 2022-03-15 21:13:33 -06:00
Alex
b29f6a1640 Changed Sort by field to use only Date & Size (#1721)
Added size column
Changed Versions Sort by field to be only date & size
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-15 18:03:42 -07:00
Daniel Valdivia
62b8258989 Fix Get Latest MinIO Image on Tenant Create (#1703)
* Fix Get Latest MinIO Image on Tenant Create

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

* remove `operator_` prefix on files in operatorapi

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-15 15:16:26 -07:00
adfost
75bc568e4b Adding delete versions test (#1701)
adding delete versions ui test
2022-03-15 14:40:48 -07:00
Alex
b0119a55df Reload versions list after clicking on Reload button (#1717) 2022-03-15 09:45:28 -07:00
Alex
78983ce76f Added (Default) label to EC Parity selector field & fixed automatic selection of EC Parity (#1716)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-14 23:47:38 -07:00
Cesar Celis Hernandez
e060e1d97e Add Bucket LifeCycle Integration Test (#1711) 2022-03-14 19:48:25 -06:00
Daniel Valdivia
82bdc228b2 Add preview icon to object versions (#1713)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-14 15:48:20 -07:00
adfost
1fa8311af7 adding distributed setup (#1712) 2022-03-14 15:34:21 -06:00
Daniel Valdivia
93243f2c77 Run Testcafe tests with Node 16 (#1714)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-14 12:11:07 -07:00
adfost
3b423826fd Removing delete all versions option from non versioned bucket (#1710) 2022-03-14 11:13:23 -07:00
Daniel Valdivia
e44a7c94c6 Bug Fix: Preview a specific Object Version ID (#1706) 2022-03-11 22:40:14 -08:00
Daniel Valdivia
63c0d260ca Release v0.15.2 (#1696)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2022-03-11 02:35:22 -08:00
Lenin Alevski
607ca5742b Adding missing lookup fields for LDAP configuration in UI (#1698)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2022-03-11 00:18:46 -08:00
Cesar Celis Hernandez
86a3072fa9 Increasing coverage threshold from 48% to 49.4% (#1697)
* Increasing coverage threshold

* correcting the comparison logic
2022-03-10 22:42:09 -08:00
Cesar Celis Hernandez
94c60e1837 add test to delete bucket encryption (#1695) 2022-03-10 15:05:19 -08:00
Alex
5e4ad55bbd Replaced CircularProgress component with new Loader (#1690)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-10 16:18:22 -06:00
Alex
e01d8bc10e Replaced main loader for index.html (#1694)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-10 13:53:32 -08:00
Alex
74605adbee Login Page Improvements (#1692)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-09 22:11:39 -08:00
Cesar Celis Hernandez
c6bd1a28d3 Adding Get bucket encryption information test (#1691) 2022-03-09 23:00:31 -06:00
Kaan Kabalak
b4ea4e7499 Fix whitespace appearing on Login scroll after height decrease (#1689)
Fixes #1688
2022-03-09 16:35:13 -08:00
Cesar Celis Hernandez
414db326bb Adding bucket encryption test (#1687) 2022-03-09 14:07:15 -08:00
Alex
3186c1a0d0 Added Loader to Console (#1686)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-09 09:28:37 -08:00
Harshavardhana
17c70d6c07 support admin:KMSCreateKey as part of IAM policy actions (#1685) 2022-03-08 15:05:43 -08:00
Alex
57ad200288 Fixed Invalid Date message in certificates page (#1684)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2022-03-08 14:45:16 -06:00
Harshavardhana
842c11f414 update all direct deps for console (#1655) 2022-03-08 12:13:05 -08:00
766 changed files with 10162 additions and 5159 deletions

94
.github/workflows/common.sh vendored Executable file
View File

@@ -0,0 +1,94 @@
#!/usr/bin/env bash
# Copyright (C) 2022, MinIO, Inc.
#
# This code is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3,
# as published by the Free Software Foundation.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License, version 3,
# along with this program. If not, see <http://www.gnu.org/licenses/>
yell() { echo "$0: $*" >&2; }
die() {
yell "$*"
(kind delete cluster || true ) && exit 111
}
try() { "$@" || die "cannot $*"; }
function setup_kind() {
# TODO once feature is added: https://github.com/kubernetes-sigs/kind/issues/1300
echo "kind: Cluster" > kind-config.yaml
echo "apiVersion: kind.x-k8s.io/v1alpha4" >> kind-config.yaml
echo "nodes:" >> kind-config.yaml
echo " - role: control-plane" >> kind-config.yaml
echo " - role: worker" >> kind-config.yaml
echo " - role: worker" >> kind-config.yaml
echo " - role: worker" >> kind-config.yaml
echo " - role: worker" >> kind-config.yaml
try kind create cluster --config kind-config.yaml
echo "Kind is ready"
try kubectl get nodes
}
function install_operator() {
echo "Installing Current Operator"
# TODO: Compile the current branch and create an overlay to use that image version
try kubectl apply -k "${SCRIPT_DIR}/../../portal-ui/tests/scripts/resources"
echo "Waiting for k8s api"
sleep 10
echo "Waiting for Operator Pods to come online (2m timeout)"
try kubectl wait --namespace minio-operator \
--for=condition=ready pod \
--selector=name=minio-operator \
--timeout=120s
}
function destroy_kind() {
kind delete cluster
}
function check_tenant_status() {
# Check MinIO is accessible
waitdone=0
totalwait=0
while true; do
waitdone=$(kubectl -n $1 get pods -l v1.min.io/tenant=$2 --no-headers | wc -l)
if [ "$waitdone" -ne 0 ]; then
echo "Found $waitdone pods"
break
fi
sleep 5
totalwait=$((totalwait + 5))
if [ "$totalwait" -gt 305 ]; then
echo "Unable to create tenant after 5 minutes, exiting."
try false
fi
done
echo "Waiting for pods to be ready. (5m timeout)"
USER=$(kubectl -n $1 get secrets $2-env-configuration -o go-template='{{index .data "config.env"|base64decode }}' | grep 'export MINIO_ROOT_USER="' | sed -e 's/export MINIO_ROOT_USER="//g' | sed -e 's/"//g')
PASSWORD=$(kubectl -n $1 get secrets $2-env-configuration -o go-template='{{index .data "config.env"|base64decode }}' | grep 'export MINIO_ROOT_PASSWORD="' | sed -e 's/export MINIO_ROOT_PASSWORD="//g' | sed -e 's/"//g')
try kubectl wait --namespace $1 \
--for=condition=ready pod \
--selector=v1.min.io/tenant=$2 \
--timeout=300s
echo "Tenant is created successfully, proceeding to validate 'mc admin info minio/'"
kubectl run admin-mc -i --tty --image minio/mc --command -- bash -c "until (mc alias set minio/ https://minio.$1.svc.cluster.local $USER $PASSWORD); do echo \"...waiting... for 5secs\" && sleep 5; done; mc admin info minio/;"
echo "Done."
}

71
.github/workflows/deploy-tenant.sh vendored Executable file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bash
# Copyright (C) 2022, MinIO, Inc.
#
# This code is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3,
# as published by the Free Software Foundation.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License, version 3,
# along with this program. If not, see <http://www.gnu.org/licenses/>
# This script requires: kubectl, kind
SCRIPT_DIR=$(dirname "$0")
export SCRIPT_DIR
source "${SCRIPT_DIR}/common.sh"
function install_tenant() {
echo "Installing lite tenant"
try kubectl apply -k "${SCRIPT_DIR}/../../portal-ui/tests/scripts/tenant"
echo "Waiting for the tenant statefulset, this indicates the tenant is being fulfilled"
waitdone=0
totalwait=0
while true; do
waitdone=$(kubectl -n tenant-lite get pods -l v1.min.io/tenant=storage-lite --no-headers | wc -l)
if [ "$waitdone" -ne 0 ]; then
echo "Found $waitdone pods"
break
fi
sleep 5
totalwait=$((totalwait + 5))
if [ "$totalwait" -gt 300 ]; then
echo "Tenant never created statefulset after 5 minutes"
try false
fi
done
echo "Waiting for tenant pods to come online (5m timeout)"
try kubectl wait --namespace tenant-lite \
--for=condition=ready pod \
--selector="v1.min.io/tenant=storage-lite" \
--timeout=300s
echo "Build passes basic tenant creation"
}
function main() {
destroy_kind
setup_kind
install_operator
install_tenant
check_tenant_status tenant-lite storage-lite
kubectl -n minio-operator port-forward svc/console 9090 &
}
main "$@"

View File

@@ -15,6 +15,56 @@ concurrency:
cancel-in-progress: true
jobs:
c-operator-api-tests:
name: Operator API Tests
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ 1.17.x ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/checkout@v2
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Operator API Tests
run: |
curl -sLO "https://dl.k8s.io/release/v1.23.1/bin/linux/amd64/kubectl" -o kubectl
chmod +x kubectl
mv kubectl /usr/local/bin
"${GITHUB_WORKSPACE}/.github/workflows/deploy-tenant.sh"
echo "start ---> make test-operator-integration";
make test-operator-integration;
- uses: actions/cache@v2
id: coverage-cache-operator
name: Coverage Cache Operator
with:
path: |
./operator-integration/coverage/
key: ${{ runner.os }}-coverage-2-operator-${{ github.run_id }}
lint-job:
name: Checking Lint
runs-on: ${{ matrix.os }}
@@ -157,6 +207,315 @@ jobs:
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
all-permissions-1:
name: Permissions Tests Part 1
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '16'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
./portal-ui/build/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
- name: Start Console, front-end app and initialize users/policies
run: |
(./console server) & (make initialize-permissions)
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/permissions-1/ --skip-js-errors -c 3'
- name: Clean up users & policies
run: |
make cleanup-permissions
all-permissions-2:
name: Permissions Tests Part 2
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '16'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
./portal-ui/build/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
- name: Start Console, front-end app and initialize users/policies
run: |
(./console server) & (make initialize-permissions)
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/permissions-2/ --skip-js-errors -c 3'
- name: Clean up users & policies
run: |
make cleanup-permissions
all-permissions-3:
name: Permissions Tests Part 3
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '16'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
./portal-ui/build/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
- name: Start Console, front-end app and initialize users/policies
run: |
(./console server) & (make initialize-permissions)
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/permissions-3/ --skip-js-errors -c 3'
- name: Clean up users & policies
run: |
make cleanup-permissions
all-operator-tests:
name: Operator UI Tests
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '16'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
# Runs a set of commands using the runners shell
- name: Start Kind for Operator UI
run: |
"${GITHUB_WORKSPACE}/portal-ui/tests/scripts/operator.sh"
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/operator/ --skip-js-errors -c 3'
compile-job:
name: Compiles on Go ${{ matrix.go-version }} and ${{ matrix.os }}
needs:
@@ -461,7 +820,7 @@ jobs:
./restapi/coverage/
key: ${{ runner.os }}-coverage-restapi-2-${{ github.run_id }}
integration-tests:
b-integration-tests:
name: Integration Tests with Latest Distributed MinIO
needs:
- lint-job
@@ -546,162 +905,13 @@ jobs:
working-directory: ./portal-ui
run: yarn test
operator-tests:
name: Operator Tests
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '17'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
# Runs a set of commands using the runners shell
- name: Start Kind for Operator UI
run: |
"${GITHUB_WORKSPACE}/portal-ui/tests/scripts/operator.sh"
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/operator/ --skip-js-errors -c 3'
permissions:
name: Permissions Tests
needs:
- lint-job
- no-warnings-and-make-assets
- reuse-golang-dependencies
- vulnerable-dependencies-checks
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [ 1.17.x ]
os: [ ubuntu-latest ]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '17'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
name: Yarn Cache
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
./portal-ui/node_modules/
./portal-ui/build/
key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- uses: actions/cache@v2
id: assets-cache
name: Assets Cache
with:
path: |
./portal-ui/build/
key: ${{ runner.os }}-assets-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-assets-
- uses: actions/cache@v2
name: Go Mod Cache
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ github.run_id }}
- name: Build Console on ${{ matrix.os }}
env:
GO111MODULE: on
GOOS: linux
run: |
make console
- name: Start Console, front-end app and initialize users/policies
run: |
(./console server) & (make initialize-permissions)
- name: Run TestCafe Tests
uses: DevExpress/testcafe-action@latest
with:
args: '"chrome:headless" portal-ui/tests/permissions/ --skip-js-errors -c 3'
- name: Clean up users & policies
run: |
make cleanup-permissions
coverage:
name: "Coverage Limit Check"
needs:
- integration-tests
- b-integration-tests
- test-restapi-on-go
- c-operator-api-tests
- test-pkg-on-go
runs-on: ${{ matrix.os }}
strategy:
matrix:
@@ -713,9 +923,6 @@ jobs:
with:
go-version: ${{ matrix.go-version }}
id: go
- uses: actions/setup-node@v2
with:
node-version: '17'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Check out gocovmerge as a nested repository
@@ -739,6 +946,14 @@ jobs:
./integration/coverage/
key: ${{ runner.os }}-coverage-2-${{ github.run_id }}
- uses: actions/cache@v2
id: coverage-cache-operator
name: Coverage Cache Operator
with:
path: |
./operator-integration/coverage/
key: ${{ runner.os }}-coverage-2-operator-${{ github.run_id }}
- uses: actions/cache@v2
id: coverage-cache-restapi
name: Coverage Cache RestAPI
@@ -766,17 +981,17 @@ jobs:
echo "go build gocoverage.go"
go build gocovmerge.go
echo "put together the outs for final coverage resolution"
./gocovmerge ../integration/coverage/system.out ../restapi/coverage/coverage.out ../pkg/coverage/coverage-pkg.out > all.out
./gocovmerge ../integration/coverage/system.out ../restapi/coverage/coverage.out ../pkg/coverage/coverage-pkg.out ../operator-integration/coverage/operator-api.out > all.out
echo "grep to obtain the result"
go tool cover -func=all.out | grep total > tmp2
result=`cat tmp2 | awk 'END {print $3}'`
result=${result%\%}
echo "result:"
echo $result
threshold=48
if (( $(echo "$result > $threshold" |bc -l) )); then
echo "greater than threshold, passed!"
threshold=52.7
if (( $(echo "$result >= $threshold" |bc -l) )); then
echo "It is equal or greater than threshold, passed!"
else
echo "smaller than threshold, failed!"
echo "It is smaller than threshold value, failed!"
exit 1
fi

View File

@@ -72,21 +72,36 @@ test-integration:
@(docker network create --subnet=173.18.0.0/29 mynet123)
@echo "docker run with MinIO Version below:"
@echo $(MINIO_VERSION)
@(docker run -v /data1 -v /data2 -v /data3 -v /data4 --net=mynet123 -d --name minio --rm -p 9000:9000 $(MINIO_VERSION) server /data{1...4} && sleep 5)
@(docker run -v /data1 -v /data2 -v /data3 -v /data4 --net=mynet123 -d --name minio --rm -p 9000:9000 -p 9001:9001 -e MINIO_KMS_SECRET_KEY=my-minio-key:OSMM+vkKUTCvQs9YL/CVMIMt43HFhkUpqJxTmGl6rYw= $(MINIO_VERSION) server /data{1...4} --console-address ':9001' && sleep 5)
@(docker run --net=mynet123 --ip=173.18.0.3 --name pgsqlcontainer --rm -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres && sleep 5)
@echo "execute test and get coverage"
@(cd integration && go test -coverpkg=../restapi -c -tags testrunmain . && mkdir -p coverage && ./integration.test -test.run "^Test*" -test.coverprofile=coverage/system.out)
@(cd integration && go test -coverpkg=../restapi -c -tags testrunmain . && mkdir -p coverage && ./integration.test -test.v -test.run "^Test*" -test.coverprofile=coverage/system.out)
@(docker stop pgsqlcontainer)
@(docker stop minio)
@(docker network rm mynet123)
test-operator-integration:
@(echo "Start cd operator-integration && go test:")
@(pwd)
@(cd operator-integration && go test -coverpkg=../restapi -c -tags testrunmain . && mkdir -p coverage && ./operator-integration.test -test.v -test.run "^Test*" -test.coverprofile=coverage/operator-api.out)
test-operator:
@(env bash $(PWD)/portal-ui/tests/scripts/operator.sh)
@(docker stop minio)
test-permissions:
test-permissions-1:
@(docker run -v /data1 -v /data2 -v /data3 -v /data4 -d --name minio --rm -p 9000:9000 quay.io/minio/minio:latest server /data{1...4})
@(env bash $(PWD)/portal-ui/tests/scripts/permissions.sh)
@(env bash $(PWD)/portal-ui/tests/scripts/permissions.sh "portal-ui/tests/permissions-1/")
@(docker stop minio)
test-permissions-2:
@(docker run -v /data1 -v /data2 -v /data3 -v /data4 -d --name minio --rm -p 9000:9000 quay.io/minio/minio:latest server /data{1...4})
@(env bash $(PWD)/portal-ui/tests/scripts/permissions.sh "portal-ui/tests/permissions-2/")
@(docker stop minio)
test-permissions-3:
@(docker run -v /data1 -v /data2 -v /data3 -v /data4 -d --name minio --rm -p 9000:9000 quay.io/minio/minio:latest server /data{1...4})
@(env bash $(PWD)/portal-ui/tests/scripts/permissions.sh "portal-ui/tests/permissions-3/")
@(docker stop minio)
test-apply-permissions:
@@ -107,11 +122,11 @@ cleanup-permissions:
test:
@echo "execute test and get coverage"
@(cd restapi && mkdir coverage && GO111MODULE=on go test -coverprofile=coverage/coverage.out)
@(cd restapi && mkdir coverage && GO111MODULE=on go test -test.v -coverprofile=coverage/coverage.out)
test-pkg:
@echo "execute test and get coverage"
@(cd pkg && mkdir coverage && GO111MODULE=on go test -coverprofile=coverage/coverage-pkg.out)
@(cd pkg && mkdir coverage && GO111MODULE=on go test -test.v -coverprofile=coverage/coverage-pkg.out)
coverage:
@(GO111MODULE=on go test -v -coverprofile=coverage.out github.com/minio/console/restapi/... && go tool cover -html=coverage.out && open coverage.html)

View File

@@ -58,16 +58,6 @@ func GetNsFromFile() string {
return string(dat)
}
// Namespace will run only once at console startup
var Namespace = GetNsFromFile()
var latestMinIOImage, errLatestMinIOImage = utils.GetLatestMinIOImage(
&utils.HTTPClient{
Client: &http.Client{
Timeout: 15 * time.Second,
},
})
// GetMinioImage returns the image URL to be used when deploying a MinIO instance, if there is
// a preferred image to be used (configured via ENVIRONMENT VARIABLES) GetMinioImage will return that
// if not, GetMinioImage will try to obtain the image URL for the latest version of MinIO and return that
@@ -77,17 +67,15 @@ func GetMinioImage() (*string, error) {
if image != "" {
return &image, nil
}
latestMinIOImage, errLatestMinIOImage := utils.GetLatestMinIOImage(
&utils.HTTPClient{
Client: &http.Client{
Timeout: 5 * time.Second,
},
})
if errLatestMinIOImage != nil {
return nil, errLatestMinIOImage
}
return latestMinIOImage, nil
}
// GetLatestMinioImage returns the latest image URL on minio repository
func GetLatestMinioImage(client utils.HTTPClientI) (*string, error) {
latestMinIOImage, err := utils.GetLatestMinIOImage(client)
if err != nil {
return nil, err
}
return latestMinIOImage, nil
}

View File

@@ -20,5 +20,4 @@ const (
ConsoleK8sAPIServer = "CONSOLE_K8S_API_SERVER"
ConsoleK8SAPIServerTLSRootCA = "CONSOLE_K8S_API_SERVER_TLS_ROOT_CA"
ConsoleMinioImage = "CONSOLE_MINIO_IMAGE"
ConsoleMCImage = "CONSOLE_MC_IMAGE"
)

140
go.mod
View File

@@ -4,93 +4,94 @@ go 1.17
require (
github.com/blang/semver/v4 v4.0.0
github.com/cheggaaa/pb/v3 v3.0.6
github.com/cheggaaa/pb/v3 v3.0.8
github.com/dustin/go-humanize v1.0.0
github.com/go-openapi/errors v0.20.2
github.com/go-openapi/loads v0.21.0
github.com/go-openapi/runtime v0.21.1
github.com/go-openapi/loads v0.21.1
github.com/go-openapi/runtime v0.23.1
github.com/go-openapi/spec v0.20.4
github.com/go-openapi/strfmt v0.21.1
github.com/go-openapi/swag v0.19.15
github.com/go-openapi/validate v0.20.3
github.com/golang-jwt/jwt/v4 v4.1.0
github.com/gorilla/websocket v1.4.2
github.com/jessevdk/go-flags v1.4.0
github.com/klauspost/compress v1.13.6
github.com/go-openapi/strfmt v0.21.2
github.com/go-openapi/swag v0.21.1
github.com/go-openapi/validate v0.21.0
github.com/golang-jwt/jwt/v4 v4.3.0
github.com/gorilla/websocket v1.5.0
github.com/jessevdk/go-flags v1.5.0
github.com/klauspost/compress v1.14.4
github.com/minio/cli v1.22.0
github.com/minio/kes v0.11.0
github.com/minio/madmin-go v1.3.4
github.com/minio/mc v0.0.0-20220204044644-e048c85d71a7
github.com/minio/kes v0.18.0
github.com/minio/madmin-go v1.3.5
github.com/minio/mc v0.0.0-20220302011226-f13defa54577
github.com/minio/minio-go/v7 v7.0.23
github.com/minio/operator v0.0.0-20220110040724-a5d59a342b7f
github.com/minio/pkg v1.1.16
github.com/minio/operator v0.0.0-20220322220228-ae7a32a7c19e
github.com/minio/pkg v1.1.20
github.com/minio/selfupdate v0.4.0
github.com/mitchellh/go-homedir v1.1.0
github.com/rs/xid v1.3.0
github.com/secure-io/sio-go v0.3.1
github.com/stretchr/testify v1.7.0
github.com/tidwall/gjson v1.12.1
github.com/unrolled/secure v1.0.9
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
github.com/tidwall/gjson v1.14.0
github.com/unrolled/secure v1.10.0
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
golang.org/x/net v0.0.0-20220225172249-27dd8689420f
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b
gopkg.in/yaml.v2 v2.4.0
k8s.io/api v0.21.1
k8s.io/apimachinery v0.21.1
k8s.io/client-go v0.21.1
k8s.io/api v0.23.4
k8s.io/apimachinery v0.23.4
k8s.io/client-go v0.23.4
)
require (
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/VividCortex/ewma v1.1.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/charmbracelet/bubbles v0.10.0 // indirect
github.com/charmbracelet/bubbletea v0.19.3 // indirect
github.com/charmbracelet/lipgloss v0.4.1-0.20220204041308-bf2912e703f6 // indirect
github.com/charmbracelet/bubbles v0.10.3 // indirect
github.com/charmbracelet/bubbletea v0.20.0 // indirect
github.com/charmbracelet/lipgloss v0.5.0 // indirect
github.com/cheggaaa/pb v1.0.29 // indirect
github.com/containerd/console v1.0.2 // indirect
github.com/containerd/console v1.0.3 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/evanphx/json-patch v4.9.0+incompatible // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/go-logr/logr v0.4.0 // indirect
github.com/gdamore/encoding v1.0.0 // indirect
github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1 // indirect
github.com/go-logr/logr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/analysis v0.21.2 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/goccy/go-json v0.8.1 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/goccy/go-json v0.9.4 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.6 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/go-cmp v0.5.7 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/gnostic v0.5.1 // indirect
github.com/googleapis/gnostic v0.5.5 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
github.com/klauspost/cpuid/v2 v2.0.11 // indirect
github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
github.com/lestrrat-go/blackmagic v1.0.0 // indirect
github.com/lestrrat-go/httpcc v1.0.0 // indirect
github.com/lestrrat-go/iter v1.0.1 // indirect
github.com/lestrrat-go/jwx v1.2.14 // indirect
github.com/lestrrat-go/jwx v1.2.19 // indirect
github.com/lestrrat-go/option v1.0.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-ieproxy v0.0.1 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
@@ -101,63 +102,62 @@ require (
github.com/minio/filepath v1.0.0 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect
github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0 // indirect
github.com/nxadm/tail v1.4.8 // indirect
github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 // indirect
github.com/navidys/tvxwidgets v0.1.0 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/philhofer/fwd v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/profile v1.6.0 // indirect
github.com/pkg/xattr v0.4.4 // indirect
github.com/pkg/xattr v0.4.5 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/posener/complete v1.2.3 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_golang v1.11.0 // indirect
github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/rivo/tview v0.0.0-20220216162559-96063d6082f3 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rjeczalik/notify v0.9.2 // indirect
github.com/shirou/gopsutil/v3 v3.21.12 // indirect
github.com/shirou/gopsutil/v3 v3.22.2 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tinylib/msgp v1.1.6 // indirect
github.com/tklauser/go-sysconf v0.3.9 // indirect
github.com/tklauser/numcpus v0.3.0 // indirect
github.com/tklauser/go-sysconf v0.3.10 // indirect
github.com/tklauser/numcpus v0.4.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.etcd.io/etcd/api/v3 v3.5.1 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.1 // indirect
go.etcd.io/etcd/client/v3 v3.5.1 // indirect
go.mongodb.org/mongo-driver v1.7.5 // indirect
go.etcd.io/etcd/api/v3 v3.5.2 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect
go.etcd.io/etcd/client/v3 v3.5.2 // indirect
go.mongodb.org/mongo-driver v1.8.4 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
go.uber.org/zap v1.19.1 // indirect
go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.21.0 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb // indirect
google.golang.org/grpc v1.43.0 // indirect
google.golang.org/genproto v0.0.0-20220302033224-9aa15565e42a // indirect
google.golang.org/grpc v1.44.0 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/h2non/filetype.v1 v1.0.5 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.66.3 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/klog/v2 v2.8.0 // indirect
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
k8s.io/klog/v2 v2.40.1 // indirect
k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf // indirect
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
maze.io/x/duration v0.0.0-20160924141736-faac084b6075 // indirect
sigs.k8s.io/controller-runtime v0.8.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
sigs.k8s.io/controller-runtime v0.11.1 // indirect
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
replace google.golang.org/grpc => google.golang.org/grpc v1.29.1

1113
go.sum

File diff suppressed because it is too large Load Diff

View File

@@ -131,7 +131,7 @@ func NotifyPostgres() (*http.Response, error) {
}
func TestNotifyPostgres(t *testing.T) {
printStartFunc("TestNotifyPostgres")
// Variables
assert := assert.New(t)
@@ -147,11 +147,11 @@ func TestNotifyPostgres(t *testing.T) {
if response != nil {
assert.Equal(200, response.StatusCode, finalResponse)
}
printEndFunc("TestNotifyPostgres")
}
func TestRestartService(t *testing.T) {
printStartFunc("TestRestartService")
assert := assert.New(t)
restartResponse, restartError := RestartService()
assert.Nil(restartError)
@@ -167,5 +167,49 @@ func TestRestartService(t *testing.T) {
addObjRsp,
)
}
printEndFunc("TestRestartService")
}
func ListPoliciesWithBucket(bucketName string) (*http.Response, error) {
/*
Helper function to List Policies With Given Bucket
HTTP Verb: GET
URL: /bucket-policy/{bucket}
*/
request, err := http.NewRequest(
"GET", "http://localhost:9090/api/v1/bucket-policy/"+bucketName, nil)
if err != nil {
log.Println(err)
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
client := &http.Client{
Timeout: 2 * time.Second,
}
response, err := client.Do(request)
return response, err
}
func TestListPoliciesWithBucket(t *testing.T) {
// Test Variables
bucketName := "testlistpolicieswithbucket"
assert := assert.New(t)
// Test
response, err := ListPoliciesWithBucket(bucketName)
assert.Nil(err)
if err != nil {
log.Println(err)
return
}
parsedResponse := inspectHTTPResponse(response)
if response != nil {
assert.Equal(
200,
response.StatusCode,
parsedResponse,
)
}
}

View File

@@ -55,37 +55,6 @@ func inspectHTTPResponse(httpResponse *http.Response) string {
return "Http Response: " + string(b)
}
func printMessage(message string) {
/*
Helper function to print HTTP response.
*/
fmt.Println(message)
}
func printLoggingMessage(message string, functionName string) {
/*
Helper function to have standard output across the tests.
*/
finalString := "......................." + functionName + "(): " + message
printMessage(finalString)
}
func printStartFunc(functionName string) {
/*
Common function for all tests to tell that test has started
*/
printMessage("")
printLoggingMessage("started", functionName)
}
func printEndFunc(functionName string) {
/*
Helper function for all tests to tell that test has ended, is completed
*/
printLoggingMessage("completed", functionName)
printMessage("")
}
func initConsoleServer() (*restapi.Server, error) {
//os.Setenv("CONSOLE_MINIO_SERVER", "localhost:9000")
@@ -123,7 +92,7 @@ func initConsoleServer() (*restapi.Server, error) {
}
func TestMain(m *testing.M) {
printStartFunc("TestMain")
// start console server
go func() {
fmt.Println("start server")
@@ -212,6 +181,6 @@ func TestMain(m *testing.M) {
if response != nil {
fmt.Println("DELETE StatusCode:", response.StatusCode)
}
printEndFunc("TestMain")
os.Exit(code)
}

View File

@@ -30,7 +30,7 @@ import (
)
func TestLoginStrategy(t *testing.T) {
printStartFunc("TestLoginStrategy")
assert := assert.New(t)
// image for now:
@@ -68,5 +68,5 @@ func TestLoginStrategy(t *testing.T) {
assert.Equal(models.LoginDetailsLoginStrategyForm, loginDetails.LoginStrategy, "Login Details don't match")
}
printEndFunc("TestLoginStrategy")
}

View File

@@ -25,6 +25,8 @@ import (
"testing"
"time"
"github.com/go-openapi/swag"
iampolicy "github.com/minio/pkg/iam/policy"
"github.com/stretchr/testify/assert"
)
@@ -38,7 +40,7 @@ func TestAddServiceAccount(t *testing.T) {
tests like users.ts can run over clean data and we don't collide against
it.
*/
printStartFunc("TestAddServiceAccount")
assert := assert.New(t)
client := &http.Client{
@@ -159,5 +161,249 @@ func TestAddServiceAccount(t *testing.T) {
fmt.Println("DELETE StatusCode:", response.StatusCode)
assert.Equal(204, response.StatusCode, "has to be 204 when delete user")
}
printEndFunc("TestAddServiceAccount")
}
func Test_ServiceAccountsAPI(t *testing.T) {
assert := assert.New(t)
type args struct {
api string
policy *string
}
tests := []struct {
name string
args args
expectedStatus int
expectedError error
}{
{
name: "Create Service Account - Default",
args: args{
api: "/service-accounts",
policy: nil,
},
expectedStatus: 201,
expectedError: nil,
},
{
name: "Create Service Account - Valid Policy",
args: args{
api: "/service-accounts",
policy: swag.String(`
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}`),
},
expectedStatus: 201,
expectedError: nil,
},
{
name: "Create Service Account - Invalid Policy",
args: args{
api: "/service-accounts",
policy: swag.String(`
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation"
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}`),
},
expectedStatus: 500,
expectedError: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
client := &http.Client{
Timeout: 3 * time.Second,
}
// Add service account
requestDataPolicy := map[string]interface{}{}
if tt.args.policy != nil {
requestDataPolicy["policy"] = *tt.args.policy
}
requestDataJSON, _ := json.Marshal(requestDataPolicy)
requestDataBody := bytes.NewReader(requestDataJSON)
request, err := http.NewRequest(
"POST", fmt.Sprintf("http://localhost:9090/api/v1%s", tt.args.api), requestDataBody)
if err != nil {
log.Println(err)
return
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
response, err := client.Do(request)
if err != nil {
log.Println(err)
return
}
if response != nil {
assert.Equal(tt.expectedStatus, response.StatusCode, "Status Code is incorrect")
}
})
}
}
func DeleteMultipleServiceAccounts(serviceAccounts []string) (*http.Response, error) {
/*
Helper function to delete multiple service accounts
URL: http://localhost:9001/api/v1/service-accounts/delete-multi
HTTP Verb: DELETE
Data: ["U3RADB7J2ZZHELR0WSBB","ZE8H1HYOA6AVGKFCV6YU"]
Response: Status Code: 204 No Content
*/
client := &http.Client{
Timeout: 3 * time.Second,
}
requestDataJSON, _ := json.Marshal(serviceAccounts)
requestDataBody := bytes.NewReader(requestDataJSON)
request, err := http.NewRequest(
"DELETE", "http://localhost:9090/api/v1/service-accounts/delete-multi", requestDataBody)
if err != nil {
log.Println(err)
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
response, err := client.Do(request)
return response, err
}
func TestCreateServiceAccountForUserWithCredentials(t *testing.T) {
/*
To test creation of service account for a user.
*/
// Test's variables
userName := "testcreateserviceaccountforuserwithcredentials1"
assert := assert.New(t)
policy := ""
serviceAccountLengthInBytes := 40 // As observed, update as needed
// 1. Create the user
var groups = []string{}
var policies = []string{}
var secretKey = "testcreateserviceaccountforuserwithcrede"
response, err := AddUser(userName, "secretKey", groups, policies)
if err != nil {
log.Println(err)
return
}
if response != nil {
fmt.Println("StatusCode:", response.StatusCode)
assert.Equal(201, response.StatusCode, "Status Code is incorrect")
}
// Table driven testing part
type args struct {
accessKey string
}
tests := []struct {
name string
args args
expectedStatus int
}{
{
name: "Service Account With Valid Credentials",
expectedStatus: 201,
args: args{
accessKey: "testcreateserviceacc",
},
},
{
name: "Service Account With Invalid Credentials",
expectedStatus: 500,
args: args{
accessKey: "tooooooooooooooooooooolongggggggggggggggggg",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 2. Create the service account for the user
createServiceAccountWithCredentialsResponse,
createServiceAccountWithCredentialsError := CreateServiceAccountForUserWithCredentials(
userName,
policy,
tt.args.accessKey,
secretKey,
)
if createServiceAccountWithCredentialsError != nil {
log.Println(createServiceAccountWithCredentialsError)
assert.Fail("Error in createServiceAccountWithCredentialsError")
}
if createServiceAccountWithCredentialsResponse != nil {
fmt.Println("StatusCode:", createServiceAccountWithCredentialsResponse.StatusCode)
assert.Equal(
tt.expectedStatus, // different status expected per table's row
createServiceAccountWithCredentialsResponse.StatusCode,
inspectHTTPResponse(createServiceAccountWithCredentialsResponse),
)
}
// 3. Verify the service account for the user
listOfAccountsResponse,
listOfAccountsError := ReturnsAListOfServiceAccountsForAUser(userName)
if listOfAccountsError != nil {
log.Println(listOfAccountsError)
assert.Fail("Error in listOfAccountsError")
}
finalResponse := inspectHTTPResponse(listOfAccountsResponse)
if listOfAccountsResponse != nil {
fmt.Println("StatusCode:", listOfAccountsResponse.StatusCode)
assert.Equal(
200, listOfAccountsResponse.StatusCode,
finalResponse,
)
}
assert.Equal(len(finalResponse), serviceAccountLengthInBytes, finalResponse)
})
}
// Delete Multiple Service Accounts
serviceAccount := make([]string, 1)
serviceAccount[0] = "testcreateserviceacc"
response, err = DeleteMultipleServiceAccounts(serviceAccount)
if err != nil {
log.Println(err)
return
}
if response != nil {
fmt.Println("StatusCode:", response.StatusCode)
assert.Equal(
204,
response.StatusCode,
inspectHTTPResponse(response),
)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -359,7 +359,7 @@ func TestAddUser(t *testing.T) {
tests like users.ts can run over clean data and we don't collide against
it.
*/
printStartFunc("TestAddUser")
assert := assert.New(t)
// With no groups & no policies
@@ -384,7 +384,7 @@ func TestAddUser(t *testing.T) {
fmt.Println("DELETE StatusCode:", response.StatusCode)
assert.Equal(204, response.StatusCode, "has to be 204 when delete user")
}
printEndFunc("TestAddUser")
}
func TestListUsers(t *testing.T) {
@@ -394,7 +394,7 @@ func TestListUsers(t *testing.T) {
2. Then, it lists the users <------ 200 is expected when listing them.
3. Finally, it deletes the users
*/
printStartFunc("TestListUsers")
assert := assert.New(t)
// With no groups & no policies
@@ -454,14 +454,14 @@ func TestListUsers(t *testing.T) {
response.StatusCode, "has to be 204 when delete user")
}
}
printEndFunc("TestListUsers")
}
func TestGetUserInfo(t *testing.T) {
/*
Test to get the user information via API.
*/
printStartFunc("TestGetUserInfo")
// 1. Create the user
fmt.Println("TestGetUserInfo(): 1. Create the user")
assert := assert.New(t)
@@ -500,14 +500,14 @@ func TestGetUserInfo(t *testing.T) {
expected := "{\"accessKey\":\"accessKey\",\"memberOf\":null,\"policy\":[],\"status\":\"enabled\"}\n"
obtained := string(b)
assert.Equal(expected, obtained, "User Information is wrong")
printEndFunc("TestGetUserInfo")
}
func TestUpdateUserInfoSuccessfulResponse(t *testing.T) {
/*
Update User Information Test with Successful Response
*/
printStartFunc("TestGetUserInfo")
assert := assert.New(t)
// 1. Create an active user
@@ -545,14 +545,14 @@ func TestUpdateUserInfoSuccessfulResponse(t *testing.T) {
log.Fatalln(err)
}
assert.True(strings.Contains(string(b), "disabled"))
printEndFunc("TestGetUserInfo")
}
func TestUpdateUserInfoGenericErrorResponse(t *testing.T) {
/*
Update User Information Test with Generic Error Response
*/
printStartFunc("TestUpdateUserInfoGenericErrorResponse")
assert := assert.New(t)
// 1. Create an active user
@@ -590,14 +590,14 @@ func TestUpdateUserInfoGenericErrorResponse(t *testing.T) {
log.Fatalln(err)
}
assert.True(strings.Contains(string(b), "status not valid"))
printEndFunc("TestUpdateUserInfoGenericErrorResponse")
}
func TestRemoveUserSuccessfulResponse(t *testing.T) {
/*
To test removing a user from API
*/
printStartFunc("TestRemoveUserSuccessfulResponse")
assert := assert.New(t)
// 1. Create an active user
@@ -641,17 +641,17 @@ func TestRemoveUserSuccessfulResponse(t *testing.T) {
404, getUserInfoResponse.StatusCode, "Status Code is incorrect")
}
finalResponse := inspectHTTPResponse(getUserInfoResponse)
printMessage(finalResponse)
fmt.Println(finalResponse)
assert.True(strings.Contains(
finalResponse, "The specified user does not exist"), finalResponse)
printEndFunc("TestRemoveUserSuccessfulResponse")
}
func TestUpdateGroupsForAUser(t *testing.T) {
/*
To test Update Groups For a User End Point.
*/
printStartFunc("TestUpdateGroupsForAUser")
// 1. Create the user
numberOfGroups := 3
groupName := "updategroupforausergroup"
@@ -701,14 +701,14 @@ func TestUpdateGroupsForAUser(t *testing.T) {
assert.True(strings.Contains(
finalResponse, groupName+strconv.Itoa(i)), finalResponse)
}
printEndFunc("TestUpdateGroupsForAUser")
}
func TestCreateServiceAccountForUser(t *testing.T) {
/*
To test creation of service account for a user.
*/
printStartFunc("TestCreateServiceAccountForUser")
// Test's variables
userName := "testcreateserviceaccountforuser1"
assert := assert.New(t)
@@ -762,107 +762,14 @@ func TestCreateServiceAccountForUser(t *testing.T) {
)
}
assert.Equal(len(finalResponse), serviceAccountLengthInBytes, finalResponse)
printEndFunc("TestCreateServiceAccountForUser")
}
func TestCreateServiceAccountForUserWithCredentials(t *testing.T) {
/*
To test creation of service account for a user.
*/
printStartFunc("TestCreateServiceAccountForUserWithCredentials")
// Test's variables
userName := "testcreateserviceaccountforuserwithcredentials1"
assert := assert.New(t)
policy := ""
serviceAccountLengthInBytes := 40 // As observed, update as needed
// 1. Create the user
var groups = []string{}
var policies = []string{}
var secretKey = "testcreateserviceaccountforuserwithcrede"
response, err := AddUser(userName, "secretKey", groups, policies)
if err != nil {
log.Println(err)
return
}
if response != nil {
fmt.Println("StatusCode:", response.StatusCode)
assert.Equal(201, response.StatusCode, "Status Code is incorrect")
}
// Table driven testing part
type args struct {
accessKey string
}
tests := []struct {
name string
args args
expectedStatus int
}{
{
name: "Service Account With Valid Credentials",
expectedStatus: 201,
args: args{
accessKey: "testcreateserviceacc",
},
},
{
name: "Service Account With Invalid Credentials",
expectedStatus: 500,
args: args{
accessKey: "tooooooooooooooooooooolongggggggggggggggggg",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 2. Create the service account for the user
createServiceAccountWithCredentialsResponse,
createServiceAccountWithCredentialsError := CreateServiceAccountForUserWithCredentials(
userName,
policy,
tt.args.accessKey,
secretKey,
)
if createServiceAccountWithCredentialsError != nil {
log.Println(createServiceAccountWithCredentialsError)
assert.Fail("Error in createServiceAccountWithCredentialsError")
}
if createServiceAccountWithCredentialsResponse != nil {
fmt.Println("StatusCode:", createServiceAccountWithCredentialsResponse.StatusCode)
assert.Equal(
tt.expectedStatus, // different status expected per table's row
createServiceAccountWithCredentialsResponse.StatusCode,
inspectHTTPResponse(createServiceAccountWithCredentialsResponse),
)
}
// 3. Verify the service account for the user
listOfAccountsResponse,
listOfAccountsError := ReturnsAListOfServiceAccountsForAUser(userName)
if listOfAccountsError != nil {
log.Println(listOfAccountsError)
assert.Fail("Error in listOfAccountsError")
}
finalResponse := inspectHTTPResponse(listOfAccountsResponse)
if listOfAccountsResponse != nil {
fmt.Println("StatusCode:", listOfAccountsResponse.StatusCode)
assert.Equal(
200, listOfAccountsResponse.StatusCode,
finalResponse,
)
}
assert.Equal(len(finalResponse), serviceAccountLengthInBytes, finalResponse)
})
}
printEndFunc("TestCreateServiceAccountForUserWithCredentials")
}
func TestUsersGroupsBulk(t *testing.T) {
/*
To test UsersGroupsBulk End Point
*/
printStartFunc("TestUsersGroupsBulk")
// Vars
assert := assert.New(t)
numberOfUsers := 5
@@ -945,5 +852,5 @@ func TestUsersGroupsBulk(t *testing.T) {
// Make sure the user belongs to the created group
assert.True(strings.Contains(string(finalResponse), groupName))
}
printEndFunc("TestUsersGroupsBulk")
}

View File

@@ -0,0 +1,75 @@
// This file is part of MinIO Console Server
// Copyright (c) 2022 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package integration
import (
"fmt"
"log"
"net/http"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func Test_VersionAPI(t *testing.T) {
assert := assert.New(t)
type args struct {
api string
}
tests := []struct {
name string
args args
expectedStatus int
expectedError error
}{
{
name: "Check Version",
args: args{
api: "/check-version",
},
expectedStatus: 200,
expectedError: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
client := &http.Client{
Timeout: 3 * time.Second,
}
request, err := http.NewRequest(
"GET", fmt.Sprintf("http://localhost:9090/api/v1%s", tt.args.api), nil)
if err != nil {
log.Println(err)
return
}
request.Header.Add("Content-Type", "application/json")
response, err := client.Do(request)
if err != nil {
log.Println(err)
return
}
if response != nil {
assert.Equal(tt.expectedStatus, response.StatusCode, "Status Code is incorrect")
}
})
}
}

View File

@@ -15,7 +15,7 @@ spec:
serviceAccountName: console-sa
containers:
- name: console
image: 'minio/console:v0.15.1'
image: 'minio/console:v0.15.6'
imagePullPolicy: "IfNotPresent"
env:
- name: CONSOLE_OPERATOR_MODE

View File

@@ -32,7 +32,7 @@ spec:
spec:
containers:
- name: console
image: 'minio/console:v0.15.1'
image: 'minio/console:v0.15.6'
imagePullPolicy: "IfNotPresent"
env:
- name: CONSOLE_MINIO_SERVER

View File

@@ -230,9 +230,6 @@ func (m *IdpConfiguration) UnmarshalBinary(b []byte) error {
// swagger:model IdpConfigurationActiveDirectory
type IdpConfigurationActiveDirectory struct {
// group name attribute
GroupNameAttribute string `json:"group_name_attribute,omitempty"`
// group search base dn
GroupSearchBaseDn string `json:"group_search_base_dn,omitempty"`
@@ -266,12 +263,6 @@ type IdpConfigurationActiveDirectory struct {
// user dns
UserDNS []string `json:"user_dns"`
// username format
UsernameFormat string `json:"username_format,omitempty"`
// username search filter
UsernameSearchFilter string `json:"username_search_filter,omitempty"`
}
// Validate validates this idp configuration active directory

View File

@@ -1,110 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
// This file is part of MinIO Console Server
// Copyright (c) 2022 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"encoding/json"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/validate"
)
// ProfilerType profiler type
//
// swagger:model profilerType
type ProfilerType string
func NewProfilerType(value ProfilerType) *ProfilerType {
return &value
}
// Pointer returns a pointer to a freshly-allocated ProfilerType.
func (m ProfilerType) Pointer() *ProfilerType {
return &m
}
const (
// ProfilerTypeCPU captures enum value "cpu"
ProfilerTypeCPU ProfilerType = "cpu"
// ProfilerTypeMem captures enum value "mem"
ProfilerTypeMem ProfilerType = "mem"
// ProfilerTypeBlock captures enum value "block"
ProfilerTypeBlock ProfilerType = "block"
// ProfilerTypeMutex captures enum value "mutex"
ProfilerTypeMutex ProfilerType = "mutex"
// ProfilerTypeTrace captures enum value "trace"
ProfilerTypeTrace ProfilerType = "trace"
// ProfilerTypeThreads captures enum value "threads"
ProfilerTypeThreads ProfilerType = "threads"
// ProfilerTypeGoroutines captures enum value "goroutines"
ProfilerTypeGoroutines ProfilerType = "goroutines"
)
// for schema
var profilerTypeEnum []interface{}
func init() {
var res []ProfilerType
if err := json.Unmarshal([]byte(`["cpu","mem","block","mutex","trace","threads","goroutines"]`), &res); err != nil {
panic(err)
}
for _, v := range res {
profilerTypeEnum = append(profilerTypeEnum, v)
}
}
func (m ProfilerType) validateProfilerTypeEnum(path, location string, value ProfilerType) error {
if err := validate.EnumCase(path, location, value, profilerTypeEnum, true); err != nil {
return err
}
return nil
}
// Validate validates this profiler type
func (m ProfilerType) Validate(formats strfmt.Registry) error {
var res []error
// value enum
if err := m.validateProfilerTypeEnum("", "body", m); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
// ContextValidate validates this profiler type based on context it is used
func (m ProfilerType) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}

View File

@@ -38,7 +38,7 @@ type ProfilingStartRequest struct {
// type
// Required: true
Type *ProfilerType `json:"type"`
Type *string `json:"type"`
}
// Validate validates this profiling start request
@@ -61,51 +61,11 @@ func (m *ProfilingStartRequest) validateType(formats strfmt.Registry) error {
return err
}
if err := validate.Required("type", "body", m.Type); err != nil {
return err
}
if m.Type != nil {
if err := m.Type.Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("type")
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("type")
}
return err
}
}
return nil
}
// ContextValidate validate this profiling start request based on the context it is used
// ContextValidate validates this profiling start request based on context it is used
func (m *ProfilingStartRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
if err := m.contextValidateType(ctx, formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *ProfilingStartRequest) contextValidateType(ctx context.Context, formats strfmt.Registry) error {
if m.Type != nil {
if err := m.Type.ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("type")
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("type")
}
return err
}
}
return nil
}

View File

@@ -0,0 +1,479 @@
// This file is part of MinIO Console Server
// Copyright (c) 2021 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package operatorintegration
import (
"bytes"
b64 "encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"strconv"
"testing"
"time"
"github.com/go-openapi/loads"
"github.com/minio/console/models"
"github.com/minio/console/restapi"
"github.com/minio/console/restapi/operations"
"github.com/stretchr/testify/assert"
)
var token string
func decodeBase64(value string) string {
/*
Helper function to decode in base64
*/
result, err := b64.StdEncoding.DecodeString(value)
if err != nil {
log.Fatal("error:", err)
}
return string(result)
}
func printLoggingMessage(message string, functionName string) {
/*
Helper function to have standard output across the tests.
*/
finalString := "......................." + functionName + "(): " + message
fmt.Println(finalString)
}
func printStartFunc(functionName string) {
/*
Common function for all tests to tell that test has started
*/
fmt.Println("")
printLoggingMessage("started", functionName)
}
func printEndFunc(functionName string) {
/*
Helper function for all tests to tell that test has ended, is completed
*/
printLoggingMessage("completed", functionName)
fmt.Println("")
}
func initConsoleServer() (*restapi.Server, error) {
//os.Setenv("CONSOLE_MINIO_SERVER", "localhost:9000")
swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON)
if err != nil {
return nil, err
}
noLog := func(string, ...interface{}) {
// nothing to log
}
// Initialize MinIO loggers
restapi.LogInfo = noLog
restapi.LogError = noLog
api := operations.NewConsoleAPI(swaggerSpec)
api.Logger = noLog
server := restapi.NewServer(api)
// register all APIs
server.ConfigureAPI()
//restapi.GlobalRootCAs, restapi.GlobalPublicCerts, restapi.GlobalTLSCertsManager = globalRootCAs, globalPublicCerts, globalTLSCerts
consolePort, _ := strconv.Atoi("9090")
server.Host = "0.0.0.0"
server.Port = consolePort
restapi.Port = "9090"
restapi.Hostname = "0.0.0.0"
return server, nil
}
func TestMain(m *testing.M) {
printStartFunc("TestMain")
// start console server
go func() {
fmt.Println("start server")
srv, err := initConsoleServer()
if err != nil {
log.Println(err)
log.Println("init fail")
return
}
srv.Serve()
}()
fmt.Println("sleeping")
time.Sleep(2 * time.Second)
client := &http.Client{
Timeout: 2 * time.Second,
}
// kubectl to get token
app := "kubectl"
arg0 := "get"
arg1 := "serviceaccount"
arg2 := "console-sa"
arg3 := "--namespace"
arg4 := "minio-operator"
arg5 := "-o"
arg6 := "jsonpath=\"{.secrets[0].name}\""
cmd := exec.Command(app, arg0, arg1, arg2, arg3, arg4, arg5, arg6)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
secret := out.String() // "console-sa-token-kxdw2" <-- secret
app2 := "kubectl"
argu0 := "--namespace"
argu1 := "minio-operator"
argu2 := "get"
argu3 := "secret"
argu4 := secret[1 : len(secret)-1]
argu5 := "-o"
argu6 := "jsonpath=\"{.data.token}\""
cmd2 := exec.Command(app2, argu0, argu1, argu2, argu3, argu4, argu5, argu6)
var out2 bytes.Buffer
var stderr2 bytes.Buffer
cmd2.Stdout = &out2
cmd2.Stderr = &stderr2
err2 := cmd2.Run()
if err2 != nil {
fmt.Println(fmt.Sprint(err2) + ": -> " + stderr2.String())
return
}
secret2 := out2.String()
secret3 := decodeBase64(secret2[1 : len(secret2)-1])
requestData := map[string]string{
"jwt": secret3,
}
requestDataJSON, _ := json.Marshal(requestData)
requestDataBody := bytes.NewReader(requestDataJSON)
request, err := http.NewRequest("POST", "http://localhost:9090/api/v1/login/operator", requestDataBody)
if err != nil {
log.Println(err)
return
}
request.Header.Add("Content-Type", "application/json")
response, err := client.Do(request)
if err != nil {
log.Println(err)
return
}
if response != nil {
for _, cookie := range response.Cookies() {
if cookie.Name == "token" {
token = cookie.Value
break
}
}
}
if token == "" {
log.Println("authentication token not found in cookies response")
return
}
code := m.Run()
printEndFunc("TestMain")
os.Exit(code)
}
func ListTenants() (*http.Response, error) {
/*
Helper function to list buckets
HTTP Verb: GET
URL: http://localhost:9090/api/v1/tenants
*/
request, err := http.NewRequest(
"GET", "http://localhost:9090/api/v1/tenants", nil)
if err != nil {
log.Println(err)
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
client := &http.Client{
Timeout: 2 * time.Second,
}
response, err := client.Do(request)
return response, err
}
func TestListTenants(t *testing.T) {
// Tenants can be listed via API: https://github.com/miniohq/engineering/issues/591
printStartFunc("TestListTenants")
assert := assert.New(t)
resp, err := ListTenants()
assert.Nil(err)
if err != nil {
log.Println(err)
return
}
if resp != nil {
assert.Equal(
200, resp.StatusCode, "Status Code is incorrect")
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
result := models.ListTenantsResponse{}
err = json.Unmarshal(bodyBytes, &result)
if err != nil {
log.Println(err)
assert.Nil(err)
}
TenantName := &result.Tenants[0].Name // The array has to be empty, no index accessible
fmt.Println(*TenantName)
assert.Equal("storage-lite", *TenantName, *TenantName)
printEndFunc("TestListTenants")
}
func CreateTenant(tenantName string, namespace string, accessKey string, secretKey string, accessKeys []string, idp map[string]interface{}, tls map[string]interface{}, prometheusConfiguration map[string]interface{}, logSearchConfiguration map[string]interface{}, erasureCodingParity int, pools []map[string]interface{}, exposeConsole bool, exposeMinIO bool, image string, serviceName string, enablePrometheus bool, enableConsole bool, enableTLS bool, secretKeys []string) (*http.Response, error) {
/*
Helper function to create a tenant
HTTP Verb: POST
API: /api/v1/tenants
*/
requestDataAdd := map[string]interface{}{
"name": tenantName,
"namespace": namespace,
"access_key": accessKey,
"secret_key": secretKey,
"access_keys": accessKeys,
"secret_keys": secretKeys,
"enable_tls": enableTLS,
"enable_console": enableConsole,
"enable_prometheus": enablePrometheus,
"service_name": serviceName,
"image": image,
"expose_minio": exposeMinIO,
"expose_console": exposeConsole,
"pools": pools,
"erasureCodingParity": erasureCodingParity,
"logSearchConfiguration": logSearchConfiguration,
"prometheusConfiguration": prometheusConfiguration,
"tls": tls,
"idp": idp,
}
requestDataJSON, _ := json.Marshal(requestDataAdd)
requestDataBody := bytes.NewReader(requestDataJSON)
request, err := http.NewRequest(
"POST",
"http://localhost:9090/api/v1/tenants",
requestDataBody,
)
if err != nil {
log.Println(err)
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
client := &http.Client{
Timeout: 2 * time.Second,
}
response, err := client.Do(request)
return response, err
}
func TestCreateTenant(t *testing.T) {
printStartFunc("TestCreateTenant")
// Variables
assert := assert.New(t)
erasureCodingParity := 2
tenantName := "new-tenant"
namespace := "default"
accessKey := ""
secretKey := ""
var accessKeys []string
var secretKeys []string
var minio []string
var caCertificates []string
var consoleCAcertificates []string
enableTLS := true
enableConsole := true
enablePrometheus := true
serviceName := ""
image := ""
exposeMinIO := true
exposeConsole := true
values := make([]string, 1)
values[0] = "new-tenant"
values2 := make([]string, 1)
values2[0] = "pool-0"
keys := make([]map[string]interface{}, 1)
keys[0] = map[string]interface{}{
"access_key": "IGLksSXdiU3fjcRI",
"secret_key": "EqeCPZ1xBYdnygizxxRWnkH09N2350nO",
}
pools := make([]map[string]interface{}, 1)
matchExpressions := make([]map[string]interface{}, 2)
matchExpressions[0] = map[string]interface{}{
"key": "v1.min.io/tenant",
"operator": "In",
"values": values,
}
matchExpressions[1] = map[string]interface{}{
"key": "v1.min.io/pool",
"operator": "In",
"values": values2,
}
requiredDuringSchedulingIgnoredDuringExecution := make([]map[string]interface{}, 1)
requiredDuringSchedulingIgnoredDuringExecution[0] = map[string]interface{}{
"labelSelector": map[string]interface{}{
"matchExpressions": matchExpressions,
},
"topologyKey": "kubernetes.io/hostname",
}
pools0 := map[string]interface{}{
"name": "pool-0",
"servers": 4,
"volumes_per_server": 1,
"volume_configuration": map[string]interface{}{
"size": 26843545600,
"storage_class_name": "standard",
},
"securityContext": nil,
"affinity": map[string]interface{}{
"podAntiAffinity": map[string]interface{}{
"requiredDuringSchedulingIgnoredDuringExecution": requiredDuringSchedulingIgnoredDuringExecution,
},
},
"resources": map[string]interface{}{
"requests": map[string]interface{}{
"cpu": 2,
"memory": 2,
},
},
}
logSearchConfiguration := map[string]interface{}{
"image": "",
"postgres_image": "",
"postgres_init_image": "",
}
prometheusConfiguration := map[string]interface{}{
"image": "",
"sidecar_image": "",
"init_image": "",
}
tls := map[string]interface{}{
"minio": minio,
"ca_certificates": caCertificates,
"console_ca_certificates": consoleCAcertificates,
}
idp := map[string]interface{}{
"keys": keys,
}
pools[0] = pools0
// 1. Create Tenant
resp, err := CreateTenant(
tenantName,
namespace,
accessKey,
secretKey,
accessKeys,
idp,
tls,
prometheusConfiguration,
logSearchConfiguration,
erasureCodingParity,
pools,
exposeConsole,
exposeMinIO,
image,
serviceName,
enablePrometheus,
enableConsole,
enableTLS,
secretKeys,
)
assert.Nil(err)
if err != nil {
log.Println(err)
return
}
if resp != nil {
assert.Equal(
200, resp.StatusCode, "Status Code is incorrect")
}
printEndFunc("TestCreateTenant")
}
func ListTenantsByNameSpace(namespace string) (*http.Response, error) {
/*
Helper function to list buckets
HTTP Verb: GET
URL: http://localhost:9090/api/v1/namespaces/{namespace}/tenants
*/
request, err := http.NewRequest(
"GET", "http://localhost:9090/api/v1/namespaces/"+namespace+"/tenants", nil)
if err != nil {
log.Println(err)
}
request.Header.Add("Cookie", fmt.Sprintf("token=%s", token))
request.Header.Add("Content-Type", "application/json")
client := &http.Client{
Timeout: 2 * time.Second,
}
response, err := client.Do(request)
return response, err
}
func TestListTenantsByNameSpace(t *testing.T) {
assert := assert.New(t)
namespace := "default"
resp, err := ListTenantsByNameSpace(namespace)
assert.Nil(err)
if err != nil {
log.Println(err)
return
}
if resp != nil {
assert.Equal(
200, resp.StatusCode, "Status Code is incorrect")
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
result := models.ListTenantsResponse{}
err = json.Unmarshal(bodyBytes, &result)
if err != nil {
log.Println(err)
assert.Nil(err)
}
TenantName := &result.Tenants[0].Name // The array has to be empty, no index accessible
fmt.Println(*TenantName)
assert.Equal("new-tenant", *TenantName, *TenantName)
}

View File

@@ -47,7 +47,6 @@ var (
// LicenseKey in memory license key used by console ui
LicenseKey = ""
// GlobalRootCAs is CA root certificates, a nil value means system certs pool will be used
GlobalRootCAs *x509.CertPool
// GlobalPublicCerts has certificates Console will use to serve clients

View File

@@ -2437,9 +2437,6 @@ func init() {
"url"
],
"properties": {
"group_name_attribute": {
"type": "string"
},
"group_search_base_dn": {
"type": "string"
},
@@ -2475,12 +2472,6 @@ func init() {
"items": {
"type": "string"
}
},
"username_format": {
"type": "string"
},
"username_search_filter": {
"type": "string"
}
}
},
@@ -5962,9 +5953,6 @@ func init() {
"url"
],
"properties": {
"group_name_attribute": {
"type": "string"
},
"group_search_base_dn": {
"type": "string"
},
@@ -6000,12 +5988,6 @@ func init() {
"items": {
"type": "string"
}
},
"username_format": {
"type": "string"
},
"username_search_filter": {
"type": "string"
}
}
},
@@ -7192,9 +7174,6 @@ func init() {
"url"
],
"properties": {
"group_name_attribute": {
"type": "string"
},
"group_search_base_dn": {
"type": "string"
},
@@ -7230,12 +7209,6 @@ func init() {
"items": {
"type": "string"
}
},
"username_format": {
"type": "string"
},
"username_search_filter": {
"type": "string"
}
}
},

View File

@@ -151,9 +151,6 @@ func getTenantCreatedResponse(session *models.Principal, params operator_api.Cre
if tenantReq.Idp.ActiveDirectory != nil {
tenantExternalIDPConfigured = true
serverAddress := *tenantReq.Idp.ActiveDirectory.URL
userNameFormat := tenantReq.Idp.ActiveDirectory.UsernameFormat
userNameSearchFilter := tenantReq.Idp.ActiveDirectory.UsernameSearchFilter
groupNameAttribute := tenantReq.Idp.ActiveDirectory.GroupNameAttribute
tlsSkipVerify := tenantReq.Idp.ActiveDirectory.SkipTLSVerification
serverInsecure := tenantReq.Idp.ActiveDirectory.ServerInsecure
lookupBindDN := tenantReq.Idp.ActiveDirectory.LookupBindDn
@@ -176,10 +173,6 @@ func getTenantCreatedResponse(session *models.Principal, params operator_api.Cre
tenantConfigurationENV["MINIO_IDENTITY_LDAP_SERVER_STARTTLS"] = "on"
}
// LDAP Username
tenantConfigurationENV["MINIO_IDENTITY_LDAP_USERNAME_FORMAT"] = userNameFormat
tenantConfigurationENV["MINIO_IDENTITY_LDAP_USERNAME_SEARCH_FILTER"] = userNameSearchFilter
// LDAP Lookup
tenantConfigurationENV["MINIO_IDENTITY_LDAP_LOOKUP_BIND_DN"] = lookupBindDN
tenantConfigurationENV["MINIO_IDENTITY_LDAP_LOOKUP_BIND_PASSWORD"] = lookupBindPassword
@@ -189,7 +182,6 @@ func getTenantCreatedResponse(session *models.Principal, params operator_api.Cre
tenantConfigurationENV["MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER"] = userDNSearchFilter
// LDAP Group
tenantConfigurationENV["MINIO_IDENTITY_LDAP_GROUP_NAME_ATTRIBUTE"] = groupNameAttribute
tenantConfigurationENV["MINIO_IDENTITY_LDAP_GROUP_SEARCH_BASE_DN"] = groupSearchBaseDN
tenantConfigurationENV["MINIO_IDENTITY_LDAP_GROUP_SEARCH_FILTER"] = groupSearchFilter

156
operatorapi/tenant_get.go Normal file
View File

@@ -0,0 +1,156 @@
// This file is part of MinIO Console Server
// Copyright (c) 2022 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package operatorapi
import (
"context"
"fmt"
"time"
"github.com/minio/console/cluster"
"github.com/minio/console/models"
"github.com/minio/console/operatorapi/operations/operator_api"
"github.com/minio/console/restapi"
miniov2 "github.com/minio/operator/pkg/apis/minio.min.io/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func getTenantDetailsResponse(session *models.Principal, params operator_api.TenantDetailsParams) (*models.Tenant, *models.Error) {
// 5 seconds timeout
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
opClientClientSet, err := cluster.OperatorClient(session.STSSessionToken)
if err != nil {
return nil, prepareError(err)
}
opClient := &operatorClient{
client: opClientClientSet,
}
minTenant, err := getTenant(ctx, opClient, params.Namespace, params.Tenant)
if err != nil {
return nil, prepareError(err)
}
info := getTenantInfo(minTenant)
// get Kubernetes Client
clientSet, err := cluster.K8sClient(session.STSSessionToken)
if err != nil {
return nil, prepareError(err)
}
k8sClient := k8sClient{
client: clientSet,
}
tenantConfiguration, err := GetTenantConfiguration(ctx, &k8sClient, minTenant)
if err != nil {
restapi.LogError("unable to fetch configuration for tenant %s: %v", minTenant.Name, err)
}
// detect if AD/LDAP is enabled
ldapEnabled := false
if string(tenantConfiguration["MINIO_IDENTITY_LDAP_SERVER_ADDR"]) != "" {
ldapEnabled = true
}
// detect if OpenID is enabled
oidcEnabled := false
if string(tenantConfiguration["MINIO_IDENTITY_OPENID_CONFIG_URL"]) != "" {
oidcEnabled = true
}
// detect if encryption is enabled
if minTenant.HasKESEnabled() || string(tenantConfiguration["MINIO_KMS_SECRET_KEY"]) != "" {
info.EncryptionEnabled = true
}
info.LogEnabled = minTenant.HasLogEnabled()
info.MonitoringEnabled = minTenant.HasPrometheusEnabled()
info.IdpAdEnabled = ldapEnabled
info.IdpOidcEnabled = oidcEnabled
info.MinioTLS = minTenant.TLS()
// attach status information
info.Status = &models.TenantStatus{
HealthStatus: string(minTenant.Status.HealthStatus),
DrivesHealing: minTenant.Status.DrivesHealing,
DrivesOffline: minTenant.Status.DrivesOffline,
DrivesOnline: minTenant.Status.DrivesOnline,
WriteQuorum: minTenant.Status.WriteQuorum,
Usage: &models.TenantStatusUsage{
Raw: minTenant.Status.Usage.RawCapacity,
RawUsage: minTenant.Status.Usage.RawUsage,
Capacity: minTenant.Status.Usage.Capacity,
CapacityUsage: minTenant.Status.Usage.Usage,
},
}
// get tenant service
minTenant.EnsureDefaults()
//minio service
minSvc, err := k8sClient.getService(ctx, minTenant.Namespace, minTenant.MinIOCIServiceName(), metav1.GetOptions{})
if err != nil {
// we can tolerate this error
restapi.LogError("Unable to get MinIO service name: %v, continuing", err)
}
//console service
conSvc, err := k8sClient.getService(ctx, minTenant.Namespace, minTenant.ConsoleCIServiceName(), metav1.GetOptions{})
if err != nil {
// we can tolerate this error
restapi.LogError("Unable to get MinIO console service name: %v, continuing", err)
}
schema := "http"
consoleSchema := "http"
consolePort := fmt.Sprintf(":%d", miniov2.ConsolePort)
if minTenant.TLS() {
schema = "https"
consoleSchema = "https"
consolePort = fmt.Sprintf(":%d", miniov2.ConsoleTLSPort)
}
var minioEndpoint string
var consoleEndpoint string
if minSvc != nil && len(minSvc.Status.LoadBalancer.Ingress) > 0 {
if minSvc.Status.LoadBalancer.Ingress[0].IP != "" {
minioEndpoint = fmt.Sprintf("%s://%s", schema, minSvc.Status.LoadBalancer.Ingress[0].IP)
}
if minSvc.Status.LoadBalancer.Ingress[0].Hostname != "" {
minioEndpoint = fmt.Sprintf("%s://%s", schema, minSvc.Status.LoadBalancer.Ingress[0].Hostname)
}
}
if conSvc != nil && len(conSvc.Status.LoadBalancer.Ingress) > 0 {
if conSvc.Status.LoadBalancer.Ingress[0].IP != "" {
consoleEndpoint = fmt.Sprintf("%s://%s%s", consoleSchema, conSvc.Status.LoadBalancer.Ingress[0].IP, consolePort)
}
if conSvc.Status.LoadBalancer.Ingress[0].Hostname != "" {
consoleEndpoint = fmt.Sprintf("%s://%s%s", consoleSchema, conSvc.Status.LoadBalancer.Ingress[0].Hostname, consolePort)
}
}
if minioEndpoint != "" || consoleEndpoint != "" {
info.Endpoints = &models.TenantEndpoints{
Console: consoleEndpoint,
Minio: minioEndpoint,
}
}
return info, nil
}

View File

@@ -0,0 +1,103 @@
// This file is part of MinIO Console Server
// Copyright (c) 2022 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package operatorapi
import (
"context"
"encoding/json"
"fmt"
"strings"
"github.com/minio/console/operatorapi/operations/operator_api"
utils2 "github.com/minio/console/pkg/utils"
"github.com/minio/console/restapi"
miniov2 "github.com/minio/operator/pkg/apis/minio.min.io/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
)
// updateTenantAction does an update on the minioTenant by patching the desired changes
func updateTenantAction(ctx context.Context, operatorClient OperatorClientI, clientset v1.CoreV1Interface, httpCl utils2.HTTPClientI, namespace string, params operator_api.UpdateTenantParams) error {
imageToUpdate := params.Body.Image
imageRegistryReq := params.Body.ImageRegistry
minInst, err := operatorClient.TenantGet(ctx, namespace, params.Tenant, metav1.GetOptions{})
if err != nil {
return err
}
// we can take either the `image_pull_secret` of the `image_registry` but not both
if params.Body.ImagePullSecret != "" {
minInst.Spec.ImagePullSecret.Name = params.Body.ImagePullSecret
} else {
// update the image pull secret content
if _, err := setImageRegistry(ctx, imageRegistryReq, clientset, namespace, params.Tenant); err != nil {
restapi.LogError("error setting image registry secret: %v", err)
return err
}
}
// if image to update is empty we'll use the latest image by default
if strings.TrimSpace(imageToUpdate) != "" {
minInst.Spec.Image = imageToUpdate
} else {
im, err := utils2.GetLatestMinIOImage(httpCl)
// if we can't get the MinIO image, we won' auto-update it unless it's explicit by name
if err == nil {
minInst.Spec.Image = *im
}
}
// Prometheus Annotations
currentAnnotations := minInst.Annotations
prometheusAnnotations := map[string]string{
prometheusPath: "/minio/prometheus/metrics",
prometheusPort: fmt.Sprint(miniov2.MinIOPort),
prometheusScrape: "true",
}
if params.Body.EnablePrometheus && currentAnnotations != nil {
// add prometheus annotations to the tenant
minInst.Annotations = addAnnotations(currentAnnotations, prometheusAnnotations)
// add prometheus annotations to the each pool
if minInst.Spec.Pools != nil {
for _, pool := range minInst.Spec.Pools {
poolAnnotations := pool.VolumeClaimTemplate.GetObjectMeta().GetAnnotations()
pool.VolumeClaimTemplate.GetObjectMeta().SetAnnotations(addAnnotations(poolAnnotations, prometheusAnnotations))
}
}
} else {
// remove prometheus annotations to the tenant
minInst.Annotations = removeAnnotations(currentAnnotations, prometheusAnnotations)
// add prometheus annotations from each pool
if minInst.Spec.Pools != nil {
for _, pool := range minInst.Spec.Pools {
poolAnnotations := pool.VolumeClaimTemplate.GetObjectMeta().GetAnnotations()
pool.VolumeClaimTemplate.GetObjectMeta().SetAnnotations(removeAnnotations(poolAnnotations, prometheusAnnotations))
}
}
}
payloadBytes, err := json.Marshal(minInst)
if err != nil {
return err
}
_, err = operatorClient.TenantPatch(ctx, namespace, minInst.Name, types.MergePatchType, payloadBytes, metav1.PatchOptions{})
if err != nil {
return err
}
return nil
}

View File

@@ -528,132 +528,6 @@ func getTenantInfo(tenant *miniov2.Tenant) *models.Tenant {
}
}
func getTenantDetailsResponse(session *models.Principal, params operator_api.TenantDetailsParams) (*models.Tenant, *models.Error) {
// 5 seconds timeout
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
opClientClientSet, err := cluster.OperatorClient(session.STSSessionToken)
if err != nil {
return nil, prepareError(err)
}
opClient := &operatorClient{
client: opClientClientSet,
}
minTenant, err := getTenant(ctx, opClient, params.Namespace, params.Tenant)
if err != nil {
return nil, prepareError(err)
}
info := getTenantInfo(minTenant)
// get Kubernetes Client
clientSet, err := cluster.K8sClient(session.STSSessionToken)
if err != nil {
return nil, prepareError(err)
}
k8sClient := k8sClient{
client: clientSet,
}
tenantConfiguration, err := GetTenantConfiguration(ctx, &k8sClient, minTenant)
if err != nil {
restapi.LogError("unable to fetch configuration for tenant %s: %v", minTenant.Name, err)
}
// detect if AD/LDAP is enabled
ldapEnabled := false
if string(tenantConfiguration["MINIO_IDENTITY_LDAP_SERVER_ADDR"]) != "" {
ldapEnabled = true
}
// detect if OpenID is enabled
oidcEnabled := false
if string(tenantConfiguration["MINIO_IDENTITY_OPENID_CONFIG_URL"]) != "" {
oidcEnabled = true
}
// detect if encryption is enabled
if minTenant.HasKESEnabled() || string(tenantConfiguration["MINIO_KMS_SECRET_KEY"]) != "" {
info.EncryptionEnabled = true
}
info.LogEnabled = minTenant.HasLogEnabled()
info.MonitoringEnabled = minTenant.HasPrometheusEnabled()
info.IdpAdEnabled = ldapEnabled
info.IdpOidcEnabled = oidcEnabled
info.MinioTLS = minTenant.TLS()
// attach status information
info.Status = &models.TenantStatus{
HealthStatus: string(minTenant.Status.HealthStatus),
DrivesHealing: minTenant.Status.DrivesHealing,
DrivesOffline: minTenant.Status.DrivesOffline,
DrivesOnline: minTenant.Status.DrivesOnline,
WriteQuorum: minTenant.Status.WriteQuorum,
Usage: &models.TenantStatusUsage{
Raw: minTenant.Status.Usage.RawCapacity,
RawUsage: minTenant.Status.Usage.RawUsage,
Capacity: minTenant.Status.Usage.Capacity,
CapacityUsage: minTenant.Status.Usage.Usage,
},
}
// get tenant service
minTenant.EnsureDefaults()
//minio service
minSvc, err := k8sClient.getService(ctx, minTenant.Namespace, minTenant.MinIOCIServiceName(), metav1.GetOptions{})
if err != nil {
// we can tolerate this error
restapi.LogError("Unable to get MinIO service name: %v, continuing", err)
}
//console service
conSvc, err := k8sClient.getService(ctx, minTenant.Namespace, minTenant.ConsoleCIServiceName(), metav1.GetOptions{})
if err != nil {
// we can tolerate this error
restapi.LogError("Unable to get MinIO console service name: %v, continuing", err)
}
schema := "http"
consoleSchema := "http"
consolePort := fmt.Sprintf(":%d", miniov2.ConsolePort)
if minTenant.TLS() {
schema = "https"
consoleSchema = "https"
consolePort = fmt.Sprintf(":%d", miniov2.ConsoleTLSPort)
}
var minioEndpoint string
var consoleEndpoint string
if minSvc != nil && len(minSvc.Status.LoadBalancer.Ingress) > 0 {
if minSvc.Status.LoadBalancer.Ingress[0].IP != "" {
minioEndpoint = fmt.Sprintf("%s://%s", schema, minSvc.Status.LoadBalancer.Ingress[0].IP)
}
if minSvc.Status.LoadBalancer.Ingress[0].Hostname != "" {
minioEndpoint = fmt.Sprintf("%s://%s", schema, minSvc.Status.LoadBalancer.Ingress[0].Hostname)
}
}
if conSvc != nil && len(conSvc.Status.LoadBalancer.Ingress) > 0 {
if conSvc.Status.LoadBalancer.Ingress[0].IP != "" {
consoleEndpoint = fmt.Sprintf("%s://%s%s", consoleSchema, conSvc.Status.LoadBalancer.Ingress[0].IP, consolePort)
}
if conSvc.Status.LoadBalancer.Ingress[0].Hostname != "" {
consoleEndpoint = fmt.Sprintf("%s://%s%s", consoleSchema, conSvc.Status.LoadBalancer.Ingress[0].Hostname, consolePort)
}
}
if minioEndpoint != "" || consoleEndpoint != "" {
info.Endpoints = &models.TenantEndpoints{
Console: consoleEndpoint,
Minio: minioEndpoint,
}
}
return info, nil
}
func parseCertificate(name string, rawCert []byte) (*models.CertificateInfo, error) {
block, _ := pem.Decode(rawCert)
if block == nil {
@@ -678,7 +552,7 @@ func parseCertificate(name string, rawCert []byte) (*models.CertificateInfo, err
SerialNumber: cert.SerialNumber.String(),
Name: name,
Domains: domains,
Expiry: cert.NotAfter.String(),
Expiry: cert.NotAfter.Format(time.RFC3339),
}, nil
}
@@ -722,7 +596,7 @@ func parseTenantCertificates(ctx context.Context, clientSet K8sClientI, namespac
SerialNumber: cert.SerialNumber.String(),
Name: secret.Name,
Domains: domains,
Expiry: cert.NotAfter.String(),
Expiry: cert.NotAfter.Format(time.RFC3339),
})
}
}
@@ -1040,77 +914,6 @@ func setImageRegistry(ctx context.Context, req *models.ImageRegistry, clientset
return pullSecretName, nil
}
// updateTenantAction does an update on the minioTenant by patching the desired changes
func updateTenantAction(ctx context.Context, operatorClient OperatorClientI, clientset v1.CoreV1Interface, httpCl utils2.HTTPClientI, namespace string, params operator_api.UpdateTenantParams) error {
imageToUpdate := params.Body.Image
imageRegistryReq := params.Body.ImageRegistry
minInst, err := operatorClient.TenantGet(ctx, namespace, params.Tenant, metav1.GetOptions{})
if err != nil {
return err
}
// we can take either the `image_pull_secret` of the `image_registry` but not both
if params.Body.ImagePullSecret != "" {
minInst.Spec.ImagePullSecret.Name = params.Body.ImagePullSecret
} else {
// update the image pull secret content
if _, err := setImageRegistry(ctx, imageRegistryReq, clientset, namespace, params.Tenant); err != nil {
restapi.LogError("error setting image registry secret: %v", err)
return err
}
}
// if image to update is empty we'll use the latest image by default
if strings.TrimSpace(imageToUpdate) != "" {
minInst.Spec.Image = imageToUpdate
} else {
im, err := cluster.GetLatestMinioImage(httpCl)
// if we can't get the MinIO image, we won' auto-update it unless it's explicit by name
if err == nil {
minInst.Spec.Image = *im
}
}
// Prometheus Annotations
currentAnnotations := minInst.Annotations
prometheusAnnotations := map[string]string{
prometheusPath: "/minio/prometheus/metrics",
prometheusPort: fmt.Sprint(miniov2.MinIOPort),
prometheusScrape: "true",
}
if params.Body.EnablePrometheus && currentAnnotations != nil {
// add prometheus annotations to the tenant
minInst.Annotations = addAnnotations(currentAnnotations, prometheusAnnotations)
// add prometheus annotations to the each pool
if minInst.Spec.Pools != nil {
for _, pool := range minInst.Spec.Pools {
poolAnnotations := pool.VolumeClaimTemplate.GetObjectMeta().GetAnnotations()
pool.VolumeClaimTemplate.GetObjectMeta().SetAnnotations(addAnnotations(poolAnnotations, prometheusAnnotations))
}
}
} else {
// remove prometheus annotations to the tenant
minInst.Annotations = removeAnnotations(currentAnnotations, prometheusAnnotations)
// add prometheus annotations from each pool
if minInst.Spec.Pools != nil {
for _, pool := range minInst.Spec.Pools {
poolAnnotations := pool.VolumeClaimTemplate.GetObjectMeta().GetAnnotations()
pool.VolumeClaimTemplate.GetObjectMeta().SetAnnotations(removeAnnotations(poolAnnotations, prometheusAnnotations))
}
}
}
payloadBytes, err := json.Marshal(minInst)
if err != nil {
return err
}
_, err = operatorClient.TenantPatch(ctx, namespace, minInst.Name, types.MergePatchType, payloadBytes, metav1.PatchOptions{})
if err != nil {
return err
}
return nil
}
// addAnnotations will merge two annotation maps
func addAnnotations(annotationsOne, annotationsTwo map[string]string) map[string]string {
if annotationsOne == nil {

View File

@@ -34,8 +34,6 @@ var (
// SchemeBuilder points to a list of functions added to Scheme.
SchemeBuilder runtime.SchemeBuilder
localSchemeBuilder = &SchemeBuilder
// AddToScheme applies all stored functions to Scheme.
AddToScheme = localSchemeBuilder.AddToScheme
)
func init() {

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,325 +1,299 @@
{
"files": {
"main.css": "./static/css/main.c4c1effe.css",
"main.js": "./static/js/main.356b7ece.js",
"static/js/1660.0a544a1c.chunk.js": "./static/js/1660.0a544a1c.chunk.js",
"static/js/5282.cb13b8c4.chunk.js": "./static/js/5282.cb13b8c4.chunk.js",
"static/js/2818.a52e5730.chunk.js": "./static/js/2818.a52e5730.chunk.js",
"static/js/9560.4af4758c.chunk.js": "./static/js/9560.4af4758c.chunk.js",
"static/js/9661.92a4e63a.chunk.js": "./static/js/9661.92a4e63a.chunk.js",
"static/js/9330.fc2b1754.chunk.js": "./static/js/9330.fc2b1754.chunk.js",
"static/js/7436.2f1beb7f.chunk.js": "./static/js/7436.2f1beb7f.chunk.js",
"static/js/8428.2e7a1391.chunk.js": "./static/js/8428.2e7a1391.chunk.js",
"static/js/9779.fed48861.chunk.js": "./static/js/9779.fed48861.chunk.js",
"static/js/3617.21f62530.chunk.js": "./static/js/3617.21f62530.chunk.js",
"static/js/7274.9c913af6.chunk.js": "./static/js/7274.9c913af6.chunk.js",
"static/js/7842.8dfd596a.chunk.js": "./static/js/7842.8dfd596a.chunk.js",
"static/js/4745.27ab197f.chunk.js": "./static/js/4745.27ab197f.chunk.js",
"static/js/1796.26462172.chunk.js": "./static/js/1796.26462172.chunk.js",
"static/js/8259.0f043c32.chunk.js": "./static/js/8259.0f043c32.chunk.js",
"static/js/6023.aec2d9d1.chunk.js": "./static/js/6023.aec2d9d1.chunk.js",
"static/js/6147.f2a7d841.chunk.js": "./static/js/6147.f2a7d841.chunk.js",
"static/js/9275.64950c8f.chunk.js": "./static/js/9275.64950c8f.chunk.js",
"static/js/8190.33999302.chunk.js": "./static/js/8190.33999302.chunk.js",
"static/js/7314.0058a98f.chunk.js": "./static/js/7314.0058a98f.chunk.js",
"static/js/7456.837caf4a.chunk.js": "./static/js/7456.837caf4a.chunk.js",
"static/css/5822.dd80c1b6.chunk.css": "./static/css/5822.dd80c1b6.chunk.css",
"static/js/5822.4c917623.chunk.js": "./static/js/5822.4c917623.chunk.js",
"static/js/2699.3102be0f.chunk.js": "./static/js/2699.3102be0f.chunk.js",
"static/js/5808.518586b4.chunk.js": "./static/js/5808.518586b4.chunk.js",
"static/js/1237.b46ec019.chunk.js": "./static/js/1237.b46ec019.chunk.js",
"static/js/189.241fa22e.chunk.js": "./static/js/189.241fa22e.chunk.js",
"static/css/964.dd80c1b6.chunk.css": "./static/css/964.dd80c1b6.chunk.css",
"static/js/964.c1751e75.chunk.js": "./static/js/964.c1751e75.chunk.js",
"static/css/9807.dd80c1b6.chunk.css": "./static/css/9807.dd80c1b6.chunk.css",
"static/js/9807.731eb17a.chunk.js": "./static/js/9807.731eb17a.chunk.js",
"static/js/3806.f77e7acc.chunk.js": "./static/js/3806.f77e7acc.chunk.js",
"static/js/8661.34b7bdbc.chunk.js": "./static/js/8661.34b7bdbc.chunk.js",
"static/js/2886.a03a185d.chunk.js": "./static/js/2886.a03a185d.chunk.js",
"static/js/4577.3834865e.chunk.js": "./static/js/4577.3834865e.chunk.js",
"static/js/4298.e6c437dd.chunk.js": "./static/js/4298.e6c437dd.chunk.js",
"static/js/2805.b4302353.chunk.js": "./static/js/2805.b4302353.chunk.js",
"static/js/3143.e6a9621d.chunk.js": "./static/js/3143.e6a9621d.chunk.js",
"static/js/428.ad58c353.chunk.js": "./static/js/428.ad58c353.chunk.js",
"static/js/1069.77bb316e.chunk.js": "./static/js/1069.77bb316e.chunk.js",
"static/js/9080.884725e7.chunk.js": "./static/js/9080.884725e7.chunk.js",
"static/js/3276.1afa9e35.chunk.js": "./static/js/3276.1afa9e35.chunk.js",
"static/js/6458.facc37ce.chunk.js": "./static/js/6458.facc37ce.chunk.js",
"static/js/7551.cc30e489.chunk.js": "./static/js/7551.cc30e489.chunk.js",
"static/js/7950.1d853b08.chunk.js": "./static/js/7950.1d853b08.chunk.js",
"static/js/290.84656bab.chunk.js": "./static/js/290.84656bab.chunk.js",
"static/js/8961.c7471e8d.chunk.js": "./static/js/8961.c7471e8d.chunk.js",
"static/js/3967.9d410653.chunk.js": "./static/js/3967.9d410653.chunk.js",
"static/css/4084.dd80c1b6.chunk.css": "./static/css/4084.dd80c1b6.chunk.css",
"static/js/4084.26bd4d80.chunk.js": "./static/js/4084.26bd4d80.chunk.js",
"static/js/8394.fa043a82.chunk.js": "./static/js/8394.fa043a82.chunk.js",
"static/js/7664.b099b462.chunk.js": "./static/js/7664.b099b462.chunk.js",
"static/js/1140.044ef809.chunk.js": "./static/js/1140.044ef809.chunk.js",
"static/js/5961.7a71f2c5.chunk.js": "./static/js/5961.7a71f2c5.chunk.js",
"static/js/2401.dcfa0659.chunk.js": "./static/js/2401.dcfa0659.chunk.js",
"static/js/7498.adcacaca.chunk.js": "./static/js/7498.adcacaca.chunk.js",
"static/js/9421.a6974f61.chunk.js": "./static/js/9421.a6974f61.chunk.js",
"static/js/5284.f9adff8d.chunk.js": "./static/js/5284.f9adff8d.chunk.js",
"static/js/5245.04e84402.chunk.js": "./static/js/5245.04e84402.chunk.js",
"static/js/6549.bc76401b.chunk.js": "./static/js/6549.bc76401b.chunk.js",
"static/css/8724.dd80c1b6.chunk.css": "./static/css/8724.dd80c1b6.chunk.css",
"static/js/8724.2fda7628.chunk.js": "./static/js/8724.2fda7628.chunk.js",
"static/js/2182.fffe1ab8.chunk.js": "./static/js/2182.fffe1ab8.chunk.js",
"static/js/7764.3b798da3.chunk.js": "./static/js/7764.3b798da3.chunk.js",
"static/js/4220.8d9a9028.chunk.js": "./static/js/4220.8d9a9028.chunk.js",
"static/js/1719.377230ee.chunk.js": "./static/js/1719.377230ee.chunk.js",
"static/js/3320.bb9509a7.chunk.js": "./static/js/3320.bb9509a7.chunk.js",
"static/js/6645.1d65ce48.chunk.js": "./static/js/6645.1d65ce48.chunk.js",
"static/js/9923.67fe770d.chunk.js": "./static/js/9923.67fe770d.chunk.js",
"static/js/9586.f3d3466d.chunk.js": "./static/js/9586.f3d3466d.chunk.js",
"static/js/9125.a86e3119.chunk.js": "./static/js/9125.a86e3119.chunk.js",
"static/js/5781.33738b7f.chunk.js": "./static/js/5781.33738b7f.chunk.js",
"static/js/7261.3f7e9a41.chunk.js": "./static/js/7261.3f7e9a41.chunk.js",
"static/js/4014.00c14ff7.chunk.js": "./static/js/4014.00c14ff7.chunk.js",
"static/js/6436.4ad7cf88.chunk.js": "./static/js/6436.4ad7cf88.chunk.js",
"static/js/8343.67a940b1.chunk.js": "./static/js/8343.67a940b1.chunk.js",
"static/js/2841.1efed130.chunk.js": "./static/js/2841.1efed130.chunk.js",
"static/js/6167.f8cae728.chunk.js": "./static/js/6167.f8cae728.chunk.js",
"static/js/7346.6d634943.chunk.js": "./static/js/7346.6d634943.chunk.js",
"static/js/5144.d191021a.chunk.js": "./static/js/5144.d191021a.chunk.js",
"static/js/5125.58c2feff.chunk.js": "./static/js/5125.58c2feff.chunk.js",
"static/js/528.d625c2f7.chunk.js": "./static/js/528.d625c2f7.chunk.js",
"static/js/7187.ac1e291b.chunk.js": "./static/js/7187.ac1e291b.chunk.js",
"static/js/6173.b9534092.chunk.js": "./static/js/6173.b9534092.chunk.js",
"static/js/953.b0d590af.chunk.js": "./static/js/953.b0d590af.chunk.js",
"static/js/9193.feaac1ba.chunk.js": "./static/js/9193.feaac1ba.chunk.js",
"static/js/7451.dabaf18f.chunk.js": "./static/js/7451.dabaf18f.chunk.js",
"static/js/9924.020057ee.chunk.js": "./static/js/9924.020057ee.chunk.js",
"static/css/9645.dd80c1b6.chunk.css": "./static/css/9645.dd80c1b6.chunk.css",
"static/js/9645.71cc858a.chunk.js": "./static/js/9645.71cc858a.chunk.js",
"static/js/4121.ccb4caf8.chunk.js": "./static/js/4121.ccb4caf8.chunk.js",
"static/js/609.356ffb9f.chunk.js": "./static/js/609.356ffb9f.chunk.js",
"static/js/3421.9f8702b9.chunk.js": "./static/js/3421.9f8702b9.chunk.js",
"static/js/2892.f87668de.chunk.js": "./static/js/2892.f87668de.chunk.js",
"static/js/7926.19dfa2c4.chunk.js": "./static/js/7926.19dfa2c4.chunk.js",
"static/js/6145.9665a7b2.chunk.js": "./static/js/6145.9665a7b2.chunk.js",
"static/css/3816.dd80c1b6.chunk.css": "./static/css/3816.dd80c1b6.chunk.css",
"static/js/3816.c0b2fb6b.chunk.js": "./static/js/3816.c0b2fb6b.chunk.js",
"static/js/2966.07cdaf2e.chunk.js": "./static/js/2966.07cdaf2e.chunk.js",
"static/js/4177.381caad6.chunk.js": "./static/js/4177.381caad6.chunk.js",
"static/js/9679.0973c488.chunk.js": "./static/js/9679.0973c488.chunk.js",
"static/js/8333.31c141d9.chunk.js": "./static/js/8333.31c141d9.chunk.js",
"static/js/1711.dfdfce0a.chunk.js": "./static/js/1711.dfdfce0a.chunk.js",
"static/js/9.6b0b3695.chunk.js": "./static/js/9.6b0b3695.chunk.js",
"static/js/4487.8cae9359.chunk.js": "./static/js/4487.8cae9359.chunk.js",
"static/js/6866.a519feef.chunk.js": "./static/js/6866.a519feef.chunk.js",
"static/js/8564.794b3bc8.chunk.js": "./static/js/8564.794b3bc8.chunk.js",
"static/js/1666.9098f0d4.chunk.js": "./static/js/1666.9098f0d4.chunk.js",
"static/js/7007.259f4b3e.chunk.js": "./static/js/7007.259f4b3e.chunk.js",
"static/js/14.25ecb28d.chunk.js": "./static/js/14.25ecb28d.chunk.js",
"static/js/3152.d03e4df4.chunk.js": "./static/js/3152.d03e4df4.chunk.js",
"static/js/2066.16320a68.chunk.js": "./static/js/2066.16320a68.chunk.js",
"static/js/5444.e8727da9.chunk.js": "./static/js/5444.e8727da9.chunk.js",
"static/js/3690.536fb187.chunk.js": "./static/js/3690.536fb187.chunk.js",
"static/js/5399.6bc650ac.chunk.js": "./static/js/5399.6bc650ac.chunk.js",
"static/js/606.28fdb5bc.chunk.js": "./static/js/606.28fdb5bc.chunk.js",
"static/js/9769.a2bfb4d7.chunk.js": "./static/js/9769.a2bfb4d7.chunk.js",
"static/js/6117.0fcd3d09.chunk.js": "./static/js/6117.0fcd3d09.chunk.js",
"static/js/8954.00599ff1.chunk.js": "./static/js/8954.00599ff1.chunk.js",
"static/js/2309.49be65c5.chunk.js": "./static/js/2309.49be65c5.chunk.js",
"static/js/7248.1e0c4e19.chunk.js": "./static/js/7248.1e0c4e19.chunk.js",
"static/js/3360.453f0701.chunk.js": "./static/js/3360.453f0701.chunk.js",
"static/js/2580.2e7b1399.chunk.js": "./static/js/2580.2e7b1399.chunk.js",
"static/js/4322.ddc888e0.chunk.js": "./static/js/4322.ddc888e0.chunk.js",
"static/js/9056.41f0e489.chunk.js": "./static/js/9056.41f0e489.chunk.js",
"static/js/4837.98af4cfe.chunk.js": "./static/js/4837.98af4cfe.chunk.js",
"static/js/3356.05b42758.chunk.js": "./static/js/3356.05b42758.chunk.js",
"static/js/3020.3b2e782c.chunk.js": "./static/js/3020.3b2e782c.chunk.js",
"static/js/195.0ba36b7b.chunk.js": "./static/js/195.0ba36b7b.chunk.js",
"static/js/8420.dc98b56b.chunk.js": "./static/js/8420.dc98b56b.chunk.js",
"static/js/728.92b72106.chunk.js": "./static/js/728.92b72106.chunk.js",
"static/js/3741.2a31713b.chunk.js": "./static/js/3741.2a31713b.chunk.js",
"static/js/849.1c67c5fb.chunk.js": "./static/js/849.1c67c5fb.chunk.js",
"static/js/2871.12124cd5.chunk.js": "./static/js/2871.12124cd5.chunk.js",
"static/js/9881.b5453ed2.chunk.js": "./static/js/9881.b5453ed2.chunk.js",
"static/js/3538.60e98cef.chunk.js": "./static/js/3538.60e98cef.chunk.js",
"static/js/619.89b9075f.chunk.js": "./static/js/619.89b9075f.chunk.js",
"static/js/3560.f86cd6a6.chunk.js": "./static/js/3560.f86cd6a6.chunk.js",
"static/js/6795.2e87544e.chunk.js": "./static/js/6795.2e87544e.chunk.js",
"static/js/7663.e9d514d1.chunk.js": "./static/js/7663.e9d514d1.chunk.js",
"static/js/3383.ab285f5a.chunk.js": "./static/js/3383.ab285f5a.chunk.js",
"static/js/5795.3d05b708.chunk.js": "./static/js/5795.3d05b708.chunk.js",
"static/js/3045.cfe6cbf4.chunk.js": "./static/js/3045.cfe6cbf4.chunk.js",
"static/js/8750.02521688.chunk.js": "./static/js/8750.02521688.chunk.js",
"static/js/2479.e8398014.chunk.js": "./static/js/2479.e8398014.chunk.js",
"static/js/6554.53f930ae.chunk.js": "./static/js/6554.53f930ae.chunk.js",
"static/js/9831.1b5a6bb6.chunk.js": "./static/js/9831.1b5a6bb6.chunk.js",
"static/js/9382.581734f3.chunk.js": "./static/js/9382.581734f3.chunk.js",
"static/js/8174.5f150ef6.chunk.js": "./static/js/8174.5f150ef6.chunk.js",
"static/js/6430.e747de7c.chunk.js": "./static/js/6430.e747de7c.chunk.js",
"static/js/4966.1e2905a6.chunk.js": "./static/js/4966.1e2905a6.chunk.js",
"static/js/825.9440e9f1.chunk.js": "./static/js/825.9440e9f1.chunk.js",
"static/js/6873.424e4aac.chunk.js": "./static/js/6873.424e4aac.chunk.js",
"static/js/2464.5dc72a90.chunk.js": "./static/js/2464.5dc72a90.chunk.js",
"static/js/1612.2e1e75b9.chunk.js": "./static/js/1612.2e1e75b9.chunk.js",
"static/js/7520.087167a1.chunk.js": "./static/js/7520.087167a1.chunk.js",
"main.css": "./static/css/main.90d417ae.css",
"main.js": "./static/js/main.a8ff5ae1.js",
"static/js/2483.363201d7.chunk.js": "./static/js/2483.363201d7.chunk.js",
"static/js/6914.b2d1846a.chunk.js": "./static/js/6914.b2d1846a.chunk.js",
"static/js/8904.9f5a3be3.chunk.js": "./static/js/8904.9f5a3be3.chunk.js",
"static/js/1829.99ee609f.chunk.js": "./static/js/1829.99ee609f.chunk.js",
"static/js/6041.0bf546c3.chunk.js": "./static/js/6041.0bf546c3.chunk.js",
"static/js/5088.0395aa79.chunk.js": "./static/js/5088.0395aa79.chunk.js",
"static/js/5140.92c7c01a.chunk.js": "./static/js/5140.92c7c01a.chunk.js",
"static/js/2434.d3149513.chunk.js": "./static/js/2434.d3149513.chunk.js",
"static/js/3176.2549e498.chunk.js": "./static/js/3176.2549e498.chunk.js",
"static/js/6137.8b758e88.chunk.js": "./static/js/6137.8b758e88.chunk.js",
"static/js/7045.9d14424c.chunk.js": "./static/js/7045.9d14424c.chunk.js",
"static/js/9635.c5a87859.chunk.js": "./static/js/9635.c5a87859.chunk.js",
"static/js/2338.3c79a135.chunk.js": "./static/js/2338.3c79a135.chunk.js",
"static/js/4335.daa02fff.chunk.js": "./static/js/4335.daa02fff.chunk.js",
"static/js/6144.56aa9aa1.chunk.js": "./static/js/6144.56aa9aa1.chunk.js",
"static/js/6763.d86879b4.chunk.js": "./static/js/6763.d86879b4.chunk.js",
"static/js/3543.7f1f5dd1.chunk.js": "./static/js/3543.7f1f5dd1.chunk.js",
"static/js/4061.72744aa0.chunk.js": "./static/js/4061.72744aa0.chunk.js",
"static/js/2249.802fef70.chunk.js": "./static/js/2249.802fef70.chunk.js",
"static/js/9611.48e395c5.chunk.js": "./static/js/9611.48e395c5.chunk.js",
"static/js/2637.eb53ade1.chunk.js": "./static/js/2637.eb53ade1.chunk.js",
"static/css/380.f0806840.chunk.css": "./static/css/380.f0806840.chunk.css",
"static/js/380.1e66f7fb.chunk.js": "./static/js/380.1e66f7fb.chunk.js",
"static/js/5926.6eebc955.chunk.js": "./static/js/5926.6eebc955.chunk.js",
"static/js/701.cf1bff16.chunk.js": "./static/js/701.cf1bff16.chunk.js",
"static/js/7821.4a20efe4.chunk.js": "./static/js/7821.4a20efe4.chunk.js",
"static/js/2625.f0c422fd.chunk.js": "./static/js/2625.f0c422fd.chunk.js",
"static/css/9033.f0806840.chunk.css": "./static/css/9033.f0806840.chunk.css",
"static/js/9033.c2cdc267.chunk.js": "./static/js/9033.c2cdc267.chunk.js",
"static/css/9299.f0806840.chunk.css": "./static/css/9299.f0806840.chunk.css",
"static/js/9299.35956104.chunk.js": "./static/js/9299.35956104.chunk.js",
"static/js/191.80e5a168.chunk.js": "./static/js/191.80e5a168.chunk.js",
"static/js/7585.61ec1ad6.chunk.js": "./static/js/7585.61ec1ad6.chunk.js",
"static/js/1836.ea648525.chunk.js": "./static/js/1836.ea648525.chunk.js",
"static/js/4653.c79dfc48.chunk.js": "./static/js/4653.c79dfc48.chunk.js",
"static/js/4394.dfbbe2b6.chunk.js": "./static/js/4394.dfbbe2b6.chunk.js",
"static/js/4781.f665cf2a.chunk.js": "./static/js/4781.f665cf2a.chunk.js",
"static/js/9478.a31d099b.chunk.js": "./static/js/9478.a31d099b.chunk.js",
"static/js/7164.a370b455.chunk.js": "./static/js/7164.a370b455.chunk.js",
"static/js/4414.5634e172.chunk.js": "./static/js/4414.5634e172.chunk.js",
"static/js/7798.e077fd71.chunk.js": "./static/js/7798.e077fd71.chunk.js",
"static/js/8833.0aa6aed9.chunk.js": "./static/js/8833.0aa6aed9.chunk.js",
"static/js/471.13d4a140.chunk.js": "./static/js/471.13d4a140.chunk.js",
"static/js/483.dae2ef37.chunk.js": "./static/js/483.dae2ef37.chunk.js",
"static/js/9467.24a0eb41.chunk.js": "./static/js/9467.24a0eb41.chunk.js",
"static/js/6895.4e94ef43.chunk.js": "./static/js/6895.4e94ef43.chunk.js",
"static/js/6233.7866b56a.chunk.js": "./static/js/6233.7866b56a.chunk.js",
"static/js/5588.2bee425e.chunk.js": "./static/js/5588.2bee425e.chunk.js",
"static/js/4874.96b74c82.chunk.js": "./static/js/4874.96b74c82.chunk.js",
"static/css/1955.f0806840.chunk.css": "./static/css/1955.f0806840.chunk.css",
"static/js/1955.54bd6485.chunk.js": "./static/js/1955.54bd6485.chunk.js",
"static/js/2653.98b78190.chunk.js": "./static/js/2653.98b78190.chunk.js",
"static/js/3956.cee5c63f.chunk.js": "./static/js/3956.cee5c63f.chunk.js",
"static/js/7015.86fd97fc.chunk.js": "./static/js/7015.86fd97fc.chunk.js",
"static/js/7524.cf07d407.chunk.js": "./static/js/7524.cf07d407.chunk.js",
"static/js/8771.db2b98f1.chunk.js": "./static/js/8771.db2b98f1.chunk.js",
"static/js/9076.6bfd772c.chunk.js": "./static/js/9076.6bfd772c.chunk.js",
"static/js/9221.fd62ef6f.chunk.js": "./static/js/9221.fd62ef6f.chunk.js",
"static/js/8896.7e43f413.chunk.js": "./static/js/8896.7e43f413.chunk.js",
"static/js/7413.e1d784e8.chunk.js": "./static/js/7413.e1d784e8.chunk.js",
"static/js/9134.8cc50bc9.chunk.js": "./static/js/9134.8cc50bc9.chunk.js",
"static/css/8138.f0806840.chunk.css": "./static/css/8138.f0806840.chunk.css",
"static/js/8138.d72851b8.chunk.js": "./static/js/8138.d72851b8.chunk.js",
"static/js/8183.967577a6.chunk.js": "./static/js/8183.967577a6.chunk.js",
"static/js/9145.6a82a8e7.chunk.js": "./static/js/9145.6a82a8e7.chunk.js",
"static/js/9537.177d91d7.chunk.js": "./static/js/9537.177d91d7.chunk.js",
"static/js/7331.a4fdab74.chunk.js": "./static/js/7331.a4fdab74.chunk.js",
"static/js/9605.b37fdfef.chunk.js": "./static/js/9605.b37fdfef.chunk.js",
"static/js/426.fc1a9166.chunk.js": "./static/js/426.fc1a9166.chunk.js",
"static/js/2878.aa37c6f9.chunk.js": "./static/js/2878.aa37c6f9.chunk.js",
"static/js/8495.b664f242.chunk.js": "./static/js/8495.b664f242.chunk.js",
"static/js/4934.8bb784c0.chunk.js": "./static/js/4934.8bb784c0.chunk.js",
"static/js/3518.c30eac83.chunk.js": "./static/js/3518.c30eac83.chunk.js",
"static/js/2684.9b1b9065.chunk.js": "./static/js/2684.9b1b9065.chunk.js",
"static/js/6683.0395331a.chunk.js": "./static/js/6683.0395331a.chunk.js",
"static/js/9032.aada8549.chunk.js": "./static/js/9032.aada8549.chunk.js",
"static/js/2676.977e5329.chunk.js": "./static/js/2676.977e5329.chunk.js",
"static/js/9449.877702b7.chunk.js": "./static/js/9449.877702b7.chunk.js",
"static/js/7659.cdd8e088.chunk.js": "./static/js/7659.cdd8e088.chunk.js",
"static/js/9968.4ba3dc08.chunk.js": "./static/js/9968.4ba3dc08.chunk.js",
"static/js/2180.5910a383.chunk.js": "./static/js/2180.5910a383.chunk.js",
"static/js/8253.a8e8b608.chunk.js": "./static/js/8253.a8e8b608.chunk.js",
"static/js/3328.8f4d30e6.chunk.js": "./static/js/3328.8f4d30e6.chunk.js",
"static/js/1440.735f3ff6.chunk.js": "./static/js/1440.735f3ff6.chunk.js",
"static/js/9002.0d569a45.chunk.js": "./static/js/9002.0d569a45.chunk.js",
"static/js/2114.ac47a792.chunk.js": "./static/js/2114.ac47a792.chunk.js",
"static/js/711.4196799c.chunk.js": "./static/js/711.4196799c.chunk.js",
"static/js/6901.0ba9ddfc.chunk.js": "./static/js/6901.0ba9ddfc.chunk.js",
"static/js/3678.5bd48bc8.chunk.js": "./static/js/3678.5bd48bc8.chunk.js",
"static/css/3320.f0806840.chunk.css": "./static/css/3320.f0806840.chunk.css",
"static/js/3320.5e846f8f.chunk.js": "./static/js/3320.5e846f8f.chunk.js",
"static/js/312.f4ca2352.chunk.js": "./static/js/312.f4ca2352.chunk.js",
"static/js/2112.afb8bcb6.chunk.js": "./static/js/2112.afb8bcb6.chunk.js",
"static/js/4619.ed29e211.chunk.js": "./static/js/4619.ed29e211.chunk.js",
"static/js/8990.56ac79e0.chunk.js": "./static/js/8990.56ac79e0.chunk.js",
"static/js/8455.b557f9ba.chunk.js": "./static/js/8455.b557f9ba.chunk.js",
"static/css/3631.f0806840.chunk.css": "./static/css/3631.f0806840.chunk.css",
"static/js/3631.23cb1b6a.chunk.js": "./static/js/3631.23cb1b6a.chunk.js",
"static/js/1604.69a0fc07.chunk.js": "./static/js/1604.69a0fc07.chunk.js",
"static/js/8391.484f375b.chunk.js": "./static/js/8391.484f375b.chunk.js",
"static/js/402.5425871a.chunk.js": "./static/js/402.5425871a.chunk.js",
"static/js/1705.0e30ff48.chunk.js": "./static/js/1705.0e30ff48.chunk.js",
"static/js/1581.2ff273b8.chunk.js": "./static/js/1581.2ff273b8.chunk.js",
"static/js/455.0ac20914.chunk.js": "./static/js/455.0ac20914.chunk.js",
"static/js/2661.3c5e0aa7.chunk.js": "./static/js/2661.3c5e0aa7.chunk.js",
"static/js/889.4805d401.chunk.js": "./static/js/889.4805d401.chunk.js",
"static/js/9088.4ee624ae.chunk.js": "./static/js/9088.4ee624ae.chunk.js",
"static/js/247.3b7c3d22.chunk.js": "./static/js/247.3b7c3d22.chunk.js",
"static/js/2763.da16b11a.chunk.js": "./static/js/2763.da16b11a.chunk.js",
"static/js/3772.8f7b248e.chunk.js": "./static/js/3772.8f7b248e.chunk.js",
"static/js/5171.dc54a6db.chunk.js": "./static/js/5171.dc54a6db.chunk.js",
"static/js/2442.c325186c.chunk.js": "./static/js/2442.c325186c.chunk.js",
"static/js/2426.bc0cfae1.chunk.js": "./static/js/2426.bc0cfae1.chunk.js",
"static/js/1520.97c97f2b.chunk.js": "./static/js/1520.97c97f2b.chunk.js",
"static/js/5561.ce85ef49.chunk.js": "./static/js/5561.ce85ef49.chunk.js",
"static/js/5609.97aa92cf.chunk.js": "./static/js/5609.97aa92cf.chunk.js",
"static/js/3801.a06455a2.chunk.js": "./static/js/3801.a06455a2.chunk.js",
"static/js/6431.5f2e5e6e.chunk.js": "./static/js/6431.5f2e5e6e.chunk.js",
"static/js/1918.ce3ab2e2.chunk.js": "./static/js/1918.ce3ab2e2.chunk.js",
"static/js/7757.3650a6cc.chunk.js": "./static/js/7757.3650a6cc.chunk.js",
"static/js/8760.e06a6adc.chunk.js": "./static/js/8760.e06a6adc.chunk.js",
"static/js/8810.c4bd6fe9.chunk.js": "./static/js/8810.c4bd6fe9.chunk.js",
"static/js/1401.98c1da5a.chunk.js": "./static/js/1401.98c1da5a.chunk.js",
"static/js/6523.f3c7724a.chunk.js": "./static/js/6523.f3c7724a.chunk.js",
"static/js/8354.e837d480.chunk.js": "./static/js/8354.e837d480.chunk.js",
"static/js/5221.b26ebb60.chunk.js": "./static/js/5221.b26ebb60.chunk.js",
"static/js/6172.dd44d76e.chunk.js": "./static/js/6172.dd44d76e.chunk.js",
"static/js/532.19dd5663.chunk.js": "./static/js/532.19dd5663.chunk.js",
"static/js/592.ec821e13.chunk.js": "./static/js/592.ec821e13.chunk.js",
"static/js/2076.e7bf07b8.chunk.js": "./static/js/2076.e7bf07b8.chunk.js",
"static/js/1326.d157bb06.chunk.js": "./static/js/1326.d157bb06.chunk.js",
"static/js/7142.957288ed.chunk.js": "./static/js/7142.957288ed.chunk.js",
"static/js/7931.9fe0101a.chunk.js": "./static/js/7931.9fe0101a.chunk.js",
"static/js/9362.63d03757.chunk.js": "./static/js/9362.63d03757.chunk.js",
"static/js/2879.69834509.chunk.js": "./static/js/2879.69834509.chunk.js",
"static/js/3096.31031f0d.chunk.js": "./static/js/3096.31031f0d.chunk.js",
"static/js/9729.2ed96524.chunk.js": "./static/js/9729.2ed96524.chunk.js",
"static/js/2983.3a39dc73.chunk.js": "./static/js/2983.3a39dc73.chunk.js",
"static/js/770.f6360bf6.chunk.js": "./static/js/770.f6360bf6.chunk.js",
"static/js/5662.d8af2856.chunk.js": "./static/js/5662.d8af2856.chunk.js",
"static/js/5165.311fbd50.chunk.js": "./static/js/5165.311fbd50.chunk.js",
"static/js/9086.b84a9135.chunk.js": "./static/js/9086.b84a9135.chunk.js",
"static/js/1687.63ed48b6.chunk.js": "./static/js/1687.63ed48b6.chunk.js",
"index.html": "./index.html",
"main.c4c1effe.css.map": "./static/css/main.c4c1effe.css.map",
"main.356b7ece.js.map": "./static/js/main.356b7ece.js.map",
"1660.0a544a1c.chunk.js.map": "./static/js/1660.0a544a1c.chunk.js.map",
"5282.cb13b8c4.chunk.js.map": "./static/js/5282.cb13b8c4.chunk.js.map",
"2818.a52e5730.chunk.js.map": "./static/js/2818.a52e5730.chunk.js.map",
"9560.4af4758c.chunk.js.map": "./static/js/9560.4af4758c.chunk.js.map",
"9661.92a4e63a.chunk.js.map": "./static/js/9661.92a4e63a.chunk.js.map",
"9330.fc2b1754.chunk.js.map": "./static/js/9330.fc2b1754.chunk.js.map",
"7436.2f1beb7f.chunk.js.map": "./static/js/7436.2f1beb7f.chunk.js.map",
"8428.2e7a1391.chunk.js.map": "./static/js/8428.2e7a1391.chunk.js.map",
"9779.fed48861.chunk.js.map": "./static/js/9779.fed48861.chunk.js.map",
"3617.21f62530.chunk.js.map": "./static/js/3617.21f62530.chunk.js.map",
"7274.9c913af6.chunk.js.map": "./static/js/7274.9c913af6.chunk.js.map",
"7842.8dfd596a.chunk.js.map": "./static/js/7842.8dfd596a.chunk.js.map",
"4745.27ab197f.chunk.js.map": "./static/js/4745.27ab197f.chunk.js.map",
"1796.26462172.chunk.js.map": "./static/js/1796.26462172.chunk.js.map",
"8259.0f043c32.chunk.js.map": "./static/js/8259.0f043c32.chunk.js.map",
"6023.aec2d9d1.chunk.js.map": "./static/js/6023.aec2d9d1.chunk.js.map",
"6147.f2a7d841.chunk.js.map": "./static/js/6147.f2a7d841.chunk.js.map",
"9275.64950c8f.chunk.js.map": "./static/js/9275.64950c8f.chunk.js.map",
"8190.33999302.chunk.js.map": "./static/js/8190.33999302.chunk.js.map",
"7314.0058a98f.chunk.js.map": "./static/js/7314.0058a98f.chunk.js.map",
"7456.837caf4a.chunk.js.map": "./static/js/7456.837caf4a.chunk.js.map",
"5822.dd80c1b6.chunk.css.map": "./static/css/5822.dd80c1b6.chunk.css.map",
"5822.4c917623.chunk.js.map": "./static/js/5822.4c917623.chunk.js.map",
"2699.3102be0f.chunk.js.map": "./static/js/2699.3102be0f.chunk.js.map",
"5808.518586b4.chunk.js.map": "./static/js/5808.518586b4.chunk.js.map",
"1237.b46ec019.chunk.js.map": "./static/js/1237.b46ec019.chunk.js.map",
"189.241fa22e.chunk.js.map": "./static/js/189.241fa22e.chunk.js.map",
"964.dd80c1b6.chunk.css.map": "./static/css/964.dd80c1b6.chunk.css.map",
"964.c1751e75.chunk.js.map": "./static/js/964.c1751e75.chunk.js.map",
"9807.dd80c1b6.chunk.css.map": "./static/css/9807.dd80c1b6.chunk.css.map",
"9807.731eb17a.chunk.js.map": "./static/js/9807.731eb17a.chunk.js.map",
"3806.f77e7acc.chunk.js.map": "./static/js/3806.f77e7acc.chunk.js.map",
"8661.34b7bdbc.chunk.js.map": "./static/js/8661.34b7bdbc.chunk.js.map",
"2886.a03a185d.chunk.js.map": "./static/js/2886.a03a185d.chunk.js.map",
"4577.3834865e.chunk.js.map": "./static/js/4577.3834865e.chunk.js.map",
"4298.e6c437dd.chunk.js.map": "./static/js/4298.e6c437dd.chunk.js.map",
"2805.b4302353.chunk.js.map": "./static/js/2805.b4302353.chunk.js.map",
"3143.e6a9621d.chunk.js.map": "./static/js/3143.e6a9621d.chunk.js.map",
"428.ad58c353.chunk.js.map": "./static/js/428.ad58c353.chunk.js.map",
"1069.77bb316e.chunk.js.map": "./static/js/1069.77bb316e.chunk.js.map",
"9080.884725e7.chunk.js.map": "./static/js/9080.884725e7.chunk.js.map",
"3276.1afa9e35.chunk.js.map": "./static/js/3276.1afa9e35.chunk.js.map",
"6458.facc37ce.chunk.js.map": "./static/js/6458.facc37ce.chunk.js.map",
"7551.cc30e489.chunk.js.map": "./static/js/7551.cc30e489.chunk.js.map",
"7950.1d853b08.chunk.js.map": "./static/js/7950.1d853b08.chunk.js.map",
"290.84656bab.chunk.js.map": "./static/js/290.84656bab.chunk.js.map",
"8961.c7471e8d.chunk.js.map": "./static/js/8961.c7471e8d.chunk.js.map",
"3967.9d410653.chunk.js.map": "./static/js/3967.9d410653.chunk.js.map",
"4084.dd80c1b6.chunk.css.map": "./static/css/4084.dd80c1b6.chunk.css.map",
"4084.26bd4d80.chunk.js.map": "./static/js/4084.26bd4d80.chunk.js.map",
"8394.fa043a82.chunk.js.map": "./static/js/8394.fa043a82.chunk.js.map",
"7664.b099b462.chunk.js.map": "./static/js/7664.b099b462.chunk.js.map",
"1140.044ef809.chunk.js.map": "./static/js/1140.044ef809.chunk.js.map",
"5961.7a71f2c5.chunk.js.map": "./static/js/5961.7a71f2c5.chunk.js.map",
"2401.dcfa0659.chunk.js.map": "./static/js/2401.dcfa0659.chunk.js.map",
"7498.adcacaca.chunk.js.map": "./static/js/7498.adcacaca.chunk.js.map",
"9421.a6974f61.chunk.js.map": "./static/js/9421.a6974f61.chunk.js.map",
"5284.f9adff8d.chunk.js.map": "./static/js/5284.f9adff8d.chunk.js.map",
"5245.04e84402.chunk.js.map": "./static/js/5245.04e84402.chunk.js.map",
"6549.bc76401b.chunk.js.map": "./static/js/6549.bc76401b.chunk.js.map",
"8724.dd80c1b6.chunk.css.map": "./static/css/8724.dd80c1b6.chunk.css.map",
"8724.2fda7628.chunk.js.map": "./static/js/8724.2fda7628.chunk.js.map",
"2182.fffe1ab8.chunk.js.map": "./static/js/2182.fffe1ab8.chunk.js.map",
"7764.3b798da3.chunk.js.map": "./static/js/7764.3b798da3.chunk.js.map",
"4220.8d9a9028.chunk.js.map": "./static/js/4220.8d9a9028.chunk.js.map",
"1719.377230ee.chunk.js.map": "./static/js/1719.377230ee.chunk.js.map",
"3320.bb9509a7.chunk.js.map": "./static/js/3320.bb9509a7.chunk.js.map",
"6645.1d65ce48.chunk.js.map": "./static/js/6645.1d65ce48.chunk.js.map",
"9923.67fe770d.chunk.js.map": "./static/js/9923.67fe770d.chunk.js.map",
"9586.f3d3466d.chunk.js.map": "./static/js/9586.f3d3466d.chunk.js.map",
"9125.a86e3119.chunk.js.map": "./static/js/9125.a86e3119.chunk.js.map",
"5781.33738b7f.chunk.js.map": "./static/js/5781.33738b7f.chunk.js.map",
"7261.3f7e9a41.chunk.js.map": "./static/js/7261.3f7e9a41.chunk.js.map",
"4014.00c14ff7.chunk.js.map": "./static/js/4014.00c14ff7.chunk.js.map",
"6436.4ad7cf88.chunk.js.map": "./static/js/6436.4ad7cf88.chunk.js.map",
"8343.67a940b1.chunk.js.map": "./static/js/8343.67a940b1.chunk.js.map",
"2841.1efed130.chunk.js.map": "./static/js/2841.1efed130.chunk.js.map",
"6167.f8cae728.chunk.js.map": "./static/js/6167.f8cae728.chunk.js.map",
"7346.6d634943.chunk.js.map": "./static/js/7346.6d634943.chunk.js.map",
"5144.d191021a.chunk.js.map": "./static/js/5144.d191021a.chunk.js.map",
"5125.58c2feff.chunk.js.map": "./static/js/5125.58c2feff.chunk.js.map",
"528.d625c2f7.chunk.js.map": "./static/js/528.d625c2f7.chunk.js.map",
"7187.ac1e291b.chunk.js.map": "./static/js/7187.ac1e291b.chunk.js.map",
"6173.b9534092.chunk.js.map": "./static/js/6173.b9534092.chunk.js.map",
"953.b0d590af.chunk.js.map": "./static/js/953.b0d590af.chunk.js.map",
"9193.feaac1ba.chunk.js.map": "./static/js/9193.feaac1ba.chunk.js.map",
"7451.dabaf18f.chunk.js.map": "./static/js/7451.dabaf18f.chunk.js.map",
"9924.020057ee.chunk.js.map": "./static/js/9924.020057ee.chunk.js.map",
"9645.dd80c1b6.chunk.css.map": "./static/css/9645.dd80c1b6.chunk.css.map",
"9645.71cc858a.chunk.js.map": "./static/js/9645.71cc858a.chunk.js.map",
"4121.ccb4caf8.chunk.js.map": "./static/js/4121.ccb4caf8.chunk.js.map",
"609.356ffb9f.chunk.js.map": "./static/js/609.356ffb9f.chunk.js.map",
"3421.9f8702b9.chunk.js.map": "./static/js/3421.9f8702b9.chunk.js.map",
"2892.f87668de.chunk.js.map": "./static/js/2892.f87668de.chunk.js.map",
"7926.19dfa2c4.chunk.js.map": "./static/js/7926.19dfa2c4.chunk.js.map",
"6145.9665a7b2.chunk.js.map": "./static/js/6145.9665a7b2.chunk.js.map",
"3816.dd80c1b6.chunk.css.map": "./static/css/3816.dd80c1b6.chunk.css.map",
"3816.c0b2fb6b.chunk.js.map": "./static/js/3816.c0b2fb6b.chunk.js.map",
"2966.07cdaf2e.chunk.js.map": "./static/js/2966.07cdaf2e.chunk.js.map",
"4177.381caad6.chunk.js.map": "./static/js/4177.381caad6.chunk.js.map",
"9679.0973c488.chunk.js.map": "./static/js/9679.0973c488.chunk.js.map",
"8333.31c141d9.chunk.js.map": "./static/js/8333.31c141d9.chunk.js.map",
"1711.dfdfce0a.chunk.js.map": "./static/js/1711.dfdfce0a.chunk.js.map",
"9.6b0b3695.chunk.js.map": "./static/js/9.6b0b3695.chunk.js.map",
"4487.8cae9359.chunk.js.map": "./static/js/4487.8cae9359.chunk.js.map",
"6866.a519feef.chunk.js.map": "./static/js/6866.a519feef.chunk.js.map",
"8564.794b3bc8.chunk.js.map": "./static/js/8564.794b3bc8.chunk.js.map",
"1666.9098f0d4.chunk.js.map": "./static/js/1666.9098f0d4.chunk.js.map",
"7007.259f4b3e.chunk.js.map": "./static/js/7007.259f4b3e.chunk.js.map",
"14.25ecb28d.chunk.js.map": "./static/js/14.25ecb28d.chunk.js.map",
"3152.d03e4df4.chunk.js.map": "./static/js/3152.d03e4df4.chunk.js.map",
"2066.16320a68.chunk.js.map": "./static/js/2066.16320a68.chunk.js.map",
"5444.e8727da9.chunk.js.map": "./static/js/5444.e8727da9.chunk.js.map",
"3690.536fb187.chunk.js.map": "./static/js/3690.536fb187.chunk.js.map",
"5399.6bc650ac.chunk.js.map": "./static/js/5399.6bc650ac.chunk.js.map",
"606.28fdb5bc.chunk.js.map": "./static/js/606.28fdb5bc.chunk.js.map",
"9769.a2bfb4d7.chunk.js.map": "./static/js/9769.a2bfb4d7.chunk.js.map",
"6117.0fcd3d09.chunk.js.map": "./static/js/6117.0fcd3d09.chunk.js.map",
"8954.00599ff1.chunk.js.map": "./static/js/8954.00599ff1.chunk.js.map",
"2309.49be65c5.chunk.js.map": "./static/js/2309.49be65c5.chunk.js.map",
"7248.1e0c4e19.chunk.js.map": "./static/js/7248.1e0c4e19.chunk.js.map",
"3360.453f0701.chunk.js.map": "./static/js/3360.453f0701.chunk.js.map",
"2580.2e7b1399.chunk.js.map": "./static/js/2580.2e7b1399.chunk.js.map",
"4322.ddc888e0.chunk.js.map": "./static/js/4322.ddc888e0.chunk.js.map",
"9056.41f0e489.chunk.js.map": "./static/js/9056.41f0e489.chunk.js.map",
"4837.98af4cfe.chunk.js.map": "./static/js/4837.98af4cfe.chunk.js.map",
"3356.05b42758.chunk.js.map": "./static/js/3356.05b42758.chunk.js.map",
"3020.3b2e782c.chunk.js.map": "./static/js/3020.3b2e782c.chunk.js.map",
"195.0ba36b7b.chunk.js.map": "./static/js/195.0ba36b7b.chunk.js.map",
"8420.dc98b56b.chunk.js.map": "./static/js/8420.dc98b56b.chunk.js.map",
"728.92b72106.chunk.js.map": "./static/js/728.92b72106.chunk.js.map",
"3741.2a31713b.chunk.js.map": "./static/js/3741.2a31713b.chunk.js.map",
"849.1c67c5fb.chunk.js.map": "./static/js/849.1c67c5fb.chunk.js.map",
"2871.12124cd5.chunk.js.map": "./static/js/2871.12124cd5.chunk.js.map",
"9881.b5453ed2.chunk.js.map": "./static/js/9881.b5453ed2.chunk.js.map",
"3538.60e98cef.chunk.js.map": "./static/js/3538.60e98cef.chunk.js.map",
"619.89b9075f.chunk.js.map": "./static/js/619.89b9075f.chunk.js.map",
"3560.f86cd6a6.chunk.js.map": "./static/js/3560.f86cd6a6.chunk.js.map",
"6795.2e87544e.chunk.js.map": "./static/js/6795.2e87544e.chunk.js.map",
"7663.e9d514d1.chunk.js.map": "./static/js/7663.e9d514d1.chunk.js.map",
"3383.ab285f5a.chunk.js.map": "./static/js/3383.ab285f5a.chunk.js.map",
"5795.3d05b708.chunk.js.map": "./static/js/5795.3d05b708.chunk.js.map",
"3045.cfe6cbf4.chunk.js.map": "./static/js/3045.cfe6cbf4.chunk.js.map",
"8750.02521688.chunk.js.map": "./static/js/8750.02521688.chunk.js.map",
"2479.e8398014.chunk.js.map": "./static/js/2479.e8398014.chunk.js.map",
"6554.53f930ae.chunk.js.map": "./static/js/6554.53f930ae.chunk.js.map",
"9831.1b5a6bb6.chunk.js.map": "./static/js/9831.1b5a6bb6.chunk.js.map",
"9382.581734f3.chunk.js.map": "./static/js/9382.581734f3.chunk.js.map",
"8174.5f150ef6.chunk.js.map": "./static/js/8174.5f150ef6.chunk.js.map",
"6430.e747de7c.chunk.js.map": "./static/js/6430.e747de7c.chunk.js.map",
"4966.1e2905a6.chunk.js.map": "./static/js/4966.1e2905a6.chunk.js.map",
"825.9440e9f1.chunk.js.map": "./static/js/825.9440e9f1.chunk.js.map",
"6873.424e4aac.chunk.js.map": "./static/js/6873.424e4aac.chunk.js.map",
"2464.5dc72a90.chunk.js.map": "./static/js/2464.5dc72a90.chunk.js.map",
"1612.2e1e75b9.chunk.js.map": "./static/js/1612.2e1e75b9.chunk.js.map",
"7520.087167a1.chunk.js.map": "./static/js/7520.087167a1.chunk.js.map"
"main.90d417ae.css.map": "./static/css/main.90d417ae.css.map",
"main.a8ff5ae1.js.map": "./static/js/main.a8ff5ae1.js.map",
"2483.363201d7.chunk.js.map": "./static/js/2483.363201d7.chunk.js.map",
"6914.b2d1846a.chunk.js.map": "./static/js/6914.b2d1846a.chunk.js.map",
"8904.9f5a3be3.chunk.js.map": "./static/js/8904.9f5a3be3.chunk.js.map",
"1829.99ee609f.chunk.js.map": "./static/js/1829.99ee609f.chunk.js.map",
"6041.0bf546c3.chunk.js.map": "./static/js/6041.0bf546c3.chunk.js.map",
"5088.0395aa79.chunk.js.map": "./static/js/5088.0395aa79.chunk.js.map",
"5140.92c7c01a.chunk.js.map": "./static/js/5140.92c7c01a.chunk.js.map",
"2434.d3149513.chunk.js.map": "./static/js/2434.d3149513.chunk.js.map",
"3176.2549e498.chunk.js.map": "./static/js/3176.2549e498.chunk.js.map",
"6137.8b758e88.chunk.js.map": "./static/js/6137.8b758e88.chunk.js.map",
"7045.9d14424c.chunk.js.map": "./static/js/7045.9d14424c.chunk.js.map",
"9635.c5a87859.chunk.js.map": "./static/js/9635.c5a87859.chunk.js.map",
"2338.3c79a135.chunk.js.map": "./static/js/2338.3c79a135.chunk.js.map",
"4335.daa02fff.chunk.js.map": "./static/js/4335.daa02fff.chunk.js.map",
"6144.56aa9aa1.chunk.js.map": "./static/js/6144.56aa9aa1.chunk.js.map",
"6763.d86879b4.chunk.js.map": "./static/js/6763.d86879b4.chunk.js.map",
"3543.7f1f5dd1.chunk.js.map": "./static/js/3543.7f1f5dd1.chunk.js.map",
"4061.72744aa0.chunk.js.map": "./static/js/4061.72744aa0.chunk.js.map",
"2249.802fef70.chunk.js.map": "./static/js/2249.802fef70.chunk.js.map",
"9611.48e395c5.chunk.js.map": "./static/js/9611.48e395c5.chunk.js.map",
"2637.eb53ade1.chunk.js.map": "./static/js/2637.eb53ade1.chunk.js.map",
"380.f0806840.chunk.css.map": "./static/css/380.f0806840.chunk.css.map",
"380.1e66f7fb.chunk.js.map": "./static/js/380.1e66f7fb.chunk.js.map",
"5926.6eebc955.chunk.js.map": "./static/js/5926.6eebc955.chunk.js.map",
"701.cf1bff16.chunk.js.map": "./static/js/701.cf1bff16.chunk.js.map",
"7821.4a20efe4.chunk.js.map": "./static/js/7821.4a20efe4.chunk.js.map",
"2625.f0c422fd.chunk.js.map": "./static/js/2625.f0c422fd.chunk.js.map",
"9033.f0806840.chunk.css.map": "./static/css/9033.f0806840.chunk.css.map",
"9033.c2cdc267.chunk.js.map": "./static/js/9033.c2cdc267.chunk.js.map",
"9299.f0806840.chunk.css.map": "./static/css/9299.f0806840.chunk.css.map",
"9299.35956104.chunk.js.map": "./static/js/9299.35956104.chunk.js.map",
"191.80e5a168.chunk.js.map": "./static/js/191.80e5a168.chunk.js.map",
"7585.61ec1ad6.chunk.js.map": "./static/js/7585.61ec1ad6.chunk.js.map",
"1836.ea648525.chunk.js.map": "./static/js/1836.ea648525.chunk.js.map",
"4653.c79dfc48.chunk.js.map": "./static/js/4653.c79dfc48.chunk.js.map",
"4394.dfbbe2b6.chunk.js.map": "./static/js/4394.dfbbe2b6.chunk.js.map",
"4781.f665cf2a.chunk.js.map": "./static/js/4781.f665cf2a.chunk.js.map",
"9478.a31d099b.chunk.js.map": "./static/js/9478.a31d099b.chunk.js.map",
"7164.a370b455.chunk.js.map": "./static/js/7164.a370b455.chunk.js.map",
"4414.5634e172.chunk.js.map": "./static/js/4414.5634e172.chunk.js.map",
"7798.e077fd71.chunk.js.map": "./static/js/7798.e077fd71.chunk.js.map",
"8833.0aa6aed9.chunk.js.map": "./static/js/8833.0aa6aed9.chunk.js.map",
"471.13d4a140.chunk.js.map": "./static/js/471.13d4a140.chunk.js.map",
"483.dae2ef37.chunk.js.map": "./static/js/483.dae2ef37.chunk.js.map",
"9467.24a0eb41.chunk.js.map": "./static/js/9467.24a0eb41.chunk.js.map",
"6895.4e94ef43.chunk.js.map": "./static/js/6895.4e94ef43.chunk.js.map",
"6233.7866b56a.chunk.js.map": "./static/js/6233.7866b56a.chunk.js.map",
"5588.2bee425e.chunk.js.map": "./static/js/5588.2bee425e.chunk.js.map",
"4874.96b74c82.chunk.js.map": "./static/js/4874.96b74c82.chunk.js.map",
"1955.f0806840.chunk.css.map": "./static/css/1955.f0806840.chunk.css.map",
"1955.54bd6485.chunk.js.map": "./static/js/1955.54bd6485.chunk.js.map",
"2653.98b78190.chunk.js.map": "./static/js/2653.98b78190.chunk.js.map",
"3956.cee5c63f.chunk.js.map": "./static/js/3956.cee5c63f.chunk.js.map",
"7015.86fd97fc.chunk.js.map": "./static/js/7015.86fd97fc.chunk.js.map",
"7524.cf07d407.chunk.js.map": "./static/js/7524.cf07d407.chunk.js.map",
"8771.db2b98f1.chunk.js.map": "./static/js/8771.db2b98f1.chunk.js.map",
"9076.6bfd772c.chunk.js.map": "./static/js/9076.6bfd772c.chunk.js.map",
"9221.fd62ef6f.chunk.js.map": "./static/js/9221.fd62ef6f.chunk.js.map",
"8896.7e43f413.chunk.js.map": "./static/js/8896.7e43f413.chunk.js.map",
"7413.e1d784e8.chunk.js.map": "./static/js/7413.e1d784e8.chunk.js.map",
"9134.8cc50bc9.chunk.js.map": "./static/js/9134.8cc50bc9.chunk.js.map",
"8138.f0806840.chunk.css.map": "./static/css/8138.f0806840.chunk.css.map",
"8138.d72851b8.chunk.js.map": "./static/js/8138.d72851b8.chunk.js.map",
"8183.967577a6.chunk.js.map": "./static/js/8183.967577a6.chunk.js.map",
"9145.6a82a8e7.chunk.js.map": "./static/js/9145.6a82a8e7.chunk.js.map",
"9537.177d91d7.chunk.js.map": "./static/js/9537.177d91d7.chunk.js.map",
"7331.a4fdab74.chunk.js.map": "./static/js/7331.a4fdab74.chunk.js.map",
"9605.b37fdfef.chunk.js.map": "./static/js/9605.b37fdfef.chunk.js.map",
"426.fc1a9166.chunk.js.map": "./static/js/426.fc1a9166.chunk.js.map",
"2878.aa37c6f9.chunk.js.map": "./static/js/2878.aa37c6f9.chunk.js.map",
"8495.b664f242.chunk.js.map": "./static/js/8495.b664f242.chunk.js.map",
"4934.8bb784c0.chunk.js.map": "./static/js/4934.8bb784c0.chunk.js.map",
"3518.c30eac83.chunk.js.map": "./static/js/3518.c30eac83.chunk.js.map",
"2684.9b1b9065.chunk.js.map": "./static/js/2684.9b1b9065.chunk.js.map",
"6683.0395331a.chunk.js.map": "./static/js/6683.0395331a.chunk.js.map",
"9032.aada8549.chunk.js.map": "./static/js/9032.aada8549.chunk.js.map",
"2676.977e5329.chunk.js.map": "./static/js/2676.977e5329.chunk.js.map",
"9449.877702b7.chunk.js.map": "./static/js/9449.877702b7.chunk.js.map",
"7659.cdd8e088.chunk.js.map": "./static/js/7659.cdd8e088.chunk.js.map",
"9968.4ba3dc08.chunk.js.map": "./static/js/9968.4ba3dc08.chunk.js.map",
"2180.5910a383.chunk.js.map": "./static/js/2180.5910a383.chunk.js.map",
"8253.a8e8b608.chunk.js.map": "./static/js/8253.a8e8b608.chunk.js.map",
"3328.8f4d30e6.chunk.js.map": "./static/js/3328.8f4d30e6.chunk.js.map",
"1440.735f3ff6.chunk.js.map": "./static/js/1440.735f3ff6.chunk.js.map",
"9002.0d569a45.chunk.js.map": "./static/js/9002.0d569a45.chunk.js.map",
"2114.ac47a792.chunk.js.map": "./static/js/2114.ac47a792.chunk.js.map",
"711.4196799c.chunk.js.map": "./static/js/711.4196799c.chunk.js.map",
"6901.0ba9ddfc.chunk.js.map": "./static/js/6901.0ba9ddfc.chunk.js.map",
"3678.5bd48bc8.chunk.js.map": "./static/js/3678.5bd48bc8.chunk.js.map",
"3320.f0806840.chunk.css.map": "./static/css/3320.f0806840.chunk.css.map",
"3320.5e846f8f.chunk.js.map": "./static/js/3320.5e846f8f.chunk.js.map",
"312.f4ca2352.chunk.js.map": "./static/js/312.f4ca2352.chunk.js.map",
"2112.afb8bcb6.chunk.js.map": "./static/js/2112.afb8bcb6.chunk.js.map",
"4619.ed29e211.chunk.js.map": "./static/js/4619.ed29e211.chunk.js.map",
"8990.56ac79e0.chunk.js.map": "./static/js/8990.56ac79e0.chunk.js.map",
"8455.b557f9ba.chunk.js.map": "./static/js/8455.b557f9ba.chunk.js.map",
"3631.f0806840.chunk.css.map": "./static/css/3631.f0806840.chunk.css.map",
"3631.23cb1b6a.chunk.js.map": "./static/js/3631.23cb1b6a.chunk.js.map",
"1604.69a0fc07.chunk.js.map": "./static/js/1604.69a0fc07.chunk.js.map",
"8391.484f375b.chunk.js.map": "./static/js/8391.484f375b.chunk.js.map",
"402.5425871a.chunk.js.map": "./static/js/402.5425871a.chunk.js.map",
"1705.0e30ff48.chunk.js.map": "./static/js/1705.0e30ff48.chunk.js.map",
"1581.2ff273b8.chunk.js.map": "./static/js/1581.2ff273b8.chunk.js.map",
"455.0ac20914.chunk.js.map": "./static/js/455.0ac20914.chunk.js.map",
"2661.3c5e0aa7.chunk.js.map": "./static/js/2661.3c5e0aa7.chunk.js.map",
"889.4805d401.chunk.js.map": "./static/js/889.4805d401.chunk.js.map",
"9088.4ee624ae.chunk.js.map": "./static/js/9088.4ee624ae.chunk.js.map",
"247.3b7c3d22.chunk.js.map": "./static/js/247.3b7c3d22.chunk.js.map",
"2763.da16b11a.chunk.js.map": "./static/js/2763.da16b11a.chunk.js.map",
"3772.8f7b248e.chunk.js.map": "./static/js/3772.8f7b248e.chunk.js.map",
"5171.dc54a6db.chunk.js.map": "./static/js/5171.dc54a6db.chunk.js.map",
"2442.c325186c.chunk.js.map": "./static/js/2442.c325186c.chunk.js.map",
"2426.bc0cfae1.chunk.js.map": "./static/js/2426.bc0cfae1.chunk.js.map",
"1520.97c97f2b.chunk.js.map": "./static/js/1520.97c97f2b.chunk.js.map",
"5561.ce85ef49.chunk.js.map": "./static/js/5561.ce85ef49.chunk.js.map",
"5609.97aa92cf.chunk.js.map": "./static/js/5609.97aa92cf.chunk.js.map",
"3801.a06455a2.chunk.js.map": "./static/js/3801.a06455a2.chunk.js.map",
"6431.5f2e5e6e.chunk.js.map": "./static/js/6431.5f2e5e6e.chunk.js.map",
"1918.ce3ab2e2.chunk.js.map": "./static/js/1918.ce3ab2e2.chunk.js.map",
"7757.3650a6cc.chunk.js.map": "./static/js/7757.3650a6cc.chunk.js.map",
"8760.e06a6adc.chunk.js.map": "./static/js/8760.e06a6adc.chunk.js.map",
"8810.c4bd6fe9.chunk.js.map": "./static/js/8810.c4bd6fe9.chunk.js.map",
"1401.98c1da5a.chunk.js.map": "./static/js/1401.98c1da5a.chunk.js.map",
"6523.f3c7724a.chunk.js.map": "./static/js/6523.f3c7724a.chunk.js.map",
"8354.e837d480.chunk.js.map": "./static/js/8354.e837d480.chunk.js.map",
"5221.b26ebb60.chunk.js.map": "./static/js/5221.b26ebb60.chunk.js.map",
"6172.dd44d76e.chunk.js.map": "./static/js/6172.dd44d76e.chunk.js.map",
"532.19dd5663.chunk.js.map": "./static/js/532.19dd5663.chunk.js.map",
"592.ec821e13.chunk.js.map": "./static/js/592.ec821e13.chunk.js.map",
"2076.e7bf07b8.chunk.js.map": "./static/js/2076.e7bf07b8.chunk.js.map",
"1326.d157bb06.chunk.js.map": "./static/js/1326.d157bb06.chunk.js.map",
"7142.957288ed.chunk.js.map": "./static/js/7142.957288ed.chunk.js.map",
"7931.9fe0101a.chunk.js.map": "./static/js/7931.9fe0101a.chunk.js.map",
"9362.63d03757.chunk.js.map": "./static/js/9362.63d03757.chunk.js.map",
"2879.69834509.chunk.js.map": "./static/js/2879.69834509.chunk.js.map",
"3096.31031f0d.chunk.js.map": "./static/js/3096.31031f0d.chunk.js.map",
"9729.2ed96524.chunk.js.map": "./static/js/9729.2ed96524.chunk.js.map",
"2983.3a39dc73.chunk.js.map": "./static/js/2983.3a39dc73.chunk.js.map",
"770.f6360bf6.chunk.js.map": "./static/js/770.f6360bf6.chunk.js.map",
"5662.d8af2856.chunk.js.map": "./static/js/5662.d8af2856.chunk.js.map",
"5165.311fbd50.chunk.js.map": "./static/js/5165.311fbd50.chunk.js.map",
"9086.b84a9135.chunk.js.map": "./static/js/9086.b84a9135.chunk.js.map",
"1687.63ed48b6.chunk.js.map": "./static/js/1687.63ed48b6.chunk.js.map"
},
"entrypoints": [
"static/css/main.c4c1effe.css",
"static/js/main.356b7ece.js"
"static/css/main.90d417ae.css",
"static/js/main.a8ff5ae1.js"
]
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 648 KiB

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="/"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="#081C42" media="(prefers-color-scheme: light)" name="theme-color"/><meta content="#081C42" media="(prefers-color-scheme: dark)" name="theme-color"/><meta content="MinIO Console" name="description"/><link href="./styles/root-styles.css" rel="stylesheet"/><link href="./apple-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/><link href="./favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="./favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="./favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="./manifest.json" rel="manifest"/><link color="#3a4e54" href="./safari-pinned-tab.svg" rel="mask-icon"/><title>MinIO Console</title><script defer="defer" src="./static/js/main.356b7ece.js"></script><link href="./static/css/main.c4c1effe.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"><div id="loader-block"><svg class="loader-svg-container" viewBox="22 22 44 44"><circle class="loader-style MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate" cx="44" cy="44" fill="none" r="20.2" stroke-width="3.6"></circle></svg></div></div></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="/"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="#081C42" media="(prefers-color-scheme: light)" name="theme-color"/><meta content="#081C42" media="(prefers-color-scheme: dark)" name="theme-color"/><meta content="MinIO Console" name="description"/><link href="./styles/root-styles.css" rel="stylesheet"/><link href="./apple-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/><link href="./favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="./favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="./favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="./manifest.json" rel="manifest"/><link color="#3a4e54" href="./safari-pinned-tab.svg" rel="mask-icon"/><title>MinIO Console</title><script defer="defer" src="./static/js/main.a8ff5ae1.js"></script><link href="./static/css/main.90d417ae.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"><div id="preload"><img src="./images/background.svg"/> <img src="./images/background-wave-orig2.svg"/></div><div id="loader-block"><img src="./Loader.svg"/></div></div></body></html>

View File

@@ -1,2 +1,2 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=4084.dd80c1b6.chunk.css.map*/
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=1955.f0806840.chunk.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"static/css/3816.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"static/css/1955.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +1,2 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=5822.dd80c1b6.chunk.css.map*/
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=3320.f0806840.chunk.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"static/css/4084.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"static/css/3320.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +1,2 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=8724.dd80c1b6.chunk.css.map*/
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=3631.f0806840.chunk.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"static/css/5822.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"static/css/3631.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +1,2 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=964.dd80c1b6.chunk.css.map*/
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=380.f0806840.chunk.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"static/css/964.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"static/css/380.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +1,2 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=3816.dd80c1b6.chunk.css.map*/
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=8138.f0806840.chunk.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"static/css/8724.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"static/css/8138.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,2 @@
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=9033.f0806840.chunk.css.map*/

View File

@@ -0,0 +1 @@
{"version":3,"file":"static/css/9033.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,2 @@
.cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=9299.f0806840.chunk.css.map*/

View File

@@ -0,0 +1 @@
{"version":3,"file":"static/css/9299.f0806840.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=9645.dd80c1b6.chunk.css.map*/

View File

@@ -1 +0,0 @@
{"version":3,"file":"static/css/9645.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;border:none;color:#f8f8f2!important}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{color:#fff!important;text-decoration:underline}
/*# sourceMappingURL=9807.dd80c1b6.chunk.css.map*/

View File

@@ -1 +0,0 @@
{"version":3,"file":"static/css/9807.dd80c1b6.chunk.css","mappings":"AAUA,2DACE,kCAAoC,CAEpC,WAAY,CADZ,uBAEF,CACA,kCAAoC,aAAgB,CACpD,iCAAmC,8BAAiC,CACpE,qCAAuC,aAAgB,CACvD,mCAAqC,6BAAuC,CAC5E,6IAAuJ,6BAAuC,CAC9L,4JAAsK,6BAAuC,CAC7M,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAC/E,6BAA+B,aAAgB,CAC/C,+BAAiC,aAAgB,CACjD,iCAAmC,UAAc,CACjD,0BAA4B,aAAgB,CAE5C,6DAAgC,aAAgB,CAChD,2BAA6B,aAAgB,CAC7C,2BAA6B,aAAgB,CAC7C,0BAA4B,aAAgB,CAE5C,gEAAkC,aAAgB,CAClD,+BAAiC,aAAgB,CACjD,8BAAgC,aAAgB,CAChD,4DAA+D,aAAgB,CAE/E,gDAAkD,6BAAmC,CACrF,0CAAwE,oBAAuB,CAAnD,yBAAqD","sources":["../node_modules/codemirror/theme/dracula.css"],"sourcesContent":["/*\n\n Name: dracula\n Author: Michael Kaminsky (http://github.com/mkaminsky11)\n\n Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n background-color: #282a36 !important;\n color: #f8f8f2 !important;\n border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"],"names":[],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkportal_ui=self.webpackChunkportal_ui||[]).push([[1140],{39080:function(e,n,t){t.r(n),t.d(n,{default:function(){return Z}});var i=t(18489),r=t(35531),a=t(50390),s=t(38342),l=t.n(s),o=t(86509),c=t(4285),d=t(66946),u=t(51002),m=t(25594),h=t(58217),p=t(65771),x=t(70758),y=t(33034),g=t.n(y),f=t(86362),v=t(72462),j=t(62559),b=(0,c.Z)((function(e){return(0,o.Z)({container:{display:"flex",flexFlow:"column",padding:"20px 0 8px 0"},inputWithCopy:{"& .MuiInputBase-root ":{width:"100%",background:"#FBFAFA","& .MuiInputBase-input":{height:".8rem"},"& .MuiInputAdornment-positionEnd":{marginRight:".5rem","& .MuiButtonBase-root":{height:"2rem"}}},"& .MuiButtonBase-root .min-icon":{width:".8rem",height:".8rem"}},inputLabel:(0,i.Z)((0,i.Z)({},v.YI.inputLabel),{},{fontSize:".8rem"})})}))((function(e){var n=e.label,t=void 0===n?"":n,i=e.value,r=void 0===i?"":i,a=e.classes,s=void 0===a?{}:a;return(0,j.jsxs)("div",{className:s.container,children:[(0,j.jsxs)("div",{className:s.inputLabel,children:[t,":"]}),(0,j.jsx)("div",{className:s.inputWithCopy,children:(0,j.jsx)(h.Z,{value:r,readOnly:!0,endAdornment:(0,j.jsx)(p.Z,{position:"end",children:(0,j.jsx)(g(),{text:r,children:(0,j.jsx)(x.Z,{"aria-label":"copy",tooltip:"Copy",onClick:function(){},onMouseDown:function(){},edge:"end",children:(0,j.jsx)(f.TI,{})})})})})})]})})),w=t(47424),Z=(0,c.Z)((function(e){return(0,o.Z)({warningBlock:{color:"red",fontSize:".85rem",margin:".5rem 0 .5rem 0",display:"flex",alignItems:"center","& svg ":{marginRight:".3rem",height:16,width:16}},credentialTitle:{padding:".8rem 0 0 0",fontWeight:600,fontSize:".9rem"},buttonContainer:{textAlign:"right",marginTop:"1rem"},credentialsPanel:{overflowY:"auto",maxHeight:350},promptTitle:{display:"flex",alignItems:"center"},buttonSpacer:{marginRight:".9rem"},promptIcon:{marginRight:".1rem",display:"flex",alignItems:"center",height:"2rem",width:"2rem"}})}))((function(e){var n=e.classes,t=e.newServiceAccount,s=e.open,o=e.closeModal,c=e.entity;if(!t)return null;var h=l()(t,"console",null),p=l()(t,"idp",!1);return(0,j.jsx)(u.Z,{modalOpen:s,onClose:function(){o()},title:(0,j.jsx)("div",{className:n.promptTitle,children:(0,j.jsxs)("div",{children:["New ",c," Created"]})}),titleIcon:(0,j.jsx)(f.tV,{}),children:(0,j.jsxs)(m.ZP,{container:!0,children:[(0,j.jsxs)(m.ZP,{item:!0,xs:12,className:n.formScrollable,children:["A new ",c," has been created with the following details:",!p&&h&&(0,j.jsx)(a.Fragment,{children:(0,j.jsxs)(m.ZP,{item:!0,xs:12,className:n.credentialsPanel,children:[(0,j.jsx)("div",{className:n.credentialTitle,children:"Console Credentials"}),Array.isArray(h)&&h.map((function(e,n){return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(b,{label:"Access Key",value:e.accessKey}),(0,j.jsx)(b,{label:"Secret Key",value:e.secretKey})]})})),!Array.isArray(h)&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(b,{label:"Access Key",value:h.accessKey}),(0,j.jsx)(b,{label:"Secret Key",value:h.secretKey})]})]})}),p?(0,j.jsx)("div",{className:n.warningBlock,children:"Please Login via the configured external identity provider."}):(0,j.jsxs)("div",{className:n.warningBlock,children:[(0,j.jsx)(w.Z,{}),(0,j.jsx)("span",{children:"Write these down, as this is the only time the secret will be displayed."})]})]}),(0,j.jsxs)(m.ZP,{item:!0,xs:12,className:n.buttonContainer,children:[(0,j.jsx)(d.Z,{id:"done-button",variant:"outlined",className:n.buttonSpacer,onClick:function(){o()},color:"primary",children:"Done"}),!p&&(0,j.jsx)(d.Z,{id:"download-button",onClick:function(){var e={};if(h)if(Array.isArray(h)){var n=h.map((function(e){return{url:e.url,access_key:e.accessKey,secret_key:e.secretKey,api:"s3v4",path:"auto"}}));e={console:(0,r.Z)(n)}}else e={console:[{url:h.url,access_key:h.accessKey,secret_key:h.secretKey,api:"s3v4",path:"auto"}]};!function(e,n){var t=document.createElement("a");t.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(n)),t.setAttribute("download",e),t.style.display="none",document.body.appendChild(t),t.click(),document.body.removeChild(t)}("credentials.json",JSON.stringify((0,i.Z)({},e)))},endIcon:(0,j.jsx)(f._8,{}),variant:"contained",color:"primary",children:"Download"})]})]})})}))}}]);
//# sourceMappingURL=1140.044ef809.chunk.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkportal_ui=self.webpackChunkportal_ui||[]).push([[1237],{37882:function(n,e,r){var o=r(18489),t=r(50390),i=r(62559);e.Z=function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;function r(r){return(0,i.jsx)(t.Suspense,{fallback:e,children:(0,i.jsx)(n,(0,o.Z)({},r))})}return r}},25534:function(n,e,r){var o=r(18489),t=(r(50390),r(25594)),i=r(86509),a=r(4285),c=r(72462),l=r(62559);e.Z=(0,a.Z)((function(n){return(0,i.Z)((0,o.Z)({},c.Bw))}))((function(n){var e=n.classes,r=n.className,o=void 0===r?"":r,i=n.children;return(0,l.jsx)("div",{className:e.contentSpacer,children:(0,l.jsx)(t.ZP,{container:!0,children:(0,l.jsx)(t.ZP,{item:!0,xs:12,className:o,children:i})})})}))},31237:function(n,e,r){r.r(e);var o=r(50390),t=r(24442),i=r(70971),a=r(34424),c=r(44149),l=r(36176),u=r(37882),s=r(49495),d=r(62559),f=(0,u.Z)(o.lazy((function(){return Promise.all([r.e(14),r.e(3152),r.e(2066),r.e(3690),r.e(5399),r.e(8174),r.e(3967)]).then(r.bind(r,63967))}))),p=(0,u.Z)(o.lazy((function(){return Promise.all([r.e(14),r.e(3152),r.e(2066),r.e(3690),r.e(5399),r.e(6117),r.e(8954),r.e(8174),r.e(4084)]).then(r.bind(r,5604))}))),m=(0,a.$j)((function(n){return{open:n.system.sidebarOpen}}),{setMenuOpen:c.gG});e.default=(0,i.EN)(m((function(){return(0,d.jsx)(i.F0,{history:t.Z,children:(0,d.jsxs)(i.rs,{children:[(0,d.jsx)(i.AW,{path:s.gA.POLICIES,exact:!0,component:f}),(0,d.jsx)(i.AW,{path:"".concat(s.gA.POLICIES,"/*"),component:p}),(0,d.jsx)(i.AW,{path:"/",component:f}),(0,d.jsx)(i.AW,{component:l.Z})]})})})))},36176:function(n,e,r){r.d(e,{Z:function(){return u}});r(50390);var o=r(56805),t=r(35477),i=r(10567),a=r(62559);function c(){return(0,a.jsxs)(t.Z,{variant:"body2",color:"textSecondary",align:"center",children:["Copyright \xa9 ",(0,a.jsx)(i.Z,{color:"inherit",href:"https://min.io/?ref=con",children:"MinIO"})," ",(new Date).getFullYear(),"."]})}var l=r(25534),u=function(){return(0,a.jsx)(l.Z,{children:(0,a.jsxs)(o.Z,{sx:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",textAlign:"center",margin:"auto",flexFlow:"column"},children:[(0,a.jsx)(o.Z,{sx:{fontSize:"110%",margin:"0 0 0.25rem",color:"#909090"},children:"404 Error"}),(0,a.jsx)(o.Z,{sx:{fontStyle:"normal",fontSize:"clamp(2rem,calc(2rem + 1.2vw),3rem)",fontWeight:700},children:"Sorry, the page could not be found."}),(0,a.jsx)(o.Z,{mt:5,children:(0,a.jsx)(c,{})})]})})}},10567:function(n,e,r){r.d(e,{Z:function(){return k}});var o=r(23430),t=r(36222),i=r(1048),a=r(32793),c=r(50390),l=r(44977),u=r(50076),s=r(29001),d=r(36128),f=r(91442),p=r(8208),m=r(15573),h=r(42081),x=r(3299),Z=r(35477),v=r(10594);function y(n){return(0,v.Z)("MuiLink",n)}var b=(0,r(43349).Z)("MuiLink",["root","underlineNone","underlineHover","underlineAlways","button","focusVisible"]),g=r(62559),j=["className","color","component","onBlur","onFocus","TypographyClasses","underline","variant"],S={primary:"primary.main",textPrimary:"text.primary",secondary:"secondary.main",textSecondary:"text.secondary",error:"error.main"},w=(0,p.ZP)(Z.Z,{name:"MuiLink",slot:"Root",overridesResolver:function(n,e){var r=n.ownerState;return[e.root,e["underline".concat((0,f.Z)(r.underline))],"button"===r.component&&e.button]}})((function(n){var e=n.theme,r=n.ownerState,o=(0,s.D)(e,"palette.".concat(function(n){return S[n]||n}(r.color)))||r.color;return(0,a.Z)({},"none"===r.underline&&{textDecoration:"none"},"hover"===r.underline&&{textDecoration:"none","&:hover":{textDecoration:"underline"}},"always"===r.underline&&{textDecoration:"underline",textDecorationColor:"inherit"!==o?(0,d.Fq)(o,.4):void 0,"&:hover":{textDecorationColor:"inherit"}},"button"===r.component&&(0,t.Z)({position:"relative",WebkitTapHighlightColor:"transparent",backgroundColor:"transparent",outline:0,border:0,margin:0,borderRadius:0,padding:0,cursor:"pointer",userSelect:"none",verticalAlign:"middle",MozAppearance:"none",WebkitAppearance:"none","&::-moz-focus-inner":{borderStyle:"none"}},"&.".concat(b.focusVisible),{outline:"auto"}))})),k=c.forwardRef((function(n,e){var r=(0,m.Z)({props:n,name:"MuiLink"}),t=r.className,s=r.color,d=void 0===s?"primary":s,p=r.component,Z=void 0===p?"a":p,v=r.onBlur,b=r.onFocus,S=r.TypographyClasses,k=r.underline,C=void 0===k?"always":k,A=r.variant,F=void 0===A?"inherit":A,D=(0,i.Z)(r,j),N=(0,h.Z)(),P=N.isFocusVisibleRef,M=N.onBlur,W=N.onFocus,z=N.ref,I=c.useState(!1),L=(0,o.Z)(I,2),V=L[0],B=L[1],O=(0,x.Z)(e,z),R=(0,a.Z)({},r,{color:d,component:Z,focusVisible:V,underline:C,variant:F}),E=function(n){var e=n.classes,r=n.component,o=n.focusVisible,t=n.underline,i={root:["root","underline".concat((0,f.Z)(t)),"button"===r&&"button",o&&"focusVisible"]};return(0,u.Z)(i,y,e)}(R);return(0,g.jsx)(w,(0,a.Z)({className:(0,l.Z)(E.root,t),classes:S,color:d,component:Z,onBlur:function(n){M(n),!1===P.current&&B(!1),v&&v(n)},onFocus:function(n){W(n),!0===P.current&&B(!0),b&&b(n)},ref:O,ownerState:R,variant:F},D))}))}}]);
//# sourceMappingURL=1237.b46ec019.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkportal_ui=self.webpackChunkportal_ui||[]).push([[1581],{1581:function(e,a,t){t.r(a);var n=t(70885),s=t(1413),o=t(72791),i=t(60364),l=t(36151),c=t(40986),r=t(11135),d=t(25787),u=t(61889),m=t(45248),f=t(42649),h=t(23814),Z=t(37516),x=t(21435),p=t(56028),j=t(81207),g=t(74833),k=t(56578),v=t(80184),b=(0,i.$j)(null,{setModalErrorSnackMessage:f.zb});a.default=(0,d.Z)((function(e){return(0,r.Z)((0,s.Z)((0,s.Z)({},h.DF),h.ID))}))(b((function(e){var a=e.classes,t=e.open,s=e.enabled,i=e.cfg,r=e.selectedBucket,d=e.closeModalAndRefresh,f=e.setModalErrorSnackMessage,h=(0,o.useState)(!1),b=(0,n.Z)(h,2),M=b[0],S=b[1],C=(0,o.useState)(!1),q=(0,n.Z)(C,2),N=q[0],B=q[1],P=(0,o.useState)("1"),y=(0,n.Z)(P,2),w=y[0],E=y[1],_=(0,o.useState)("TiB"),z=(0,n.Z)(_,2),D=z[0],F=z[1];(0,o.useEffect)((function(){if(s&&(B(!0),i)){E("".concat(i.quota)),F("Gi");for(var e="B",a=i.quota,t=0;t<m.Dl.length&&i.quota%Math.pow(1024,t)===0;t++)a=i.quota/Math.pow(1024,t),e=m.Dl[t];E("".concat(a)),F(e)}}),[s,i]);return(0,v.jsx)(p.Z,{modalOpen:t,onClose:function(){d()},title:"Enable Bucket Quota",titleIcon:(0,v.jsx)(g.Wq,{}),children:(0,v.jsx)("form",{noValidate:!0,autoComplete:"off",onSubmit:function(e){e.preventDefault(),function(){if(!M){var e={enabled:N,amount:parseInt((0,m.Pw)(w,D,!0)),quota_type:"hard"};j.Z.invoke("PUT","/api/v1/buckets/".concat(r,"/quota"),e).then((function(){S(!1),d()})).catch((function(e){S(!1),f(e)}))}}()},children:(0,v.jsxs)(u.ZP,{container:!0,children:[(0,v.jsxs)(u.ZP,{item:!0,xs:12,className:a.formScrollable,children:[(0,v.jsx)(u.ZP,{item:!0,xs:12,className:a.formFieldRow,children:(0,v.jsx)(Z.Z,{value:"bucket_quota",id:"bucket_quota",name:"bucket_quota",checked:N,onChange:function(e){B(e.target.checked)},label:"Enabled"})}),N&&(0,v.jsx)(o.Fragment,{children:(0,v.jsx)(u.ZP,{item:!0,xs:12,className:a.formFieldRow,children:(0,v.jsx)(u.ZP,{container:!0,children:(0,v.jsx)(u.ZP,{item:!0,xs:12,children:(0,v.jsx)(x.Z,{id:"quota_size",name:"quota_size",onChange:function(e){e.target.validity.valid&&E(e.target.value)},pattern:"[0-9]*",label:"Quota",value:w,required:!0,min:"1",overlayObject:(0,v.jsx)(k.Z,{id:"quota_unit",onUnitChange:function(e){F(e)},unitSelected:D,unitsList:(0,m.zQ)(["Ki"]),disabled:!1})})})})})})]}),(0,v.jsxs)(u.ZP,{item:!0,xs:12,className:a.modalButtonBar,children:[(0,v.jsx)(l.Z,{type:"button",variant:"outlined",color:"primary",disabled:M,onClick:function(){d()},children:"Cancel"}),(0,v.jsx)(l.Z,{type:"submit",variant:"contained",color:"primary",disabled:M,children:"Save"})]}),M&&(0,v.jsx)(u.ZP,{item:!0,xs:12,children:(0,v.jsx)(c.Z,{})})]})})})})))},56028:function(e,a,t){var n=t(70885),s=t(1413),o=t(72791),i=t(60364),l=t(13400),c=t(55646),r=t(5574),d=t(65661),u=t(39157),m=t(11135),f=t(25787),h=t(23814),Z=t(42649),x=t(29823),p=t(28057),j=t(80184),g=(0,i.$j)((function(e){return{modalSnackMessage:e.system.modalSnackBar}}),{setModalSnackMessage:Z.MK});a.Z=(0,f.Z)((function(e){return(0,m.Z)((0,s.Z)((0,s.Z)({},h.Qw),{},{content:{padding:25,paddingBottom:0},customDialogSize:{width:"100%",maxWidth:765}},h.sN))}))(g((function(e){var a=e.onClose,t=e.modalOpen,i=e.title,m=e.children,f=e.classes,h=e.wideLimit,Z=void 0===h||h,g=e.modalSnackMessage,k=e.noContentPadding,v=e.setModalSnackMessage,b=e.titleIcon,M=void 0===b?null:b,S=(0,o.useState)(!1),C=(0,n.Z)(S,2),q=C[0],N=C[1];(0,o.useEffect)((function(){v("")}),[v]),(0,o.useEffect)((function(){if(g){if(""===g.message)return void N(!1);"error"!==g.type&&N(!0)}}),[g]);var B=Z?{classes:{paper:f.customDialogSize}}:{maxWidth:"lg",fullWidth:!0},P="";return g&&(P=g.detailedErrorMsg,(""===g.detailedErrorMsg||g.detailedErrorMsg.length<5)&&(P=g.message)),(0,j.jsxs)(r.Z,(0,s.Z)((0,s.Z)({open:t,classes:f},B),{},{scroll:"paper",onClose:function(e,t){"backdropClick"!==t&&a()},className:f.root,children:[(0,j.jsxs)(d.Z,{className:f.title,children:[(0,j.jsxs)("div",{className:f.titleText,children:[M," ",i]}),(0,j.jsx)("div",{className:f.closeContainer,children:(0,j.jsx)(l.Z,{"aria-label":"close",id:"close",className:f.closeButton,onClick:a,disableRipple:!0,size:"small",children:(0,j.jsx)(x.Z,{})})})]}),(0,j.jsx)(p.Z,{isModal:!0}),(0,j.jsx)(c.Z,{open:q,className:f.snackBarModal,onClose:function(){N(!1),v("")},message:P,ContentProps:{className:"".concat(f.snackBar," ").concat(g&&"error"===g.type?f.errorSnackBar:"")},autoHideDuration:g&&"error"===g.type?1e4:5e3}),(0,j.jsx)(u.Z,{className:k?"":f.content,children:m})]}))})))},29823:function(e,a,t){var n=t(95318);a.Z=void 0;var s=n(t(45649)),o=t(80184),i=(0,s.default)((0,o.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");a.Z=i}}]);
//# sourceMappingURL=1581.2ff273b8.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkportal_ui=self.webpackChunkportal_ui||[]).push([[1705],{71705:function(e,n,t){t.r(n);var l=t(70885),o=t(72791),s=t(9505),a=t(64554),c=t(56087),i=t(38442),u=t(26181),r=t.n(u),d=t(81918),f=t(29823),v=t(42419),h=t(75578),p=t(72401),Z=t(80184),x=(0,h.Z)(o.lazy((function(){return Promise.all([t.e(3772),t.e(247)]).then(t.bind(t,40247))}))),m=(0,h.Z)(o.lazy((function(){return Promise.all([t.e(3772),t.e(2442),t.e(2763)]).then(t.bind(t,22763))})));n.default=function(e){var n=e.setErrorSnackMessage,t=e.bucketName,u=(0,o.useState)(null),h=(0,l.Z)(u,2),j=h[0],T=h[1],k=(0,o.useState)(!1),b=(0,l.Z)(k,2),g=b[0],G=b[1],_=(0,o.useState)([]),C=(0,l.Z)(_,2),S=C[0],y=C[1],A=(0,o.useState)(["",""]),E=(0,l.Z)(A,2),U=E[0],z=E[1],N=(0,o.useState)(!1),P=(0,l.Z)(N,2),I=P[0],w=P[1],F=(0,s.Z)((function(e){var n,t;null!=e&&null!=(null===e||void 0===e?void 0:e.details)&&(T(null===e||void 0===e||null===(n=e.details)||void 0===n?void 0:n.tags),y(Object.keys(null===e||void 0===e||null===(t=e.details)||void 0===t?void 0:t.tags)))}),(function(e){n(e)})),B=(0,l.Z)(F,2),K=B[0],M=B[1],O=function(){M("GET","/api/v1/buckets/".concat(t))};return(0,o.useEffect)((function(){O()}),[t]),(0,Z.jsxs)(a.Z,{children:[K?(0,Z.jsx)(p.Z,{style:{width:16,height:16}}):null,(0,Z.jsx)(i.s,{scopes:[c.Ft.S3_GET_BUCKET_TAGGING],resource:t,children:(0,Z.jsxs)(a.Z,{sx:{display:"flex",flexFlow:"column"},children:[(0,Z.jsx)(a.Z,{children:S&&S.map((function(e,n){var l=r()(j,"".concat(e),"");return""!==l?(0,Z.jsx)(i.s,{scopes:[c.Ft.S3_PUT_BUCKET_TAGGING],resource:t,matchAll:!0,errorProps:{deleteIcon:null,onDelete:null},children:(0,Z.jsx)(d.Z,{style:{textTransform:"none",marginRight:"5px"},size:"small",label:"".concat(e," : ").concat(l),color:"primary",deleteIcon:(0,Z.jsx)(f.Z,{}),onDelete:function(){!function(e,n){z([e,n]),w(!0)}(e,l)}})},"chip-".concat(n)):null}))}),(0,Z.jsx)(i.s,{scopes:[c.Ft.S3_PUT_BUCKET_TAGGING],resource:t,errorProps:{disabled:!0,onClick:null},children:(0,Z.jsx)(d.Z,{style:{maxWidth:80,marginTop:"10px"},icon:(0,Z.jsx)(v.Z,{}),clickable:!0,size:"small",label:"Add tag",color:"primary",variant:"outlined",onClick:function(){G(!0)}})})]})}),g&&(0,Z.jsx)(x,{modalOpen:g,currentTags:j,bucketName:t,onCloseAndUpdate:function(e){G(!1),e&&O()}}),I&&(0,Z.jsx)(m,{deleteOpen:I,currentTags:j,bucketName:t,onCloseAndUpdate:function(e){w(!1),e&&O()},selectedTag:U})]})}},9505:function(e,n,t){var l=t(70885),o=t(72791),s=t(81207);n.Z=function(e,n){var t=(0,o.useState)(!1),a=(0,l.Z)(t,2),c=a[0],i=a[1];return[c,function(t,l,o){i(!0),s.Z.invoke(t,l,o).then((function(n){i(!1),e(n)})).catch((function(e){i(!1),n(e)}))}]}},42419:function(e,n,t){var l=t(95318);n.Z=void 0;var o=l(t(45649)),s=t(80184),a=(0,o.default)((0,s.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");n.Z=a},29823:function(e,n,t){var l=t(95318);n.Z=void 0;var o=l(t(45649)),s=t(80184),a=(0,o.default)((0,s.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");n.Z=a}}]);
//# sourceMappingURL=1705.0e30ff48.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More