Compare commits

..

2 Commits

Author SHA1 Message Date
Tom Alexander
fa35cb75e1 Add a test html doc.
All checks were successful
semver Build semver has succeeded
build Build build has succeeded
build-staging Build build-staging has succeeded
2025-09-05 15:12:36 -04:00
Tom Alexander
c6f884ccc1 Switch to local-path-provisioner.
Some checks failed
semver Build semver has succeeded
build-staging Build build-staging has failed
build Build build has failed
2025-08-31 17:53:28 -04:00
11 changed files with 118 additions and 386 deletions

View File

@@ -1,5 +1,2 @@
**/.git
**/.gitignore
/.webhook_bridge
/result
**/Dockerfile

1
.gitignore vendored
View File

@@ -1,2 +1 @@
output/
/result

View File

@@ -44,6 +44,31 @@ spec:
#!/usr/bin/env sh
set -euo pipefail
echo -n "$(date +%s)" | tee $(results.unix-time.path)
- name: get-git-commit-time
taskSpec:
metadata: {}
stepTemplate:
image: alpine:3.20
computeResources:
requests:
cpu: 10m
memory: 600Mi
workingDir: "$(workspaces.repo.path)"
results:
- name: unix-time
description: The time of the git commit in unix timestamp format.
steps:
- image: alpine/git:v2.34.2
name: detect-tag-step
script: |
#!/usr/bin/env sh
set -euo pipefail
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
workspaces:
- name: repo
workspace: git-source
runAfter:
- fetch-repository
- name: report-pending
taskRef:
resolver: git
@@ -51,9 +76,11 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
runAfter:
- fetch-repository
params:
- name: CONTEXT
value: "$(params.JOB_NAME)"
@@ -76,7 +103,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml
workspaces:
@@ -89,34 +116,6 @@ spec:
value: $(params.PULL_BASE_SHA)
- name: deleteExisting
value: "true"
- name: get-git-commit-time
taskSpec:
metadata: {}
stepTemplate:
image: alpine:3.20
computeResources:
requests:
cpu: 10m
memory: 600Mi
workingDir: "$(workspaces.repo.path)"
results:
- name: unix-time
description: The time of the git commit in unix timestamp format.
steps:
- image: alpine/git:v2.34.2
name: detect-tag-step
script: |
#!/usr/bin/env sh
set -euo pipefail
find /
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
workspaces:
- name: repo
workspace: git-source
- name: nix-cache-creds
workspace: nix-cache-creds
runAfter:
- fetch-repository
- name: build-image
taskRef:
resolver: git
@@ -124,7 +123,7 @@ spec:
- name: url
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
- name: revision
value: af22c87d0db59dece97d03e6b6a796d84010158f
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
- name: pathInRepo
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
params:
@@ -145,9 +144,6 @@ spec:
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
- --opt
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
# - --secret
# - id=cache_token,src=./my_local_token.txt
# - id=cache_token,env=MY_ENV_TOKEN
- name: BUILDKITD_TOML
value: |
debug = true
@@ -161,8 +157,6 @@ spec:
workspace: git-source
- name: dockerconfig
workspace: docker-credentials
- name: nix-cache-creds
workspace: nix-cache-creds
runAfter:
- fetch-repository
finally:
@@ -177,7 +171,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
@@ -206,7 +200,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
@@ -227,7 +221,6 @@ spec:
workspaces:
- name: git-source
- name: docker-credentials
- name: nix-cache-creds
workspaces:
- name: git-source
volumeClaimTemplate:
@@ -242,9 +235,6 @@ spec:
- name: docker-credentials
secret:
secretName: harbor-plain
- name: nix-cache-creds
secret:
secretName: nix-pull-through-cache
params:
- name: image-name
value: "harbor.fizz.buzz/private/homepage-staging"

View File

@@ -88,7 +88,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
runAfter:
@@ -115,7 +115,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml
workspaces:
@@ -135,7 +135,7 @@ spec:
- name: url
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
- name: revision
value: af22c87d0db59dece97d03e6b6a796d84010158f
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
- name: pathInRepo
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
params:
@@ -183,7 +183,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
@@ -212,7 +212,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:

View File

@@ -74,7 +74,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
@@ -99,7 +99,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/git-clone/0.9/git-clone.yaml
workspaces:
@@ -124,7 +124,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:
@@ -153,7 +153,7 @@ spec:
- name: url
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
- name: revision
value: f914437a46978b95f325f68d791dcf1a35738f60
value: df36b3853a5657fd883015cdbf07ad6466918acf
- name: pathInRepo
value: task/gitea-set-status/0.1/gitea-set-status.yaml
params:

