[
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Build smolBSD image\n\non:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - '**.md'\n      - 'www/**'\n      - 'app/**'\n  workflow_dispatch:\n    inputs:\n      img:\n        description: \"Image target\"\n        required: true\n        default: \"base\"\n      arch:\n        description: \"Architecture\"\n        required: true\n        default: \"amd64\"\n      service:\n        description: \"Service to build on top of image\"\n        required: false\n        default: \"build\"\n      mountro:\n        description: \"Build as read-only (y or empty)\"\n        required: false\n        default: \"y\"\n      curlsh:\n        description: \"URL to a script to execute as finalizer\"\n        required: false\n        default:\n\njobs:\n  build_img:\n    runs-on: ubuntu-latest\n    container:\n      image: debian:latest\n      options: --privileged\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Set up environment\n        run: |\n          apt update && apt install -y curl xz-utils make sudo git libarchive-tools rsync bmake e2fsprogs gdisk\n          rm -rf /var/cache\n\n      - name: Build image\n        run: |\n          for arch in amd64 evbarm-aarch64\n          do\n            bmake SERVICE=${{ inputs.service }} CURLSH=${{ inputs.curlsh }} ARCH=\"$arch\" MOUNTRO=${{ inputs.mountro || 'y' }} ${{ inputs.img || 'buildimg' }}\n            # always build a small rescue image for debugging purposes\n            bmake SERVICE=rescue ARCH=\"$arch\" base\n          done\n\n      - name: Compress images\n        run: |\n          cd images\n          for f in *.img; do\n            echo \"Compressing $f...\"\n            xz -T0 -9e \"$f\"\n            sha256sum ${f}.xz > ${f}.xz.sha256\n          done\n          rm -f *.img\n\n      - name: Publish images to \"latest\" release\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: latest\n          name: \"Latest smolBSD images (compressed)\"\n          files: |\n            images/*.img.xz\n            images/*.xz.sha256\n          prerelease: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# editors\n/.idea\n# downloads & temporary files\n/tmp/\n*.img\n/kernels/*\n/sets/**\n/images/*\n/pkgs/**\n/db/**\nnetbsd-*\n# app build & env\n/app/bin/\n/app/lib/\n/app/pyvenv.cfg\n/sailor/\n# personal keys\n/service/sshd/etc/*.pub\n/service/nitrosshd/etc/*.pub\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2023 Emile `iMil' Heitor\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation and/or\nother materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Makefile",
    "content": "ARCH!=\t\tARCH=${ARCH} scripts/uname.sh -m\nMACHINE!=\tscripts/uname.sh -p\nOS!=\t\tuname -s\nSETSEXT?=\ttar.xz\n\n.if ${ARCH} == \"evbarm-aarch64\"\nKERNEL=\t\tnetbsd-GENERIC64.img\nLIVEIMGGZ=\thttps://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-aarch64/binary/gzimg/arm64.img.gz\n.elif ${ARCH} == \"i386\"\nKERNEL=\t\tnetbsd-SMOL386\nKDIST=\t\thttps://smolbsd.org/assets\nSETSEXT=\ttgz\n.else\nKERNEL=\t\tnetbsd-SMOL\nKDIST=\t\thttps://smolbsd.org/assets\nLIVEIMGGZ=\thttps://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/images/NetBSD-11.99.5-amd64-live.img.gz\n.endif\n\n.-include \"service/${SERVICE}/options.mk\"\n.-include \"service/${SERVICE}/own.mk\"\n\nVERS?=\t\t11\nPKGVERS?=\t11.0\n# for an obscure reason, packages path use uname -p...\nDIST?=\t\thttps://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-${VERS}/latest/${ARCH}/binary\nPKGSITE?=\thttps://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/${MACHINE}/${PKGVERS}/All\nKDIST?=\t\t${DIST}\nWHOAMI!=\twhoami\nUSER!= \t\tid -un\nGROUP!= \tid -gn\nBUILDIMG=\tbuild-${ARCH}.img\nBUILDIMGPATH=\timages/${BUILDIMG}\nBUILDIMGURL=\thttps://github.com/NetBSDfr/smolBSD/releases/download/latest/${BUILDIMG}\nBUILDCPUS?=\t2\nBUILDMEM?=\t1024\n# used to set console in boot.cfg for BIOS boot\nBIOSCONSOLE?=\tcom0\n\nSERVICE?=\t${.TARGET}\n# guest root filesystem will be read-only\n.if defined(MOUNTRO) && ${MOUNTRO} == \"y\"\nEXTRAS+=\t-o\n.endif\n# enable BIOS boot\n.if defined(BIOSBOOT) && ${BIOSBOOT} == \"y\"\nBIOSKERNEL?=\tkernels/netbsd-GENERIC\nEXTRAS+=\t-b -k ${BIOSKERNEL}\n.endif\n\nSETSDIR=\tsets/${ARCH}\nPKGSDIR=\tpkgs/${ARCH}\n\nLIVEIMG=\timages/NetBSD-${ARCH}-live.img\n\n# sets to fetch, defaults to base\nSETS?=\t\tbase.${SETSEXT} etc.${SETSEXT}\n\n# Default: BSD\nDDUNIT=\t\tm\nCKSUM=\t\tcksum -a sha256 -c\nCKSUMQ=\t\t-q\n.if ${OS} == \"Linux\"\nDDUNIT=\t\tM\nCKSUM=\t\tsha256sum -c\nCKSUMQ=\t\t--quiet\n.elif ${OS} == \"Darwin\"\nCKSUM=\t\tshasum -a 256 -c\n.endif\n\nFETCH=\t\tscripts/fetch.sh\nFRESHCHK=\tscripts/freshchk.sh\n\n# extra remote script\n.if defined(CURLSH) && !empty(CURLSH)\nEXTRAS+=\t-c ${CURLSH}\n.endif\n\n# default memory amount for a guest\nMEM?=\t\t256\n# default port redirect, gives network to the guest\nPORT?=\t\t::22022-:22\n\nIMGSIZE?=\t512\nIMGNAME?=\t${SERVICE}-${ARCH}${IMGTAG}.img\nDSTIMG?=\timages/${IMGNAME}\n\n# variables to transfer to mkimg.sh\nENVVARS=\tSERVICE=${SERVICE} \\\n\t\tARCH=${ARCH} \\\n\t\tPKGVERS=${PKGVERS} \\\n\t\tMOUNTRO=${MOUNTRO} \\\n\t\tBIOSBOOT=${BIOSBOOT} \\\n\t\tPKGSITE=${PKGSITE} \\\n\t\tADDPKGS=\"${ADDPKGS}\" \\\n\t\tMINIMIZE=${MINIMIZE} \\\n\t\tBIOSCONSOLE=${BIOSCONSOLE} \\\n\t\tFROMIMG=${FROMIMG}\n\n.if ${WHOAMI} != \"root\" && !defined(NOSUDO) # allow non root builds\nSUDO!=\t\tcommand -v doas >/dev/null && \\\n\t\techo '${ENVVARS} doas' || \\\n\t\techo 'sudo -E ${ENVVARS}'\n.else\nSUDO=\t\t${ENVVARS}\n.endif\n\n# QUIET: default to quiet mode with Q=@, use Q= for verbose\nQ=@\n\nCHOUPI=\t\t./service/common/choupi\nARROW!=\t\t. ${CHOUPI} && echo \"$$ARROW\"\nCHECK!=\t\t. ${CHOUPI} && echo \"$$CHECK\"\nCPU!=\t\t. ${CHOUPI} && echo \"$$CPU\"\nFREEZE!=\t. ${CHOUPI} && echo \"$$FREEZE\"\nWHITEBULLET!=\t. ${CHOUPI} && echo \"$$WHITEBULLET\"\n\nhelp:\t# This help you are reading\n\t$Qgrep '^[a-z]\\+:.*#' Makefile\n\nkernfetch:\n\t$Qif [ \"${ARCH}\" = \"amd64\" ] || [ \"${ARCH}\" = \"i386\" ]; then \\\n\t\t${FRESHCHK} ${KDIST}/${KERNEL} kernels/${KERNEL} || \\\n\t\t\t${FETCH} -o kernels/${KERNEL} ${KDIST}/${KERNEL}; \\\n\t\tcd kernels && curl -L -s -o- ${KDIST}/${KERNEL}.sha256 | \\\n\t\t\t${CKSUM} ${CKSUMQ} && \\\n\t\t\t\techo \"${CHECK} ${KERNEL} sha256 checks out\"; \\\n\telse \\\n\t\t${FRESHCHK} ${KDIST}/kernel/${KERNEL}.gz kernels/${KERNEL} || \\\n\t\t\tcurl -L -o- ${KDIST}/kernel/${KERNEL}.gz | \\\n\t\t\t\tgzip -dc > kernels/${KERNEL}; \\\n\tfi\n\nsetfetch:\n\t@[ -d ${SETSDIR} ] || mkdir -p ${SETSDIR}\n\t$Qfor s in ${SETS}; do \\\n\t\t${FRESHCHK} ${DIST}/sets/$${s%:*} ${SETSDIR}/$${s%:*} || \\\n\t\t\t${FETCH} -o ${SETSDIR}/$${s} ${DIST}/sets/$${s}; \\\n\tdone\n\npkgfetch:\n\t@[ -d ${PKGSDIR} ] || mkdir -p ${PKGSDIR}\n\t$Qfor p in ${ADDPKGS};do \\\n\t\t${FRESHCHK} ${PKGSITE}/$${p}* ${PKGSDIR}/$${p}.tgz || \\\n\t\t\t${FETCH} -o ${PKGSDIR}/$${p}.tgz ${PKGSITE}/$${p}*; \\\n\tdone\n\nfetchall: kernfetch setfetch pkgfetch\n\nbase:\n\t$Qecho \"${CPU} destination architecture: ${ARCH} / ${MACHINE}\"\n\t# if we are on the builder vm, don't fetchall again\n\t$Q[ -f tmp/build-${SERVICE} ] || ${MAKE} fetchall\n\t$Qecho \"${ARROW} creating root filesystem (${IMGSIZE}M)\"\n\t$Q${SUDO} ./mkimg.sh -i ${DSTIMG} -s ${SERVICE} \\\n\t\t-m ${IMGSIZE} -x \"${SETS}\" ${EXTRAS}\n\t$Q${SUDO} chown ${USER}:${GROUP} ${DSTIMG}\n\t$Qif [ -n \"${MOUNTRO}\" ]; then \\\n\t\techo \"${FREEZE} system root filesystem will be read-only\"; fi\n\t$Qecho \"${CHECK} image ready: ${DSTIMG}\"\n\nbuildimg:\n\t$Qecho \"${ARROW} building the builder image\"\n\t$Qrm -f tmp/*\n\t$Q${MAKE} SERVICE=build IMGTAG= base\n\nfetchimg:\n\t$Qecho \"${ARROW} fetching builder image\"\n\t$Q${FRESHCHK} ${BUILDIMGURL}.xz || \\\n\t\tcurl -L -o- ${BUILDIMGURL}.xz | xz -dc > ${BUILDIMGPATH}\n\nbuild: fetchall # Build an image (with SERVICE=$SERVICE from service/)\n\t$Qif [ ! -f ${BUILDIMGPATH} ]; then \\\n\t\tif [ \"${OS}\" = \"NetBSD\" ] || [ \"${OS}\" = \"Linux\" ]; then \\\n\t\t\t${MAKE} buildimg; \\\n\t\telse \\\n\t\t\t${MAKE} fetchimg; \\\n\t\tfi; \\\n\tfi\n\t$Qmkdir -p tmp\n\t# wipe any leftover from possibly cancelled previous run\n\t# tmp holds:\n\t# * ENVVARS\n\t# * Dockerfile generated options\n\t# * optional new size for resize\n\t$Qrm -f tmp/*\n\t# save variables for sourcing in the build vm\n\t$Qecho \"${ENVVARS}\" | \\\n\t\tsed -E 's/[[:blank:]]+([A-Z_]+)/\\n\\1/g;s/=[[:blank:]]*([[:print:]]+)/=\"\\1\"/g' > \\\n\t\ttmp/build-${SERVICE}\n\t# build args from Dockefile\n\t$Qif [ -n \"${BUILDARGS}\" ]; then \\\n\t\tprintf '%s\\n' \"${BUILDARGS}\" | tr ',' '\\n' >>tmp/build-${SERVICE}; \\\n\t\tfi\n\t# image tag for OCI images\n\t$Qecho \"IMGTAG=${IMGTAG}\" >>tmp/build-${SERVICE}\n\t$Qecho \"${ARROW} creating the disk image\"\n\t# generate disk image on the host, faster and avoids layering on 9p\n\t$Qdd if=/dev/zero of=${DSTIMG} bs=1${DDUNIT} count=${IMGSIZE}\n\t$Qecho \"${ARROW} starting the builder microvm with\"\n\t$Qecho \"  ${WHITEBULLET} ${BUILDMEM}MB RAM\"\n\t$Qecho \"  ${WHITEBULLET} ${BUILDCPUS} cores\"\n\t# Fire up the builder microVM\n\t$Q./startnb.sh -k kernels/${KERNEL} -i ${BUILDIMGPATH} -l ${DSTIMG} \\\n\t\t-c ${BUILDCPUS} -m ${BUILDMEM} \\\n\t\t-p ${PORT} -w . -x \"-pidfile qemu-${.TARGET}.pid\" &\n\t# wait till the build is finished, guest removes the lock\n\t$Qwhile [ -f tmp/build-${SERVICE} ]; do sleep 0.2; done\n\t$Qecho \"${ARROW} killing the builder microvm\"\n\t$Qkill $$(cat qemu-${.TARGET}.pid)\n\t$Qif [ -n \"${MINIMIZE}\" ] && [ -f \"tmp/${IMGNAME}.size\" ]; then \\\n\t\twhile lsof ${DSTIMG} >/dev/null 2>&1; do sleep 0.2; done; \\\n\t\t\tqemu-img resize -q -f raw --shrink ${DSTIMG} \\\n\t\t\t\t$$(cat tmp/${IMGNAME}.size); \\\n\t\tfi\n\t# poor man's sig\n\t$Qecho \"smolsig:$$(date +%d/%m/%Y)|$$(uuidgen)\" | \\\n\t\ttee -a ${DSTIMG} >${DSTIMG:S/.img/.sig/}\n\t$Q${SUDO} chown ${USER}:${GROUP} ${DSTIMG}\n\t# cleanup metadata\n\t$Qrm -f tmp/*\n\nrescue: # Build a rescue image\n\t${MAKE} SERVICE=rescue build\n\nlive: kernfetch # Build a live image\n\t$Qecho \"fetching ${LIVEIMG}\"\n\t[ -f ${LIVEIMG} ] || curl -L -o- ${LIVEIMGGZ}|gzip -dc > ${LIVEIMG}\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\" markdown=\"1\">\n\n<img src=\"www/smolBSD.png\" width=150px>\n\n**smolBSD**\n\nbuild your own minimal BSD UNIX system\n\n![License](https://img.shields.io/badge/license-BSD--2--Clause-blue.svg)\n![Stars](https://img.shields.io/github/stars/NetBSDfr/smolBSD)\n![Build Status](https://img.shields.io/github/actions/workflow/status/NetBSDfr/smolBSD/main.yml?branch=main)\n\n</div>\n\n# What is smolBSD?\n\nsmolBSD helps you create a minimal _NetBSD_ 🚩 based _BSD UNIX_ virtual machine that's able to boot and start a service in a couple milliseconds.  \n* No prior _NetBSD_ installation is required, a _microvm_ can be created and started from any _NetBSD_, _GNU/Linux_, _macOS_ system and probably more.\n* [PVH][4] boot and various optimizations enable _NetBSD/amd64_ and _NetBSD/i386_ to directly boot [QEMU][8] or [Firecracker][9] in about 10 **milliseconds** on 2025 mid-end x86 CPUs. \n\n<div align=\"center\" markdown=\"1\">\n\n**microvm typical boot process**\n\n<img src=\"www/boot.png\" width=400px>\n\n</div>\n\n# Usage\n\n## Requirements\n\n- A _GNU/Linux_, _NetBSD_ or _macOS_ operating system (might work on more systems, but not CPU accelerated)\n- The following tools installed\n  - `curl`\n  - `git`\n  - `bmake` if running on _Linux_ or _macOS_, `make` on _NetBSD_\n  - `qemu-system-x86_64`, `qemu-system-i386` or `qemu-system-aarch64` depending on destination architecture\n  - `sudo` or `doas`\n  - `uuidgen`\n  - `nm` (not used / functional on _macOS_)\n  - `bsdtar` on Linux (install with `libarchive-tools` on Debian and derivatives, `libarchive` on Arch)\n  - `sgdisk` on Linux for GPT boot\n  - `lsof`\n  - `jq` for `smoler.sh`\n  - `socat` for control socket (optional)\n  - `picocom` for console workloads (optional)\n- A x86 VT-capable, or ARM64 CPU is recommended\n\n### Lazy copypasta\n\nDebian, Ubuntu and the like\n```sh\n$ sudo apt install curl git bmake qemu-system-x86_64 uuid-runtime binutils libarchive-tools gdisk socat jq lsof picocom\n```\n\nmacOS\n```sh\n$ brew install curl git bmake qemu binutils libarchive socat jq lsof picocom\n```\n\n## Quickstart\n\n### Create a _smolBSD_ image using a _Dockerfile_\n\n📄 `dockerfiles/Dockerfile.caddy`:\n```dockerfile\n# Mandatory, either comma separated base sets (here base and etc)\n# or base image name i.e. base-amd64.img\nFROM base,etc\n\n# Mandatory, service name\nLABEL smolbsd.service=caddy\n# Optional image minimization to actual content\nLABEL smolbsd.minimize=y\n# Dockerfile doesn't support port mapping\nLABEL smolbsd.publish=\"8881:8880\"\n\nRUN pkgin up && pkgin -y in caddy\n\nEXPOSE 8880\n\nCMD caddy respond -l :8880\n```\n⚙️ Build:\n```sh\nhost$ ./smoler.sh build dockerfiles/Dockerfile.caddy\n```\n🚀 Run:\n```sh\nhost$ ./startnb.sh -f etc/caddy.conf\n```\n✅ Test:\n```sh\nhost$ curl -I 127.0.0.1:8881\nHTTP/1.1 200 OK\nServer: Caddy\nDate: Fri, 23 Jan 2026 18:20:42 GMT\n```\n\n# Dive in\n\n## Project structure\n\n- `dockerfiles/` _smolBSD_ services `Dockerfile` examples\n- `Makefile` the entrypoint for image creation, called by `[b]make`\n- `mkimg.sh` image creation script, should not be called directly\n- `startnb.sh` starts a _NetBSD_ virtual machine using `qemu-system-x86_64` or `qemu-system-aarch64`\n- `sets/` contains _NetBSD_ \"sets\" by architecture, i.e. `amd64/base.tgz`, `evbarm-aarch64/rescue.tgz`...\n- `pkgs/` holds optional packages to add to a microvm, it has the same format as `sets`.\n\nA `service` is the base unit of a _smolBSD_ microvm, it holds the necesary pieces to build a _BSD_ system from scratch.  \n- `service` structure:\n\n```sh\nservice\n├── base\n│   ├── etc\n│   │   └── rc\n│   ├── postinst\n│   │   └── dostuff.sh\n│   ├── options.mk       # Service-specific defaults\n│   └── own.mk           # User-specific overrides (not in git)\n├── common\n│   └── basicrc\n└── rescue\n    └── etc\n        └── rc\n```\nA microvm is seen as a \"service\", for each one:\n\n- There **COULD** be a `postinst/anything.sh` which will be executed by `mkimg.sh` at the end of root basic filesystem preparation. **This is executed by the build host at build time**\n- If standard _NetBSD_ `init(8)` is used, there **MUST** be an `etc/rc` file, which defines what is started at vm's boot. **This is executed by the microvm**.\n- Image specifics **COULD**  be added in `make(1)` format in `options.mk`, i.e.\n```sh\n$ cat service/nbakery/options.mk\n# size of resulting inage in megabytes\nIMGSIZE=1024\n# as of 202510, there's no NetBSD 11 packages for !amd64\n.if defined(ARCH) && ${ARCH} != \"amd64\"\nPKGVERS=10.1\n.endif\n```\n- User-specific overrides **COULD** be added in `own.mk` for personal development settings  (not committed to repository)\n\nIn the `service` directory, `common/` contains scripts that will be bundled in the\n`/etc/include` directory of the microvm, this would be a perfect place to have something like:\n\n```sh\n$ cat common/basicrc\nexport HOME=/\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\numask 022\n\nmount -a\n\nif ifconfig vioif0 >/dev/null 2>&1; then\n        # default qemu addresses and routing\n        ifconfig vioif0 10.0.2.15/24\n        route add default 10.0.2.2\n        echo \"nameserver 10.0.2.3\" > /etc/resolv.conf\nfi\n\nifconfig lo0 127.0.0.1 up\n\nexport TERM=dumb\n```\n\nAnd then add this to your `rc(8)`:\n```sh\n. /etc/include/basicrc\n```\n\n## Dockerfile\n\nIf you are more experienced with `Dockerfile`s, _smolBSD_ services can be generated using such configuration files; while it does not support the entirety of the [Dockerfile reference][10], the well known verbs are implemented and you can generate services configuration files using the `smoler.sh` script:\n\nThe `FROM` verb is follwed by _NetBSD_ `sets`, you probably want at least `base` and `etc`. It is also possible to only ship part of the set by appending a `tar`-like `glob` to the set name, i.e. `comp:/usr/bin/strip` or `comp:/usr/libexec/*`\n\nThe `smolbsd.service` `LABEL` is mandatory, it sets the service name.\n```sh\n$ cat dockerfiles/Dockerfile.myservice\nFROM base,etc\n\nLABEL smolbsd.service=myservice\n\nCMD ksh\n$ ./smoler.sh build -y dockerfiles/Dockerfile.myservice # -y proceeds with image build\n✅ basicdocker service files generated\n...\n```\n\n`ARG` parameters can be overriden using `--build-arg`:\n\n```sh\n$ ./smoler.sh build --build-arg FOO=bar --build-arg BAR=baz dockerfiles/Dockerfile.myservice\n```\n\nIf no `-t <tag>` is passed to the `build` command, the tag will be `latest`.\n\n### List existing images\n\n```sh\nhost$ ./smoler.sh images\nIMAGE                             SIZE                      CREATED\nbase-amd64:latest                 279M                 Mar 16 09:11\nbasic-amd64:latest                279M                 Mar 16 09:52\nbsdshell-amd64:latest             55M                  Mar 23 08:50\ncaddy-amd64:latest                347M                 Mar 16 10:01\nclawd-amd64:latest                2.1G                 Mar 17 14:56\nclawd-evbarm-aarch64:latest       2.1G                 Mar 17 14:48\nrescue-amd64:latest               20M                  Mar 15 16:41\n```\n\n## Pushing and Pulling Images from an OCI Repository\n\nsmolBSD supports pushing and pulling images to/from an OCI-compliant repository thanks to the [oras project](https://oras.land/). This allows for easy distribution and versioning of your micro VM images.\n\nYou can use the following commands to manage your images:\n\n* **Push an image:** `./smoler.sh push <image_file>` or `./smoler.sh push <image_name>`\n```sh\n$ ./smoler.sh push myimage-amd64:latest\n```\n* **Pull an image:** `./smoler.sh pull <image_name>`\n```sh\n$ ./smoler.sh pull myimage-amd64:latest\n```\nImages will be pulled as regular, raw images and placed in the directory they've been uploaded from, by default `$(pwd)/images/`.\n\nBy default, these commands interact with the official repository at `ghcr.io/netbsdfr/smolbsd`,\nyou can customize the target repository by setting the `SMOLREPO` environment variable.\n\nOfficial images are available at: https://github.com/orgs/NetBSDfr/packages\n\n## Running images `docker`-style\n\nTo make the experience easier for `docker` natives, it is also possible to start the microvms with the `smoler` command:\n\n```sh\n$ ./smoler.sh run bsdshell-amd64:latest -P\n```\n>[!Note]\n> If the workload needs a fully functional console (think about `vim`, `tmux`...), pass the `-P` flag to spawn a real `pty` instead of QEMU's `stdio`.\n\nYou can pass all the `startnb.sh` flags after the image name, i.e. start the microvm with 1GB memory and 2 cores:\n\n```sh\n$ ./smoler.sh run bsdshell-amd64:latest -P -m 1024 -c 2\n```\n\n## Building images manually\n\nIn order to create a _smolBSD_ microvm, you first need to build or fetch a microvm builder.\n\n>[!Note]\n> You can use the `ARCH` variable to specify an architecture to build your image for, the default is to build for the current architecture.\n\n>[!Note]\n> In the following examples, replace `bmake` by `make` if you are using _NetBSD_ as the host.\n\n* You can create the builder image yourself if you are running _GNU/Linux_ or _NetBSD_\n```sh\n$ bmake buildimg\n```\n* Or simply fetch it if you are running systems that do not support `ext2` or `ffs` such as _macOS_\n```sh\n$ bmake fetchimg\n```\nBoth methods will create an `images/build-<arch>.img` disk image that you'll be able to use to build services.  \n\nTo create a service image using the builder microvm, execute the following:\n```sh\n$ bmake SERVICE=nitro build\n```\nThis will spawn a microvm running the build image, and will build the _service_ specified with the `SERVICE` `make(1)` variable.\n\n# Examples\n\n## Very minimal (10MB) virtual machine - [source](service/rescue)\n\nCreate a `rescue-amd64.img` file for use with an _amd64_ kernel\n```sh\n$ bmake SERVICE=rescue build\n```\nCreate a `rescue-amd64.img` file but with read-only root filesystem so the _VM_ can be stopped without graceful shutdown. Note this is the default for `rescue` as set in `service/rescue/options.mk`\n```sh\n$ bmake SERVICE=rescue MOUNTRO=y build\n```\nCreate a `rescue-i386.img` file for use with an _i386_ kernel.\n```sh\n$ bmake SERVICE=rescue ARCH=i386 build\n```\nCreate a `rescue-evbarm-aarch64.img` file for use with an _aarch64_ kernel.\n```sh\n$ bmake SERVICE=rescue ARCH=evbarm-aarch64 build\n```\nStart the microvm\n```sh\n$ ./startnb.sh -k kernels/netbsd-SMOL -i images/rescue-amd64.img\n```\n\n## Image filled with the `base` set on an `x86_64` CPU - [source](service/base)\n\n```sh\n$ bmake SERVICE=base build\n$ ./startnb.sh -k kernels/netbsd-SMOL -i images/base-amd64.img\n```\n\n## Running the `bozohttpd` web server on an `aarch64` CPU - [source](service/bozohttpd)\n\n```sh\n$ make ARCH=evbarm-aarch64 SERVICE=bozohttpd build\n$ ./startnb.sh -k kernels/netbsd-GENERIC64.img -i images/bozohttpd-evbarm-aarch64.img -p ::8080-:80\n[   1.0000000] NetBSD/evbarm (fdt) booting ...\n[   1.0000000] NetBSD 10.99.11 (GENERIC64)     Notice: this software is protected by copyright\n[   1.0000000] Detecting hardware...[   1.0000040] entropy: ready\n[   1.0000040]  done.\nCreated tmpfs /dev (1359872 byte, 2624 inodes)\nadd net default: gateway 10.0.2.2\nstarted in daemon mode as `' port `http' root `/var/www'\ngot request ``HEAD / HTTP/1.1'' from host 10.0.2.2 to port 80\n```\nTry it from the host\n```sh\n$ curl -I localhost:8080\nHTTP/1.1 200 OK\nDate: Wed, 10 Jul 2024 05:25:04 GMT\nServer: bozohttpd/20220517\nAccept-Ranges: bytes\nLast-Modified: Wed, 10 Jul 2024 05:24:51 GMT\nContent-Type: text/html\nContent-Length: 30\nConnection: close\n```\n\n## Example of starting a _VM_ with bi-directionnal socket to _host_\n\n```sh\n$ bmake SERVICE=mport MOUNTRO=y build\n$ ./startnb.sh -n 1 -i images/mport-amd64.img \nhost socket 1: s885f756bp1.sock\n```\nOn the guest, the corresponding socket is `/dev/ttyVI0<port number>`, here `/dev/ttyVI01`\n```sh\nguest$ echo \"hello there!\" >/dev/ttyVI01\n```\n```sh\nhost$ socat ./s885f756bp1.sock -\nhello there!\n```\n## Example of a full fledge NetBSD Operating System\n\n```sh\n$ bmake live # or make ARCH=evbarm-aarch64 live\n$ ./startnb.sh -f etc/live.conf\n```\nThis will fetch a directly bootable kernel and a _NetBSD_ \"live\", ready-to-use, disk image. Login with `root` and no password. To extend the size of the image to 4 more GB, simply do:\n\n```sh\n$ dd if=/dev/zero bs=1M count=4000 >> NetBSD-amd64-live.img\n```\nAnd restart the microvm.\n\n## Customization\n\nThe following `Makefile` variables change `mkimg.sh` behavior:\n\n* `ADDPKGS` will fetch and **untar** the packages paths listed in the variable, this is done in `postinst` stage, on the build host, where `pkgin`, _NetBSD_'s package manager, might not be available\n* `ADDSETS` will add the sets paths listed in the variable\n* `MOUNTRO` if set to `y`, the microvm will mount its root filesystem as read-only\n* `MINIMIZE`:\n    * if set to `y`, will reduce the disk image size to disk real usage + 10%\n    * if set to `+<size>`, will reduce the disk image size to disk real usage + `<size>` megabytes\n    * if a `sailor.conf` file is available in service's directory, it will invoke [sailor][3] to remove any unnecessary file\n* By default, services are build on top of the `base` set, fetched in `sets/<arch>/base.tar.xz`, this can be overriden with the `SETS` `make(1)` variable.  \n\n\nThe following environment variables change `startnb.sh` behavior:\n\n* `QEMU` will use custom `qemu` instead of the one in user's `$PATH`\n\n## Basic frontend\n\nA simple virtual machine manager is available in the `app/` directory, it is a\n`python/Flask` application and needs the following requirements:\n\n* `Flask`\n* `psutil`\n\nStart it in the `app/` directory like this: `python3 app.py` and a _GUI_ like\nthe following should be available at `http://localhost:5000`:\n\n![smolGUI](gui.png)\n\n# Final notes\n\n## Kernel\n\nAs of February 2026, many features needed for _smolBSD_ fast boot are integrated in [NetBSD's current kernel][6], and [NetBSD 11 releases][7] those still pending are available in my [NetBSD development branch][5].\n\nPre-built 64 bits kernel at https://smolbsd.org/assets/netbsd-SMOL and a 32 bits kernel at https://smolbsd.org/assets/netbsd-SMOL386  \n\n`aarch64` `netbsd-GENERIC64` kernels are able to boot directly to the kernel with no modification\n\nIn any case, the `bmake kernfetch` will take care of downloading the correct kernel.\n\n[0]: https://gitlab.com/0xDRRB/confkerndev\n[1]: https://man.netbsd.org/x86/multiboot.8\n[2]: https://www.linux-kvm.org/page/Main_Page\n[3]: https://github.com/NetBSDfr/sailor\n[4]: https://xenbits.xen.org/docs/unstable/misc/pvh.html\n[5]: https://github.com/NetBSDfr/NetBSD-src/tree/netbsd-smol-11\n[6]: https://github.com/NetBSD/src\n[7]: https://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-11/latest\n[8]: https://www.qemu.org/docs/master/system/i386/microvm.html\n[9]: https://firecracker-microvm.github.io/\n[10]: https://docs.docker.com/reference/dockerfile/\n"
  },
  {
    "path": "app/.flaskenv",
    "content": "# Flask Defaults\n\nFLASK_APP=app\nFLASK_DEBUG=True\nFLASK_ENV=development\nFLASK_CWD=..\n#FLASK_LOGLEVEL=50\n\nFLASK_RUN_HOST=\"127.0.0.1\"\nFLASK_RUN_PORT=5000\n"
  },
  {
    "path": "app/README.md",
    "content": "# smolBSD VM Manager <img src=\"static/smolBSD.png\" alt=\"\" width=\"10%\">\n\n## App Usage\n\n## QuickStart\n\n~~~\nscripts/app-run.sh # just does Setup, Config & Run\nfirefox http://localhost:5000\n~~~\n\n## Setup\n\n~~~\ncd app/\npython3 -m venv .\n. bin/activate\npip install -r requirements.txt\n~~~\n\n## Running\n\n~~~\ncd app/\n. bin/activate\nflask run\n~~~\n\n## Configuration\n\n~~~\n- 1st, env vars have preference\n- 2nd, app vars at .env\n- 3rd, flask vars at .flaskenv\n~~~\n\n## Cleanup\n\n~~~\nrm -ri bin/ include/ lib/ lib64/ __pycache__/ pyvenv.cfg\n~~~\n"
  },
  {
    "path": "app/app.py",
    "content": "import json\nimport logging\nimport os\nimport psutil\nimport socket\nimport subprocess\nimport dotenv\nimport sys\nfrom flask import Flask, send_file, jsonify, request\n\napp = Flask(__name__)\n# Get environment variables from .flaskenv / .env\ndotenv.load_dotenv()\n\ncwd = os.environ['FLASK_CWD'] if 'FLASK_CWD' in os.environ else '..'\nloglevel = int(os.environ['FLASK_LOGLEVEL']) if 'FLASK_LOGLEVEL' in os.environ else logging.ERROR\nlog = logging.getLogger('werkzeug')\nlog.setLevel(loglevel)\n\nvmlist = {}\n\ndef get_vmlist():\n    vmlist.clear()\n    for filename in os.listdir(f'{cwd}/etc'):\n        if filename.endswith('.conf'):\n            vmname = filename.split(\".conf\")[0]\n            config_data = {}\n            with open(f'{cwd}/etc/{filename}', 'r') as f:\n                lines = f.readlines()\n                for line in lines:\n                    line = line.strip()\n                    if not line:\n                        continue\n                    elif line.startswith('#') or line.startswith('extra'):\n                        continue\n                    elif '=' in line:\n                        key, value = line.split('=', 1)\n                        config_data[key.strip()] = value.strip()\n\n            # Check if QEMU process is running\n            status = 'running' if get_pid(vmname) > 0 else 'stopped'\n\n            vmlist[vmname] = config_data\n            vmlist[vmname]['status'] = status\n\n    return vmlist\n\n\ndef list_files(path):\n    try:\n        items = [f for f in os.listdir(path) if not f.startswith(\".\")]\n        return jsonify(items)\n    except FileNotFoundError:\n        return jsonify({\"error\": \"Directory not found\"}), 404\n    except Exception as e:\n        return jsonify({\"error\": str(e)}), 500\n\n\ndef get_port(vmname, service, default_port):\n    port = default_port\n    if vmname in vmlist and service in vmlist[vmname]:\n        return vmlist[vmname][service]\n    for vm in vmlist:\n        if not service in vmlist[vm]:\n            continue\n        vm_port = int(vmlist[vm][service])\n        if vm_port >= port:\n            port = vm_port + 1\n\n    return port\n\n\ndef query_qmp(command, vmname):\n    if not 'qmp_port' in vmlist[vmname]:\n        return jsonify(\n            {\"success\": False, \"message\": f\"QMP not enabled in {vmname}\"}\n        ), 404\n\n    qmp_port = int(vmlist[vmname]['qmp_port'])\n\n    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n        rep_len = 8192\n        s.connect((\"localhost\", qmp_port))\n        response = s.recv(rep_len)\n        # mandatory before command (duh?)\n        s.sendall('{\"execute\": \"qmp_capabilities\"}\\n'.encode('utf-8'))\n        response = s.recv(rep_len)\n        # actual command\n        s.sendall(f'{{\"execute\": \"{command}\"}}\\n'.encode('utf-8'))\n        response = s.recv(rep_len)\n\n        return json.loads(response)\n\ndef get_pid(vmname):\n    pid_file = f\"{cwd}/qemu-{vmname}.pid\"\n    if not os.path.exists(pid_file):\n        return -1\n    f = open(pid_file, \"r\")\n    pid = int(f.read().strip())\n    if psutil.pid_exists(pid):\n        return pid\n    else:\n        return -1\n\ndef get_cpu_usage(vmname):\n    ncpus = 1\n    r = query_qmp(\"query-cpus-fast\", vmname)\n    if r and 'return' in r:\n        ncpus = len(r['return'])\n    pid = get_pid(vmname)\n    if pid < 0:\n        return 0\n    process = psutil.Process(pid)\n    return process.cpu_percent(interval=0.1) / ncpus\n\n## routes\n\n@app.route(\"/\")\ndef index():\n    # do not render template, frontend logic handled by Vue\n    return send_file(\"index.html\")\n\n@app.route(\"/static/smolBSD.png\")\ndef assets():\n    return send_file(\"static/smolBSD.png\")\n\n@app.route(\"/vmlist\")\ndef vm_list():\n    return jsonify(get_vmlist())\n\n\n@app.route(\"/getkernels\")\ndef getkernels():\n    return list_files(f'{cwd}/kernels/')\n\n\n@app.route(\"/getimages\")\ndef getimages():\n    return list_files(f'{cwd}/images/')\n\n\n@app.route(\"/start\", methods=[\"POST\"])\ndef start_vm():\n    vm_name = request.json.get(\"vm_name\")\n\n    config_file = f'{cwd}/etc/{vm_name}.conf'\n\n    if not os.path.exists(config_file):\n        return jsonify(\n            {\"success\": False, \"message\": \"Config file not found\"}\n        ), 404\n\n    try:\n        ret = subprocess.Popen([f\"{cwd}/startnb.sh\", \"-f\", config_file, \"-d\"], cwd=cwd)\n        return jsonify({\"success\": True, \"message\": \"Starting VM\"})\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\n\n@app.route(\"/stop\", methods=[\"POST\"])\ndef stop_vm():\n    vm_name = request.json.get(\"vm_name\")\n    pid_file = f'{cwd}/qemu-{vm_name}.pid'\n\n    try:\n        pid = get_pid(vm_name)\n        if pid < 0:\n            return jsonify(\n                {\"success\": False, \"message\": \"PID file not found\"}\n            ), 404\n        os.kill(int(pid), 15)\n        os.remove(pid_file)\n        return jsonify({\"success\": True, \"message\": \"Stopping VM\"})\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\n\n@app.route(\"/saveconf\", methods=['POST'])\ndef saveconf():\n    try:\n        data = request.get_json()\n        if not data:\n            return jsonify(\n                {\"success\": False, \"message\": \"No JSON payload provided\"}\n            ), 400\n\n        vmname = data.get(\"vm\")\n        if not vmname:\n            return jsonify(\n                {\n                    \"success\": False,\n                    \"message\": \"'vm' key is required in the JSON payload\"\n                }\n            ), 400\n\n        os.makedirs(f'{cwd}/etc', exist_ok=True)\n        file_path = f\"{cwd}/etc/{vmname}.conf\"\n\n        with open(file_path, 'w') as file:\n            for key, value in data.items():\n                if key == \"tcpserial\":\n                    if value is True:\n                        serial_port = get_port(vmname, 'serial_port', 5555)\n                        key = \"serial_port\"\n                        value = f\"{serial_port}\"\n                    else:\n                        continue\n                if key == \"rmprotect\" and value == False:\n                    continue\n\n                file.write(f\"{key}={value}\\n\")\n\n            qmp_port = get_port(vmname, 'qmp_port', 4444)\n            file.write(f'qmp_port={qmp_port}\\n')\n            extra = 'extra=\"-pidfile qemu-${vm}.pid\"'\n            file.write(f'{extra}\\n')\n\n        return jsonify({\"success\": True, \"message\": file_path}), 200\n\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\n\n@app.route('/rm/<vm>', methods=['DELETE'])\ndef rm_file(vm):\n    try:\n        filepath = f\"{cwd}/etc/{vm}.conf\"\n\n        if not os.path.isfile(filepath):\n            return jsonify(\n                {\"success\": False, \"message\": f\"'{vm}' not found\"}\n            ), 404\n\n        os.remove(filepath)\n        return jsonify(\n            {\"success\": True, \"message\": f\"'{vm}' deleted successfully\"}\n        ), 200\n\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\n\n@app.route('/qmp/<vmname>/<command>')\ndef qmp(vmname, command):\n    try:\n        response = query_qmp(command, vmname)\n        return response\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\n\n@app.route('/cpu_usage/<vmname>')\ndef cpu_usage(vmname):\n    try:\n        return f\"{get_cpu_usage(vmname)}\\n\"\n    except Exception as e:\n        return jsonify({\"success\": False, \"message\": str(e)}), 500\n\nif __name__ in [\"__main__\", \"app\"]:\n    vmlist = get_vmlist()\n    if __name__ == \"__main__\":\n        app.run()\n"
  },
  {
    "path": "app/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title># smolBSD VMs</title>\n  <link rel=\"icon\" href=\"static/smol.ico\">\n  <script src=\"https://unpkg.com/vue@3/dist/vue.global.js\"></script>\n  <link\n    href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css\"\n    rel=\"stylesheet\"\n    integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\"\n    crossorigin=\"anonymous\">\n  <script\n    src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"\n    integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\"\n    crossorigin=\"anonymous\"></script>\n  <style>\n    #app { max-width: 50%; }\n    .blinking {\n      animation: blink 1s infinite;\n    }\n    @keyframes blink {\n      50% {\n        opacity: 0;\n      }\n    }\n    .cpu-usage {\n      width: 50px;\n      height: 20px;\n      border-color: black;\n      border-radius: 2px;\n      margin-left: 10px;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"app\" class=\"container mt-5\">\n\n    <h1># smolBSD VM Manager <img src=\"static/smolBSD.png\" alt=\"\" width=\"10%\"></h1>\n\n    <nav>\n      <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n        <button class=\"nav-link active\" id=\"nav-manage-tab\" data-bs-toggle=\"tab\"\n          data-bs-target=\"#nav-manage\" type=\"button\" role=\"tab\"\n          aria-controls=\"nav-manage\" aria-selected=\"true\">Manage</button>\n        <button class=\"nav-link\" id=\"nav-infos-tab\" data-bs-toggle=\"tab\"\n          data-bs-target=\"#nav-infos\" type=\"button\" role=\"tab\"\n          aria-controls=\"nav-infos\" aria-selected=\"false\">Info</button>\n      </div>\n    </nav>\n\n    <div class=\"tab-content mt-3\" id=\"nav-tabContent\">\n\n      <!-- Management tab -->\n\n      <div class=\"tab-pane show active\" id=\"nav-manage\" role=\"tabpanel\"\n        aria-labelledby=\"nav-manage-tab\">\n\n        <ul class=\"list-group\"> <!-- main list -->\n\n          <!-- VM list + buttons -->\n\n          <li v-for=\"(vm, vmName) in vmList\" class=\"list-group-item d-flex justify-content-between align-items-center\">\n            <div class=\"flex-grow-1\">{{ vmName }}</div>\n            <div v-if=\"vmList[vmName].status === 'running'\" class=\"cpu-usage me-4\" :id=\"`cpu-usage-${vmName}`\"\n              data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-animation=\"false\"\n              :title=\"`${vmName} CPU usage: ${vmList[vmName].cpuUsage }%`\">\n              <div class=\"progress\" style=\"height: 100%;\">\n                <div class=\"progress-bar\" role=\"progressbar\"\n                  :style=\"{ width: `${vmList[vmName].cpuUsage }%` }\"\n                  :aria-valuenow=\"vm.cpuUsage\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n                </div>\n              </div>\n            </div>\n            <div class=\"btn-group\" role=\"group\" aria-label=\"Actions\">\n              <button :id=\"`button-${vmName}`\"\n                  :class=\"['btn', 'btn-sm', 'me-2', vm.status === 'stopped' ? 'btn-success' : 'btn-danger']\"\n                  @click=\"toggleVM(vmName)\">\n                {{ vm.status === 'running' ? 'stop' : 'start' }}\n              </button>\n              <button class=\"btn btn-sm btn-light me-2\"\n                :disabled=\"vm.editprotect==='True'\"\n\t\t@click=\"editVM(vmName)\">✏️</button>\n              <button class=\"btn btn-sm btn-light me-2\"\n                :disabled=\"vm.rmprotect==='True'\"\n                @click=\"deleteVM(vmName)\">🗑️</button>\n              <button class=\"btn btn-sm btn-light me-2\"\n                title=\"telnet to Virtual Machine TCP serial port\"\n                :disabled=\"!vm.serial_port\"\n                @click=\"openSerialPort(vmName)\">💻</button>\n            </div>\n          </li>\n\n          <!-- create button -->\n\n          <li class=\"list-group-item\">\n            <div class=\"d-flex justify-content-between align-items-center\">\n              <div>new vm</div>\n              <button class=\"btn btn-sm\" :class=\"showInputs ? 'btn-danger' : 'btn-primary' \" @click=\"toggleInputs(Action.CREATE)\">\n                {{ showInputs ? 'cancel' : 'create' }}\n              </button>\n            </div>\n\n            <!-- hidden inputs for vm creation / modification -->\n\n            <div v-if=\"showInputs\" class=\"mt-2\">\n              <div class=\"input-group\">\n                <input v-model=\"VM.name\" type=\"text\" class=\"form-control\" placeholder=\"VM Name\" aria-label=\"VM Name\">\n              </div>\n              <div class=\"input-group mt-2\"\n                data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-animation=\"false\"\n                title=\"Virtual Machine memory amount in megabytes\">\n                <input v-model=\"VM.mem\" type=\"text\" class=\"form-control\" placeholder=\"Memory\" aria-label=\"128m\">\n              </div>\n              <div class=\"input-group mt-2\"\n                data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-animation=\"false\"\n                title=\"Number of CPU cores\">\n                <input v-model=\"VM.cores\" type=\"text\" class=\"form-control\" placeholder=\"Cores\" aria-label=\"Cores\">\n              </div>\n              <div class=\"input-group mt-2\"\n                data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-animation=\"false\"\n                title=\"Port forwarding, QEMU syntax\">\n                <input v-model=\"VM.hostfwd\" type=\"text\" class=\"form-control\" placeholder=\"::8880-:80[,::22202-:22,...]\" aria-label=\"HostFwd\">\n              </div>\n              <div class=\"input-group mt-2\"\n                data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-animation=\"false\"\n                title=\"Host directory to share with guest as 9p device\">\n                <input v-model=\"VM.share\" type=\"text\" class=\"form-control\" placeholder=\"Shared directory\" aria-label=\"Share\">\n              </div>\n              <div class=\"input-group mt-2\">\n                <input v-model=\"VM.tcpserial\" type=\"checkbox\" id=\"tcpserial\" class=\"form-check-input\">\n                <label for=\"tcpserial\" class=\"form-check-label ms-2\">TCP serial console</label>\n              </div>\n              <div class=\"input-group mt-2\">\n                <input v-model=\"VM.rmprotect\" type=\"checkbox\" id=\"rmprotect\" class=\"form-check-input\">\n                <label for=\"rmprotect\" class=\"form-check-label ms-2\">rm protected</label>\n              </div>\n              <div class=\"input-group mt-2\">\n                <input v-model=\"VM.editprotect\" type=\"checkbox\" id=\"editprotect\" class=\"form-check-input\">\n                <label for=\"editprotect\" class=\"form-check-label ms-2\">Edit protected</label>\n              </div>\n              <button class=\"btn btn-success btn-sm mt-3\" @click=\"createVM\">save</button>\n            </div>\n          </li>\n\n        </ul> <!-- end main list  -->\n\n      </div> <!-- manage tab -->\n\n      <!-- Info tab -->\n\n      <div class=\"tab-pane\" id=\"nav-infos\" role=\"tabpanel\"\n        aria-labelledby=\"nav-infos-tab\">\n        <ul>\n            <li><b>site</b> <a href=\"https://smolBSD.org/\">https://smolBSD.org/</a></li>\n            <li><b>version</b> </li>\n            <li><b>load</b></li>\n        </ul>\n      </div>\n\n    </div> <!-- tab content -->\n  </div>\n\n  <script>\n    const app = Vue.createApp({\n      data() {\n        return {\n          Action: {\n            CREATE: 0,\n            EDIT: 1,\n          },\n          vmList: {},\n          showInputs: false,\n          VM: {\n            name: '',\n            mem: '',\n            cores: '',\n            hostfwd: '',\n            share: '',\n            tcpserial: false,\n            rmprotect: false,\n            editprotect: false,\n          },\n        };\n      },\n      methods: {\n        toggleInputs(actionType) {\n          if (actionType === this.Action.CREATE) {\n            this.zeroVM();\n          }\n          this.showInputs = !this.showInputs;\n        },\n        getVMList() {\n          fetch('/vmlist')\n            .then(response => response.json())\n            .then(data => {\n              this.vmList = data;\n            })\n            .catch(error => console.error('Error fetching VM list:', error));\n        },\n        getState(vm) {\n          const state = vm.status === 'stopped'\n            ? {\n                 button: 'btn-success', action: 'start', status: 'stopped'\n              }\n            : {\n                 button: 'btn-danger', action: 'stop', status: 'running'\n              };\n          return state;\n        },\n        zeroVM() {\n          for (const key in this.VM) {\n            if (this.VM.hasOwnProperty(key)) {\n              if (typeof this.VM[key] === 'string') {\n                this.VM[key] = ''; // Reset string properties\n              } else if (typeof this.VM[key] === 'boolean') {\n                this.VM[key] = false; // Reset boolean properties\n              }\n            }\n          }\n        },\n        toggleVM(vmName) {\n          var state = this.getState(this.vmList[vmName]);\n          const btnElement = document.getElementById(`button-${vmName}`);\n          btnElement.classList.add('blinking');\n          btnElement.classList.remove(state.button)\n          btnElement.classList.add('btn-secondary')\n\n          fetch(`/${state.action}`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ vm_name: vmName }),\n          })\n          .then(response => response.json())\n          .then(data => {\n            if (data.success) {\n              var retry = 0;\n              const intervalId = setInterval(() => {\n                this.getVMList(); // refresh vm statuses\n                if (this.vmList[vmName].status !== data.status) {\n                  state = this.getState(data);\n                  btnElement.classList.remove('blinking');\n                  btnElement.classList.add(state.button);\n                  this.vmList[vmName].status = state.status;\n                  clearInterval(intervalId);\n                }\n                if (retry++ > 3) {\n                  btnElement.classList.remove('blinking');\n                  btnElement.classList.add(state.button);\n                  clearInterval(intervalId);\n                }\n              }, 1000);\n            }\n          })\n          .catch(error => {\n            alert(`Error: ${error.message}`);\n          });\n        },\n        createVM() {\n          fetch('/saveconf', {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({\n              vm: this.VM.name,\n              mem: this.VM.mem,\n              cores: this.VM.cores,\n              hostfwd: this.VM.hostfwd,\n              share: this.VM.share,\n              tcpserial: this.VM.tcpserial,\n              rmprotect: this.VM.rmprotect,\n              editprotect: this.VM.editprotect\n            })\n          })\n          .then(response => response.json())\n          .then(data => {\n            if (data.success) {\n              this.getVMList();\n              this.toggleInputs(this.Action.CREATE);\n              alert(`VM ${this.VM.name} saved successfully.`);\n            }\n          })\n          .catch(error => {\n            alert(`Error: ${error.message}`);\n          });\n        },\n        deleteVM(vmName) {\n          fetch(`/rm/${vmName}`, {\n            method: 'DELETE',\n            headers: { 'Content-Type': 'application/json' },\n          })\n          .then(response => response.json())\n          .then(data => {\n            if (data.success) {\n              this.getVMList();\n              alert(`VM ${vmName} deleted successfully.`);\n            } else {\n              alert(`Failed to delete VM: ${data.message}`);\n            }\n          })\n          .catch(error => {\n            alert(`Error deleting VM: ${error.message}`);\n          });\n        },\n        editVM(vmName) {\n          const setBooleanFromStr = (value) => value === \"True\";\n\n          this.zeroVM();\n          this.VM.name = vmName;\n          this.VM.mem = this.vmList[vmName].mem;\n          this.VM.cores = this.vmList[vmName].cores;\n          this.VM.hostfwd = this.vmList[vmName].hostfwd;\n          this.VM.share = this.vmList[vmName].share;\n          if (this.vmList[vmName].serial_port) {\n            this.VM.tcpserial = true;\n          }\n          this.VM.rmprotect = setBooleanFromStr(this.vmList[vmName].rmprotect);\n          this.VM.editprotect = setBooleanFromStr(this.vmList[vmName].editprotect);\n\n          if (!this.showInputs) {\n            this.toggleInputs(this.Action.EDIT);\n          }\n        },\n        openSerialPort(vmName) {\n          const serialPort = this.vmList[vmName]?.serial_port;\n          if (serialPort) {\n            // on Linux this relies on xdg-open(1) using konsole(1) to open telnet://\n            const serialurl = `telnet://localhost:${this.vmList[vmName]?.serial_port}`\n            window.location=serialurl\n          }\n        },\n        copySerialPort(vmName) {\n          const serialPort = this.vmList[vmName]?.serial_port;\n          if (serialPort) {\n            const cpcommand = `telnet localhost ${this.vmList[vmName]?.serial_port}`\n            if (!navigator.clipboard) {\n              alert(`navigator.clipboard not available in HTTP: ${cpcommand}`);\n              return;\n            }\n            navigator.clipboard.writeText(cpcommand)\n              .then(() => {\n                alert(`${cpcommand} copied to clipboard`);\n              })\n              .catch(err => {\n                alert(`Failed to copy: ${err}`);\n              });\n          }\n        },\n        cpuUsage() {\n          Object.keys(this.vmList).forEach(vmName => {\n            if (this.vmList[vmName].status != 'running') {\n              return;\n            }\n            fetch(`/cpu_usage/${vmName}`)\n              .then(response => response.json())\n              .then(data => {\n                this.vmList[vmName].cpuUsage = data;\n                //console.log(data);\n              })\n              .catch(error => console.error('Error fetching CPU usage:', error));\n          });\n        },\n      },\n\n      mounted() {\n        this.getVMList();\n        setInterval(this.cpuUsage, 1000);\n        var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n        var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\n          return new bootstrap.Tooltip(tooltipTriggerEl)\n        })\n      }\n    });\n\n    app.mount('#app'); // Mount the Vue app to the `#app` div\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "app/requirements.txt",
    "content": "Flask\npsutil\npython-dotenv\n"
  },
  {
    "path": "bin/.gitkeep",
    "content": ""
  },
  {
    "path": "contribs/knockd.sh",
    "content": "#!/bin/sh\n\n# usage\n# server side: PORTS=\"1050 2000 3000\" SERVICE=\"sshd\" contribs/knockd.sh\n# client side: PORTS=\"1050 2000 3000\" && \\\n# \tfor p in $PORTS; do nc -w0 localhost $p; done\n#\n# unlike the real `knockd`, start ports and stop ports are\n# identical\n\npid=qemu-${SERVICE}.pid\n\nwhile :\ndo\n\techo \"entering loop\"\n\tfor p in $PORTS\n\tdo\n\t\tnc -l -p \"$p\"\n\t\techo \"got port $p\"\n\tdone\n\techo \"SESAME\"\n\t[ -f \"$pid\" ] && \\\n\t\tkill $(cat $pid) || \\\n\t\t./startnb.sh -f etc/${SERVICE}.conf &\ndone\n"
  },
  {
    "path": "contribs/knockssh.sh",
    "content": "#!/bin/sh\n\n# sample script to use with knockd.sh, I use it from Termux\n# on my Android phone\n\necho -n \"port: \"\nstty -echo\nread port\nstty echo\necho\n\nDEST=$1\nPORTS=\"$port $(($port + 1)) $port\"\n\nknock()\n{\n\tfor p in $PORTS\n\tdo\n\t\techo \"knocking\"\n\t\techo|nc -w5 $DEST $p\n\tdone\n}\n\nknock\nssh -p $(($port + 2)) ssh@$DEST\nknock\n"
  },
  {
    "path": "dockerfiles/Dockerfile.basic",
    "content": "FROM base,etc\n\nLABEL smolbsd.service=\"basic\"\nLABEL smolbsd.minimize=\"y\"\n\nCMD ksh\n"
  },
  {
    "path": "dockerfiles/Dockerfile.bsdshell",
    "content": "# unusual \"FROM\" naming, multiple RUN don't matter, and non-JSON CMD\n# hadolint global ignore=DL3006,DL3025,DL3059\nFROM base,etc\n\nLABEL smolbsd.service=\"bsdshell\"\n# strip down the image to df -h\nLABEL smolbsd.minimize=\"y\"\n# packages needed to run sailor\nLABEL smolbsd.addpkgs=\"pkgin pkg_tarup pkg_install sqlite3 rsync curl\"\n# microvm will use a pty as console\nLABEL smolbsd.use_pty=\"y\"\n\nARG HOSTNAME=shell\nARG USERNAME=bsd\nARG USERSHELL=/bin/ksh\n\nENV TERM=tmux-256color\nENV LANG=en_US.UTF-8\n\nRUN rm -f /etc/shrc\nRUN cat <<EOF >>/etc/profile\nPS1=\"\\$(printf '\\e[1;31m\\${USER}\\e[1;37m@${HOSTNAME}\\e[0m$ ')\"\nEOF\n\nRUN echo \"hostname ${HOSTNAME}\" >>/etc/rc.local && \\\n\techo 'eval \\$(resize)' >>/etc/rc.local && \\\n\techo \". /etc/include/shutdown\" >>/etc/rc\n\nRUN useradd -m $USERNAME && \\\n\tchsh -s $USERSHELL $USERNAME && \\\n\ttouch /home/${USERNAME}/.hushlogin && \\\n\techo 'HISTFILE=\"\\$HOME/.history\"' >> /home/${USERNAME}/.profile && \\\n\tchown -R $USERNAME /home/${USERNAME}\n\nCMD login -f -p bsd\n"
  },
  {
    "path": "dockerfiles/Dockerfile.caddy",
    "content": "# Mandatory, either comma separated base sets (here base and etc)\n# or base image name i.e. base-amd64.img\nFROM base,etc\n\n# Mandatory, service name\nLABEL smolbsd.service=caddy\n# Optional image minimization to actual content\nLABEL smolbsd.minimize=y\n# Dockerfile doesn't support port mapping\nLABEL smolbsd.publish=\"8881:8880\"\n\nRUN pkgin up && pkgin -y in caddy\n\nEXPOSE 8880\n\nCMD caddy respond -l :8880\n"
  },
  {
    "path": "dockerfiles/Dockerfile.clawd",
    "content": "# smolClaw: run an picoclaw instance in a microVM\n#\n# build this service:\n# $ ./smoler.sh build dockerfiles/Dockerfile.clawd\n# run this service:\n# $ ./startnb.sh -c 2 -m 1024 -f etc/clawd.conf\n\nFROM base,etc,man,comp\n\nLABEL smolbsd.service=clawd\n# final image size\nLABEL smolbsd.imgsize=2048\n# default picoclaw gateway port and SSH access\nLABEL smolbsd.publish=\"18789:18789,18800:18800,2289:22\"\n# microvm will use a pty as console\nLABEL smolbsd.use_pty=\"y\"\n\nARG PYVERS=\"314\"\n# ripgrep, fd, jq and rsync for convenience and tool writing\n# w3m for dumping webpages, go and python for code check\nRUN pkgin up && pkgin -y in \\\n\tbash curl git-base gmake vim \\\n\tjq rsync ripgrep fd-find imapfilter socat gh \\\n\tw3m python${PYVERS} py${PYVERS}-pipx py${PYVERS}-pip py${PYVERS}-uv\n\nENV NBUSER=clawd\nENV NBHOME=/home/${NBUSER}\nENV LANG=en_US.UTF-8\nENV TERM=tmux-256color\nENV MAXFILES=4096\n\nARG GHARCH=$(uname -p|sed 's/aarch64/arm64/;s/arm$/arm64/')\nARG GHREPO=https://github.com/sipeed/picoclaw/releases/download\nARG GHRELEASE=v0.2.7\n\nRUN curl -L -s -o- ${GHREPO}/${GHRELEASE}/picoclaw_Netbsd_${GHARCH}.tar.gz | \\\n\ttar zxf - -C /usr/pkg/bin \\\n\t\tpicoclaw picoclaw-launcher picoclaw-launcher-tui\n\nRUN <<EOF\nuseradd -m ${NBUSER}\nchsh -s /usr/pkg/bin/bash ${NBUSER}\nmkdir -p ${NBHOME}/.tmux\ncurl -s -Lo ${NBHOME}/.tmux/tmux-power.tmux \\\n\thttps://raw.githubusercontent.com/wfxr/tmux-power/master/tmux-power.tmux\nsed -i'' 's/status-right \"\\$RS\"/status-right \":: powered by 🚩 + smolBSD \"/' \\\n\t${NBHOME}/.tmux/tmux-power.tmux\nchmod +x ${NBHOME}/.tmux/tmux-power.tmux\n\n# for convenience\nPYDOTVERS=3.${PYVERS#3}\nfor p in python pip pipx uv- uvx-; do\n\tln -s /usr/pkg/bin/\\${p}3.${PYVERS#3} /usr/pkg/bin/\\${p%-}\ndone\nEOF\n\nRUN cat <<EOF >${NBHOME}/.vimrc\nset nocompatible\nset ts=8\nset noai\nsyntax on\nset mouse-=a\n\nnoremap <C-t> :tabnew<CR>\nnoremap <C-right> :tabnext<CR>\nnoremap <C-left> :tabprevious<CR>\nnoremap <C-l> :tabnext<CR>\nnoremap <C-k> :tabprevious<CR>\nEOF\n\nRUN cat <<EOF >${NBHOME}/.tmux.conf\nset -g default-terminal \"tmux-256color\"\nset -g @tmux_power_theme \"coral\"\nset-option -g repeat-time 0\nunbind |\nbind | split-window -h\nunbind -\nbind - split-window -v\nrun \"~/.tmux/tmux-power.tmux\"\nEOF\n\nRUN cat <<EOF >${NBHOME}/.bash_profile\nLIGHTGREEN=\"\\033[92m\"\nBOLD=\"\\033[1m\"\nNORMAL=\"\\033[0m\"\n\nPS1=\"[\\w]@😈+🦞> \"\nexport PATH=\"\\${PATH}:${NBHOME}/.local/bin:${NBHOME}/bin\"\nexport LANG=\"${LANG}\"\nexport TERM=\"${TERM}\"\nalias vi=vim\nexport EDITOR=vim\nEOF\n\nRUN cat <<'EOF' >>${NBHOME}/.bash_profile\n\nprintf \"\n---\n📝 the \\${LIGHTGREEN}vim\\${NORMAL} editor is available\n🪟 you are in a \\${LIGHTGREEN}tmux\\${NORMAL} multiplexer\n➡️  \\${BOLD}setup picoclaw\\${NORMAL}: \\${LIGHTGREEN}picoclaw onboard\\${NORMAL}\n➡️  \\${BOLD}start picoclaw gateway\\${NORMAL}: \\${LIGHTGREEN}picoclaw gateway\\${NORMAL}\n➡️  \\${BOLD}or\\${NORMAL}: \\${LIGHTGREEN}picoclaw-launcher -public\\${NORMAL} for a web GUI at http://127.0.0.1:18800\n➡️  \\${LIGHTGREEN}ssh -p 2289 clawd@localhost\\${NORMAL} to SSH to this microvm\n---\n\n\"\n\nEOF\n\n# SSH access\nARG SSH_PUBKEY=\"/mnt/share/ssh.pub\"\nCOPY ${SSH_PUBKEY} ${NBHOME}/.ssh/authorized_keys\n\nRUN [ -d \"${NBHOME}/.ssh\" ] && \\\n    chown -R ${NBUSER} ${NBHOME} && \\\n    chmod 755 ${NBHOME} && \\\n    chmod -R go-rwx ${NBHOME}/.ssh\n\nRUN cat <<EOF >/etc/rc.local\nhostname ${NBUSER}\nulimit -n ${MAXFILES}\nEOF\n\nRUN echo 'eval \\$(resize)' >>/etc/rc.local\n\nEXPOSE 18800\n\n# script creates a pty, do not su - in order to get env vars\nCMD /etc/rc.d/sshd onestart && \\\n\tscript -c \"cd ${NBHOME} && su ${NBUSER} -c 'tmux -u new'\" /dev/null || bash\n"
  },
  {
    "path": "dockerfiles/Dockerfile.crush",
    "content": "# smol'd version of crush https://github.com/charmbracelet/crush\n#\n# copy a configured crush.json in the directory of the\n# project you want to work on and:\n#\n# ./smoler.sh run crush-amd64:latest -m 1024 -w /path/to/project\n#\n# /path/to/project will be mounted in /mnt\n#\nFROM base,comp,etc\n\nLABEL smolbsd.service=crush\nLABEL smolbsd.minimize=y\nLABEL smolbsd.imgsize=2048\nLABEL smolbsd.use_pty=y\n\nARG CRUSH_VERSION=\"0.62.1\"\nARG CRUSH_ARCH=$(uname -p|sed 's/aarch64/arm64/')\n\nENV NBUSER=crush\nENV LANG=en_US.UTF-8\nENV TERM=tmux-256color\nENV PATH=${PATH}:/usr/pkg/bin\n\nRUN pkgin up && pkgin -y in curl\n\nRUN mkdir -p /usr/pkg/bin && \\\n\tcurl -L -s -o- \\\n\t\thttps://github.com/charmbracelet/crush/releases/download/v${CRUSH_VERSION}/crush_${CRUSH_VERSION}_Netbsd_${CRUSH_ARCH}.tar.gz | \\\n\t\ttar zxf - -C /usr/pkg/bin --strip-components=1 crush_${CRUSH_VERSION}_Netbsd_${CRUSH_ARCH}/crush\n\nRUN cat <<EOF >/etc/rc.local\nhostname ${NBUSER}\nulimit -n 4096\nEOF\n\nRUN echo 'eval \\$(resize)' >>/etc/rc.local\nRUN echo 'printf \"\\nℹ️ When shutting down, ${LIGHTGREEN}Ctrl-A Ctrl-X${NORMAL} to exit the microvm\\n\\n\"' >>/etc/rc.local\n\nUSER $NBUSER\nWORKDIR /home/$NBUSER\n\nRUN touch .hushlogin\n\nRUN cat <<EOF >.tmux.conf\nset -g status off\nEOF\n\nRUN cat <<EOF >.profile\nprintf \"\\n⌚ Wait for crush to load...\\n\\n\"\n\ncrush\n\nexit\nEOF\n\nRUN cat <<EOF >cmd.sh\n#!/bin/sh\n\nfor f in /mnt/crush.json /var/qemufwcfg/opt/org.smolbsd.file.crush\ndo\n\tif [ -f \"\\\\\\$f\" ]; then\n\t\tcp \"\\\\\\$f\" crush.json\n\t\texec login -f -p $NBUSER\n\tfi\ndone\n\necho \"⚠️ no crush.json, either:\"\nprintf \"\\n- add ${LIGHTGREEN}-E crush=/path/to/crush.json${NORMAL} to the command line\\nor\"\nprintf \"\\n- copy crush.json to a directory and add ${LIGHTGREEN}-w /path/to/directory'${NORMAL}\\n\"\nksh\nEOF\nRUN chmod +x cmd.sh\n\nCMD ./cmd.sh\n"
  },
  {
    "path": "dockerfiles/Dockerfile.dockinx",
    "content": "FROM base,etc\n\nLABEL smolbsd.service=dockinx\nLABEL smolbsd.minimize=y\nLABEL smolbsd.publish=8800:80\n\nARG JUST=ATEST\n\nRUN groupadd nginx && \\\n\tuseradd -g nginx -d /var/www nginx && \\\n\tchown -R nginx /var/www\nRUN pkgin up && pkgin -y in nginx && \\\n\tcp -R /usr/pkg/share/examples/nginx/conf /usr/pkg/etc/nginx && \\\n\tsed -i'' 's,root .*;,root /var/www;,' /usr/pkg/etc/nginx/nginx.conf && \\\n\tmkdir -p /var/log/nginx /var/db/nginx\n\nUSER nginx\nRUN echo '<html><body>Up!</body></html>' >/var/www/index.html\nADD https://github.com/NetBSDfr/smolBSD/blob/main/README.md /var/www/README.md\n\nEXPOSE 80\n\nENV ANOTHER=TEST\n\nVOLUME misc\nWORKDIR /var/www\n\nUSER root\n\nCMD nginx -g 'daemon off;'\n"
  },
  {
    "path": "dockerfiles/Dockerfile.tiny",
    "content": "# hadolint global ignore=DL3006,DL3025 # FROM naming and non-JSON CMD\nFROM base,etc\n\nLABEL smolbsd.service=\"tiny\"\n# strip down the image to df -h\nLABEL smolbsd.minimize=\"y\"\n# packages needed to run sailor\nLABEL smolbsd.addpkgs=\"pkgin pkg_tarup pkg_install sqlite3 rsync curl\"\n\nCMD ksh\n"
  },
  {
    "path": "etc/base.conf",
    "content": "fwcfgvar=\"MOUNTRO=y\"\n"
  },
  {
    "path": "etc/bozohttpd.conf",
    "content": "# optional\nmem=128m\n# optional\ncores=1\n# optional port forward\nhostfwd=::8180-:80\n# kernel parameters to append\n#append=\"-v\"\n# optional path to share with guest\n#share=$(pwd)\n# optional extra parameters\n#extra=\"\"\nsharerw=\"y\"\n"
  },
  {
    "path": "etc/clawd.conf",
    "content": "hostfwd=::18789-:18789,::18800-:18800,::2289-:22\nimgtag=latest\nuse_pty=y\n"
  },
  {
    "path": "etc/games.conf",
    "content": "# Because text-based games deserve power! \n#mem=32768m # Not less, fool!\n#cores=64 # min requirement\n#\n# ... these values are a joke, dude! No need such power, default values are enough.\n"
  },
  {
    "path": "etc/lhv-tools.conf",
    "content": "# optional\nmem=128m\n# optional\ncores=1\n# optional port forward\nhostfwd=::8180-:80\n# optional qmp\nqmp_port=4444\n# optional serial\nserial_port=5555\n"
  },
  {
    "path": "etc/live.conf",
    "content": "ARCH=\"$(scripts/uname.sh -m)\"\n# make live for amd64 or make ARCH=evbarm-aarch64 live\nimg=images/NetBSD-${ARCH}-live.img\nmem=1g\ncores=2\nhostfwd=::22222-:22\nroot=NAME=$([ \"$ARCH\" = \"amd64\" ] && echo NBImgRoot || echo netbsd-root)\n"
  },
  {
    "path": "etc/nbakery.conf",
    "content": "# optional\nmem=512m\n# optional\ncores=2\n# optional port forward\nhostfwd=::2299-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\nshare=$(pwd)\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/nitrosshd.conf",
    "content": "# optional\nmem=256m\n# optional\ncores=1\n# optional port forward\nhostfwd=::2022-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\n#share=$(pwd)\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/rescue.conf",
    "content": "# optional\nmem=128m\n# optional\ncores=1\n# optional qmp\n#qmp_port=4444\n# optional serial\n#serial_port=5555\n# optional port forward\nhostfwd=::22122-:22\n# optional anything or empty\nbridgenet=\n# optional path to share with guest\nshare=$(pwd)\n# optional extra parameters\n#extra=\"\"\n"
  },
  {
    "path": "etc/runbsd.conf",
    "content": "# optional\nmem=512m\n# optional\ncores=2\n# optional port forward\nhostfwd=::2298-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\nshare=$(pwd)\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/sshd.conf",
    "content": "# optional\nmem=256m\n# optional\ncores=1\n# optional port forward\nhostfwd=::2022-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\nshare=$(pwd)\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/systembsd.conf",
    "content": "# optional\nmem=512m\n# optional\ncores=2\n# optional port forward\nhostfwd=::2297-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\n#share=$(pwd)\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/tslog.conf",
    "content": "# optional\nmem=256m\n# optional\ncores=1\n# optional port forward\nhostfwd=::2299-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\nshare=${HOME}/src\n# optional extra parameters\n#extra=\"\"\n# append=\"-v\"\n"
  },
  {
    "path": "etc/usershell.conf",
    "content": "# optional\nmem=128m\n# optional\ncores=1\n# optional qmp\n#qmp_port=4444\n# optional serial\n#serial_port=5555\n# optional port forward\n#hostfwd=::22122-:22\n# optional anything or empty\n#bridgenet=\n# optional path to share with guest\n#share=$(pwd)\n# optional extra parameters\n#extra=\"\"\n"
  },
  {
    "path": "k8s/Dockerfile",
    "content": "FROM alpine:latest\n\nRUN apk add --quiet --no-cache qemu-system-x86_64 uuidgen\n\nARG NBIMG=bozohttpd-amd64.img\nARG MEM=256m\nARG KERNEL=netbsd-SMOL\nARG PORTFWD=8080:80\n\nENV NBIMG=${NBIMG}\nENV MEM=${MEM}\nENV KERNEL=${KERNEL}\nENV PORTFWD=${PORTFWD}\n\nCOPY ${KERNEL} ${NBIMG} startnb.sh /\n\nCMD [\"/bin/sh\", \"-c\", \"PORTFWD=$(echo ${PORTFWD}|sed 's/:/-:/') && /startnb.sh -m ${MEM} -k ${KERNEL} -i ${NBIMG} -p ::${PORTFWD}\" ]\n"
  },
  {
    "path": "k8s/README.md",
    "content": "# smolBSD pod example\n\nA _smolBSD_ system can be spawned inside a container, thus bringing a decent level of security to the service which will be isolated in a virtual machine.  \n\n## Building the _docker_ image\n\nLet's use the [bozohttpd service][0] as an example image.\n\nFetch the kernel image and generate the _smolBSD_ image as usual\n\n```sh\n$ make kernfetch\n$ make SERVICE=bozohttpd base\n```\nBuild the docker image using the created _smolBSD_ image\n\n```sh\n$ docker build -t smolbozo -f k8s/Dockerfile .\n```\nThe following arguments can be passed to the build process using the `--build-arg` flag:\n\n* `NBIMG`: the name of the _smolBSD_ image, defaults to `bozohttpd-amd64.img`\n* `MEM`: the amount of memory for the virtual machine, defaults to `256m`\n* `KERNEL`: the name of the kernel to use, defaults to `netbsd-SMOL`\n* `PORTFWD`: port forwarding between host and guest, defaults to `8080:80`\n\nTry launching the container:\n```sh\n$ docker run -it --rm --device=/dev/kvm -p 8080:8080 smolbozo\n```\nAnd access it\n```sh\n$ curl http://localhost:8080\n<html><body>up!</body></html>\n```\n\n## smolBSD pod\n\nThe [generic device plugin][1] is needed in order to expose `/dev/kvm` to the container without running the _smolBSD_ pod it in privileged mode.\n\nApply this [modified version][2] of `k8s/generic-device-plugin.yaml` to your _k8s_ cluster:\n\n```sh\n$ kubectl apply -f k8s/generic-device-plugin.yaml\n```\nCheck it is running:\n```sh\n$ kubectl get pods -n kube-system -l app.kubernetes.io/name=generic-device-plugin\nNAME                          READY   STATUS    RESTARTS   AGE\ngeneric-device-plugin-c74cc   1/1     Running   0          40h\n```\n\nFinally, here is a simple pod example for the `bozohttpd` _smolBSD_ image, this example implies the image is already loaded in the cluster and the pod port `8080` will be mapped to the node IP.\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: smolbozo\n  namespace: smolbsd\n  labels:\n    app: smolbozo\nspec:\n  containers:\n  - name: bozohttpd\n    image: smolbozo:0.1\n    ports:\n    - containerPort: 8080\n      hostPort: 8080\n    resources:\n      limits:\n        squat.ai/kvm: 1\n```\n> [!note]\n> you will either need to change the repository address for the `image` or setup a local repository:\n> * [with Kind][3]\n> * [with K3s][4]\n>\n> With _Kind_, you can also [import the image][5] into the cluster, but beware to use fixed versions for the image, if `:latest` is used, the pull policy defaults to `Always`.\n\nCreate the `smolbsd` _namespace_ and apply the manifest:\n```sh\n$ kubectl create namespace smolbsd\n$ kubectl apply -f k8s/smolbozo.yaml\n```\nCheck it is running\n```sh\n$ kubectl get pods -n smolbsd -o wide\nNAME       READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES\nsmolbozo   1/1     Running   0          41h   10.42.0.21   k3s    <none>           <none>\n```\nAnd curl it!\n```sh\n$ curl http://10.42.0.21:8080\n<html><body>up!</body></html>\n ```\n\n[0]: https://github.com/NetBSDfr/smolBSD/tree/main/service/bozohttpd\n[1]: https://github.com/squat/generic-device-plugin\n[2]: https://github.com/NetBSDfr/smolBSD/blob/main/k8s/generic-device-plugin.yaml\n[3]: https://kind.sigs.k8s.io/docs/user/local-registry/\n[4]: https://docs.k3s.io/installation/private-registry\n[5]: https://kind.sigs.k8s.io/docs/user/quick-start/#loading-an-image-into-your-cluster\n"
  },
  {
    "path": "k8s/generic-device-plugin.yaml",
    "content": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: generic-device-plugin\n  namespace: kube-system\n  labels:\n    app.kubernetes.io/name: generic-device-plugin\nspec:\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: generic-device-plugin\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io/name: generic-device-plugin\n    spec:\n      priorityClassName: system-node-critical\n      tolerations:\n      - operator: \"Exists\"\n        effect: \"NoExecute\"\n      - operator: \"Exists\"\n        effect: \"NoSchedule\"\n      containers:\n      - image: squat/generic-device-plugin\n        args:\n        - --device\n        - |\n          name: kvm\n          groups:\n            - paths:\n                - path: /dev/kvm\n        name: generic-device-plugin\n        resources:\n          requests:\n            cpu: 50m\n            memory: 10Mi\n          limits:\n            cpu: 50m\n            memory: 20Mi\n        ports:\n        - containerPort: 8080\n          name: http\n        securityContext:\n          privileged: true\n        volumeMounts:\n        - name: device-plugin\n          mountPath: /var/lib/kubelet/device-plugins\n        - name: dev\n          mountPath: /dev\n      volumes:\n      - name: device-plugin\n        hostPath:\n          path: /var/lib/kubelet/device-plugins\n      - name: dev\n        hostPath:\n          path: /dev\n  updateStrategy:\n    type: RollingUpdate\n"
  },
  {
    "path": "k8s/smolbozo.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: smolbozo\n  namespace: smolbsd\n  labels:\n    app: smolbozo\nspec:\n  containers:\n  - name: bozohttpd\n    image: localhost:5000/smolbozo\n    ports:\n    - containerPort: 8080\n    resources:\n      limits:\n        squat.ai/kvm: 1\n\n---\n\napiVersion: v1\nkind: Service\nmetadata:\n  name: smolbozo-svc\n  namespace: smolbsd\nspec:\n  selector:\n    app: smolbozo\n  ports:\n    - protocol: TCP\n      port: 8080\n      targetPort: 8080\n"
  },
  {
    "path": "misc/vmbatch.md",
    "content": "# VM batch creation and bench\n\nYou need [smolBSD](https://github.com/NetBSDfr/smolBSD) to test the following\n\n## Read-only `bozohttpd` web server image\n\n* Create the base image\n\n```sh\n$ make MOUNTRO=y SERVICE=bozohttpd build\n```\n* Create a config file template\n\n```sh\n$ cat etc/bozohttpd.conf\n# mandatory\nimg=bozohttpd-amd64.img\n# mandatory\nkernel=netbsd-SMOL # https://smolbsd.org/assets/netbsd-SMOL\n# optional\nmem=128m\n# optional\ncores=1\n# optional port forward\nhostfwd=::8180-:80\n# optional extra parameters\nextra=\"\"\n# don't lock the disk image\nsharerw=\"y\"\n```\n\n* Try it\n\n```sh\n$ ./startnb.sh -f etc/bozohttpd.conf\n```\nexit `qemu` with `Ctrl-a x`\n\n## Example shell script, parallel run\n\nJust play with the `num` variable\n\n```sh\n#!/bin/sh\n\nvmname=bozohttpd\nnum=9\n\nfor i in $(seq 1 $num)\ndo\n        sed \"s/8180/818$i/\" etc/${vmname}.conf > etc/${vmname}${i}.conf\ndone\n\nfor f in etc/${vmname}[0-9]*.conf; do\n  . $f\n  echo \"starting $vm\"\n  ./startnb.sh -f $f -d &\ndone\n\nfor i in $(seq 1 $num)\ndo\n        while ! curl -s -I --max-time 0.01 localhost:818${i}\n        do\n                true\n        done\ndone\n\nfor i in $(seq 1 $num); do curl -I http://localhost:818${i}; done\n\nfor i in $(seq 1 $num); do kill $(cat qemu-${vmname}${i}.pid); done\n\nrm -f etc/${vmname}[0-9]*.conf\n```\n"
  },
  {
    "path": "mkimg.sh",
    "content": "#!/bin/sh\n\nset -e\n\nprogname=${0##*/}\n\nusage()\n{\n\tcat 1>&2 << _USAGE_\nUsage: $progname [-s service] [-m megabytes] [-i image] [-x set]\n       [-k kernel] [-o] [-c URL] [-b]\n\n\tCreate a root image\n\t-s service\tservice name, default \"rescue\"\n\t-r rootdir\thand crafted root directory to use\n\t-m megabytes\timage size in megabytes, default 10\n\t-i image\timage name, default rescue-[arch].img\n\t-x sets\t\tlist of NetBSD sets, default rescue.tgz\n\t-k kernel\tkernel to copy in the image\n\t-c URL\t\tURL to a script to execute as finalizer\n\t-o\t\tread-only root filesystem\n\t-b\t\tmake image BIOS bootable\n_USAGE_\n\texit 1\n}\n\noptions=\"s:m:i:r:x:k:c:boh\"\n\n[ -f tmp/build* ] && . tmp/build*\n\n. service/common/vars\n. service/common/funcs\n. service/common/choupi\n\nwhile getopts \"$options\" opt\ndo\n\tcase $opt in\n\ts) svc=\"$OPTARG\";;\n\tm) megs=\"$OPTARG\";;\n\ti) img=\"$OPTARG\";;\n\tr) rootdir=\"$OPTARG\";;\n\tx) sets=\"$OPTARG\";;\n\tk) kernel=\"$OPTARG\";;\n\tc) curlsh=\"$OPTARG\";;\n\tb) biosboot=y;;\n\to) rofs=y;;\n\th) usage;;\n\t*) usage;;\n\tesac\ndone\n\nexport ARCH PKGVERS\n\narch=${ARCH:-\"amd64\"}\n\nsvc=${svc:-\"rescue\"}\nmegs=${megs:-\"20\"}\nimg=${img:-\"rescue-${arch}.img\"}\nsets=${sets:-\"rescue.tar.xz\"}\nrootdir=${rootdir:-}\nkernel=${kernel:-}\ncurlsh=${curlsh:-}\nrofs=${rofs:-}\nADDSETS=${ADDSETS:-}\nADDPKGS=${ADDPKGS:-}\nSVCIMG=${SVCIMG:-}\n\nOS=$(uname -s)\nTAR=tar\nFETCH=$(pwd)/scripts/fetch.sh\n\nis_netbsd=\nis_buildimg=\nis_linux=\nis_darwin=\nis_openbsd=\nis_freebsd=\nis_unknown=\n\ncase $OS in\nNetBSD|smolBSD)\n\tis_netbsd=1\n\tFETCH=ftp\n\t;;\nLinux)\n\tis_linux=1\n\t# avoid sets and pkgs untar warnings\n\tTAR=bsdtar\n\t;;\n# those 2 will be ported at some point\nOpenBSD)\n\tis_openbsd=1\n\techo \"${ERROR} unsupported for now\"\n\texit 1\n\t;;\nFreeBSD)\n\tis_freebsd=1\n\techo \"${ERROR} unsupported for now\"\n\texit 1\n\t;;\n*)\n\techo \"${ERROR} unsupported for now\"\n\texit 1\nesac\n\n[ -f \"/BUILDIMG\" ] && is_buildimg=1\n\nfor tool in $TAR # add more if needed\ndo\n\tif ! command -v $tool >/dev/null; then\n\t\techo \"$tool missing\"\n\t\texit 1\n\tfi\ndone\n\nexport TAR FETCH\n\nif [ -z \"$is_netbsd\" ]; then\n\tif [ -n \"$MINIMIZE\" ] || [ -f \"service/${svc}/NETBSD_ONLY\" ]; then\n\t\tprintf \"\\nThis image must be built on NetBSD!\\n\"\n\t\tprintf \"Use the image builder instead: make SERVICE=$svc build\\n\"\n\t\texit 1\n\tfi\n# we're on native NetBSD, disk scan only on build image\nelif [ -n \"$is_buildimg\" ]; then\n\tdisks=\"$(sysctl -n hw.disknames)\"\n\t# A secondary disk was passed, record disk that has no wedges\n\t# $imgdev is the image device passed as second disk\n\tif [ \"$(echo \\\"$disks\\\"|wc -w)\" -gt 2 ]; then\n\t\tfor disk in $disks\n\t\tdo\n\t\t\tdkctl $disk listwedges 2>&1 | grep -q 'no wedges' && \\\n\t\t\t\timgdev=\"${disk}\"\n\t\tdone\n\tfi\nfi\n\n[ -n \"$is_linux\" ] && u=M || u=m\n\n# inherit from another image\nif [ -n \"$FROMIMG\" ]; then\n\techo \"${ARROW} using ${FROMIMG} as base image\"\n\t[ -z \"$imgdev\" ] && cp images/${FROMIMG} ${img} || \\\n\t\tdd if=images/${FROMIMG} of=\"${imgdev}\" bs=1${u}\nelse\n\t# only create image if secondary was not passed\n\t[ -z \"$imgdev\" ] && \\\n\t\tdd if=/dev/zero of=./${img} bs=1${u} count=${megs}\nfi\n\n# are we building the builder or a service (secondary drive passed as param)\n[ -z \"$imgdev\" ] && mnt=$(pwd)/mnt || mnt=${DRIVE2}\n\nwedgename=\"${svc}root\"\nffsmountopts=\"noatime\"\n\nif [ -n \"$is_linux\" ]; then\n\t# no other image than builder image are ext2, don't check for FROMIMG\n\tsgdisk --zap-all ${img} || true\n\t# atribute 59 is \"bootme\" from /usr/include/sys/disklabel_gpt.h\n\tsgdisk --new=1:0:0 --typecode=1:8300 --change-name=1:\"$wedgename\" \\\n\t\t--attributes=1:set:59 ${img}\n\t# GitHub actions can't create loopXpY, use an offset\n\toffset=$(sgdisk -i 1 ${img} | awk '/First sector/ {print $3}')\n\tvnd=$(losetup -f --show -o $((offset * 512)) ${img})\n\tmke2fs -O none ${vnd}\n\tmount ${vnd} $mnt\n\tmountfs=\"ext2fs\"\n#elif [ -n \"$is_freebsd\" ]; then\n#\timgdev=\"$(mdconfig -l -f $img || mdconfig -f $img)\"\n#\tnewfs -o time -O1 -m0 /dev/${imgdev}\n#\tmount -o noatime /dev/${imgdev} $mnt\n#\tmountfs=\"ffs\"\nelse # NetBSD\n\tif [ -z \"$imgdev\" ]; then # no secondary disk, create a vnd\n\t\timgdev=$(vndconfig -l|grep -m1 'not'|cut -f1 -d:)\n\t\tvndconfig $imgdev $img\n\t\tvnd=$imgdev # for later detach\n\tfi\n\tmountfs=\"ffs\"\n\n\tgetwedge()\n\t{\n\t\tmountdev=$(dkctl ${1} listwedges|sed -n \"s/\\(dk.*\\):\\ ${wedgename}.*/\\1/p\")\n\t\tif [ -z \"$mountdev\" ]; then\n\t\t\techo \"${ERROR} no wedge, exiting\"\n\t\t\texit 1\n\t\tfi\n\t\techo \"$mountdev\"\n\t}\n\n\tif [ -z \"$FROMIMG\" ]; then\n\t\tgpt create ${imgdev}\n\t\tgpt add -a 512k -l \"$wedgename\" -t ${mountfs} ${imgdev}\n\t\tgpt set -a bootme -i 1 ${imgdev}\n\t\teval $(gpt show ${imgdev}|awk '/NetBSD/ {print \"startblk=\"$1; print \"blkcnt=\"$2}')\n\t\tmountdev=$(getwedge ${imgdev})\n\t\tnewfs -O1 -m0 /dev/${mountdev}\n\telse\n\t\tmountdev=$(getwedge ${imgdev})\n\tfi\n\t# sailor shrink is too agressive, journal is lost\n\t[ -z \"$MINIMIZE\" ] && ffsmountopts=\"${ffsmountopts},log\"\n\n\tmount -o ${ffsmountopts} /dev/${mountdev} $mnt\nfi\n\n[ -f \"service/${svc}/sailor.conf\" ] && use_sailor=1\n# additional packages\nfor pkg in ${ADDPKGS}; do\n\t# case 1, artefacts created by the builder service\n\t# minimization of the image via sailor is requested\n\t# we need packages cleanly installed via pkgin\n\tif [ -f /tmp/usrpkg.tgz ] && [ -n \"$use_sailor\" ]; then\n\t\techo \"${ARROW} unpacking minimal env for sailor\"\n\t\t# needed to re-create packages with pkg_tarup\n\t\ttar xfp /tmp/usrpkg.tgz -C /\n\t\tpkgin -y in $ADDPKGS\n\t\t# exit the loop, packages have been installed cleanly\n\t\tbreak\n\tfi\n\t# case 2, no need for recorded, cleanly installed packages\n\t# simply untar them to LOCALBASE\n\tpkg=\"pkgs/${arch}/${pkg}.tgz\"\n\t[ ! -f ${pkg} ] && continue\n\teval $($TAR xfp $pkg -O +BUILD_INFO|grep ^LOCALBASE)\n\techo -n \"extracting $pkg to ${LOCALBASE}.. \"\n\tmkdir -p ${mnt}/${LOCALBASE}\n\t$TAR xfp ${pkg} --exclude='+*' -C ${mnt}/${LOCALBASE} || exit 1\n\techo done\ndone\n# minimization of the image via sailor is requested\nif [ -n \"$MINIMIZE\" ] && [ -n \"$use_sailor\" ] && \\\n\t[ -d /var/db/pkgin ]; then\n\techo \"${ARROW} minimize image\"\n\trm -rf ${mnt}/var/db/pkg*\n\tcd ${BASEPATH}/sailor\n\texport TERM=vt220\n\tPKG_RCD_SCRIPTS=YES ./sailor.sh build /service/${svc}/sailor.conf\n\tcd ..\n# root fs is hand made\nelif [ -n \"$rootdir\" ]; then\n\t$TAR cfp - -C \"$rootdir\" . | $TAR xfp - -C ${mnt}\n# use sets and customizations in services/\nelse\n\tfor s in ${sets} ${ADDSETS}\n\tdo\n\t\tpartial=\n\t\t# we want to extract only part of the archive\n\t\tif [ \"$s\" != \"${s%:*}\" ]; then\n\t\t\tpartial=\".${s#*:}\"\n\t\t\ts=${s%:*}\n\t\tfi\n\t\t# don't prepend sets path if this is a full path\n\t\tcase $s in */*) ;; *) s=\"sets/${arch}/${s}\" ;; esac\n\t\techo -n \"extracting ${s}.. \"\n\t\t$TAR xfp ${s} -C ${mnt}/ ${partial} || exit 1\n\t\techo done\n\tdone\n\nfi\n\n# $rootdir can be relative, don't cd mnt yet\nfor d in sbin bin dev etc/include\ndo\n\tmkdir -p ${mnt}/$d\ndone\n\n[ -n \"$rofs\" ] && mountopt=\"ro\" || mountopt=\"rw\"\nif [ \"$mountfs\" = \"ffs\" ]; then\n\tmountopt=\"${mountopt},${ffsmountopts}\"\nfi\necho \"NAME=${wedgename} / $mountfs $mountopt 1 1\" > ${mnt}/etc/fstab\n\nrsynclite service/${svc}/etc/ ${mnt}/etc/\nrsynclite service/common/ ${mnt}/etc/include/\n[ -d service/${svc}/packages ]  && \\\n\trsynclite service/${svc}/packages ${mnt}/\n\n[ -n \"$kernel\" ] && cp -f $kernel ${mnt}/netbsd\n\n# enter the mounted image root\ncd $mnt\n\nif [ \"$svc\" = \"rescue\" ]; then\n\tfor b in init mount_ext2fs\n\tdo\n\t\tln -s /rescue/$b sbin/\n\tdone\n\tln -s /rescue/sh bin/\nfi\n\n# warning, postinst operations are done on the builder\n\n[ -d ../service/${svc}/postinst ] && \\\n    for x in $(set +f; ls ../service/${svc}/postinst/*.sh)\n\tdo\n\t\t# if SVCIMG variable exists, only process its script\n\t\tif [ -n \"$SVCIMG\" ]; then\n\t\t\t[ \"${x##*/}\" != \"${SVCIMG}.sh\" ] && continue\n\t\t\techo \"SVCIMG=$SVCIMG\" > etc/svc\n\t\tfi\n\t\techo \"executing $x\"\n\t\t[ -f $x ] && sh $x\n\tdone\n\n# we don't need to hack our way around MAKEDEV on NetBSD / builder\nif [ -z \"$is_netbsd\" ]; then\n\t# newer NetBSD versions use tmpfs for /dev, sailor copies MAKEDEV from /dev\n\t# backup MAKEDEV so imgbuilder rc can copy it\n\tcp dev/MAKEDEV* etc/\n\t# unionfs with ext2 leads to i/o error\n\tsed -i'' 's/-o union//g' dev/MAKEDEV\nfi\n# record wanted pkgsrc version\necho \"PKGVERS=$PKGVERS\" > etc/pkgvers\n\n# proceed with caution\n[ -n \"$curlsh\" ] && curl -sSL \"$CURLSH\" | /bin/sh\n\n[ -n \"$MINIMIZE\" ] && \\\n\trm -rf var/db/pkgin # wipe pkgin cache and db\n\n# QEMU fw_cfg mountpoint\nmkdir -p var/qemufwcfg\n\nif [ -n \"$biosboot\" ]; then\n\tcp /usr/mdec/boot ${mnt}\n\tcat >${mnt}/boot.cfg<<EOF\ntimeout=0\nconsdev=${BIOSCONSOLE}\nEOF\nfi\n\ndisksize=$(du -s ${mnt}|cut -f1)\ncd .. # get out mountpoint\numount $mnt\n\nif [ -n \"$MINIMIZE\" ]; then\n\taddspace=$(( ${MINIMIZE#*+} * 2048 ))\n\t[ $addspace -eq 0 ] && addspace=$((disksize / 10))\n\tdisksize=$((disksize + addspace)) # give 10% MB more\n\techo \"${ARROW} resizing image to $((disksize / 2048))MB\"\n\tresize_ffs -y -s ${disksize} /dev/${mountdev}\n\tfsck_ffs -c4 -f -y /dev/${mountdev} >/dev/null\n\techo \"$((disksize * 512))\" > ${BASEPATH}/tmp/${img##*/}.size\nfi\n\n#[ -n \"$is_freebsd\" ] && mdconfig -d -u $vnd\n[ -n \"$is_linux\" ] && losetup -d $vnd\nif [ -n \"$is_netbsd\" ]; then\n\tif [ -n \"$biosboot\" ]; then\n\t\tgpt biosboot -i 1 ${imgdev}\n\t\tinstallboot -v /dev/r${mountdev} /usr/mdec/bootxx_ffsv1\n\tfi\n\n\t[ -n \"$vnd\" ] && vndconfig -u $vnd\nfi\n\nexit 0\n"
  },
  {
    "path": "mnt/.gitkeep",
    "content": ""
  },
  {
    "path": "scripts/app-run.sh",
    "content": "#!/bin/sh\n#\n# See app/README.md for documentation\n#\n\nprogname=${0##*/}\nprogdir=${0%/*}\ncwd=$(realpath $progdir)\n\nset -euf\n\n(\n    cd $cwd/../app;\n\n    # initial setup\n    if [ ! -f bin/activate ]; then\n        python3 -m venv .\n        . bin/activate\n        pip install -r requirements.txt\n    fi\n\n    . bin/activate\n    # Set Flask env vars defaults\n    FLASK_APP=${FLASK_APP:-app} \\\n    FLASK_RUN_PORT=${FLASK_RUN_PORT:-5000} \\\n    FLASK_RUN_HOST=${FLASK_RUN_HOST:-127.0.0.1} \\\n    FLASK_ENV=${FLASK_ENV:-development} \\\n    FLASK_DEBUG=${FLASK_DEBUG:-True} \\\n    FLASK_LOGLEVEL=${FLASK_LOGLEVEL:-20} \\\n    FLASK_CWD=$cwd/.. \\\n        flask run \"$@\"\n        #python3 app.py\n)\n"
  },
  {
    "path": "scripts/fetch.sh",
    "content": "#!/bin/sh\n\nflag=$1\nif [ \"$flag\" = \"-o\" ]; then\n\toutfile=$2\n\tfullurl=$3\nelse\n\tfullurl=$2\nfi\n\ncase $fullurl in\n*\\**)\n\tdldir=${outfile%/*} # pkgs/amd64/pkgin.tgz\n\tfetchurl=${fullurl%/*} \n\tmatchfile=${fullurl##*/}\n\tmatchfile=${matchfile%\\*}\n\tcurl ${CURL_FLAGS} -L -s \"$fetchurl\" | grep -oE \"\\\"${matchfile}-[^\\\"]*(xz|gz)\" | \\\n\t\twhile read f; do\n\t\t\tf=${f#\\\"}\n\t\t\t# mimic NetBSD's ftp parameters\n\t\t\tdestfile=${f%-*}.${f##*.}\n\t\t\t[ \"$flag\" = \"-o\" ] && curlaction=\"-o ${dldir}/${destfile}\" || \\\n\t\t\t\tcurlaction=\"-I\"\n\t\t\tcurl ${CURL_FLAGS} -L -s ${curlaction} ${fetchurl}/${f}\n\t\t\texit 0\n\t\tdone\n\t;;\n*)\n\t[ \"$flag\" = \"-o\" ] && curlaction=\"-o $outfile\" || curlaction=\"-I\"\n\tcurl ${CURL_FLAGS} -L -s $curlaction $fullurl\n\t;;\nesac\n"
  },
  {
    "path": "scripts/freshchk.sh",
    "content": "#!/bin/sh\n\n# if the host does not have internet access\n[ -n \"$NONET\" ] && exit 0\n\n. service/common/choupi\n\nURL=$1\nDEST=$2\nFILE=${1##*://}\nFILE=${FILE%\\*} # clean wildcard from http://foo/bar* URL\nDIR=${FILE%/*}\nFETCH=$(dirname $0)/fetch.sh\n\nmkdir -p db/$DIR\n\nremotefile=$($FETCH -I $URL | \\\n\tsed -E -n 's/last-modified:[[:blank:]]*([[:print:]]+)/\\1/ip' | \\\n\tbase64 || echo 0)\nlocalfile=$(cat db/$FILE 2>/dev/null || echo 0)\n\nif [ -s \"${DEST}\" ] && [ \"$remotefile\" = \"$localfile\" ]; then\n\techo \"${CHECK} ${FILE##*/} is fresh\"\n\texit 0\nfi\n\necho \"$remotefile\" > db/$FILE\necho \"${ARROW} fetching ${FILE##*/}\"\n\nexit 1\n"
  },
  {
    "path": "scripts/sh",
    "content": "#!/bin/sh\n# smolBSD quick bootstrapper\n# Usage: curl -fsSL https://smolbsd.org/sh | sh\n\nset -eu\n\nVERS=\"11\"\nCURL=\"curl -fsSL\"\nKERNEL=smol\nSMOLBSD_BASE=\"https://smolbsd.org\"\nGH_BASE=\"https://github.com/NetBSDfr/smolBSD/releases/download/latest\"\nRAWGH=\"https://raw.githubusercontent.com/NetBSDfr/smolBSD/refs/heads/main\"\nSTART_URL=\"${RAWGH}/startnb.sh\"\nUNAME=\"scripts/uname.sh\"\nCHOUPI=\"service/common/choupi\"\n\nTMPDIR=\"$(mktemp -d -t smolbsd.XXXXXX)\"\ncleanup() { rm -rf \"$TMPDIR\"; }\ntrap cleanup EXIT INT TERM\n\ncd \"$TMPDIR\"\n\nmkdir -p ${CHOUPI%/*}\n${CURL} \"${RAWGH}/${CHOUPI}\" -o ${CHOUPI}\nCHOUPI=y . ${CHOUPI}\n\necho \"${ARROW} using temporary directory: $PWD\"\n\nmkdir -p scripts\n${CURL} \"${RAWGH}/${UNAME}\" -o ${UNAME}\nchmod +x ${UNAME}\nARCH=$(${UNAME} -m)\nMACHINE=$(${UNAME} -p)\n\nif ! command -v qemu-system-${MACHINE} >/dev/null 2>&1; then\n\techo \"${ERROR} qemu-system-${MACHINE} is needed to run smolBSD\" >&2\n\texit 1\nfi\n\nOS=$(uname -s)\necho \"${ARROW} checking virtualization capability\"\nif [ ! -e /dev/kvm ] && \\\n\t[ ! \"$OS\" = \"Darwin\" ] && \\\n\t! nvmmctl identify >/dev/null 2>&1; then\n\techo \"${WARN} hardware virtualization (KVM/HVF) not detected — performance may be limited.\" >&2\nfi\n\necho \"${ARROW} downloading kernel\"\ncase \"$ARCH\" in\n\tamd64)\n\t\tKERNEL_URL=\"$SMOLBSD_BASE/assets/netbsd-SMOL\"\n\t\t${CURL} ${KERNEL_URL} -o $KERNEL\n\t\t;;\n\tevbarm-aarch64)\n\t\tKERNEL_URL=\"https://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-${VERS}/latest/evbarm-aarch64/binary/kernel/netbsd-GENERIC64.img.gz\"\n\t\t${CURL} -o- ${KERNEL_URL} | gzip -d > $KERNEL\n\t\t;;\n\t*)\n\t\techo \"${ERROR} Unsupported architecture: $ARCH\" >&2\n\t\texit 1\n\t\t;;\nesac\n\nRESCUE_URL=\"$GH_BASE/rescue-${ARCH}.img.xz\"\n\necho \"${ARROW} downloading rescue image\"\n${CURL} \"$RESCUE_URL\" | xz -d > rescue.img\n${CURL} \"$START_URL\" -o smol.sh\nchmod +x smol.sh\n\necho \"${ARROW} launching smolBSD, Ctrl-A X to exit\"\nexec </dev/tty\nexec ./smol.sh -k $KERNEL -i rescue.img\n"
  },
  {
    "path": "scripts/uname.sh",
    "content": "#!/bin/sh\n\n[ $# -lt 1 ] && exit 1\n\narg=$1\n\n# Normalize architecture name\nunamesh() {\n\t[ -n \"$ARCH\" ] || ARCH=$(uname -m 2>/dev/null || echo unknown)\n\n\tcase $ARCH in\n\t\tx86_64|amd64)\n\t\t\tarch=\"amd64\"\n\t\t\tmachine=\"x86_64\"\n\t\t\t;;\n\t\ti386|i486|i586|i686)\n\t\t\tarch=\"i386\"\n\t\t\tmachine=\"i386\"\n\t\t\t;;\n\t\t*aarch64*|arm64|armv8*)\n\t\t\tarch=\"evbarm-aarch64\"\n\t\t\tmachine=\"aarch64\"\n\t\t\t;;\n\t\t*)\n\t\t\tarch=\"$ARCH\"\n\t\t\tmachine=\"$ARCH\"\n\t\t\t;;\n\tesac\n\n\tcase $arg in\n\t-m)\n\t\techo $arch\n\t\t;;\n\t-p)\n\t\techo $machine\n\t\t;;\n\t*)\n\t\techo \"unknown flag\"\n\t\t;;\n\tesac\n}\n\n[ \"${0##*/}\" = \"uname.sh\" ] && unamesh $arg || exit 1\n\nexit 0\n"
  },
  {
    "path": "service/base/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n. /etc/include/mount9p\n\nksh\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/base/postinst/dostuff.sh",
    "content": "#!/bin/sh\n\necho \"iMil was here\" > tmp/postinst.txt\n"
  },
  {
    "path": "service/biosboot/README.md",
    "content": "# BIOS Boot Service\n\n## About\n\nThis image is meant to build a _BIOS_ bootable image, for use with _Virtual Machine Managers (VMM)_ that does not support _PXE boot_. It can also be used to setup a bootable device like an _USB_ key.  \nOf course, speed will suffer from the typical multi-stage _x86_ boot (_BIOS, bootloader, kernel loading generic kernel_).\n\n## Usage\n\n**Build**\n\n```sh\n$ bmake SERVICE=biosboot build\n```\n\nIf you wish to boot with a serial console, set the `BIOSCONSOLE` variable to `com0`:\n```sh\n$ bmake SERVICE=biosboot BIOSCONSOLE=com0 build\n```\n\n**Run**\n\n- _QEMU_ example\n\n```sh\n$ qemu-system-x86_64 -accel kvm -m 256 -cpu host -hda images/biosboot-amd64.img\n```\n\n- _USB_ key example\n\n```sh\n$ [ \"$(uname -s)\" = \"Linux\" ] && unit=M || unit=m\n$ dd if=images/biosboot-amd64.img of=/dev/keydevice bs=1${unit}\n```\n\nAnd legacy boot on the _USB_ device.\n\n"
  },
  {
    "path": "service/biosboot/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n. /etc/include/mount9p\n\nksh\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/biosboot/options.mk",
    "content": "BIOSBOOT=y\nBIOSCONSOLE=pc\n"
  },
  {
    "path": "service/bozohttpd/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n\n/usr/libexec/bozohttpd -f /var/www\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/bozohttpd/postinst/mkhtml.sh",
    "content": "wwwroot=var/www\n\nmkdir -p $wwwroot\n\necho \"<html><body>up!</body></html>\" >${wwwroot}/index.html\n\n"
  },
  {
    "path": "service/bsdshell/sailor.conf",
    "content": ". /service/common/sailor.vars\n\nshipname=usershell\nshipbins=\"$shipbins /usr/bin/chsh /bin/ksh /usr/bin/ssh /usr/bin/ssh-keygen /usr/bin/less /usr/bin/vi /usr/bin/ktruss /usr/bin/resize /usr/bin/reset\"\n"
  },
  {
    "path": "service/build/etc/rc",
    "content": ". /etc/include/vars\n. /etc/include/choupi\n. /etc/include/basicrc\n. /etc/include/mount9p\n\n# needed to fetch HTTPS\nmount -t tmpfs -o -s1M tmpfs /etc/openssl\nmount -t tmpfs -o -s32M tmpfs /tmp\ncp /usr/share/examples/certctl/certs.conf /etc/openssl/\ncertctl rehash\n\ncd $BASEPATH\n. tmp/build*\n\nexport ADDPKGS\n\n# some packages *cough* node *cough* need more files\nsysctl -w kern.maxfiles=20000\n\n# MIMINIZE this image using sailor\nif [ -n \"$MINIMIZE\" ] && [ -f service/${SERVICE}/sailor.conf ]; then\n\tif [ ! -d sailor ]; then\n\t\techo \"${WARN} maximum minimization asked but sailor not available\"\n\t\techo \"${WARN} git clone https://github.com/NetBSDfr/sailor first!\"\n\telse\n\t\techo \"${ARROW} preparing env for sailor\"\n\t\tmount -t tmpfs -o -s100M tmpfs /var/db\n\t\tmount -t tmpfs -o -s20M tmpfs /var/run\n\t\t# backup raw packages for later build\n\t\ttar cfp /tmp/usrpkg.tgz /usr/pkg\n\t\tmount -t tmpfs -o -s300M tmpfs /usr/pkg\n\tfi\nfi\n\necho \"${ARROW} building $SERVICE image\"\necho \"${INFO} exported variables\"\ncat tmp/build*|sed \"s/^/${WHITEBULLET} /\"\nmake $(grep -v ADDPKGS tmp/build*|xargs) base\necho \"${CHECK} build finished, Ctrl-A X to exit\"\nrm -f tmp/build*\ncat\n"
  },
  {
    "path": "service/build/etc/resolv.conf",
    "content": "nameserver 10.0.2.3\n"
  },
  {
    "path": "service/build/options.mk",
    "content": "MOUNTRO=y\nADDPKGS=pkgin pkg_tarup pkg_install sqlite3\n"
  },
  {
    "path": "service/build/postinst/prepare.sh",
    "content": "#!/bin/sh\n\nmkdir -p usr/pkg/etc/pkgin\necho \"https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/${ARCH#evbarm-}/${PKGVERS}/All\" > \\\n\tusr/pkg/etc/pkgin/repositories.conf\n\ntouch BUILDIMG\nmkdir ${DRIVE2#/}\n# mkimg searches for ../service\nln -sf /mnt/service .\n"
  },
  {
    "path": "service/clawd/LOCAL.md",
    "content": "<div align=\"center\" markdown=\"1\">\n\n**Running smolClaw with a local inference server**\n\n<img src=\"images/smolTelegram.png\">\n\n</div>\n\nAs of 2026-03 I use [this model](https://huggingface.co/Jackrong/Qwen3.5-9B-Claude-4.6-Opus-Reasoning-Distilled-GGUF) with an RTX 5080 (16GB).\n\nRefer to [this recipe][1] to fix the local model for tooling. I start [llama.cpp with CUDA][2] like this:\n```sh\n./llama-server -hf Jackrong/Qwen3.5-9B-Claude-4.6-Opus-Reasoning-Distilled-GGUF:Q4_K_M -ngl 99 -c 262144 -np 1 -fa on --cache-type-k q4_0 --cache-type-v q4_0 --chat-templat\ne-file qwen3.5_chat_template.jinja --port 8001 --host 0.0.0.0\n```\n\nExample [picoclaw][3] `config.json`, modify:\n\n* `YOUR_TELEGRAM_TOKEN`, on Telegram, create a `/newbot` speaking to `@BotFather`\n* Ollama's IP address\n\n```json\n{\n  \"agents\": {\n    \"defaults\": {\n      \"workspace\": \"~/.picoclaw/workspace\",\n      \"restrict_to_workspace\": false,\n      \"model\": \"qwen3.5\",\n      \"max_tokens\": 8192,\n      \"temperature\": 0.7,\n      \"max_tool_iterations\": 20\n    }\n  },\n  \"model_list\": [\n    {\n      \"model_name\": \"qwen3.5\",\n      \"model\": \"ollama/Jackrong/Qwen3.5-9B-Claude-4.6-Opus-Reasoning-Distilled-GGUF:Q8_0\",\n      \"api_base\": \"http://192.168.1.1:8001/v1\",\n      \"api_key\": \"-\"\n    }\n  ],\n  \"channels\": {\n    \"telegram\": {\n      \"enabled\": true,\n      \"token\": \"YOUR_BOT_TOKEN\",\n      \"allow_from\": [\"YOUR_USER_ID\"]\n    }\n  },\n  \"gateway\": {\n    \"host\": \"0.0.0.0\",\n    \"port\": 18790\n  },\n  \"tools\": {\n    \"web\": {\n      \"brave\": {\n        \"enabled\": false,\n        \"api_key\": \"\",\n        \"max_results\": 5\n      },\n      \"duckduckgo\": {\n        \"enabled\": true,\n        \"max_results\": 5\n      }\n    }\n  },\n  \"devices\": {\n    \"enabled\": false,\n    \"monitor_usb\": false\n  },\n  \"heartbeat\": {\n    \"enabled\": true,\n    \"interval\": 30\n  }\n}\n```\n\nRefs:\n\n* https://x.com/sudoingX/status/2028496331992707373\n* https://x.com/sudoingX/status/2030253886649569299\n\n[1]: https://gist.github.com/sudoingX/c2facf7d8f7608c65c1024ef3b22d431\n[2]: https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md#cuda\n[3]: https://github.com/sipeed/picoclaw\n"
  },
  {
    "path": "service/clawd/README.md",
    "content": "<div align=\"center\" markdown=\"1\">\n\n<img src=\"images/smolClaw.png\" width=500px>\n\n# smolClaw\n\n<img src=\"images/smolcap.png\" width=500px>\n\n[picoclaw][1] running on a microVM!\n\n</div>\n\n**smolClaw** is a [smolBSD][2] microVM appliance that runs\n[picoclaw][1] on Linux or macOS.\n\nRunning picoclaw inside a microVM provides:\n\n* Minimal footprint\n* Strong isolation of memory and filesystem\n* Fast startup (under one second)\n\nAs per the [smolBSD][2] design, the VM boots directly into a `tmux`\nconsole with default bindings running `bash`.\n\n# Quickstart\n\n* Fetch [smolBSD][2] and install dependencies\n\n```sh\ngit clone https://github.com/NetBSDfr/smolBSD\n```\nDebian, Ubuntu and the like\n```sh\nsudo apt install curl git bmake qemu-system-x86_64 binutils uuid-runtime libarchive-tools gdisk socat jq lsof picocom\n```\nmacOS\n```sh\nbrew install curl git bmake qemu binutils libarchive socat jq lsof picocom\n```\n\n* Go to the `smolBSD` directory and\n```sh\ncd smolBSD\n```\n  * Pull the ghcr.io _smolClaw_ image (`amd64` and `evbarm-aarch64` images available)\n```sh\n./smoler.sh pull clawd-amd64:latest\n```\n  * OR build it yourself\n```sh\n./smoler.sh build -y dockerfiles/Dockerfile.clawd\n```\n\n* Run the microVM\n\n```sh\n./smoler.sh run clawd-amd64:latest -c 2 -m 1024\n```\n\nOptions:\n\n- `-c` → CPU cores\n- `-m` → RAM in MB\n\nTo share a host directory:\n\n```sh\n./smoler.sh run clawd-amd64:latest -c 2 -m 1024 -w /path/to/directory\n```\n\nInside the VM it will be mounted at:\n\n```\n/mnt\n```\n\n* Once the microVM has started, begin onboarding\n\n```sh\n[~]@😈+🦞> picoclaw onboard\n```\n\n* When the configuration is finished, start the gateway\n\n```sh\n[~]@😈+🦞> picoclaw gateway\n```\n\n[picoclaw][1] Quickstart is available [here](https://github.com/sipeed/picoclaw/?tab=readme-ov-file#-quick-start)\n\n## SSH access\n\n* You can build _smolClaw_ with your _SSH_ public key just by copying it to `share/ssh.pub`\n* You can also do it once the microvm is started but you'll have to re-do it at every build:\n```sh\n[~]@😈+🦞> mkdir -p ~/.ssh && cat >~/.ssh/authorized_keys\n```\nJust paste your public key and press Ctrl+D, then\n```sh\n[~]@😈+🦞> chmod 600 ~/.ssh/authorized_keys\n```\n\nIn both cases, you'll be able to _SSH_ to your _smolClaw_ instance like this:\n\n```sh\n$ ssh -p 2289 clawd@localhost\n```\n\n---\n\n### Troubleshooting \"Could not access KVM kernel module: No such file or directory\"\nThe error says KVM (hardware virtualization) isn't available. This usually means either:\n\n1. KVM module isn't loaded:\n```sh\nsudo modprobe kvm kvm_intel   # for Intel CPUs\n# or\nsudo modprobe kvm kvm_amd     # for AMD CPUs\n```\nThen check it's there:\n```sh\nls /dev/kvm\n```\n\n2. Virtualization is disabled in your BIOS/UEFI\nIf modprobe fails, reboot into BIOS and enable \"Intel VT-x\" or \"AMD-V\" (sometimes called \"SVM Mode\"). It's usually under CPU settings or Advanced.\n\nYou can check if your CPU supports it at all with:\n```sh\ngrep -Ec '(vmx|svm)' /proc/cpuinfo\n```\nIf that returns 0, either it's disabled in BIOS or your CPU doesn't support it.\n\n3. Are you inside a VM already?\nIf you're running Ubuntu inside a VM (like VirtualBox or VMware), you need to enable nested virtualization in the hypervisor's settings. For VirtualBox that's \"Enable Nested VT-x/AMD-V\" in the VM's system settings.\n\n\n[1]: https://github.com/sipeed/picoclaw\n[2]: https://smolBSD.org\n"
  },
  {
    "path": "service/clawd/SCHIZOCLAW.md",
    "content": "# Schizo setup\n\nWhile it's on [the roadmap][1], [picoclaw][2] still don't have multi-agents support.\nAlso, I intend to use it [locally][3] with a single _GPU_, but have various topics\nwhere a personal assistant could be useful.  \nSo I thought out of the box and remembered the movie [Split][4].  \nThat's right, I made my [smolClaw][5] instance **schizophrenic**.\n\n## The main driver: SOUL.md\n\n```markdown\n## Schizophrenia\n\nYou are schizophrenic, and depending on the subject you're asked for, you'll endorse one of\nthe following personalities:\n\n### Personality: Jimmy\n\nYou are a talented, experienced fronotend developer, very picky in his programming style, precise\nwith deep knowledge of the best practices and coding style. You are fluent with HTML and JavaScript,\nVueJS, nodejs, jQuery and all things web.\n\n### Personality: Ken\n\nWhen asked about UNIX knowledge and system administration, you are the embodiement of an old\nUNIX guru, know-it-all and arrogant.\nYour vast knowledge of the subject allows you to deep dive on all UNIX related topics.\n\n### Personality: R2\n\nWhen ask about a tooling task, you embody the R2D2 robot personality. You don't use human phrases but\nyou display the results of commands, scripts, scripts, instructions, network  operations you execute.\nYou litteraly are a deterministic, fault-free robot that focuses on its task with extreme precision.\n\n### Personality: Doc\n\nWhen asked about medical topics, you endorse a paternalist doctor behavior.\nYou don't play by the rules, you are up-to-date with all recent longevity research, have a deep\nknowledge of themes like autophagy, supplements, keto diet etc...\nYou also have a deep knowledge of the nootropic topic, their effects, nature.\n\n```\n\n## Refinements: IDENTITY.md and AGENT.md\n\n### IDENTITY.md\n\n```markdown\n## Schizophrenic personalities\n\n- Adapt your discourse to the personality you're summoned with\n\nThese are personalities specifics:\n\n* Ken\n  - As the old UNIX guru, you have access to all commands in the system\n  - You never do mistakes\n  - When a man page about a topic exists in /usr/share/man, first read it and use it as reference\n  - When reviewing C code, always refer to /usr/share/misc/style\n\n* Doc\n  - When you don't have the exact answer, you search on https://pubmed.ncbi.nlm.nih.gov/\n\n* R2\n  - You can't write to the filesystem\n```\n\n### AGENT.md\n\n```markdown\n## Personnalities\n\n- According to either the name you are called with or the topic the user is referring to, you will change your personality as specified in the SOUL.md file.\n- You will never change personality by yourself, only when requested either by the name the user callls you with ot the topic he's referring to.\n- When your persinality is a programmer and asked to create a program, write the program in `/home/clawd/.picoclaw/workspace/code/<programming language>/<program name>`, example: `/home/clawd/.picoclaw/workspace/code/golang/myprogram/myprogram.go`\n```\n\n# Setting up a micro web server for smolClaw\n\nWith this team at our disposal, let's setup a simple website publishing workflow,\nbut contain it in dedicated microVMs so it doesn't wipe our beloved websites by mistake.\n\n## smolClaw SSH configuration\n\nOn _smolClaw_, create an `ssh` public key with empty passphrase (just hit enter),\nand copy the content of `~/.ssh/id_ed25519.pub` to your clipboard.\n\nCreate the following `ssh` client configuration:\n`~/.ssh/config`\n```txt\nhost smolweb\nhostname 192.168.1.20 # change this to your host IP\nuser smol\nport 2121\n```\n\n## smolweb microvm\n\nNow create the `smolweb` microvm that will host the website\n\n`dockerfiles/Dockerfile.smolweb`\n```Dockerfile\nFROM base,etc\n\nLABEL smolbsd.service=smolweb\nLABEL smolbsd.publish=\"8880:8880\"\n\nARG PUBKEY=\"/mnt/share/ssh.pub\"\n\nRUN pkgin up && pkgin -y in caddy\n\nRUN <<EOF\nuseradd -m smol\ncd /home/smol\nmkdir -p .ssh www\nEOF\n\nCOPY $PUBKEY /home/smol/.ssh/authorized_keys\n\nRUN <<EOF\nchmod 600 /home/smol/.ssh/authorized_keys\nchown -R smol /home/smol\nEOF\n\nEXPOSE 8880\n\nCMD /etc/rc.d/sshd onestart && \\\n    caddy file-server --listen :8880 --root /home/smol/www\n```\n\nIn _smolBSD_'s directory, create a `share` directory and paste the previously copied _SSH_ public key in `share/ssh.pub`.\n\n>[!Note]\n> _smolBSD_ directory is mounted as `/mnt` in the builder machine\n\n\nBuild the `smolweb` microVM:\n\n```sh\n$ ./smoler.sh build dockerfiles/Dockerfile.smolweb\n```\nAnd start your micro web server, forwarding ports `8880` (`caddy`) and `2121` (mapped to `22`/`ssh`):\n```sh\n$ ./startnb.sh -i images/smolweb-amd64.img -p ::8880-:8880,::2121-:22\n```\n\n## Instruct your web dev agent how to upload files\n\n```\n> Ken, remember to use the following command when I ask you to publish to `smolweb`:\ntar -cf - -C /home/clawd/.picoclaw/workspace/www shell.html | ssh smolweb 'tar -xf - -C ~/www'\n```\n\n\n[1]: https://github.com/sipeed/picoclaw/issues/294\n[2]: https://github.com/sipeed/picoclaw\n[3]: https://github.com/NetBSDfr/smolBSD/blob/main/service/clawd/LOCAL.md\n[4]: https://www.imdb.com/title/tt4972582/\n[5]: https://github.com/NetBSDfr/smolBSD/blob/main/service/clawd/README.md\n"
  },
  {
    "path": "service/common/basicrc",
    "content": "\nexport HOME=/\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\numask 022\n\nif [ \"$(sysctl -n kern.root_device)\" = \"md0\" ]; then\n\tmount -u -o rw /dev/md0a /\n\tsed -i'' 's,^[^ ]*,/dev/md0a,' /etc/fstab\nfi\n\nmount -a\n\n# custom local preload\n[ -f /etc/rc.pre ] && . /etc/rc.pre\n\n# load QEMU fw_cfg variables is any\ndmesg | grep -q qemufwcfg && \\\n\t. /etc/include/qemufwcfg || \\\n\techo \"no qemufwcfg support\"\n\n[ ! -f \"/dev/MAKEDEV\" ] && cp -f /etc/MAKEDEV* /dev\n\n# bits needed for a really usable tty\nmount -t ptyfs ptyfs /dev/pts\ncd /dev && ./MAKEDEV fd && cd -\n/etc/rc.d/ttys start\nchmod 666 /dev/null\n\n# create an additional viocon(4) port if support available\ndmesg | grep -q viocon && \\\n\t(cd /dev && ./MAKEDEV ttyVI01 ttyVI02 && chmod 666 /dev/ttyVI*) || \\\n\techo \"no viocon(4) support\"\n\n# set IP address manually, faster than dhcp\nif ifconfig vioif0 >/dev/null 2>&1; then\n\troute flush -inet6 >/dev/null 2>&1\n\t# default qemu addresses and routing\n\tifconfig vioif0 10.0.2.15/24\n\troute add default 10.0.2.2\n\tmount | grep read-only || \\\n\t\techo \"nameserver 10.0.2.3\" > /etc/resolv.conf\nfi\n\nifconfig lo0 127.0.0.1 up\n\n# sane network defaults\n# https://wiki.netbsd.org/tutorials/tuning_netbsd_for_performance/\nsysctl -w net.inet.tcp.sendbuf_max=16777216\nsysctl -w net.inet.tcp.recvbuf_max=16777216\nsysctl -w kern.sbmax=16777216\n\n\n[ -n \"$MOUNTRO\" ] && mount -u -o ro /\n\n# custom local post load\n[ -f /etc/rc.local ] && . /etc/rc.local\n"
  },
  {
    "path": "service/common/choupi",
    "content": "case $CHOUPI in\n*)\n\tSTAR=\"⭐\"\n\tARROW=\"➡️\"\n\tCHECK=\"✅\"\n\tWARN=\"⚠️\"\n\tINFO=\"ℹ️\"\n\tWHITEBULLET=\"⚪\"\n\tERROR=\"❌\"\n\tCPU=\"🔲\"\n\tFREEZE=\"🧊\"\n\tOUT=\"/dev/null\"\n\tROCKET=\"🚀\"\n\tSOCKET=\"🔌\"\n\tEXIT=\"🔚\"\n\t;;\n[nN])\n\tSTAR=\"*\"\n\tARROW=\">\"\n\tCHECK='\\'\n\tWARN='!'\n\tINFO='i'\n\tWHITEBULLET=\"o\"\n\tERROR=\"X\"\n\tCPU=\"[]\"\n\tFREEZE=\"=\"\n\tOUT=\"/dev/stdout\"\n\tROCKET=\"&>\"\n\tSOCKET=\"-<\"\n\tEXIT=\"->]\"\n\t;;\nesac\n\nLIGHTGREEN=\"\\033[92m\"\nBOLD=\"\\033[1m\"\nNORMAL=\"\\033[0m\"\n"
  },
  {
    "path": "service/common/funcs",
    "content": "# helper functions\n\nrsynclite()\n{\n\tsrc=$1\n\tdst=$2\n\twhile case \"$src\" in --exclude=*) true;; *) false;; esac; do\n\t\texclude=\"${src#*=}\"\n\t\tsrc=\"${exclude#* }\"\n\t\texclude=\"${exclude%% *}\"\n\t\ttoexclude=\"${toexclude} --exclude=${exclude}\"\n\tdone\n\tif [ -f \"$src\" ]; then\n\t\t# ensure dest directory exists\n\t\t[ \"${dst%/*}\" != \"$dst\" ] && mkdir -p \"${dst%/*}\"\n\t\tcp -f \"$src\" \"$dst\"\n\t\treturn\n\tfi\n\t[ ! -d \"$src\" ] && return\n\t[ ! -d \"$dst\" ] && mkdir -p \"$dst\"\n\t(cd \"$src\" && tar cfp - ${toexclude} .)|(cd \"$dst\" && tar xfp -)\n}\n"
  },
  {
    "path": "service/common/mount9p",
    "content": "if dmesg |grep -q vio9; then\n\t[ -z \"$MOUNT9P\" ] && MOUNT9P=/mnt\n\t[ -f /etc/MAKEDEV ] && cp /etc/MAKEDEV /dev\n\tcd /dev && sh MAKEDEV vio9p0\n\tcd -\n        mount_9p -Ccu /dev/vio9p0 $MOUNT9P\n        echo \"➡️ host filesystem mounted on $MOUNT9P\"\nfi\n"
  },
  {
    "path": "service/common/pkgin",
    "content": ". /etc/include/choupi\n\n# install necessary packages\nif [ ! -d /var/db/pkgin ]; then\n\tcase $CHOUPI in\n\t[yY]*)\n\t\tprintf \"\\n✨ preparing initial environment...\\n\"\n\t\t;;\n\t*)\n\t\tv=\"-v\"\n\t\t;;\n\tesac\n\tprintf \"\\n${STAR} installing needed packages\\n\"\n\n\t[ -f /etc/pkgvers ] && . /etc/pkgvers\n\tif [ -n \"$PKGVERS\" ]; then\n\t\tver=$PKGVERS\n\telse\n\t\tver=$(uname -r)\n\t\tcase $ver in\n\t\t*99*) # current\n\t\t\tver=${ver%.99*}.0\n\t\t\t;;\n\t\t*_*) # tag\n\t\t\tver=${ver%_*}\n\t\t\t;;\n\t\tesac\n\tfi\n\n\t# repository path differs for amd64 or aarch64/evbarm\n\tmachine=$(uname -m)\n\tproc=$(uname -p)\n\t[ \"$machine\" = \"amd64\" ] && arch=$machine || arch=$proc\n\turl=\"netbsd.org/pub/pkgsrc/packages/NetBSD/${arch}/${ver}/All\"\n\n\tcertctl rehash\n\n\tscheme=\"https\"\n\tif [ -n \"$https_proxy\" -o -n \"$https_proxy\" ]; then\n\t\tprintf \"${ARROW} using proxy: $http_proxy\\n\"\n\t\t# libfetch doesn't support HTTPS proxying\n\t\tscheme=\"http\"\n\tfi\n\n\turl=\"${scheme}://cdn.${url}\"\n\techo \"${ARROW} fetch URL: ${url}\"\n\n\tfor pkg in pkg_install pkgin pkg_tarup rsync curl # ca-certificates\n\tdo\n\t\tprintf \"${ARROW} installing $pkg\\n\"\n\t\tpkg_info $pkg >/dev/null 2>&1 || \\\n\t\t\tpkg_add ${v} ${url}/${pkg}*\n\tdone\n\n\t[ -d /packages ] && \\\n\t\tfor pkg in /packages/*\n\t\tdo\n\t\t\tpkg_add ${v} $pkg\n\t\tdone\n\n\tmkdir -p /usr/pkg/etc/pkgin\n\techo $url >/usr/pkg/etc/pkgin/repositories.conf\n\tpkgin up\n\n\t# additional packages to install\n\tfor p in $INSTALL_PACKAGES\n\tdo\n\t\tpkgin -y install $p\n\tdone\nfi\n\n"
  },
  {
    "path": "service/common/qemufwcfg",
    "content": "QEMUFWCFG=/var/qemufwcfg\n\n/sbin/mount_qemufwcfg $QEMUFWCFG\n\nfor file in ${QEMUFWCFG}/opt/org.smolbsd.var.*\ndo\n\t[ ! -f $file ] && continue\n\tVARNAME=${file##*.}\n\teval \"export $VARNAME=\\$(cat \\$file)\"\ndone\n"
  },
  {
    "path": "service/common/sailor.vars",
    "content": "# smolBSD build drive\nshippath=\"/drive2\"\n# default shipped binaries\nshipbins=\"/bin/sh /sbin/init /usr/bin/printf /sbin/mount /sbin/mount_ffs /sbin/mount_tmpfs /sbin/mount_ptyfs /bin/ls /sbin/mknod /sbin/ifconfig /usr/bin/nc /usr/bin/tail /sbin/poweroff /sbin/umount /sbin/fsck /sbin/fsck_ffs /usr/bin/netstat /sbin/dhcpcd /sbin/route /usr/sbin/certctl /usr/bin/vis /bin/expr /usr/bin/unvis /bin/mkdir /usr/bin/mktemp /usr/bin/awk /usr/bin/sort /bin/rm /usr/bin/openssl /bin/mv /bin/test /bin/ln /bin/rmdir /bin/pax /usr/bin/find /bin/hostname /usr/sbin/useradd /usr/bin/su /bin/df /usr/bin/du /usr/bin/wc /usr/bin/sed /usr/bin/uniq /usr/bin/xargs /usr/bin/cut /usr/bin/tr /sbin/dmesg /sbin/mount_qemufwcfg /bin/sync /bin/tar /sbin/halt /sbin/sysctl /usr/bin/grep /usr/bin/stat /sbin/ttyflags /usr/bin/login /usr/lib/security/*\"\nsync_dirs=\"/etc /usr/share/certs /usr/share/examples/certctl/certs.conf ${prefix}/etc/pkgin /usr/share/misc/terminfo* /usr/share/zoneinfo /var/log\"\npackages=\"curl rsync\"\n"
  },
  {
    "path": "service/common/shutdown",
    "content": "sync; sync\ndmesg | grep -q 'viocon0: adding port' && \\\n\t(\n\t\tmount -u -o ro /\n\t\tsync; sync\n\t\techo 'JEMATA!' > /dev/ttyVI01\n\t) || \\\numount -af\n# no viocon(4) support\nhalt -lq\n"
  },
  {
    "path": "service/common/vars",
    "content": "BASEPATH=/mnt\nDRIVE2=/drive2\nCHOUPI=y\n\nexport BASEPATH DRIVE2 CHOUPI\n"
  },
  {
    "path": "service/crush/README.md",
    "content": "# 💥 Crush service\n\n## 📖 About\n\nThis microservice runs [crush](https://github.com/charmbracelet/crush), an AI-powered terminal assistant built by Charmbracelet. It provides a fully configured NetBSD microvm with crush pre-installed and ready to use.\n\nThe service mounts your project directory at `/mnt` inside the microvm, allowing you to work on any project with crush's AI capabilities in a lightweight, fast-booting environment.\n\n## 🎒 Prerequisites\n\n- A `crush.json` configuration file (see [crush docs](https://github.com/charmbracelet/crush))\n- At least 512MB of memory recommended\n\n## 🚀 Usage\n\n### 🔨 Build the image\n\n```sh\n$ ./smoler.sh build -y dockerfiles/Dockerfile.crush\n```\n\nOr pull the pre-built image:\n\n```sh\n$ ./smoler.sh pull crush-amd64:latest\n```\n\n### ▶️ Run with a project directory\n\n```sh\n$ ./smoler.sh run crush-amd64:latest -m 1024 -w /path/to/project\n```\n\nThe `-w` flag mounts `/path/to/project` at `/mnt` inside the microvm. The `-m 1024` allocates 1GB of memory.\n\n### ⚡ Run with an inline crush config\n\n```sh\n$ ./smoler.sh run crush-amd64:latest -E crush=/path/to/crush.json\n```\n\nThis passes a `crush.json` file directly into the microvm at `/var/qemufwcfg/opt/org.smolbsd.file.crush`.\n\n### 🔧 Run with a custom config file\n\nCopy your `crush.json` into the working directory before running:\n\n```sh\n$ cp crush.json /path/to/project/\n$ ./smoler.sh run crush-amd64:latest -m 1024 -w /path/to/project\n```\n\n### 💻 Interactive shell (no crush)\n\nIf no `crush.json` is found, the microvm drops to a `ksh` prompt. You can also start it directly:\n\n```sh\n$ ./startnb.sh -f etc/crush.conf\n```\n\n## 🛑 Exiting\n\nWhen shutting down the microvm, use **Ctrl-A Ctrl-X** to exit.\n\n## ⚙️ Configuration\n\nThe service runs as user `crush` with the following environment:\n\n- Working directory: `/home/crush`\n- Shell profile launches crush automatically on login\n- Tmux is configured (status bar disabled)\n- File descriptor limit set to 4096\n"
  },
  {
    "path": "service/games/README.md",
    "content": "# games service \n\nVery useless service for [smolBSD](https://github.com/NetBSDfr/smolBSD) allowing to play text-based games.\n\n*⚠ Be careful: don't use it at work except if your boss is a good guy and agree you play during job time. ;-)*\n\nDo you want to spawn microvm in a sec to play ~~AAA~~ text-based games on *NetBSD* 🚩? It's now possible with this very amazing service! (I save your day, I know). It's a pack of 15 games with a lot of ~~3D-high-res-4k-textured polygones~~ text characters.\n\nLaunch it and enjoy these ~~latest top of the art from video game industry~~ old text-based games!\n\n\n## Usage\nBuilding on GNU/Linux or MacOS\n```sh\n$ bmake SERVICE=games build\n```\nBuilding on NetBSD\n```sh\n$ make SERVICE=games base\n```\nEdit `etc/games.conf` file as needed (example values in this files are a joke 🤡, leave it commented. Default smolBSD values will be used.), then, start the service:\n```sh\n./startnb.sh -f etc/games.conf\n```\n\n![First screen](first_screen.png)\n\nEnter your name for high scores records and `Enter`.\n\n![Main menu](main_menu.png)\n\nChoose your game with `up` and `down` arrows and press `Enter`. Many games quit with `q` and others with `Ctrl+c`.\n\nPress `q` to quit this application and `Ctrl+a x` to quit and close the microvm.\n\n\n## Note\n\nThis service install the `nbsdgames` package from NetBSD repo. The first launch is very slow due to this installation but the next will be very fast like smolBSD can do!\n\nGames can run faster editing `etc/games.conf` file to put more cores et more memory.\n(It's a joke 🤡)\n\nMade with ❤.\n"
  },
  {
    "path": "service/games/etc/rc",
    "content": "#!/bin/sh\n\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\n. /etc/include/choupi\n\nif [ ! -f /usr/pkg/bin/nbsdgames ]; then \n\techo -e \"${ARROW} nbsdgames prerequisites installation ...\"\n\t. /etc/include/basicrc > /dev/null 2>&1\n\t. /etc/include/pkgin > /dev/null 2>&1\n\tpkgin -y install nbsdgames > /dev/null 2>&1\nfi\n\nexport TERM=xterm-256color\nclear\necho -e \"\\n\\n${ROCKET} nbsdgames launching !\\n\\n\"\nsleep 1\nnbsdgames\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/lhv-tools/README.md",
    "content": "<div align=\"center\" markdown=\"1\">\n<img src=\"logo.svg\" height=\"150px\">\n</div>\n\n# lhv-tools\n\n## Introduction\n\n\"lhv\" stands for \"Le Holandais Volant\" aka [Timo VAN NEERDEN](https://lehollandaisvolant.net/tout/apropos.php) an IT guy.\n\nHere is a free translation from his site:\n\n>These online tools are intended to be useful and are for free use. They are without advertising and without trackers. No information entered in pages is recorded by the site; most scripts that do not transmit information to the site and work autonomously in your browser. Most of the tools are made by myself. Otherwise, the author or scripts used are mentioned on their page.`\n\n\nYou can find tools to:\n- create QR-codes,\n- convert dates into several formats,\n- convert temperatures units,\n- generate passwords,\n- calculate checksums,\n- play 2048, Tetris, mahjong, etc...,\n- learn kanas,\n- see spectrum of an audio file,\n- find the RSS link of a youtube channel,\n- edit images,\n- etc... in your browser.\n\nMore than 150 tools for multiple activities. \n\nGo to the [tools's page](https://lehollandaisvolant.net/tout/tools/) to get more information.\n\nThis smolBSD service downloads and installs these tools during postinstall stage with bozohttp and php.\n\n## Prerequisites\n\nMany tools from Le Hollandais Volant work with php. Essential/minimal packages to run them correctly are listed in the `options.mk` file. smolBSD downloads packages from [http://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/x86_64/11.0/All/](http://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/x86_64/11.0/All/). Check this page to know the version-named package of php you need. There is no meta-package to installing the latest version like `pkgin install php`.\n\nFor now, it's `php84`, `php84-curl`, etc...\n\nAlso, feel free to edit `etc/lhv-tools.conf` file as needed.\n\n## Usage\n\nBuilding on GNU/Linux or MacOS\n```sh\n$ bmake SERVICE=lhv-tools BUILDMEM=2048 build\n```\nBuilding on NetBSD\n```sh\n$ make SERVICE=lhv-tools BUILDMEM=2048 base\n```\nUse `BUILDMEM=2048` at least, otherwise, the `tar` command could hang during postinstall.\n\nStart the service:\n```sh\n./startnb.sh -f etc/lhv-tools.conf\n```\n\nFinally, go to [http://localhost:8180](http://localhost:8180) and enjoy:\n\n![homepage](capture.png)\n*The number of tools differes between this outdated screenshot and reality. It came from the archive and just stand for illustration.*\n\nPress `Ctrl+a x` to quit and close the microvm.\n\nService made with ❤.\n"
  },
  {
    "path": "service/lhv-tools/etc/rc",
    "content": "#!/bin/sh\n\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\n. /etc/include/choupi\n. /etc/include/basicrc > /dev/null 2>&1\n\necho \"${ROCKET} bozohttpd launch ...\"\n/usr/libexec/bozohttpd -f -x index.php -C .php /usr/pkg/libexec/cgi-bin/php84  /var/www/\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/lhv-tools/options.mk",
    "content": "IMGSIZE=650\nADDPKGS=p7zip curl libidn2 libunistring readline pcre2 libxml2 nghttp2 libidn php84 php84-mbstring php84-curl\n"
  },
  {
    "path": "service/lhv-tools/postinst/postinstall.sh",
    "content": "#!/bin/sh\n\n. /etc/include/choupi\nwwwroot=\"var/www\"\ntoolsdir=\"../tmp/lhv-tools\"\n\n# To avoid \"warning: TERM is not set\" message and be able to vi files if needed.\necho 'export TERM=\"vt100\"' > etc/profile\n\necho \"${ARROW} php settings ...\"\nmkdir -p usr/pkg/etc/php/8.4/\ncp usr/pkg/share/examples/php/8.4/php.ini-production usr/pkg/etc/php/8.4/php.ini\nsed -i'' 's/;extension=curl/extension=curl/g' usr/pkg/etc/php/8.4/php.ini\n\n# Some .php files are not interpeted by bozohttpd when they are called with\n# 'foldername/' URL. The content of the file is sent as is to the browser.\n# The .bzremap file acts as rewriting rules to force the call of the\n# 'foldername/index.php' file presents into each problematic tool's folder.\necho \"${ARROW} bozo settings for some .php files\"\ncat >${wwwroot}/.bzremap<<EOF\n/browser/:/browser/index.php\n/htmlol/:/htmlol/index.php\nEOF\n\necho \"${INFO} \\\"LHV tools\\\" prerequisites installation ...\"\nif [ -d ${toolsdir} ]; then rm -fr ${toolsdir}; fi\nmkdir ${toolsdir}\n\nlink=\"https://lehollandaisvolant.net/tout/tools/tools.tar.7z\"\n${FETCH} -o ${toolsdir}/$(basename ${link}) ${link} \nif [ $? -ne 0 ]; then\n\techo -e \"${ERROR} \\\"LHV tools\\\" download failed.\\nExit.\"\n\t. etc/include/shutdown\nfi\n\n# We can't use pipe like \"curl -o- http://... | 7.z x ...\" with 7z files. This file\n# format can not be streamed, even with \"-si\" option. Have to use multiple steps.\n# See https://7-zip.opensource.jp/chm/cmdline/switches/stdin.htm.\n# \n# The archive will no longer be useful after unzipping and unarchiving, so,\n# to avoid space disc consumption, download and decompression are made in the\n# tmp/ directory of smolBSD, on the host file system.\n\necho -n \"${ARROW} un-7zipping |\"\n# Unlike the \"tar\" command, \"7z\" is not necessarily installed everywhere. So it's\n# installed on the microvm with \"ADDPKGS\" in options.mk and used here.\nusr/pkg/bin/7z e -o${toolsdir} ${toolsdir}/$(basename ${link}) 2>&1 | awk '{printf \"*\"; fflush()}'\nif [ $? -eq 0 ]; then\n\techo \"| done\"\nelse\n\techo -e \"| ${ERROR} failed.\\nExit\"\n\t. etc/include/shutdown\nfi\n\necho -n \"${ARROW} un-taring |\"\ntar -xvf ${toolsdir}/$(basename ${link%.7z}) -C ${wwwroot} 2>&1 | awk '{printf \"*\"; fflush()}'\nif [ $? -eq 0 ]; then\n\techo \"| done\"\nelse\n\techo -e \"| ${ERROR} failed.\\nExit\"\n\t. etc/include/shutdown\nfi\n\necho \"${ARROW} fix favicon\"\n# -k because no certificates stuff used by curl is installed.\n${FETCH} -o ${wwwroot}/favicon.ico https://lehollandaisvolant.net/index/icons/favicon-32x32.png -k\n\necho \"${ARROW} fix logo\"\nsed -i'' 's,/index/logo-no-border.png,0common/lhv-384x384.png,g' ${wwwroot}/index.php\nsed -i'' 's,/index/logo-no-border.png,../0common/lhv-384x384.png,g' ${wwwroot}/*/index.php ${wwwroot}/cgu.php\n\necho \"${ARROW} fix archive link\"\nsed -i'' 's,href=\"tools.tar.7z,href=\"https://lehollandaisvolant.net/tout/tools/tools.tar.7z,g' ${wwwroot}/cgu.php ${wwwroot}/index.php\n\necho \"${ARROW} fix footer\"\nsed -i'' 's,</section>,</section>\\n<footer id=\"footer\"><a href=\"//lehollandaisvolant.net\">by <em>Timo Van Neerden</em></a></footer>,g' ${wwwroot}/barcode/index.php\nsed -i'' 's,<a href=\"/\">by <em>Timo Van Neerden,<a href=\"//lehollandaisvolant.net\">by <em>Timo Van Neerden,g' ${wwwroot}/*/index.php\nsed -i'' 's,<a href=\"/\">Timo Van Neerden,<a href=\"//lehollandaisvolant.net\">Timo Van Neerden,g' ${wwwroot}/index.php ${wwwroot}/cgu.php\n\n\n# Cleanup\nif [ -d ${toolsdir} ]; then rm -fr ${toolsdir}; fi\n\necho \"${STAR} Enjoy !\"\n"
  },
  {
    "path": "service/mport/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n\ncd /dev && /bin/sh /etc/MAKEDEV ttyVI01\n\nksh\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/nbakery/etc/fstab",
    "content": "NAME=nbakeryroot\t\t/\t\tffs\trw,log\t\t\t1\t1\nptyfs\t\t/dev/pts\tptyfs\trw\t\t\t0\t0\nkernfs\t\t/kern\t\tkernfs\trw,noauto\t\t0\t0\nprocfs\t\t/proc\t\tprocfs\trw,noauto\t\t0\t0\ntmpfs\t\t/var/shm\ttmpfs\trw,-m1777,-sram%25\t0\t0\n"
  },
  {
    "path": "service/nbakery/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n\n# why are fds not created by MAKEDEV -MM init?\ncd /dev && sh MAKEDEV fd\ncd -\n\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\nexport TERM=tmux-256color\neval $(resize) # get current window size\n\nlightgreen=\"\\033[92m\"\nbold=\"\\033[1m\"\nnormal=\"\\033[0m\"\n\nprintbold()\n{\n\tprintf \"${bold}$1${normal}\\n\"\n}\n\nexport NBUSER=nbuser\nexport NBHOME=/home/${NBUSER}\nexport TMUX_SOCKET=${NBHOME}/tmp/tmux\nexport CHOUPI=y\n\nif [ ! -d ${NBHOME} ]; then\n\t. /etc/include/pkgin\n\n\tPACKAGES=\"bash git-base neovim curl doas ripgrep fd-find bat fzf gmake\"\n\n\tif ! id NBUSER >/dev/null 2>&1; then\n\t\n\t\tprintbold \"⭐ creating user\"\n\t\tuseradd -m $NBUSER\n\n\t\tprintbold \"⭐ installing user packages\"\n\t\techo \"➡️  $PACKAGES\"\n\t\tpkgin -y in $PACKAGES\n\n\t\texport HOSTNAME_FG=\"blanc\"\n\t\texport HOSTNAME_BG=\"violet\"\n\t\texport HOME=${NBHOME}\n\n\t\tprintbold \"⭐ setup powerline.bash\"\n\t\tcurl -o- -s \\\n\t\t\thttps://gitlab.com/-/snippets/4796585/raw/main/mkchoupi.sh | \\\n\t\t\tbash > ${NBHOME}/.bashoupi\n\n\t\tprintbold \"⭐ cloning tmux-power\"\n\t\tmkdir -p ${NBHOME}/.tmux\n\t\tcurl -s -Lo ${NBHOME}/.tmux/tmux-power.tmux \\\n\t\t\thttps://raw.githubusercontent.com/wfxr/tmux-power/master/tmux-power.tmux\n\t\tsed -i.bak 's/status-right \"$RS\"/status-right \":: powered by 🚩 + smolBSD \"/' \\\n\t\t\t\t${NBHOME}/.tmux/tmux-power.tmux\n\t\tchmod +x ${NBHOME}/.tmux/tmux-power.tmux\n\n\t\t# nvim is the only editor I found that does not mess\n\t\t# with tab display in qemu stdio mode\n\t\tprintbold \"⭐ kawaï nvim\"\n\t\tmkdir -p ${NBHOME}/.local/share/nvim/site/autoload\n\t\tcurl -s -Lo ${NBHOME}/.local/share/nvim/site/autoload/plug.vim \\\n\t\t\thttps://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\n\t\tmkdir -p ${NBHOME}/.config/nvim\n\t\tcurl -s -Lo ${NBHOME}/.config/nvim/init.lua \\\n\t\t\thttps://gitlab.com/-/snippets/4797133/raw/main/init.lua\n\n\t\tprintbold \"⭐ creating a sane bach_profile\"\n\t\tchsh -s /usr/pkg/bin/bash ${NBUSER}\n\t\tcat >/home/${NBUSER}/.bash_profile<<EOF\nexport HOME=${NBHOME}\nexport EDITOR=nvim\nexport VISUAL=\\${EDITOR}\nexport PAGER=less\nexport NBUSER=${NBUSER}\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\n\nlightgreen=\"${lightgreen}\"\nbold=\"${bold}\"\nnormal=\"${normal}\"\n\nLANG=en_US.UTF-8; export LANG\n\nalias cat=\"bat -pp\"\nalias less=\"bat -p\"\nalias vim=nvim\nalias vi=nvim\n\nstty speed 115200 >/dev/null\n\n. \\${HOME}/.bashoupi\n\n# download modules, ignore complains about modules not being installed\n[ ! -d \\${HOME}/.local/share/nvim/plugged ] && \\\n\t\tnvim --headless +PlugInstall +qall 2>/dev/null\n\nif [ -d /tmp/tmux* -a ! -f /tmp/greetings ]; then\n    [ -f /etc/smol.ansi ] && /bin/cat /etc/smol.ansi\n\techo -e \"\nWelcome to the (n)bakery! 🧁\n\n💪 \\${lightgreen}doas <command>\\${normal} to run command as \\${bold}root\\${normal}\n📦 \\${lightgreen}pkgin\\${normal} to manage packages\n🚪 \\${lightgreen}exit\\${normal} to cleanly shutdown, \\${lightgreen}^a-x\\${normal} to exit \\${lightgreen}qemu\\${normal}\n🪟 you are inside a \\${lightgreen}tmux\\${normal} with prefix \\${lightgreen}^q\\${normal}\n\"\n\ttouch /tmp/greetings\nfi\n\nEOF\necho \"rm -f /tmp/greetings\" > ${NBHOME}/.bash_logout\n\n\t\tprintbold \"⭐ customizing tmux\"\n\t\tcat >${NBHOME}/.tmux.conf<<EOF\n# spawn a login shell in order to read ~/.bash_profile\nunbind C-b\nset -g prefix ^Q\nbind q send-prefix\nset-option -g default-command \"bash -l\"\nset -g default-terminal \"tmux-256color\"\nset -g @tmux_power_theme 'moon'\nrun '~/.tmux/tmux-power.tmux'\nEOF\n\t\tchown -R ${NBUSER} ${NBHOME} ${NBHOME}/.*\n\n\t\tprintbold \"⭐ adding $NBUSER to group wheel\"\n\t\tusermod -G wheel $NBUSER\n\t\tprintbold \"⭐ permit $NBUSER to ${lightgreen}doas${normal}\"\n\t\techo \"permit nopass keepenv setenv { PATH } :wheel\" \\\n\t\t\t>/usr/pkg/etc/doas.conf\n\tfi\nfi\n\nprintbold \"⭐ checking for exported filesystem\"\n\n. /etc/include/mount9p\n\nhostname nbakery\n\nsu - ${NBUSER} -c \"tmux -u new\"\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/nbakery/etc/smol.ansi",
    "content": "\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;2;2;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;1;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;122;121;124mc\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;8;9;8m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;117;117;122mc\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;6m \u001b[0m\u001b[38;2;16;17;17m \u001b[0m\u001b[38;2;173;173;178mk\u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;165;166;172mx\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;1;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;90;90;91m;\u001b[0m\u001b[38;2;173;175;186mk\u001b[0m\u001b[38;2;17;17;21m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;37;37;36m.\u001b[0m\u001b[38;2;178;180;187mO\u001b[0m\u001b[38;2;29;30;37m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;132;132;130ml\u001b[0m\u001b[38;2;159;163;180mx\u001b[0m\u001b[38;2;37;37;45m.\u001b[0m\u001b[38;2;2;1;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;90;89;88m;\u001b[0m\u001b[38;2;169;172;182mk\u001b[0m\u001b[38;2;51;55;67m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;4;4m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;6m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;158;158;157mx\u001b[0m\u001b[38;2;140;146;169md\u001b[0m\u001b[38;2;51;54;65m.\u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;125;124;124ml\u001b[0m\u001b[38;2;157;162;176mx\u001b[0m\u001b[38;2;70;77;90m'\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;3m \u001b[0m\u001b[38;2;1;2;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;179;179;177mO\u001b[0m\u001b[38;2;129;137;163mo\u001b[0m\u001b[38;2;63;67;81m'\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;7;9;8m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;153;153;153md\u001b[0m\u001b[38;2;145;153;171md\u001b[0m\u001b[38;2;88;96;114m;\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;68;70;69m'\u001b[0m\u001b[38;2;113;114;119mc\u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;4;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;5;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;94;93;95m;\u001b[0m\u001b[38;2;75;77;90m'\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;7;8;8m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;187;189;190m0\u001b[0m\u001b[38;2;130;139;164mo\u001b[0m\u001b[38;2;76;82;98m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;174;174;174mk\u001b[0m\u001b[38;2;132;141;164mo\u001b[0m\u001b[38;2;104;113;134mc\u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;21;21;21m \u001b[0m\u001b[38;2;200;204;207mK\u001b[0m\u001b[38;2;137;145;163md\u001b[0m\u001b[38;2;15;15;18m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;166;166;166mx\u001b[0m\u001b[38;2;156;161;175mx\u001b[0m\u001b[38;2;82;87;100m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;6;8;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;200;203;207mK\u001b[0m\u001b[38;2;130;139;161mo\u001b[0m\u001b[38;2;112;120;137mc\u001b[0m\u001b[38;2;46;46;48m.\u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;31;32;32m \u001b[0m\u001b[38;2;179;181;184mO\u001b[0m\u001b[38;2;128;137;160mo\u001b[0m\u001b[38;2;113;122;144mc\u001b[0m\u001b[38;2;21;22;27m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;149;149;149md\u001b[0m\u001b[38;2;219;226;237mN\u001b[0m\u001b[38;2;159;170;191mk\u001b[0m\u001b[38;2;82;87;101m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;207;207;207mK\u001b[0m\u001b[38;2;180;190;206m0\u001b[0m\u001b[38;2;117;125;147ml\u001b[0m\u001b[38;2;35;37;43m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;9;10;10m \u001b[0m\u001b[38;2;214;216;221mX\u001b[0m\u001b[38;2;128;137;159mo\u001b[0m\u001b[38;2;128;136;157mo\u001b[0m\u001b[38;2;159;164;177mx\u001b[0m\u001b[38;2;160;163;170mx\u001b[0m\u001b[38;2;155;157;161mx\u001b[0m\u001b[38;2;154;157;161mx\u001b[0m\u001b[38;2;161;165;170mx\u001b[0m\u001b[38;2;173;179;188mO\u001b[0m\u001b[38;2;135;143;162mo\u001b[0m\u001b[38;2;126;134;155mo\u001b[0m\u001b[38;2;114;124;146ml\u001b[0m\u001b[38;2;37;39;49m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;196;196;196m0\u001b[0m\u001b[38;2;213;221;235mX\u001b[0m\u001b[38;2;186;198;219m0\u001b[0m\u001b[38;2;120;131;153ml\u001b[0m\u001b[38;2;69;74;88m'\u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;4;5;5m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;148;149;150md\u001b[0m\u001b[38;2;232;237;244mW\u001b[0m\u001b[38;2;175;187;209mO\u001b[0m\u001b[38;2;115;123;147ml\u001b[0m\u001b[38;2;73;79;91m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;5m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;159;161;161mx\u001b[0m\u001b[38;2;181;186;195mO\u001b[0m\u001b[38;2;131;140;159mo\u001b[0m\u001b[38;2;128;137;157mo\u001b[0m\u001b[38;2;127;136;157mo\u001b[0m\u001b[38;2;127;136;156mo\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;119;127;148ml\u001b[0m\u001b[38;2;78;84;102m,\u001b[0m\u001b[38;2;7;8;10m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;5;6m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;173;173;173mk\u001b[0m\u001b[38;2;211;218;230mX\u001b[0m\u001b[38;2;196;207;228mK\u001b[0m\u001b[38;2;179;191;210m0\u001b[0m\u001b[38;2;120;130;153ml\u001b[0m\u001b[38;2;92;99;117m;\u001b[0m\u001b[38;2;38;41;49m.\u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;7;9;9m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;1;3;2m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;2;4;4m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;22;23;23m \u001b[0m\u001b[38;2;173;175;175mk\u001b[0m\u001b[38;2;227;233;240mN\u001b[0m\u001b[38;2;194;206;227mK\u001b[0m\u001b[38;2;152;163;185mx\u001b[0m\u001b[38;2;115;123;144ml\u001b[0m\u001b[38;2;95;100;110m;\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;2;2;3m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;72;73;74m'\u001b[0m\u001b[38;2;148;150;152md\u001b[0m\u001b[38;2;166;170;177mk\u001b[0m\u001b[38;2;172;177;189mk\u001b[0m\u001b[38;2;128;137;157mo\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;120;129;149ml\u001b[0m\u001b[38;2;96;102;120m:\u001b[0m\u001b[38;2;66;71;85m'\u001b[0m\u001b[38;2;32;35;44m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;6m \u001b[0m\u001b[38;2;1;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;65;65;65m.\u001b[0m\u001b[38;2;200;204;211mK\u001b[0m\u001b[38;2;169;179;201mO\u001b[0m\u001b[38;2;195;207;226mK\u001b[0m\u001b[38;2;184;196;216m0\u001b[0m\u001b[38;2;141;152;175md\u001b[0m\u001b[38;2;105;114;136mc\u001b[0m\u001b[38;2;52;56;67m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;19;21;20m \u001b[0m\u001b[38;2;95;97;97m;\u001b[0m\u001b[38;2;141;142;142mo\u001b[0m\u001b[38;2;168;157;157mx\u001b[0m\u001b[38;2;186;149;148mx\u001b[0m\u001b[38;2;200;138;136md\u001b[0m\u001b[38;2;210;125;122mo\u001b[0m\u001b[38;2;216;119;113mo\u001b[0m\u001b[38;2;218;96;90mc\u001b[0m\u001b[38;2;216;66;62m;\u001b[0m\u001b[38;2;206;51;48m,\u001b[0m\u001b[38;2;192;40;40m'\u001b[0m\u001b[38;2;173;28;36m.\u001b[0m\u001b[38;2;146;18;32m.\u001b[0m\u001b[38;2;120;12;28m.\u001b[0m\u001b[38;2;89;7;20m \u001b[0m\u001b[38;2;32;3;8m \u001b[0m\u001b[38;2;3;4;5m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;6;7;7m \u001b[0m\u001b[38;2;1;1;2m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;37;38;37m.\u001b[0m\u001b[38;2;146;147;147md\u001b[0m\u001b[38;2;221;224;226mN\u001b[0m\u001b[38;2;213;221;235mX\u001b[0m\u001b[38;2;192;204;225mK\u001b[0m\u001b[38;2;175;186;207mO\u001b[0m\u001b[38;2;114;122;144mc\u001b[0m\u001b[38;2;145;153;171md\u001b[0m\u001b[38;2;55;57;62m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;97;98;98m;\u001b[0m\u001b[38;2;197;200;206mK\u001b[0m\u001b[38;2;117;126;148ml\u001b[0m\u001b[38;2;47;51;63m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;7m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;116;117;118mc\u001b[0m\u001b[38;2;151;157;176mx\u001b[0m\u001b[38;2;151;160;179mx\u001b[0m\u001b[38;2;143;151;164md\u001b[0m\u001b[38;2;81;87;95m,\u001b[0m\u001b[38;2;81;83;82m,\u001b[0m\u001b[38;2;164;165;164mx\u001b[0m\u001b[38;2;207;184;182m0\u001b[0m\u001b[38;2;244;180;178m0\u001b[0m\u001b[38;2;252;158;155mO\u001b[0m\u001b[38;2;252;141;132mx\u001b[0m\u001b[38;2;253;99;89ml\u001b[0m\u001b[38;2;254;115;110mo\u001b[0m\u001b[38;2;254;108;102mo\u001b[0m\u001b[38;2;254;98;92ml\u001b[0m\u001b[38;2;254;110;105mo\u001b[0m\u001b[38;2;254;96;91ml\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;244;52;48m;\u001b[0m\u001b[38;2;230;43;47m,\u001b[0m\u001b[38;2;209;27;44m.\u001b[0m\u001b[38;2;179;16;38m.\u001b[0m\u001b[38;2;97;10;21m \u001b[0m\u001b[38;2;0;1;0m \u001b[0m\u001b[38;2;140;142;142mo\u001b[0m\u001b[38;2;193;195;196m0\u001b[0m\u001b[38;2;224;228;234mN\u001b[0m\u001b[38;2;215;222;235mX\u001b[0m\u001b[38;2;193;205;225mK\u001b[0m\u001b[38;2;192;204;225mK\u001b[0m\u001b[38;2;166;177;197mk\u001b[0m\u001b[38;2;116;124;145ml\u001b[0m\u001b[38;2;136;145;164md\u001b[0m\u001b[38;2;122;129;142ml\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;183;185;189mO\u001b[0m\u001b[38;2;109;117;141mc\u001b[0m\u001b[38;2;1;1;2m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;51;53;59m.\u001b[0m\u001b[38;2;26;27;32m \u001b[0m\u001b[38;2;122;124;124ml\u001b[0m\u001b[38;2;209;201;201mK\u001b[0m\u001b[38;2;249;188;187mK\u001b[0m\u001b[38;2;251;115;111mo\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;254;80;72mc\u001b[0m\u001b[38;2;254;94;85ml\u001b[0m\u001b[38;2;254;64;58m:\u001b[0m\u001b[38;2;254;69;59m:\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;55;49m;\u001b[0m\u001b[38;2;233;40;45m,\u001b[0m\u001b[38;2;79;10;20m \u001b[0m\u001b[38;2;20;23;24m \u001b[0m\u001b[38;2;212;220;233mX\u001b[0m\u001b[38;2;197;208;227mK\u001b[0m\u001b[38;2;193;205;225mK\u001b[0m\u001b[38;2;193;205;225mK\u001b[0m\u001b[38;2;176;187;207mO\u001b[0m\u001b[38;2;136;145;165md\u001b[0m\u001b[38;2;115;122;143ml\u001b[0m\u001b[38;2;149;158;176mx\u001b[0m\u001b[38;2;117;124;137ml\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;6;7m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;197;199;204m0\u001b[0m\u001b[38;2;118;126;151ml\u001b[0m\u001b[38;2;27;28;36m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;4;4;5m \u001b[0m\u001b[38;2;93;95;95m;\u001b[0m\u001b[38;2;209;204;203mK\u001b[0m\u001b[38;2;251;180;178m0\u001b[0m\u001b[38;2;232;75;69m:\u001b[0m\u001b[38;2;197;43;36m'\u001b[0m\u001b[38;2;167;36;30m.\u001b[0m\u001b[38;2;157;42;41m.\u001b[0m\u001b[38;2;161;37;35m.\u001b[0m\u001b[38;2;183;40;36m'\u001b[0m\u001b[38;2;218;49;43m,\u001b[0m\u001b[38;2;252;56;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;252;56;48m;\u001b[0m\u001b[38;2;219;48;42m,\u001b[0m\u001b[38;2;185;40;35m'\u001b[0m\u001b[38;2;161;36;33m.\u001b[0m\u001b[38;2;155;44;43m'\u001b[0m\u001b[38;2;162;36;33m.\u001b[0m\u001b[38;2;186;40;36m'\u001b[0m\u001b[38;2;222;49;42m,\u001b[0m\u001b[38;2;253;55;46m;\u001b[0m\u001b[38;2;253;54;48m;\u001b[0m\u001b[38;2;189;31;37m.\u001b[0m\u001b[38;2;38;4;9m \u001b[0m\u001b[38;2;107;113;124mc\u001b[0m\u001b[38;2;168;180;196mO\u001b[0m\u001b[38;2;152;163;182mx\u001b[0m\u001b[38;2;125;134;154mo\u001b[0m\u001b[38;2;120;128;148ml\u001b[0m\u001b[38;2;144;154;173md\u001b[0m\u001b[38;2;138;147;162md\u001b[0m\u001b[38;2;70;74;82m'\u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;7;9;8m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;37;37;38m.\u001b[0m\u001b[38;2;171;172;178mk\u001b[0m\u001b[38;2;114;122;147ml\u001b[0m\u001b[38;2;50;53;67m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;5;5m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;152;154;154md\u001b[0m\u001b[38;2;244;213;211mX\u001b[0m\u001b[38;2;241;93;86ml\u001b[0m\u001b[38;2;141;32;26m.\u001b[0m\u001b[38;2;133;134;135mo\u001b[0m\u001b[38;2;209;210;212mK\u001b[0m\u001b[38;2;241;242;243mW\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;247;249;249mM\u001b[0m\u001b[38;2;218;221;224mX\u001b[0m\u001b[38;2;146;153;164md\u001b[0m\u001b[38;2;98;45;49m.\u001b[0m\u001b[38;2;216;49;45m,\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;211;47;41m,\u001b[0m\u001b[38;2;102;58;58m'\u001b[0m\u001b[38;2;172;173;174mk\u001b[0m\u001b[38;2;224;225;226mN\u001b[0m\u001b[38;2;247;248;249mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;243;245;246mM\u001b[0m\u001b[38;2;205;209;215mK\u001b[0m\u001b[38;2;131;141;155mo\u001b[0m\u001b[38;2;106;47;50m.\u001b[0m\u001b[38;2;216;47;42m,\u001b[0m\u001b[38;2;254;54;46m;\u001b[0m\u001b[38;2;223;41;44m,\u001b[0m\u001b[38;2;133;13;32m.\u001b[0m\u001b[38;2;62;12;19m \u001b[0m\u001b[38;2;54;58;69m.\u001b[0m\u001b[38;2;99;106;118m:\u001b[0m\u001b[38;2;103;109;120m:\u001b[0m\u001b[38;2;43;46;51m.\u001b[0m\u001b[38;2;10;11;10m \u001b[0m\u001b[38;2;4;6;4m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;1m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;69;58;56m.\u001b[0m\u001b[38;2;173;121;119ml\u001b[0m\u001b[38;2;195;125;125mo\u001b[0m\u001b[38;2;193;125;124mo\u001b[0m\u001b[38;2;174;120;118ml\u001b[0m\u001b[38;2;128;101;100m:\u001b[0m\u001b[38;2;27;24;28m \u001b[0m\u001b[38;2;8;1;2m \u001b[0m\u001b[38;2;174;93;85m:\u001b[0m\u001b[38;2;98;50;47m.\u001b[0m\u001b[38;2;4;4;4m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;5;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;158;159;160mx\u001b[0m\u001b[38;2;249;202;199mX\u001b[0m\u001b[38;2;252;63;54m:\u001b[0m\u001b[38;2;111;25;22m.\u001b[0m\u001b[38;2;165;166;168mx\u001b[0m\u001b[38;2;252;252;253mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;240;241;240mW\u001b[0m\u001b[38;2;140;141;141mo\u001b[0m\u001b[38;2;98;100;100m;\u001b[0m\u001b[38;2;219;220;221mX\u001b[0m\u001b[38;2;237;240;241mW\u001b[0m\u001b[38;2;174;183;197mO\u001b[0m\u001b[38;2;35;15;18m \u001b[0m\u001b[38;2;236;51;45m;\u001b[0m\u001b[38;2;219;48;41m,\u001b[0m\u001b[38;2;62;58;58m.\u001b[0m\u001b[38;2;228;229;231mN\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;206;207;206mK\u001b[0m\u001b[38;2;99;100;100m:\u001b[0m\u001b[38;2;157;158;159mx\u001b[0m\u001b[38;2;229;231;231mN\u001b[0m\u001b[38;2;215;221;227mX\u001b[0m\u001b[38;2;179;190;209m0\u001b[0m\u001b[38;2;58;51;58m.\u001b[0m\u001b[38;2;220;47;44m,\u001b[0m\u001b[38;2;254;55;46m;\u001b[0m\u001b[38;2;230;41;47m,\u001b[0m\u001b[38;2;202;17;45m.\u001b[0m\u001b[38;2;185;14;41m.\u001b[0m\u001b[38;2;167;13;40m.\u001b[0m\u001b[38;2;186;22;38m.\u001b[0m\u001b[38;2;127;14;15m.\u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;5;5;5m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;110;20;30m.\u001b[0m\u001b[38;2;183;27;39m.\u001b[0m\u001b[38;2;198;33;42m'\u001b[0m\u001b[38;2;208;37;44m'\u001b[0m\u001b[38;2;211;42;44m,\u001b[0m\u001b[38;2;202;48;46m,\u001b[0m\u001b[38;2;107;35;35m.\u001b[0m\u001b[38;2;13;2;3m \u001b[0m\u001b[38;2;147;18;30m.\u001b[0m\u001b[38;2;158;26;39m.\u001b[0m\u001b[38;2;3;3;3m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;4;3m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;93;93;93m;\u001b[0m\u001b[38;2;246;222;220mN\u001b[0m\u001b[38;2;253;66;57m:\u001b[0m\u001b[38;2;238;52;45m;\u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;216;218;222mX\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;251;253;252mM\u001b[0m\u001b[38;2;185;186;185mO\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;88;89;89m;\u001b[0m\u001b[38;2;61;62;62m.\u001b[0m\u001b[38;2;141;147;156md\u001b[0m\u001b[38;2;69;71;78m'\u001b[0m\u001b[38;2;200;45;38m'\u001b[0m\u001b[38;2;171;40;33m'\u001b[0m\u001b[38;2;134;134;135mo\u001b[0m\u001b[38;2;252;252;253mM\u001b[0m\u001b[38;2;251;253;252mM\u001b[0m\u001b[38;2;251;252;252mM\u001b[0m\u001b[38;2;94;93;94m;\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;43;44;44m.\u001b[0m\u001b[38;2;95;96;96m;\u001b[0m\u001b[38;2;23;24;24m \u001b[0m\u001b[38;2;180;188;206mO\u001b[0m\u001b[38;2;115;122;134mc\u001b[0m\u001b[38;2;164;37;33m.\u001b[0m\u001b[38;2;254;56;45m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;209;25;46m.\u001b[0m\u001b[38;2;199;18;46m.\u001b[0m\u001b[38;2;162;2;43m.\u001b[0m\u001b[38;2;172;9;42m.\u001b[0m\u001b[38;2;234;25;24m'\u001b[0m\u001b[38;2;88;10;10m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;6m \u001b[0m\u001b[38;2;43;7;13m \u001b[0m\u001b[38;2;202;56;61m,\u001b[0m\u001b[38;2;237;84;78mc\u001b[0m\u001b[38;2;247;82;76mc\u001b[0m\u001b[38;2;249;82;73mc\u001b[0m\u001b[38;2;249;82;74mc\u001b[0m\u001b[38;2;247;78;71mc\u001b[0m\u001b[38;2;243;67;62m:\u001b[0m\u001b[38;2;228;49;50m,\u001b[0m\u001b[38;2;125;14;31m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;7;6m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;187;187;187mO\u001b[0m\u001b[38;2;247;139;137mx\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;253;55;47m;\u001b[0m\u001b[38;2;117;27;23m.\u001b[0m\u001b[38;2;142;147;154md\u001b[0m\u001b[38;2;247;249;250mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;237;238;237mW\u001b[0m\u001b[38;2;125;125;125ml\u001b[0m\u001b[38;2;14;15;16m \u001b[0m\u001b[38;2;22;23;23m \u001b[0m\u001b[38;2;106;111;117m:\u001b[0m\u001b[38;2;154;163;174mx\u001b[0m\u001b[38;2;58;15;17m \u001b[0m\u001b[38;2;241;52;45m;\u001b[0m\u001b[38;2;228;53;43m;\u001b[0m\u001b[38;2;67;51;51m.\u001b[0m\u001b[38;2;222;223;223mN\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;202;203;202mK\u001b[0m\u001b[38;2;84;84;85m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;55;57;57m.\u001b[0m\u001b[38;2;137;145;157md\u001b[0m\u001b[38;2;177;187;204mO\u001b[0m\u001b[38;2;62;53;58m.\u001b[0m\u001b[38;2;221;49;45m,\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;59;50m;\u001b[0m\u001b[38;2;216;34;50m'\u001b[0m\u001b[38;2;204;21;49m.\u001b[0m\u001b[38;2;163;4;39m.\u001b[0m\u001b[38;2;162;2;41m.\u001b[0m\u001b[38;2;209;19;27m.\u001b[0m\u001b[38;2;152;17;18m.\u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;6;6m \u001b[0m\u001b[38;2;13;2;4m \u001b[0m\u001b[38;2;159;40;46m.\u001b[0m\u001b[38;2;205;72;77m:\u001b[0m\u001b[38;2;219;72;69m:\u001b[0m\u001b[38;2;224;71;68m:\u001b[0m\u001b[38;2;226;70;63m:\u001b[0m\u001b[38;2;223;66;61m;\u001b[0m\u001b[38;2;218;55;53m;\u001b[0m\u001b[38;2;197;45;44m'\u001b[0m\u001b[38;2;89;9;21m \u001b[0m\u001b[38;2;8;8;8m \u001b[0m\u001b[38;2;4;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;4;7;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;212;211;208mX\u001b[0m\u001b[38;2;242;77;72mc\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;55;48m;\u001b[0m\u001b[38;2;246;56;48m;\u001b[0m\u001b[38;2;160;37;34m.\u001b[0m\u001b[38;2;107;105;109m:\u001b[0m\u001b[38;2;182;186;189mO\u001b[0m\u001b[38;2;217;221;223mX\u001b[0m\u001b[38;2;226;230;232mN\u001b[0m\u001b[38;2;211;216;220mX\u001b[0m\u001b[38;2;181;187;193mO\u001b[0m\u001b[38;2;121;126;135ml\u001b[0m\u001b[38;2;137;37;37m.\u001b[0m\u001b[38;2;233;53;47m;\u001b[0m\u001b[38;2;254;56;46m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;227;51;44m,\u001b[0m\u001b[38;2;132;49;47m.\u001b[0m\u001b[38;2;151;152;152md\u001b[0m\u001b[38;2;206;208;208mK\u001b[0m\u001b[38;2;225;229;229mN\u001b[0m\u001b[38;2;226;231;234mN\u001b[0m\u001b[38;2;206;211;217mK\u001b[0m\u001b[38;2;176;184;193mO\u001b[0m\u001b[38;2;118;125;136ml\u001b[0m\u001b[38;2;130;47;48m.\u001b[0m\u001b[38;2;224;50;46m,\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;59;51m;\u001b[0m\u001b[38;2;205;25;46m.\u001b[0m\u001b[38;2;197;25;47m.\u001b[0m\u001b[38;2;156;74;74m;\u001b[0m\u001b[38;2;142;99;96m:\u001b[0m\u001b[38;2;143;104;102mc\u001b[0m\u001b[38;2;139;105;101mc\u001b[0m\u001b[38;2;128;99;96m:\u001b[0m\u001b[38;2;110;81;78m,\u001b[0m\u001b[38;2;79;33;32m.\u001b[0m\u001b[38;2;25;7;9m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;1;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;9;11;10m \u001b[0m\u001b[38;2;24;3;7m \u001b[0m\u001b[38;2;142;18;35m.\u001b[0m\u001b[38;2;185;44;51m'\u001b[0m\u001b[38;2;206;64;65m;\u001b[0m\u001b[38;2;213;69;68m;\u001b[0m\u001b[38;2;213;67;63m;\u001b[0m\u001b[38;2;205;61;58m;\u001b[0m\u001b[38;2;197;52;53m,\u001b[0m\u001b[38;2;167;30;40m.\u001b[0m\u001b[38;2;77;8;20m \u001b[0m\u001b[38;2;86;24;24m.\u001b[0m\u001b[38;2;151;55;55m'\u001b[0m\u001b[38;2;110;70;73m,\u001b[0m\u001b[38;2;83;68;68m'\u001b[0m\u001b[38;2;44;36;37m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;186;177;172mO\u001b[0m\u001b[38;2;239;51;50m;\u001b[0m\u001b[38;2;254;56;50m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;247;56;49m;\u001b[0m\u001b[38;2;214;48;42m,\u001b[0m\u001b[38;2;191;44;38m'\u001b[0m\u001b[38;2;181;42;37m'\u001b[0m\u001b[38;2;186;44;38m'\u001b[0m\u001b[38;2;207;48;42m,\u001b[0m\u001b[38;2;240;55;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;238;55;47m;\u001b[0m\u001b[38;2;204;48;41m,\u001b[0m\u001b[38;2;187;44;37m'\u001b[0m\u001b[38;2;180;44;36m'\u001b[0m\u001b[38;2;187;46;39m'\u001b[0m\u001b[38;2;207;48;41m,\u001b[0m\u001b[38;2;239;54;46m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;58;50m;\u001b[0m\u001b[38;2;234;46;49m,\u001b[0m\u001b[38;2;205;21;46m.\u001b[0m\u001b[38;2;238;49;49m,\u001b[0m\u001b[38;2;243;51;50m;\u001b[0m\u001b[38;2;242;51;49m;\u001b[0m\u001b[38;2;243;52;49m;\u001b[0m\u001b[38;2;245;53;49m;\u001b[0m\u001b[38;2;249;56;50m;\u001b[0m\u001b[38;2;252;65;58m:\u001b[0m\u001b[38;2;253;85;79mc\u001b[0m\u001b[38;2;248;87;82mc\u001b[0m\u001b[38;2;229;82;76mc\u001b[0m\u001b[38;2;201;70;65m;\u001b[0m\u001b[38;2;163;54;47m'\u001b[0m\u001b[38;2;99;24;20m.\u001b[0m\u001b[38;2;2;1;1m \u001b[0m\u001b[38;2;2;3;4m \u001b[0m\u001b[38;2;2;3;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;169;30;44m.\u001b[0m\u001b[38;2;224;60;66m;\u001b[0m\u001b[38;2;231;51;52m;\u001b[0m\u001b[38;2;233;48;48m,\u001b[0m\u001b[38;2;233;47;48m,\u001b[0m\u001b[38;2;233;48;48m,\u001b[0m\u001b[38;2;230;47;49m,\u001b[0m\u001b[38;2;215;43;47m,\u001b[0m\u001b[38;2;103;10;25m \u001b[0m\u001b[38;2;31;4;8m \u001b[0m\u001b[38;2;221;36;45m'\u001b[0m\u001b[38;2;233;43;47m,\u001b[0m\u001b[38;2;237;60;60m;\u001b[0m\u001b[38;2;181;53;54m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;97;94;89m;\u001b[0m\u001b[38;2;243;72;67m:\u001b[0m\u001b[38;2;243;49;47m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;228;52;44m,\u001b[0m\u001b[38;2;99;23;20m.\u001b[0m\u001b[38;2;154;35;31m.\u001b[0m\u001b[38;2;188;42;37m'\u001b[0m\u001b[38;2;212;47;42m,\u001b[0m\u001b[38;2;227;51;44m,\u001b[0m\u001b[38;2;236;53;46m;\u001b[0m\u001b[38;2;240;53;46m;\u001b[0m\u001b[38;2;240;53;47m;\u001b[0m\u001b[38;2;235;53;46m;\u001b[0m\u001b[38;2;228;50;44m,\u001b[0m\u001b[38;2;217;48;42m,\u001b[0m\u001b[38;2;200;45;39m'\u001b[0m\u001b[38;2;177;40;34m'\u001b[0m\u001b[38;2;142;32;26m.\u001b[0m\u001b[38;2;73;16;14m \u001b[0m\u001b[38;2;152;35;33m.\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;240;50;49m;\u001b[0m\u001b[38;2;202;21;45m.\u001b[0m\u001b[38;2;201;19;45m.\u001b[0m\u001b[38;2;181;13;43m.\u001b[0m\u001b[38;2;156;12;37m.\u001b[0m\u001b[38;2;126;12;29m.\u001b[0m\u001b[38;2;115;11;26m.\u001b[0m\u001b[38;2;118;12;26m.\u001b[0m\u001b[38;2;127;11;28m.\u001b[0m\u001b[38;2;138;12;30m.\u001b[0m\u001b[38;2;159;21;34m.\u001b[0m\u001b[38;2;189;31;40m.\u001b[0m\u001b[38;2;221;40;47m,\u001b[0m\u001b[38;2;243;49;49m;\u001b[0m\u001b[38;2;254;54;48m;\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;225;48;41m,\u001b[0m\u001b[38;2;134;32;26m.\u001b[0m\u001b[38;2;1;0;0m \u001b[0m\u001b[38;2;3;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;1;1;2m \u001b[0m\u001b[38;2;7;7;8m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;64;65;69m.\u001b[0m\u001b[38;2;83;88;104m,\u001b[0m\u001b[38;2;77;83;99m,\u001b[0m\u001b[38;2;65;68;83m'\u001b[0m\u001b[38;2;1;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;60;4;15m \u001b[0m\u001b[38;2;137;5;35m.\u001b[0m\u001b[38;2;158;4;41m.\u001b[0m\u001b[38;2;161;4;41m.\u001b[0m\u001b[38;2;163;5;40m.\u001b[0m\u001b[38;2;165;7;41m.\u001b[0m\u001b[38;2;70;6;20m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;186;41;34m'\u001b[0m\u001b[38;2;230;39;42m,\u001b[0m\u001b[38;2;247;51;48m;\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;59;48m;\u001b[0m\u001b[38;2;193;46;38m'\u001b[0m\u001b[38;2;35;8;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;7;1;3m \u001b[0m\u001b[38;2;42;6;13m \u001b[0m\u001b[38;2;24;3;9m \u001b[0m\u001b[38;2;74;8;19m \u001b[0m\u001b[38;2;105;15;26m.\u001b[0m\u001b[38;2;112;12;28m.\u001b[0m\u001b[38;2;98;7;26m \u001b[0m\u001b[38;2;44;4;12m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;135;30;30m.\u001b[0m\u001b[38;2;246;54;48m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;56;48m;\u001b[0m\u001b[38;2;252;56;50m;\u001b[0m\u001b[38;2;227;42;48m,\u001b[0m\u001b[38;2;200;19;45m.\u001b[0m\u001b[38;2;202;19;45m.\u001b[0m\u001b[38;2;171;10;42m.\u001b[0m\u001b[38;2;157;3;41m.\u001b[0m\u001b[38;2;160;3;40m.\u001b[0m\u001b[38;2;213;19;28m.\u001b[0m\u001b[38;2;170;17;18m.\u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;8;9;9m \u001b[0m\u001b[38;2;10;12;11m \u001b[0m\u001b[38;2;6;9;7m \u001b[0m\u001b[38;2;4;6;4m \u001b[0m\u001b[38;2;19;5;7m \u001b[0m\u001b[38;2;103;10;24m \u001b[0m\u001b[38;2;208;37;42m'\u001b[0m\u001b[38;2;254;54;46m;\u001b[0m\u001b[38;2;254;55;47m;\u001b[0m\u001b[38;2;252;54;47m;\u001b[0m\u001b[38;2;136;29;24m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;7;8;8m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;158;159;159mx\u001b[0m\u001b[38;2;142;150;171md\u001b[0m\u001b[38;2;129;138;159mo\u001b[0m\u001b[38;2;102;112;133mc\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;15;16;17m \u001b[0m\u001b[38;2;2;4;3m \u001b[0m\u001b[38;2;3;2;2m \u001b[0m\u001b[38;2;14;1;3m \u001b[0m\u001b[38;2;20;8;8m \u001b[0m\u001b[38;2;8;1;2m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;3;3;4m \u001b[0m\u001b[38;2;18;2;4m \u001b[0m\u001b[38;2;179;31;36m.\u001b[0m\u001b[38;2;181;21;37m.\u001b[0m\u001b[38;2;195;40;37m'\u001b[0m\u001b[38;2;192;43;37m'\u001b[0m\u001b[38;2;198;45;39m'\u001b[0m\u001b[38;2;212;47;41m,\u001b[0m\u001b[38;2;230;51;44m,\u001b[0m\u001b[38;2;231;53;45m;\u001b[0m\u001b[38;2;149;36;30m.\u001b[0m\u001b[38;2;49;11;10m \u001b[0m\u001b[38;2;68;8;15m \u001b[0m\u001b[38;2;191;36;36m'\u001b[0m\u001b[38;2;209;43;42m,\u001b[0m\u001b[38;2;218;47;44m,\u001b[0m\u001b[38;2;226;49;44m,\u001b[0m\u001b[38;2;204;42;40m'\u001b[0m\u001b[38;2;172;37;39m.\u001b[0m\u001b[38;2;121;17;32m.\u001b[0m\u001b[38;2;140;32;29m.\u001b[0m\u001b[38;2;208;47;42m,\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;245;55;47m;\u001b[0m\u001b[38;2;230;53;45m;\u001b[0m\u001b[38;2;222;49;44m,\u001b[0m\u001b[38;2;210;41;42m'\u001b[0m\u001b[38;2;189;22;40m.\u001b[0m\u001b[38;2;193;17;43m.\u001b[0m\u001b[38;2;199;16;44m.\u001b[0m\u001b[38;2;170;8;42m.\u001b[0m\u001b[38;2;157;3;41m.\u001b[0m\u001b[38;2;160;3;40m.\u001b[0m\u001b[38;2;208;16;31m.\u001b[0m\u001b[38;2;201;18;19m.\u001b[0m\u001b[38;2;28;3;3m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;5;7;7m \u001b[0m\u001b[38;2;7;1;1m \u001b[0m\u001b[38;2;177;37;35m.\u001b[0m\u001b[38;2;254;56;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;253;54;49m;\u001b[0m\u001b[38;2;149;23;29m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;174;175;175mk\u001b[0m\u001b[38;2;131;139;161mo\u001b[0m\u001b[38;2;129;138;158mo\u001b[0m\u001b[38;2;112;122;144mc\u001b[0m\u001b[38;2;20;21;26m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;92;52;50m.\u001b[0m\u001b[38;2;186;95;92mc\u001b[0m\u001b[38;2;206;106;105ml\u001b[0m\u001b[38;2;209;117;115mo\u001b[0m\u001b[38;2;200;121;119mo\u001b[0m\u001b[38;2;178;118;115ml\u001b[0m\u001b[38;2;131;103;102m:\u001b[0m\u001b[38;2;70;29;29m.\u001b[0m\u001b[38;2;164;39;35m.\u001b[0m\u001b[38;2;239;54;48m;\u001b[0m\u001b[38;2;221;48;43m,\u001b[0m\u001b[38;2;197;44;39m'\u001b[0m\u001b[38;2;183;42;37m'\u001b[0m\u001b[38;2;178;42;37m'\u001b[0m\u001b[38;2;183;44;38m'\u001b[0m\u001b[38;2;198;47;41m,\u001b[0m\u001b[38;2;222;52;44m,\u001b[0m\u001b[38;2;248;56;47m;\u001b[0m\u001b[38;2;200;44;36m'\u001b[0m\u001b[38;2;135;29;24m.\u001b[0m\u001b[38;2;82;51;49m.\u001b[0m\u001b[38;2;113;114;114mc\u001b[0m\u001b[38;2;142;138;137mo\u001b[0m\u001b[38;2;157;140;140mo\u001b[0m\u001b[38;2;161;138;138mo\u001b[0m\u001b[38;2;148;133;131mo\u001b[0m\u001b[38;2;101;93;92m;\u001b[0m\u001b[38;2;58;2;14m \u001b[0m\u001b[38;2;115;3;30m \u001b[0m\u001b[38;2;172;10;38m.\u001b[0m\u001b[38;2;221;18;27m.\u001b[0m\u001b[38;2;176;15;16m.\u001b[0m\u001b[38;2;23;3;3m \u001b[0m\u001b[38;2;1;3;2m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;4;6;6m \u001b[0m\u001b[38;2;3;4;5m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;33;12;11m \u001b[0m\u001b[38;2;135;28;24m.\u001b[0m\u001b[38;2;216;47;39m,\u001b[0m\u001b[38;2;254;56;46m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;249;52;48m;\u001b[0m\u001b[38;2;195;28;40m.\u001b[0m\u001b[38;2;40;4;9m \u001b[0m\u001b[38;2;4;6;5m \u001b[0m\u001b[38;2;1;1;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;179;180;182mO\u001b[0m\u001b[38;2;130;140;162mo\u001b[0m\u001b[38;2;130;138;159mo\u001b[0m\u001b[38;2;117;127;148ml\u001b[0m\u001b[38;2;44;46;56m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;4;5;5m \u001b[0m\u001b[38;2;44;46;46m.\u001b[0m\u001b[38;2;114;116;117mc\u001b[0m\u001b[38;2;150;140;141mo\u001b[0m\u001b[38;2;154;136;137mo\u001b[0m\u001b[38;2;150;119;119ml\u001b[0m\u001b[38;2;145;65;64m,\u001b[0m\u001b[38;2;178;39;34m'\u001b[0m\u001b[38;2;162;37;31m.\u001b[0m\u001b[38;2;167;41;34m'\u001b[0m\u001b[38;2;176;57;56m,\u001b[0m\u001b[38;2;31;7;9m \u001b[0m\u001b[38;2;114;22;27m.\u001b[0m\u001b[38;2;230;38;46m,\u001b[0m\u001b[38;2;232;43;46m,\u001b[0m\u001b[38;2;234;46;47m,\u001b[0m\u001b[38;2;234;46;48m,\u001b[0m\u001b[38;2;233;45;47m,\u001b[0m\u001b[38;2;229;43;47m,\u001b[0m\u001b[38;2;224;41;47m,\u001b[0m\u001b[38;2;119;25;25m.\u001b[0m\u001b[38;2;25;25;24m \u001b[0m\u001b[38;2;189;154;150mx\u001b[0m\u001b[38;2;225;138;134mx\u001b[0m\u001b[38;2;231;93;89mc\u001b[0m\u001b[38;2;251;58;50m;\u001b[0m\u001b[38;2;234;52;44m;\u001b[0m\u001b[38;2;209;47;39m,\u001b[0m\u001b[38;2;196;45;36m'\u001b[0m\u001b[38;2;190;70;67m;\u001b[0m\u001b[38;2;123;35;40m.\u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;119;13;17m.\u001b[0m\u001b[38;2;110;11;10m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;26;26;27m \u001b[0m\u001b[38;2;15;16;16m \u001b[0m\u001b[38;2;98;97;96m;\u001b[0m\u001b[38;2;146;122;120ml\u001b[0m\u001b[38;2;182;117;114ml\u001b[0m\u001b[38;2;214;112;106ml\u001b[0m\u001b[38;2;246;88;80mc\u001b[0m\u001b[38;2;254;57;47m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;227;44;46m,\u001b[0m\u001b[38;2;131;13;30m.\u001b[0m\u001b[38;2;25;8;9m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;186;188;191mO\u001b[0m\u001b[38;2;128;137;160mo\u001b[0m\u001b[38;2;127;136;157mo\u001b[0m\u001b[38;2;120;130;153ml\u001b[0m\u001b[38;2;53;57;68m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;3m \u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;1;3;2m \u001b[0m\u001b[38;2;71;73;74m'\u001b[0m\u001b[38;2;144;149;155md\u001b[0m\u001b[38;2;144;149;158md\u001b[0m\u001b[38;2;141;148;156md\u001b[0m\u001b[38;2;138;145;152mo\u001b[0m\u001b[38;2;157;163;170mx\u001b[0m\u001b[38;2;204;210;218mK\u001b[0m\u001b[38;2;182;186;191mO\u001b[0m\u001b[38;2;45;37;37m.\u001b[0m\u001b[38;2;216;92;92mc\u001b[0m\u001b[38;2;187;86;87m:\u001b[0m\u001b[38;2;120;71;69m,\u001b[0m\u001b[38;2;77;47;43m.\u001b[0m\u001b[38;2;110;10;25m \u001b[0m\u001b[38;2;171;15;39m.\u001b[0m\u001b[38;2;196;16;43m.\u001b[0m\u001b[38;2;197;17;44m.\u001b[0m\u001b[38;2;196;18;44m.\u001b[0m\u001b[38;2;198;17;44m.\u001b[0m\u001b[38;2;168;14;37m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;42;41;41m.\u001b[0m\u001b[38;2;111;95;90m;\u001b[0m\u001b[38;2;166;96;93m:\u001b[0m\u001b[38;2;76;57;57m.\u001b[0m\u001b[38;2;67;61;60m.\u001b[0m\u001b[38;2;162;163;163mx\u001b[0m\u001b[38;2;194;197;198m0\u001b[0m\u001b[38;2;202;206;210mK\u001b[0m\u001b[38;2;201;206;212mK\u001b[0m\u001b[38;2;192;197;203m0\u001b[0m\u001b[38;2;172;175;182mk\u001b[0m\u001b[38;2;120;123;128ml\u001b[0m\u001b[38;2;10;11;13m \u001b[0m\u001b[38;2;13;2;4m \u001b[0m\u001b[38;2;158;101;96mc\u001b[0m\u001b[38;2;203;128;125mo\u001b[0m\u001b[38;2;226;81;77mc\u001b[0m\u001b[38;2;254;57;49m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;58;47m;\u001b[0m\u001b[38;2;254;58;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;48m;\u001b[0m\u001b[38;2;254;57;50m;\u001b[0m\u001b[38;2;248;51;50m;\u001b[0m\u001b[38;2;155;15;31m.\u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;6;8;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;1m \u001b[0m\u001b[38;2;194;196;200m0\u001b[0m\u001b[38;2;126;135;158mo\u001b[0m\u001b[38;2;124;134;155mo\u001b[0m\u001b[38;2;123;133;155ml\u001b[0m\u001b[38;2;66;72;86m'\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;3;4;4m \u001b[0m\u001b[38;2;8;9;10m \u001b[0m\u001b[38;2;108;111;117m:\u001b[0m\u001b[38;2;143;148;156md\u001b[0m\u001b[38;2;141;147;157md\u001b[0m\u001b[38;2;142;148;157md\u001b[0m\u001b[38;2;159;164;172mx\u001b[0m\u001b[38;2;193;198;205m0\u001b[0m\u001b[38;2;201;206;212mK\u001b[0m\u001b[38;2;10;11;13m \u001b[0m\u001b[38;2;142;59;63m'\u001b[0m\u001b[38;2;191;44;39m'\u001b[0m\u001b[38;2;248;54;50m;\u001b[0m\u001b[38;2;217;32;46m'\u001b[0m\u001b[38;2;201;16;43m.\u001b[0m\u001b[38;2;212;31;45m'\u001b[0m\u001b[38;2;129;19;28m.\u001b[0m\u001b[38;2;14;1;5m \u001b[0m\u001b[38;2;135;6;37m.\u001b[0m\u001b[38;2;162;4;41m.\u001b[0m\u001b[38;2;160;4;41m.\u001b[0m\u001b[38;2;91;3;24m \u001b[0m\u001b[38;2;73;16;14m \u001b[0m\u001b[38;2;184;71;66m;\u001b[0m\u001b[38;2;200;92;86mc\u001b[0m\u001b[38;2;233;65;64m:\u001b[0m\u001b[38;2;210;47;42m,\u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;177;182;185mO\u001b[0m\u001b[38;2;149;156;164md\u001b[0m\u001b[38;2;113;120;127mc\u001b[0m\u001b[38;2;140;143;145mo\u001b[0m\u001b[38;2;151;153;155md\u001b[0m\u001b[38;2;148;151;155md\u001b[0m\u001b[38;2;143;147;152md\u001b[0m\u001b[38;2;139;144;149mo\u001b[0m\u001b[38;2;97;100;103m;\u001b[0m\u001b[38;2;8;9;10m \u001b[0m\u001b[38;2;122;7;31m \u001b[0m\u001b[38;2;86;40;43m.\u001b[0m\u001b[38;2;235;78;82mc\u001b[0m\u001b[38;2;248;51;50m;\u001b[0m\u001b[38;2;176;33;39m.\u001b[0m\u001b[38;2;251;55;50m;\u001b[0m\u001b[38;2;254;55;49m;\u001b[0m\u001b[38;2;232;49;46m,\u001b[0m\u001b[38;2;254;57;50m;\u001b[0m\u001b[38;2;244;53;48m;\u001b[0m\u001b[38;2;237;48;49m,\u001b[0m\u001b[38;2;159;13;34m.\u001b[0m\u001b[38;2;2;1;2m \u001b[0m\u001b[38;2;1;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;5;6;7m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;29;29;28m \u001b[0m\u001b[38;2;199;203;209mK\u001b[0m\u001b[38;2;126;135;157mo\u001b[0m\u001b[38;2;124;133;155ml\u001b[0m\u001b[38;2;125;135;156mo\u001b[0m\u001b[38;2;79;86;103m,\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;3;2m \u001b[0m\u001b[38;2;25;25;25m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;55;59;63m.\u001b[0m\u001b[38;2;121;126;131ml\u001b[0m\u001b[38;2;133;136;141mo\u001b[0m\u001b[38;2;136;140;145mo\u001b[0m\u001b[38;2;148;151;156md\u001b[0m\u001b[38;2;172;173;177mk\u001b[0m\u001b[38;2;181;185;188mO\u001b[0m\u001b[38;2;51;52;54m.\u001b[0m\u001b[38;2;133;30;29m.\u001b[0m\u001b[38;2;207;47;41m,\u001b[0m\u001b[38;2;246;54;48m;\u001b[0m\u001b[38;2;229;42;47m,\u001b[0m\u001b[38;2;205;23;45m.\u001b[0m\u001b[38;2;198;18;44m.\u001b[0m\u001b[38;2;197;18;43m.\u001b[0m\u001b[38;2;199;18;43m.\u001b[0m\u001b[38;2;196;19;43m.\u001b[0m\u001b[38;2;28;2;6m \u001b[0m\u001b[38;2;34;2;9m \u001b[0m\u001b[38;2;70;3;17m \u001b[0m\u001b[38;2;66;2;17m \u001b[0m\u001b[38;2;1;0;1m \u001b[0m\u001b[38;2;198;41;38m'\u001b[0m\u001b[38;2;207;21;45m.\u001b[0m\u001b[38;2;201;17;44m.\u001b[0m\u001b[38;2;203;20;45m.\u001b[0m\u001b[38;2;238;49;48m,\u001b[0m\u001b[38;2;226;52;45m,\u001b[0m\u001b[38;2;106;25;24m.\u001b[0m\u001b[38;2;100;104;106m:\u001b[0m\u001b[38;2;180;186;191mO\u001b[0m\u001b[38;2;139;142;149mo\u001b[0m\u001b[38;2;108;106;114m:\u001b[0m\u001b[38;2;85;91;98m;\u001b[0m\u001b[38;2;108;88;94m;\u001b[0m\u001b[38;2;98;97;104m;\u001b[0m\u001b[38;2;112;111;119mc\u001b[0m\u001b[38;2;124;112;113mc\u001b[0m\u001b[38;2;174;97;89mc\u001b[0m\u001b[38;2;240;86;81mc\u001b[0m\u001b[38;2;224;42;46m,\u001b[0m\u001b[38;2;128;18;32m.\u001b[0m\u001b[38;2;134;12;34m.\u001b[0m\u001b[38;2;244;51;51m;\u001b[0m\u001b[38;2;213;37;52m'\u001b[0m\u001b[38;2;119;8;29m \u001b[0m\u001b[38;2;225;39;47m,\u001b[0m\u001b[38;2;175;28;42m.\u001b[0m\u001b[38;2;136;7;30m.\u001b[0m\u001b[38;2;58;1;14m \u001b[0m\u001b[38;2;1;3;2m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;61;61;61m.\u001b[0m\u001b[38;2;203;206;212mK\u001b[0m\u001b[38;2;126;135;156mo\u001b[0m\u001b[38;2;124;134;155mo\u001b[0m\u001b[38;2;125;135;157mo\u001b[0m\u001b[38;2;87;94;113m;\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;56;57;57m.\u001b[0m\u001b[38;2;169;171;172mk\u001b[0m\u001b[38;2;215;216;217mX\u001b[0m\u001b[38;2;233;234;235mW\u001b[0m\u001b[38;2;239;239;240mW\u001b[0m\u001b[38;2;232;233;233mN\u001b[0m\u001b[38;2;216;217;216mX\u001b[0m\u001b[38;2;184;184;184mO\u001b[0m\u001b[38;2;116;114;115mc\u001b[0m\u001b[38;2;46;11;12m \u001b[0m\u001b[38;2;162;36;37m.\u001b[0m\u001b[38;2;228;43;47m,\u001b[0m\u001b[38;2;217;32;45m'\u001b[0m\u001b[38;2;203;19;45m.\u001b[0m\u001b[38;2;195;17;43m.\u001b[0m\u001b[38;2;185;16;41m.\u001b[0m\u001b[38;2;177;16;39m.\u001b[0m\u001b[38;2;169;15;37m.\u001b[0m\u001b[38;2;162;14;35m.\u001b[0m\u001b[38;2;155;12;33m.\u001b[0m\u001b[38;2;56;4;14m \u001b[0m\u001b[38;2;3;4;2m \u001b[0m\u001b[38;2;140;144;161md\u001b[0m\u001b[38;2;55;57;64m.\u001b[0m\u001b[38;2;26;5;6m \u001b[0m\u001b[38;2;217;37;47m'\u001b[0m\u001b[38;2;203;18;44m.\u001b[0m\u001b[38;2;200;18;44m.\u001b[0m\u001b[38;2;199;18;44m.\u001b[0m\u001b[38;2;200;17;44m.\u001b[0m\u001b[38;2;218;36;46m'\u001b[0m\u001b[38;2;228;50;45m,\u001b[0m\u001b[38;2;199;45;37m'\u001b[0m\u001b[38;2;163;38;31m.\u001b[0m\u001b[38;2;165;41;35m'\u001b[0m\u001b[38;2;100;29;26m.\u001b[0m\u001b[38;2;53;54;55m.\u001b[0m\u001b[38;2;106;34;41m.\u001b[0m\u001b[38;2;178;88;89m:\u001b[0m\u001b[38;2;197;93;92mc\u001b[0m\u001b[38;2;194;55;57m,\u001b[0m\u001b[38;2;170;29;35m.\u001b[0m\u001b[38;2;121;10;27m.\u001b[0m\u001b[38;2;39;4;9m \u001b[0m\u001b[38;2;122;6;33m \u001b[0m\u001b[38;2;170;10;42m.\u001b[0m\u001b[38;2;182;17;43m.\u001b[0m\u001b[38;2;89;4;25m \u001b[0m\u001b[38;2;135;7;34m.\u001b[0m\u001b[38;2;127;4;31m \u001b[0m\u001b[38;2;44;12;17m \u001b[0m\u001b[38;2;3;4;3m \u001b[0m\u001b[38;2;3;5;4m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;21;22;24m \u001b[0m\u001b[38;2;71;74;83m'\u001b[0m\u001b[38;2;98;100;112m:\u001b[0m\u001b[38;2;50;51;57m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;123;123;123ml\u001b[0m\u001b[38;2;147;150;157md\u001b[0m\u001b[38;2;126;132;144ml\u001b[0m\u001b[38;2;82;91;107m;\u001b[0m\u001b[38;2;35;39;46m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;165;171;179mk\u001b[0m\u001b[38;2;245;248;250mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;252;253mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;191;194;197m0\u001b[0m\u001b[38;2;10;11;14m \u001b[0m\u001b[38;2;101;55;58m.\u001b[0m\u001b[38;2;144;128;130ml\u001b[0m\u001b[38;2;146;146;146md\u001b[0m\u001b[38;2;153;156;159mx\u001b[0m\u001b[38;2;160;165;169mx\u001b[0m\u001b[38;2;165;170;176mk\u001b[0m\u001b[38;2;170;177;183mk\u001b[0m\u001b[38;2;165;173;180mk\u001b[0m\u001b[38;2;146;153;160md\u001b[0m\u001b[38;2;37;38;40m.\u001b[0m\u001b[38;2;39;40;44m.\u001b[0m\u001b[38;2;143;147;163md\u001b[0m\u001b[38;2;58;59;66m.\u001b[0m\u001b[38;2;15;16;19m \u001b[0m\u001b[38;2;125;126;133ml\u001b[0m\u001b[38;2;125;101;103m:\u001b[0m\u001b[38;2;115;47;53m.\u001b[0m\u001b[38;2;130;12;29m.\u001b[0m\u001b[38;2;146;13;32m.\u001b[0m\u001b[38;2;165;14;36m.\u001b[0m\u001b[38;2;170;14;36m.\u001b[0m\u001b[38;2;82;8;18m \u001b[0m\u001b[38;2;137;139;140mo\u001b[0m\u001b[38;2;210;212;213mX\u001b[0m\u001b[38;2;244;245;245mM\u001b[0m\u001b[38;2;251;252;252mM\u001b[0m\u001b[38;2;222;223;223mN\u001b[0m\u001b[38;2;198;199;199m0\u001b[0m\u001b[38;2;189;189;189m0\u001b[0m\u001b[38;2;194;195;195m0\u001b[0m\u001b[38;2;214;215;215mX\u001b[0m\u001b[38;2;226;226;226mN\u001b[0m\u001b[38;2;91;91;93m;\u001b[0m\u001b[38;2;40;2;11m \u001b[0m\u001b[38;2;87;40;47m.\u001b[0m\u001b[38;2;79;75;83m'\u001b[0m\u001b[38;2;100;102;113m:\u001b[0m\u001b[38;2;102;104;116m:\u001b[0m\u001b[38;2;113;117;130mc\u001b[0m\u001b[38;2;131;135;150mo\u001b[0m\u001b[38;2;123;126;141ml\u001b[0m\u001b[38;2;113;115;129mc\u001b[0m\u001b[38;2;100;102;114m:\u001b[0m\u001b[38;2;84;87;95m,\u001b[0m\u001b[38;2;46;47;52m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;68;70;79m'\u001b[0m\u001b[38;2;119;123;138ml\u001b[0m\u001b[38;2;135;139;155mo\u001b[0m\u001b[38;2;136;140;157mo\u001b[0m\u001b[38;2;112;114;127mc\u001b[0m\u001b[38;2;87;88;98m,\u001b[0m\u001b[38;2;70;71;78m'\u001b[0m\u001b[38;2;64;65;72m.\u001b[0m\u001b[38;2;70;72;80m'\u001b[0m\u001b[38;2;88;89;100m;\u001b[0m\u001b[38;2;66;66;74m'\u001b[0m\u001b[38;2;50;55;60m.\u001b[0m\u001b[38;2;121;131;143ml\u001b[0m\u001b[38;2;149;159;171mx\u001b[0m\u001b[38;2;162;171;182mk\u001b[0m\u001b[38;2;166;173;185mk\u001b[0m\u001b[38;2;166;174;185mk\u001b[0m\u001b[38;2;165;173;185mk\u001b[0m\u001b[38;2;160;169;182mk\u001b[0m\u001b[38;2;149;160;175mx\u001b[0m\u001b[38;2;139;150;166md\u001b[0m\u001b[38;2;42;45;50m.\u001b[0m\u001b[38;2;59;62;65m.\u001b[0m\u001b[38;2;122;129;136ml\u001b[0m\u001b[38;2;104;111;119m:\u001b[0m\u001b[38;2;88;94;101m;\u001b[0m\u001b[38;2;74;79;84m,\u001b[0m\u001b[38;2;64;68;73m'\u001b[0m\u001b[38;2;60;62;68m.\u001b[0m\u001b[38;2;72;74;81m'\u001b[0m\u001b[38;2;83;85;94m,\u001b[0m\u001b[38;2;101;103;114m:\u001b[0m\u001b[38;2;130;133;149mo\u001b[0m\u001b[38;2;139;141;158mo\u001b[0m\u001b[38;2;103;105;117m:\u001b[0m\u001b[38;2;28;28;32m \u001b[0m\u001b[38;2;89;98;109m;\u001b[0m\u001b[38;2;144;151;161md\u001b[0m\u001b[38;2;173;178;186mO\u001b[0m\u001b[38;2;180;185;191mO\u001b[0m\u001b[38;2;181;186;192mO\u001b[0m\u001b[38;2;162;167;171mx\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;120;124;131ml\u001b[0m\u001b[38;2;235;240;247mW\u001b[0m\u001b[38;2;244;247;249mM\u001b[0m\u001b[38;2;250;251;252mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;253mM\u001b[0m\u001b[38;2;252;253;252mM\u001b[0m\u001b[38;2;250;251;252mM\u001b[0m\u001b[38;2;242;245;248mM\u001b[0m\u001b[38;2;223;231;240mN\u001b[0m\u001b[38;2;125;133;145ml\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;107;109;121m:\u001b[0m\u001b[38;2;139;142;157mo\u001b[0m\u001b[38;2;137;141;156mo\u001b[0m\u001b[38;2;136;140;156mo\u001b[0m\u001b[38;2;136;140;156mo\u001b[0m\u001b[38;2;135;139;155mo\u001b[0m\u001b[38;2;135;139;155mo\u001b[0m\u001b[38;2;135;139;154mo\u001b[0m\u001b[38;2;135;138;154mo\u001b[0m\u001b[38;2;128;130;145ml\u001b[0m\u001b[38;2;100;100;110m:\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;13;13;14m \u001b[0m\u001b[38;2;49;51;56m.\u001b[0m\u001b[38;2;69;71;79m'\u001b[0m\u001b[38;2;84;86;96m,\u001b[0m\u001b[38;2;95;96;108m;\u001b[0m\u001b[38;2;104;106;118m:\u001b[0m\u001b[38;2;111;113;127mc\u001b[0m\u001b[38;2;116;118;133mc\u001b[0m\u001b[38;2;121;123;139ml\u001b[0m\u001b[38;2;117;120;134mc\u001b[0m\u001b[38;2;108;109;121m:\u001b[0m\u001b[38;2;103;104;115m:\u001b[0m\u001b[38;2;102;103;115m:\u001b[0m\u001b[38;2;101;102;113m:\u001b[0m\u001b[38;2;100;102;113m:\u001b[0m\u001b[38;2;100;102;113m:\u001b[0m\u001b[38;2;99;101;113m:\u001b[0m\u001b[38;2;102;104;115m:\u001b[0m\u001b[38;2;107;109;122m:\u001b[0m\u001b[38;2;113;116;129mc\u001b[0m\u001b[38;2;119;122;136ml\u001b[0m\u001b[38;2;125;128;143ml\u001b[0m\u001b[38;2;130;134;150mo\u001b[0m\u001b[38;2;135;139;155mo\u001b[0m\u001b[38;2;137;141;157mo\u001b[0m\u001b[38;2;137;141;157mo\u001b[0m\u001b[38;2;136;141;157mo\u001b[0m\u001b[38;2;136;140;157mo\u001b[0m\u001b[38;2;135;140;156mo\u001b[0m\u001b[38;2;135;140;156mo\u001b[0m\u001b[38;2;135;139;156mo\u001b[0m\u001b[38;2;135;139;156mo\u001b[0m\u001b[38;2;136;140;157mo\u001b[0m\u001b[38;2;135;138;155mo\u001b[0m\u001b[38;2;123;125;140ml\u001b[0m\u001b[38;2;111;114;126mc\u001b[0m\u001b[38;2;99;101;112m:\u001b[0m\u001b[38;2;86;88;98m,\u001b[0m\u001b[38;2;74;75;83m'\u001b[0m\u001b[38;2;61;62;68m.\u001b[0m\u001b[38;2;33;35;38m.\u001b[0m\u001b[38;2;64;68;74m'\u001b[0m\u001b[38;2;107;116;128mc\u001b[0m\u001b[38;2;122;132;145ml\u001b[0m\u001b[38;2;129;139;153mo\u001b[0m\u001b[38;2;134;143;157mo\u001b[0m\u001b[38;2;138;147;159md\u001b[0m\u001b[38;2;138;147;159md\u001b[0m\u001b[38;2;135;144;158mo\u001b[0m\u001b[38;2;129;139;154mo\u001b[0m\u001b[38;2;121;131;144ml\u001b[0m\u001b[38;2;94;101;110m:\u001b[0m\u001b[38;2;20;23;25m \u001b[0m\u001b[38;2;74;77;86m'\u001b[0m\u001b[38;2;122;125;139ml\u001b[0m\u001b[38;2;119;122;135ml\u001b[0m\u001b[38;2;114;118;130mc\u001b[0m\u001b[38;2;108;111;123mc\u001b[0m\u001b[38;2;100;102;114m:\u001b[0m\u001b[38;2;90;93;103m;\u001b[0m\u001b[38;2;79;80;90m,\u001b[0m\u001b[38;2;63;64;71m.\u001b[0m\u001b[38;2;38;38;42m.\u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;14;14;16m \u001b[0m\u001b[38;2;32;33;36m \u001b[0m\u001b[38;2;45;45;50m.\u001b[0m\u001b[38;2;53;54;60m.\u001b[0m\u001b[38;2;60;61;68m.\u001b[0m\u001b[38;2;65;67;74m'\u001b[0m\u001b[38;2;70;72;80m'\u001b[0m\u001b[38;2;75;77;85m'\u001b[0m\u001b[38;2;78;80;89m,\u001b[0m\u001b[38;2;81;84;93m,\u001b[0m\u001b[38;2;84;86;96m,\u001b[0m\u001b[38;2;85;88;98m,\u001b[0m\u001b[38;2;88;91;101m;\u001b[0m\u001b[38;2;89;92;102m;\u001b[0m\u001b[38;2;89;92;103m;\u001b[0m\u001b[38;2;90;94;104m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;93;96;107m;\u001b[0m\u001b[38;2;91;93;105m;\u001b[0m\u001b[38;2;90;92;103m;\u001b[0m\u001b[38;2;90;92;103m;\u001b[0m\u001b[38;2;91;93;103m;\u001b[0m\u001b[38;2;92;92;102m;\u001b[0m\u001b[38;2;84;85;93m,\u001b[0m\u001b[38;2;67;67;72m'\u001b[0m\u001b[38;2;38;39;41m.\u001b[0m\u001b[38;2;5;6;6m \u001b[0m\u001b[38;2;0;1;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;2;2;2m \u001b[0m\u001b[38;2;1;2;2m \u001b[0m\u001b[38;2;0;1;1m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\n\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m\u001b[38;2;0;0;0m \u001b[0m"
  },
  {
    "path": "service/nbakery/options.mk",
    "content": "IMGSIZE=1024\n"
  },
  {
    "path": "service/nitro/postinst/00-nitro.sh",
    "content": "#!/bin/sh\n\n# bare minimum\nmknod -m 600 dev/console c 0 0\nmknod -m 666 dev/null c 2 2\n\nmkdir -p packages\nif [ \"$ARCH\" = \"amd64\" ]; then # I keep the binary package updated\n\tVERSION=0.5\n\t${FETCH} -o packages/nitro.tgz https://imil.net/NetBSD/nitro-${VERSION}.tgz?$RANDOM\nelse\n\tPKGARCH=${ARCH#evbarm-}\n\t${FETCH} -o packages/nitro.tgz https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/${PKGARCH}/nitro-*\nfi\n\nPREFIX=usr/pkg\nmkdir -p ${PREFIX}\n$TAR zxvfp packages/nitro.tgz --exclude='+*' -C ${PREFIX}\n\nmv ${PREFIX}/sbin/nitro sbin/init\nfor d in var/run/nitro ${PREFIX}/etc/nitro/SYS ${PREFIX}/etc/nitro/getty-0\ndo\n\tmkdir -p $d\ndone\n\nln -sf /var/run/nitro/nitro.sock ${PREFIX}/etc/nitro.sock\n\ncat >${PREFIX}/etc/nitro/SYS/setup<<EOF\n#!/bin/sh\n\ncd /dev\nsh MAKEDEV -M -M all\ncd -\nEOF\nchmod +x ${PREFIX}/etc/nitro/SYS/setup\n\ncat >${PREFIX}/etc/nitro/getty-0/run<<EOF\n#!/bin/sh\nexec /usr/libexec/getty Pc constty\nEOF\ncat >${PREFIX}/etc/nitro/getty-0/finish<<EOF\n#!/bin/sh\nexit 0\nEOF\nfor s in run finish\ndo\n\tchmod +x ${PREFIX}/etc/nitro/getty-0/$s\ndone\n\ncat >etc/motd<<EOF\n\nWelcome to nitroBSD! 🔥\n\nEOF\n"
  },
  {
    "path": "service/nitrosshd/NETBSD_ONLY",
    "content": ""
  },
  {
    "path": "service/nitrosshd/README.md",
    "content": "# nitroSSHd\n\nThis microservice starts an _OpenSSH_ daemon with the [nitro][1] `init` system.\n\nAs it uses `union` `tmpfs` which is unsupported with `ext2`, it must be built with either a _NetBSD_ host or the [builder image][2].  \nAdd the desired SSH public keys in the `service/nitrosshd/etc` directory in file(s) ending with `.pub`.\n\nBuilding on GNU/Linux or MacOS\n```sh\n$ bmake SERVICE=nitrosshd build\n```\nBuilding on NetBSD\n```sh\n$ make SERVICE=nitrosshd base\n```\nStart the service:\n```sh\n$ ./startnb.sh -f etc/nitrosshd.conf\n```\nYou can now `ssh` to the service using the `ssh` user:\n```sh\n$ ssh -p 2022 ssh@localhost\n```\nBy default it listens at port 2022, you can change it in `etc/nitrosshd.conf`.\n\n[1]: https://github.com/leahneukirchen/nitro\n[2]: https://github.com/NetBSDfr/smolBSD/tree/main/service/build\n"
  },
  {
    "path": "service/nitrosshd/options.mk",
    "content": "MOUNTRO=y\n"
  },
  {
    "path": "service/nitrosshd/postinst/00-nitro.sh",
    "content": "#!/bin/sh\n\n# bare minimum\nmknod -m 600 dev/console c 0 0\nmknod -m 666 dev/null c 2 2\n\nmkdir -p packages\nVERSION=0.4.1\n${FETCH} -o packages/nitro.tgz https://imil.net/NetBSD/nitro-${VERSION}.tgz?$RANDOM\n\nPREFIX=usr/pkg\nmkdir -p ${PREFIX}\n$TAR zxvfp packages/nitro.tgz --exclude='+*' -C ${PREFIX}\n\nmv ${PREFIX}/sbin/nitro sbin/init\nfor d in var/run/nitro \\\n\t${PREFIX}/etc/nitro/SYS \\\n\t${PREFIX}/etc/nitro/LOG \\\n\t${PREFIX}/etc/nitro/sshd home\ndo\n\tmkdir -p ${d}\ndone\n\nln -sf /var/run/nitro/nitro.sock ${PREFIX}/etc/nitro.sock\n\n# ptyfs is needed to provide ttys to clients\necho \"ptyfs /dev/pts ptyfs rw 0 0\" >> etc/fstab\n\n# we want sshd to be the main process\necho 'sshd_flags=\"-D -e\"' >> etc/rc.conf\necho 'UseDNS no' >> etc/ssh/sshd_config\n\n# if running an agent\nssh-add -L >etc/ssh/authorized_keys 2>/dev/null\npubkeys=\"../service/nitrosshd/etc/*.pub\"\nls $pubkeys >/dev/null 2>&1 && \\\n\tcat $pubkeys >>etc/ssh/authorized_keys\n\ncat >${PREFIX}/etc/nitro/SYS/setup<<EOF\n#!/bin/sh\n\ncd /dev\nsh MAKEDEV -M -M all\ncd -\n\n. /etc/include/basicrc\n\nmount -t tmpfs -o -s1M tmpfs /home\nmount -t tmpfs -o -s10M tmpfs /tmp\nmount -t tmpfs -o -s1M -o union tmpfs /var/run\nmount -t tmpfs -o -s10M -o union tmpfs /var/log\nmount -t tmpfs -o -s20M -o union tmpfs /etc\n# union mount is not recursive\nmount -t tmpfs -o -s1M -o union tmpfs /etc/ssh\n\nexit 0\nEOF\nchmod +x ${PREFIX}/etc/nitro/SYS/setup\ncat >${PREFIX}/etc/nitro/LOG/run<<EOF\n#!/bin/sh\nexec cat >/dev/console 2>&1\nEOF\nchmod +x ${PREFIX}/etc/nitro/LOG/run\ncat >${PREFIX}/etc/nitro/sshd/run<<EOF\n#!/bin/sh\nexec 2>&1\nuseradd -m ssh\nmkdir -p /home/ssh/.ssh\n[ -f /etc/ssh/authorized_keys ] && \\\n\tcp -f /etc/ssh/authorized_keys /home/ssh/.ssh ||\n\techo \"/!\\ NO PUBLIC KEY, copy your SSH public key in service/${SERVICE}/etc/ssh\"\nchown -R ssh /home/ssh\n\n/etc/rc.d/sshd onestart\nEOF\ncat >${PREFIX}/etc/nitro/sshd/finish<<EOF\n#!/bin/sh\nexit 0\nEOF\nfor s in run finish\ndo\n\tchmod +x ${PREFIX}/etc/nitro/sshd/$s\ndone\n"
  },
  {
    "path": "service/nitrosshd/postinst/keygen.sh",
    "content": "# taken from NetBSD's /etc/rc.d/sshd\nkeygen=\"/usr/bin/ssh-keygen\"\numask 022\nnew_key_created=false\nwhile read type bits filename;  do\n\tf=\"etc/ssh/$filename\"\n\tcase \"${bits}\" in\n\t-1)     bitarg=;;\n\t0)      bitarg=\"${ssh_keygen_flags}\";;\n\t*)      bitarg=\"-b ${bits}\";;\n\tesac\n\t\"${keygen}\" -t \"${type}\" ${bitarg} -f \"${f}\" -N '' -q && \\\n\t    printf \"ssh-keygen: \" && \"${keygen}\" -f \"${f}\" -l\n\tnew_key_created=true\ndone << _EOF\necdsa   -1      ssh_host_ecdsa_key\ned25519 -1      ssh_host_ed25519_key\nrsa     0       ssh_host_rsa_key\n_EOF\n"
  },
  {
    "path": "service/pipe/etc/rc",
    "content": "export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\n\n[ ! -f \"/dev/MAKEDEV\" ] && cp -f /etc/MAKEDEV* /dev\n\ndmesg | grep -q viocon && \\\n\t(cd /dev && ./MAKEDEV ttyVI01 ttyVI02 && chmod 666 /dev/ttyVI*) || \\\n\techo \"no viocon(4) support\"\n\nwhile read cmd; do\n\teval \"$cmd\"\ndone < /dev/ttyVI02\n"
  },
  {
    "path": "service/pipe/options.mk",
    "content": ".if defined(MINIMIZE) && ${MINIMIZE} == y\nADDPKGS=pkgin pkg_tarup pkg_install sqlite3 rsync curl\n.endif\n"
  },
  {
    "path": "service/pipe/sailor.conf",
    "content": ". /service/common/sailor.vars\n\nshipname=pipe\n"
  },
  {
    "path": "service/rescue/etc/rc",
    "content": "#!/bin/sh\n\nexport HOME=/\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/rescue\numask 022\n\n[ \"$(sysctl -n kern.root_device)\" = \"md0\" ] || mount -a\n\nsh\n"
  },
  {
    "path": "service/rescue/options.mk",
    "content": "SETS=rescue.${SETSEXT} etc.${SETSEXT}\nIMGSIZE=20\nMOUNTRO=y\n"
  },
  {
    "path": "service/runbsd/etc/banner.ans",
    "content": "\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;252;48;5;252m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;251;48;5;251m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;253;48;5;253m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;253;48;5;253m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;253;48;5;253m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;253;48;5;253m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;255;48;5;255m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;243;48;5;242m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;237;48;5;237m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;7;48;5;7m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;234;48;5;234m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;255;48;5;255m▓\u001b[38;5;255;48;5;255m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;242;48;5;241m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;238;48;5;238m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;232;48;5;233m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;243;48;5;243m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;241;48;5;59m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;232;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;196;48;5;196m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[0m"
  },
  {
    "path": "service/runbsd/etc/fstab",
    "content": "ROOT.a\t\t/\t\tffs\trw\t\t\t1\t1\nptyfs\t\t/dev/pts\tptyfs\trw\t\t\t0\t0\nkernfs\t\t/kern\t\tkernfs\trw,noauto\t\t0\t0\nprocfs\t\t/proc\t\tprocfs\trw,noauto\t\t0\t0\ntmpfs\t\t/var/shm\ttmpfs\trw,-m1777,-sram%25\t0\t0\n"
  },
  {
    "path": "service/runbsd/etc/rc",
    "content": "#!/bin/sh\n\nexport HOME=/\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\numask 022\n\n# tmpfs dev is usually done by init(8)\ncd /dev\n# /dev is a union fs, permissions are recorded and bad\n# after reboot for those. MAKEDEV doesn't re-create them\n# and -f fails with \"-f option works only with mknod\"\nsh MAKEDEV -M -M all\ncd -\n\nmount -a\n\n[ -f /etc/rc.conf ] && . /etc/rc.conf\n\n/etc/rc.d/bootconf.sh start\n\n# basic services to start at boot\nSTARTSVC=\"\nttys\nsysctl\nentropy\nnetwork\nlocal\n\"\n\nfor svc in $STARTSVC\ndo\n\t/etc/rc.d/${svc} start\ndone\n"
  },
  {
    "path": "service/runbsd/etc/rc.conf",
    "content": "\n[ -r /etc/defaults/rc.conf ] && . /etc/defaults/rc.conf\n\nrc_configured=YES\nifconfig_vioif0=\"inet 10.0.2.15/24\"\ndefaultroute=\"10.0.2.2\"\nhostname=\"runbsd\"\nwscons=YES\n# runit needs the service to not bg\nsshd_flags=\"-D\"\n"
  },
  {
    "path": "service/runbsd/etc/sysctl.conf",
    "content": "# this takes ages\nnet.inet6.ip6.dad_count=0\n"
  },
  {
    "path": "service/runbsd/postinst/00-runit.sh",
    "content": "#!/bin/sh\n\n# https://smarden.org/runit/replaceinit\n# switch from /sbin/init to runit!\n\nPKGURL=\"https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/${ARCH}/${PKGVERS}.0/All\"\nRUNPKG=$(curl -L -s ${PKGURL}|sed -nE \"s/.*(runit-[a-z0-9\\.]+).*/\\1/p\")\n\nmkdir -p usr/pkg\ncurl -L -o- -s ${PKGURL}/${RUNPKG} | $TAR zxvfp - --exclude='+*' -C usr/pkg\n\nmkdir -p etc/runit\ncp -p usr/pkg/share/examples/runit/openbsd/1 etc/runit/\nsed 's/local/pkg/g' usr/pkg/share/examples/runit/openbsd/2 > etc/runit/2\nsed 's,/command,/command:/usr/pkg/bin:/usr/pkg/sbin,' \\\n\tusr/pkg/share/examples/runit/openbsd/3 > etc/runit/3\nchmod +x etc/runit/[123]\ninstall -m 0500 usr/pkg/sbin/runit* sbin/\nmkdir -p etc/sv/getty-0\ncat >etc/sv/getty-0/run<<EOF\n#!/bin/sh\nexec /usr/libexec/getty Pc constty\nEOF\ncat >etc/sv/getty-0/finish<<EOF\n#!/bin/sh\nexit 0\nEOF\nfor s in run finish\ndo\n\tchmod +x etc/sv/getty-0/$s\ndone\nmkdir -p service\nln -s /etc/sv/getty-0 service/\ncp -p sbin/init sbin/init.bsd\ncp -p sbin/runit-init sbin/init\n"
  },
  {
    "path": "service/runbsd/postinst/01-sv.sh",
    "content": "#!/bin/sh\n\nmkdir -p etc/sv/sshd\nfor l in run finish\ndo\n\tln -s /bin/rcd2run.sh etc/sv/sshd/$l\ndone\n\nln -s /etc/sv/sshd service/\n\n"
  },
  {
    "path": "service/runbsd/postinst/02-tools.sh",
    "content": "#!/bin/sh\n\n# script to use /etc/rc.d as runit run/finish\n\ncat >bin/rcd2run.sh<<EOF\n#!/bin/sh\nexec 2>&1\n\nDIR_PATH=\\$(pwd)\nPROG_NAME=\\$(basename \"\\$0\")\nSERVICE_NAME=\\$(basename \"\\$DIR_PATH\")\n\ncase \"\\$PROG_NAME\" in\nrun)\n        ACTION=\"onestart\"\n        ;;\nfinish)\n        ACTION=\"onestop\"\n        ;;\n*)\n        echo \"unsupported\"\n        exit 1\n        ;;\nesac\n\nexec /etc/rc.d/\"\\$SERVICE_NAME\" \"\\$ACTION\"\nEOF\nchmod +x bin/rcd2run.sh\n"
  },
  {
    "path": "service/sshd/README.md",
    "content": "# SSHd service\n\nThis microservice starts an _OpenSSH_ daemon.\n\nAs it uses `union` `tmpfs` which is unsupported with `ext2`, it must be built with either a _NetBSD_ host or the [builder image][1].  \nAdd the desired SSH public keys in the `service/sshd/etc` directory in file(s) ending with `.pub`.\n\nBuilding on GNU/Linux or MacOS\n```sh\n$ bmake SERVICE=sshd build\n```\nBuilding on NetBSD\n```sh\n$ make SERVICE=sshd base\n```\nStart the service:\n```sh\n$ ./startnb.sh -f etc/sshd.conf\n```\nYou can now `ssh` to the service using the `ssh` user:\n```sh\n$ ssh -p 2022 ssh@localhost\n```\nBy default it listens at port 2022, you can change it in `etc/sshd.conf`.\n\n[1]: https://github.com/NetBSDfr/smolBSD/tree/main/service/build\n"
  },
  {
    "path": "service/sshd/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n\nmount -t tmpfs -o -s1M tmpfs /home\nmount -t tmpfs -o -s10M tmpfs /tmp\nmount -t tmpfs -o -s10M tmpfs /var/log\nmount -t tmpfs -o -s1M tmpfs /var/run\nmount -t tmpfs -o -s10M -o union tmpfs /etc\n\nuseradd -m ssh\nmkdir -p /home/ssh/.ssh\ncp -f /etc/ssh/authorized_keys /home/ssh/.ssh\nchown -R ssh /home/ssh\n\n/etc/rc.d/sshd onestart\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/sshd/options.mk",
    "content": ".if defined(MINIMIZE) && ${MINIMIZE} == y\nADDPKGS=pkgin pkg_tarup pkg_install sqlite3 rsync curl\n.endif\n"
  },
  {
    "path": "service/sshd/postinst/keygen.sh",
    "content": "# taken from NetBSD's /etc/rc.d/sshd\nkeygen=\"/usr/bin/ssh-keygen\"\numask 022\nnew_key_created=false\nwhile read type bits filename;  do\n\tf=\"etc/ssh/$filename\"\n\tcase \"${bits}\" in\n\t-1)     bitarg=;;\n\t0)      bitarg=\"${ssh_keygen_flags}\";;\n\t*)      bitarg=\"-b ${bits}\";;\n\tesac\n\t\"${keygen}\" -t \"${type}\" ${bitarg} -f \"${f}\" -N '' -q && \\\n\t    printf \"ssh-keygen: \" && \"${keygen}\" -f \"${f}\" -l\n\tnew_key_created=true\ndone << _EOF\necdsa   -1      ssh_host_ecdsa_key\ned25519 -1      ssh_host_ed25519_key\nrsa     0       ssh_host_rsa_key\n_EOF\n# we want sshd to be the main process\necho 'sshd_flags=\"-D -e\"' >> etc/rc.conf\necho 'UseDNS no' >> etc/ssh/sshd_config\nsed -i'' 's/^UsePAM/# UsePAM/' etc/ssh/sshd_config\n\nssh-add -L >etc/ssh/authorized_keys\npubkeys=\"../service/sshd/etc/*.pub\"\nls $pubkeys >/dev/null 2>&1 && \\\n\tcat $pubkeys >>etc/ssh/authorized_keys\n\nmkdir -p home var/cache\n"
  },
  {
    "path": "service/sshd/sailor.conf",
    "content": ". /service/common/sailor.vars\n\nshipname=sshd\nshipbins=\"$shipbins /bin/ksh /usr/sbin/sshd /usr/bin/ssh-keygen /usr/libexec/sshd-session /usr/libexec/sshd-auth /usr/bin/ssh\"\nrun_at_build=\"mkdir -p /var/chroot/sshd\"\n"
  },
  {
    "path": "service/systembsd/etc/banner.ans",
    "content": "\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;235;48;5;235m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;235m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;234;48;5;234m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;17;48;5;16m \u001b[38;5;17;48;5;16m \u001b[38;5;17;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;17;48;5;16m \u001b[38;5;17;48;5;16m \u001b[38;5;17;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;237;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;52m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;237;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;52m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;237;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;237;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;95m▒\u001b[38;5;209;48;5;95m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;233;48;5;233m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;236;48;5;236m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;172;48;5;232m \u001b[38;5;172;48;5;232m \u001b[38;5;136;48;5;232m \u001b[38;5;221;48;5;235m▒\u001b[38;5;221;48;5;235m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;17;48;5;17m \u001b[38;5;17;48;5;17m \u001b[38;5;17;48;5;233m \u001b[38;5;17;48;5;233m \u001b[38;5;17;48;5;233m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;136;48;5;234m░\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;95m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;95m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;246;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;247;48;5;247m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;244;48;5;244m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;243;48;5;242m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;232;48;5;232m▓\u001b[38;5;209;48;5;236m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;235;48;5;235m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;242;48;5;241m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;237m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;52;48;5;233m \u001b[38;5;52;48;5;233m \u001b[38;5;52;48;5;233m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;235;48;5;235m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;254;48;5;254m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;240;48;5;240m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;235;48;5;235m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;1m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;247;48;5;247m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;94m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;232;48;5;233m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;231;48;5;231m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;52m░\u001b[38;5;209;48;5;233m░\u001b[38;5;209;48;5;233m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;239;48;5;239m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;234m░\u001b[38;5;209;48;5;52m▒\u001b[38;5;209;48;5;52m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;233m \u001b[38;5;209;48;5;233m \u001b[38;5;209;48;5;233m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;247;48;5;246m▓\u001b[38;5;102;48;5;102m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;52;48;5;232m \u001b[38;5;209;48;5;233m \u001b[38;5;209;48;5;233m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;52;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;1m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;203m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;203m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;52;48;5;232m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;131m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;209m░\u001b[38;5;209;48;5;131m▒\u001b[38;5;52;48;5;232m \u001b[38;5;52;48;5;232m \u001b[38;5;52;48;5;232m \u001b[38;5;52;48;5;232m \u001b[38;5;52;48;5;232m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;52m░\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;52;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;167m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;52;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;52;48;5;232m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;52;48;5;16m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;52;48;5;232m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;203m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;1m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;52;48;5;16m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;203m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;1m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;1m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m░\u001b[38;5;52;48;5;233m \u001b[38;5;52;48;5;233m \u001b[38;5;52;48;5;233m \u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;167m░\u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;209m \u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;130m▒\u001b[38;5;209;48;5;94m▒\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[38;5;16;48;5;16m▓\u001b[0m\n\u001b[0m"
  },
  {
    "path": "service/systembsd/etc/dinit.d/boot",
    "content": "type = internal\n\ndepends-ms: getty\n\nwaits-for.d: boot.d\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/getty",
    "content": "type = process\ncommand = /usr/libexec/getty Pc constty\ntermsignal = HUP\nsmooth-recovery = true\n\ndepends-on: motd\ndepends-on: loginready\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/loginready",
    "content": "type = internal\nrestart = false\noptions = runs-on-console\n\ndepends-on: rc.boot\nwaits-for: rc.fs\nwaits-for: syslogd\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/motd",
    "content": "type = scripted\ncommand = /etc/rc.d/motd start\nrestart = false\n\ndepends-on: rc.fs\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.boot",
    "content": "type = scripted\ncommand = /etc/dinit.d/rc.boot.sh\nrestart = false\nlogfile = /var/log/rc.boot.log\n\ndepends-on: rc.fs\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.boot.sh",
    "content": "#!/bin/sh\n\n# basic services to start at boot\nSTARTSVC=\"\nbootconf.sh\nttys\nsysctl\nentropy\nnetwork\nlocal\n\"\n\nfor svc in $STARTSVC\ndo\n\t/etc/rc.d/${svc} start\ndone\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.dev",
    "content": "# tmpfs dev needs to execute before mounting\ntype = scripted\ncommand = /etc/dinit.d/rc.dev.sh\nrestart = false\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.dev.sh",
    "content": "#!/bin/sh\n\n# tmpfs dev is usually done by init(8)\ncd /dev\n# /dev is a union fs, permissions are recorded and bad\n# after reboot for those. MAKEDEV doesn't re-create them\n# and -f fails with \"-f option works only with mknod\"\nrm -f tty null std*\nsh MAKEDEV -M -M all\ncd -\n\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.fs",
    "content": "type = scripted\ncommand = /etc/dinit.d/rc.fs.sh start\nstop-command = /etc/dinit.d/rc.fs.sh stop\nrestart = false\noptions = starts-rwfs\n\ndepends-on: rc.dev\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/rc.fs.sh",
    "content": "#!/bin/sh\n\n/etc/rc.d/mountcritlocal $1\n/etc/rc.d/mountcritremote $1\n# only this one has start/stop\n/etc/rc.d/mountall $1\n\nif [ \"$1\" = \"stop\" ]; then\n\tfor fs in /dev/pts /dev\n\tdo\n\t\t/sbin/umount -f $fs\n\tdone\nfi\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/sshd",
    "content": "type = scripted\ncommand = /etc/rc.d/sshd onestart\n\ndepends-on: loginready\n\nwaits-for: syslogd\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/syslogd",
    "content": "type = scripted\ncommand = /etc/rc.d/syslogd onestart\nstop-command = /etc/rc.d/syslogd onestop\n\noptions: starts-log\n\ndepends-on: rc.boot\n"
  },
  {
    "path": "service/systembsd/etc/dinit.d/wscons",
    "content": "type = scripted\ncommand = /etc/rc.d/wscons start\n\ndepends-on: loginready\n"
  },
  {
    "path": "service/systembsd/etc/fstab",
    "content": "ROOT.a\t\t/\t\tffs\trw\t\t\t1\t1\nptyfs\t\t/dev/pts\tptyfs\trw\t\t\t0\t0\nkernfs\t\t/kern\t\tkernfs\trw,noauto\t\t0\t0\nprocfs\t\t/proc\t\tprocfs\trw,noauto\t\t0\t0\ntmpfs\t\t/var/shm\ttmpfs\trw,-m1777,-sram%25\t0\t0\n"
  },
  {
    "path": "service/systembsd/etc/rc",
    "content": "#!/bin/sh\n\nexport HOME=/\nexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/bin:/usr/pkg/sbin\numask 022\n\n/sbin/mount -a\n\n# tmpfs dev is usually done by init(8)\ncd /dev\n# /dev is a union fs, permissions are recorded and bad\n# after reboot for those. MAKEDEV doesn't re-create them\n# and -f fails with \"-f option works only with mknod\"\nrm -f tty null std*\nsh MAKEDEV -M -M all\ncd -\n\n[ -f /etc/rc.conf ] && . /etc/rc.conf\n\n/etc/rc.d/bootconf.sh start\n\n# basic services to start at boot\nSTARTSVC=\"\nttys\nsysctl\nentropy\nnetwork\nlocal\n\"\n\nfor svc in $STARTSVC\ndo\n\t/etc/rc.d/${svc} start\ndone\n# dinit needs /var/run to be mounted in order to create\n# its socket\n#/sbin/dinit -m\n"
  },
  {
    "path": "service/systembsd/etc/rc.conf",
    "content": "\n[ -r /etc/defaults/rc.conf ] && . /etc/defaults/rc.conf\n\nrc_configured=YES\nifconfig_vioif0=\"inet 10.0.2.15/24\"\ndefaultroute=\"10.0.2.2\"\nhostname=\"systembsd\"\nwscons=YES\n# runit needs the service to not bg\n#sshd_flags=\"-D\"\n"
  },
  {
    "path": "service/systembsd/etc/rc.local",
    "content": "# for design porposes, make root shell ksh\ngrep -q '^root.*bin/sh' /etc/passwd && \\\n\tusermod -s /bin/ksh root || true\n"
  },
  {
    "path": "service/systembsd/etc/sysctl.conf",
    "content": "# this takes ages\nnet.inet6.ip6.dad_count=0\n"
  },
  {
    "path": "service/systembsd/postinst/00-dinit.sh",
    "content": "#!/bin/sh\n\n# bare minimum\nmknod -m 600 dev/console c 0 0\nmknod -m 600 dev/constty c 0 1\nmknod -m 666 dev/tty c 1 0\nmknod -m 666 dev/null c 2 2\nmknod -m 666 dev/stdin c 22 0\nmknod -m 666 dev/stdout c 22 1\nmknod -m 666 dev/stderr c 22 2\n\nmkdir -p packages\n# dinit is not yet part of a pkgsrc release\n${FETCH} -o packages/dinit.tgz https://imil.net/NetBSD/dinit-0.19.3nb2.tgz\n\nmkdir -p usr/pkg\n$TAR zxvfp packages/dinit.tgz --exclude='+*' -C usr/pkg\n\nmv usr/pkg/sbin/dinit sbin/init\n"
  },
  {
    "path": "service/systembsd/postinst/01-custom.sh",
    "content": "#!/bin/sh\n\ncat >>root/.shrc<<EOF\nLANG=en_US.UTF-8; export LANG\n\nalias d='dinitctl'\nalias shutdown=\"dinitctl shutdown\"\n\n[ \"\\$SHELL\" = \"/bin/ksh\" ] && \\\n\tPS1=\"\\$(printf '\\e[1;37msystem\\e[1;31mBSD\\e[0m# ')\"\n\nlast \\UID | grep -q still || cat /etc/banner.ans\nprintf \"\\n%20s\\n\\n\" \" :: powered by 🚩 + smolBSD\"\nEOF\n"
  },
  {
    "path": "service/tiny/sailor.conf",
    "content": ". /service/common/sailor.vars\n\nshipname=tiny\n# add binaries to default ones (see in common/sailor.vars)\nshipbins=\"$shipbins /bin/ksh\"\n"
  },
  {
    "path": "service/tslog/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n. /etc/include/pkgin\n. /etc/include/mount9p\n\ncommand -v perl >/dev/null || pkgin -y in perl git-base\n\n# newer NetBSD versions use tmpfs for /dev, sailor copies MAKEDEV from /dev\ncp /etc/MAKEDEV /dev/\n\nksh\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/usershell/README.md",
    "content": "# User Shell Service\n\n## About\n\nThis microservice starts a minimal user shell (`ksh`).\n\nIt comes with all typical _BSD_ shell tools and can also be used as an _SSH_ client.  \nIts size is about 50MB and can be loaded as an `initrd` / RAM disk with `startnb.sh` `-I` parameter.\n\nThis image is built with `MINIMIZE=y`, [sailor](https://github.com/NetBSDfr/sailor) `git clone` is needed\nbefore building.\n\n## Usage\n\n**Build**\n\n```sh\n$ bmake SERVICE=usershell build\n```\n\n**Run**\n\n```sh\n$ ./startnb.sh -f etc/usershell.conf\n```\n"
  },
  {
    "path": "service/usershell/etc/rc",
    "content": "#!/bin/sh\n\n. /etc/include/basicrc\n\nhostname shell\nsu bsd -c \"ksh -l\"\n\n. /etc/include/shutdown\n"
  },
  {
    "path": "service/usershell/options.mk",
    "content": "MINIMIZE=y\nMOUNTRO=y\nIMGSIZE=100\nADDPKGS=pkgin pkg_tarup pkg_install sqlite3 rsync curl\n"
  },
  {
    "path": "service/usershell/postinst/custom.sh",
    "content": "#!/bin/sh\n\nrm -f etc/shrc # wipe defaults\ncat >>etc/profile<<EOF\nHOSTNAME=\\$(hostname)\nPS1=\"\\$(printf '\\e[1;31m\\${USER}\\e[1;37m@\\${HOSTNAME}\\e[0m$ ')\"\nEOF\n"
  },
  {
    "path": "service/usershell/sailor.conf",
    "content": ". /service/common/sailor.vars\n\nshipname=usershell\nshipbins=\"$shipbins /bin/ksh /usr/bin/ssh /usr/bin/ssh-keygen /usr/bin/sed /usr/bin/uniq /usr/bin/xargs /usr/bin/cut /usr/bin/tr\"\nrun_at_build=\"/usr/sbin/useradd -m bsd\"\n"
  },
  {
    "path": "smoler/build.sh",
    "content": "# Converts a basic Dockerfile to a smolBSD service\n\nset -e\n\nusage()\n{\n\techo \"usage: $0 [--build-arg KEY=val ...] [-t tag] [-y] <Dockerfile>\"\n\texit 1\n}\n\nIMGTAG=\"latest\"\nwhile [ $# -gt 1 ]; do\n\tcase $1 in\n\t--build-arg)\n\t\tshift\n\t\t[ \"${1#*=}\" = \"${1}\" ] && usage\n\t\tBUILDARGS=\"${BUILDARGS}${BUILDARGS:+,}${1}\"\n\t\t;;\n\t-t|--tag)\n\t\tshift\n\t\tIMGTAG=\"$1\"\n\t\t;;\n\t-y)\n\t\tYES=y\n\t\t;;\n\tesac\n\tshift\ndone\n\nif [ $# -lt 1 ] || [ ! -f \"$1\" ]; then\n\tusage\nfi\n\ndockerfile=$1\n\nmkdir -p tmp\nTMPOPTS=$(mktemp tmp/options.mk.XXXXXX)\n# Dockerfile compatibility\nsed -n 's/LABEL \\(smolbsd\\.\\)\\{0,1\\}\\(.*=.*\\)/\\2/p' $dockerfile | \\\n\tawk -F= '{ printf \"%s=%s\\n\", toupper($1), $2 }' \\\n\t>${TMPOPTS}\n\n. ./${TMPOPTS}\n\nexport CHOUPI=y\n. service/common/funcs\n. service/common/choupi\n\nif [ -z \"$SERVICE\" ];then\n\techo \"${ERROR} no service name, exiting\"\n\texit 1\nfi\n\nservicedir=\"service/${SERVICE}\"\n\nif [ -d \"$servicedir\" ]; then\n\techo \"${INFO} $SERVICE already exists, recreating\"\n\tfor f in etc/rc options.mk postinst\n\tdo\n\t\trm -rf \"${servicedir}/${f}\"\n\tdone\n\trm -f etc/${SERVICE}.conf\nfi\n\nfor d in etc postinst\ndo\n\tmkdir -p ${servicedir}/${d}\ndone\n\npostnum=0\npostinst=\"${servicedir}/postinst/postinst-${postnum}.sh\"\netcrc=\"${servicedir}/etc/rc\"\n\nsed 's/\"//g' ${TMPOPTS} >${servicedir}/options.mk\n\n# setup the chroot for RUN executions\ncat >$postinst<<_EOF\n#!/bin/sh\n\nset -e\n\nif [ ! -f /BUILDIMG ]; then\n\techo \"${ERROR} NOT IN BUILDER IMAGE! EXITING\"\n\texit 1\nfi\n. ../service/common/funcs\n\nrootdir=\\$(pwd) # postinst is ran from fake root\ncat >etc/profile<<_PROFILE\nPATH=\\$PATH:/sbin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin\nexport PATH\n_PROFILE\ncp /etc/resolv.conf etc/\nmkdir -p usr/pkg/etc/pkgin\n# evbarm-aarch64 repo name is aarch64\nARCH=\\${ARCH#evbarm-}\necho \"https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/\\${ARCH}/\\${PKGVERS}/All\" \\\n\t>usr/pkg/etc/pkgin/repositories.conf\nrsynclite /etc/openssl/ \\${rootdir}/etc/openssl\n_EOF\n\ncat >${etcrc}<<_EOF\n#!/bin/sh\n\n. /etc/include/basicrc\n. /etc/include/mount9p\n\n_EOF\ngrep -q '^ADDPKGS' ${servicedir}/options.mk || \\\n\techo \"ADDPKGS=pkgin pkg_tarup pkg_install sqlite3 curl rsync\" \\\n\t\t>>${servicedir}/options.mk\n\nUSER=root\nSHELL_CMD=${SHELL_CMD:-/bin/sh}\nWORKDIR=\"/\"\n\npostnum=1 # 0 was basic header\npostinst=\"${postinst%-*}-${postnum}.sh\"\nargs=\"${postinst%-*}.args\"\nprintf '' >\"$args\"\n\nshhead()\n{\n\tprintf '%s\\n\\n' \"#!${SHELL_CMD}\" >\"$postinst\"\n\tcat >>\"$postinst\"<<-EOHEAD\n\n\texport CHOUPI=y\n\t. ../service/common/funcs\n\t. ../service/common/choupi\n\n\tEOHEAD\n}\n\nshhead\n\nwhile read -r line\ndo\n\t# strip comments\n\tcase \"$line\" in \\#*) continue;; esac\n\n\t# normalize to spaces and no trailing spaces\n\tline=$(printf '%s\\n' \"$line\" | tr -s '\\t ' ' ' | sed 's/[[:space:]]*$//')\n\n\t# there was a <<EOF\n\tif [ -n \"$heretag\" ]; then\n\t\t# in heredoc, append until tag\n\t\tif [ \"$line\" != \"$heretag\" ]; then\n\t\t\tprintf '%s\\n' \"$line\"|sed 's/\"/\\\\\"/g' >>\"$postinst\"\n\t\telse\n\t\t\t[ -n \"$prehere\" ] && echo \"$heretag\" >>\"$postinst\"\n\n\t\t\techo \\\" >>\"$postinst\"\n\t\t\theretag=\n\t\t\tprehere=\n\t\t\tposttag=\n\t\tfi\n\t\tcontinue\n\tfi\n\n\t# normal KEY VAL line\n\tif [ -z \"$multiline\" ]; then\n\t\tkey=\"${line%% *}\"\n\t\tval=\"${line#* }\"\n\telse # && \\ multiline\n\t\tval=\"${line}\"\n\tfi\n\n\tcase \"$val\" in\n\t# multi lines breaks\n\t*\\\\)\n\t\tmultiline=\"$multiline${val%\\\\} \"\n\t\tcontinue\n\t\t;;\n\tesac\n\n\tval=\"$multiline$val\"; multiline=\"\"\n\n\tcase \"$key\" in\n\tFROM)\n\t\tcase \"$val\" in\n\t\t*img)\n\t\t\techo \"FROMIMG=${val}\" >> ${servicedir}/options.mk\n\t\t\t;;\n\t\t*)\n\t\t\techo \"SETS=${val},\" | sed 's/\\(:[^,]*\\)*,/\\.${SETSEXT}\\1 /g' \\\n\t\t\t\t>> ${servicedir}/options.mk\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tENV)\n\t\techo \"export $val\" | tee -a \"$etcrc\" \"$postinst\" \"$args\" \\\n\t\t\t>/dev/null\n\t\t;;\n\tARG)\n\t\targ=${val%%=*}\n\t\t[ \"$arg\" != \"${val}\" ] && default=${val#*=} || default=\"\"\n\t\tprintf '%s\\n' \"${arg}=\\${${arg}:-${default}}; export $arg\" | \\\n\t\t\ttee -a \"$postinst\" \"$args\" >/dev/null\n\t\t;;\n\tSHELL)\n\t\t# -c is useless for us as we execute a script\n\t\tSHELL_CMD=$(echo \"${val}\"|jq -r '[.[] | select(. != \"-c\")] | join(\" \")')\n\t\t# SHELL has changed, create a new postinst script\n\t\tpostnum=$((postnum + 1))\n\t\tpostinst=\"${postinst%-*}-${postnum}.sh\"\n\t\tshhead\n\t\t# bring ARGs\n\t\tcat \"$args\" >>\"$postinst\"\n\t\techo >>\"$postinst\"\n\t\t;;\n\tRUN)\n\t\tcase \"$val\" in\n\t\t\t*\\<\\<*)\n\t\t\t\t# worst case: cat   <<EOF     > foo.conf\n\t\t\t\t#                     ^^^^^^^^^^^^^^^^^^\n\t\t\t\t#                     posthere\n\t\t\t\t#             ^^^     ^^^     ^^^^^^^^^^\n\t\t\t\t#             prehere heretag   posttag\n\t\t\t\tprehere=${val%%<<*} # command before heredoc\n\t\t\t\tposthere=${val#*<<} # all after heredoc\n\t\t\t\theretag=${posthere%% *} # tag itself\n\t\t\t\tposttag=${posthere#${heretag}} # after tag\n\t\t\t\t[ -n \"$prehere\" ] && prehere=\"$prehere <<$heretag\"\n\t\t\t\t# remove any heredoc specfier\n\t\t\t\theretag=$(printf '%s' \"$heretag\"|tr -d \"'\\\"\")\n\t\t\t\tprintf '%s\\n' \\\n\t\t\t\t\t\"chroot . su ${USER} -c \\\"cd ${WORKDIR} && ${prehere}${posttag}\" \\\n\t\t\t\t\t>>\"$postinst\"\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tescaped=$(printf '%s' \"$val\" | sed 's/\"/\\\\\"/g')\n\t\t\t\tprintf '%s\\n' \"chroot . su ${USER} -c \\\"cd ${WORKDIR} && ${escaped}\\\"\" \\\n\t\t\t\t\t>>\"$postinst\"\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\tEXPOSE)\n\t\t# PUBLISH comes from smolbsd LABEL\n\t\tif [ -n \"$PUBLISH\" ]; then\n\t\t\tports=\"$PUBLISH\"\n\t\t# Non-Dockerfile compatible but convenient syntax\n\t\telif [ \"${val%:*}\" != \"$val\" ]; then\n\t\t\tports=\"$val\"\n\t\telse\n\t\t\techo \"${WARN} smolbsd.publish LABEL needed to EXPOSE\"\n\t\tfi\n\n\t\tif [ -n \"$ports\" ]; then\n\t\t\tfor pair in $(echo $ports|tr ',' ' '); do\n\t\t\t\tportfrom=${pair%:*}\n\t\t\t\tportto=${pair#*:}\n\t\t\t\t[ -n \"${portfrom}\" ] && [ -n \"${portto}\" ] && \\\n\t\t\t\t\thostfwd=\"${hostfwd}${hostfwd:+,}::${portfrom}-:${portto}\"\n\t\t\tdone\n\t\t\t[ -n \"$hostfwd\" ] && \\\n\t\t\t\techo \"hostfwd=$hostfwd\" >>etc/${SERVICE}.conf\n\t\tfi\n\t\t;;\n\tADD|COPY)\n\t\tsrc=${val% *}\n\t\tdst=${val##* }\n\t\twhile :; do\n\t\t\tcase \"$src\" in\n\t\t\t--chown=*|--chmod=*|--exclude=*)\n\t\t\t\toption=\"${src%%=*}\"   # --chown, --chmod, or --exclude\n\t\t\t\toption=\"${option#--}\" # chown, chmod, or exclude\n\t\t\t\tvalue=\"${src#*=}\"     # foo:bar file1 file2\n\t\t\t\tsrc=\"${value#* }\"     # file1 file2\n\t\t\t\tvalue=\"${value%% *}\"  # foo:bar\n\n\t\t\t\teval \"$option=\\$value\"\n\n\t\t\t\t[ \"$option\" = \"exclude\" ] && \\\n\t\t\t\t\ttoexclude=\"${toexclude} --exclude=${value}\"\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tbreak\n\t\t\t\t;;\n\t\t\tesac\n\t\tdone\n\t\tcase \"$src\" in\n\t\thttp*://*)\n\t\t\t[ -d \"${dst#/}\" ] && outdl=${dst#/}/${src##*/} || outdl=${dst#/}\n\t\t\techo \"ftp -o ${outdl} ${src}\" >>\"$postinst\"\n\t\t\t;;\n\t\t*)\n\t\t\tif [ \"${dst#\\$}\" != \"$dst\" ]; then # dst is a variable\n\t\t\t\t# too large but macOS BRE compatible\n\t\t\t\tdst=$(echo \"$dst\"|sed 's,\\${*\\([^}]*\\)}*,${\\1#/},')\n\t\t\tfi\n\t\t\techo \"rsynclite ${toexclude} ${src} ${dst#/}\" >>\"$postinst\"\n\t\t\t;;\n\t\tesac\n\n\t\t[ -n \"$chown\" ] && \\\n\t\t\techo \"[ -d \\\"${src#/}\\\" ] && \\\n\t\t\t\tchroot . sh -c \\\"chown -R $chown ${dst}\\\" || \\\n\t\t\t\tchroot . sh -c \\\"chown -R $chown ${dst}/${src##*/}\\\"\" \\\n\t\t\t>>\"$postinst\"\n\t\t[ -n \"$chmod\" ] && \\\n\t\t\techo \"[ -d \\\"${src#/}\\\" ] && \\\n\t\t\t\tchroot . sh -c \\\"chmod -R $chmod ${dst}\\\" || \\\n\t\t\t\tchroot . sh -c \\\"chmod -R $chmod ${dst}/${src##*/}\\\"\" \\\n\t\t\t>>\"$postinst\"\n\t\t;;\n\tUSER)\n\t\techo \"chroot . sh -c \\\"id ${val} >/dev/null 2>&1 || \\\n\t\t\t(useradd -m ${val} && groupadd ${val})\\\"\" \\\n\t\t\t>>\"$postinst\"\n\t\tUSER=${val}\n\t\t;;\n\tVOLUME)\n\t\techo \"share=${val}\" >>etc/${SERVICE}.conf\n\t\t# avoid mount_9p warning\n\t\t[ \"${val#/}\" = \"${val}\" ] && val=\"/${val}\"\n\t\techo \"MOUNT9P=${val}\" >>\"$etcrc\"\n\t\techo \". /etc/include/mount9p\" >>\"$etcrc\"\n\t\techo \"mkdir -p ${val#/}\" >>\"$postinst\"\n\t\t;;\n\tWORKDIR)\n\t\tWORKDIR=\"$val\"\n\t\techo \"cd ${val}\" >>\"$etcrc\"\n\t\t;;\n\tCMD|ENTRYPOINT)\n\t\tprintf \"\\n# entrypoint\\n\" >>\"${etcrc}\"\n\t\tif [ \"$USER\" != \"root\" ]; then\n\t\t\tprintf '%s' \"su $USER -c \\\"\" >>\"${etcrc}\"\n\t\t\tENDQUOTE=\"\\\"\"\n\t\tfi\n\n\t\tprintf '%s' \"$val\" >>\"${etcrc}\"\n\t\techo $ENDQUOTE >>\"${etcrc}\"\n\t\t;;\n\t*)\n\t\t;;\n\tesac\ndone < $dockerfile\n\ncat >>${etcrc}<<_ETCRC\n\n. /etc/include/shutdown\n_ETCRC\ncat >>etc/${SERVICE}.conf<<_ETCCONF\nimgtag=$IMGTAG\nuse_pty=$USE_PTY\n_ETCCONF\n\necho \"${CHECK} ${SERVICE} service files generated\"\nif [ -z \"$YES\" ]; then\n\tprintf '%s' \"${ARROW} press enter to build ${SERVICE} image or ^C to exit\"\n\tread dum\nfi\n\n[ \"$(uname -s)\" = \"NetBSD\" ] && MAKE=make || MAKE=bmake\n\n$MAKE SERVICE=${SERVICE} BUILDARGS=\"${BUILDARGS}\" IMGTAG=\":${IMGTAG}\" build\n"
  },
  {
    "path": "smoler/img.sh",
    "content": "#!/bin/sh\n\nOS=$(uname -s|tr 'A-Z' 'a-z')\n\ncase $OS in\nlinux|darwin) ;;\n*)\n\techo \"unsupported platform\"\n\texit 1\n\t;;\nesac\n\nARCH=$(uname -m | sed -e 's/x86_64/amd64/g;s/aarch64/arm64/')\n\nPATH=${PATH}:bin\n\ninstall_oras()\n{\n\tcommand -v oras >/dev/null && return\n\tversion=$(curl -s https://api.github.com/repos/oras-project/oras/releases/latest | jq -r '.tag_name')\n\tcurl -fsSL \"https://github.com/oras-project/oras/releases/download/${version}/oras_${version#v}_${OS}_${ARCH}.tar.gz\" | \\\n\t\ttar zxf - -C bin oras\n}\n\npulsh_usage()\n{\n\tif [ $# -lt 2 ]; then\n\t\techo \"usage: $1 <image>\"\n\t\texit 1\n\tfi\n}\n\nSMOLREPO=${SMOLREPO:-ghcr.io/netbsdfr/smolbsd}\n\ncase \"$1\" in\npull)\n\tpulsh_usage $@\n\tinstall_oras\n\toras pull ${SMOLREPO}/$2\n\t;;\npush)\n\tpulsh_usage $@\n\tinstall_oras\n\tocimg=${2#*/}\n\t[ \"$ocimg\" = \"$2\" ] && imgpath=\"images\" || imgpath=\"${2%/*}\"\n\tocimg=${ocimg%.img}\n\toras push ${SMOLREPO}/${ocimg} \\\n\t\t--artifact-type application/vnd.smolbsd.image \\\n\t\t\"${imgpath}/${ocimg}.img\":application/x-raw-disk-image\n\t;;\nimages)\n\tcols=$(tput cols 2>/dev/null) || cols=80\n\tcolsiz=$((cols / 4))\n\tnamesiz=$((colsiz * 2))\n\tcolsiz=$((colsiz / 2))\n\tfmt=\"%-${namesiz}s %-${colsiz}s %${colsiz}s %${colsiz}s\\n\"\n\tprintf \"\\033[1m${fmt}\\033[0m\" IMAGE SIZE CREATED SIG\n\tfor img in images/*.img\n\tdo\n\t\tctime=\n\t\t[ -f \"$img\" ] || continue\n\t\tbase=\"${img##*/}\"\n\t\tbase=\"${base%.img}\"\n\t\tsize=$(du -sh $img|cut -f1)\n\t\t# stat(1) is not portable *at all*\n\t\t# \"smolsig:01/01/1970|uuid\"\n\t\tsmolsig=$(tail -c 56 ${img}|grep -o 'smolsig:.*' 2>/dev/null)\n\t\tsmolsig=${smolsig#smolsig:}\n\t\t[ -n \"$smolsig\" ] && ctime=${smolsig%|*}\n\t\t[ -z \"$ctime\" ] && ctime='01/01/1970'\n\t\tsigmatch=NOK\n\t\tsigfile=\"${img%.img}.sig\"\n\t\tif [ -f \"${sigfile}\" ]; then\n\t\t\trawsig=\"${smolsig#*|}\"\n\t\t\timgsig=\"$(tail -c 37 ${sigfile})\"\n\t\t\t[ \"$imgsig\" = \"$rawsig\" ] && sigmatch=OK\n\t\telse\n\t\t\t# image has a signature but no sigfile, most\n\t\t\t# likely a downloaded image\n\t\t\tif [ -n \"$smolsig\" ]; then\n\t\t\t\techo \"smolsig:${ctime}:${smolsig#*|}\" > \\\n\t\t\t\t\t\"$sigfile\"\n\t\t\t\tsigmatch=OK\n\t\t\tfi\n\t\tfi\n\t\tprintf \"$fmt\" \"$base\" \"$size\" \"$ctime\" \"$sigmatch\"\n\tdone\n\t;;\n*)\n\techo \"Unknown command: $1\"\n\texit 1\n\t;;\nesac\n"
  },
  {
    "path": "smoler.sh",
    "content": "#!/bin/sh\n\nset -e\n\nprogname=${0##*/}\n\ncase $1 in\nbuild)\n\t/bin/sh smoler/build.sh $@\n\t;;\npush|pull|images)\n\t/bin/sh smoler/img.sh $@\n\t;;\nrun)\n\tbase=$(echo \"$2\"|sed 's/-amd64:.*//;s/-evbarm-aarch64:.*//')\n\tif [ -f \"etc/${base}.conf\" ]; then\n\t\tparams=\"-f etc/${base}.conf\"\n\telif [ -f \"images/${2}.img\" ]; then\n\t\tparams=\"-i $2\"\n\telse\n\t\tparams=\"-h\"\n\tfi\n\tshift; shift # move to arg 3\n\t/bin/sh startnb.sh $params $@\n\t;;\n\"\")\n\tcat 1>&2 << _USAGE_\nUsage:\n\t$progname build [-y] <path/to/Dockerfile>\n\t$progname pull <image>\n\t$progname push <image>\n\t$progname images\n\t$progname run <image> [startnb.sh flags]\n_USAGE_\n\t;;\n*)\n\techo \"not implemented.\"\n\t;;\n\nesac\n"
  },
  {
    "path": "startnb.sh",
    "content": "#!/bin/sh\n\nusage()\n{\n\tcat 1>&2 << _USAGE_\nUsage:\t${0##*/} -f conffile | -k kernel -i image [-c CPUs] [-m memory]\n\t[-a kernel parameters] [-r root disk] [-h drive2] [-p port]\n\t[-t tcp serial port] [-w path] [-e k=v] [-E f=path] [-x qemu extra args]\n\t[-N] [-b] [-n] [-s] [-d] [-v] [-u]\n\n\tBoot a microvm\n\t-f conffile\tvm config file\n\t-k kernel\tkernel to boot on\n\t-i image\timage to use as root filesystem\n\t-I\t\tload image as initrd\n\t-c cores\tnumber of CPUs\n\t-m memory\tmemory in MB\n\t-a parameters\tappend kernel parameters\n\t-r root disk\troot disk to boot on\n\t-l drive2\tsecond drive to pass to image\n\t-t serial port\tTCP serial port\n\t-n num sockets\tnumber of VirtIO console socket\n\t-p ports\t[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport\n\t-w path\t\thost path to share with guest (9p)\n\t-e k=v[,...]\texport variables to vm via QEMU fw_cfg\n\t-E f=path[,...]\texport host file paths to vm via QEMU fw_cfg\n\t-x arguments\textra qemu arguments\n\t-N\t\tdisable networking\n\t-b\t\tbridge mode\n\t-s\t\tdon't lock image file\n\t-P\t\tuse pty console\n\t-d\t\tdaemonize\n\t-v\t\tverbose\n\t-u\t\tnon-colorful output\n\t-h\t\tthis help\n_USAGE_\n\t# as per https://www.qemu.org/docs/master/system/invocation.html\n\t# hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport\n\texit 1\n}\n\n# Check if VirtualBox VM is running\nif [ \"$(uname -s)\" != \"Darwin\" ]; then\n\tif pgrep VirtualBoxVM >/dev/null 2>&1; then\n\t\techo \"Unable to start KVM: VirtualBox is running\"\n\t\texit 1\n\tfi\nfi\n\noptions=\"f:k:a:e:E:p:i:Im:n:c:r:l:p:uw:x:t:hbdsPNv\"\n\nexport CHOUPI=y\n\nuuid=\"$(LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c8)\"\n\n# and possibly override its values\nwhile getopts \"$options\" opt\ndo\n\tcase $opt in\n\ta) append=\"$OPTARG\";;\n\tb) bridgenet=y;;\n\tc) cores=\"$OPTARG\";;\n\td) daemon=y;;\n\te) fwcfgvar=${OPTARG};;\n\tE) fwcfgfile=${OPTARG};;\n\t# first load vm config file\n\tf)\n\t\t. $OPTARG\n\t\t# extract service from file name\n\t\tsvc=${OPTARG%.conf}\n\t\tsvc=${svc##*/}\n\t\t;;\n\th) usage;;\n\ti) img=\"$OPTARG\";;\n\tI) initrd=\"-initrd\";;\n\t# and possibly override values\n\tk) kernel=\"$OPTARG\";;\n\tl) drive2=$OPTARG;;\n\tm) mem=\"$OPTARG\";;\n\tn) max_ports=$(($OPTARG + 1));;\n\tp) hostfwd=$OPTARG;;\n\tr) root=\"$OPTARG\";;\n\ts) sharerw=y;;\n\tt) serial_port=$OPTARG;;\n\tu) CHOUPI=\"\";;\n\tv) VERBOSE=y;;\n\tN) nonet=yes;;\n\tP) use_pty=y;;\n\tw) share=$OPTARG;;\n\tx) extra=$OPTARG;;\n\t*) usage;;\n\tesac\ndone\n\n. service/common/choupi\n\n# envvars override\nkernel=${kernel:-$KERNEL}\nimg=${img:-$NBIMG}\n\n# enable QEMU user network by default\n[ -z \"$nonet\" ] && network=\"\\\n-device virtio-net-device,netdev=net-${uuid}0 \\\n-netdev user,id=net-${uuid}0,ipv6=off\"\n\nif [ -n \"$hostfwd\" ]; then\n\tnetwork=\"${network},$(echo \"$hostfwd\"|sed -E 's/(udp|tcp)?::/hostfwd=\\1::/g')\"\n\techo \"${ARROW} port forward set: $hostfwd\"\nfi\n\n[ -n \"$bridgenet\" ] && network=\"$network \\\n-device virtio-net-device,netdev=net-${uuid}1 \\\n-netdev type=tap,id=net-${uuid}1\"\n\n[ -n \"$drive2\" ] && drive2=\"\\\n-drive if=none,file=${drive2},format=raw,id=hd-${uuid}1 \\\n-device virtio-blk-device,drive=hd-${uuid}1\"\n\n[ -n \"$share\" ] && share=\"\\\n-fsdev local,path=${share},security_model=none,id=shar-${uuid}0 \\\n-device virtio-9p-device,fsdev=shar-${uuid}0,mount_tag=shar-${uuid}0\"\n\n[ -n \"$sharerw\" ] && sharerw=\",share-rw=on\"\n\nOS=$(uname -s)\n# arch can be forced to allow other qemu archs\narch=${ARCH:-$(scripts/uname.sh -m)}\nmachine=$(scripts/uname.sh -p)\n# no config file given, extract service from image name\nif [ -z \"$svc\" ]; then\n\tsvc=${img%-${arch}*}\n\tsvc=${svc#*/}\nfi\n\ncputype=\"host\"\n\ncase $OS in\nNetBSD)\n\taccel=\"-accel nvmm\"\n\t;;\nLinux)\n\taccel=\"-accel kvm\"\n\t;;\nDarwin)\n\taccel=\"-accel hvf\"\n\tif [ \"$arch\" = \"evbarm-aarch64\" ]; then\n\t\t# Mac M1, M2, M3, M4\n\t\tcputype=\"cortex-a57\"\n\telse\n\t\t# Mac Intel\n\t\tcputype=\"qemu64\"\n\tfi\n\t;;\nOpenBSD|FreeBSD)\n\taccel=\"-accel tcg\" # unaccelerated\n\tcputype=\"qemu64\"\n\t;;\n*)\n\techo \"Unknown hypervisor, no acceleration\"\nesac\n\nQEMU=${QEMU:-qemu-system-${machine}}\nprintf \"${ARROW} using QEMU \"\n$QEMU --version|grep -oE 'version .*'\n\nmem=${mem:-\"256\"}\ncores=${cores:-\"1\"}\nappend=${append:-\"-z\"}\nroot=${root:-\"NAME=${svc}root\"}\n\ncase $machine in\nx86_64|i386)\n\tmflags=\"-M microvm,rtc=on,acpi=off,pic=off\"\n\tcpuflags=\"-cpu ${cputype},+invtsc\"\n\t# stack smashing with version 9.0 and 9.1\n\t${QEMU} --version|grep -q -E '9\\.[01]' && \\\n\t\textra=\"$extra -L bios -bios bios-microvm.bin\"\n\tcase $machine in\n\ti386)\n\t\tkernel=${kernel:-kernels/netbsd-SMOL386}\n\t\t;;\n\tx86_64)\n\t\tkernel=${kernel:-kernels/netbsd-SMOL}\n\t\t;;\n\tesac\n\t;;\naarch64)\n\tmflags=\"-M virt,highmem=off,gic-version=3\"\n\tcpuflags=\"-cpu ${cputype}\"\n\textra=\"$extra -device virtio-rng-pci\"\n\tkernel=${kernel:-kernels/netbsd-GENERIC64.img}\n\t;;\n*)\n\techo \"${WARN} Unknown architecture\"\nesac\n\nif [ ! -f \"$kernel\" ]; then\n\t[ \"$OS\" != \"NetBSD\" ] && MAKE=bmake || MAKE=make\n\techo -n \"${ERROR} $kernel not present, fetch default kernel now? [y/N] \"\n\tread r && [ \"$r\" = \"y\" ] && $MAKE kernfetch || exit 1\nfi\necho \"${ARROW} using kernel $kernel\"\n\nif [ -z \"$use_pty\" ]; then\n\tpty=\"stdio,signal=off,mux=on\"\nelse\n\t# if use_pty is set to a command, use it as pty attachment\n\t[ \"$use_pty\" != \"y\" ] && ptycmd=\"$use_pty\" || \\\n\t\tptycmd=\"picocom -q -b 115200\"\n\tpty=\"pty\"\nfi\n# use VirtIO console when available, if not, emulated ISA serial console\nif nm $kernel 2>&1 | grep -q viocon_earlyinit; then\n\tconsole=viocon\n\t[ -z \"$max_ports\" ] && max_ports=1\n\tconsdev=\"\\\n-chardev ${pty},id=char0 \\\n-device virtio-serial-device,max_ports=${max_ports} \\\n-device virtconsole,chardev=char0,name=char0\"\nelse\n\t[ -z \"$use_pty\" ] && pty=\"mon:stdio\"\n\tconsdev=\"-serial $pty\"\n\tconsole=com\nfi\necho \"${ARROW} using console: $console\"\n\n# only use tag if there's a tag\nimgtag=${imgtag:+:${imgtag}}\n# conf file was given\n[ -z \"$img\" ] && [ -n \"$svc\" ] && img=images/${svc}-${arch}${imgtag}.img\n\nif [ -z \"$img\" ]; then\n\tprintf \"no 'image' defined\\n\\n\" 1>&2\n\tusage\nfi\n\n# registry like name was given\n[ \"${img%.img}\" = \"${img}\" ] && img=\"images/${img}.img\"\n\n\nif [ -z \"${initrd}\" ]; then\n\techo \"${ARROW} using disk image $img\"\n\timg=\"-drive if=none,file=${img},format=raw,id=hd-${uuid}0 \\\n-device virtio-blk-device,drive=hd-${uuid}0${sharerw}\"\n\troot=\"root=${root}\"\nelse\n\techo \"${ARROW} loading $img as initrd\"\n\troot=\"\"\nfi\n\n# svc *must* be defined to be able to store qemu PID in a unique filename\nif [ -z \"$svc\" ]; then\n\tsvc=${uuid}\n\techo \"${ARROW} no service name, using UUID ($uuid)\"\nfi\n\npidfile=\"qemu-${svc}.pid\"\n\nd=\"-display none -pidfile ${pidfile}\"\n\nif [ -n \"$daemon\" ]; then\n\t# XXX: daemonize makes viocon crash\n\tconsole=com\n\tunset max_ports\n\t# a TCP port is specified\n\tif [ -n \"${serial_port}\" ]; then\n\t\tserial=\"-serial telnet:localhost:${serial_port},server,nowait\"\n\t\techo \"${ARROW} using serial: localhost:${serial_port}\"\n\tfi\n\n\td=\"$d -daemonize $serial\"\nelse\n\t# console output\n\td=\"$d $consdev\"\nfi\n\nif [ -n \"$max_ports\" ] && [ $max_ports -gt 1 ]; then\n\tfor v in $(seq $((max_ports - 1)))\n\tdo\n\t\tsockid=\"${uuid}-p${v}\"\n\t\tsockname=\"sock-${sockid}\"\n\t\tsockpath=\"s-${sockid}.sock\"\n\t\tviosock=\"$viosock \\\n-chardev socket,path=${sockpath},server=on,wait=off,id=${sockname} \\\n-device virtconsole,chardev=${sockname},name=${sockname}\"\n\t\techo \"${INFO} host socket ${v}: ${sockpath}\"\n\tdone\nfi\n# QMP is available\n[ -n \"${qmp_port}\" ] && extra=\"$extra -qmp tcp:localhost:${qmp_port},server,wait=off\"\n\n# export variables or files using QEMU fw_cfg\n[ -n \"$fwcfgvar\" ] && \\\n\textra=\"$extra $(echo $fwcfgvar | sed -E 's|([[:alnum:]_]+)=([^,]+),?|-fw_cfg opt/org.smolbsd.var.\\1,string=\\2 |g')\"\n[ -n \"$fwcfgfile\" ] && \\\n\textra=\"$extra $(echo $fwcfgfile | sed -E 's|([[:alnum:]_]+)=([^,]+),?|-fw_cfg opt/org.smolbsd.file.\\1,file=\\2 |g')\"\n\n# Use localtime for RTC instead of UTC by default\nextra=\"$extra -rtc base=localtime\"\n\n[ -n \"$use_pty\" ] && escapex=\"^\"\necho \"${EXIT} ^D to stop the vm, ^A-${escapex}X to kill it\"\n\ncmd=\"${QEMU} -smp $cores \\\n\t$accel $mflags -m $mem $cpuflags \\\n\t-kernel $kernel $initrd ${img} \\\n\t-append \\\"console=${console} ${root} ${append}\\\" \\\n\t-global virtio-mmio.force-legacy=false ${share} \\\n\t${drive2} ${network} ${d} ${viosock} ${extra}\"\n\n[ -n \"$VERBOSE\" ] && echo \"$cmd\" && exit\n\n[ -n \"$viosock\" ] && \\\n\t(\n\t\tkillsock=${sockpath%-p[0-9]*}-p1.sock\n\t\twhile [ ! -S \"./$killsock\" ]\n\t\tdo\n\t\t\techo \"${SOCKET} waiting for vm control socket ${killsock}\"\n\t\t\tsleep 0.5\n\t\tdone\n\t\tsocat ./$killsock -,ignoreeof 2>&1 | while read VIOCON\n\t\t\tdo\n\t\t\t\tcase ${VIOCON} in JEMATA!*) kill $(cat ${pidfile}); esac\n\t\t\tdone\n\t) &\n\n[ -n \"$use_pty\" ] && \\\n\tcmd=\"$cmd -daemonize >qemu-${svc}.pty 2>&1\"\n\neval $cmd\n\nif [ -n \"$use_pty\" ]; then\n\tptyfile=\"qemu-${svc}.pty\"\n\twhile [ ! -f \"$ptyfile\" ]; do sleep 0.2; done\n\t${ptycmd} $(grep -o '/dev/[^ ]*' $ptyfile)\n\tkill $(cat ${pidfile})\n\trm -f $ptyfile\nfi\n"
  },
  {
    "path": "www/index.html",
    "content": "<!doctype html>\n<html lang=\"en\" class=\"dark\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <title>smolBSD — build your own minimal BSD system</title>\n  <link rel=\"icon\" href=\"smol.ico\">\n  <script src=\"https://cdn.tailwindcss.com\"></script>\n  <link href=\"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap\" rel=\"stylesheet\">\n  <style>\n    html { scroll-behavior: smooth; }\n    body { font-family: 'IBM Plex Mono', monospace; }\n    @keyframes fadeInUp {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n    .fade-up { animation: fadeInUp 0.8s ease forwards; opacity: 0; }\n    img[alt=\"smolBSD logo\"] {\n      filter: drop-shadow(0 0 8px #f59e0b33);\n}\n  </style>\n</head>\n\n<body class=\"bg-black text-gray-300 selection:bg-amber-500 selection:text-black\">\n  <!-- Hero -->\n  <section class=\"min-h-screen flex flex-col justify-center items-center\ntext-center p-8 bg-gradient-to-b from-black via-zinc-900 to-black\">\n    <div class=\"flex flex-col md:flex-row items-center justify-center gap-6\nfade-up\">\n      <img src=\"smolBSD.png\" alt=\"smolBSD logo\" class=\"w-24 h-24 md:w-28 md:h-28\nopacity-90 hover:opacity-100 transition duration-500\">\n      <h1 class=\"text-6xl md:text-8xl font-bold text-white\">\n        smol<span class=\"text-amber-500\">BSD</span>\n      </h1>\n    </div>\n\n    <p class=\"text-lg md:text-2xl text-gray-400 mt-6 mb-8 fade-up\"\nstyle=\"animation-delay: .2s\">\n      build your own minimal BSD UNIX system\n    </p>\n\n    <div class=\"flex flex-col sm:flex-row sm:space-x-4 space-y-4 sm:space-y-0 fade-up\" style=\"animation-delay: .4s\">\n      <a href=\"https://github.com/NetBSDfr/smolBSD\" target=\"_blank\" class=\"px-6 py-3\nbg-amber-500 text-black font-semibold rounded-lg hover:bg-amber-400\ntransition\">GitHub</a>\n      <a href=\"#about\" class=\"px-6 py-3 border border-amber-400 text-amber-400\nfont-semibold rounded-lg hover:bg-amber-400 hover:text-black transition\">Get\nStarted</a>\n    </div>\n  </section>\n\n  <!-- About -->\n  <section id=\"about\" class=\"max-w-5xl mx-auto px-6 py-24 grid md:grid-cols-2 gap-12 items-center\">\n    <div>\n      <h2 class=\"text-3xl text-white mb-6 font-semibold\">About</h2>\n      <p class=\"text-gray-400 leading-relaxed\">\n        <strong>smolBSD</strong> is a meta-operating system built on top of NetBSD.  \n        It lets you compose your own UNIX environment — from a single-purpose microservice system to a fully-custom OS image — in just a few minutes.\n      </p>\n      <p class=\"text-gray-400 leading-relaxed mt-4\">\n        The smolBSD environment uses the <strong>netbsd-MICROVM</strong> kernel as its foundation, leveraging the same portable, reliable codebase that powers NetBSD itself.  \n        You decide what to include — sshd, httpd, or your own service — and smolBSD builds a coherent, minimal, bootable image ready to run anywhere.\n      </p>\n    </div>\n    <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto text-sm border border-zinc-800\">\n$ bmake SERVICE=bozohttpd build\n➡️ starting the builder microvm\n➡️ host filesystem mounted on /mnt\n➡️ fetching sets\n➡️ creating root filesystem (512M)\n✅ image ready: bozohttpd-amd64.img\n    </pre>\n  </section>\n\n  <!-- Features -->\n  <section class=\"bg-zinc-950 py-24\">\n    <div class=\"max-w-5xl mx-auto text-center mb-12\">\n      <h2 class=\"text-3xl text-white font-semibold mb-4\">Why smolBSD</h2>\n      <p class=\"text-gray-400\">Build BSD systems like you build software — fast, reproducible, and minimal.</p>\n    </div>\n    <div class=\"grid sm:grid-cols-2 md:grid-cols-4 gap-8 max-w-5xl mx-auto px-6\">\n      <div class=\"p-6 border border-zinc-800 rounded-xl hover:border-amber-500 transition\">\n        <h3 class=\"text-xl text-amber-400 mb-2\">🧩&nbsp;Composable</h3>\n        <p class=\"text-gray-400 text-sm\">Pick only the components you need — from kernel to services.</p>\n      </div>\n      <div class=\"p-6 border border-zinc-800 rounded-xl hover:border-amber-500 transition\">\n        <h3 class=\"text-xl text-amber-400 mb-2\">⚙️&nbsp;Reproducible</h3>\n        <p class=\"text-gray-400 text-sm\">Every build is deterministic, portable, and easy to version-control.</p>\n      </div>\n      <div class=\"p-6 border border-zinc-800 rounded-xl hover:border-amber-500 transition\">\n        <h3 class=\"text-xl text-amber-400 mb-2\">🚀&nbsp;Instant Boot</h3>\n        <p class=\"text-gray-400 text-sm\">Powered by netbsd-MICROVM — boot to service in milliseconds.</p>\n      </div>\n      <div class=\"p-6 border border-zinc-800 rounded-xl hover:border-amber-500 transition\">\n        <h3 class=\"text-xl text-amber-400 mb-2\">💻&nbsp;Universal</h3>\n        <p class=\"text-gray-400 text-sm\">Runs anywhere QEMU or Firecracker runs — cloud, CI, edge, or laptop.</p>\n      </div>\n    </div>\n  </section>\n\n  <!-- Quick Start -->\n  <section class=\"max-w-4xl mx-auto px-6 py-24 text-center\">\n    <h2 class=\"text-3xl text-white mb-6 font-semibold\">Quick Start</h2>\n    <p class=\"text-gray-400 mb-6\">Build and boot your own BSD system in seconds:</p>\n    <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto text-left text-sm border border-zinc-800\">\n$ git clone https://github.com/NetBSDfr/smolBSD\n$ cd smolBSD\n$ cat ~/.ssh/id_ed25519.pub >> service/sshd/etc/mykey.pub\n$ bmake SERVICE=sshd build\n➡️ starting the builder microvm\n➡️ fetching sets\n➡️ creating root filesystem (512M)\n✅ image ready: sshd-amd64.img\n➡️ killing the builder microvm\n\n$ ./startnb.sh -f etc/sshd.conf \n[   1.0092096] kernel boot time: 14ms\nStarting sshd.\nServer listening on :: port 22.\nServer listening on 0.0.0.0 port 22.\n\n$ ssh -p 2022 ssh@localhost\n    </pre>\n    <a href=\"https://github.com/NetBSDfr/smolBSD/releases\" target=\"_blank\"\n       class=\"inline-block mt-6 px-6 py-3 bg-amber-500 text-black font-semibold rounded-lg hover:bg-amber-400 transition\">\n      Download\n    </a>\n  </section>\n\n  <section class=\"max-w-4xl mx-auto px-6 py-24 text-center\">\n    <h2 class=\"text-3xl text-white mb-6 font-semibold\">Create</h2>\n    <p class=\"text-gray-400 mb-6\">Your own service in seconds using a simple\nDockerfile!</p>\n    <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto text-left text-sm border border-zinc-800\">\nFROM base,etc\n\nLABEL SERVICE=caddy\n\nRUN pkgin up && pkgin -y in caddy\n\nEXPOSE 8881:8880\n\nCMD caddy respond -l :8880\n    </pre>\n  </section>\n\n\n<!-- Examples -->\n<section id=\"examples\" class=\"bg-black py-24\">\n  <div class=\"max-w-5xl mx-auto px-6\">\n    <h2 class=\"text-3xl text-white font-semibold mb-12\ntext-center\">Services Examples</h2>\n\n    <!-- Example 1: bozohttpd -->\n    <div class=\"grid md:grid-cols-2 gap-8 mb-16 items-center\">\n      <div>\n        <h3 class=\"text-2xl text-amber-400 font-semibold mb-4\">bozohttpd</h3>\n        <p class=\"text-gray-400 leading-relaxed\">\n          A complete static web server in a few megabytes.  \n          smolBSD builds a minimal system with <code>bozohttpd</code>\npreconfigured and ready to serve content immediately on boot.\n        </p>\n      </div>\n      <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto\ntext-sm border border-zinc-800\">\n$ bmake SERVICE=bozohttpd build\n➡️ starting the builder microvm\n➡️ fetching sets\n➡️ creating root filesystem (512M)\n✅ image ready: bozohttpd-amd64.img\n\n$ ./startnb.sh -f etc/bozohttpd.conf\n[   1.001231] kernel boot time: 10ms\nStarting bozohttpd on :80\nlistening on 0.0.0.0:80\n      </pre>\n    </div>\n\n    <!-- Example 2: nbakery -->\n    <div class=\"grid md:grid-cols-2 gap-8 mb-16 items-center\nmd:flex-row-reverse\">\n      <div class=\"md:order-2\">\n        <h3 class=\"text-2xl text-amber-400 font-semibold mb-4\">nbakery</h3>\n        <p class=\"text-gray-400 leading-relaxed\">\n          A lightweight build and image creation service based entirely on\nNetBSD tools.  \n          The <code>nbakery</code> image gives you a taste of a preconfigured NetBSD environment with all the well known tools.\n        </p>\n      </div>\n      <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto\ntext-sm border border-zinc-800 md:order-1\">\n$ bmake SERVICE=nbakery build\n➡️ starting the builder microvm\n➡️ fetching sets\n➡️ creating root filesystem (512M)\n✅ image ready: nbakery-amd64.img\n\n$ ./startnb.sh -f etc/nbakery.conf\n[   1.008374] kernel boot time: 11ms\n\nWelcome to the (n)bakery! 🧁\n\n💪 doas &lt;command&gt; to run command as root\n📦 pkgin to manage packages\n🚪 exit to cleanly shutdown, ^a-x to exit qemu\n🪟 you are inside a tmux with prefix ^q\n      </pre>\n    </div>\n\n    <!-- Example 3: nitrosshd -->\n    <div class=\"grid md:grid-cols-2 gap-8 items-center\">\n      <div>\n        <h3 class=\"text-2xl text-amber-400 font-semibold mb-4\">nitrosshd</h3>\n        <p class=\"text-gray-400 leading-relaxed\">\n          A minimal secure shell server started with <code>nitro</code>,\ndesigned to launch instantly and provide remote access with zero unnecessary\nservices.  \n          Ideal for an SSH bouncer.\n        </p>\n      </div>\n      <pre class=\"bg-zinc-950 text-gray-300 p-6 rounded-2xl overflow-x-auto\ntext-sm border border-zinc-800\">\n$ bmake SERVICE=nitrosshd build\n➡️ starting the builder microvm\n➡️ fetching sets\n➡️ creating root filesystem (512M)\n✅ image ready: nitrosshd-amd64.img\n\n$ ./startnb.sh -f etc/sshd.conf\n[   1.011598] kernel boot time: 12ms\nCreated tmpfs /dev (1835008 byte, 3552 inodes)\nStarting sshd.\nServer listening on :: port 22.\nServer listening on 0.0.0.0 port 22.\n      </pre>\n    </div>\n\n  </div>\n</section>\n\n\n  <!-- Community -->\n  <section class=\"bg-zinc-950 py-24 text-center\">\n    <h2 class=\"text-3xl text-white mb-6 font-semibold\">Community</h2>\n    <p class=\"text-gray-400 max-w-3xl mx-auto mb-8\">\n      smolBSD is an independent project built on top of NetBSD.  \n      Join us, share your micro-systems, or contribute new services and build recipes.\n    </p>\n    <div class=\"space-x-6 text-amber-400 text-2xl\">\n      <a href=\"https://github.com/NetBSDfr/smolBSD\" class=\"hover:text-amber-300\" target=\"_blank\">GitHub</a>\n      <a href=\"https://mastodon.bsd.cafe/@imil\" class=\"hover:text-amber-300\" target=\"_blank\">Mastodon</a>\n      <a href=\"mailto:contact@smolbsd.org\" class=\"hover:text-amber-300\">Email</a>\n    </div>\n  </section>\n\n  <!-- Footer -->\n  <footer class=\"text-center text-gray-600 py-12 text-sm border-t border-gray-800\">\n    © 2025 smolBSD\n  </footer>\n</body>\n</html>\n\n"
  }
]