Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions daml/dars.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ splice-amulet 0.1.19 90987abecbcb1d004b063ddfe3b4b5d46cf3814ce89114a86c8cd75ff3c
splice-amulet 0.1.2 1446ffdf23326cef2de97923df96618eb615792bea36cf1431f03639448f1645
splice-amulet 0.1.20 23f47481dab6b1ec01339d6e14494d85bb2844c25f45b26fc5c9ef4cd4942d1f
splice-amulet 0.1.21 73e9ffdb6b0bc19a5f67372b118103926da11547ab9109eccae47e4e4cc35d6f
splice-amulet 0.1.22 fb10433a48c24f30076a7aee03a3e314b7ab02fe9a22e2069e3af92d2b6ac88a
splice-amulet 0.1.22 2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120
splice-amulet 0.1.3 0d89016d5a90eb8bced48bbac99e81c57781b3a36094b8d48b8e4389851e19af
splice-amulet 0.1.4 a36ef8888fb44caae13d96341ce1fabd84fc9e2e7b209bbc3caabb48b6be1668
splice-amulet 0.1.5 b4867a47abbfa2d15482f22c9c50516f0af14036287f299342f5d336391e4997
Expand All @@ -37,16 +37,16 @@ splice-amulet-name-service 0.1.2 711a2974d65e6ebd149704da75f3f71234798687ab895b9
splice-amulet-name-service 0.1.20 0b6748de2e613f5bc9a108b2496b85d2d661b7344c6c55eada9c0a0bf8efe0a5
splice-amulet-name-service 0.1.21 b342bbbd425902283c20eb5011eeab90cc9f69b4c534b8b757fd51b8ca7be589
splice-amulet-name-service 0.1.22 3921e7bd20670dce7530a84ad04b5f83860c21660bf1553908f76e95767c1950
splice-amulet-name-service 0.1.23 9cffe65feb664c9550937433067e9f969e3795c6fb38715e06a5e04fc1ae1f83
splice-amulet-name-service 0.1.23 edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e
splice-amulet-name-service 0.1.3 beb4b85f3f0cf36dfb93fc917d3ac218ee5d41b6e70604720cb228d85e168ee0
splice-amulet-name-service 0.1.4 053c7f4c2a77312e7d465a4fa7dc8cb298754ad12c0c987a7c401bd724e65efc
splice-amulet-name-service 0.1.5 6188c8b5f612278f988fc95c11e9742993ad3ac6ad0809f9af06ee9d366dc4a8
splice-amulet-name-service 0.1.6 a208aab2c4a248ab2eff352bd382f8b3bbadc92464123db587e8b359312a2f6c
splice-amulet-name-service 0.1.7 ba7806d9b2d593eac74a050161c54ae1325d170bf175cb66a9c1e5e5ffb88c3d
splice-amulet-name-service 0.1.8 efeb3f9b2b92e55fac4ec2d6164f95407a01477240c7465e576df4e310f54bd3
splice-amulet-name-service 0.1.9 f1b5915ad45ded616f43f83c735b7ee158b5eb58abe758a721e50eee19b3e531
splice-amulet-name-service-test 0.1.27 a1cda452d49452295766414515d04d4bc411eb39961db15cf41339bedec7bf63
splice-amulet-test 0.1.26 4badc6beb226a7a0e4216f5d58489d4a41db0bd3b53a3349dd62025268f4cbd5
splice-amulet-name-service-test 0.1.27 9d595628e2092c626f8426f455a9a2eb52a69f1e5263478f995535c9f1acb885
splice-amulet-test 0.1.26 3888a095572c524267443aab2d608808b3c1781a73c5ab8a03e747e918550590
splice-api-featured-app-v1 1.0.0 7804375fe5e4c6d5afe067bd314c42fe0b7d005a1300019c73154dd939da4dda
splice-api-featured-app-v2 1.0.0 dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea
splice-api-reward-assignment-v1 1.0.0 6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35
Expand Down Expand Up @@ -86,23 +86,23 @@ splice-dso-governance 0.1.24 4974c654485d4ecaa6b5caf8ef3c2679efa8195c4b50d4965a8
splice-dso-governance 0.1.25 dfe102514acd41f79945b8363ca84d8243be97b2b235522ce77c754a36bb8479
splice-dso-governance 0.1.26 45099e955ce443f7895125097a62c509b9ad297091c91d6377ffe94f183c0e3e
splice-dso-governance 0.1.27 014473d35514cb36583bdeca269386e46ae4e2283fe9b04beb2f53cdb408e1a2
splice-dso-governance 0.1.28 eeb461e9e430d8aaaa232f23058a28c9858d559abd083c391d7ab7e73efb4e13
splice-dso-governance 0.1.28 3d324f0c2063466db85b9c4b00e133efc9b170bfb2fc37f7203e4d2ab9f951a6
splice-dso-governance 0.1.3 b0ae3cc03e418790305a3c15f761fe495572de5827f8d322fb8b96996b783c13
splice-dso-governance 0.1.4 dc24fd18b4d151cd1e0ff6bfb7438bafb2f50fe076d0f16f50565e60b153a0be
splice-dso-governance 0.1.5 9e3ca1d22ad495dfabf3d61acae3dc1a7718f527f02092280b58cf69edfdc84c
splice-dso-governance 0.1.6 4e7653cfbf7ca249de4507aca9cd3b91060e5489042a522c589d3c4199580cd8
splice-dso-governance 0.1.7 d406eba1132d464605f4dae3edf8cf5ecbbb34bd8edef0e047e7e526d328718c
splice-dso-governance 0.1.8 1790a114f83d5f290261fae1e7e46fba75a861a3dd603c6b4ef6b67b49053948
splice-dso-governance 0.1.9 9ee83bfd872f91e659b8a8439c5b4eaf240bcf6f19698f884d7d7993ab48c401
splice-dso-governance-test 0.1.34 e94fbac6918872a6afb2535cbdd2029cba83365dc7edd81b331820ff6c5a8048
splice-dso-governance-test 0.1.34 6d73ff9fdd78a09c68b48b55ba333a3fa6b010e7392f86d0bc4311d2465e83b5
splice-test-token-v1 1.0.0 aaa0b576b5a3db49b3a4f7a4710fe6f8ae462aabbde4da89f639eb87fd62e90c
splice-test-token-v1-test 1.0.1 4eafb4e9b05999f4bcb28454fd4e691515a37ffe4b79cb118d5872aa1b82ab58
splice-test-token-v1-test 1.0.1 971061ba28c980e2f2236f53ba4c51f09ddd72cc1046020bcdc26286623548c0
splice-test-token-v2 1.0.0 a38a96b6f46c14c599b2763bc4fc68911a9cada90f89c599a1401e8e3df685e1
splice-test-token-v2-test 1.0.1 b9cb700920834987855b037d2f03a9351c81039421f3c9c1e58624f3a7ee6604
splice-test-token-v2-test 1.0.1 16a1a78766fb7f0ff9239d91c62fb45f07355c2b642067aaaca1dbcc16718342
splice-token-standard-utils 2.0.0 9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1
splice-token-standard-utils-test 1.0.1 a781fc41338d98cfba49e3f2d4413d3cc4ecf6c2fcd23a5e7ba979abcbe02be4
splice-token-standard-v1-test 1.0.16 2f112eaf6c6b6696fd7ba5cb932f79bf5e01177b19e28b3df9be5c6b16f75126
splice-token-standard-v2-test 1.0.1 178b13ee29b21d3889971304eefa2f87d482c73779169f72efd722b8efe6d18d
splice-token-standard-utils-test 1.0.1 8afbd61be63d1e8d45dcd0a5813cf7700e3fbd7f37a55dd3aa6c44613ab13c1a
splice-token-standard-v1-test 1.0.16 40ddebf2b7644ba7b6e859c3b79790b119b3f51a3a385c9454f4dc93b7bfb379
splice-token-standard-v2-test 1.0.1 ea8322f2908b7bab314c1ee1678a266602535139ea163b8c8a3f6d2554421455
splice-token-test-dummy-holding 0.0.1 1cd171c6c42ab46dc9cf12d80c6111369e00cea5cdf054924b4f26ce94b1ef5b
splice-token-test-dummy-holding 0.0.2 4f40fb033ef3db89623642c1b494e846097fa32af138b3864a63aa15937a323d
splice-token-test-dummy-holding 0.0.3 26c72abb5a4b485e58f201021de6f9e525c85863fa115536f768d6ee138ef13e
Expand All @@ -123,19 +123,19 @@ splice-util-batched-markers 1.0.0 727c5e97457d3ff841680816eb70d55834827ef756bac8
splice-util-batched-markers 1.0.1 4d91a9b044e0e996e91ee9aac3442591ffc78f16da4ff5c6f55218ba667f6192
splice-util-batched-markers 1.0.2 ec84eb67802403d91892aad61aee2e4eb34fb4e05e9158b3f677537569bcbc09
splice-util-batched-markers 1.0.3 74ee4c91b80c80b6860005ce627bdaed8f7fe6bdf3e60c9dbf3f48402d55126a
splice-util-batched-markers-test 1.0.9 bbb2e18ad1b75f075f7edf70def9faf69f1cc18d707e65ab9b5f14283fc77aa5
splice-util-batched-markers-test 1.0.9 1a9da132b7feb04699b164efa9abf14693c2fdffc3ec1235fee53e17f4a07c99
splice-util-featured-app-proxies 1.0.0 48e0c4fe4ea05e3b740404ebe37004ddd741efbdcd665c1c3199a5d6d9d944d7
splice-util-featured-app-proxies 1.1.0 81dd5a9e5c02d0de03208522a895fb85eeb12fbea4aca7c4ad0ad106f3b0bfce
splice-util-featured-app-proxies 1.2.0 653c48879064332d34af5008bdfd8e349493460e67e62b85e8e7e3392831c842
splice-util-featured-app-proxies 1.2.1 06bab917848ef275317c2539b75c23b94e03ceb55b4a1346936f7832084cd7a6
splice-util-featured-app-proxies 1.2.2 2889c094cf9678b2b666221934ea56ab169a31b257450845bd53217a8cdfe44f
splice-util-featured-app-proxies 1.2.3 677ed3473e7d412c06520843790ff27e21aaa7c292208909579592351c8eb55d
splice-util-featured-app-proxies 1.2.4 88bcea6e9990bb2edb5301c042caa25c0594742665866f049f7bd67342d0865d
splice-util-featured-app-proxies-test 1.0.15 97e71bda26ffd878a4cac2a237b931ef59da3b3b60d82e1fe6cb248492fc290e
splice-util-featured-app-proxies-test 1.0.15 6a0760f84e15e570c5fd4d1d11b0ca4f9073a70c1511900284971747c105b9dd
splice-util-token-standard-wallet 1.0.0 1da198cb7968fa478cfa12aba9fdf128a63a8af6ab284ea6be238cf92a3733ac
splice-util-token-standard-wallet 1.0.1 182892381e4245c39d3126082ec0b41a089edb61e63af518f61eae1f5c9e135a
splice-util-token-standard-wallet 1.1.0 1215d3ee8f3cb428d062d8708c2deca33c91ff99f5edefa70616646e57f93012
splice-util-token-standard-wallet-test 1.0.10 873afaaee4cf3358d23c328e134474e19df11fffcc3fd1a4b837b64a7ed0bb6b
splice-util-token-standard-wallet-test 1.0.10 46fd8814bee9c866f79a0ae4fc5ddb008e66b806d21bc39509950fff73363778
splice-validator-lifecycle 0.1.0 cef96fac957362f1fc097120bd13686cac7f84fbc8053afa994a1f9214d9570c
splice-validator-lifecycle 0.1.1 1ddf05c96002914593c929848b786f34c753fb0be07717d1786be177a564aada
splice-validator-lifecycle 0.1.2 57e2f15f9755db1f00e51c52c319294264a21ad71c6bc1e7cd70db4b164c0aaa
Expand All @@ -162,7 +162,7 @@ splice-wallet 0.1.2 c162e08a4ec0428bfa870b6d9040989e575c74199c3a80558c62e03196dd
splice-wallet 0.1.20 e485c2eb59cca556e0e2ecfaaef45346dd0ba64f9976a3957938d814f846c78c
splice-wallet 0.1.21 f799a58fa53dfe48bae52bd5dbcc2b578a7d4dfee3ae3f4eb7635fe9a8cc67d3
splice-wallet 0.1.22 a78daeeb1a4a2405828b29f8c04814725dbd97ee5a60bd02e839f32518640afa
splice-wallet 0.1.23 727c0fb9711d59b506fbb3cff2342e55eb583bb88682a946220525c304feca4a
splice-wallet 0.1.23 2f515a6c27c52d4a0438f8b6d2651a33dfb705157165b45d347fc4dfb2b7ba10
splice-wallet 0.1.3 2c35bb4f5084ea66db59717d21750bfd64c43147ef5fd5166615092d592a6917
splice-wallet 0.1.4 141dad2d33b6410b8e1c35a0c4f8f76cb691e4d9a4410ce89f33f373855317e1
splice-wallet 0.1.5 614b525a50c624062d851ce7df5bdb90ddfa0d6871c486cb6e2c7b694bfbce59
Expand All @@ -185,15 +185,15 @@ splice-wallet-payments 0.1.19 eae5715f0ddd5ff4b8000cff13191b76d34e5d80d05465de92
splice-wallet-payments 0.1.2 775f5eb9c0249509adda5eb3ea4ee31bb953601168c18880df6f2ff09ec4298a
splice-wallet-payments 0.1.20 340afccb702179069fc81044890c435c5c8565df061b2efbfccf618c33a04e37
splice-wallet-payments 0.1.21 dc1a2f4ff4774e00c388f1bfce48a23c3539b8ea0d0ebf99b8df840a058ef873
splice-wallet-payments 0.1.22 866ea53bea2afc099c560ad4c386a1736859841b17c422836f133d605ee51616
splice-wallet-payments 0.1.22 4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c
splice-wallet-payments 0.1.3 b953b3729c81a55e598a364be7d0c0574750df3de12a7a1b53a300f217cb5c5c
splice-wallet-payments 0.1.4 12177f54873c1094ea169874ad0d7838383fd137f302d16356e93f28dfbc0fcc
splice-wallet-payments 0.1.5 2177b7a579fe6d3d510c7bcda99d39ece104ae24cfd1b78ac5616990d2d6c675
splice-wallet-payments 0.1.6 6124379528eeb6fa17ecdab15577c29abb33d0c0d34dc5f2680a1ac4f49b1649
splice-wallet-payments 0.1.7 4e3e0d9cdadf80f4bf8f3cd3660d5287c084c9a29f23c901aabce597d72fd467
splice-wallet-payments 0.1.8 e48ea337ee3335c8bb3206a2501ce947ac1a7bdb1825cee8f28bad64f5a7bc4b
splice-wallet-payments 0.1.9 7f4e081ad96f2ccded0c053b0cf5ddddae1139dfc3bb89cefcf77ea70f2cecb7
splice-wallet-test 0.1.27 b697558851c8f11e345945c67c1f8385f879bc3ece4ed840c8c386fd3e4f7b55
splice-wallet-test 0.1.27 21669b4dff108336a6b7cb4afc905b4bb3f30163fce70989609fe931ed57756c
splitwell 0.1.0 075c76de553ab88383a7c69de134afa82aacfdf8ea8fcfe8852c4b199c3b2669
splitwell 0.1.1 ccb1a0215053062202052e1a052f9214da3fdae5253a6d43e2e155ff4f57fe75
splitwell 0.1.10 d42676a366f7ca7a2409974dd3054aa4d83ab29baa3b2086ad021407b0a1a295
Expand All @@ -210,12 +210,12 @@ splitwell 0.1.2 778edd2c228c6b68198d4d033885b2d0dae7daaee55d7df3edd9dfdf1f10fbd0
splitwell 0.1.20 af686139dda12540ab05a292987f5fa2edd0c05af62d9651384d005e9a91043e
splitwell 0.1.21 f646cf275b4c5139711469c92fbe702c498614edf200d8085305b2e43e28936a
splitwell 0.1.22 b97352bf1b70f6be481d7cd2b4ce22396008bbf611b488243a694f30437ed3a9
splitwell 0.1.23 68d3911f72347dc787c336f73af3c036004c982f591cb55e7b4f2fb45f5e50e6
splitwell 0.1.23 a2132140a687424fcad90799736d6ff04e65ee050c72c741769e5ce48b3481b2
splitwell 0.1.3 7cde068cde689584f86a2499689d5cb165264d96496721e24ac6fb909f770a58
splitwell 0.1.4 85557b86cd4f330f093915db1ea26eac5092de6b5ddae0690146f6059c89419b
splitwell 0.1.5 a68e78774a7be655f5744c8ae0ac8b46d55ef6d1e7661bc27b9296154d56ac74
splitwell 0.1.6 872da0dd7986fd768930f85d6a7310a94a0ef924e7fbb7bb7a4e149f2b5feb74
splitwell 0.1.7 841d1c9c86b5c8f3a39059459ecd8febedf7703e18f117300bb0ebf4423db096
splitwell 0.1.8 63b8153a08ceb4bf40d807acc5712372c3eac548c266be4d5e92470b4f655515
splitwell 0.1.9 b6267905698d2798b9ef171e27d49fb88e052ec0ec0e0675a3a1b275c7d037d4
splitwell-test 0.1.27 b606a7cc393caae66e79ea10f40611d8629013c955118b54c0c85e11f2d87c6a
splitwell-test 0.1.27 4cade4cf6fd75fd5f255bbb187ef1a491c717364e111022dfec6b9f68c64e8b1
Binary file modified daml/dars/splice-amulet-0.1.22.dar
Binary file not shown.
Binary file modified daml/dars/splice-amulet-name-service-0.1.23.dar
Binary file not shown.
Binary file modified daml/dars/splice-dso-governance-0.1.28.dar
Binary file not shown.
Binary file modified daml/dars/splice-wallet-0.1.23.dar
Binary file not shown.
Binary file modified daml/dars/splice-wallet-payments-0.1.22.dar
Binary file not shown.
Binary file modified daml/dars/splitwell-0.1.23.dar
Binary file not shown.
48 changes: 48 additions & 0 deletions daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,54 @@ instance HasCheckedFetch MemberTraffic ForDso where
instance HasCheckedFetch MemberTraffic ForMemberTraffic where
contractGroupId MemberTraffic{..} = ForMemberTraffic with ..

