G1BILLET version "astro" - http service - http://g1billet.localhost:33101
This commit is contained in:
parent
70eab68ea1
commit
37d5b86253
132
G1BILLETS.sh
132
G1BILLETS.sh
|
@ -1,20 +1,27 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
################################################################################
|
################################################################################
|
||||||
# Author: Fred (support@qo-op.com)
|
# Author: Fred (support@qo-op.com)
|
||||||
# Version: 0.1
|
# Version: 1.0
|
||||||
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
################################################################################
|
################################################################################
|
||||||
MY_PATH="`dirname \"$0\"`" # relative
|
MY_PATH="`dirname \"$0\"`" # relative
|
||||||
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
|
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
|
||||||
ME="${0##*/}"
|
ME="${0##*/}"
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Create and print 6 G1Billets de $MONTANT DU
|
# Create different king of G1BILLET(s) with $MONTANT DU or TW IPNS
|
||||||
# ${MY_PATH}/G1BILLETS.sh 5 986397643 ticket
|
# ${MY_PATH}/G1BILLETS.sh 5 986397643 ticket # MONTANT # UNIQID # STYLE #
|
||||||
################################################################################
|
################################################################################
|
||||||
MONTANT="$1"
|
MONTANT="$1"
|
||||||
|
[[ $MONTANT == "0" ]] && MONTANT=""
|
||||||
|
|
||||||
|
### COMMAND MODE ###
|
||||||
|
if [[ $MONTANT != "daemon" ]]; then
|
||||||
|
|
||||||
[[ $MONTANT == "" ]] && MONTANT="___"
|
[[ $MONTANT == "" ]] && MONTANT="___"
|
||||||
|
|
||||||
UNIQID="$2"
|
UNIQID="$2"
|
||||||
|
[[ $UNIQID == "0" ]] && UNIQID=""
|
||||||
[[ $UNIQID == "" ]] && UNIQID=$(${MY_PATH}/diceware.sh 1 | xargs)${RANDOM:0:2}$(${MY_PATH}/diceware.sh 1 | xargs)
|
[[ $UNIQID == "" ]] && UNIQID=$(${MY_PATH}/diceware.sh 1 | xargs)${RANDOM:0:2}$(${MY_PATH}/diceware.sh 1 | xargs)
|
||||||
|
|
||||||
STYLE="$3"
|
STYLE="$3"
|
||||||
|
@ -26,55 +33,57 @@ STYLE="$3"
|
||||||
STYLE="astro"
|
STYLE="astro"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## PLANCHE DE 6 BILLETS PAR DEFAUT
|
## PLANCHE PDF DE 6 BILLETS PAR DEFAUT
|
||||||
NBbillets=6
|
NBbillets=6
|
||||||
|
[[ "${STYLE}" == "ticket" || "${STYLE}" == "xbian" || "${STYLE}" == "astro" ]] && NBbillets=1
|
||||||
[[ "$STYLE" == "xbian" ]] && NBbillets=1 ## STYLE=xbian => 1 BILLET
|
|
||||||
[[ "$STYLE" == "1" ]] && NBbillets=1 && STYLE="" ## 1 BILLET PDF
|
|
||||||
[[ "$STYLE" == "ticket" ]] && NBbillets=1 && echo "TICKET" ## 1 BILLET JPG
|
|
||||||
[[ "$STYLE" == "astro" ]] && NBbillets=1
|
|
||||||
|
|
||||||
|
|
||||||
# CHECK IF $STYLE IMAGES EXIST
|
# CHECK IF $STYLE IMAGES EXIST
|
||||||
[[ ! -f ${MY_PATH}/images/fond${STYLE}.jpg ]] && echo "missing fond${STYLE}.jpg" && exit 1
|
[[ ! -f ${MY_PATH}/images/fond${STYLE}.jpg ]] && echo "missing fond${STYLE}.jpg" && exit 1
|
||||||
[[ ! -f ${MY_PATH}/images/g1${STYLE}.png ]] && echo "missing g1${STYLE}.jpg" && exit 1
|
[[ ! -f ${MY_PATH}/images/g1${STYLE}.png ]] && echo "missing g1${STYLE}.jpg" && exit 1
|
||||||
[[ ! -f ${MY_PATH}/images/logo${STYLE}.png ]] && echo "missing logo${STYLE}.jpg" && exit 1
|
[[ ! -f ${MY_PATH}/images/logo${STYLE}.png ]] && echo "missing logo${STYLE}.jpg" && exit 1
|
||||||
|
|
||||||
mkdir -p "${MY_PATH}/tmp/g1billet/${UNIQID}"
|
|
||||||
|
|
||||||
# CREATION DE $NBbillets BILLETS DE $MONTANT DU
|
# CREATION DE $NBbillets BILLETS DE $MONTANT DU
|
||||||
boucle=0;
|
boucle=0;
|
||||||
while [ $boucle -lt $NBbillets ]
|
while [ $boucle -lt $NBbillets ]
|
||||||
do
|
do
|
||||||
boucle=$((boucle+1))
|
boucle=$((boucle+1))
|
||||||
|
mkdir -p "${MY_PATH}/tmp/g1billet/${UNIQID}"
|
||||||
NUMBER=$(${MY_PATH}/diceware.sh 4 | xargs)
|
NUMBER=$(${MY_PATH}/diceware.sh 4 | xargs)
|
||||||
|
UN=$(echo ${NUMBER} | jq -Rr @uri)
|
||||||
SECRET=$(${MY_PATH}/diceware.sh 4 | xargs)
|
SECRET=$(${MY_PATH}/diceware.sh 4 | xargs)
|
||||||
|
DE=$(echo ${SECRET} | jq -Rr @uri)
|
||||||
|
|
||||||
# CREATION CLEF BILLET
|
# CREATION CLEF BILLET
|
||||||
BILLETPUBKEY=$(python3 ${MY_PATH}/key_create_dunikey.py "$NUMBER" "$SECRET")
|
BILLETPUBKEY=$(python3 ${MY_PATH}/key_create_dunikey.py "$NUMBER" "$SECRET")
|
||||||
rm -f ${MY_PATH}/tmp/secret.dunikey
|
rm -f /tmp/secret.dunikey
|
||||||
|
|
||||||
|
## ASTRO : FIND TW ADDRESS + EMAIL = CREATE PLAYER on 1234 API
|
||||||
[[ "$STYLE" == "astro" ]] \
|
[[ "$STYLE" == "astro" ]] \
|
||||||
&& ${MY_PATH}/keygen -t ipfs -o ${MY_PATH}/tmp/g1billet/${UNIQID}.ipns.key "$NUMBER" "$SECRET" \
|
&& ${MY_PATH}/keygen -t ipfs -o ${MY_PATH}/tmp/g1billet.${UNIQID}.ipns.key "$NUMBER" "$SECRET" \
|
||||||
&& ASTRONAUTENS=$(ipfs key import ${UNIQID} -f pem-pkcs8-cleartext ${MY_PATH}/tmp/g1billet/${UNIQID}.ipns.key) \
|
&& ASTRONAUTENS=$(ipfs key import ${UNIQID} -f pem-pkcs8-cleartext ${MY_PATH}/tmp/g1billet.${UNIQID}.ipns.key) \
|
||||||
&& rm -f ${MY_PATH}/tmp/g1billet/${UNIQID}.ipns.key \
|
&& rm -f ${MY_PATH}/tmp/g1billet.${UNIQID}.ipns.key \
|
||||||
&& ipfs key rm ${UNIQID} > /dev/null &2>1 \
|
&& ipfs key rm ${UNIQID} && echo "/ipns/$ASTRONAUTENS" \
|
||||||
&& [[ $EMAIL ]] && curl -s "https://astroport.copylaradio.com/?salt=$NUMBER$pepper=$SECRET&g1pub=on&email=$EMAIL"
|
&& [[ ${EMAIL} ]] && echo 'curl -s "https://astroport.copylaradio.com/?salt='$UN'&pepper='$DE'&g1pub=on&email='$EMAIL'"'
|
||||||
|
|
||||||
# CREATION FICHIER IMAGE BILLET
|
# CREATION FICHIER IMAGE BILLET dans ${MY_PATH}/tmp/g1billet/${UNIQID}
|
||||||
$(${MY_PATH}/MAKE_G1BILLET.sh "${NUMBER}" "${SECRET}" "${MONTANT}" "${BILLETPUBKEY}" "${UNIQID}" "${STYLE}" "${ASTRONAUTENS}")
|
$(${MY_PATH}/MAKE_G1BILLET.sh "${NUMBER}" "${SECRET}" "${MONTANT}" "${BILLETPUBKEY}" "${UNIQID}" "${STYLE}" "${ASTRONAUTENS}" "${EMAIL}")
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ "${STYLE}" == "ticket" || "${STYLE}" == "xbian" || "${STYLE}" == "astro" ]]
|
if [[ "${STYLE}" == "ticket" || "${STYLE}" == "xbian" || "${STYLE}" == "astro" ]]
|
||||||
then
|
then
|
||||||
|
|
||||||
|
# ONE FILE ONLY
|
||||||
cp ${MY_PATH}/tmp/g1billet/${UNIQID}/*.jpg ${MY_PATH}/tmp/g1billet/${UNIQID}.jpg
|
cp ${MY_PATH}/tmp/g1billet/${UNIQID}/*.jpg ${MY_PATH}/tmp/g1billet/${UNIQID}.jpg
|
||||||
|
|
||||||
# CLEANING TEMP FILES
|
# CLEANING TEMP FILES
|
||||||
rm -Rf ${MY_PATH}/tmp/g1billet/${UNIQID}
|
rm -Rf ${MY_PATH}/tmp/g1billet/${UNIQID}
|
||||||
# ALLOWS ANY USER TO DELETE
|
# ALLOWS ANY USER TO DELETE
|
||||||
chmod 777 ${MY_PATH}/tmp/g1billet/${UNIQID}.jpg
|
chmod 777 ${MY_PATH}/tmp/g1billet/${UNIQID}.jpg
|
||||||
|
export ZFILE="${MY_PATH}/tmp/g1billet/${UNIQID}.jpg"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
# MONTAGE DES IMAGES DES BILLETS VERS ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
# MONTAGE DES IMAGES DES BILLETS VERS ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
||||||
montage ${MY_PATH}/tmp/g1billet/${UNIQID}/*.jpg -tile 2x3 -geometry 964x459 ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
montage ${MY_PATH}/tmp/g1billet/${UNIQID}/*.jpg -tile 2x3 -geometry 964x459 ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
||||||
# NB!! if "not autorized" then edit /etc/ImageMagick-6/policy.xml and comment
|
# NB!! if "not autorized" then edit /etc/ImageMagick-6/policy.xml and comment
|
||||||
|
@ -83,7 +92,88 @@ else
|
||||||
rm -Rf ${MY_PATH}/tmp/g1billet/${UNIQID}
|
rm -Rf ${MY_PATH}/tmp/g1billet/${UNIQID}
|
||||||
# ALLOWS ANY USER TO DELETE
|
# ALLOWS ANY USER TO DELETE
|
||||||
chmod 777 ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
chmod 777 ${MY_PATH}/tmp/g1billet/${UNIQID}.pdf
|
||||||
|
export ZFILE="${MY_PATH}/tmp/g1billet/${UNIQID}.pdf"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
### LAST LINE INFORM DAEMON
|
||||||
|
echo "$ZFILE"
|
||||||
|
|
||||||
exit
|
else
|
||||||
|
################################################################################
|
||||||
|
## MAKE IT A NETWORK MICRO SERVICE -- PORTS : INPUT=33101 OUTPUT=33102
|
||||||
|
############## DEAMON MODE ###
|
||||||
|
#####################################################################
|
||||||
|
HTTPWELLCOME='HTTP/1.1 200 OK
|
||||||
|
Server: Astroport
|
||||||
|
Content-Type: text/html; charset=UTF-8
|
||||||
|
|
||||||
|
<!DOCTYPE html><html><head>
|
||||||
|
<title>[Astroport] G1BILLET MICRO SERVICE - 33101 - 33102 -</title>
|
||||||
|
<meta http-equiv="refresh" content="5; url=http://g1billet.localhost:33102" />
|
||||||
|
</head><body>
|
||||||
|
<p><a href="http://g1billet.localhost:33102">(♥‿‿♥)</a>.</p>
|
||||||
|
</body></html>'
|
||||||
|
|
||||||
|
function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo "=================================================="
|
||||||
|
echo "$ME DAEMON MODE http://g1billet.localhost:33101/?m=0&u=0&type=astro@yopmail.com"
|
||||||
|
REQ=$(echo "$HTTPWELLCOME" | nc -l -p 33101 -q 1) ## # WAIT FOR 33101 PORT CONTACT
|
||||||
|
|
||||||
|
URL=$(echo "$REQ" | grep '^GET' | cut -d ' ' -f2 | cut -d '?' -f2) ### CONTACT URL ####
|
||||||
|
HOSTP=$(echo "$REQ" | grep '^Host:' | cut -d ' ' -f2 | cut -d '?' -f2)
|
||||||
|
HOST=$(echo "$HOSTP" | cut -d ':' -f 1)
|
||||||
|
|
||||||
|
echo "=================================================="
|
||||||
|
echo "$HOSTP"
|
||||||
|
echo "=================================================="
|
||||||
|
echo "GET RECEPTION : $URL"
|
||||||
|
arr=(${URL//[=&]/ })
|
||||||
|
# PARAM (x 3) EXTRACT "¶m=value"
|
||||||
|
ONE=$(urldecode ${arr[0]} | xargs); TWO=$(urldecode ${arr[2]} | xargs); THREE=$(urldecode ${arr[4]} | xargs);
|
||||||
|
MONTANT=$(urldecode ${arr[1]} | xargs); UNIQID=$(urldecode ${arr[3]} | xargs); STYLE=$(urldecode ${arr[5]} | xargs);
|
||||||
|
echo "DECODED : $ONE=$MONTANT & $TWO=$UNIQID & $THREE=$STYLE"
|
||||||
|
|
||||||
|
echo ${MY_PATH}/${ME} '"'$MONTANT'"' '"'$UNIQID'"' '"'$STYLE'"'
|
||||||
|
# EXECUTE COMMAND
|
||||||
|
LOG=$(${MY_PATH}/${ME} "$MONTANT" "$UNIQID" "$STYLE")
|
||||||
|
IPNS=$(echo "$LOG" | grep '/ipns/')
|
||||||
|
echo "IPNS : $IPNS"
|
||||||
|
CURL=$(echo "$LOG" | grep -w curl)
|
||||||
|
echo "CURL : $CURL"
|
||||||
|
ZFILE=$(echo "$LOG" | tail -n 1)
|
||||||
|
|
||||||
|
# FIND JPG or PDF
|
||||||
|
FILE_NAME="$(basename "${ZFILE}")"
|
||||||
|
EXT="${FILE_NAME##*.}"
|
||||||
|
BSIZE=$(du -b "${ZFILE}" | awk '{print $1}' | tail -n 1)
|
||||||
|
|
||||||
|
# SEND BACK TO HTTP 33102
|
||||||
|
echo 'HTTP/1.1 200 OK
|
||||||
|
Access-Control-Allow-Origin: *
|
||||||
|
Access-Control-Allow-Credentials: true
|
||||||
|
Access-Control-Allow-Methods: GET
|
||||||
|
Server: Astroport
|
||||||
|
Cache-Control: public
|
||||||
|
Content-Transfer-Encoding: Binary
|
||||||
|
Content-Length:'${BSIZE}'
|
||||||
|
Content-Disposition: attachment; filename='${FILE_NAME}'
|
||||||
|
' > ${MY_PATH}/tmp/http.33102
|
||||||
|
|
||||||
|
cat ${ZFILE} >> ${MY_PATH}/tmp/http.33102
|
||||||
|
|
||||||
|
echo "GET IT : http://g1billet.localhost:33102"
|
||||||
|
cat ${MY_PATH}/tmp/http.33102 | nc -l -p 33102 -q 1 > /dev/null 2>&1
|
||||||
|
echo "SERVED"
|
||||||
|
|
||||||
|
rm -f "${ZFILE}"
|
||||||
|
rm -f "${MY_PATH}/tmp/http.33102"
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
|
@ -19,7 +19,10 @@ MONTANT="$3"
|
||||||
NOTERIB="$4"
|
NOTERIB="$4"
|
||||||
UNIQID="$5"
|
UNIQID="$5"
|
||||||
STYLE="$6"
|
STYLE="$6"
|
||||||
|
## ASTRO TW MODE
|
||||||
ASTRONAUTENS="$7"
|
ASTRONAUTENS="$7"
|
||||||
|
EMAIL="$8"
|
||||||
|
[[ ! $EMAIL ]] && EMAIL="________@____________"
|
||||||
|
|
||||||
if [[ "$NUMERO" == "" || "$SECRET" == "" || "$MONTANT" == "" || "$NOTERIB" == "" || "$UNIQID" == "" ]]
|
if [[ "$NUMERO" == "" || "$SECRET" == "" || "$MONTANT" == "" || "$NOTERIB" == "" || "$UNIQID" == "" ]]
|
||||||
then
|
then
|
||||||
|
@ -79,8 +82,8 @@ composite -compose Over -gravity NorthEast -geometry +50+25 -dissolve 90% "${MY
|
||||||
if [[ "${STYLE}" == "xbian" || "${STYLE}" == "jeu" || "${STYLE}" == "astro" ]]
|
if [[ "${STYLE}" == "xbian" || "${STYLE}" == "jeu" || "${STYLE}" == "astro" ]]
|
||||||
then
|
then
|
||||||
# CREATE PSEUDO for Gchange.fr
|
# CREATE PSEUDO for Gchange.fr
|
||||||
XZUID="________@____________"
|
XZUID="$EMAIL"
|
||||||
BOTTOM="ACTIVER TW : https://astroport.copylaradio.com"
|
BOTTOM="REBOOT : https://astroport.copylaradio.com"
|
||||||
else
|
else
|
||||||
XZUID="G1 BILLET"
|
XZUID="G1 BILLET"
|
||||||
BOTTOM="Porte Monnaie Libre!! https://gchange.fr https://cesium.app"
|
BOTTOM="Porte Monnaie Libre!! https://gchange.fr https://cesium.app"
|
||||||
|
|
38
README.md
38
README.md
|
@ -1,15 +1,15 @@
|
||||||
# G1BILLET
|
# G1BILLET
|
||||||
|
|
||||||
## Présentation
|
## Présentation
|
||||||
Ce code est un générateur de G1BILLETS
|
Ce code est un générateur de G1BILLETS qui utilise dunitey.py keygen imagemagik
|
||||||
|
|
||||||
Il lance la fabrication de six "G1 Portefeuilles" vides à remplir soi-même !
|
Il lance la fabrication de "G1 Portefeuilles" vides à remplir soi-même !
|
||||||
Les G1Billets sont assemblés dans un fichier PDF pour les imprimer facilement sur une imprimante A4
|
Les G1Billets sont assemblés dans un fichier PDF pour les imprimer facilement sur une imprimante A4 et vous en servir comme chéquier.
|
||||||
|
|
||||||
Avant de vous en servir, utilisez Cesium pour flasher le QR Code et effectuer le virement correspondant à son montant sur chaque portefeuille.
|
Avant de vous en servir, utilisez Cesium pour flasher le QR Code et effectuer le virement correspondant à son montant sur chaque portefeuille.
|
||||||
Ensuite, offrez ces G1 Billets à qui vous voulez.
|
Ensuite, offrez ces G1Billets à qui vous voulez.
|
||||||
|
|
||||||
Son détenteur peut alors utiliser l'identifiant/mot de passe pour accéder au portefeuille correspondant.
|
Son détenteur peut alors utiliser l'identifiant/mot de passe pour contrôler la clef du portefeuille correspondant.
|
||||||
|
|
||||||
* [DISCUSSION/FAQ/DETAILS](https://forum.monnaie-libre.fr/t/nouveau-g1-billets/14529?u=qoop)
|
* [DISCUSSION/FAQ/DETAILS](https://forum.monnaie-libre.fr/t/nouveau-g1-billets/14529?u=qoop)
|
||||||
* [DEMO EN VIDEO](./G1BILLETS.mp4)
|
* [DEMO EN VIDEO](./G1BILLETS.mp4)
|
||||||
|
@ -27,10 +27,32 @@ NomFichier="nom_unique_du_pdf" # Correspond au nom du fichier créé dans /tmp/g
|
||||||
Pour personnaliser vos G1Billets, modifiez les images dans le répertoire du même nom (en conservant les dimensions)
|
Pour personnaliser vos G1Billets, modifiez les images dans le répertoire du même nom (en conservant les dimensions)
|
||||||
La fabrication de la planche de G1Billets depuis un site web est possible en mettant le code dans un répertoire servi par un serveur web qui gère PHP...
|
La fabrication de la planche de G1Billets depuis un site web est possible en mettant le code dans un répertoire servi par un serveur web qui gère PHP...
|
||||||
|
|
||||||
|
## LANCEMENT MICRO HTTP SERVICE (SANS SERVEUR WEB)
|
||||||
|
|
||||||
|
```
|
||||||
|
./G1BILLETS.sh daemon
|
||||||
|
```
|
||||||
|
|
||||||
|
Une fois lancé de cette façon, G1BILLET se commande depuis un navigateur
|
||||||
|
|
||||||
|
> Essayez le nouveau G1BILLET "astro" avec une adresse email, vous fabriquez un TW relié au G1BILLET.
|
||||||
|
|
||||||
|
## Type "astro"
|
||||||
|
|
||||||
|
Avec une adresse email, vous associez son TW à votre G1BILLET
|
||||||
|
```
|
||||||
|
G1BILLETS.sh DAEMON MODE http://g1billet.localhost:33101/?m=0&u=0&type=astro@yopmail.com
|
||||||
|
./G1BILLETS.sh "0" "0" "astro@yopmail.com"
|
||||||
|
```
|
||||||
|
Enregistrez votre G1BILLET...
|
||||||
|
Vous recevez les détails de sa fabrication dans votre boite email ;)
|
||||||
|
|
||||||
|
Copiez ce G1BILLET en cachant ses secrets pour en faire votre "carte de visite TW"
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Pour Linux le seul système d'opération qui respecte votre liberté
|
Pour Linux le seul système d'opération qui respecte votre liberté
|
||||||
Ma recommandation: [Linux Mint](https://www.linuxmint.com/) ou [TwisterOS](https://twisteros.com/)
|
Ma recommandation: [Linux Mint](https://www.linuxmint.com/) ou [TwisterOS](https://twisteros.com/)
|
||||||
|
|
||||||
```
|
```
|
||||||
# Installer git
|
# Installer git
|
||||||
|
@ -47,10 +69,10 @@ cd G1BILLET
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Ajoutez les dépendances nécessaire
|
Ajoutez les dépendances nécessaire
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt install python3 python3-pip imagemagick qrencode ttf-mscorefonts-installer
|
sudo apt install python3 python3-pip imagemagick qrencode ttf-mscorefonts-installer netcat-traditional
|
||||||
sudo pip3 install duniterpy
|
sudo pip3 install duniterpy
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue