explorer: rm

This commit is contained in:
Evan Gray 2022-06-25 19:09:48 +00:00 committed by Evan Gray
parent 42d054282a
commit c3e7b33388
148 changed files with 0 additions and 44781 deletions

View File

@ -497,29 +497,6 @@ if explorer:
trigger_mode = trigger_mode,
)
# explorer web app
docker_build(
ref = "explorer",
context = "./explorer",
dockerfile = "./explorer/Dockerfile",
ignore = ["./explorer/node_modules"],
live_update = [
sync("./explorer/src", "/home/node/app/src"),
sync("./explorer/public", "/home/node/app/public"),
],
)
k8s_yaml_with_ns("devnet/explorer.yaml")
k8s_resource(
"explorer",
port_forwards = [
port_forward(8001, name = "Explorer Web UI [:8001]", host = webHost),
],
labels = ["explorer"],
trigger_mode = trigger_mode,
)
# terra devnet
docker_build(

View File

@ -1,48 +0,0 @@
---
apiVersion: v1
kind: Service
metadata:
name: explorer
labels:
app: explorer
spec:
ports:
- port: 8001
name: http
protocol: TCP
clusterIP: None
selector:
app: explorer
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: explorer
spec:
selector:
matchLabels:
app: explorer
serviceName: explorer
replicas: 1
template:
metadata:
labels:
app: explorer
spec:
terminationGracePeriodSeconds: 1
containers:
- name: explorer
image: explorer
command:
- /usr/local/bin/npm
- run
- serve
tty: true
ports:
- containerPort: 8001
name: gatsbyserver
protocol: TCP
readinessProbe:
httpGet:
port: gatsbyserver
path: /

View File

@ -1,125 +0,0 @@
GATSBY_SITE_URL=http://localhost:8000
GATSBY_GA_TAG=G-tag-goes-here
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
GATSBY_DEFAULT_NETWORK=mainnet
# contract addresses
## devnet addresses
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
## testnet addresses
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
## mainnet addresses
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535

View File

@ -1,126 +0,0 @@
GATSBY_SITE_URL=https://wormholenetwork.com
GATSBY_GA_TAG=G-TF5EQYS7RL
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
GATSBY_DEFAULT_NETWORK=mainnet
# contract addresses
## devnet addresses
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
## testnet addresses
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
## mainnet addresses
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535

View File

@ -1,125 +0,0 @@
GATSBY_SITE_URL=http://localhost:8000
GATSBY_GA_TAG=G-tag-goes-here
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
GATSBY_DEFAULT_NETWORK=mainnet
# contract addresses
## devnet addresses
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
## testnet addresses
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
## mainnet addresses
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535

3
explorer/.gitignore vendored
View File

@ -1,3 +0,0 @@
node_modules/
.cache/
public

View File

@ -1 +0,0 @@
save-exact=true

View File

@ -1,3 +0,0 @@
{
"cSpell.words": ["bridgesplit", "buidl", "pyth", "roadmap", "Solana", "tiexo"]
}

View File

@ -1,18 +0,0 @@
# syntax=docker.io/docker/dockerfile:1.3@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a61324cfdf59ef1357b3b2
# Derivative of ethereum/Dockerfile, look there for an explanation on how it works.
FROM node:16-alpine@sha256:004dbac84fed48e20f9888a23e32fa7cf83c2995e174a78d41d9a9dd1e051a20
RUN mkdir -p /app
WORKDIR /app
ADD package.json .
ADD package-lock.json .
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
npm ci
ADD . .
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
npm run build

View File

@ -1,54 +0,0 @@
<p align="center">
<a href="https://www.gatsbyjs.com/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter">
<img alt="Gatsby" src="https://www.gatsbyjs.com/Gatsby-Monogram.svg" width="60" />
</a>
</p>
<h1 align="center">
Gatsby minimal starter
</h1>
## 🚀 Quick start
1. **Create a Gatsby site.**
Use the Gatsby CLI to create a new site, specifying the minimal starter.
```shell
# create a new Gatsby site using the minimal starter
npm init gatsby
```
2. **Start developing.**
Navigate into your new sites directory and start it up.
```shell
cd my-gatsby-site/
npm run develop
```
3. **Open the code and start customizing!**
Your site is now running at http://localhost:8000!
Edit `src/pages/index.js` to see your site update in real-time!
4. **Learn more**
- [Documentation](https://www.gatsbyjs.com/docs/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
- [Tutorials](https://www.gatsbyjs.com/tutorial/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
- [Guides](https://www.gatsbyjs.com/tutorial/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
- [API Reference](https://www.gatsbyjs.com/docs/api-reference/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
- [Plugin Library](https://www.gatsbyjs.com/plugins?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
- [Cheat Sheet](https://www.gatsbyjs.com/docs/cheat-sheet/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
## 🚀 Quick start (Gatsby Cloud)
Deploy this starter with one click on [Gatsby Cloud](https://www.gatsbyjs.com/cloud/):
[<img src="https://www.gatsbyjs.com/deploynow.svg" alt="Deploy to Gatsby Cloud">](https://www.gatsbyjs.com/dashboard/deploynow?url=https://github.com/gatsbyjs/gatsby-starter-minimal)

View File

@ -1,4 +0,0 @@
// import "@fontsource/poppins"; // Defaults to weight 400 with all styles included.
import "@fontsource/poppins/300.css";
import "@fontsource/poppins/400.css";
import "./src/styles/global.css"; // bug loading multiple fonts in MuiCssBaseline

View File

@ -1,38 +0,0 @@
require("dotenv").config({
path: `.env.${process.env.NODE_ENV}`,
});
const siteMetadata = {
siteUrl: process.env.GATSBY_SITE_URL,
title: "Wormhole",
};
module.exports = {
siteMetadata,
plugins: [
`gatsby-plugin-react-helmet`,
`gatsby-plugin-top-layout`,
`gatsby-plugin-material-ui`,
{
resolve: "gatsby-plugin-robots-txt",
options: {
host: siteMetadata.siteUrl,
sitemap: `${siteMetadata.siteUrl}/sitemap/sitemap-index.xml`,
env: {
development: {
policy: [{ userAgent: "*", disallow: ["/"] }],
},
production: {
policy: [{ userAgent: "*", allow: "/" }],
},
},
},
},
`gatsby-plugin-sitemap`,
{
resolve: `gatsby-plugin-google-gtag`,
options: {
trackingIds: [String(process.env.GATSBY_GA_TAG)],
},
},
`gatsby-plugin-meta-redirect`, // make sure to put last in the array
],
};

View File

@ -1,59 +0,0 @@
/**
* Implement Gatsby's Node APIs in this file.
*
* See: https://www.gatsbyjs.com/docs/node-apis/
*/
const webpack = require("webpack");
exports.onCreateWebpackConfig = function addPathMapping({
stage,
actions,
getConfig,
}) {
actions.setWebpackConfig({
experiments: {
asyncWebAssembly: true,
},
plugins: [
// Work around for Buffer is undefined:
// https://github.com/webpack/changelog-v5/issues/10
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
}),
],
resolve: {
fallback: {
buffer: require.resolve("buffer"),
fs: false,
path: false,
stream: require.resolve("stream-browserify"),
crypto: require.resolve("crypto-browserify"),
},
},
});
};
exports.createPages = ({ actions }) => {
const { createRedirect } = actions;
createRedirect({
fromPath: "/en/",
toPath: "/",
isPermanent: true,
});
createRedirect({
fromPath: "/en/about/",
toPath: "/buidl/",
isPermanent: true,
});
createRedirect({
fromPath: "/en/network/",
toPath: "/network/",
isPermanent: true,
});
createRedirect({
fromPath: "/en/explorer/",
toPath: "/explorer/",
isPermanent: true,
});
};

35544
explorer/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,48 +0,0 @@
{
"name": "wormhole",
"version": "1.0.0",
"private": false,
"scripts": {
"develop": "gatsby develop",
"start": "gatsby develop",
"build": "gatsby build",
"serve": "gatsby serve --port=8001 --host=0.0.0.0",
"clean": "gatsby clean"
},
"dependencies": {
"@certusone/wormhole-sdk": "0.2.7",
"@cosmjs/encoding": "^0.27.0",
"@emotion/react": "^11.7.1",
"@emotion/styled": "^11.6.0",
"@fontsource/poppins": "^4.5.0",
"@mui/icons-material": "^5.2.5",
"@mui/lab": "^5.0.0-alpha.64",
"@mui/material": "^5.2.7",
"@mui/system": "^5.2.6",
"@nivo/bar": "^0.79.1",
"buffer": "^6.0.3",
"crypto-browserify": "3.12.0",
"dotenv": "^10.0.0",
"ethers": "^5.4.1",
"gatsby": "^4.4.0",
"gatsby-plugin-google-gtag": "^4.4.0",
"gatsby-plugin-material-ui": "^4.1.0",
"gatsby-plugin-meta-redirect": "1.1.1",
"gatsby-plugin-react-helmet": "^5.4.0",
"gatsby-plugin-robots-txt": "^1.6.14",
"gatsby-plugin-sitemap": "^5.4.0",
"gsap": "3.9.1",
"javascript-time-ago": "^2.3.10",
"path-browserify": "^1.0.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-helmet": "^6.1.0",
"react-time-ago": "^7.1.7",
"stream-browserify": "^3.0.0",
"util": "^0.12.4"
},
"devDependencies": {
"@types/react-helmet": "6.1.5",
"wasm-loader": "^1.3.0"
}
}

View File

@ -1,162 +0,0 @@
import {
createTheme,
CssBaseline,
responsiveFontSizes,
ThemeProvider,
} from "@mui/material";
import TimeAgo from "javascript-time-ago";
import en from "javascript-time-ago/locale/en";
import React from "react";
import { NetworkContextProvider } from "../../src/contexts/NetworkContext";
import bg from "../../src/images/bg.svg";
import { Helmet } from "react-helmet";
import Suisse from "../../src/fonts/SuisseBPIntlBold.woff2";
TimeAgo.addDefaultLocale(en);
let theme = createTheme({
palette: {
mode: "dark",
background: {
default: "#17153f",
},
},
typography: {
fontFamily: ["Poppins", "Arial"].join(","),
fontSize: 13,
body1: {
fontWeight: 300,
},
body2: {
fontWeight: 300,
},
h1: {
fontWeight: "bold",
fontFamily: ["Suisse BP Intl", "Arial"],
lineHeight: 0.9,
letterSpacing: -2.7,
},
h3: {
fontSize: 49,
fontWeight: "bold",
fontFamily: "Suisse BP Intl",
lineHeight: 0.9,
letterSpacing: -1.47,
},
h4: {
fontSize: 40,
fontWeight: "bold",
fontFamily: "Suisse BP Intl",
letterSpacing: -1.2,
lineHeight: 0.9,
},
caption: {
textTransform: "uppercase",
fontSize: 8,
letterSpacing: 2,
fontFamily: "Suisse BP Intl",
fontWeight: 400,
display: "block",
marginTop: 10,
},
},
components: {
MuiCssBaseline: {
styleOverrides: {
body: {
overscrollBehaviorY: "none",
backgroundColor: "#17153f",
backgroundImage: `url(${bg})`,
backgroundPosition: "top center",
backgroundRepeat: "repeat-y",
backgroundSize: "120%",
},
ul: {
paddingLeft: "0px",
},
"*": {
scrollbarWidth: "thin",
scrollbarColor: `#4e4e54 rgba(0,0,0,.25)`,
},
"*::-webkit-scrollbar": {
width: "8px",
height: "8px",
backgroundColor: "rgba(0, 0, 0, 0.25)",
},
"*::-webkit-scrollbar-thumb": {
backgroundColor: "#4e4e54",
borderRadius: "4px",
},
"*::-webkit-scrollbar-corner": {
// this hides an annoying white box which appears when both scrollbars are present
backgroundColor: "transparent",
},
},
},
MuiButton: {
styleOverrides: {
root: {
borderRadius: 22,
fontSize: 12,
fontWeight: 700,
letterSpacing: 1.5,
padding: "8px 22.5px 8px",
"&:hover .MuiButton-endIcon": {
transform: "translateX(4px)",
},
},
contained: {
boxShadow: "none",
"&:hover": {
boxShadow: "none",
},
"&:active": {
boxShadow: "none",
},
},
endIcon: {
marginLeft: 12,
transition: "transform 300ms",
},
},
},
MuiOutlinedInput: {
styleOverrides: {
notchedOutline: {
borderRadius: 24,
},
},
},
MuiSelect: {
styleOverrides: {
select: {
paddingTop: 8,
paddingRight: "40px!important",
paddingBottom: 8,
paddingLeft: 20,
},
},
},
},
});
theme = responsiveFontSizes(theme);
const TopLayout = ({ children }) => (
<ThemeProvider theme={theme}>
<Helmet>
<link
rel="preload"
as="font"
href={Suisse}
type="font/woff2"
crossOrigin="anonymous"
/>
</Helmet>
<CssBaseline />
<NetworkContextProvider>{children}</NetworkContextProvider>
</ThemeProvider>
);
export default TopLayout;

View File

@ -1,6 +0,0 @@
import React from "react";
import TopLayout from "./TopLayout";
export const wrapRootElement = ({ element }) => (
<TopLayout>{element}</TopLayout>
);

View File

@ -1,6 +0,0 @@
import React from "react";
import TopLayout from "./TopLayout";
export const wrapRootElement = ({ element }) => (
<TopLayout>{element}</TopLayout>
);

View File

@ -1,3 +0,0 @@
{
"name": "gatsby-plugin-top-layout"
}

BIN
explorer/src/.DS_Store vendored

Binary file not shown.

View File

@ -1,16 +0,0 @@
import { Box } from "@mui/material";
import React from "react";
const AvoidBreak = ({ spans }: { spans: string[] }) => (
<>
{spans.map((span, idx) => (
<React.Fragment key={`${idx}|${span}`}>
<Box component="span" sx={{ display: "inline-block" }}>
{span}
</Box>{" "}
</React.Fragment>
))}
</>
);
export default AvoidBreak;

View File

@ -1,60 +0,0 @@
import * as React from "react";
import binanceChainIcon from "../images/bsc.svg";
import ethereumIcon from "../images/eth.svg";
import solanaIcon from "../images//solana.svg";
import terraIcon from "../images/terra.svg";
import polygonIcon from "../images/polygon.svg";
import avalancheIcon from "../images/avalanche.svg";
import oasisIcon from "../images/oasis.svg";
import fantomIcon from "../images/fantom.svg";
import auroraIcon from "../images/aurora.svg";
import karuraIcon from "../images/karura.svg"
import {
ChainId,
CHAIN_ID_AVAX,
CHAIN_ID_BSC,
CHAIN_ID_ETH,
CHAIN_ID_OASIS,
CHAIN_ID_POLYGON,
CHAIN_ID_SOLANA,
CHAIN_ID_TERRA,
CHAIN_ID_FANTOM,
CHAIN_ID_AURORA,
CHAIN_ID_KARURA,
} from "@certusone/wormhole-sdk";
import { chainEnums } from "../utils/consts";
import { Box } from "@mui/material";
const chainIdToSrc = {
[CHAIN_ID_SOLANA]: solanaIcon,
[CHAIN_ID_ETH]: ethereumIcon,
[CHAIN_ID_TERRA]: terraIcon,
[CHAIN_ID_BSC]: binanceChainIcon,
[CHAIN_ID_POLYGON]: polygonIcon,
[CHAIN_ID_AVAX]: avalancheIcon,
[CHAIN_ID_OASIS]: oasisIcon,
[CHAIN_ID_FANTOM]: fantomIcon,
[CHAIN_ID_AURORA]: auroraIcon,
[CHAIN_ID_KARURA]: karuraIcon,
};
const ChainIcon = ({ chainId }: { chainId: ChainId }) =>
chainIdToSrc[chainId] ? (
<Box
sx={{
display: "flex",
alignItems: "center",
px: chainId === CHAIN_ID_ETH ? 0 : 0.25,
"&:first-of-type": { pl: 0 },
"&:last-of-type": { pr: 0 },
}}
>
<img
src={chainIdToSrc[chainId]}
alt={chainEnums[chainId] || ""}
style={{ width: 16 }}
/>
</Box>
) : null;
export default ChainIcon;

View File

@ -1,306 +0,0 @@
import { BigNumber } from "ethers";
import React, { useEffect, useState } from "react";
import { Typography } from '@mui/material'
import { importCoreWasm } from '@certusone/wormhole-sdk'
import { chainEnums, ChainIDs, chainIDs, METADATA_REPLACE } from "../utils/consts";
import { usdFormatter } from "../utils/explorer";
import { TransferDetails, TokenTransferPayload as TransferPayload } from "./ExplorerSearch/ExplorerQuery";
const validChains = Object.values(chainIDs)
// these types match/load the descriptions in src/locales
type TokenTransfer = "tokenTransfer"
type NFTTransfer = "nftTransfer"
type AssetMeta = "assetMeta"
type Governance = "governance"
type Pyth = "pyth"
type UnknownMessage = "unknownMessage"
type PayloadType = TokenTransfer | NFTTransfer | AssetMeta | Governance | Pyth | UnknownMessage
// the payloads this component can decode
const knownPayloads = ["assetMeta", "tokenTransfer", "nftTransfer"]
interface TokenTransferPayload {
payloadId: number
amount: string
originAddress: string
originChain: number
targetAddress: string
targetChain: number
}
interface NFTTransferPayload {
payloadId: number
name: string // "Not a PUNK🎸"
originAddress: string // "0101010101010101010101010101010101010101010101010101010101010101"
originChain: number // 1
symbol: string // "PUNK🎸"
targetAddress: string // "00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1"
targetChain: number // 2
tokenId: BigNumber | string // BigNumber { _hex: '0x9c006c48c8cbf33849cb07a3f936159cc523f9591cb1999abd45890ec5fee9b7', _isBigNumber: true }
uri: string // "https://wrappedpunks.com:3000/api/punks/metadata/39"
}
interface AssetMetaPayload {
payloadId: number
tokenAddress: string
tokenChain: number
decimals: number
symbol: string
name: string
}
// TODO - figure out how to decode these and what they contain
interface GovernancePayload { }
interface PythPayload { }
interface UnknownPayload { }
type VAAPayload =
| TokenTransferPayload
| NFTTransferPayload
| AssetMetaPayload
| GovernancePayload
| PythPayload
| UnknownPayload
type TokenTransferBundle = { type: TokenTransfer, payload: TokenTransferPayload }
type NFTTransferBundle = { type: NFTTransfer, payload: NFTTransferPayload }
type AssetMetaBundle = { type: AssetMeta, payload: AssetMetaPayload }
type UnknownMessageBundle = { type: UnknownMessage, payload: UnknownPayload }
type PayloadBundle = TokenTransferBundle | NFTTransferBundle | AssetMetaBundle | UnknownMessageBundle
const parseTokenPayload = (arr: Buffer): TokenTransferPayload => ({
payloadId: arr.readUInt8(0),
amount: BigNumber.from(arr.slice(1, 1 + 32)).toBigInt().toString(),
originAddress: arr.slice(33, 33 + 32).toString("hex"),
originChain: arr.readUInt16BE(65),
targetAddress: arr.slice(67, 67 + 32).toString("hex"),
targetChain: arr.readUInt16BE(99),
});
const parseNFTPayload = (arr: Buffer): NFTTransferPayload => {
const payloadId = arr.readUInt8(0)
const originAddress = arr.slice(1, 1 + 32).toString("hex");
const originChain = arr.readUInt16BE(33)
const symbol = Buffer.from(arr.slice(35, 35 + 32))
.toString("utf8")
.replace(METADATA_REPLACE, "");
const name = Buffer.from(arr.slice(67, 67 + 32))
.toString("utf8")
.replace(METADATA_REPLACE, "");
const tokenId = BigNumber.from(arr.slice(99, 99 + 32)).toString()
const uri_len = arr.readUInt8(131);
const uri = Buffer.from(arr.slice(132, 132 + uri_len))
.toString("utf8")
.replace(METADATA_REPLACE, "");
const target_offset = 132 + uri_len;
const targetAddress = arr
.slice(target_offset, target_offset + 32)
.toString("hex");
const targetChain = arr.readUInt16BE(target_offset + 32);
return {
payloadId,
originAddress,
originChain,
symbol,
name,
tokenId,
uri,
targetAddress,
targetChain,
};
};
const parseAssetMetaPayload = (arr: Buffer): AssetMetaPayload => {
let index = 0
const payloadId = arr.readUInt8(0)
index += 1
const tokenAddress = arr.slice(index, index + 32).toString("hex");
index += 32
const tokenChain = arr.readUInt16BE(index)
index += 1
const decimals = arr.readUInt8(index)
index += 1
const symbol = Buffer.from(arr.slice(index, index + 32))
.toString("utf8")
.replace(METADATA_REPLACE, "")
.replace(new RegExp("\u0012", "g"), "")
.replace(new RegExp("\u0002", "g"), "")
index += 32
const name = Buffer.from(arr.slice(index, index + 32))
.toString("utf8")
.replace(METADATA_REPLACE, "");
index += 32
return {
payloadId,
tokenAddress,
tokenChain,
decimals,
symbol,
name
}
}
function useBase64ToBuffer(base64VAA: string = "") {
const [buf, setBuf] = useState<Buffer>()
function convertbase64ToBinary(base64: string) {
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (let i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
useEffect(() => {
async function asyncWork(vaaString: string) {
const vaa = convertbase64ToBinary(vaaString)
// TODO - need to export parse_vaa from @certusone/wormhole-sdk
// const bridgeWasm = await import('bridge')
const bridgeWasm = await importCoreWasm()
const parsedVaa = bridgeWasm.parse_vaa(vaa)
setBuf(Buffer.from(parsedVaa.payload))
}
asyncWork(base64VAA)
}, [base64VAA])
return buf
}
interface DecodePayloadProps {
base64VAA?: string
emitterChainName: keyof ChainIDs
emitterAddress: string
showType?: boolean
showSummary?: boolean
showPayload?: boolean
transferPayload?: TransferPayload
transferDetails?: TransferDetails
}
const DecodePayload = (props: DecodePayloadProps) => {
const buf = useBase64ToBuffer(props.base64VAA)
const [payloadBundle, setPayloadBundle] = useState<PayloadBundle>()
const determineType = (payloadBuffer: Buffer) => {
let payload: PayloadBundle["payload"] = {}
let type: PayloadBundle["type"] = "unknownMessage"
let unknown: UnknownMessageBundle = { type: "unknownMessage", payload: {} }
let bundle: PayloadBundle = unknown
// try the types, do some logic on the results
let parsedTokenPayload: TokenTransferPayload | undefined
let parsedNftPayload: NFTTransferPayload | undefined
let parsedAssetMeta: AssetMetaPayload | undefined
try {
parsedTokenPayload = parseTokenPayload(payloadBuffer)
// console.log('parsedTokenPayload: ', parsedTokenPayload)
} catch (_) {
// do nothing
}
try {
parsedNftPayload = parseNFTPayload(payloadBuffer)
// console.log('parsedNftPayload ', parsedNftPayload)
} catch (_) {
// do nothing
}
try {
parsedAssetMeta = parseAssetMetaPayload(payloadBuffer)
// console.log('parsedAssetMeta ', parsedAssetMeta)
} catch (_) {
// do nothing
}
// determine which type of payload this is by asserting values
if (parsedNftPayload?.uri) {
try {
// test for valid url
new URL(parsedNftPayload.uri);
type = "nftTransfer"
payload = parsedNftPayload
bundle = { type: "nftTransfer", payload: parsedNftPayload }
} catch (_) {
// probably not an NFT transfer, continue
}
} else if (parsedTokenPayload && validChains.includes(parsedTokenPayload?.originChain) && validChains.includes(parsedTokenPayload?.targetChain)) {
type = "tokenTransfer"
payload = parsedTokenPayload
bundle = { type: "tokenTransfer", payload: parsedTokenPayload }
} else if (parsedAssetMeta && chainIDs[props.emitterChainName] === parsedAssetMeta.tokenChain) {
payload = parsedAssetMeta
type = "assetMeta"
bundle = { type: "assetMeta", payload: parsedAssetMeta }
}
setPayloadBundle(bundle)
}
useEffect(() => {
if (buf) {
determineType(buf)
}
}, [buf])
const titleCase = (str: string) => <span style={{ textTransform: 'capitalize' }}>{str}</span>
const unknown = "Unknown message"
return (
<>
{props.showType && payloadBundle ?
<span>
{props.showSummary && payloadBundle ? (
payloadBundle.type === "assetMeta" ? (<>
{"AssetMeta:"}&nbsp;{chainEnums[payloadBundle.payload.tokenChain]}&nbsp; {payloadBundle.payload.symbol} {payloadBundle.payload.name}
</>) :
payloadBundle.type === "tokenTransfer" ?
props.transferDetails && payloadBundle.payload && props.transferDetails.OriginSymbol ? (<>
{"Transfer"}&nbsp;
{(Math.round(Number(props.transferDetails.Amount) * 100) / 100).toLocaleString()}&nbsp;{props.transferDetails.OriginSymbol}&nbsp;
{'from'}&nbsp;{titleCase(props.emitterChainName)}&nbsp;{'to'}&nbsp;{chainEnums[Number(payloadBundle.payload.targetChain)]}&nbsp;
{'('}{usdFormatter.format(Number(props.transferDetails.NotionalUSDStr))}{')'}
</>) : (<>
{"Token transfer: "}{chainEnums[payloadBundle.payload.originChain]}{' asset -> '}{chainEnums[payloadBundle.payload.targetChain]}
</>) :
payloadBundle.type === "nftTransfer" ? (<>
{"NFT: "}&nbsp;{payloadBundle.payload.name || "?"}&nbsp;{" wormholed "}&nbsp;{chainEnums[payloadBundle.payload.originChain]}{' -> '}{chainEnums[payloadBundle.payload.targetChain]}
</>) : unknown
) : unknown}
</span> : props.showPayload && payloadBundle ? (
<>
<div style={{ margin: "20px 0" }} className="styled-scrollbar">
<Typography variant="h4"> payload</Typography>
<pre style={{ fontSize: 14 }}>{JSON.stringify(payloadBundle.payload, undefined, 2)}</pre>
</div>
{/* TODO - prettier formatting of payload data. POC below. */}
{/* {payloadBundle && payloadBundle.payload && knownPayloads.includes(payloadBundle.type) ? (
Object.entries(payloadBundle.payload).map(([key, value]) => {
return <Statistic title={key} key={key} value={value} />
})
) : <span>Can't decode unknown payloads</span>} */}
</>
) : unknown}
</>
)
}
export { DecodePayload }

View File

@ -1,40 +0,0 @@
import React from "react";
import { TextField, Typography, MenuItem } from "@mui/material";
export type explorerFormType = "txID" | "messageID";
interface ExplorerFormSelect {
currentlyActive: explorerFormType;
toggleFormType: () => void;
}
const ExplorerFormSelect: React.FC<ExplorerFormSelect> = ({
currentlyActive,
toggleFormType,
}) => {
const onQueryType = (event: React.ChangeEvent<HTMLInputElement>) => {
const { value } = event.target;
if (value !== currentlyActive) {
// toggle the other form type
toggleFormType();
}
};
const formatOption = (message: string) => (
<Typography variant="body2">{message}</Typography>
);
return (
<TextField
select
value={currentlyActive}
onChange={onQueryType}
sx={{
mb: 2,
}}
>
<MenuItem value="txID">{formatOption("Search Transaction")}</MenuItem>
<MenuItem value="messageID">{formatOption("Search Message ID")}</MenuItem>
</TextField>
);
};
export default ExplorerFormSelect;

View File

@ -1,197 +0,0 @@
import React, { useEffect, useState } from "react";
import { PageProps, navigate } from "gatsby";
import ExplorerQuery from "./ExplorerQuery";
import { chainEnums, ChainID, chainIDs } from "../../utils/consts";
import { useNetworkContext } from "../../contexts/NetworkContext";
import { truncateAddress } from "../../utils/explorer";
import {
Autocomplete,
Button,
FormControl,
TextField,
Typography,
MenuItem,
Box,
} from "@mui/material";
import ExplorerFormSelect, { explorerFormType } from "./ExplorerFormSelect";
// form props
interface ExplorerMessageSearchValues {
emitterChain: number;
emitterAddress: string;
sequence: string;
}
const emitterChains = [
{ label: ChainID[1], value: chainIDs["solana"] },
{ label: ChainID[2], value: chainIDs["ethereum"] },
{ label: ChainID[3], value: chainIDs["terra"] },
{ label: ChainID[4], value: chainIDs["bsc"] },
{ label: ChainID[5], value: chainIDs["polygon"] },
{ label: ChainID[6], value: chainIDs["avalanche"] },
{ label: ChainID[7], value: chainIDs["oasis"] },
{ label: ChainID[9], value: chainIDs["aurora"] },
{ label: ChainID[10], value: chainIDs["fantom"] },
];
interface ExplorerMessageSearchProps {
location: PageProps["location"];
toggleFormType: () => void;
formName: explorerFormType;
}
const ExplorerMessageSearchForm: React.FC<ExplorerMessageSearchProps> = ({
location,
toggleFormType,
formName,
}) => {
const [emitterChain, setEmitterChain] =
useState<ExplorerMessageSearchValues["emitterChain"]>();
const [emitterAddress, setEmitterAddress] =
useState<ExplorerMessageSearchValues["emitterAddress"]>();
const [sequence, setSequence] =
useState<ExplorerMessageSearchValues["sequence"]>();
const { activeNetwork } = useNetworkContext();
useEffect(() => {
if (location.search) {
// take searchparams from the URL and set the values in the form
const searchParams = new URLSearchParams(location.search);
const chain = searchParams.get("emitterChain");
const address = searchParams.get("emitterAddress");
const seqQuery = searchParams.get("sequence");
setEmitterChain(Number(chain));
setEmitterAddress(address || undefined);
setSequence(seqQuery || undefined);
} else {
// clear state
setEmitterChain(undefined);
setEmitterAddress(undefined);
setSequence(undefined);
}
}, [location.search]);
const handleSubmit = (event: React.ChangeEvent<HTMLFormElement>) => {
event.preventDefault();
// pushing to the history stack will cause the component to get new props, and useEffect will run.
if (emitterChain && emitterAddress && sequence) {
navigate(
`?emitterChain=${emitterChain}&emitterAddress=${emitterAddress}&sequence=${sequence}`
);
}
};
const onChain = (event: React.ChangeEvent<HTMLInputElement>) => {
const { value } = event.target;
setEmitterChain(Number(value));
};
const onAddress = (value: string) => {
// trim whitespace
setEmitterAddress(value.replace(/\s/g, ""));
};
const onSequence = (event: React.ChangeEvent<HTMLInputElement>) => {
const { value } = event.target;
// remove everything except numbers
setSequence(value.replace(/\D/g, ""));
};
return (
<>
<Box
component="form"
noValidate
autoComplete="off"
onSubmit={handleSubmit}
>
<ExplorerFormSelect
currentlyActive={formName}
toggleFormType={toggleFormType}
/>
<TextField
select
value={emitterChain || ""}
onChange={onChain}
placeholder="Chain"
label="Chain"
fullWidth
size="small"
sx={{ my: 1 }}
>
{emitterChains.map(({ label, value }) => (
<MenuItem key={label} value={value}>
{label}
</MenuItem>
))}
</TextField>
<Autocomplete
// TODO set value when loading the page with emitterAddress
// value={emitterAddress || ""}
freeSolo
fullWidth
size="small"
sx={{ my: 1 }}
onChange={(event, newVal: any) => onAddress(newVal.value)}
placeholder="Contract"
renderInput={(params: any) => (
<TextField {...params} label="Emitter Contract" />
)}
getOptionLabel={(option) => option.label}
// Get the chainID from the emitterChain form item, then use chainEnums to transform it to the
// lowercase chain name, in order to use it to lookup the emitterAdresses of the active network.
// Filter out keys that are not human readable names, by checking for a space in the key.
options={Object.entries(
activeNetwork.chains[
chainEnums[emitterChain || 1]?.toLowerCase()
] || {}
)
.filter(([key]) => key.includes(" "))
.map(([key, val]) => ({
label: `${key} (${truncateAddress(val)})`,
value: val,
}))}
/>
<TextField
type="number"
value={sequence ? Number(sequence) : ""}
onChange={onSequence}
label="Sequence"
fullWidth
size="small"
sx={{ my: 1 }}
/>
<Button
type="submit"
variant="contained"
sx={{
display: "block",
mt: 1,
ml: "auto",
}}
>
Search
</Button>
</Box>
{emitterChain && emitterAddress && sequence ? (
<ExplorerQuery
emitterChain={emitterChain}
emitterAddress={emitterAddress}
sequence={sequence}
/>
) : null}
</>
);
};
export default ExplorerMessageSearchForm;

View File

@ -1,237 +0,0 @@
import React, { useEffect, useState } from 'react';
import { Typography } from '@mui/material'
import { arrayify, isHexString, zeroPad, hexlify } from "ethers/lib/utils";
import { Bech32, toHex, fromHex } from "@cosmjs/encoding"
import ExplorerSummary from './ExplorerSummary';
import { useNetworkContext } from '../../contexts/NetworkContext';
import { ChainId, getEmitterAddressSolana, isEVMChain } from "@certusone/wormhole-sdk";
import { ChainIDs, chainIDs } from '../../utils/consts';
import { PublicKey } from '@solana/web3.js';
export interface VAA {
Version: number | string,
GuardianSetIndex: number,
Signatures: { Index: number, Signature: string }[],
Timestamp: string, // "0001-01-01T00:00:00Z",
Nonce: number,
Sequence: number,
ConsistencyLevel: number,
EmitterChain: number,
EmitterAddress: string,
Payload: string // base64 encoded byte array
}
export interface TokenTransferPayload {
Amount: string
OriginAddress: string
OriginChain: string,
TargetAddress: string,
TargetChain: string,
}
export interface TransferDetails {
Amount: string, // "1530.000000",
Decimals: string, // "6",
NotionalUSDStr: string, // "1538.495460",
TokenPriceUSDStr: string, // "1.005553",
TransferTimestamp: string, // "2021-11-21 16:55:15 +0000 UTC",
OriginSymbol: string,
OriginName: string,
OriginTokenAddress: string,
}
export interface BigTableMessage {
InitiatingTxID?: string
SignedVAABytes?: string // base64 encoded byte array
SignedVAA?: VAA
QuorumTime?: string // "2021-08-11 00:16:11.757 +0000 UTC"
EmitterChain: keyof ChainIDs
EmitterAddress: string
Sequence: string
TokenTransferPayload?: TokenTransferPayload
TransferDetails?: TransferDetails
}
interface ExplorerQuery {
emitterChain?: number,
emitterAddress?: string,
sequence?: string,
txId?: string,
}
const ExplorerQuery = (props: ExplorerQuery) => {
const { activeNetwork } = useNetworkContext()
const [error, setError] = useState<string>();
const [loading, setLoading] = useState<boolean>(true);
const [message, setMessage] = useState<BigTableMessage>();
const [polling, setPolling] = useState(false);
const [lastFetched, setLastFetched] = useState<number>()
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout>()
const fetchMessage = async (
emitterChain: ExplorerQuery["emitterChain"],
emitterAddress: ExplorerQuery["emitterAddress"],
sequence: ExplorerQuery["sequence"],
txId: ExplorerQuery["txId"]) => {
let paddedAddress: string = ""
let paddedSequence: string
let base = `${activeNetwork.endpoints.bigtableFunctionsBase}`
let url = ""
if (emitterChain && emitterAddress && sequence) {
if (emitterChain === chainIDs["solana"]) {
if (emitterAddress.length < 64) {
try {
paddedAddress = await getEmitterAddressSolana(emitterAddress)
} catch (_) {
// do nothing
}
} else {
paddedAddress = emitterAddress
}
} else if (isEVMChain(emitterChain as ChainId)) {
if (isHexString(emitterAddress)) {
let paddedAddressArray = zeroPad(arrayify(emitterAddress, { hexPad: "left" }), 32);
let maybeString = Buffer.from(paddedAddressArray).toString('hex');
paddedAddress = maybeString
} else {
// must already be padded
paddedAddress = emitterAddress
}
} else if (emitterChain === chainIDs["terra"]) {
if (emitterAddress.startsWith('terra')) {
try {
paddedAddress = toHex(zeroPad(Bech32.decode(emitterAddress).data, 32))
} catch (_) {
// do nothing
}
} else {
paddedAddress = emitterAddress
}
} else {
paddedAddress = emitterAddress
}
if (sequence.length <= 15) {
paddedSequence = sequence.padStart(16, "0")
} else {
paddedSequence = sequence
}
url = `${base}readrow?emitterChain=${emitterChain}&emitterAddress=${paddedAddress}&sequence=${paddedSequence}`
} else if (txId) {
let transformedTxId = txId
if (isHexString(txId)) {
// valid hexString, no transformation needed.
} else {
try {
let pubKey = new PublicKey(txId).toBytes()
let solHex = hexlify(pubKey)
transformedTxId = solHex
} catch (_) {
// not solana, try terra
try {
let arr = fromHex(txId)
let terraHex = hexlify(arr)
transformedTxId = terraHex
} catch (_) {
// do nothing
}
}
}
url = `${base}transaction?id=${transformedTxId}`
}
fetch(url)
.then<BigTableMessage>(res => {
if (res.ok) return res.json()
if (res.status === 404) {
// show a specific message to the user if the query returned 404.
throw 'explorer.notFound'
}
// if res is not ok, and not 404, throw an error with specific message,
// rather than letting the json decoding throw.
throw 'explorer.failedFetching'
})
.then(result => {
setMessage(result)
setLoading(false)
setLastFetched(Date.now())
// turn polling on/off
if (!result.QuorumTime && !polling) {
setPolling(true)
} else if (result.QuorumTime && polling) {
setPolling(false)
}
}, error => {
// Note: it's important to handle errors here
// instead of a catch() block so that we don't swallow
// exceptions from actual bugs in components.
setError(error)
setLoading(false)
setLastFetched(Date.now())
if (polling) {
setPolling(false)
}
})
}
const refreshCallback = () => {
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
}
if (polling && !pollInterval) {
let interval = setInterval(() => {
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
}, 3000)
setPollInterval(interval)
} else if (!polling && pollInterval) {
clearInterval(pollInterval)
setPollInterval(undefined)
}
useEffect(() => {
setPolling(false)
setError(undefined)
setMessage(undefined)
setLastFetched(undefined)
if ((props.emitterChain && props.emitterAddress && props.sequence) || props.txId) {
setLoading(true)
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
}
}, [props.emitterChain, props.emitterAddress, props.sequence, props.txId, activeNetwork.endpoints.bigtableFunctionsBase])
useEffect(() => {
return function cleanup() {
if (pollInterval) {
clearInterval(pollInterval)
}
};
}, [polling, activeNetwork.endpoints.bigtableFunctionsBase])
return (
<>
{loading ? <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
loading...
</div> :
error ? <Typography variant="h4" >error</Typography> :
message ? (
<ExplorerSummary
{...props}
message={message}
polling={polling}
lastFetched={lastFetched}
refetch={refreshCallback}
/>
) : null
}
</>
)
}
export default ExplorerQuery

View File

@ -1,62 +0,0 @@
import React, { useEffect, useState } from 'react'
import { navigate, PageProps } from 'gatsby'
import { Box } from "@mui/material";
import ExplorerMessageSearchForm from "./ExplorerMessageSearchForm";
import ExplorerTxSearchForm from "./ExplorerTxSearchForm";
interface ExplorerSearchProps {
location: PageProps["location"],
}
const ExplorerSearch = ({ location }: ExplorerSearchProps) => {
const [showMessageIdForm, setShowMessageIdForm] = useState<boolean>(false);
useEffect(() => {
if (location.search) {
const searchParams = new URLSearchParams(location.search);
const chain = searchParams.get("emitterChain");
const address = searchParams.get("emitterAddress");
const seq = searchParams.get("sequence");
const tx = searchParams.get("txId");
if (!tx && chain && address && seq) {
setShowMessageIdForm(true);
}
} else {
setShowMessageIdForm(false)
}
}, [location.search])
const switchForm = () => {
if (location.search) {
navigate('/explorer')
}
setShowMessageIdForm(!showMessageIdForm)
}
return (
<Box
sx={{
backgroundColor: "rgba(255,255,255,.07)",
borderRadius: "28px",
mt: 4,
p: 4,
}}
>
{showMessageIdForm ? (
<ExplorerMessageSearchForm
location={location}
toggleFormType={switchForm}
formName="messageID"
/>
) : (
<ExplorerTxSearchForm
location={location}
toggleFormType={switchForm}
formName="txID"
/>
)}
</Box>
)
}
export default ExplorerSearch

View File

@ -1,250 +0,0 @@
import React from "react";
import { Box, Button, Link, Typography } from "@mui/material";
import { BigTableMessage } from "./ExplorerQuery";
import { DecodePayload } from "../DecodePayload";
import ReactTimeAgo from "react-time-ago";
import { Link as RouterLink } from "gatsby";
import {
contractNameFormatter,
getNativeAddress,
nativeExplorerContractUri,
nativeExplorerTxUri,
truncateAddress,
usdFormatter,
} from "../../utils/explorer";
import { OutboundLink } from "gatsby-plugin-google-gtag";
import { ChainID, chainIDs } from "../../utils/consts";
import { hexToNativeString } from "@certusone/wormhole-sdk";
import { explorer } from "../../utils/urls";
interface SummaryProps {
emitterChain?: number;
emitterAddress?: string;
sequence?: string;
txId?: string;
message: BigTableMessage;
polling?: boolean;
lastFetched?: number;
refetch: () => void;
}
const textStyles = { fontSize: 16, margin: "6px 0" };
const ExplorerSummary = (props: SummaryProps) => {
const { SignedVAA, ...message } = props.message;
const {
EmitterChain,
EmitterAddress,
InitiatingTxID,
TokenTransferPayload,
TransferDetails,
} = message;
// get chainId from chain name
let chainId = chainIDs[EmitterChain];
let transactionId: string | undefined;
if (InitiatingTxID) {
if (
chainId === chainIDs["ethereum"] ||
chainId === chainIDs["bsc"] ||
chainId === chainIDs["polygon"]
) {
transactionId = InitiatingTxID;
} else {
if (chainId === chainIDs["solana"]) {
const txId = InitiatingTxID.slice(2); // remove the leading "0x"
transactionId = hexToNativeString(txId, chainId);
} else if (chainId === chainIDs["terra"]) {
transactionId = InitiatingTxID.slice(2); // remove the leading "0x"
}
}
}
return (
<>
<div
style={{
display: "flex",
justifyContent: "space-between",
gap: 8,
alignItems: "baseline",
marginTop: 40,
}}
>
<Typography variant="h4">Message Summary</Typography>
{props.polling ? (
<>
<div style={{ flexGrow: 1 }}></div>
<Typography variant="caption">listening</Typography>
</>
) : (
<div>
<Button onClick={props.refetch}>Refresh</Button>
<Button component={RouterLink} to={explorer} sx={{ ml: 1 }}>
Clear
</Button>
</div>
)}
</div>
<div
style={{
display: "flex",
flexDirection: "column",
margin: "20px 0 24px 20px",
}}
>
<ul>
{TokenTransferPayload &&
TokenTransferPayload.TargetAddress &&
TransferDetails &&
nativeExplorerContractUri(
Number(TokenTransferPayload.TargetChain),
TokenTransferPayload.TargetAddress
) ? (
<>
<li>
<span style={textStyles}>
This is a token transfer of{" "}
{Math.round(Number(TransferDetails.Amount) * 100) / 100}
{` `}
{!["UST", "LUNA"].includes(TransferDetails.OriginSymbol) ? (
<Link
component={OutboundLink}
href={nativeExplorerContractUri(
Number(TokenTransferPayload.OriginChain),
TokenTransferPayload.OriginAddress
)}
target="_blank"
rel="noopener noreferrer"
style={{ ...textStyles, whiteSpace: "nowrap" }}
>
{TransferDetails.OriginSymbol}
</Link>
) : (
TransferDetails.OriginSymbol
)}
{` `}from {ChainID[chainId]}, to{" "}
{ChainID[Number(TokenTransferPayload.TargetChain)]}, destined
for address{" "}
</span>
<Link
component={OutboundLink}
href={nativeExplorerContractUri(
Number(TokenTransferPayload.TargetChain),
TokenTransferPayload.TargetAddress
)}
target="_blank"
rel="noopener noreferrer"
style={{ ...textStyles, whiteSpace: "nowrap" }}
>
{truncateAddress(
getNativeAddress(
Number(TokenTransferPayload.TargetChain),
TokenTransferPayload.TargetAddress
)
)}
</Link>
<span style={textStyles}>.</span>
</li>
{TransferDetails.NotionalUSDStr && (
<>
<li>
<span style={textStyles}>
When these tokens were sent to Wormhole, the{" "}
{Math.round(Number(TransferDetails.Amount) * 100) / 100}{" "}
{TransferDetails.OriginSymbol} was worth about{" "}
{usdFormatter.format(
Number(TransferDetails.NotionalUSDStr)
)}
.
</span>
</li>
<li>
<span style={textStyles}>
At the time of the transfer, 1{" "}
{TransferDetails.OriginName} was worth about{" "}
{usdFormatter.format(
Number(TransferDetails.TokenPriceUSDStr)
)}
.{" "}
</span>
</li>
</>
)}
</>
) : null}
{EmitterChain &&
EmitterAddress &&
nativeExplorerContractUri(chainId, EmitterAddress) ? (
<li>
<span style={textStyles}>
This message was emitted by the {ChainID[chainId]}{" "}
</span>
<Link
component={OutboundLink}
href={nativeExplorerContractUri(chainId, EmitterAddress)}
target="_blank"
rel="noopener noreferrer"
style={{ ...textStyles, whiteSpace: "nowrap" }}
>
{contractNameFormatter(EmitterAddress, chainId)}
</Link>
<span style={textStyles}> contract</span>
{transactionId && (
<>
<span style={textStyles}>
{" "}
after the Wormhole Guardians observed transaction{" "}
</span>
<Link
component={OutboundLink}
href={nativeExplorerTxUri(chainId, transactionId)}
target="_blank"
rel="noopener noreferrer"
style={{ ...textStyles, whiteSpace: "nowrap" }}
>
{truncateAddress(transactionId)}
</Link>
</>
)}{" "}
<span style={textStyles}>.</span>
</li>
) : null}
</ul>
</div>
<Typography variant="h4">Raw message data:</Typography>
<Box component="div" sx={{ overflow: "auto", mb: 2.5 }}>
<pre style={{ fontSize: 14 }}>
{JSON.stringify(message, undefined, 2)}
</pre>
</Box>
<DecodePayload
base64VAA={props.message.SignedVAABytes}
emitterChainName={props.message.EmitterChain}
emitterAddress={props.message.EmitterAddress}
showPayload={true}
transferDetails={props.message.TransferDetails}
/>
<Box component="div" sx={{ overflow: "auto", mb: 2.5 }}>
<Typography variant="h4">Signed VAA</Typography>
<pre style={{ fontSize: 12 }}>
{JSON.stringify(SignedVAA, undefined, 2)}
</pre>
</Box>
<div style={{ display: "flex", justifyContent: "flex-end" }}>
{props.lastFetched ? (
<span>
last updated:&nbsp;
<ReactTimeAgo
date={new Date(props.lastFetched)}
timeStyle="round"
/>
</span>
) : null}
</div>
</>
);
};
export default ExplorerSummary;

View File

@ -1,88 +0,0 @@
import React, { useEffect, useState } from "react";
import { PageProps, navigate } from "gatsby";
import { Button, TextField, Box } from "@mui/material";
import ExplorerQuery from "./ExplorerQuery";
import ExplorerFormSelect, { explorerFormType } from "./ExplorerFormSelect";
interface ExplorerTxSearchProps {
location: PageProps["location"];
toggleFormType: () => void;
formName: explorerFormType;
}
const ExplorerTxSearchForm: React.FC<ExplorerTxSearchProps> = ({
location,
toggleFormType,
formName,
}) => {
const [txId, setTxId] = useState<string>();
useEffect(() => {
if (location.search) {
// take searchparams from the URL and set the values in the form
const searchParams = new URLSearchParams(location.search);
const txQuery = searchParams.get("txId");
// if the search params are different form values, update the form.
if (txQuery) {
setTxId(txQuery);
}
} else {
// clear state
setTxId(undefined);
}
}, [location.search]);
const handleSubmit = (event: any) => {
event.preventDefault();
// pushing to the history stack will cause the component to get new props, and useEffect will run.
if (txId) {
navigate(`/explorer?txId=${txId}`);
}
};
const onTxId = (event: React.ChangeEvent<HTMLInputElement>) => {
const tx = event.target.value;
setTxId(tx.replace(/\s/g, ""));
};
return (
<>
<Box
component="form"
noValidate
autoComplete="off"
onSubmit={handleSubmit}
>
<ExplorerFormSelect
currentlyActive={formName}
toggleFormType={toggleFormType}
/>
<TextField
value={txId || ""}
onChange={onTxId}
label="Transaction"
fullWidth
size="small"
sx={{ my: 1 }}
/>
<Button
type="submit"
variant="contained"
sx={{
display: "block",
mt: 1,
ml: "auto",
}}
>
Search
</Button>
</Box>
{txId ? <ExplorerQuery txId={txId} /> : null}
</>
);
};
export default ExplorerTxSearchForm;

View File

@ -1,146 +0,0 @@
import { Typography } from "@mui/material";
import React, { useEffect, useState } from "react";
import { chainIDStrings } from "../../utils/consts";
import { amountFormatter } from "../../utils/explorer";
import {
NotionalTransferred,
NotionalTransferredToCumulative,
Totals,
} from "./ExplorerStats";
interface ChainOverviewCardProps {
dataKey: keyof typeof chainIDStrings;
totals?: Totals;
notionalTransferred?: NotionalTransferred;
notionalTransferredToCumulative?: NotionalTransferredToCumulative;
}
const ChainOverviewCard: React.FC<ChainOverviewCardProps> = ({
dataKey,
totals,
notionalTransferred,
notionalTransferredToCumulative,
}) => {
const [totalCount, setTotalColunt] = useState<number>();
const [animate, setAnimate] = useState<boolean>(false);
useEffect(() => {
// hold values from props in state, so that we can detect changes and add animation class
setTotalColunt(totals?.TotalCount[dataKey]);
let timeout: NodeJS.Timeout;
if (
totals?.TotalCount[dataKey] &&
totalCount !== totals?.TotalCount[dataKey]
) {
setAnimate(true);
timeout = setTimeout(() => {
setAnimate(false);
}, 2000);
}
return function cleanup() {
if (timeout) {
clearTimeout(timeout);
}
};
}, [
totals?.TotalCount[dataKey],
dataKey,
totalCount,
]);
const centerStyles: any = {
display: "flex",
justifyContent: "flex-start",
alignItems: "center",
flexDirection: "column",
};
// prevent an exception if data is missing (ie. new chain)
if (
!notionalTransferredToCumulative ||
!(dataKey in notionalTransferredToCumulative.AllTime) ||
!("*" in notionalTransferredToCumulative.AllTime[dataKey])
) {
return <>coming soon</>
}
return (
<>
<div style={{ ...centerStyles, gap: 8 }}>
{notionalTransferredToCumulative &&
notionalTransferredToCumulative.AllTime && (
<div style={centerStyles}>
<div>
<Typography
variant="h5"
className={animate ? "highlight-new-val" : ""}
>
$
{amountFormatter(
notionalTransferredToCumulative.AllTime[dataKey]["*"]
)}
</Typography>
</div>
<div style={{ marginTop: -10 }}>
<Typography variant="caption">received</Typography>
</div>
</div>
)}
{notionalTransferred &&
notionalTransferred.WithinPeriod &&
dataKey in notionalTransferred.WithinPeriod &&
"*" in notionalTransferred.WithinPeriod[dataKey] &&
"*" in notionalTransferred.WithinPeriod[dataKey]["*"] &&
notionalTransferred.WithinPeriod[dataKey]["*"]["*"] > 0 ? (
<div style={centerStyles}>
<div>
<Typography
variant="h5"
className={animate ? "highlight-new-val" : ""}
>
{notionalTransferred.WithinPeriod[dataKey]["*"]["*"]
? "$" +
amountFormatter(
notionalTransferred.WithinPeriod[dataKey]["*"]["*"]
)
: "..."}
</Typography>
</div>
<div style={{ marginTop: -10 }}>
<Typography variant="caption">sent</Typography>
</div>
</div>
) : (
<div style={centerStyles}>
<div>
<Typography variant="h5">
<span style={{ fontSize: "75%", verticalAlign: 'middle' }}>Coming Soon</span>
</Typography>
</div>
<div style={{ marginTop: -10 }}>
<Typography variant="caption">sent</Typography>
</div>
</div>
)}
{!!totalCount && (
<div style={centerStyles}>
<div>
<Typography
variant="h5"
className={animate ? "highlight-new-val" : ""}
>
{amountFormatter(totalCount)}
</Typography>
</div>
<div style={{ marginTop: -10 }}>
<Typography variant="caption"> messages </Typography>
</div>
</div>
)}
</div>
{totalCount === 0 && <Typography variant="h6">coming soon</Typography>}
</>
);
};
export default ChainOverviewCard;

View File

@ -1,145 +0,0 @@
import React, { useEffect, useState } from "react";
import { Totals } from "./ExplorerStats";
import { ResponsiveBar, BarDatum } from "@nivo/bar";
import {
chainColors,
chainIdColors,
makeDate,
makeGroupName,
} from "../../utils/explorer";
import { useNetworkContext } from "../../contexts/NetworkContext";
import { chainEnums } from "../../utils/consts";
import { Typography } from "@mui/material";
interface DailyCountProps {
dailyCount: Totals["DailyTotals"];
showBottomLedgend?: boolean;
}
const DailyCountBarChart = (props: DailyCountProps) => {
const { activeNetwork } = useNetworkContext();
const [data, setData] = useState<Array<BarDatum>>([]);
useEffect(() => {
const datum = Object.keys(props.dailyCount).reduce<Array<BarDatum>>(
(accum, date) => {
const chains = props.dailyCount[date];
return [
...accum,
Object.keys(chains).reduce<BarDatum>(
(subAccum, chain) => {
const group = makeGroupName(chain, activeNetwork);
return {
...subAccum,
[group]: chains[chain],
};
},
{ date: date }
),
];
},
[]
);
setData(datum);
}, [props.dailyCount, activeNetwork]);
const keys = chainEnums.slice(1);
const today = new Date().toISOString().slice(0, 10);
return (
<div style={{ height: 400, minWidth: 360, flex: "1", marginBottom: 40 }}>
<Typography variant="subtitle1" gutterBottom>Messages/Day</Typography>
<ResponsiveBar
theme={{ textColor: "rgba(255, 255, 255, 0.85)" }}
data={data}
keys={keys}
colors={chainIdColors.slice(1)}
groupMode="stacked"
indexBy="date"
margin={{
top: 10,
right: 0,
bottom: props.showBottomLedgend ? 80 : 24,
left: 40,
}}
padding={0.3}
valueScale={{ type: "linear" }}
indexScale={{ type: "band", round: true }}
borderColor={{ from: "color", modifiers: [["darker", 1.6]] }}
axisTop={null}
axisRight={null}
axisBottom={{
format: (value) => {
if (value === today) {
return "today";
}
return makeDate(value);
},
}}
labelSkipWidth={12}
labelSkipHeight={12}
labelTextColor={{ from: "color", modifiers: [["darker", 3]] }}
tooltip={(data) => {
let { id, value, indexValue } = data;
return (
<div
style={{
background: "#827db8",
borderRadius: "14px",
padding: "9px 12px",
border: "1px solid rgba(255, 255, 255, 0.85)",
color: "rgba(255, 255, 255, 0.85)",
fontSize: 14,
}}
>
<Typography
variant="subtitle1"
style={{ color: "rgba(255, 255, 255, 0.85)" }}
>
{id} - {makeDate(String(indexValue))}
</Typography>
<div
style={{
display: "flex",
padding: "3px 0",
justifyContent: "flex-end",
}}
>
<span>{value} messages</span>
</div>
</div>
);
}}
/>
{props.showBottomLedgend && (
<div
style={{
display: "flex",
justifyContent: "space-evenly",
width: "100%",
}}
>
{chainEnums.slice(1).map((chain, index) => (
<div key={chain} style={{ display: "flex", alignItems: "center" }}>
<div
style={{
background: chainColors[String(index + 1)],
height: 16,
width: 16,
display: "inline-block",
}}
/>
&nbsp;
<span>{chain}</span>
</div>
))}
</div>
)}
</div>
);
};
export default DailyCountBarChart;

View File

@ -1,146 +0,0 @@
import React, { useEffect, useState } from 'react';
import { NotionalTransferredTo } from './ExplorerStats';
import { Typography } from '@mui/material';
import { ResponsiveBar, BarDatum } from '@nivo/bar'
import { makeDate, makeGroupName, chainColors, amountFormatter, usdFormatter, chainIdColors } from "../../utils/explorer"
import { useNetworkContext } from '../../contexts/NetworkContext';
import { chainEnums, } from '../../utils/consts';
function findMaxBoundOfIQR(array: number[]): number {
if (array.length < 4) {
array.sort((a, b) => a - b)
return array[0]
}
let values, q1, q3, iqr, maxValue: number
values = array.slice().sort((a, b) => a - b);//copy array fast and sort
if ((values.length / 4) % 1 === 0) {//find quartiles
q1 = 1 / 2 * (values[(values.length / 4)] + values[(values.length / 4) + 1]);
q3 = 1 / 2 * (values[(values.length * (3 / 4))] + values[(values.length * (3 / 4)) + 1]);
} else {
q1 = values[Math.floor(values.length / 4 + 1)];
q3 = values[Math.ceil(values.length * (3 / 4) + 1)];
}
iqr = q3 - q1;
maxValue = q3 + iqr * 1.5;
return maxValue
}
interface DailyCountProps {
daily: NotionalTransferredTo["Daily"]
}
const DailyNotionalBarChart = (props: DailyCountProps) => {
const { activeNetwork } = useNetworkContext()
const [barData, setBarData] = useState<Array<BarDatum>>([])
const [max, setMax] = useState<number>()
useEffect(() => {
// create a list of all data points in order to calculate min/max bounds of chart
const all: number[] = []
const data = Object.keys(props.daily).reduce<Array<BarDatum>>((accum, date) => {
const chains = props.daily[date]
return [...accum, Object.keys(chains).reduce<BarDatum>((subAccum, chain) => {
if (chain === "*") {
return subAccum
}
const group = makeGroupName(chain, activeNetwork)
// const group = chain
all.push(chains[chain]["*"])
return {
...subAccum,
[group]: chains[chain]["*"],
}
}, { "date": date })]
}, [])
// create a max value for the y axis, in order to exclude outliers so the chart looks nice.
let max = findMaxBoundOfIQR(all)
setMax(max)
setBarData(data)
}, [props.daily, activeNetwork])
const keys = chainEnums.slice(1)
const today = new Date().toISOString().slice(0, 10)
return (
<div style={{ height: 400, minWidth: 360, flex: '1', marginBottom: 40 }}>
<Typography variant="subtitle1" gutterBottom>Value Received (USD)</Typography>
<ResponsiveBar
theme={{ textColor: "rgba(255, 255, 255, 0.85)" }}
colors={chainIdColors.slice(1)}
data={barData}
keys={keys}
enableLabel={false}
groupMode="grouped"
indexBy="date"
margin={{
top: 10,
right: 0,
bottom: 24,
left: 40,
}}
padding={0.3}
valueScale={{ type: 'linear' }}
indexScale={{ type: 'band', round: true }}
borderColor={{ from: 'color', modifiers: [['darker', 1.6]] }}
axisTop={null}
axisRight={null}
axisLeft={{
format: (value) => amountFormatter(Number(value))
}}
axisBottom={{
format: (value) => {
if (value === today) {
return "today"
}
return makeDate(value)
}
}}
tooltip={(data) => {
let { id, value, indexValue, } = data
return (
<div
style={{
background: '#010114',
padding: '9px 12px',
border: '1px solid rgba(255, 255, 255, 0.85)',
color: "rgba(255, 255, 255, 0.85)",
fontSize: 14
}}
>
<Typography variant="subtitle1" style={{ color: 'rgba(255, 255, 255, 0.85)' }}>{id} - {makeDate(String(indexValue))}</Typography>
<div
style={{
display: 'flex',
padding: '3px 0',
justifyContent: 'flex-end',
}}
>
{usdFormatter.format(Number(value))} received
</div>
</div>
)
}}
/>
</div>
)
}
export default DailyNotionalBarChart

View File

@ -1,683 +0,0 @@
import { Box, Card, CircularProgress } from "@mui/material";
import React, { useEffect, useState } from "react";
import { useNetworkContext } from "../../contexts/NetworkContext";
import { ChainID } from "../../utils/consts";
import { contractNameFormatter } from "../../utils/explorer";
import { BigTableMessage } from "../ExplorerSearch/ExplorerQuery";
import RecentMessages from "./RecentMessages";
import ChainOverviewCard from "./ChainOverviewCard";
import PastWeekCard from "./PastWeekCard";
import binanceChainIcon from "../../images/bsc.svg";
import ethereumIcon from "../../images/eth.svg";
import solanaIcon from "../../images//solana.svg";
import terraIcon from "../../images/terra.svg";
import polygonIcon from "../../images/polygon.svg";
import avalancheIcon from "../../images/avalanche.svg";
import oasisIcon from "../../images/oasis.svg";
import fantomIcon from "../../images/fantom.svg"
import GridWithCards from "../GridWithCards";
import { explorer } from "../../utils/urls";
export interface Totals {
LastDayCount: { [groupByKey: string]: number };
TotalCount: { [groupByKey: string]: number };
DailyTotals: {
// "2021-08-22": { "*": 0 },
[date: string]: { [groupByKey: string]: number };
};
}
// type GroupByKey = "*" | "emitterChain" | "emitterChain:emitterAddress"
export interface Recent {
[groupByKey: string]: Array<BigTableMessage>;
}
interface BidirectionalTransferData {
[leavingChainId: string]: {
[destinationChainId: string]: {
[tokenSymbol: string]: number;
};
};
}
export interface NotionalTransferred {
Last24Hours: BidirectionalTransferData;
WithinPeriod: BidirectionalTransferData;
PeriodDurationDays: Number;
Daily: {
[date: string]: BidirectionalTransferData;
};
}
interface DirectionalTransferData {
[chainId: string]: {
[tokenSymbol: string]: number;
};
}
export interface NotionalTransferredTo {
Last24Hours: DirectionalTransferData;
WithinPeriod: DirectionalTransferData;
PeriodDurationDays: Number;
Daily: {
[date: string]: DirectionalTransferData;
};
}
export interface NotionalTransferredToCumulative {
AllTime: DirectionalTransferData;
AllTimeDurationDays: Number;
Daily: {
[date: string]: DirectionalTransferData;
};
}
interface LockedAsset {
Symbol: string
Name: string
Address: string
CoinGeckoId: string
Amount: number
Notional: number
TokenPrice: number
}
interface LockedAssets {
[tokenAddress: string]: LockedAsset
}
interface ChainsAssets {
[chainId: string]: LockedAssets
}
export interface NotionalTvl {
Last24HoursChange: ChainsAssets
AllTime: ChainsAssets
}
type GroupBy = undefined | "chain" | "address";
type ForChain = undefined | StatsProps["emitterChain"];
type ForAddress = undefined | StatsProps["emitterAddress"];
interface StatsProps {
emitterChain?: number;
emitterAddress?: string;
}
const ExplorerStats: React.FC<StatsProps> = ({
emitterChain,
emitterAddress,
}) => {
const { activeNetwork } = useNetworkContext();
const [totals, setTotals] = useState<Totals>();
const [recent, setRecent] = useState<Recent>();
const [notionalTransferred, setNotionalTransferred] =
useState<NotionalTransferred>();
const [notionalTransferredTo, setNotionalTransferredTo] =
useState<NotionalTransferredTo>();
const [notionalTransferredToCumulative, setNotionalTransferredToCumulative] =
useState<NotionalTransferredToCumulative>();
const [address, setAddress] = useState<StatsProps["emitterAddress"]>();
const [chain, setChain] = useState<StatsProps["emitterChain"]>();
const [lastFetched, setLastFetched] = useState<number>();
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout>();
const [controller, setController] = useState<AbortController>(
new AbortController()
);
const launchDate = new Date("2021-09-13T00:00:00.000+00:00");
// calculate the time difference between now and the launch day
const differenceInTime = new Date().getTime() - launchDate.getTime();
// calculate the number of days, rounding up
const daysSinceDataStart = Math.ceil(differenceInTime / (1000 * 3600 * 24));
const fetchTotals = (
baseUrl: string,
groupBy: GroupBy,
forChain: ForChain,
forAddress: ForAddress,
signal: AbortSignal
) => {
const totalsUrl = `${baseUrl}totals`;
let url = `${totalsUrl}?&daily=true`
if (groupBy) {
url = `${url}&groupBy=${groupBy}`;
}
if (forChain) {
url = `${url}&forChain=${forChain}`;
}
if (forAddress) {
url = `${url}&forAddress=${forAddress}`;
}
return fetch(url, { signal })
.then<Totals>((res) => {
if (res.ok) return res.json();
// throw an error with specific message, rather than letting the json decoding throw.
throw "explorer.stats.failedFetchingTotals";
})
.then(
(result) => {
setTotals(result);
setLastFetched(Date.now());
},
(error) => {
if (error.name !== "AbortError") {
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
console.error("failed fetching totals. error: ", error);
}
}
);
};
const fetchRecent = (
baseUrl: string,
groupBy: GroupBy,
forChain: ForChain,
forAddress: ForAddress,
signal: AbortSignal
) => {
const recentUrl = `${baseUrl}recent`;
let numRows = 10
if (forChain) {
numRows = 30
}
if (forAddress) {
numRows = 80
}
let url = `${recentUrl}?numRows=${numRows}`;
if (groupBy) {
url = `${url}&groupBy=${groupBy}`;
}
if (forChain) {
url = `${url}&forChain=${forChain}`;
}
if (forAddress) {
url = `${url}&forAddress=${forAddress}`;
}
return fetch(url, { signal })
.then<Recent>((res) => {
if (res.ok) return res.json();
// throw an error with specific message, rather than letting the json decoding throw.
throw "explorer.stats.failedFetchingRecent";
})
.then(
(result) => {
setRecent(result);
setLastFetched(Date.now());
},
(error) => {
if (error.name !== "AbortError") {
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
console.error("failed fetching recent. error: ", error);
}
}
);
};
const fetchTransferred = (
baseUrl: string,
groupBy: GroupBy,
forChain: ForChain,
forAddress: ForAddress,
signal: AbortSignal
) => {
const transferredUrl = `${baseUrl}notionaltransferred`;
let url = `${transferredUrl}?forPeriod=true&numDays=${daysSinceDataStart}`;
if (groupBy) {
url = `${url}&groupBy=${groupBy}`;
}
if (forChain) {
url = `${url}&forChain=${forChain}`;
}
if (forAddress) {
url = `${url}&forAddress=${forAddress}`;
}
if (groupBy === "address" || forChain || forAddress) {
return Promise.resolve();
}
return fetch(url, { signal })
.then<NotionalTransferred>((res) => {
if (res.ok) return res.json();
// throw an error with specific message, rather than letting the json decoding throw.
throw "explorer.stats.failedFetchingTransferred";
})
.then(
(result) => {
setNotionalTransferred(result);
setLastFetched(Date.now());
},
(error) => {
if (error.name !== "AbortError") {
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
console.error("failed fetching transferred to. error: ", error);
}
}
);
};
const fetchTransferredTo = (
baseUrl: string,
groupBy: GroupBy,
forChain: ForChain,
forAddress: ForAddress,
signal: AbortSignal
) => {
const transferredUrl = `${baseUrl}notionaltransferredto`;
let url = `${transferredUrl}?forPeriod=true&daily=true&numDays=${daysSinceDataStart}`;
if (groupBy) {
url = `${url}&groupBy=${groupBy}`;
}
if (forChain) {
url = `${url}&forChain=${forChain}`;
}
if (forAddress) {
url = `${url}&forAddress=${forAddress}`;
}
if (groupBy === "address" || forChain || forAddress) {
return Promise.resolve();
}
return fetch(url, { signal })
.then<NotionalTransferredTo>((res) => {
if (res.ok) return res.json();
// throw an error with specific message, rather than letting the json decoding throw.
throw "explorer.stats.failedFetchingTransferredTo";
})
.then(
(result) => {
setNotionalTransferredTo(result);
setLastFetched(Date.now());
},
(error) => {
if (error.name !== "AbortError") {
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
console.error("failed fetching transferred to. error: ", error);
}
}
);
};
const fetchTransferredToCumulative = (
baseUrl: string,
groupBy: GroupBy,
forChain: ForChain,
forAddress: ForAddress,
signal: AbortSignal
) => {
const transferredToUrl = `${baseUrl}notionaltransferredtocumulative`;
let url = `${transferredToUrl}?allTime=true`
if (groupBy) {
url = `${url}&groupBy=${groupBy}`;
}
if (forChain) {
url = `${url}&forChain=${forChain}`;
}
if (forAddress) {
url = `${url}&forAddress=${forAddress}`;
}
if (groupBy === "address" || forChain || forAddress) {
return Promise.resolve();
}
return fetch(url, { signal })
.then<NotionalTransferredToCumulative>((res) => {
if (res.ok) return res.json();
// throw an error with specific message, rather than letting the json decoding throw.
throw "explorer.stats.failedFetchingTransferredTo";
})
.then(
(result) => {
// let today = "2021-12-03"
// let { [today]: t, ...dailies } = result.Daily
// let r = { ...result, Daily: dailies }
// setNotionalTransferredTo(r)
setNotionalTransferredToCumulative(result);
setLastFetched(Date.now());
},
(error) => {
if (error.name !== "AbortError") {
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
console.error("failed fetching transferred to. error: ", error);
}
}
);
};
const getData = (props: StatsProps, baseUrl: string, signal: AbortSignal, func: (baseUrl: string,
recentGroupBy: GroupBy,
totalsGroupBy: GroupBy,
forChain: ForChain,
forAddress: string | undefined,
signal: AbortSignal) => Promise<any>) => {
let forChain: ForChain = undefined;
let forAddress: ForAddress = undefined;
let recentGroupBy: GroupBy = undefined;
let totalsGroupBy: GroupBy = "chain";
if (props.emitterChain) {
forChain = props.emitterChain;
totalsGroupBy = "address";
recentGroupBy = "address";
}
if (props.emitterChain && props.emitterAddress) {
forAddress = props.emitterAddress;
}
return func(baseUrl, recentGroupBy, totalsGroupBy, forChain, forAddress, signal)
};
const getAllEndpoints = (
baseUrl: string,
recentGroupBy: GroupBy,
totalsGroupBy: GroupBy,
forChain: ForChain,
forAddress: string | undefined,
signal: AbortSignal) => {
return Promise.all([
fetchTotals(baseUrl, totalsGroupBy, forChain, forAddress, signal),
fetchRecent(baseUrl, recentGroupBy, forChain, forAddress, signal),
fetchTransferred(baseUrl, recentGroupBy, forChain, forAddress, signal),
fetchTransferredTo(baseUrl, recentGroupBy, forChain, forAddress, signal),
fetchTransferredToCumulative(
baseUrl,
recentGroupBy,
forChain,
forAddress,
signal
),
]);
};
const getRecents = (
baseUrl: string,
recentGroupBy: GroupBy,
totalsGroupBy: GroupBy,
forChain: ForChain,
forAddress: string | undefined,
signal: AbortSignal) => fetchRecent(baseUrl, recentGroupBy, forChain, forAddress, signal)
const pollingController = (
emitterChain: StatsProps["emitterChain"],
emitterAddress: StatsProps["emitterAddress"],
baseUrl: string,
) => {
// clear any ongoing intervals
if (pollInterval) {
clearInterval(pollInterval);
setPollInterval(undefined);
}
// abort any in-flight requests
controller.abort();
// create a new controller for the new fetches, add it to state
const newController = new AbortController();
setController(newController);
// create a signal for requests
const { signal } = newController;
// start polling
let interval = setInterval(() => {
getData({ emitterChain, emitterAddress }, baseUrl, signal, getRecents);
}, 30000);
setPollInterval(interval);
};
useEffect(() => {
// getData if first load (no totals or recents), or emitterAddress/emitterChain changed.
if (
(!totals && !recent) ||
emitterAddress !== address ||
emitterChain !== chain
) {
const newController = new AbortController();
setController(newController);
getData(
{ emitterChain, emitterAddress },
activeNetwork.endpoints.bigtableFunctionsBase,
newController.signal,
getAllEndpoints
);
}
setTotals(undefined);
setRecent(undefined);
setNotionalTransferred(undefined);
setNotionalTransferredTo(undefined);
setNotionalTransferredToCumulative(undefined);
pollingController(
emitterChain,
emitterAddress,
activeNetwork.endpoints.bigtableFunctionsBase
);
// hold chain & address in state to detect changes
setChain(emitterChain);
setAddress(emitterAddress);
}, [
emitterChain,
emitterAddress,
activeNetwork.endpoints.bigtableFunctionsBase,
]);
useEffect(() => {
return function cleanup() {
controller.abort();
if (pollInterval) {
clearInterval(pollInterval);
}
};
}, [pollInterval, activeNetwork.endpoints.bigtableFunctionsBase]);
let title = "Recent messages";
let hideTableTitles = false;
if (emitterChain) {
title = `Recent ${ChainID[Number(emitterChain)]} messages`;
}
return (
<>
{!totals && !recent ? (
<Card
sx={{
backgroundColor: "rgba(255,255,255,.07)",
backgroundImage: "none",
borderRadius: "28px",
padding: "24px",
textAlign: "center",
mt: 5,
}}
>
<CircularProgress />
</Card>
) : (
<>
{recent && (
<div style={{ margin: "40px 0" }}>
<RecentMessages
recent={recent}
lastFetched={lastFetched}
title={title}
hideTableTitles={hideTableTitles}
/>
</div>
)}
{!emitterChain && !emitterAddress ? (
totals && notionalTransferredToCumulative && notionalTransferred ? (
<GridWithCards
spacing={3}
sm={6}
md={3}
cardPaddingTop={3}
imgAlignMd="center"
imgOffsetRightMd="0px"
imgOffsetTopXs="0px"
imgOffsetTopMd="-36px"
imgOffsetTopMdHover="-52px"
imgPaddingBottomXs={3}
headerTextAlign="center"
data={[
{
header: ChainID[1],
src: solanaIcon,
to: `${explorer}?emitterChain=1`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="1"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[2],
src: ethereumIcon,
to: `${explorer}?emitterChain=2`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="2"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[3],
src: terraIcon,
to: `${explorer}?emitterChain=3`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="3"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[4],
src: binanceChainIcon,
to: `${explorer}?emitterChain=4`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="4"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[5],
src: polygonIcon,
to: `${explorer}?emitterChain=5`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="5"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[6],
src: avalancheIcon,
to: `${explorer}?emitterChain=6`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="6"
/>
),
imgStyle: { height: 110 },
},
{
header: ChainID[7],
src: oasisIcon,
to: `${explorer}?emitterChain=7`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="7"
/>
),
imgStyle: { height: 110 },
}
].concat(
// check the we have transfer data before adding the fantom card
("10" in notionalTransferredToCumulative.AllTime) &&
("*" in notionalTransferredToCumulative.AllTime["10"]) ?
[{
header: ChainID[10],
src: fantomIcon,
to: `${explorer}?emitterChain=10`,
description: (
<ChainOverviewCard
totals={totals}
notionalTransferredToCumulative={
notionalTransferredToCumulative
}
notionalTransferred={notionalTransferred}
dataKey="10"
/>
),
imgStyle: { height: 110 },
}] : []
)}
/>
) : (
<Box
sx={{
padding: "24px",
textAlign: "center",
}}
>
<CircularProgress />
</Box>
)
) : null}
<div style={{ margin: "40px 0" }}>
{!emitterChain && !emitterAddress ? (
notionalTransferredTo && totals ? (
<PastWeekCard
title="Last 7 Days"
numDaysToShow={7}
messages={totals}
notionalTransferredTo={notionalTransferredTo}
notionalTransferred={notionalTransferred}
/>
) : (
<Card
sx={{
backgroundColor: "rgba(255,255,255,.07)",
backgroundImage: "none",
borderRadius: "28px",
padding: "24px",
textAlign: "center",
}}
>
<CircularProgress />
</Card>
)
) : null}
</div>
</>
)}
</>
);
};
export default ExplorerStats;

View File

@ -1,109 +0,0 @@
import { Box, Card, Typography } from "@mui/material";
import React from "react";
import { chainEnums, chainIDs } from "../../utils/consts";
import { chainColors } from "../../utils/explorer";
import DailyCountBarChart from "./DailyCountBarChart";
import DailyNotionalBarChart from "./DailyNotionalBarChart";
import {
NotionalTransferred,
NotionalTransferredTo,
Totals,
} from "./ExplorerStats";
interface PastWeekCardProps {
title: string;
messages: Totals;
numDaysToShow: number;
notionalTransferred?: NotionalTransferred;
notionalTransferredTo: NotionalTransferredTo;
}
const PastWeekCard: React.FC<PastWeekCardProps> = ({
title,
messages,
numDaysToShow,
notionalTransferredTo,
}) => {
const dates = [...Array(numDaysToShow)]
.map((_, i) => {
const d = new Date();
d.setDate(d.getDate() - i);
return d;
})
.map((d) => {
const isoStr = d.toISOString();
return isoStr.slice(0, 10);
})
.reverse();
let messagesForPeriod = dates
.filter((date) => messages && date in messages?.DailyTotals)
.reduce<{ [date: string]: { [groupByKey: string]: number } }>(
(accum, key) => ({ ...accum, [key]: messages.DailyTotals[key] }),
Object()
);
let notionalTransferredToInPeriod = dates
.filter((date) => date in notionalTransferredTo.Daily)
.reduce<NotionalTransferredTo["Daily"]>(
(accum, key) => ((accum[key] = notionalTransferredTo.Daily[key]), accum),
Object()
);
return (
<Card
sx={{
backgroundColor: "rgba(255,255,255,.07)",
backgroundImage: "none",
borderRadius: "28px",
padding: "24px",
}}
>
<Typography variant="h4" gutterBottom>
{title}
</Typography>
<div
style={{
display: "flex",
justifyContent: "space-evenly",
alignItems: "center",
flexWrap: "wrap",
gap: 16,
marginBottom: 10,
}}
>
<DailyCountBarChart dailyCount={messagesForPeriod} />
<DailyNotionalBarChart daily={notionalTransferredToInPeriod} />
</div>
<div
style={{
display: "flex",
flexWrap: "wrap",
justifyContent: "space-evenly",
width: "100%",
}}
>
{Object.values(chainIDs).map((chainId) => (
<Box
key={chainId}
sx={{ display: "flex", alignItems: "center", mx: 1 }}
>
<div
style={{
background: chainColors[String(chainId)],
height: 12,
width: 12,
display: "inline-block",
}}
/>
<div>&nbsp;{chainEnums[chainId]}</div>
</Box>
))}
</div>
</Card>
);
};
export default PastWeekCard;

View File

@ -1,230 +0,0 @@
import React from "react";
import { Link as RouterLink } from "gatsby";
import { Recent } from "./ExplorerStats";
import ReactTimeAgo from "react-time-ago";
import {
Box,
Card,
Link,
Table,
TableBody,
TableCell,
TableContainer,
TableFooter,
TableHead,
TableRow,
Typography,
} from "@mui/material";
import { contractNameFormatter } from "../../utils/explorer";
import { ChainID, chainIDs } from "../../utils/consts";
import { formatQuorumDate } from "../../utils/time";
import { explorer } from "../../utils/urls";
import ChainIcon from "../ChainIcon";
import { DecodePayload } from "../DecodePayload";
interface RecentMessagesProps {
recent: Recent;
lastFetched?: number;
title: string;
hideTableTitles?: boolean;
}
const RecentMessages = (props: RecentMessagesProps) => {
// const columns: ColumnsType<BigTableMessage> = [
// {
// title: "",
// key: "icon",
// render: (item: BigTableMessage) =>
// networkIcons[chainIDs[item.EmitterChain]],
// responsive: ["sm"],
// },
// {
// title: "contract",
// key: "contract",
// render: (item: BigTableMessage) => {
// const name = contractNameFormatter(
// item.EmitterAddress,
// chainIDs[item.EmitterChain]
// );
// return <div>{name}</div>;
// },
// responsive: ["sm"],
// },
// {
// title: "message",
// key: "payload",
// render: (item: BigTableMessage) =>
// item.SignedVAABytes ? (
// <DecodePayload
// base64VAA={item.SignedVAABytes}
// emitterChainName={item.EmitterChain}
// emitterAddress={item.EmitterAddress}
// showType={true}
// showSummary={true}
// transferDetails={item.TransferDetails}
// />
// ) : null,
// },
// {
// title: "sequence",
// key: "sequence",
// render: (item: BigTableMessage) => {
// let sequence = item.Sequence.replace(/^0+/, "");
// if (!sequence) sequence = "0";
// return sequence;
// },
// responsive: ["md"],
// },
// {
// title: "attested",
// dataIndex: "QuorumTime",
// key: "time",
// render: (QuorumTime) => (
// <ReactTimeAgo
// date={
// QuorumTime ? Date.parse(formatQuorumDate(QuorumTime)) : new Date()
// }
// locale={intl.locale}
// timeStyle={!screens.md ? "twitter" : "round"}
// />
// ),
// },
// {
// title: "",
// key: "view",
// render: (item: BigTableMessage) => (
// <Link
// to={`/${intl.locale}/explorer/?emitterChain=${
// chainIDs[item.EmitterChain]
// }&emitterAddress=${item.EmitterAddress}&sequence=${item.Sequence}`}
// >
// View
// </Link>
// ),
// },
// ];
const formatKey = (key: string) => {
if (props.hideTableTitles) {
return null;
}
if (key.includes(":")) {
const parts = key.split(":");
const link = `${explorer}?emitterChain=${parts[0]}&emitterAddress=${parts[1]}`;
return (
<Typography variant="subtitle1" gutterBottom>
From {ChainID[Number(parts[0])]} contract:{" "}
<Link component={RouterLink} to={link} color="inherit">
{contractNameFormatter(parts[1], Number(parts[0]))}
</Link>
</Typography>
);
} else if (key === "*") {
return (
<Typography variant="subtitle1" gutterBottom>
From all chains and addresses
</Typography>
);
} else {
return (
<Typography variant="subtitle1" gutterBottom>
From {ChainID[Number(key)]}
</Typography>
);
}
};
return (
<Card
sx={{
backgroundColor: "rgba(255,255,255,.07)",
backgroundImage: "none",
borderRadius: "28px",
padding: "24px",
}}
>
<Typography variant="h4" gutterBottom>
{props.title}
</Typography>
{Object.keys(props.recent).map((key) => (
<TableContainer key={key}>
{formatKey(key)}
<Table size="small">
<TableBody>
{props.recent[key].map((item) => (
<TableRow key={item.EmitterAddress + item.Sequence}>
<TableCell>
<ChainIcon chainId={chainIDs[item.EmitterChain]} />
</TableCell>
<TableCell>
{contractNameFormatter(
item.EmitterAddress,
chainIDs[item.EmitterChain]
)}
</TableCell>
<TableCell sx={{ whiteSpace: "nowrap" }}>
{item.SignedVAABytes
? <DecodePayload
base64VAA={item.SignedVAABytes}
emitterChainName={item.EmitterChain}
emitterAddress={item.EmitterAddress}
showType={true}
showSummary={true}
transferDetails={item.TransferDetails}
/> : null}
</TableCell>
<TableCell sx={{ whiteSpace: "nowrap" }}>
{item.Sequence.replace(/^0+/, "") || "0"}
</TableCell>
<TableCell sx={{ "& > time": { whiteSpace: "nowrap" } }}>
{
<ReactTimeAgo
date={
item.QuorumTime
? Date.parse(formatQuorumDate(item.QuorumTime))
: new Date()
}
timeStyle={"round"}
/>
}
</TableCell>
<TableCell>
<Link
component={RouterLink}
to={`${explorer}?emitterChain=${
chainIDs[item.EmitterChain]
}&emitterAddress=${item.EmitterAddress}&sequence=${
item.Sequence
}`}
color="inherit"
>
View
</Link>
</TableCell>
</TableRow>
))}
</TableBody>
<TableFooter>
<TableRow>
<TableCell
colSpan={6}
sx={{ textAlign: "right", borderBottom: "none" }}
>
{props.lastFetched ? (
<ReactTimeAgo
date={new Date(props.lastFetched)}
timeStyle="round"
/>
) : null}
</TableCell>
</TableRow>
</TableFooter>
</Table>
</TableContainer>
))}
</Card>
);
};
export default RecentMessages;

View File

@ -1,309 +0,0 @@
import { Box, IconButton, Link, Typography } from "@mui/material";
import { Link as RouterLink } from "gatsby";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import React, { useEffect } from "react";
import Discord from "../images/Discord.svg";
import shape from "../images/footer/shape.svg";
import Github from "../images/Github.svg";
import Medium from "../images/Medium.svg";
import Telegram from "../images/Telegram.svg";
import Twitter from "../images/Twitter.svg";
import {
apps,
blog,
buidl,
brand,
discord,
docs,
explorer,
github,
jobs,
network,
portal,
telegram,
twitter,
} from "../utils/urls";
import LogoLink from "./LogoLink";
const linkStyle = {
display: "block",
mr: { xs: 0, md: 7.5 },
mb: 1.5,
fontSize: 14,
textUnderlineOffset: 6,
};
const linkActiveStyle = { textDecoration: "underline" };
const socialIcon = {
"& img": {
height: 24,
width: 24,
},
};
const Footer = () => {
const shapeLeftf = React.useRef<HTMLCanvasElement>(null);
useEffect(() => {
gsap.registerPlugin(ScrollTrigger);
var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
if (viewportWidth > 992) {
gsap.from(shapeLeftf.current, {
y: 200,
x: 200,
ease: "Power3.easeOut",
scrollTrigger: {
trigger: shapeLeftf.current,
start: "60% 100%",
scrub: 1
},
})
}
}, [])
return (
<Box sx={{ position: "relative" }}>
<Box
ref={shapeLeftf}
sx={{
position: "absolute",
zIndex: -1,
transform: { xs: "translate(none)", md: "translate(-50%, 0%)" },
background: `url(${shape})`,
backgroundRepeat: "no-repeat",
backgroundPosition: { xs: "center center", md: "right top -426px" },
width: "100%",
height: { xs: "100%", md: 540 },
bottom:0
}}
/>
<Box
sx={{
position: "absolute",
zIndex: -2,
top: '-30%',
background: 'radial-gradient(closest-side at 50% 50%, #5189C8 0%, #5189C800 100%) ',
transform: 'matrix(0.67, 0.74, -0.74, 0.67, 0, 0)',
left: '-5%',
width: 1136,
height: 1489,
pointerEvents: 'none',
display:{xs: 'none', md: 'block'},
opacity: 0.7,
}}
/>
<Box
sx={{
maxWidth: 1100,
mx: "auto",
pt: 21.5,
pb: { xs: 6.5, md: 12 },
}}
>
<Box
sx={{
display: "flex",
flexWrap: { xs: null, md: "wrap" },
flexDirection: { xs: "column", md: "row" },
alignItems: { xs: "center", md: "unset" },
mx: 3.5,
borderTop: "1px solid #585587",
pt: 7,
}}
>
<Box
sx={{
pl: { xs: 0, md: 2 },
pb: 2,
borderTop: { xs: "1px solid #585587", md: "none" },
pt: { xs: 7, md: 0 },
width: { xs: "100%", md: "auto" },
textAlign: { xs: "center", md: "left" },
}}
>
<LogoLink negMt />
</Box>
<Box sx={{ flexGrow: 1 }} />
<Box
sx={{
pl: { xs: 0, md: 2 },
order: { xs: -2, md: 0 },
textAlign: { xs: "center", md: "left" },
mb: { xs: 7, md: 0 },
}}
>
<Box
sx={{
display: "flex",
flexDirection: { xs: "column", md: "row" },
}}
>
<Box>
<Link
component={RouterLink}
to={apps}
color="inherit"
underline="hover"
sx={linkStyle}
activeStyle={linkActiveStyle}
>
Apps
</Link>
<Link
href={portal}
color="inherit"
underline="hover"
sx={linkStyle}
>
Portal
</Link>
<Link
component={RouterLink}
to={buidl}
color="inherit"
underline="hover"
sx={linkStyle}
activeStyle={linkActiveStyle}
>
Buidl
</Link>
<Link
href={blog}
color="inherit"
underline="hover"
sx={linkStyle}
>
Blog
</Link>
<Link
component={RouterLink}
to={brand}
color="inherit"
underline="hover"
sx={linkStyle}
>
Brand
</Link>
</Box>
<Box>
<Link
component={RouterLink}
to={network}
color="inherit"
underline="hover"
sx={linkStyle}
activeStyle={linkActiveStyle}
>
Network
</Link>
<Link
component={RouterLink}
to={explorer}
color="inherit"
underline="hover"
sx={linkStyle}
>
Explorer
</Link>
<Link
href={docs}
color="inherit"
underline="hover"
sx={linkStyle}
>
Docs
</Link>
<Link
href={jobs}
color="inherit"
underline="hover"
sx={linkStyle}
>
Jobs
</Link>
</Box>
</Box>
</Box>
<Box sx={{ flexGrow: 1 }} />
<Box
sx={{
px: 2,
order: { xs: -2, md: 0 },
textAlign: { xs: "center", md: "left" },
borderTop: { xs: "1px solid #585587", md: "none" },
pt: { xs: 7, md: 0 },
width: { xs: "100%", md: "auto" },
mb: { xs: 7, md: 0 },
}}
>
<Typography sx={{ mb: 3 }}>Let's be friends</Typography>
<Box>
<IconButton
href={discord}
target="_blank"
rel="noopener noreferrer"
sx={socialIcon}
>
<img src={Discord} alt="Discord" />
</IconButton>
<IconButton
href={github}
target="_blank"
rel="noopener noreferrer"
sx={socialIcon}
>
<img src={Github} alt="Github" />
</IconButton>
<IconButton
href={blog}
target="_blank"
rel="noopener noreferrer"
sx={socialIcon}
>
<img src={Medium} alt="Medium" />
</IconButton>
<IconButton
href={telegram}
target="_blank"
rel="noopener noreferrer"
sx={socialIcon}
>
<img src={Telegram} alt="Telegram" />
</IconButton>
<IconButton
href={twitter}
target="_blank"
rel="noopener noreferrer"
sx={socialIcon}
>
<img src={Twitter} alt="Twitter" />
</IconButton>
</Box>
</Box>
<Box
sx={{
flexBasis: "100%",
pt: { xs: 0, md: 8 },
textAlign: { xs: "center", md: "left" },
}}
>
<Typography variant="body2">
2022 &copy; Wormhole. All Rights Reserved.
</Typography>
</Box>
</Box>
</Box>
</Box>
)
}
export default Footer;

View File

@ -1,127 +0,0 @@
import { Block } from "@mui/icons-material";
import {
Card,
CardActionArea,
Grid,
GridSize,
GridSpacing,
Typography,
} from "@mui/material";
import { Box, ResponsiveStyleValue } from "@mui/system";
import { Link as RouterLink } from "gatsby";
import { OutboundLink } from "gatsby-plugin-google-gtag";
import React from "react";
interface CardData {
key?: string;
src: string;
header: string;
description: JSX.Element | string;
href?: string;
to?: string;
imgStyle?: React.CSSProperties | undefined;
size: number;
}
const GridWithCards = ({
data,
sm = 12,
md = 4,
spacing = 2,
cardPaddingTop = 0,
imgAlignMd = "right",
imgOffsetRightMd = "-16px",
imgOffsetTopXs = "-30px",
imgOffsetTopMd = "-16px",
imgOffsetTopMdHover,
imgPaddingBottomXs = 0,
imgPaddingBottomMd = 0,
headerTextAlign = "left",
}: {
data: CardData[];
sm?: boolean | GridSize | undefined;
md?: boolean | GridSize | undefined;
spacing?: ResponsiveStyleValue<GridSpacing>;
cardPaddingTop?: number;
imgAlignMd?: string;
imgOffsetRightMd?: string;
imgOffsetTopXs?: string;
imgOffsetTopMd?: string;
imgOffsetTopMdHover?: string;
imgPaddingBottomXs?: number;
imgPaddingBottomMd?: number;
headerTextAlign?: any;
}) => (
<Grid
container
spacing={spacing}
justifyContent="space-evenly"
sx={{ "& > .MuiGrid-item": { pt: { xs: 8.25, md: 5.25 } } }}
>
{data.map(({ key, src, header, description, size, href, to, imgStyle }) => (
<Grid key={key || header} item xs={12} sm={sm} md={md}>
<Card
sx={{
backgroundColor: "rgba(255,255,255,.07)",
backgroundImage: "none",
backdropFilter: 'blur(21px)',
height: "100%",
overflow: "visible",
borderRadius: "28px",
}}
>
<CardActionArea
component={to ? RouterLink : href ? OutboundLink : undefined}
to={to}
href={href}
target={href ? "_blank" : undefined}
rel={href ? "noreferrer" : undefined}
disabled={!(href || to)}
sx={{
px: 4.25,
pb: 3,
pt: cardPaddingTop,
borderRadius: "28px",
height: "100%",
display: 'flex',
flexDirection: 'column',
"& > *": {
width: '100%',
transition: { md: "300ms top" },
},
"&:hover > div": {
top: {
xs: imgOffsetTopXs,
md: imgOffsetTopMdHover || imgOffsetTopMd,
},
},
}}
>
<Box
sx={{
textAlign: { xs: "center", md: imgAlignMd },
position: "relative",
marginRight: { xs: 'auto', md: imgOffsetRightMd },
marginLeft: { xs: 'auto' },
top: { xs: imgOffsetTopXs, md: imgOffsetTopMd },
mb: { xs: imgPaddingBottomXs, md: imgPaddingBottomMd },
zIndex: 1,
width: size,
height: size,
}}
>
<img src={src} alt="" style={imgStyle} />
</Box>
<Typography variant="h4" textAlign={headerTextAlign}>{header}</Typography>
<Typography component="div" sx={{ mt: 2, flexGrow: 1 }}>
{description}
</Typography>
</CardActionArea>
</Card>
</Grid>
))}
</Grid>
);
export default GridWithCards;

View File

@ -1,28 +0,0 @@
import { Box, Typography } from "@mui/material";
import React from "react";
import AvoidBreak from "./AvoidBreak";
const HeroText = ({
heroSpans,
subtitleText,
maxWidth = 1155 + 16 * 2,
}: {
heroSpans: string[];
subtitleText: string | string[];
maxWidth?: number;
}) => (
<Box sx={{ m: "auto", maxWidth, textAlign: "center", px: 2 }}>
<Typography variant="h1">
<AvoidBreak spans={heroSpans} />
</Typography>
<Typography sx={{ marginTop: 2, fontWeight: 400 }}>
{Array.isArray(subtitleText) ? (
<AvoidBreak spans={subtitleText} />
) : (
subtitleText
)}
</Typography>
</Box>
);
export default HeroText;

View File

@ -1,13 +0,0 @@
import React from "react";
import Footer from "./Footer";
import NavBar from "./Navbar";
const Layout: React.FC = ({ children }) => (
<main style={{overflow:'hidden'}}>
<NavBar />
{children}
<Footer />
</main>
);
export default Layout;

View File

@ -1,24 +0,0 @@
import { Button } from "@mui/material";
import { Link as RouterLink } from "gatsby";
import React from "react";
import logo from "../images/logo-and-name.svg";
import { home } from "../utils/urls";
const LogoLink = ({ negMt = false }: { negMt?: boolean }) => (
<Button
size="small"
component={RouterLink}
to={home}
sx={{
display: "flex",
p: 1,
borderRadius: "8px",
ml: -1,
mt: negMt ? -1 : 0,
}}
>
<img src={logo} alt="Wormhole" />
</Button>
);
export default LogoLink;

View File

@ -1,56 +0,0 @@
import { AppBar, Hidden, Button, Box, Link, Toolbar } from "@mui/material";
import ArrowForward from "@mui/icons-material/ArrowForward";
import { Link as RouterLink } from "gatsby";
import React from "react";
import { OutboundLink } from "gatsby-plugin-google-gtag";
import hamburger from "../images/hamburger.svg";
import { apps, blog, buidl, portal } from "../utils/urls";
import LogoLink from "./LogoLink";
const linkStyle = { ml: 3, textUnderlineOffset: 6 };
const linkActiveStyle = { textDecoration: "underline" };
const NavBar = () => (
<AppBar
position="static"
sx={{ backgroundColor: "transparent" }}
elevation={0}
>
<Toolbar disableGutters sx={{ mt: 2, mx: 4 }}>
<LogoLink />
<Box sx={{ flexGrow: 1 }} />
<Box sx={{ display: { xs: "none", md: "block" } }}>
<Link
component={RouterLink}
to={apps}
color="inherit"
underline="hover"
sx={linkStyle}
activeStyle={linkActiveStyle}
>
Apps
</Link>
<Link href={portal} color="inherit" underline="hover" sx={linkStyle}>
Portal
</Link>
<Link
component={RouterLink}
to={buidl}
color="inherit"
underline="hover"
sx={linkStyle}
activeStyle={linkActiveStyle}
>
Buidl
</Link>
<Link href={blog} color="inherit" underline="hover" sx={linkStyle}>
Blog
</Link>
</Box>
{/* <Box sx={{ display: "flex", ml: 8 }}>
<img src={hamburger} alt="menu" />
</Box> */}
</Toolbar>
</AppBar>
);
export default NavBar;

View File

@ -1,31 +0,0 @@
import * as React from "react";
import { Box, MenuItem, TextField, Typography } from "@mui/material";
import { useNetworkContext } from "../contexts/NetworkContext";
import { networks } from "../utils/consts";
const NetworkSelect = () => {
const { activeNetwork, setActiveNetwork } = useNetworkContext();
const handleNetworkChange = React.useCallback((e) => {
setActiveNetwork(e.target.value);
}, []);
return (
<Box sx={{ display: "flex", alignItems: "center" }}>
<Typography variant="body2" sx={{ pr: 2 }}>
Network
</Typography>
<TextField
select
margin="none"
value={activeNetwork.name}
onChange={handleNetworkChange}
>
{networks.map((n) => (
<MenuItem key={n} value={n}>{`${n[0].toUpperCase()}${n.substring(
1
)}`}</MenuItem>
))}
</TextField>
</Box>
);
};
export default NetworkSelect;

View File

@ -1,207 +0,0 @@
import React from 'react'
import { Helmet, HelmetProps } from 'react-helmet'
import { useStaticQuery, graphql } from 'gatsby'
type Meta = ConcatArray<PropertyMetaObj | NameMetaObj>
type PropertyMetaObj = {
property: string
content: string
}
type NameMetaObj = {
name: string
content: string
}
type SEOProps = {
description?: string
meta?: Meta
title?: string
pathname?: string
} & HelmetProps
export function SEO({
children,
description = '',
meta = [],
title,
pathname,
...props
}: SEOProps) {
const { site } = useStaticQuery<QueryTypes>(SEOStaticQuery)
const siteUrl = site.siteMetadata.siteUrl
const defaultTitle = site.siteMetadata?.defaultTitle
const twitterUsername = `@wormholecrypto`
const socialImage = "/wormhole.png"
const socialImageWidth = '800'
const socialImageHeight = '400'
const image = `${siteUrl}${socialImage}`
const metaDescription = description || 'The best of blockchains'
const canonical = pathname ? `${siteUrl}${pathname}` : null
// for social sharing we want a little more context than just title,
// make a string like "Apps | Wormhole"
const socialTitle = title ? `${title} | ${defaultTitle}` : title
return (
<Helmet
{...props}
htmlAttributes={{
lang: 'en',
}}
title={title || defaultTitle}
link={[
{
rel: `apple-touch-icon`,
href: `${siteUrl}/apple-touch-icon.png`,
sizes: `180x180`,
},
{
rel: `icon`,
href: `${siteUrl}/favicon-32x32.png`,
sizes: `32x32`,
type: `image/png`,
},
{
rel: `icon`,
href: `${siteUrl}/favicon-16x16.png`,
sizes: `16x16`,
type: `image/png`,
},
{
rel: `manifest`,
href: `${siteUrl}/site.webmanifest`,
},
{
rel: `mask-icon`,
href: `${siteUrl}/safari-pinned-tab.svg`,
color: `#5bbad5`,
},
canonical
? {
rel: 'canonical',
href: canonical,
}
: {},
]}
meta={[
{
name: `description`,
content: metaDescription,
},
{
name: `msapplication-TileColor`,
content: `#603cba"`,
},
{
name: `theme-color`,
content: `#ffffff`,
},
// opengraph metadata
{
property: `og:title`,
content: socialTitle,
},
{
property: `og:description`,
content: metaDescription,
},
{
property: `og:site_name`,
content: defaultTitle, // "Wormhole" for all pages
},
{
property: `og:type`,
content: `website`,
},
canonical
? {
property: `og:url`,
content: canonical,
}
: {},
{
property: 'og:image',
content: image,
},
{
property: 'og:image:secure_url',
content: image,
},
{
property: `og:image:type`,
content: `image/png`,
},
{
property: `og:image:width`,
content: socialImageWidth,
},
{
property: `og:image:height`,
content: socialImageHeight,
},
{
property: `og:image:alt`,
content: `Wormhole logo`,
},
// twitter metadata
{
name: `twitter:title`,
content: socialTitle,
},
{
name: `twitter:description`,
content: metaDescription,
},
{
name: `twitter:image`,
content: image,
},
{
name: `twitter:image:alt`,
content: `Wormhole logo`,
},
{
name: 'twitter:card',
content: 'summary_large_image',
},
{
name: `twitter:site`,
content: twitterUsername,
},
{
name: `twitter:creator`,
content: twitterUsername,
},
]
// metadata from props
.concat(meta)}
>
{children}
</Helmet>
)
}
type QueryTypes = {
site: {
siteMetadata: {
siteUrl: string
defaultTitle: string
}
}
}
const SEOStaticQuery = graphql`
query SEO {
site {
siteMetadata {
siteUrl
defaultTitle: title
}
}
}
`

View File

@ -1,124 +0,0 @@
import React, {
createContext,
ReactChildren,
useCallback,
useContext,
useMemo,
useState,
} from "react";
import {
ChainContracts,
endpoints,
knownContractsPromise,
Network,
NetworkChains,
NetworkConfig,
networks,
} from "../utils/consts";
// Check if window is defined (so if in the browser or in node.js).
const isBrowser = typeof window !== "undefined";
let network: Network;
const envDefaultNetwork = String(process.env.GATSBY_DEFAULT_NETWORK) as Network
// check local storage to get the user's last selected network
let storedNetwork: Network = "" as Network
if (isBrowser) {
// isBrowser check for Gatsby develop's SSR
storedNetwork = String(window.localStorage.getItem("networkName")) as Network
}
// validate localstorage data, fallback to .env default, fallback to mainnet.
if (storedNetwork && networks.includes(storedNetwork)) {
// data from local storage is valid
network = storedNetwork
} else if (networks.includes(envDefaultNetwork)) {
// default network from .env is valid
network = envDefaultNetwork
} else {
// use mainnet
network = networks[2];
}
export interface ActiveNetwork {
name: string;
endpoints: NetworkConfig;
chains: ChainContracts;
}
export interface INetworkContext {
activeNetwork: ActiveNetwork;
setActiveNetwork: (network: Network) => void;
}
const NetworkContext = createContext<INetworkContext>({
activeNetwork: {
name: network,
endpoints: endpoints[network],
chains: {
// initalize empty object, will be replaced async by generated data
},
},
setActiveNetwork: (network: Network) => { },
});
export const NetworkContextProvider = ({
children,
}: {
children: ReactChildren;
}) => {
const [state, setState] = useState({
// knownContracts are generated async and added to state
knownContracts: {
devnet: {},
testnet: {},
mainnet: {},
} as NetworkChains,
activeNetwork: {
name: network,
endpoints: endpoints[network],
chains: {
// chains are generated async and added to state
},
} as ActiveNetwork,
});
const setActiveNetwork = useCallback(
(network: Network) => {
async function setNetwork(network: Network) {
if (isBrowser) {
// isBrowser check for Gatsby develop's SSR
window.localStorage.setItem("networkName", network);
}
// generate knownContracts if needed
let contracts = state.knownContracts;
if (Object.keys(state.knownContracts[network]).length === 0) {
contracts = await knownContractsPromise;
}
setState({
knownContracts: contracts,
activeNetwork: {
name: network,
endpoints: endpoints[network],
chains: contracts[network],
},
});
}
setNetwork(network)
}, [])
useMemo(() => setActiveNetwork(network), [])
return (
<NetworkContext.Provider value={{ activeNetwork: state.activeNetwork, setActiveNetwork }}>
{children}
</NetworkContext.Provider>
);
};
export const useNetworkContext = () => {
return useContext(NetworkContext);
};

Binary file not shown.

View File

@ -1,3 +0,0 @@
<svg width="26" height="19" viewBox="0 0 26 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.3967 2.10679C20.1472 0.316323 16.588 0.0128823 16.4354 0.00226469C16.3194 -0.00717259 16.2034 0.0192786 16.1034 0.0779529C16.0033 0.136627 15.9242 0.224619 15.877 0.329735C15.8091 0.48074 15.7515 0.636067 15.7046 0.794675C17.1928 1.04335 19.0207 1.5435 20.6745 2.55832C20.7376 2.59703 20.7924 2.64765 20.8357 2.70728C20.879 2.76692 20.91 2.8344 20.9269 2.90588C20.9438 2.97736 20.9464 3.05144 20.9343 3.12388C20.9223 3.19633 20.896 3.26572 20.8568 3.3281C20.8177 3.39047 20.7665 3.44462 20.7061 3.48743C20.6458 3.53025 20.5776 3.5609 20.5053 3.57763C20.433 3.59437 20.358 3.59686 20.2848 3.58497C20.2115 3.57307 20.1413 3.54703 20.0782 3.50832C17.2352 1.76311 13.6845 1.6765 13 1.6765C12.3161 1.6765 8.76313 1.76367 5.92178 3.50776C5.85869 3.54647 5.78851 3.57252 5.71523 3.58441C5.64196 3.5963 5.56704 3.59381 5.49474 3.57707C5.34872 3.54328 5.22227 3.45352 5.1432 3.32754C5.06412 3.20156 5.0389 3.04969 5.07309 2.90532C5.10727 2.76096 5.19806 2.63594 5.32548 2.55776C6.9793 1.54573 8.80722 1.04335 10.2954 0.79691C10.2095 0.519734 10.1315 0.344823 10.1259 0.329735C10.0788 0.223877 9.99935 0.135308 9.89863 0.0765457C9.79792 0.0177834 9.68107 -0.00820096 9.56461 0.00226469C9.412 0.0134411 5.85283 0.316323 3.57217 2.13082C2.38239 3.21941 0 9.58495 0 15.0882C0 15.1866 0.0265652 15.2805 0.0751739 15.3654C1.7177 18.221 6.20213 18.967 7.22404 19H7.24157C7.33075 19.0002 7.41872 18.9796 7.49829 18.9398C7.57786 18.8999 7.64677 18.8421 7.69939 18.7709L8.73204 17.3649C5.94383 16.6535 4.51948 15.4442 4.43809 15.3721C4.32566 15.274 4.25726 15.1358 4.24793 14.9878C4.2386 14.8398 4.28911 14.6942 4.38835 14.5831C4.48758 14.4719 4.62742 14.4043 4.77709 14.3951C4.92676 14.3858 5.07401 14.4358 5.18643 14.5339C5.21922 14.5646 7.84239 16.7647 13 16.7647C18.1661 16.7647 20.7893 14.5557 20.8158 14.5339C20.9286 14.4365 21.0759 14.3873 21.2253 14.3971C21.3747 14.407 21.5141 14.4751 21.6128 14.5864C21.6616 14.6413 21.6991 14.7052 21.723 14.7744C21.7468 14.8436 21.7567 14.9167 21.752 14.9897C21.7473 15.0627 21.728 15.134 21.6954 15.1996C21.6628 15.2652 21.6174 15.3238 21.5619 15.3721C21.4805 15.4442 20.0562 16.6535 17.268 17.3649L18.3012 18.7709C18.3537 18.842 18.4226 18.8998 18.502 18.9396C18.5815 18.9795 18.6693 19.0001 18.7584 19H18.7754C19.7984 18.967 24.2823 18.2204 25.9254 15.3654C25.9734 15.2805 26 15.1866 26 15.0882C26 9.58495 23.6176 3.21997 22.3967 2.10679V2.10679ZM9.32609 12.8529C8.23296 12.8529 7.34783 11.8527 7.34783 10.6177C7.34783 9.38266 8.23296 8.38237 9.32609 8.38237C10.4192 8.38237 11.3043 9.38266 11.3043 10.6177C11.3043 11.8527 10.4192 12.8529 9.32609 12.8529ZM16.6739 12.8529C15.5808 12.8529 14.6957 11.8527 14.6957 10.6177C14.6957 9.38266 15.5808 8.38237 16.6739 8.38237C17.767 8.38237 18.6522 9.38266 18.6522 10.6177C18.6522 11.8527 17.767 12.8529 16.6739 12.8529Z" fill="#FFFFFF"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="459.319px" height="459.319px" viewBox="0 0 459.319 459.319" style="enable-background:new 0 0 459.319 459.319;"
xml:space="preserve">
<path fill="#FFFFFF" d="M94.924,366.674h312.874c0.958,0,1.886-0.136,2.778-0.349c0.071,0,0.13,0.012,0.201,0.012
c6.679,0,12.105-5.42,12.105-12.104V12.105C422.883,5.423,417.456,0,410.777,0h-2.955H114.284H94.941
c-32.22,0-58.428,26.214-58.428,58.425c0,0.432,0.085,0.842,0.127,1.259c-0.042,29.755-0.411,303.166-0.042,339.109
c-0.023,0.703-0.109,1.389-0.109,2.099c0,30.973,24.252,56.329,54.757,58.245c0.612,0.094,1.212,0.183,1.847,0.183h317.683
c6.679,0,12.105-5.42,12.105-12.105v-45.565c0-6.68-5.427-12.105-12.105-12.105s-12.105,5.426-12.105,12.105v33.461H94.924
c-18.395,0-33.411-14.605-34.149-32.817c0.018-0.325,0.077-0.632,0.071-0.963c-0.012-0.532-0.03-1.359-0.042-2.459
C61.862,380.948,76.739,366.674,94.924,366.674z M103.178,58.425c0-6.682,5.423-12.105,12.105-12.105s12.105,5.423,12.105,12.105
V304.31c0,6.679-5.423,12.105-12.105,12.105s-12.105-5.427-12.105-12.105V58.425z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,3 +0,0 @@
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.5915 5.36061C18.6526 3.71151 17.3789 2.40591 15.7703 1.44353C14.1615 0.481094 12.4051 0 10.4999 0C8.59497 0 6.838 0.481241 5.22948 1.44353C3.62072 2.40586 2.34716 3.71151 1.40822 5.36061C0.469422 7.00966 0 8.81044 0 10.7629C0 13.1082 0.667524 15.2172 2.00291 17.0904C3.33815 18.9637 5.06308 20.26 7.17756 20.9794C7.42369 21.0262 7.6059 20.9933 7.72436 20.8814C7.84288 20.7694 7.90207 20.6291 7.90207 20.4611C7.90207 20.4331 7.89972 20.1809 7.89517 19.7043C7.89048 19.2278 7.88828 18.812 7.88828 18.4573L7.57381 18.513C7.37332 18.5507 7.12038 18.5666 6.81502 18.5621C6.5098 18.5577 6.19294 18.525 5.86487 18.464C5.53667 18.4036 5.2314 18.2634 4.94882 18.0439C4.6664 17.8243 4.4659 17.5369 4.34738 17.1821L4.21067 16.8596C4.11954 16.6449 3.97608 16.4064 3.78008 16.145C3.58409 15.8833 3.38589 15.7059 3.18539 15.6125L3.08967 15.5422C3.02589 15.4955 2.9667 15.4392 2.91197 15.3739C2.85728 15.3086 2.81634 15.2432 2.789 15.1777C2.76161 15.1122 2.7843 15.0584 2.85733 15.0163C2.93035 14.9741 3.06233 14.9536 3.25382 14.9536L3.52715 14.9955C3.70945 15.033 3.93494 15.1448 4.20392 15.3318C4.47275 15.5186 4.69374 15.7615 4.86694 16.0603C5.07668 16.4435 5.32937 16.7355 5.62573 16.9364C5.92186 17.1373 6.22042 17.2376 6.52115 17.2376C6.82187 17.2376 7.0816 17.2142 7.30043 17.1677C7.51903 17.121 7.72412 17.0507 7.91562 16.9574C7.99765 16.3311 8.22099 15.85 8.58544 15.5138C8.06598 15.4578 7.59895 15.3735 7.18412 15.2615C6.76953 15.1492 6.3411 14.9671 5.89911 14.7146C5.45689 14.4625 5.09004 14.1494 4.79846 13.7758C4.50684 13.4021 4.26751 12.9114 4.0808 12.3043C3.894 11.6969 3.80058 10.9962 3.80058 10.2021C3.80058 9.07138 4.16068 8.10919 4.88073 7.31498C4.54343 6.4649 4.57527 5.51194 4.97636 4.4562C5.24069 4.37201 5.63268 4.43519 6.15214 4.64533C6.6717 4.85556 7.0521 5.03566 7.29373 5.18498C7.53536 5.33425 7.72896 5.46075 7.87482 5.56334C8.72263 5.32051 9.59755 5.19907 10.4998 5.19907C11.4021 5.19907 12.2772 5.32051 13.125 5.56334L13.6445 5.22714C13.9998 5.00282 14.4193 4.79725 14.9021 4.61038C15.3852 4.4236 15.7546 4.37216 16.0099 4.45634C16.4199 5.51214 16.4564 6.46505 16.119 7.31513C16.839 8.10934 17.1993 9.07177 17.1993 10.2022C17.1993 10.9963 17.1055 11.6992 16.919 12.3113C16.7323 12.9234 16.4909 13.4136 16.1947 13.7828C15.8983 14.152 15.5291 14.4627 15.0871 14.7148C14.645 14.9671 14.2164 15.1492 13.8019 15.2614C13.3871 15.3736 12.92 15.4579 12.4006 15.514C12.8744 15.9343 13.1113 16.5977 13.1113 17.5039V20.4607C13.1113 20.6287 13.1683 20.7689 13.2823 20.881C13.3963 20.9929 13.5762 21.0258 13.8223 20.9789C15.9371 20.2597 17.662 18.9633 18.9972 17.09C20.3322 15.2168 21 13.1078 21 10.7625C20.9995 8.81029 20.5299 7.00966 19.5915 5.36061Z" fill="#FFFFFF"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1 +0,0 @@
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" fill="#FFFFFF"><path d="M2.846 6.887c.03-.295-.083-.586-.303-.784l-2.24-2.7v-.403h6.958l5.378 11.795 4.728-11.795h6.633v.403l-1.916 1.837c-.165.126-.247.333-.213.538v13.498c-.034.204.048.411.213.537l1.871 1.837v.403h-9.412v-.403l1.939-1.882c.19-.19.19-.246.19-.537v-10.91l-5.389 13.688h-.728l-6.275-13.688v9.174c-.052.385.076.774.347 1.052l2.521 3.058v.404h-7.148v-.404l2.521-3.058c.27-.279.39-.67.325-1.052v-10.608z"/></svg>

Before

Width:  |  Height:  |  Size: 509 B

View File

@ -1,3 +0,0 @@
<svg width="24px" height="24px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<path fill="#FFFFFF" d="M12,0c-6.626,0 -12,5.372 -12,12c0,6.627 5.374,12 12,12c6.627,0 12,-5.373 12,-12c0,-6.628 -5.373,-12 -12,-12Zm3.224,17.871c0.188,0.133 0.43,0.166 0.646,0.085c0.215,-0.082 0.374,-0.267 0.422,-0.491c0.507,-2.382 1.737,-8.412 2.198,-10.578c0.035,-0.164 -0.023,-0.334 -0.151,-0.443c-0.129,-0.109 -0.307,-0.14 -0.465,-0.082c-2.446,0.906 -9.979,3.732 -13.058,4.871c-0.195,0.073 -0.322,0.26 -0.316,0.467c0.007,0.206 0.146,0.385 0.346,0.445c1.381,0.413 3.193,0.988 3.193,0.988c0,0 0.847,2.558 1.288,3.858c0.056,0.164 0.184,0.292 0.352,0.336c0.169,0.044 0.348,-0.002 0.474,-0.121c0.709,-0.669 1.805,-1.704 1.805,-1.704c0,0 2.084,1.527 3.266,2.369Zm-6.423,-5.062l0.98,3.231l0.218,-2.046c0,0 3.783,-3.413 5.941,-5.358c0.063,-0.057 0.071,-0.153 0.019,-0.22c-0.052,-0.067 -0.148,-0.083 -0.219,-0.037c-2.5,1.596 -6.939,4.43 -6.939,4.43Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,3 +0,0 @@
<svg width="22" height="18" viewBox="0 0 22 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.8361 2.09102C21.0578 2.4457 20.2199 2.68554 19.3409 2.79271C20.2385 2.24157 20.9273 1.36765 21.2518 0.326603C20.4113 0.83692 19.4826 1.20818 18.4905 1.4072C17.6998 0.540936 16.5697 0 15.319 0C12.9207 0 10.975 1.99662 10.975 4.4589C10.975 4.80846 11.0123 5.14783 11.0869 5.47443C7.47527 5.28816 4.27389 3.51481 2.12928 0.813956C1.75506 1.47482 1.54122 2.24157 1.54122 3.05808C1.54122 4.60434 2.30831 5.96944 3.47448 6.76936C2.76334 6.74767 2.09199 6.54482 1.50517 6.21311V6.26797C1.50517 8.42916 3.00329 10.2319 4.99249 10.6401C4.62822 10.7447 4.24406 10.797 3.84746 10.797C3.56773 10.797 3.29421 10.7702 3.0294 10.7179C3.58265 12.4887 5.18644 13.7786 7.08862 13.813C5.60169 15.0097 3.72686 15.7229 1.69166 15.7229C1.34106 15.7229 0.994193 15.7025 0.654785 15.6616C2.5781 16.9247 4.8632 17.6634 7.31613 17.6634C15.3103 17.6634 19.6803 10.8698 19.6803 4.97687C19.6803 4.78295 19.6766 4.58903 19.6691 4.39893C20.5182 3.76997 21.2555 2.98536 21.8361 2.09102" fill="#FFFFFF"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 338.6 294.7" style="enable-background:new 0 0 338.6 294.7;" xml:space="preserve">
<style type="text/css">
.st0{clip-path:url(#SVGID_00000074428201918211048820000015955111953353006476_);}
.st1{fill:url(#SVGID_00000104669311538768211870000000101404122542395265_);}
</style>
<g id="Layer_2_00000052078790509646841670000000813375994663887798_">
<g id="Layer_1-2">
<g>
<defs>
<path id="SVGID_1_" d="M263.9,238.7l-34.1-4.2L157.8,62.2L24.5,243.8L164.7,0L263.9,238.7z M203.2,58l81.7,196.7L98.6,230.4
l-21.3,28.4l261.3,34.4L203.2,58z M56.2,268.6l113.7-149l-13.8-33.1L0,294.7h265.9L56.2,268.6z"/>
</defs>
<clipPath id="SVGID_00000183944204005193239050000014230086248616965557_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g style="clip-path:url(#SVGID_00000183944204005193239050000014230086248616965557_);">
<linearGradient id="SVGID_00000111174505500891714840000018148185228839787696_" gradientUnits="userSpaceOnUse" x1="-736.7351" y1="-415.0173" x2="-735.7351" y2="-415.0173" gradientTransform="matrix(196.5485 223.7265 -223.7265 196.5485 52054.457 246467.3594)">
<stop offset="0" style="stop-color:#FF6C21"/>
<stop offset="3.000000e-02" style="stop-color:#F66929"/>
<stop offset="0.26" style="stop-color:#AC4F6A"/>
<stop offset="0.42" style="stop-color:#7E3F92"/>
<stop offset="0.5" style="stop-color:#6C39A2"/>
<stop offset="1" style="stop-color:#403FD8"/>
</linearGradient>
<polygon style="fill:url(#SVGID_00000111174505500891714840000018148185228839787696_);" points="-146.1,128.4 191.1,-167.9
484.7,166.3 147.5,462.6 "/>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -1,10 +0,0 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 155 155" style="enable-background:new 0 0 155 155;" xml:space="preserve">
<style type="text/css">
.st0{fill:#70D44B;}
</style>
<path class="st0" d="M77.5,16.5c6.1,0,11.6,3.4,14.3,8.8l45,90c4,7.9,0.8,17.5-7.1,21.5c-2.2,1.1-4.7,1.7-7.2,1.7h-90
c-8.8,0-16-7.2-16-16c0-2.5,0.6-4.9,1.7-7.2l45-90C65.9,19.9,71.4,16.5,77.5,16.5 M77.5,5.5c-10.2,0-19.6,5.8-24.1,14.9l-45,90
c-6.7,13.3-1.3,29.6,12.1,36.2c3.8,1.9,7.9,2.9,12.1,2.9h90c14.9,0,27-12.1,27-27c0-4.2-1-8.3-2.9-12.1l-45-90
C97.1,11.3,87.7,5.5,77.5,5.5z"/>
</svg>

Before

Width:  |  Height:  |  Size: 657 B

View File

@ -1,4 +0,0 @@
<svg width="1503" height="1504" viewBox="0 0 1503 1504" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="287" y="258" width="928" height="844" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1502.5 752C1502.5 1166.77 1166.27 1503 751.5 1503C336.734 1503 0.5 1166.77 0.5 752C0.5 337.234 336.734 1 751.5 1C1166.27 1 1502.5 337.234 1502.5 752ZM538.688 1050.86H392.94C362.314 1050.86 347.186 1050.86 337.962 1044.96C327.999 1038.5 321.911 1027.8 321.173 1015.99C320.619 1005.11 328.184 991.822 343.312 965.255L703.182 330.935C718.495 303.999 726.243 290.531 736.021 285.55C746.537 280.2 759.083 280.2 769.599 285.55C779.377 290.531 787.126 303.999 802.438 330.935L876.42 460.079L876.797 460.738C893.336 489.635 901.723 504.289 905.385 519.669C909.443 536.458 909.443 554.169 905.385 570.958C901.695 586.455 893.393 601.215 876.604 630.549L687.573 964.702L687.084 965.558C670.436 994.693 661.999 1009.46 650.306 1020.6C637.576 1032.78 622.263 1041.63 605.474 1046.62C590.161 1050.86 573.004 1050.86 538.688 1050.86ZM906.75 1050.86H1115.59C1146.4 1050.86 1161.9 1050.86 1171.13 1044.78C1181.09 1038.32 1187.36 1027.43 1187.92 1015.63C1188.45 1005.1 1181.05 992.33 1166.55 967.307C1166.05 966.455 1165.55 965.588 1165.04 964.706L1060.43 785.75L1059.24 783.735C1044.54 758.877 1037.12 746.324 1027.59 741.472C1017.08 736.121 1004.71 736.121 994.199 741.472C984.605 746.453 976.857 759.552 961.544 785.934L857.306 964.891L856.949 965.507C841.69 991.847 834.064 1005.01 834.614 1015.81C835.352 1027.62 841.44 1038.5 851.402 1044.96C860.443 1050.86 875.94 1050.86 906.75 1050.86Z" fill="#E84142"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 254 254" style="enable-background:new 0 0 254 254;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#E84142;}
.st1{fill:#FFFFFF;}
</style>
<g>
<circle class="st0" cx="127" cy="127" r="127"/>
<path class="st1" d="M171.8,130.3c4.4-7.6,11.5-7.6,15.9,0l27.4,48.1c4.4,7.6,0.8,13.8-8,13.8h-55.2c-8.7,0-12.3-6.2-8-13.8
L171.8,130.3z M118.8,37.7c4.4-7.6,11.4-7.6,15.8,0l6.1,11L155.1,74c3.5,7.2,3.5,15.7,0,22.9l-48.3,83.7
c-4.4,6.8-11.7,11.1-19.8,11.6H46.9c-8.8,0-12.4-6.1-8-13.8L118.8,37.7z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 825 B

View File

@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" opacity="0.56" width="2323.848" height="2555.167" viewBox="0 0 2323.848 2555.167">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1353" data-name="Rectangle 1353" width="1480.425" height="1527.483" transform="translate(-143)" fill="none" stroke="#fff" stroke-width="0.5"/>
</clipPath>
<clipPath id="clip-path-2">
<rect id="Rectangle_1353-2" data-name="Rectangle 1353" width="1144.425" height="1181.425" fill="none" stroke="#fff" stroke-width="0.5"/>
</clipPath>
</defs>
<g id="Group_3232" data-name="Group 3232" transform="translate(220.424 -104.575)">
<g id="Group_2633" data-name="Group 2633" transform="translate(766 1132.259)" opacity="0.25">
<g id="Group_2632" data-name="Group 2632" clip-path="url(#clip-path)">
<ellipse id="Ellipse_63" data-name="Ellipse 63" cx="667.75" cy="667.75" rx="667.75" ry="667.75" transform="translate(-111.522 154.819)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<ellipse id="Ellipse_65" data-name="Ellipse 65" cx="533.168" cy="533.168" rx="533.168" ry="533.168" transform="translate(72.439 188.422)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<ellipse id="Ellipse_67" data-name="Ellipse 67" cx="398.586" cy="398.586" rx="398.586" ry="398.586" transform="translate(262.864 280.206)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<ellipse id="Ellipse_68" data-name="Ellipse 68" cx="285.397" cy="285.397" rx="285.397" ry="285.397" transform="matrix(-1, -0.008, 0.008, -1, 989.058, 923.378)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
</g>
</g>
<g id="Group_2679" data-name="Group 2679" transform="translate(-220.424 104.575)" opacity="0.25">
<g id="Group_2632-2" data-name="Group 2632" clip-path="url(#clip-path-2)">
<circle id="Ellipse_63-2" data-name="Ellipse 63" cx="516.468" cy="516.468" r="516.468" transform="translate(87.744 119.744)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<circle id="Ellipse_65-2" data-name="Ellipse 65" cx="412.376" cy="412.376" r="412.376" transform="translate(153.644 145.734)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<circle id="Ellipse_67-2" data-name="Ellipse 67" cx="308.284" cy="308.284" r="308.284" transform="translate(214.545 216.724)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
<circle id="Ellipse_68-2" data-name="Ellipse 68" cx="220.739" cy="220.739" r="220.739" transform="matrix(1, -0.008, 0.008, 1, 266.011, 272.717)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1,19 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="196.9" height="83.865" viewBox="0 0 196.9 83.865">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1658" data-name="Rectangle 1658" width="196.901" height="83.865" transform="translate(0 0)" fill="#17153f"/>
</clipPath>
<radialGradient id="radial-gradient" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#5189c8"/>
<stop offset="1" stop-color="#5189c8" stop-opacity="0"/>
</radialGradient>
<radialGradient id="radial-gradient-2" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#e72850"/>
<stop offset="1" stop-color="#e72850" stop-opacity="0"/>
</radialGradient>
</defs>
<g id="Mask_Group_16" data-name="Mask Group 16" clip-path="url(#clip-path)">
<ellipse id="Ellipse_160" data-name="Ellipse 160" cx="71.042" cy="104.16" rx="71.042" ry="104.16" transform="translate(94.295 -95.243) rotate(45)" opacity="0.679" fill="url(#radial-gradient)"/>
<ellipse id="Ellipse_161" data-name="Ellipse 161" cx="95.726" cy="53.792" rx="95.726" ry="53.792" transform="matrix(0.875, 0.485, -0.485, 0.875, 90.032, -9.592)" fill="url(#radial-gradient-2)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,38 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="156" height="85" viewBox="0 0 156 85">
<defs>
<linearGradient id="linear-gradient" x1="1" y1="0.012" x2="0" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#e72850"/>
<stop offset="1" stop-color="#3d2670"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="1" x2="0" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#e72850"/>
<stop offset="1" stop-color="#5189c8"/>
</linearGradient>
<linearGradient id="linear-gradient-3" x1="1" x2="0" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#26276f"/>
<stop offset="1" stop-color="#5189c8"/>
</linearGradient>
<linearGradient id="linear-gradient-4" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#eeb430"/>
<stop offset="1" stop-color="#5189c8"/>
</linearGradient>
<linearGradient id="linear-gradient-5" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#f44b1b"/>
<stop offset="1" stop-color="#3d2670"/>
</linearGradient>
<linearGradient id="linear-gradient-6" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#f44b1b"/>
<stop offset="1" stop-color="#eeb430"/>
</linearGradient>
</defs>
<g id="Group_3235" data-name="Group 3235" transform="translate(9958 2714)">
<g id="Group_3234" data-name="Group 3234">
<rect id="Rectangle_1659" data-name="Rectangle 1659" width="47" height="40" transform="translate(-9958 -2714)" fill="url(#linear-gradient)"/>
<rect id="Rectangle_1660" data-name="Rectangle 1660" width="47" height="40" transform="translate(-9903 -2714)" fill="url(#linear-gradient-2)"/>
<rect id="Rectangle_1662" data-name="Rectangle 1662" width="47" height="40" transform="translate(-9849 -2714)" fill="url(#linear-gradient-3)"/>
<rect id="Rectangle_1663" data-name="Rectangle 1663" width="47" height="40" transform="translate(-9849 -2669)" fill="url(#linear-gradient-4)"/>
<rect id="Rectangle_1664" data-name="Rectangle 1664" width="47" height="40" transform="translate(-9903 -2669)" fill="url(#linear-gradient-5)"/>
</g>
<rect id="Rectangle_1665" data-name="Rectangle 1665" width="47" height="40" transform="translate(-9958 -2669)" fill="url(#linear-gradient-6)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 91 KiB

View File

@ -1,23 +0,0 @@
<svg id="Group_3063" data-name="Group 3063" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="249.332" height="43.464" viewBox="0 0 249.332 43.464">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1331" data-name="Rectangle 1331" width="249.332" height="43.464" transform="translate(0 0)" fill="#fff"/>
</clipPath>
</defs>
<g id="Group_2614" data-name="Group 2614" transform="translate(0 0)" clip-path="url(#clip-path)">
<path id="Path_1571" data-name="Path 1571" d="M146.389,29.369l-5.7,16.127a.369.369,0,0,1-.379.251h-.433a.4.4,0,0,1-.386-.251l-4.276-11.311L130.945,45.5a.384.384,0,0,1-.379.251h-.44a.379.379,0,0,1-.378-.251l-5.7-16.121c-.088-.25.007-.406.251-.406h1.765a.367.367,0,0,1,.386.251l4.066,12.21,4.133-11.183a.391.391,0,0,1,.386-.25h.372a.383.383,0,0,1,.379.25l4.255,11.183,3.971-12.21a.367.367,0,0,1,.386-.251h1.739c.251,0,.345.156.257.4" transform="translate(-65.489 -15.299)" fill="#fff"/>
<path id="Path_1572" data-name="Path 1572" d="M205.2,36.951a8.416,8.416,0,1,1-16.83,0,8.416,8.416,0,1,1,16.83,0m-2.334,0c0-3.91-2.55-6.6-6.082-6.6s-6.082,2.693-6.082,6.6,2.55,6.6,6.082,6.6,6.082-2.693,6.082-6.6" transform="translate(-99.473 -15.026)" fill="#fff"/>
<path id="Path_1573" data-name="Path 1573" d="M257.029,44.807a.406.406,0,0,1-.359.67h-1.59a.314.314,0,0,1-.257-.149l-3.991-6.021h-4.289v5.831a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h6.109c4.275,0,6.386,2.246,6.386,5.168a4.865,4.865,0,0,1-4.012,4.9Zm-6.7-7.394c3.362,0,4.492-1.394,4.492-3.274s-1.13-3.274-4.492-3.274h-3.781v6.548Z" transform="translate(-129.02 -15.299)" fill="#fff"/>
<path id="Path_1574" data-name="Path 1574" d="M308.354,28.4h.507a.32.32,0,0,1,.338.338v16.1a.32.32,0,0,1-.338.338h-1.549a.32.32,0,0,1-.338-.338V33.41l-6.258,9.058a.257.257,0,0,1-.467,0l-6.257-9.058V44.835a.32.32,0,0,1-.338.338h-1.549a.32.32,0,0,1-.338-.338v-16.1a.32.32,0,0,1,.338-.338h.5a.509.509,0,0,1,.42.23l7.455,10.411,7.461-10.411a.488.488,0,0,1,.412-.23" transform="translate(-154.077 -14.996)" fill="#fff"/>
<path id="Path_1575" data-name="Path 1575" d="M365.423,29.308v15.83a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V37.927H352.922v7.211a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338v6.724H363.2V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338" transform="translate(-185.196 -15.299)" fill="#fff"/>
<path id="Path_1576" data-name="Path 1576" d="M419.021,36.951a8.416,8.416,0,1,1-16.831,0,8.416,8.416,0,1,1,16.831,0m-2.334,0c0-3.91-2.55-6.6-6.082-6.6s-6.082,2.693-6.082,6.6,2.55,6.6,6.082,6.6,6.082-2.693,6.082-6.6" transform="translate(-212.389 -15.026)" fill="#fff"/>
<path id="Path_1577" data-name="Path 1577" d="M469.825,43.92v1.218a.32.32,0,0,1-.338.338H458.48a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338V43.582h9.119a.32.32,0,0,1,.338.338" transform="translate(-241.937 -15.299)" fill="#fff"/>
<path id="Path_1578" data-name="Path 1578" d="M514.28,43.92v1.218a.32.32,0,0,1-.338.338H502.056a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h11.615a.32.32,0,0,1,.338.338v1.218a.32.32,0,0,1-.338.338h-9.728v5.168h8.646a.318.318,0,0,1,.338.331v1.225a.319.319,0,0,1-.338.338h-8.646v5.655h10a.32.32,0,0,1,.338.338" transform="translate(-264.948 -15.299)" fill="#fff"/>
<path id="Path_1579" data-name="Path 1579" d="M21.732,43.464A21.732,21.732,0,1,1,43.464,21.732,21.757,21.757,0,0,1,21.732,43.464m0-42.5A20.768,20.768,0,1,0,42.5,21.732,20.791,20.791,0,0,0,21.732.964" transform="translate(0 0)" fill="#fff"/>
<path id="Path_1580" data-name="Path 1580" d="M27.97,43.9A19.526,19.526,0,1,1,47.5,24.37,19.548,19.548,0,0,1,27.97,43.9m0-38.217A18.691,18.691,0,1,0,46.661,24.37,18.711,18.711,0,0,0,27.97,5.68" transform="translate(-4.459 -2.558)" fill="#fff"/>
<path id="Path_1581" data-name="Path 1581" d="M34.208,44.328a17.32,17.32,0,1,1,17.32-17.32,17.339,17.339,0,0,1-17.32,17.32m0-33.934A16.614,16.614,0,1,0,50.821,27.008,16.632,16.632,0,0,0,34.208,10.394" transform="translate(-8.918 -5.116)" fill="#fff"/>
<path id="Path_1582" data-name="Path 1582" d="M40.446,44.761A15.115,15.115,0,1,1,55.56,29.646,15.132,15.132,0,0,1,40.446,44.761m0-29.652A14.536,14.536,0,1,0,54.982,29.646,14.553,14.553,0,0,0,40.446,15.11" transform="translate(-13.377 -7.674)" fill="#fff"/>
<path id="Path_1583" data-name="Path 1583" d="M46.683,45.194A12.909,12.909,0,1,1,59.593,32.284,12.924,12.924,0,0,1,46.683,45.194m0-25.368A12.459,12.459,0,1,0,59.142,32.284,12.473,12.473,0,0,0,46.683,19.825" transform="translate(-17.835 -10.232)" fill="#fff"/>
<path id="Path_1584" data-name="Path 1584" d="M52.922,45.625a10.7,10.7,0,1,1,10.7-10.7,10.716,10.716,0,0,1-10.7,10.7m0-21.085A10.382,10.382,0,1,0,63.3,34.922,10.393,10.393,0,0,0,52.922,24.54" transform="translate(-22.295 -12.789)" fill="#fff"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="66.26" height="66.26" viewBox="0 0 66.26 66.26">
<g id="Group_3067" data-name="Group 3067" transform="translate(12576.755 7336.418)">
<path id="Path_1579" data-name="Path 1579" d="M33.13,66.26A33.13,33.13,0,1,1,66.26,33.13,33.168,33.168,0,0,1,33.13,66.26m0-64.79A31.66,31.66,0,1,0,64.79,33.13,31.7,31.7,0,0,0,33.13,1.47" transform="translate(-12576.755 -7336.418)" fill="#fff"/>
<path id="Path_1580" data-name="Path 1580" d="M38.211,64.379A29.768,29.768,0,1,1,67.978,34.611,29.8,29.8,0,0,1,38.211,64.379m0-58.261A28.493,28.493,0,1,0,66.705,34.611,28.525,28.525,0,0,0,38.211,6.118" transform="translate(-12579.124 -7337.777)" fill="#fff"/>
<path id="Path_1581" data-name="Path 1581" d="M43.293,62.5a26.4,26.4,0,1,1,26.4-26.4,26.433,26.433,0,0,1-26.4,26.4m0-51.731A25.327,25.327,0,1,0,68.619,36.092,25.355,25.355,0,0,0,43.293,10.765" transform="translate(-12581.493 -7339.136)" fill="#fff"/>
<path id="Path_1582" data-name="Path 1582" d="M48.374,60.616A23.043,23.043,0,1,1,71.415,37.574,23.069,23.069,0,0,1,48.374,60.616m0-45.2a22.161,22.161,0,1,0,22.16,22.161,22.186,22.186,0,0,0-22.16-22.161" transform="translate(-12583.862 -7340.495)" fill="#fff"/>
<path id="Path_1583" data-name="Path 1583" d="M53.454,58.735a19.68,19.68,0,1,1,19.68-19.68,19.7,19.7,0,0,1-19.68,19.68m0-38.674A18.994,18.994,0,1,0,72.448,39.055,19.015,19.015,0,0,0,53.454,20.061" transform="translate(-12586.231 -7341.854)" fill="#fff"/>
<path id="Path_1584" data-name="Path 1584" d="M58.535,56.853A16.317,16.317,0,1,1,74.853,40.535,16.336,16.336,0,0,1,58.535,56.853m0-32.144A15.827,15.827,0,1,0,74.363,40.535,15.845,15.845,0,0,0,58.535,24.709" transform="translate(-12588.601 -7343.213)" fill="#fff"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,66 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="327" height="271" viewBox="0 0 327 271">
<g id="Group_3236" data-name="Group 3236" transform="translate(-294 -1344)">
<g id="Group_3083" data-name="Group 3083" transform="translate(15640 10955.632)">
<rect id="Rectangle_1624" data-name="Rectangle 1624" width="144" height="35" transform="translate(-15254 -9484.632)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1626" data-name="Rectangle 1626" width="74" height="35" transform="translate(-15110 -9449.632) rotate(90)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1627" data-name="Rectangle 1627" width="74" height="35" transform="translate(-15219 -9449.632) rotate(90)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1625" data-name="Rectangle 1625" width="144" height="35" transform="translate(-15254 -9375.632)" fill="#e72850" opacity="0.147"/>
<circle id="Ellipse_146" data-name="Ellipse 146" cx="17.5" cy="17.5" r="17.5" transform="translate(-15184 -9429.632)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_147" data-name="Ellipse 147" cx="17.5" cy="17.5" r="17.5" transform="translate(-15145 -9375.632)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_150" data-name="Ellipse 150" cx="17.5" cy="17.5" r="17.5" transform="translate(-15254 -9375.632)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_148" data-name="Ellipse 148" cx="17.5" cy="17.5" r="17.5" transform="translate(-15145 -9484.632)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_149" data-name="Ellipse 149" cx="17.5" cy="17.5" r="17.5" transform="translate(-15254 -9484.632)" fill="#e72850" opacity="0.15"/>
<g id="Group_3082" data-name="Group 3082" transform="translate(-15218.682 -9449.713)">
<path id="Path_1579" data-name="Path 1579" d="M36.856,73.711A36.856,36.856,0,1,1,73.711,36.856,36.9,36.9,0,0,1,36.856,73.711m0-72.076a35.22,35.22,0,1,0,35.22,35.22,35.261,35.261,0,0,0-35.22-35.22" transform="translate(0 0)" fill="#fff"/>
<path id="Path_1580" data-name="Path 1580" d="M41.559,71.074A33.115,33.115,0,1,1,74.674,37.959,33.153,33.153,0,0,1,41.559,71.074m0-64.813a31.7,31.7,0,1,0,31.7,31.7,31.733,31.733,0,0,0-31.7-31.7" transform="translate(-1.686 -0.968)" fill="#fff"/>
<path id="Path_1581" data-name="Path 1581" d="M46.262,68.435A29.374,29.374,0,1,1,75.635,39.062,29.406,29.406,0,0,1,46.262,68.435m0-57.549A28.175,28.175,0,1,0,74.436,39.062,28.207,28.207,0,0,0,46.262,10.886" transform="translate(-3.371 -1.934)" fill="#fff"/>
<path id="Path_1582" data-name="Path 1582" d="M50.965,65.8A25.634,25.634,0,1,1,76.6,40.165,25.663,25.663,0,0,1,50.965,65.8m0-50.287A24.653,24.653,0,1,0,75.617,40.165,24.681,24.681,0,0,0,50.965,15.512" transform="translate(-5.058 -2.901)" fill="#fff"/>
<path id="Path_1583" data-name="Path 1583" d="M55.667,63.161A21.893,21.893,0,1,1,77.56,41.268,21.918,21.918,0,0,1,55.667,63.161m0-43.023A21.13,21.13,0,1,0,76.8,41.268a21.153,21.153,0,0,0-21.13-21.13" transform="translate(-6.744 -3.868)" fill="#fff"/>
<path id="Path_1584" data-name="Path 1584" d="M60.37,60.523A18.152,18.152,0,1,1,78.523,42.37,18.173,18.173,0,0,1,60.37,60.523m0-35.759A17.607,17.607,0,1,0,77.978,42.37,17.627,17.627,0,0,0,60.37,24.764" transform="translate(-8.43 -4.836)" fill="#fff"/>
</g>
<line id="Line_96" data-name="Line 96" x2="144" transform="translate(-15254 -9449.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_97" data-name="Line 97" x2="144" transform="translate(-15254 -9375.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_94" data-name="Line 94" y2="144" transform="translate(-15219 -9484.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_95" data-name="Line 95" y2="144" transform="translate(-15145 -9484.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<text id="x" transform="translate(-15169 -9409.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-2" data-name="x" transform="translate(-15131 -9464.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-3" data-name="x" transform="translate(-15131 -9355.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-4" data-name="x" transform="translate(-15241 -9464.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-5" data-name="x" transform="translate(-15241 -9355.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
</g>
<g id="Group_3084" data-name="Group 3084" transform="translate(15615 10965)">
<rect id="Rectangle_1620" data-name="Rectangle 1620" width="327" height="23" transform="translate(-15321 -9621)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1622" data-name="Rectangle 1622" width="23" height="50" transform="translate(-15321 -9598)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1623" data-name="Rectangle 1623" width="23" height="50" transform="translate(-15017 -9598)" fill="#e72850" opacity="0.147"/>
<rect id="Rectangle_1621" data-name="Rectangle 1621" width="327" height="23" transform="translate(-15321 -9548)" fill="#e72850" opacity="0.147"/>
<circle id="Ellipse_145" data-name="Ellipse 145" cx="11.5" cy="11.5" r="11.5" transform="translate(-15275 -9584)" fill="#e72850" opacity="0.15"/>
<path id="Path_1571" data-name="Path 1571" d="M149.063,29.417l-6.384,18.054a.413.413,0,0,1-.424.281h-.484a.445.445,0,0,1-.432-.281l-4.786-12.662-4.778,12.662a.429.429,0,0,1-.424.281h-.492a.425.425,0,0,1-.424-.281l-6.384-18.047c-.1-.28.008-.454.281-.454h1.976a.411.411,0,0,1,.432.281l4.551,13.669L135.916,30.4a.438.438,0,0,1,.432-.28h.416a.429.429,0,0,1,.424.28l4.764,12.518L146.4,29.251a.411.411,0,0,1,.432-.281h1.946c.281,0,.386.174.288.447" transform="translate(-15356.057 -9611.165)" fill="#fff"/>
<path id="Path_1572" data-name="Path 1572" d="M207.207,37.966a9.421,9.421,0,1,1-18.841,0,9.421,9.421,0,1,1,18.841,0m-2.612,0c0-4.377-2.855-7.391-6.808-7.391s-6.808,3.014-6.808,7.391,2.855,7.391,6.808,7.391,6.808-3.014,6.808-7.391" transform="translate(-15386.412 -9610.922)" fill="#fff"/>
<path id="Path_1573" data-name="Path 1573" d="M258.548,46.7a.455.455,0,0,1-.4.75h-1.78a.351.351,0,0,1-.288-.166l-4.468-6.74h-4.8v6.528a.385.385,0,0,1-.379.379H244.7a.385.385,0,0,1-.378-.379V29.349a.385.385,0,0,1,.378-.379h6.839c4.786,0,7.149,2.515,7.149,5.786a5.446,5.446,0,0,1-4.491,5.483Zm-7.5-8.277c3.764,0,5.028-1.56,5.028-3.665s-1.265-3.665-5.028-3.665h-4.233v7.331Z" transform="translate(-15412.805 -9611.165)" fill="#fff"/>
<path id="Path_1574" data-name="Path 1574" d="M310.336,28.4h.568a.358.358,0,0,1,.379.379V46.8a.358.358,0,0,1-.379.379H309.17a.358.358,0,0,1-.379-.379V34.009l-7.005,10.14a.287.287,0,0,1-.522,0l-7-10.14V46.8a.358.358,0,0,1-.379.379h-1.734a.358.358,0,0,1-.379-.379V28.776a.358.358,0,0,1,.379-.379h.561a.57.57,0,0,1,.47.257l8.345,11.655,8.353-11.655a.547.547,0,0,1,.462-.257" transform="translate(-15435.187 -9610.896)" fill="#fff"/>
<path id="Path_1575" data-name="Path 1575" d="M367.182,29.349V47.069a.385.385,0,0,1-.379.379H365.07a.385.385,0,0,1-.379-.379V39h-11.5v8.073a.385.385,0,0,1-.379.379h-1.734a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h1.734a.385.385,0,0,1,.379.379v7.528h11.5V29.349a.385.385,0,0,1,.379-.379H366.8a.385.385,0,0,1,.379.379" transform="translate(-15462.983 -9611.165)" fill="#fff"/>
<path id="Path_1576" data-name="Path 1576" d="M421.031,37.966a9.421,9.421,0,1,1-18.841,0,9.421,9.421,0,1,1,18.841,0m-2.612,0c0-4.377-2.855-7.391-6.808-7.391s-6.808,3.014-6.808,7.391,2.855,7.391,6.808,7.391,6.808-3.014,6.808-7.391" transform="translate(-15487.273 -9610.922)" fill="#fff"/>
<path id="Path_1577" data-name="Path 1577" d="M471.221,45.706v1.363a.358.358,0,0,1-.379.379H458.521a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h1.734a.385.385,0,0,1,.378.379V45.328h10.208a.358.358,0,0,1,.379.379" transform="translate(-15513.667 -9611.165)" fill="#fff"/>
<path id="Path_1578" data-name="Path 1578" d="M515.781,45.706v1.363a.358.358,0,0,1-.379.379H502.1a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h13a.358.358,0,0,1,.379.379v1.363a.358.358,0,0,1-.379.379H504.21v5.786h9.678a.356.356,0,0,1,.378.371v1.371a.357.357,0,0,1-.378.378H504.21v6.331H515.4a.358.358,0,0,1,.379.379" transform="translate(-15534.222 -9611.165)" fill="#fff"/>
<path id="Path_1579-2" data-name="Path 1579" d="M24.328,48.656A24.328,24.328,0,1,1,48.656,24.328,24.356,24.356,0,0,1,24.328,48.656m0-47.577A23.249,23.249,0,1,0,47.577,24.328,23.275,23.275,0,0,0,24.328,1.079" transform="translate(-15297.559 -9597.5)" fill="#fff"/>
<path id="Path_1580-2" data-name="Path 1580" d="M30.3,48.562A21.859,21.859,0,1,1,52.161,26.7,21.884,21.884,0,0,1,30.3,48.562m0-42.782A20.923,20.923,0,1,0,51.226,26.7,20.947,20.947,0,0,0,30.3,5.78" transform="translate(-15301.542 -9599.785)" fill="#fff"/>
<path id="Path_1581-2" data-name="Path 1581" d="M36.277,48.466A19.389,19.389,0,1,1,55.666,29.077,19.411,19.411,0,0,1,36.277,48.466m0-37.988a18.6,18.6,0,1,0,18.6,18.6,18.619,18.619,0,0,0-18.6-18.6" transform="translate(-15305.524 -9602.069)" fill="#fff"/>
<path id="Path_1582-2" data-name="Path 1582" d="M42.252,48.372a16.921,16.921,0,1,1,16.92-16.921,16.94,16.94,0,0,1-16.92,16.921m0-33.194A16.273,16.273,0,1,0,58.524,31.452,16.292,16.292,0,0,0,42.252,15.179" transform="translate(-15309.508 -9604.354)" fill="#fff"/>
<path id="Path_1583-2" data-name="Path 1583" d="M48.226,48.278A14.452,14.452,0,1,1,62.677,33.827,14.468,14.468,0,0,1,48.226,48.278m0-28.4A13.948,13.948,0,1,0,62.173,33.827,13.963,13.963,0,0,0,48.226,19.879" transform="translate(-15313.49 -9606.64)" fill="#fff"/>
<path id="Path_1584-2" data-name="Path 1584" d="M54.2,48.183A11.982,11.982,0,1,1,66.182,36.2,12,12,0,0,1,54.2,48.183m0-23.6A11.622,11.622,0,1,0,65.823,36.2,11.635,11.635,0,0,0,54.2,24.578" transform="translate(-15317.473 -9608.924)" fill="#fff"/>
<circle id="Ellipse_141" data-name="Ellipse 141" cx="11.5" cy="11.5" r="11.5" transform="translate(-15321 -9548)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_144" data-name="Ellipse 144" cx="11.5" cy="11.5" r="11.5" transform="translate(-15017 -9548)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_142" data-name="Ellipse 142" cx="11.5" cy="11.5" r="11.5" transform="translate(-15321 -9621)" fill="#e72850" opacity="0.15"/>
<circle id="Ellipse_143" data-name="Ellipse 143" cx="11.5" cy="11.5" r="11.5" transform="translate(-15017 -9621)" fill="#e72850" opacity="0.15"/>
<line id="Line_90" data-name="Line 90" x2="327" transform="translate(-15321 -9598)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_91" data-name="Line 91" x2="327" transform="translate(-15321 -9548)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_92" data-name="Line 92" y2="96" transform="translate(-15298 -9621)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<line id="Line_93" data-name="Line 93" y2="96" transform="translate(-15017 -9621)" fill="none" stroke="#e72850" stroke-width="0.3"/>
<text id="x-6" data-name="x" transform="translate(-15266 -9570)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-7" data-name="x" transform="translate(-15313 -9607)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-8" data-name="x" transform="translate(-15009 -9607)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-9" data-name="x" transform="translate(-15313 -9533)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
<text id="x-10" data-name="x" transform="translate(-15009 -9533)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,252 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 469.2 241.6" style="enable-background:new 0 0 469.2 241.6;" xml:space="preserve">
<style type="text/css">
.st0{filter:url(#Rectangle_1586);}
.st1{fill:#FFFFFF;}
.st2{fill:url(#Rectangle_1588_00000072984838052793609770000016580739207881068976_);}
.st3{fill:#17153F;}
.st4{clip-path:url(#SVGID_00000111894869100567970070000008178852524558605244_);}
.st5{opacity:0.679;fill:url(#Path_1972_00000078045868472253129160000018245583812902236570_);enable-background:new ;}
.st6{fill:url(#Path_1973_00000063591956186286342630000005807507703255243909_);}
</style>
<filter filterUnits="userSpaceOnUse" height="190.251" id="Rectangle_1586" width="303.541" x="0" y="0">
<feOffset input="SourceAlpha"></feOffset>
<feGaussianBlur result="blur" stdDeviation="12.5"></feGaussianBlur>
<feFlood flood-opacity="0.161"></feFlood>
<feComposite in2="blur" operator="in"></feComposite>
<feComposite in="SourceGraphic" operator="over"></feComposite>
</filter>
<g id="Group_3240" transform="translate(-721.5 -880.803)">
<g id="Group_3238">
<g id="Group_3237">
<g transform="matrix(1, 0, 0, 1, 721.5, 880.8)" class="st0">
<path id="Rectangle_1586-2_00000101083937350879403790000003057290472737524649_" class="st1" d="M13.1,1.4h206.5
c6.1,0,11,4.9,11,11v93.3c0,6.1-4.9,11-11,11H13.1c-6.1,0-11-4.9-11-11V12.4C2.1,6.3,7.1,1.4,13.1,1.4z"/>
</g>
<path id="Rectangle_1587" d="M975.2,882.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H975.2c-7.2,0-13-5.8-13-13v-89.3
C962.2,888,968,882.2,975.2,882.2z"/>
<linearGradient id="Rectangle_1588_00000137823246902477658210000013075911900380249477_" gradientUnits="userSpaceOnUse" x1="258.4623" y1="1365.9044" x2="258.8013" y2="1366.8724" gradientTransform="matrix(228.541 0 0 -115.251 -58007.6953 158508.0938)">
<stop offset="0" style="stop-color:#26276F"/>
<stop offset="1" style="stop-color:#5189C8"/>
</linearGradient>
<path id="Rectangle_1588" style="fill:url(#Rectangle_1588_00000137823246902477658210000013075911900380249477_);" d="
M975.2,1007.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H975.2c-7.2,0-13-5.8-13-13v-89.3
C962.2,1013,968,1007.2,975.2,1007.2z"/>
<path id="Rectangle_1674" class="st3" d="M736.6,1007.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H736.6
c-7.2,0-13-5.8-13-13v-89.3C723.6,1013,729.5,1007.2,736.6,1007.2z"/>
</g>
<g>
<defs>
<path id="SVGID_1_" d="M734.6,1007.2h206.5c6.1,0,11,4.9,11,11v93.3c0,6.1-4.9,11-11,11H734.6c-6.1,0-11-4.9-11-11v-93.3
C723.6,1012.1,728.6,1007.2,734.6,1007.2z"/>
</defs>
<clipPath id="SVGID_00000116213729444295010020000007503588847360528798_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="Mask_Group_14" transform="translate(759.003 1043.281)" style="clip-path:url(#SVGID_00000116213729444295010020000007503588847360528798_);">
<radialGradient id="Path_1972_00000146462170496474873880000014798572949226437285_" cx="-499.7274" cy="325.4244" r="0.5" gradientTransform="matrix(128.1554 128.1554 186.8015 -186.8015 3299.9165 124836.1875)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#5189C8"/>
<stop offset="1" style="stop-color:#5189C8;stop-opacity:0"/>
</radialGradient>
<path id="Path_1972" style="opacity:0.679;fill:url(#Path_1972_00000146462170496474873880000014798572949226437285_);enable-background:new ;" d="
M132.4-97.4c32.2,38,20,114.1-27.2,169.9S-6.4,142.7-38.6,104.6S-58.6-9.5-11.4-65.3S100.2-135.4,132.4-97.4z"/>
<radialGradient id="Path_1973_00000165935009589748603650000011754558051740521130_" cx="-500.2261" cy="324.892" r="0.5" gradientTransform="matrix(202.9145 112.4726 69.4791 -125.3489 79066.0078 97066)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#E72850"/>
<stop offset="1" style="stop-color:#E72850;stop-opacity:0"/>
</radialGradient>
<path id="Path_1973" style="fill:url(#Path_1973_00000165935009589748603650000011754558051740521130_);" d="M166.4,14.9
c53.7,35.2,83.7,92.6,66.9,128.2s-73.8,36-127.5,0.9S22.1,51.4,38.9,15.7S112.7-20.3,166.4,14.9z"/>
</g>
</g>
</g>
<g id="Group_3239">
<g id="Component_11_1" transform="translate(816.956 1091.09)">
<path id="Path_1692" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
<path id="Path_1693" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
<path id="Path_1694" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9v2.6
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3c0,1.1-0.7,2-1.8,2.2
L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
<path id="Path_1695" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-0.7
c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2c0,0.1-0.1,0.1-0.1,0.2
c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2c0.1,0,0.1,0,0.2,0.1l3.4,4.7
l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
<path id="Path_1696" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
<path id="Path_1697" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
<path id="Path_1698" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
<path id="Path_1699" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
C77.3-23.2,77.3-23.2,77.3-23.2"/>
<path id="Path_1700" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
<path id="Path_1701" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
<path id="Path_1702" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
<path id="Path_1703" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
<path id="Path_1704" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
<path id="Path_1705" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
</g>
<g id="Group_3076" transform="translate(1055.437 1091.09)">
<path id="Path_1692-2" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
<path id="Path_1693-2" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
<path id="Path_1694-2" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9
v2.6c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3
c0,1.1-0.7,2-1.8,2.2L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
<path id="Path_1695-2" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0
h-0.7c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2
c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2
c0.1,0,0.1,0,0.2,0.1l3.4,4.7l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
<path id="Path_1696-2" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
<path id="Path_1697-2" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
<path id="Path_1698-2" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
<path id="Path_1699-2" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
C77.3-23.2,77.3-23.2,77.3-23.2"/>
<path id="Path_1700-2" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
<path id="Path_1701-2" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
<path id="Path_1702-2" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
<path id="Path_1703-2" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
<path id="Path_1704-2" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
<path id="Path_1705-2" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
</g>
<g id="Group_3077" transform="translate(1055.437 967.111)">
<path id="Path_1692-3" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
<path id="Path_1693-3" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
<path id="Path_1694-3" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9
v2.6c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3
c0,1.1-0.7,2-1.8,2.2L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
<path id="Path_1695-3" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0
h-0.7c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2
c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2
c0.1,0,0.1,0,0.2,0.1l3.4,4.7l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
<path id="Path_1696-3" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
<path id="Path_1697-3" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
<path id="Path_1698-3" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
<path id="Path_1699-3" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
C77.3-23.2,77.3-23.2,77.3-23.2"/>
<path id="Path_1700-3" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
<path id="Path_1701-3" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
<path id="Path_1702-3" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
<path id="Path_1703-3" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
<path id="Path_1704-3" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
<path id="Path_1705-3" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
</g>
<g id="Component_10_1" transform="translate(816.956 967.111)">
<path id="Path_1692-4" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
<path id="Path_1693-4" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.6,3.8,3.7
C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5c-0.1,1.5,1,2.8,2.5,3
c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
<path id="Path_1694-4" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9v2.6
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3c0,1.1-0.7,2-1.8,2.2
L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
<path id="Path_1695-4" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-0.7
c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2c0,0.1-0.1,0.1-0.1,0.2
c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2c0.1,0,0.1,0,0.2,0.1l3.4,4.7
l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
<path id="Path_1696-4" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
<path id="Path_1697-4" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.6,3.8,3.7
C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5c-0.1,1.5,1,2.8,2.5,3
c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
<path id="Path_1698-4" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
<path id="Path_1699-4" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
C77.3-23.2,77.3-23.2,77.3-23.2"/>
<path id="Path_1700-4" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
<path id="Path_1701-4" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
<path id="Path_1702-4" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
<path id="Path_1703-4" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
<path id="Path_1704-4" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
<path id="Path_1705-4" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,12 +0,0 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.3025 0L9.67897 6.12683L13.5847 8.39024L20.3025 4.52683L27.0204 8.39024L30.9261 6.12683L20.3025 0Z" fill="#F0B90B"/>
<path d="M27.0204 11.5902L30.9261 13.8537V18.3805L24.2083 22.2439V29.9707L20.3025 32.2341L16.3968 29.9707V22.2439L9.67897 18.3805V13.8537L13.5847 11.5902L20.3025 15.4537L27.0204 11.5902Z" fill="#F0B90B"/>
<path d="M30.9261 21.5805V26.1073L27.0204 28.3707V23.8439L30.9261 21.5805Z" fill="#F0B90B"/>
<path d="M26.9814 31.5707L33.6992 27.7073V19.9805L37.605 17.7171V29.9707L26.9814 36.0976V31.5707Z" fill="#F0B90B"/>
<path d="M33.6992 12.2537L29.7935 9.99025L33.6992 7.72683L37.605 9.99025V14.5171L33.6992 16.7805V12.2537Z" fill="#F0B90B"/>
<path d="M16.3968 37.7366V33.2098L20.3025 35.4732L24.2083 33.2098V37.7366L20.3025 40L16.3968 37.7366Z" fill="#F0B90B"/>
<path d="M13.5847 28.3707L9.67897 26.1073V21.5805L13.5847 23.8439V28.3707Z" fill="#F0B90B"/>
<path d="M20.3025 12.2537L16.3968 9.99025L20.3025 7.72683L24.2083 9.99025L20.3025 12.2537Z" fill="#F0B90B"/>
<path d="M10.8116 9.99025L6.90586 12.2537V16.7805L3.00012 14.5171V9.99025L6.90586 7.72683L10.8116 9.99025Z" fill="#F0B90B"/>
<path d="M3.00012 17.7171L6.90586 19.9805V27.7073L13.6237 31.5707V36.0976L3.00012 29.9707V17.7171Z" fill="#F0B90B"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -1,38 +0,0 @@
<svg id="Component_15_7" data-name="Component 15 7" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="29.147" height="35.297" viewBox="0 0 29.147 35.297">
<defs>
<linearGradient id="linear-gradient" x1="0.5" x2="1" y2="0.59" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#374b92"/>
<stop offset="1" stop-color="#e72850"/>
</linearGradient>
<clipPath id="clip-path">
<rect id="Rectangle_1497" data-name="Rectangle 1497" width="29.147" height="35.297" fill="url(#linear-gradient)"/>
</clipPath>
</defs>
<g id="Group_2819" data-name="Group 2819" clip-path="url(#clip-path)">
<path id="Path_1873" data-name="Path 1873" d="M318.532,92.137l-.555,17.346-.555-17.346a.58.58,0,0,1,.536-.615.573.573,0,0,1,.574.575c0,.013,0,.028,0,.041" transform="translate(-289.385 -82.859)" fill="url(#linear-gradient)"/>
<path id="Path_1874" data-name="Path 1874" d="M305.306,84.516l-.555,18.791L304.2,84.516a.579.579,0,0,1,.538-.614.573.573,0,0,1,.573.576c0,.012,0,.026,0,.038" transform="translate(-277.328 -75.96)" fill="url(#linear-gradient)"/>
<path id="Path_1875" data-name="Path 1875" d="M292.081,76.893l-.555,20.237-.555-20.237a.557.557,0,1,1,1.11-.035c0,.011,0,.024,0,.035" transform="translate(-265.27 -69.06)" fill="url(#linear-gradient)"/>
<path id="Path_1876" data-name="Path 1876" d="M278.855,69.269,278.3,90.952l-.555-21.682a.557.557,0,1,1,1.11-.033c0,.01,0,.023,0,.033" transform="translate(-253.213 -62.159)" fill="url(#linear-gradient)"/>
<path id="Path_1877" data-name="Path 1877" d="M265.629,61.642l-.555,23.128-.555-23.128a.557.557,0,1,1,1.11-.031c0,.01,0,.021,0,.031" transform="translate(-241.155 -55.255)" fill="url(#linear-gradient)"/>
<path id="Path_1878" data-name="Path 1878" d="M252.4,54.016l-.555,24.573-.555-24.573a.557.557,0,1,1,1.11-.029c0,.009,0,.02,0,.029" transform="translate(-229.098 -48.351)" fill="url(#linear-gradient)"/>
<path id="Path_1879" data-name="Path 1879" d="M239.178,46.387l-.555,26.019-.555-26.019a.557.557,0,1,1,1.11-.027c0,.009,0,.019,0,.027" transform="translate(-217.04 -41.445)" fill="url(#linear-gradient)"/>
<path id="Path_1880" data-name="Path 1880" d="M225.952,38.759,225.4,66.224l-.555-27.464a.557.557,0,1,1,1.11-.026c0,.008,0,.018,0,.026" transform="translate(-204.982 -34.54)" fill="url(#linear-gradient)"/>
<path id="Path_1881" data-name="Path 1881" d="M212.727,31.13l-.555,28.91-.555-28.91a.557.557,0,1,1,1.11-.025c0,.007,0,.017,0,.025" transform="translate(-192.926 -27.634)" fill="url(#linear-gradient)"/>
<path id="Path_1882" data-name="Path 1882" d="M199.5,23.5l-.555,30.355L198.391,23.5a.557.557,0,1,1,1.11-.023c0,.007,0,.016,0,.023" transform="translate(-180.868 -20.726)" fill="url(#linear-gradient)"/>
<path id="Path_1883" data-name="Path 1883" d="M186.275,15.869l-.555,31.8-.555-31.8a.557.557,0,1,1,1.11-.022c0,.007,0,.016,0,.022" transform="translate(-168.81 -13.818)" fill="url(#linear-gradient)"/>
<path id="Path_1884" data-name="Path 1884" d="M173.049,8.238l-.555,33.246-.555-33.246a.557.557,0,1,1,1.11-.021c0,.006,0,.015,0,.021" transform="translate(-156.752 -6.91)" fill="url(#linear-gradient)"/>
<path id="Path_1885" data-name="Path 1885" d="M159.824.605,159.268,35.3,158.713.605a.557.557,0,1,1,1.11-.02c0,.006,0,.014,0,.02" transform="translate(-144.695 0)" fill="url(#linear-gradient)"/>
<path id="Path_1886" data-name="Path 1886" d="M146.6,8.238l-.555,33.246-.555-33.246a.557.557,0,1,1,1.11-.021c0,.006,0,.015,0,.021" transform="translate(-132.637 -6.91)" fill="url(#linear-gradient)"/>
<path id="Path_1887" data-name="Path 1887" d="M133.371,15.869l-.555,31.8-.555-31.8a.557.557,0,1,1,1.11-.022c0,.007,0,.016,0,.022" transform="translate(-120.579 -13.818)" fill="url(#linear-gradient)"/>
<path id="Path_1888" data-name="Path 1888" d="M120.145,23.5l-.555,30.355L119.035,23.5a.557.557,0,1,1,1.11-.023c0,.007,0,.016,0,.023" transform="translate(-108.521 -20.726)" fill="url(#linear-gradient)"/>
<path id="Path_1889" data-name="Path 1889" d="M106.92,31.13l-.555,28.91-.555-28.91a.557.557,0,1,1,1.11-.025c0,.007,0,.017,0,.025" transform="translate(-96.464 -27.634)" fill="url(#linear-gradient)"/>
<path id="Path_1890" data-name="Path 1890" d="M93.694,38.759l-.555,27.464-.555-27.464a.557.557,0,1,1,1.11-.026c0,.008,0,.018,0,.026" transform="translate(-84.406 -34.54)" fill="url(#linear-gradient)"/>
<path id="Path_1891" data-name="Path 1891" d="M80.468,46.387l-.555,26.019-.555-26.019a.557.557,0,1,1,1.11-.027c0,.008,0,.019,0,.027" transform="translate(-72.348 -41.445)" fill="url(#linear-gradient)"/>
<path id="Path_1892" data-name="Path 1892" d="M67.242,54.016l-.555,24.573-.555-24.573a.557.557,0,1,1,1.11-.029c0,.009,0,.02,0,.029" transform="translate(-60.29 -48.351)" fill="url(#linear-gradient)"/>
<path id="Path_1893" data-name="Path 1893" d="M54.015,61.642,53.46,84.77l-.555-23.128a.557.557,0,1,1,1.11-.031c0,.01,0,.021,0,.031" transform="translate(-48.232 -55.255)" fill="url(#linear-gradient)"/>
<path id="Path_1894" data-name="Path 1894" d="M40.789,69.269l-.555,21.682-.555-21.682a.557.557,0,1,1,1.11-.033c0,.01,0,.023,0,.033" transform="translate(-36.174 -62.159)" fill="url(#linear-gradient)"/>
<path id="Path_1895" data-name="Path 1895" d="M27.563,76.893,27.008,97.13l-.555-20.237a.557.557,0,1,1,1.11-.035c0,.011,0,.024,0,.035" transform="translate(-24.116 -69.06)" fill="url(#linear-gradient)"/>
<path id="Path_1896" data-name="Path 1896" d="M14.336,84.516l-.555,18.791-.555-18.791a.579.579,0,0,1,.538-.614.573.573,0,0,1,.573.576c0,.012,0,.026,0,.038" transform="translate(-12.058 -75.96)" fill="url(#linear-gradient)"/>
<path id="Path_1897" data-name="Path 1897" d="M1.11,92.137.555,109.483,0,92.137a.58.58,0,0,1,.536-.615.573.573,0,0,1,.574.575c0,.013,0,.028,0,.041" transform="translate(0.001 -82.859)" fill="url(#linear-gradient)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 645 KiB

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1920 1920" enable-background="new 0 0 1920 1920" xml:space="preserve">
<g>
<polygon fill="#8A92B2" points="959.8,80.7 420.1,976.3 959.8,731 "/>
<polygon fill="#62688F" points="959.8,731 420.1,976.3 959.8,1295.4 "/>
<polygon fill="#62688F" points="1499.6,976.3 959.8,80.7 959.8,731 "/>
<polygon fill="#454A75" points="959.8,1295.4 1499.6,976.3 959.8,731 "/>
<polygon fill="#8A92B2" points="420.1,1078.7 959.8,1839.3 959.8,1397.6 "/>
<polygon fill="#62688F" points="959.8,1397.6 959.8,1839.3 1499.9,1078.7 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 807 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}.cls-2{fill:#13b5ec;}.cls-3{mask:url(#mask);}</style><mask id="mask" x="10" y="6" width="93.1" height="20" maskUnits="userSpaceOnUse"><g id="a"><path class="cls-1" d="M10,6h93.1V26H10Z"/></g></mask></defs><title>fa</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><circle class="cls-2" cx="16" cy="16" r="16"/><g class="cls-3"><path class="cls-1" d="M17.2,12.9l3.6-2.1V15Zm3.6,9L16,24.7l-4.8-2.8V17L16,19.8,20.8,17ZM11.2,10.8l3.6,2.1L11.2,15Zm5.4,3.1L20.2,16l-3.6,2.1Zm-1.2,4.2L11.8,16l3.6-2.1Zm4.8-8.3L16,12.2,11.8,9.8,16,7.3ZM10,9.4V22.5l6,3.4,6-3.4V9.4L16,6Z"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 766 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1867.323" height="1841.268" viewBox="0 0 1867.323 1841.268">
<defs>
<radialGradient id="radial-gradient" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#5189c8"/>
<stop offset="1" stop-color="#5189c8" stop-opacity="0"/>
</radialGradient>
</defs>
<ellipse id="Ellipse_98" data-name="Ellipse 98" cx="568.484" cy="744.5" rx="568.484" ry="744.5" transform="translate(1106.543) rotate(48)" opacity="0.697" fill="url(#radial-gradient)"/>
</svg>

Before

Width:  |  Height:  |  Size: 598 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.2 MiB

View File

@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25" height="25" viewBox="0 0 25 25">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1344" data-name="Rectangle 1344" width="25" height="25" fill="#fff"/>
</clipPath>
</defs>
<g id="Group_2626" data-name="Group 2626" transform="translate(0 0)">
<g id="Group_2625" data-name="Group 2625" transform="translate(0 0)" clip-path="url(#clip-path)">
<path id="Path_1586" data-name="Path 1586" d="M12.5,25A12.5,12.5,0,1,1,25,12.5,12.514,12.514,0,0,1,12.5,25M12.5.555A11.945,11.945,0,1,0,24.446,12.5,11.959,11.959,0,0,0,12.5.555" transform="translate(0 0)" fill="#fff"/>
<path id="Path_1587" data-name="Path 1587" d="M14.124,25.385A11.231,11.231,0,1,1,25.356,14.153,11.244,11.244,0,0,1,14.124,25.385m0-21.982A10.751,10.751,0,1,0,24.875,14.153,10.763,10.763,0,0,0,14.124,3.4" transform="translate(-1.591 -1.607)" fill="#fff"/>
<path id="Path_1588" data-name="Path 1588" d="M15.748,25.769a9.963,9.963,0,1,1,9.963-9.963,9.974,9.974,0,0,1-9.963,9.963m0-19.519A9.556,9.556,0,1,0,25.3,15.806,9.567,9.567,0,0,0,15.748,6.25" transform="translate(-3.182 -3.214)" fill="#fff"/>
<path id="Path_1589" data-name="Path 1589" d="M17.373,26.153a8.694,8.694,0,1,1,8.694-8.694,8.7,8.7,0,0,1-8.694,8.694m0-17.055a8.361,8.361,0,1,0,8.361,8.362A8.371,8.371,0,0,0,17.373,9.1" transform="translate(-4.773 -4.82)" fill="#fff"/>
<path id="Path_1590" data-name="Path 1590" d="M19,26.538a7.425,7.425,0,1,1,7.425-7.425A7.434,7.434,0,0,1,19,26.538m0-14.592a7.166,7.166,0,1,0,7.166,7.166A7.174,7.174,0,0,0,19,11.946" transform="translate(-6.364 -6.427)" fill="#fff"/>
<path id="Path_1591" data-name="Path 1591" d="M20.621,26.921a6.157,6.157,0,1,1,6.156-6.157,6.164,6.164,0,0,1-6.156,6.157m0-12.128a5.972,5.972,0,1,0,5.972,5.971,5.978,5.978,0,0,0-5.972-5.971" transform="translate(-7.955 -8.034)" fill="#fff"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 128 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

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