2400 Commits

Author SHA1 Message Date
edouardparis
9fc7c093ff
Merge #1607: Hint user if the key of signing device is not part of the wallet descriptor
c8e455c8ceb2a7b5408380dbe3cd30ce3959ff57 lianad: add a test for LianaDescriptor::contains_fingerprint() (pythcoiner)
aead34cc8eaa3e74d2c76c7e1e8341d756d779a2 installer: hint the user if the plugged signing device is not part of the descriptor (pythcoiner)
5ae13dd025c2e038e17746f5bfc8cf72ec5120c7 liana-ui: make it more clear when a device key is not part of the wallet descriptor (pythcoiner)
fa8fd4782f97b8969f6a655e0511bf8f96924232 liana: implement LianaDescriptor::contains_fingerprint() (pythcoiner)

Pull request description:

  This PR:
  - [x] Add `LianaDescriptor::contains_fingerprint()` method

  - [x] make more explicit when a signing device is not part of the wallet descriptor

  before (user had to hover the button to see the tooltip):
  ![image](https://github.com/user-attachments/assets/c61a95a0-a9b2-4f85-8245-e5490c7e37af)

  after:
  ![image](https://github.com/user-attachments/assets/1d17775e-6c26-4eeb-83a7-c8621d44c54c)

  - [x] Hint the user in the installer if the plugged device is not part of the created/imported descriptor:

  ![image](https://github.com/user-attachments/assets/e22f0180-513e-48d5-b293-00677e328285)

ACKs for top commit:
  jp1ac4:
    tACK c8e455c8ceb2a7b5408380dbe3cd30ce3959ff57.

Tree-SHA512: 092b8cb6efe6b6a6dc4f8505649783cb7c83c231242ab14f479b573e12cd61bab4e6e27a173bee19097d3ad90a8f1e578ecf4b699a4a481b40588f5f60cb9c71
2025-05-06 14:22:24 +02:00
edouardparis
13709aa302
Merge #1693: gui: review primary buttons in the application
8e98f828a0b61f6a2b2a988118e8557dd33f9d59 gui: review primary buttons in the application (Thomas Ballivet)

Pull request description:

  You can see below the updated GUI. If needed I can make the panel's "Broadcast" button secondary when the broadcast modal is displayed.

  ![Capture d’écran du 2025-05-04 18-04-02](https://github.com/user-attachments/assets/4737af03-c5c9-4bac-a215-3a008bc6a3f8)

  ![Capture d’écran du 2025-05-04 18-03-49](https://github.com/user-attachments/assets/d4bfc3ec-5aff-4957-8748-1171888daab7)

  ![Capture d’écran du 2025-05-04 17-51-13](https://github.com/user-attachments/assets/b7c1b069-0aa0-4c70-8c3e-3cee4636ec9f)

  ![Capture d’écran du 2025-05-04 17-46-38](https://github.com/user-attachments/assets/8c065795-9cf5-4e97-a2f2-8f2a654eba58)

  ![Capture d’écran du 2025-05-04 17-42-08](https://github.com/user-attachments/assets/750f7463-7aba-4287-8474-9f303926a6bf)

  ![Capture d’écran du 2025-05-04 17-41-33](https://github.com/user-attachments/assets/613ee1cc-beb6-4139-9f51-f4323d9224e6)

  ![Capture d’écran du 2025-05-04 17-38-52](https://github.com/user-attachments/assets/db04bfe1-77b6-418b-819a-04b208a9526c)

  ![Capture d’écran du 2025-05-04 17-38-38](https://github.com/user-attachments/assets/b3405548-363e-42cf-9471-26e5094d0fa1)

  ![Capture d’écran du 2025-05-04 17-37-02](https://github.com/user-attachments/assets/0451d4e8-fdbf-49ff-9a78-f9a245611aad)

ACKs for top commit:
  edouardparis:
    utACK 8e98f828a0b61f6a2b2a988118e8557dd33f9d59

Tree-SHA512: 80bed065f3eca6c92273aaa9fd62fd61f31121e14e66325efbcac3b95d2898f52982872debf4d8cf8238f2dd4f37d8858c644f240784888ea63b73a61d0cf487
2025-05-05 10:41:28 +02:00
edouardparis
19043a2db9
Merge #1684: Upgrade pytest
c20318af64fddb2959ba90f2d510af42f4e2e20e Upgrade pytest (thomas)

Pull request description:

  Had issues because of a too old version of pytest-timeout. I had to update it so I took advantage of it to update pytest and other requirements

ACKs for top commit:
  pythcoiner:
    tACK c20318af on arch + python 3.10/3.13

Tree-SHA512: 22e7abf810c49d29f908e493db4055a9fd94d8a623e8a9ae8cfc33e2b9ab1865ad64acb8a2837b0b9b0ed1846b1ba9ea21242ccd7f0a4f4f221041d8465c55bd
2025-05-05 09:29:29 +02:00
Thomas Ballivet
8e98f828a0 gui: review primary buttons in the application 2025-05-04 18:08:15 +02:00
edouardparis
473dd425cc
Merge #1691: refac liana-gui: network flag redirects to launcher
c4715acb047b48e882102e38b67ed9bb37816306 refac liana-gui: network flag redirects to launcher (edouardparis)

Pull request description:

  Adding the network flag to liana-gui command opens now the launcher with the network set instead of trying to run the wallet in the network directory.

  This is preparatory work for the multiple wallet feature.

ACKs for top commit:
  edouardparis:
    Self-ACK c4715acb047b48e882102e38b67ed9bb37816306

Tree-SHA512: dad9b349c55d6e3884e79d9d314f926121c590f8b59a2322b2aee9461cfb2ddcc2d6b3d105d0bde4684fd2e097077cecf0a2f0f365e0ce52b6cadb1dc935d96a
2025-05-02 11:41:23 +02:00
edouardparis
c4715acb04 refac liana-gui: network flag redirects to launcher
Adding the network flag to liana-gui command opens now
the launcher with the network set instead of trying to
run the wallet in the network directory.

This is preparatory work for the multiple wallet feature.
2025-05-02 10:01:25 +02:00
edouardparis
6fe88ad4df
Merge #1683: Add connect cache file
fe14c7807e60a080052ebc94c1e0d160c8db8ed6 pin email in liana connect login (edouardparis)
1746314e7d8ef4e06cc05951dc620d88d280d26e Add liana-connect cache file (edouardparis)

Pull request description:

  This PR introduces a new file in the network directory: `connect.json` where the access tokens per email accounts are stored. Race conditions and potential conflicts to update the file are handle by the crate `async-fd-lock`.

  If the cache is missing (like for a previous liana generated setup), then the user is asked to authenticate again.
  The change does not remove totally the legacy `refresh_token` field in the settings file in order to be backward compatible with previous liana-gui versions.

ACKs for top commit:
  edouardparis:
    Self-ACK fe14c7807e60a080052ebc94c1e0d160c8db8ed6

Tree-SHA512: a4ce6c78e8edd8378f227ae464a5ff0ebd88ee16b519a26f78eb95c9ab5752d14a50ea559902ce5edb9a00452e77b2552c2743a75182a9de825846b5c6f4d06c
2025-05-02 09:36:16 +02:00
edouardparis
fe14c7807e pin email in liana connect login 2025-05-02 09:15:10 +02:00
edouardparis
1746314e7d Add liana-connect cache file 2025-05-02 09:15:10 +02:00
edouardparis
102a8d841d
Merge #1209: gui: disable replacement fee input if tx is already replaced
ad2c096715da49223f7c2cf3389e575b7e62a064 gui: disable replacement fee input if tx is already replaced (pythcoiner)

Pull request description:

  this PR disable input on feerate TextInput if the tx already have been replaced, it's fine to do so because we still can RBF the new replacing tx.

  ![image](https://github.com/user-attachments/assets/c5ad2ed3-50f0-41e0-924b-261896174900)

  close #1138

ACKs for top commit:
  jp1ac4:
    tACK ad2c096715.

Tree-SHA512: 528dc513ee83a839c86a6dd8d49fa5af61814e7c440d5337d294205269ebcef3d50001a5b41815c95276d4f3e6660d5f5e081456feb77843b527d8f9eed897b8
2025-05-01 14:09:40 +02:00
pythcoiner
ad2c096715
gui: disable replacement fee input if tx is already replaced 2025-05-01 10:52:36 +02:00
edouardparis
699b130d51
Merge #1682: ci: use self-hosted runner for integration tests
eac6cdd197d75e957387db77126d2f258fd1bb27 ci: use self-hosted runner for integration tests (pythcoiner)

Pull request description:

  this PR:
   - move integrations tests from cirrus to a self hosted github worker (this solve many of the "timeout" errors)
   - remove usage of docker: the worker run directly on the host machine (this solve almost remaining issues and cut integration test running time by half)

ACKs for top commit:
  edouardparis:
    ACK eac6cdd197d75e957387db77126d2f258fd1bb27

Tree-SHA512: 94035ed7b80c71b57c8507a64088898da7e7a8d6c83269a60abd330f592ad83ef032b7943bd3d2276494b568249194f816f6c4a109b27a5d1788075fecb3aba9
2025-04-30 13:50:00 +02:00
edouardparis
ecd843c689
Merge #1420: gui(installer): change collapse icon from left arrow to righ arrow
53e773a0ff28d0428b32fd57b13df1fec93f851e gui(installer): change collapse icon from left arrow to righ arrow (pythcoiner)

Pull request description:

  Fixes #1416

  ![image](https://github.com/user-attachments/assets/8bcc3cbe-0db5-41aa-bd54-7e1a069aaaa9)

ACKs for top commit:
  edouardparis:
    utACK 53e773a0ff28d0428b32fd57b13df1fec93f851e

Tree-SHA512: 391e4260080be40d70f48b20f9648f09249c3a9d7262fafde45cd0f40857c701c268234a2e5ccca6f13365db440135ca238532a309d1bafdbfc0958efbfb8bf7
2025-04-30 11:15:04 +02:00
pythcoiner
53e773a0ff
gui(installer): change collapse icon from left arrow to righ arrow 2025-04-30 11:10:17 +02:00
pythcoiner
eac6cdd197
ci: use self-hosted runner for integration tests 2025-04-30 10:34:54 +02:00
pythcoiner
c8e455c8ce
lianad: add a test for LianaDescriptor::contains_fingerprint() 2025-04-30 08:02:24 +02:00
pythcoiner
aead34cc8e
installer: hint the user if the plugged signing device is not part of the descriptor 2025-04-30 08:02:24 +02:00
pythcoiner
5ae13dd025
liana-ui: make it more clear when a device key is not part of the wallet descriptor 2025-04-30 08:02:23 +02:00
thomas
c20318af64 Upgrade pytest 2025-04-29 17:11:35 +02:00
edouardparis
4de0d7bd29
Merge #1680: bump async-hwi 0.0.28
9f619f2a79be887b5d795b7c2e45c3f0c5b35a9a bump async-hwi 0.0.28 (edouardparis)

Pull request description:

ACKs for top commit:
  edouardparis:
    Self-ACK 9f619f2a79be887b5d795b7c2e45c3f0c5b35a9a

Tree-SHA512: 4df44c9e5f18a4f12c47e86a3560fe519de0698247c49a41ff48909f23ead57ac9be5dd2ba511535413685ffdfedebf6d0a685f1dbab812cef1725cef8aab49a
2025-04-29 15:51:09 +02:00
edouardparis
9f619f2a79 bump async-hwi 0.0.28 2025-04-28 18:30:15 +02:00
edouardparis
3da69f0cec
Merge #1668: Small fixes and improvements to the Recovery panel UI
356301c79c6f621e8329287f70a112ddbb16d43d feat: add brief overview of recovery feature (Michael Mallan)
30aedb3e5b8b10cb0df9f937a5d362fccb91bf34 fix: use singular for one coin (Michael Mallan)
eb45d6ef8f50ea4384b1f5ce9fd4f0c0aaf98237 fix: show tooltip above to improve legibility (Michael Mallan)
ea8e8453d7ae59862f326f8e5111fd3d0b5ea9cc fix: clarify available recovery paths wording (Michael Mallan)

Pull request description:

  This fixes and implements the items from #1664, except for the alias refresh, which is covered by #1667.

ACKs for top commit:
  edouardparis:
    utACK 356301c79c6f621e8329287f70a112ddbb16d43d

Tree-SHA512: ca5c71d214126e9447e48be5be9294c72b046136223f5b7848ee458c726ebf316042c612763a5c1a146450c15a566e56a2521bd2f0c2b6e0a04c7dcbc40163f7
2025-04-28 11:58:05 +02:00
edouardparis
47dd98ebfb
Merge #1674: Use type wrapper instead of PathBuf for directories
bb7777878ea639def09a50f52fdd338467e8a87d Use type wrapper instead of PathBuf for directories (edouardparis)

Pull request description:

  With the multiplicity of directories, liana directory, network directory and in the future per wallet lianad directories, passing a simple type PathBuf does not transmit to the contributors the information about which directory each module works with.

  This commit introduces wrappers around PathBuf
  to give this information and link parent directories to their child directories.

ACKs for top commit:
  jp1ac4:
    ACK bb7777878ea639def09a50f52fdd338467e8a87d.

Tree-SHA512: 3ed1e8a1e56f238c51768b9aef64a826527a89dc584976085db5cd8f8823f71910ee2e94fc09c78f7ce8de34535c9e416883a84a3a18430d1505a02ab2f88fb9
2025-04-28 11:41:57 +02:00
edouardparis
bb7777878e Use type wrapper instead of PathBuf for directories
With the multiplicity of directories, liana directory,
network directory and in the future per wallet lianad
directories, passing a simple type PathBuf does not
transmit to the contributors the information about
which directory each module works with.

This commit introduces wrappers around PathBuf
to give this information and link parent directories
to their child directories.
2025-04-28 11:14:35 +02:00
edouardparis
55ccf23f86
Merge #1672: Fix sliders background color
7664567d41e54a79fd62a46077feea3f6ec28196 Fix sliders background color (use light grey) (thomas)
8a9dc083ab5a07cca9a0ddc699d5f5b83bfaf1ad Fix sliders background color (thomas)

Pull request description:

  You can see here the black background for the slider :

  ![Capture d’écran du 2025-04-24 14-39-48](https://github.com/user-attachments/assets/70054cf8-c0b7-4f4c-8eab-bb25117fa832)

  Closes #1670

ACKs for top commit:
  pythcoiner:
    utACK 7664567

Tree-SHA512: 2c0954ab0d4571d19cc84e58f1ba6fe0a66aacdc3a4cd95a90caf3f63768724a3ce98ad47a4ac786519c6eda6f12726299ebd2ac6688da41b7de857916248432
2025-04-28 09:50:10 +02:00
edouardparis
afaf29f889
Merge #1667: fix: ensure spend (& recovery) panel steps use latest fingerprint aliases
7d2a1d4d315819ad18c040c7ee3e2830b40d8d6f fix: ensure spend panel steps use latest wallet (Michael Mallan)

Pull request description:

  This fixes one of the items from #1664, but it's a little different from the other items there so I felt a separate PR would be better.

  This fixes an issue for the Recovery panel that was introduced by #1658, but which was already present in the Send panel. If, while creating a regular spend, the user edits the fingerprint aliases, these updated aliases would not have shown in the signing info of the draft PSBT. For a recovery, this issue arises on the first step when selecting a recovery path, where the aliases are shown for each key required on that path.

  The issue arises because the `wallet` field of individual steps was not being updated.

  Now, the `wallet` will be stored by `CreateSpendPanel` and used by `load()` when moving between steps. Furthermore, the `WalletUpdated` message will be used to update the current step directly.

ACKs for top commit:
  edouardparis:
    utACK 7d2a1d4d315819ad18c040c7ee3e2830b40d8d6f

Tree-SHA512: c7b4d3da57bb3e856d101128f581ec3df055d1e2892ec3f1ba04550495250ed9bd9d5193760d0883224e0368a7cd425dfa010fc214e204f764176b975c66d515
2025-04-24 17:34:32 +02:00
thomas
7664567d41 Fix sliders background color (use light grey) 2025-04-24 16:36:36 +02:00
thomas
8a9dc083ab Fix sliders background color 2025-04-24 14:43:06 +02:00
Michael Mallan
7d2a1d4d31
fix: ensure spend panel steps use latest wallet
The wallet is used in some steps to get fingerprint aliases.

The recovery panel previously handled a wallet update, but this
was omitted when making the recovery panel part of the spend
panel.

This bug already existed for the final step of a regular spend
where the signing information would show old aliases if these
were updated while defining the spend.
2025-04-24 13:31:10 +01:00
edouardparis
b2f28b94d1
Merge #1671: Refac services module
7085542066006d1d0debbe6fff0b3463ace834f1 Move lianalite to services::connect module (edouardparis)
f3ae84f91c2028d8e53da0d096867c8cf13a54c4 Move keys service to its own submodule (edouardparis)

Pull request description:

  Move the current client implementation for https://keys.wizardsardine.com from `services` to `services::keys`.
  Move the liana-connect client implementation to `services::connect`

ACKs for top commit:
  jp1ac4:
    ACK 7085542066006d1d0debbe6fff0b3463ace834f1.

Tree-SHA512: 853f8cde9de768f0b087125b7ae9a5aae3fec9a5d6085ccf0ae72e6b75c7833424ddf482bcc9eefeea05f35ef59b65727af8f6e0af1efcf0a95217f3d9b74b2c
2025-04-24 14:13:25 +02:00
edouardparis
7c12f6fe12
Merge #1666: Prepare datadir for multiple wallet support
61bc0ffbc85748437da0155ea25a5b741306aef2 tests: use data_directory (edouardparis)
6ccaa0573b42b8e1998f3a780e2f714af3ce9b6d Prepare datadir for multiple wallet support (edouardparis)

Pull request description:

  A new field data_directory is introduced in lianad configuration, it resolves directly to the path of the wallet datadir without the per network reasoning. The previous data_dir field is kept for backward compatibility for already generated configuration file.

ACKs for top commit:
  jp1ac4:
    ACK 61bc0ffbc85748437da0155ea25a5b741306aef2.

Tree-SHA512: da2e1bcda9bbd4b11d29833694bc8f6f88506fd8f2d423c7eb8cab3a58f3e6a0b4330e89393f7cc70e5838d770a1571d8b5bdce1d83b068d1e958be3ee183021
2025-04-24 14:09:07 +02:00
edouardparis
7085542066 Move lianalite to services::connect module 2025-04-24 11:38:19 +02:00
edouardparis
f3ae84f91c Move keys service to its own submodule 2025-04-24 11:28:25 +02:00
edouardparis
61bc0ffbc8 tests: use data_directory 2025-04-23 18:53:56 +02:00
Michael Mallan
356301c79c
feat: add brief overview of recovery feature
This adds some explantory text about the recovery panel.

For consistency, the text stating that no recovery paths are
available will be shown in the same card as when recovery paths
are available, which will help differentiate between this text
and the explanatory text.
2025-04-23 17:24:12 +01:00
Michael Mallan
30aedb3e5b
fix: use singular for one coin 2025-04-23 17:20:27 +01:00
Michael Mallan
eb45d6ef8f
fix: show tooltip above to improve legibility 2025-04-23 17:20:25 +01:00
Michael Mallan
ea8e8453d7
fix: clarify available recovery paths wording
The previous wording could be misleading for recovery paths that
had already been available since many blocks ago.

For the user, it's enough to know that the path is available, i.e.
a spend on this recovery path can be created and broadcast.
2025-04-23 17:18:31 +01:00
edouardparis
6ccaa0573b Prepare datadir for multiple wallet support
A new field data_directory is introduced in lianad configuration, it
resolves directly to the path of the wallet datadir without the per network
reasoning. The previous data_dir field is kept for backward
compatibility for already generated configuration file.
2025-04-23 17:27:28 +02:00
edouardparis
1213858489
Merge #1665: Remove the link between gui config and lianad config
19f5132ee8439ef3d4d27dd7254104d60c8540af Remove the link between gui config and lianad config (edouardparis)

Pull request description:

  This commit is part of preparatory work to support multiple wallets.

  This commit introduces two breaking change:

  The fields daemon_config_path and daemon_rpc_path are removed. The GUI will deduce these values from their expected location in the root data directory.

  Because this link is removed, the gui flag --conf is not useful anymore as it cannot then find the location of the root data directory.

ACKs for top commit:
  jp1ac4:
    ACK 19f5132ee8439ef3d4d27dd7254104d60c8540af.

Tree-SHA512: f883781e935e2253ebc2d4b71331c12efbaa142d45c418d17411c3de0b2288127832de8ff34eb24d07abfdb8e3045b48c3e5c3773857518c3a28df2a7c46263c
2025-04-23 13:50:13 +02:00
edouardparis
a5391d9d5a
Merge #1658: feat: Add coin control to Recovery panel
c7bbbd854ccfb8f2dccb6e7f63b6f4c982cd76c1 feat: enable coin control for recovery spends (Michael Mallan)
c2f964d5b365501ec5a608a8f8333ffeb1edc2b7 fix: load tip height directly rather than from cache (Michael Mallan)
0d9cf43bf9c623221be6ed9882ec7df6e710566d fix: avoid overflow when checking for previous step (Michael Mallan)
83c90b085a8fc3c6f738678a01b63f2811a33600 refactor: get first timelock from descriptor (Michael Mallan)
0514f743daae738c05bb124ce55f0ae01193df01 refactor: add function to filter coins for selection (Michael Mallan)
934d0c76f486016bdd2a7098d14694b9ba470442 fix: grey out next button in case of error (Michael Mallan)
71541c69bae7f8f33659337ad66e7ca161cbcef4 feat: support outpoints recovery parameter (Michael Mallan)

Pull request description:

  This implements #1641.

  The recovery process is treated as a regular spend, with an initial step for selecting the recovery path.

  Further refactoring to `DefineSpend` could be applied in a follow-up to clearly distinguish between the three kinds of spends now handled:
  1) regular primary path spend to external recipient(s)
  2) self-send (using primary path)
  3) recovery spend

ACKs for top commit:
  edouardparis:
    ACK c7bbbd854ccfb8f2dccb6e7f63b6f4c982cd76c1

Tree-SHA512: 2a949bed0e1d1eedc5179544597b36ff124badc31264672765ea77a8a3cd1257334190739ece5da25422d5a9009e6cf58f9f70ae1f0ebe4903aa455342142870
2025-04-23 13:49:35 +02:00
Michael Mallan
c7bbbd854c
feat: enable coin control for recovery spends
The regular spend panel has been updated to allow for recovery
spends.

A recovery spend will use the same panel type as a regular spend,
with an extra step added for selecting the recovery path.
2025-04-23 10:26:55 +01:00
edouardparis
19f5132ee8 Remove the link between gui config and lianad config
This commit is part of preparatory work to support
multiple wallets.

This commit introduces two breaking change:

The fields daemon_config_path and daemon_rpc_path are removed.
The GUI will deduce these values from their expected
location in the root data directory.

Because this link is removed, the gui flag --conf is not useful
anymore as it cannot then find the location of the root data directory.
2025-04-23 11:14:55 +02:00
Michael Mallan
c2f964d5b3
fix: load tip height directly rather than from cache
This ensures the coins are sorted according to the latest
tip height in case the cache has not been recently refreshed.
2025-04-23 09:59:56 +01:00
Michael Mallan
0d9cf43bf9
fix: avoid overflow when checking for previous step 2025-04-23 09:59:54 +01:00
Michael Mallan
83c90b085a
refactor: get first timelock from descriptor 2025-04-23 09:59:52 +01:00
Michael Mallan
0514f743da
refactor: add function to filter coins for selection 2025-04-23 09:59:51 +01:00
Michael Mallan
934d0c76f4
fix: grey out next button in case of error
It should not be possible to click the Next button if there's
any error.

This could arise for a self-send if a very high feerate is chosen
and there are insufficient funds. In this case, the Next button
will now be greyed out until form values are edited and the error
has disappeared.
2025-04-23 09:59:49 +01:00
Michael Mallan
71541c69ba
feat: support outpoints recovery parameter
This changes the GUI daemon trait's create_recovery method to
support passing an outpoints parameter. For now, however, this
method is called with an empty outpoints slice, meaning that all
recoverable coins will be used.
2025-04-23 09:59:44 +01:00
edouardparis
0ff3479d56
Merge #1662: Show fee next to feerate input when creating a new spend
b426d31914bf906d65307bdeb6851430d59b399d Adapt redraft to display fees (thomas)

Pull request description:

  ![Capture d’écran du 2025-04-21 07-41-39](https://github.com/user-attachments/assets/d9de2c77-a458-4116-bce2-e3ca530372cf)

  ![Capture d’écran du 2025-04-21 07-42-33](https://github.com/user-attachments/assets/a9648183-74f2-4ec6-8a8f-8667baa70fea)

  Closes #1653

ACKs for top commit:
  edouardparis:
    ACK b426d31914bf906d65307bdeb6851430d59b399d

Tree-SHA512: 23d3b15d0b3ec560a0a6992c2efe2557b3f5a142c690878a0c67893182560431e14ee3f4e5f9acc0a0adaaa5bcf41656964e9ed96a28da83bf312d0e08c2f4c2
2025-04-23 09:59:32 +02:00