View File

@@ -1,48 +1,69 @@
#
# Builder
#
FROM nixos/nix:2.31.3 AS builder
RUN tee -a /etc/nix/nix.conf <<EOF
extra-experimental-features = nix-command flakes
filter-syscalls = false
substituters = http://ncps.nix-pull-through-cache.svc.cluster.local:80 https://cache.nixos.org
EOF
RUN --mount=type=secret,id=cache_token NIX_CONFIG="extra-access-tokens = ncps.nix-pull-through-cache.svc.cluster.local=$(cat /run/secrets/cache_token)" cp "$(nix build nixpkgs#cacert --print-out-paths)/etc/ssl/certs/ca-bundle.crt" /tmp/ca-bundle.crt
COPY . /tmp/build
WORKDIR /tmp/build
RUN --mount=type=secret,id=cache_token NIX_CONFIG="extra-access-tokens = ncps.nix-pull-through-cache.svc.cluster.local=$(cat /run/secrets/cache_token)" nix build '.#docker_env'
# Export the built closure to a folder
RUN mkdir /tmp/nix-store-closure
RUN cp -R $(nix-store -qR result/) /tmp/nix-store-closure
RUN ln -s $(readlink -f /tmp/build/result/bin/sh) /tmp/sh
# syntax=docker/dockerfile:1
ARG ALPINE_VERSION="3.20"
#
# Runner
#
FROM scratch AS private
ADD git@code.fizz.buzz:talexander/homepage_private.git /homepage_private
FROM scratch
WORKDIR /app
ENV PATH="$PATH:/app/bin"
FROM scratch AS explorer
ADD https://code.fizz.buzz/talexander/organic_ast_explorer.git /organic_ast_explorer
ENV SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
ENV NIX_SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
COPY --from=builder /tmp/ca-bundle.crt /etc/ssl/certs/ca-bundle.crt
COPY --from=builder /tmp/nix-store-closure /nix/store
COPY --from=builder /tmp/build/result /app
COPY --from=builder /tmp/sh /bin/sh
EXPOSE 8080
#RUN addgroup web && adduser -D -G web web
#&& install -d -D -o web -g web -m 700 /srv/http/public
# RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
CMD ["/app/bin/launch_nginx"]
FROM scratch AS organic
ADD git@code.fizz.buzz:talexander/organic.git /organic
FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS organic-build
RUN apk add --no-cache musl-dev make bash
RUN rustup target add wasm32-unknown-unknown
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked cargo install wasm-bindgen-cli
COPY --link --from=organic /organic /organic
WORKDIR /organic
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked make wasm
FROM node:lts-alpine$ALPINE_VERSION AS explorer-build
COPY --link --from=explorer /organic_ast_explorer /organic_ast_explorer
COPY --link --from=organic-build /organic /organic
WORKDIR /organic_ast_explorer
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/npmcache,sharing=locked npm set cache /npmcache && npm install
RUN npm run release
FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS natter-build
RUN apk add --no-cache musl-dev
ADD git@code.fizz.buzz:talexander/natter.git /natter
WORKDIR /natter
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked CARGO_TARGET_DIR=/target cargo build --profile release-lto
FROM alpine:$ALPINE_VERSION AS natter
COPY --link --from=natter-build /target/release-lto/natter /usr/bin/
COPY --link . /source
COPY --link --from=private /homepage_private/static /source/static/
COPY --link --from=explorer-build /organic_ast_explorer/dist /source/static/organic/ast_explorer/
RUN --network=none --mount=type=tmpfs,target=/tmp natter build --config /source/natter.toml
FROM alpine:$ALPINE_VERSION AS server
RUN apk add --no-cache bash nginx
RUN addgroup web && adduser -D -G web web && install -d -D -o web -g web -m 700 /srv/http/public
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
COPY --chown=web:web docker/server/nginx.conf /srv/http
COPY --chown=web:web docker/server/headers.include /srv/http
COPY --from=natter --chown=web:web /source/output/ /srv/http/public/
ENTRYPOINT ["/usr/sbin/nginx", "-c", "/srv/http/nginx.conf", "-e", "stderr", "-g", "daemon off;"]

View File