-- Dedicated-synchronizer registration (PoC)
------------------------------------------------
--
-- A "dedicated synchronizer" is a synchronizer run by its own operator (stood up with the
-- Splice software), separate from the decentralized synchronizer that hosts Amulet. Its traffic
-- is funded by burning Amulet on the decentralized synchronizer. Before any Amulet can be
-- burned for such a synchronizer it is registered once, by DSO governance, via
-- `DsoRules_RegisterSynchronizer` (in the governance package), which creates this contract.
--
-- The registration binds a stable synchronizer id to the `operator` party that runs it. Two
-- consumers read it:
-- * `AmuletRules_BuyDedicatedSyncTraffic` (splice-amulet) authorizes an Amulet burn for a
-- synchronizer id only if a matching `RegisteredSynchronizer` is supplied (via explicit
-- disclosure), and uses `operator` as the observer of the resulting traffic record.
-- * the `operator` itself, which observes this contract and thus learns it is registered.
--
-- This template lives in splice-amulet (not the governance package) so that `AmuletRules` can
-- `fetch` it: the governance package depends on splice-amulet, not the reverse.
template RegisteredSynchronizer with
dso : Party
-- ^ The DSO party; sole signatory. Created by DSO governance (a `DsoRules` vote).
synchronizerId : Text
-- ^ Id of the dedicated synchronizer this registration authorizes Amulet-funded traffic for.
operator : Party
-- ^ The party operating the dedicated synchronizer. Observes this registration and every
-- traffic purchase for its synchronizer (see `DedicatedSyncTraffic`).
where
signatory dso
observer operator

ensure not (T.isEmpty synchronizerId)

-- Public read choice, mirroring OpenMiningRound_Fetch: lets a buyer who is neither
-- signatory nor observer read this contract inside AmuletRules_BuyDedicatedSyncTraffic
-- when it is passed via explicit disclosure. Returns the contract unchanged.
-- (Plain comment, not a `-- |` doc comment: damlc docs rejects a doc comment attached
-- directly to a choice.)
nonconsuming choice RegisteredSynchronizer_Fetch : RegisteredSynchronizer
with
p : Party -- the reader (buyer/provider) authorized to read this disclosed contract
controller p
do pure this

-- Group-id check for `fetchPublicReferenceData`: a `RegisteredSynchronizer` is scoped to the
-- DSO party, so reads are validated against the expected DSO party (mirrors `MemberTraffic`).
instance HasCheckedFetch RegisteredSynchronizer ForDso where
contractGroupId RegisteredSynchronizer{..} = ForDso with ..

instance Patchable BaseRateTrafficLimits where
patch new base current = BaseRateTrafficLimits with
burstAmount = patch new.burstAmount base.burstAmount current.burstAmount
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-- Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
-- SPDX-License-Identifier: Apache-2.0

-- | PoC (dedicated-synchronizer traffic): register a dedicated synchronizer via DSO governance
-- (a supermajority vote) and assert the resulting `RegisteredSynchronizer` contract.
--
-- This is the first rung of the ladder: it only proves that governance can create the
-- registry entry that a later Amulet-funded traffic purchase will read. Buying traffic against a
-- registered synchronizer is exercised in the splice-amulet test (next PR).
module Splice.Scripts.TestRegisterSynchronizer where