@@ -1,4 +1,4 @@
# user web;
user web;
worker_processes 4;
# Speed up regular expressions.
@@ -12,7 +12,7 @@ events {
}
http {
include @mime_types@;
include /etc/nginx/mime.types;
default_type application/octet-stream;
types {
@@ -24,11 +24,11 @@ http {
sendfile on;
tcp_nopush on;
include @headers_include@;
include headers.include;
server {
listen 8080;
root @web_root@;
root /srv/http/public;
location / {
try_files $uri $uri/ =404;
@@ -47,24 +47,24 @@ http {
}
location /.well-known/ {
alias @web_root@/well-known/;
alias /srv/http/public/well-known/;
default_type text/plain;
}
location /.well-known/openpgpkey/hu/ {
alias @web_root@/well-known/openpgpkey/fizz.buzz/hu/;
alias /srv/http/public/well-known/openpgpkey/fizz.buzz/hu/;
default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always;
}
location /.well-known/openpgpkey/policy {
alias @web_root@/well-known/openpgpkey/fizz.buzz/policy;
alias /srv/http/public/well-known/openpgpkey/fizz.buzz/policy;
default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always;
}
location ~ /\.well-known/(?<path>openpgpkey/[^/]+/hu/.*) {
alias @web_root@/well-known/$path;
alias /srv/http/public/well-known/$path;
default_type "application/octet-stream";
add_header Access-Control-Allow-Origin * always;
}

136
flake.lock generated
View File

@@ -1,136 +0,0 @@
{
"nodes": {
"natter": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1783808400,
"narHash": "sha256-izeK0soRWiep4mkZ1duD1hf3fqXYrZXsHUwnBzTbTpA=",
"ref": "refs/heads/main",
"rev": "05c7ecde829f3e3843e89000e9959b8016124b2e",
"revCount": 326,
"type": "git",
"url": "https://code.fizz.buzz/talexander/natter.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/natter.git"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1780749050,
"narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a799d3e3886da994fa307f817a6bc705ae538eeb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"organic": {
"inputs": {
"nixpkgs": [
"organic_ast_explorer",
"nixpkgs"
],
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1783734912,
"narHash": "sha256-tXPapMwegdfP0jcr3BPQXxv1Aauo6yZwS4q2sIKOF9o=",
"ref": "refs/heads/main",
"rev": "842a77fb2bc684a545fb102e16790fa902aec11c",
"revCount": 2008,
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic.git"
}
},
"organic_ast_explorer": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"organic": "organic"
},
"locked": {
"lastModified": 1783737126,
"narHash": "sha256-BM6lYBegCV8EkVGqd6wIW9YN4EQL8cnoe4T5TuV7Q2I=",
"ref": "refs/heads/main",
"rev": "de11bc7c5e08610dc006ac7b31454abc6e1f46e7",
"revCount": 74,
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic_ast_explorer.git"
},
"original": {
"type": "git",
"url": "https://code.fizz.buzz/talexander/organic_ast_explorer.git"
}
},
"root": {
"inputs": {
"natter": "natter",
"nixpkgs": "nixpkgs",
"organic_ast_explorer": "organic_ast_explorer"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"natter",
"nixpkgs"
]
},
"locked": {
"lastModified": 1781407245,
"narHash": "sha256-VzJq4MmD0uyNDAceudSe1hHqcQMe9Tau0U4S+5iRGh0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "d5f483210eb016d66102eef22baa128b3b3233fc",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_2": {
"inputs": {
"nixpkgs": [
"organic_ast_explorer",
"organic",
"nixpkgs"
]
},
"locked": {
"lastModified": 1781407245,
"narHash": "sha256-VzJq4MmD0uyNDAceudSe1hHqcQMe9Tau0U4S+5iRGh0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "d5f483210eb016d66102eef22baa128b3b3233fc",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

109
flake.nix
View File

@@ -1,109 +0,0 @@
{
description = "Fizz.buzz homepage";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
natter = {
url = "git+https://code.fizz.buzz/talexander/natter.git";
inputs.nixpkgs.follows = "nixpkgs";
};
organic_ast_explorer = {
url = "git+https://code.fizz.buzz/talexander/organic_ast_explorer.git";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
natter,
organic_ast_explorer,
}:
let
forAllSystems =
func:
builtins.listToAttrs (
map (system: {
name = system;
value = func system;
}) nixpkgs.lib.systems.flakeExposed
);
in
{
devShells = forAllSystems (
system:
let
overlays = [
natter.overlays.default
organic_ast_explorer.overlays.default
];
pkgs = import nixpkgs {
inherit system overlays;
};
in
{
default = pkgs.mkShell {
nativeBuildInputs = [
];
buildInputs = with pkgs; [
pkgs.natter.release
];
};
}
);
packages = forAllSystems (
system:
let
overlays = [
natter.overlays.default
organic_ast_explorer.overlays.default
];
pkgs = import nixpkgs {
inherit system overlays;
};
appliedOverlay = self.overlays.default pkgs pkgs;
in
rec {
default = release;
inherit (appliedOverlay.homepage)
release
;
docker_env = pkgs.buildEnv {
name = "homepage";
paths = with pkgs; [
appliedOverlay.homepage.launch_nginx
bash
uutils-coreutils-noprefix
# toybox # Smaller than uutils-coreutils?
];
};
}
);
overlays.default = final: prev: {
homepage = final.lib.makeScope final.newScope (
homepageScope:
let
natter' = (natter.overlays.default final final).natter.release;
organic_ast_explorer' =
(organic_ast_explorer.overlays.default final final).organic_ast_explorer.release;
release = homepageScope.callPackage ./nix/package.nix {
natter = natter';
organic_ast_explorer = organic_ast_explorer';
};
nginx_conf = final.replaceVars "${./docker/server/nginx.conf}" {
web_root = release;
mime_types = "${final.nginx}/conf/mime.types";
headers_include = "${./docker/server/headers.include}";
};
launch_nginx = final.writeShellScriptBin "launch_nginx" ''
${final.nginx}/bin/nginx -c ${nginx_conf} -e stderr -g "daemon off;"
'';
in
{
inherit release launch_nginx;
}
);
};
};
}

View File

@@ -1,38 +0,0 @@
{
hello,
lib,
pkgs,
natter,
organic_ast_explorer,
}:
let
in
pkgs.stdenv.mkDerivation rec {
pname = "homepage";
version = "0.0.0";
src = lib.cleanSource ../.;
nativeBuildInputs = [
# pkgs.simgrid
# pkgs.boost
# pkgs.cmake
];
configurePhase = "";
# TODO copy COPY --link --from=private /homepage_private/static /source/static/
buildPhase = ''
mkdir -p static/organic/ast_explorer
cp ${organic_ast_explorer}/* static/organic/ast_explorer/
${natter}/bin/natter build --config natter.toml
'';
installPhase = ''
mkdir -p $out
mv output/* $out/
'';
}

8
static/png_svg.html Normal file
View File

@@ -0,0 +1,8 @@
<html>
<body>
<svg style="width:18px; height:18px;">
<path d="M10.1784 2.06433C10.53 1.71277 11.1009 1.71277 11.4525 2.06433L15.9525 6.56433C16.3041 6.91589 16.3041 7.48683 15.9525 7.83839C15.6009 8.18996 15.03 8.18996 14.6784 7.83839L14.3831 7.54308L11.6212 10.7662C11.9559 11.8912 11.8687 13.1287 11.3203 14.2312L11.2809 14.31C11.1516 14.5687 10.9069 14.7487 10.62 14.7965C10.3331 14.8443 10.0434 14.7487 9.83812 14.5434L3.47343 8.17589C3.26812 7.97058 3.17531 7.68089 3.22031 7.39402C3.26531 7.10714 3.44812 6.86246 3.70687 6.73308L3.78562 6.69371C4.88531 6.14246 6.12281 6.05527 7.25062 6.39277L10.4737 3.63089L10.1784 3.33558C9.82687 2.98402 9.82687 2.41308 10.1784 2.06152V2.06433ZM2.07844 14.6643L5.0625 11.6775L6.33656 12.9515L3.34968 15.9356C2.99812 16.2871 2.42719 16.2871 2.07562 15.9356C1.72406 15.584 1.72406 15.0131 2.07562 14.6615L2.07844 14.6643Z" />
</svg>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD5SURBVHgBvZThEYIwDIXT4gC4gSPoBjqCG+gEngsgZQFHcAU3YAU2kA3sAoCvUE4KofQXucsdTdsvLyFAtLalaRr79gUFQuq6/uKxkFKesNbjMzIQZC4W8D2AOacuCJQkycNA7JKFiQUlcdM0T/iF2XbKFKOLu6qqbn12IURMfyXkg22GUUBeuHykMGt7BjfJtNOjKIruJhgAUVmWHaBmCzWlCUx6hI22mTbTxKD4rZQ6j+OSAbV1zygrAboycRbU1czDNDeME5Cd4NyWpj3K5kE9hLo3oW12p0yUVSyCBhBn0HqYaTJczYGEPbwD6EOejzLYln4Tq9kPB4t8gxYYsgwAAAAASUVORK5CYII=" />
</body>
</html>