import DA.Assert

import Daml.Script

-- The governance action + its argument record.
import Splice.DsoRules
-- The registry contract created by the vote. It lives in splice-amulet (AmuletRules must be
-- able to fetch it), and this test package data-depends on splice-amulet.
import Splice.DecentralizedSynchronizer (RegisteredSynchronizer)

-- Shared helpers that spin up a 4-SV network and drive a vote end-to-end.
import Splice.Scripts.DsoTestUtils

-- | Register a dedicated synchronizer via a supermajority SV vote, then verify the registration:
-- signed by the DSO party, naming the operator, and observed by that operator.
test_RegisterSynchronizer_viaVote : Script ()
test_RegisterSynchronizer_viaVote = do
-- 4-SV network; returns the DSO party and the Super Validators `sv1..sv4`.
(app, dso, (sv1, sv2, sv3, sv4)) <- initMainNet

-- The party that will operate the dedicated synchronizer.
operator <- allocateParty "dedicatedSyncOperator"
let dedicatedSyncId = "dedicated-sync::1220dededededededededededededededededededededededededededededede"

-- Supermajority SV vote to register the dedicated synchronizer. `initiateAndAcceptVote` routes
-- through DsoRules_RequestVote -> DsoRules_CastVote (x3) -> DsoRules_CloseVoteRequest, which on
-- acceptance calls executeActionRequiringConfirmation, dispatching to DsoRules_RegisterSynchronizer.
initiateAndAcceptVote app [sv1, sv2, sv3, sv4] $
ARC_DsoRules with
dsoAction = SRARC_RegisterSynchronizer DsoRules_RegisterSynchronizer with
synchronizerId = dedicatedSyncId
operator

-- The registration now exists on-ledger with exactly the fields we voted for.
registrations <- query @RegisteredSynchronizer dso
case registrations of
[(_cid, reg)] -> do
reg.dso === dso
reg.synchronizerId === dedicatedSyncId
reg.operator === operator
_ -> abort $ "expected exactly one RegisteredSynchronizer, got " <> show (length registrations)

-- The operator is an observer, so it can see its own registration.
operatorView <- query @RegisteredSynchronizer operator
length operatorView === 1
Loading
Loading