[
  {
    "path": ".gitattributes",
    "content": "/Dockerfile linguist-generated\n/Makefile linguist-generated\n/QR.rb linguist-generated linguist-language=prose\n/README.md linguist-generated\n/SHA256SUMS linguist-generated\n/langs.png linguist-generated\n/thumbnail.png linguist-generated\n/vendor linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: mame\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\non:\n  - push\n  - pull_request\n  - workflow_dispatch\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n      - name: docker build\n        run: |\n          sudo docker build -t quine-relay .\n      - name: docker run\n        run: |\n          sudo docker run --privileged --name qr -e CI=true -t quine-relay\n      - name: push spoiler\n        run: |\n          git clone https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git spoiler --branch spoiler\n          git -C spoiler rm --quiet -r '*'\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.rb spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.rs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.scala spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.scm spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.sci spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.sed spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.spl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.sl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.nut spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.sml spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.sq spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ss spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.swift spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.tcl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.tcsh spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.t spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ts spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.unl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.vala spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.mid spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.v spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.vim spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.vb spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.wasm spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.wat spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ws spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.xslt spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.yab spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.yorick spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.azm spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.zsh spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.+ spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/qr.adb spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.als spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.aheui spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.a68 spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ante spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.aj spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.asy spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.dats spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.awk spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.bash spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.bc spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.bsh spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.bef spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.Blc spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.bf spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.c spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.cpp spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.cs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.chef spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.clj spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.cmake spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.cob spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.coffee spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.lisp spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.cr spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.d spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.dc spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.dhall spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.exs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.el spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.erl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.e spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.fsx spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.false spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.fl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.fish spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.fs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.f spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.f90 spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gbs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.g spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gdb spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gel spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.plt spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.go spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gpt spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.grass spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.groovy spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gz spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.hs spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.hx spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.icn spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.i spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.j spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.java spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.js spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.jq spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.jsfuck spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.kt spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ksh spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.lazy spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ls spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ll spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.lol spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.lua spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.m4 spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.mk spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.mzn spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.mod spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.il spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.mustache spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.asm spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.neko spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.5c spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.nim spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.m spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ml spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.octave spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ook spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.gp spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.p spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.pas spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.pl spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.pl6 spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.php spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.png spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.pike spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ps spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.prolog spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.pr spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.py spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.R spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.ratfor spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.rc spoiler/\n          sudo docker cp qr:/usr/local/share/quine-relay/QR.rexx spoiler/\n          cd spoiler\n          git add .\n          GIT_AUTHOR_NAME=\"$(git show -s --format=%an \"$GITHUB_SHA\")\" \\\n          GIT_AUTHOR_EMAIL=\"$(git show -s --format=%ae \"$GITHUB_SHA\")\" \\\n          GIT_AUTHOR_DATE=\"$(git show -s --format=%ad \"$GITHUB_SHA\")\" \\\n          GIT_COMMITTER_NAME='GitHub Actions' \\\n          GIT_COMMITTER_EMAIL='actions@github.com' \\\n          TZ=UTC \\\n          git commit --allow-empty -m \"spoiler: $(git show -s --format=%s \"$GITHUB_SHA\")\"\n          git push --quiet origin spoiler\n          echo The intermediate sources are available: https://github.com/${GITHUB_REPOSITORY}/tree/spoiler\n        if: github.event_name == 'push' && github.ref == 'refs/heads/master'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "/QR*\n/qr*\n/tmp\n/nimcache\n/.curry\n!QR.rb\ngst.im\n/src/lazyk-boot.dat\n/src/blc-boot.dat\n/src/grass-boot.dat\n*.sw*\ntmp.*proj\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM ubuntu:25.10\nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get upgrade -y\nRUN apt-get -qq install -y apt-utils > /dev/null\nRUN apt-get -qq install -y moreutils\nRUN chronic apt-get -qq install -y afnix algol68g aplus-fsf aspectj && chronic apt-get clean\nRUN chronic apt-get -qq install -y asymptote ats2-lang bash bc && chronic apt-get clean\nRUN chronic apt-get -qq install -y bison bsh clisp clojure && chronic apt-get clean\nRUN chronic apt-get -qq install -y cmake coffeescript crystal curl && chronic apt-get clean\nRUN chronic apt-get -qq install -y dc dhall dotnet8 elixir && chronic apt-get clean\nRUN chronic apt-get -qq install -y emacs-nox erlang execline f2c && chronic apt-get clean\nRUN chronic apt-get -qq install -y fish flex fp-compiler g++ && chronic apt-get clean\nRUN chronic apt-get -qq install -y gambas3-gb-pcre gambas3-scripter gap gawk && chronic apt-get clean\nRUN chronic apt-get -qq install -y gcc gdb gdc genius && chronic apt-get clean\nRUN chronic apt-get -qq install -y gforth gfortran ghc ghostscript && chronic apt-get clean\nRUN chronic apt-get -qq install -y gm2 gnat gnucobol4 gnuplot && chronic apt-get clean\nRUN chronic apt-get -qq install -y gobjc golang gpt groff && chronic apt-get clean\nRUN chronic apt-get -qq install -y groovy guile-3.0 gzip haxe && chronic apt-get clean\nRUN chronic apt-get -qq install -y icont iconx intercal iverilog && chronic apt-get clean\nRUN chronic apt-get -qq install -y jasmin-sable jq kotlin ksh && chronic apt-get clean\nRUN chronic apt-get -qq install -y libevent-dev libgd-dev libpng-dev libpolyml-dev && chronic apt-get clean\nRUN chronic apt-get -qq install -y livescript llvm lua5.3 m4 && chronic apt-get clean\nRUN chronic apt-get -qq install -y make minizinc mono-devel nasm && chronic apt-get clean\nRUN chronic apt-get -qq install -y neko nickle nim node-typescript && chronic apt-get clean\nRUN chronic apt-get -qq install -y nodejs ocaml octave openjdk-11-jdk && chronic apt-get clean\nRUN chronic apt-get -qq install -y pari-gp parser3-cgi perl php-cli && chronic apt-get clean\nRUN chronic apt-get -qq install -y pike8.0 polyml python3 r-base && chronic apt-get clean\nRUN chronic apt-get -qq install -y rakudo ratfor rc regina-rexx && chronic apt-get clean\nRUN chronic apt-get -qq install -y ruby ruby-mustache rustc scala && chronic apt-get clean\nRUN chronic apt-get -qq install -y scilab-cli sed slsh spin && chronic apt-get clean\nRUN chronic apt-get -qq install -y squirrel3 surgescript swi-prolog swiftlang && chronic apt-get clean\nRUN chronic apt-get -qq install -y tcl tcsh valac vim && chronic apt-get clean\nRUN chronic apt-get -qq install -y wabt xsltproc yabasic yorick && chronic apt-get clean\nRUN chronic apt-get -qq install -y zoem zsh && chronic apt-get clean\nADD . /usr/local/share/quine-relay\nWORKDIR /usr/local/share/quine-relay\nRUN make -C vendor\nCMD make check -j 10000\n"
  },
  {
    "path": "Makefile",
    "content": "MAKEFLAGS += --no-print-directory\n\nPATH := $(CURDIR)/vendor/local/bin:/usr/games:$(PATH)\nCLASSPATH := .\n\nfind_any0 = $(firstword $(foreach x,$(1),$(if $(shell which $(x) 2>/dev/null),$(x),)))\ncheck = $(if $(2),$(2),$(error $(1) interpreter not found!))\nfind_any = $(call check,$(1),$(call find_any0,$(2)))\n\nJAVASCRIPT   := $(call find_any,JavaScript,nodejs node js)\nSCHEME       := $(call find_any,Scheme,guile csi gosh)\nGBS          := $(call find_any,Gambas script,gbs3 gbs2 gba3)\nWASI_RUNTIME := $(call find_any,WASI runtime,wasmtime node)\n\nifeq ($(SCHEME),csi)\n  SCHEME := csi -s\nendif\nifeq ($(WASI_RUNTIME),node)\n  WASI_RUNTIME := node --experimental-wasi-unstable-preview1 vendor/wasi-runtime.js\nendif\n\n.DELETE_ON_ERROR:\n\nall: QR2.rb\n\t@echo\n\t@echo \"#############\"\n\t@echo \"##  CHECK  ##\"\n\t@echo \"#############\"\n\t@echo\n\tdiff -s QR.rb QR2.rb\n\ncheck: all\n\t@sha256sum --quiet -c SHA256SUMS\n\nQR.rs: QR.rb\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  1: Ruby -> Rust  ##\"\n\t@echo \"#######################\"\n\t@echo\n\truby QR.rb > QR.rs\n\nQR.scala: QR.rs\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  2: Rust -> Scala  ##\"\n\t@echo \"########################\"\n\t@echo\n\trustc QR.rs\n\t./QR > QR.scala\n\nQR.scm: QR.scala\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  3: Scala -> Scheme  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tscalac QR.scala\n\tscala QR > QR.scm\n\nQR.sci: QR.scm\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  4: Scheme -> Scilab  ##\"\n\t@echo \"###########################\"\n\t@echo\n\t$(SCHEME) QR.scm > QR.sci\n\nQR.sed: QR.sci\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  5: Scilab -> sed  ##\"\n\t@echo \"########################\"\n\t@echo\n\tscilab-cli -nb -f QR.sci > QR.sed\n\nQR.spl: QR.sed\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  6: sed -> Shakespeare  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tsed -E -f QR.sed QR.sed > QR.spl\n\nQR.sl: QR.spl\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  7: Shakespeare -> S-Lang  ##\"\n\t@echo \"################################\"\n\t@echo\n\tspl2c < QR.spl > QR.spl.c\n\tgcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm\n\t./QR > QR.sl\n\nQR.nut: QR.sl\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  8: S-Lang -> Squirrel  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tslsh QR.sl > QR.nut\n\nQR.sml: QR.nut\n\t@echo\n\t@echo \"##################################\"\n\t@echo \"##  9: Squirrel -> Standard ML  ##\"\n\t@echo \"##################################\"\n\t@echo\n\tsquirrel QR.nut > QR.sml\n\nQR.sq: QR.sml\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  10: Standard ML -> Subleq  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tpolyc -o QR QR.sml\n\t./QR > QR.sq\n\nQR.ss: QR.sq\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  11: Subleq -> SurgeScript  ##\"\n\t@echo \"#################################\"\n\t@echo\n\truby vendor/subleq.rb QR.sq > QR.ss\n\nQR.swift: QR.ss\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  12: SurgeScript -> Swift  ##\"\n\t@echo \"################################\"\n\t@echo\n\tsurgescript QR.ss > QR.swift\n\nQR.tcl: QR.swift\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  13: Swift -> Tcl  ##\"\n\t@echo \"########################\"\n\t@echo\n\tswiftc QR.swift\n\t./QR > QR.tcl\n\nQR.tcsh: QR.tcl\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  14: Tcl -> tcsh  ##\"\n\t@echo \"#######################\"\n\t@echo\n\ttclsh QR.tcl > QR.tcsh\n\nQR.t: QR.tcsh\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  15: tcsh -> Thue  ##\"\n\t@echo \"########################\"\n\t@echo\n\ttcsh QR.tcsh > QR.t\n\nQR.ts: QR.t\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  16: Thue -> TypeScript  ##\"\n\t@echo \"##############################\"\n\t@echo\n\truby vendor/thue.rb QR.t > QR.ts\n\nQR.unl: QR.ts\n\t@echo\n\t@echo \"##################################\"\n\t@echo \"##  17: TypeScript -> Unlambda  ##\"\n\t@echo \"##################################\"\n\t@echo\n\ttsc --outFile QR.ts.js QR.ts\n\t$(JAVASCRIPT) QR.ts.js > QR.unl\n\nQR.vala: QR.unl\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  18: Unlambda -> Vala  ##\"\n\t@echo \"############################\"\n\t@echo\n\truby vendor/unlambda.rb QR.unl > QR.vala\n\nQR.mid: QR.vala\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  19: Vala -> Velato  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tvalac QR.vala\n\t./QR > QR.mid\n\nQR.v: QR.mid\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  20: Velato -> Verilog  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tmono vendor/local/bin/Vlt.exe /s QR.mid\n\tmono QR.exe > QR.v\n\nQR.vim: QR.v\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  21: Verilog -> Vimscript  ##\"\n\t@echo \"################################\"\n\t@echo\n\tiverilog -o QR QR.v\n\t./QR -vcd-none > QR.vim\n\nQR.vb: QR.vim\n\t@echo\n\t@echo \"#####################################\"\n\t@echo \"##  22: Vimscript -> Visual Basic  ##\"\n\t@echo \"#####################################\"\n\t@echo\n\tvim -EsS QR.vim > QR.vb\n\nQR.wasm: QR.vb\n\t@echo\n\t@echo \"#######################################################\"\n\t@echo \"##  23: Visual Basic -> WebAssembly (Binary format)  ##\"\n\t@echo \"#######################################################\"\n\t@echo\n\techo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.vb\" /></ItemGroup></Project>' > tmp.vbproj\n\tDOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > QR.wasm\n\nQR.wat: QR.wasm\n\t@echo\n\t@echo \"####################################################################\"\n\t@echo \"##  24: WebAssembly (Binary format) -> WebAssembly (Text format)  ##\"\n\t@echo \"####################################################################\"\n\t@echo\n\t$(WASI_RUNTIME) QR.wasm > QR.wat\n\nQR.ws: QR.wat\n\t@echo\n\t@echo \"###################################################\"\n\t@echo \"##  25: WebAssembly (Text format) -> Whitespace  ##\"\n\t@echo \"###################################################\"\n\t@echo\n\twat2wasm QR.wat -o QR.wat.wasm\n\t$(WASI_RUNTIME) QR.wat.wasm > QR.ws\n\nQR.xslt: QR.ws\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  26: Whitespace -> XSLT  ##\"\n\t@echo \"##############################\"\n\t@echo\n\truby vendor/whitespace.rb QR.ws > QR.xslt\n\nQR.yab: QR.xslt\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  27: XSLT -> Yabasic  ##\"\n\t@echo \"###########################\"\n\t@echo\n\txsltproc QR.xslt > QR.yab\n\nQR.yorick: QR.yab\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  28: Yabasic -> Yorick  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tyabasic QR.yab > QR.yorick\n\nQR.azm: QR.yorick\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  29: Yorick -> Zoem  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tyorick -batch QR.yorick > QR.azm\n\nQR.zsh: QR.azm\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  30: Zoem -> zsh  ##\"\n\t@echo \"#######################\"\n\t@echo\n\tzoem -i QR.azm > QR.zsh\n\nQR.+: QR.zsh\n\t@echo\n\t@echo \"#####################\"\n\t@echo \"##  31: zsh -> A+  ##\"\n\t@echo \"#####################\"\n\t@echo\n\tzsh QR.zsh > QR.+\n\nqr.adb: QR.+\n\t@echo\n\t@echo \"#####################\"\n\t@echo \"##  32: A+ -> Ada  ##\"\n\t@echo \"#####################\"\n\t@echo\n\ta+ QR.+ > qr.adb\n\nQR.als: qr.adb\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  33: Ada -> AFNIX  ##\"\n\t@echo \"########################\"\n\t@echo\n\tgnatmake qr.adb\n\t./qr > QR.als\n\nQR.aheui: QR.als\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  34: AFNIX -> Aheui  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tLANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > QR.aheui\n\nQR.a68: QR.aheui\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  35: Aheui -> ALGOL 68  ##\"\n\t@echo \"#############################\"\n\t@echo\n\truby vendor/aheui.rb QR.aheui > QR.a68\n\nQR.ante: QR.a68\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  36: ALGOL 68 -> Ante  ##\"\n\t@echo \"############################\"\n\t@echo\n\ta68g QR.a68 > QR.ante\n\nQR.aj: QR.ante\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  37: Ante -> AspectJ  ##\"\n\t@echo \"###########################\"\n\t@echo\n\truby vendor/ante.rb QR.ante > QR.aj\n\nQR.asy: QR.aj\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  38: AspectJ -> Asymptote  ##\"\n\t@echo \"################################\"\n\t@echo\n\tajc QR.aj\n\tjava QR > QR.asy\n\nQR.dats: QR.asy\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  39: Asymptote -> ATS  ##\"\n\t@echo \"############################\"\n\t@echo\n\tasy QR.asy > QR.dats\n\nQR.awk: QR.dats\n\t@echo\n\t@echo \"######################\"\n\t@echo \"##  40: ATS -> Awk  ##\"\n\t@echo \"######################\"\n\t@echo\n\tpatscc -o QR QR.dats\n\t./QR > QR.awk\n\nQR.bash: QR.awk\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  41: Awk -> bash  ##\"\n\t@echo \"#######################\"\n\t@echo\n\tawk -f QR.awk > QR.bash\n\nQR.bc: QR.bash\n\t@echo\n\t@echo \"######################\"\n\t@echo \"##  42: bash -> bc  ##\"\n\t@echo \"######################\"\n\t@echo\n\tbash QR.bash > QR.bc\n\nQR.bsh: QR.bc\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  43: bc -> BeanShell  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tBC_LINE_LENGTH=4000000 bc -q QR.bc > QR.bsh\n\nQR.bef: QR.bsh\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  44: BeanShell -> Befunge  ##\"\n\t@echo \"################################\"\n\t@echo\n\tbsh QR.bsh > QR.bef\n\t@stty echo\n\nQR.Blc: QR.bef\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  45: Befunge -> BLC8  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tcfunge QR.bef > QR.Blc\n\nQR.bf: QR.Blc\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  46: BLC8 -> Brainfuck  ##\"\n\t@echo \"#############################\"\n\t@echo\n\truby vendor/blc.rb < QR.Blc > QR.bf\n\nQR.c: QR.bf\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  47: Brainfuck -> C  ##\"\n\t@echo \"##########################\"\n\t@echo\n\truby vendor/bf.rb QR.bf > QR.c\n\nQR.cpp: QR.c\n\t@echo\n\t@echo \"####################\"\n\t@echo \"##  48: C -> C++  ##\"\n\t@echo \"####################\"\n\t@echo\n\t$(CC) -o QR QR.c\n\t./QR > QR.cpp\n\nQR.cs: QR.cpp\n\t@echo\n\t@echo \"#####################\"\n\t@echo \"##  49: C++ -> C#  ##\"\n\t@echo \"#####################\"\n\t@echo\n\t$(CXX) -o QR QR.cpp\n\t./QR > QR.cs\n\nQR.chef: QR.cs\n\t@echo\n\t@echo \"######################\"\n\t@echo \"##  50: C# -> Chef  ##\"\n\t@echo \"######################\"\n\t@echo\n\techo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.cs\" /></ItemGroup></Project>' > tmp.csproj\n\tDOTNET_NOLOGO=1 dotnet run --project tmp.csproj > QR.chef\n\nQR.clj: QR.chef\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  51: Chef -> Clojure  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tPERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl\n\tperl QR.chef.pl > QR.clj\n\nQR.cmake: QR.clj\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  52: Clojure -> CMake  ##\"\n\t@echo \"############################\"\n\t@echo\n\tclojure QR.clj > QR.cmake\n\nQR.cob: QR.cmake\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  53: CMake -> Cobol  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tcmake -P QR.cmake > QR.cob\n\nQR.coffee: QR.cob\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  54: Cobol -> CoffeeScript  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tcobc -O2 -x QR.cob\n\t./QR > QR.coffee\n\nQR.lisp: QR.coffee\n\t@echo\n\t@echo \"#######################################\"\n\t@echo \"##  55: CoffeeScript -> Common Lisp  ##\"\n\t@echo \"#######################################\"\n\t@echo\n\tcoffee --nodejs --stack_size=100000 QR.coffee > QR.lisp\n\nQR.cr: QR.lisp\n\t@echo\n\t@echo \"##################################\"\n\t@echo \"##  56: Common Lisp -> Crystal  ##\"\n\t@echo \"##################################\"\n\t@echo\n\tclisp QR.lisp > QR.cr\n\nQR.d: QR.cr\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  57: Crystal -> D  ##\"\n\t@echo \"########################\"\n\t@echo\n\tcrystal QR.cr > QR.d\n\nQR.dc: QR.d\n\t@echo\n\t@echo \"###################\"\n\t@echo \"##  58: D -> dc  ##\"\n\t@echo \"###################\"\n\t@echo\n\tgdc -o QR QR.d\n\t./QR > QR.dc\n\nQR.dhall: QR.dc\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  59: dc -> Dhall  ##\"\n\t@echo \"#######################\"\n\t@echo\n\tdc QR.dc > QR.dhall || true\n\nQR.exs: QR.dhall\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  60: Dhall -> Elixir  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tdhall text --file QR.dhall > QR.exs\n\nQR.el: QR.exs\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  61: Elixir -> Emacs Lisp  ##\"\n\t@echo \"################################\"\n\t@echo\n\telixir QR.exs > QR.el\n\nQR.erl: QR.el\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  62: Emacs Lisp -> Erlang  ##\"\n\t@echo \"################################\"\n\t@echo\n\temacs -Q --script QR.el > QR.erl\n\nQR.e: QR.erl\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  63: Erlang -> Execline  ##\"\n\t@echo \"##############################\"\n\t@echo\n\tescript QR.erl > QR.e\n\nQR.fsx: QR.e\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  64: Execline -> F#  ##\"\n\t@echo \"##########################\"\n\t@echo\n\texeclineb QR.e > QR.fsx\n\nQR.false: QR.fsx\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  65: F# -> FALSE  ##\"\n\t@echo \"#######################\"\n\t@echo\n\techo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.fsx\" /></ItemGroup></Project>' > tmp.fsproj\n\tDOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > QR.false\n\nQR.fl: QR.false\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  66: FALSE -> Flex  ##\"\n\t@echo \"#########################\"\n\t@echo\n\truby vendor/false.rb QR.false > QR.fl\n\nQR.fish: QR.fl\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  67: Flex -> Fish  ##\"\n\t@echo \"########################\"\n\t@echo\n\tflex -o QR.fl.c QR.fl\n\tgcc -o QR QR.fl.c\n\t./QR > QR.fish\n\nQR.fs: QR.fish\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  68: Fish -> Forth  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tfish QR.fish > QR.fs\n\nQR.f: QR.fs\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  69: Forth -> FORTRAN77  ##\"\n\t@echo \"##############################\"\n\t@echo\n\tgforth QR.fs > QR.f\n\nQR.f90: QR.f\n\t@echo\n\t@echo \"##################################\"\n\t@echo \"##  70: FORTRAN77 -> Fortran90  ##\"\n\t@echo \"##################################\"\n\t@echo\n\t@mv QR.c QR.c.bak\n\tgfortran -o QR QR.f\n\t./QR > QR.f90\n\t@mv QR.c.bak QR.c\n\nQR.gbs: QR.f90\n\t@echo\n\t@echo \"######################################\"\n\t@echo \"##  71: Fortran90 -> Gambas script  ##\"\n\t@echo \"######################################\"\n\t@echo\n\tgfortran -o QR QR.f90\n\t./QR > QR.gbs\n\nQR.g: QR.gbs\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  72: Gambas script -> GAP  ##\"\n\t@echo \"################################\"\n\t@echo\n\t$(GBS) QR.gbs > QR.g\n\nQR.gdb: QR.g\n\t@echo\n\t@echo \"######################\"\n\t@echo \"##  73: GAP -> GDB  ##\"\n\t@echo \"######################\"\n\t@echo\n\tgap -q QR.g > QR.gdb\n\nQR.gel: QR.gdb\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  74: GDB -> GEL (Genius)  ##\"\n\t@echo \"###############################\"\n\t@echo\n\tgdb -q -x QR.gdb > QR.gel\n\nQR.plt: QR.gel\n\t@echo\n\t@echo \"###################################\"\n\t@echo \"##  75: GEL (Genius) -> Gnuplot  ##\"\n\t@echo \"###################################\"\n\t@echo\n\tgenius QR.gel > QR.plt\n\nQR.go: QR.plt\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  76: Gnuplot -> Go  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tgnuplot QR.plt > QR.go\n\nQR.gs: QR.go\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  77: Go -> GolfScript  ##\"\n\t@echo \"############################\"\n\t@echo\n\tgo run QR.go > QR.gs\n\nQR.gpt: QR.gs\n\t@echo\n\t@echo \"####################################\"\n\t@echo \"##  78: GolfScript -> G-Portugol  ##\"\n\t@echo \"####################################\"\n\t@echo\n\truby vendor/golfscript.rb QR.gs > QR.gpt\n\nQR.grass: QR.gpt\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  79: G-Portugol -> Grass  ##\"\n\t@echo \"###############################\"\n\t@echo\n\tmv QR.c QR.c.bak\n\tgpt -t QR.c QR.gpt\n\tgcc -o QR QR.c\n\t./QR > QR.grass\n\tmv QR.c.bak QR.c\n\nQR.groovy: QR.grass\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  80: Grass -> Groovy  ##\"\n\t@echo \"###########################\"\n\t@echo\n\truby vendor/grass.rb QR.grass > QR.groovy\n\nQR.gz: QR.groovy\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  81: Groovy -> Gzip  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tgroovy QR.groovy > QR.gz\n\nQR.hs: QR.gz\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  82: Gzip -> Haskell  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tgzip -cd QR.gz > QR.hs\n\nQR.hx: QR.hs\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  83: Haskell -> Haxe  ##\"\n\t@echo \"###########################\"\n\t@echo\n\trm -f QR.o\n\tghc QR.hs\n\t./QR > QR.hx\n\nQR.icn: QR.hx\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  84: Haxe -> Icon  ##\"\n\t@echo \"########################\"\n\t@echo\n\thaxe -main QR -neko QR.n\n\tneko QR.n > QR.icn\n\nQR.i: QR.icn\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  85: Icon -> INTERCAL  ##\"\n\t@echo \"############################\"\n\t@echo\n\ticont -s QR.icn\n\t./QR > QR.i\n\nQR.j: QR.i\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  86: INTERCAL -> Jasmin  ##\"\n\t@echo \"##############################\"\n\t@echo\n\t@mv QR.c QR.c.bak\n\tick -bfOc QR.i\n\tgcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick\n\t./QR > QR.j\n\t@mv QR.c.bak QR.c\n\nQR.java: QR.j\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  87: Jasmin -> Java  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tjasmin QR.j\n\tjava QR > QR.java\n\nQR.js: QR.java\n\t@echo\n\t@echo \"##############################\"\n\t@echo \"##  88: Java -> JavaScript  ##\"\n\t@echo \"##############################\"\n\t@echo\n\tjavac QR.java\n\tjava QR > QR.js\n\nQR.jq: QR.js\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  89: JavaScript -> Jq  ##\"\n\t@echo \"############################\"\n\t@echo\n\t$(JAVASCRIPT) QR.js > QR.jq\n\nQR.jsfuck: QR.jq\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  90: Jq -> JSFuck  ##\"\n\t@echo \"########################\"\n\t@echo\n\tjq -r -n -f QR.jq > QR.jsfuck\n\nQR.kt: QR.jsfuck\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  91: JSFuck -> Kotlin  ##\"\n\t@echo \"############################\"\n\t@echo\n\tulimit -s unlimited && $(JAVASCRIPT) --stack_size=100000 QR.jsfuck > QR.kt\n\nQR.ksh: QR.kt\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  92: Kotlin -> ksh  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tkotlinc QR.kt -include-runtime -d QR.jar\n\tkotlin QR.jar > QR.ksh\n\nQR.lazy: QR.ksh\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  93: ksh -> Lazy K  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tksh QR.ksh > QR.lazy\n\nQR.ls: QR.lazy\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  94: Lazy K -> LiveScript  ##\"\n\t@echo \"################################\"\n\t@echo\n\tlazyk QR.lazy > QR.ls\n\nQR.ll: QR.ls\n\t@echo\n\t@echo \"##################################\"\n\t@echo \"##  95: LiveScript -> LLVM asm  ##\"\n\t@echo \"##################################\"\n\t@echo\n\t@mv QR.c QR.c.bak\n\tlsc QR.ls > QR.ll\n\t@mv QR.c.bak QR.c\n\nQR.lol: QR.ll\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  96: LLVM asm -> LOLCODE  ##\"\n\t@echo \"###############################\"\n\t@echo\n\t@mv QR.bc QR.bc.bak\n\tllvm-as QR.ll\n\tlli QR.bc > QR.lol\n\t@mv QR.bc.bak QR.bc\n\nQR.lua: QR.lol\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  97: LOLCODE -> Lua  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tlci QR.lol > QR.lua\n\nQR.m4: QR.lua\n\t@echo\n\t@echo \"#####################\"\n\t@echo \"##  98: Lua -> M4  ##\"\n\t@echo \"#####################\"\n\t@echo\n\tlua5.3 QR.lua > QR.m4\n\nQR.mk: QR.m4\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  99: M4 -> Makefile  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tm4 QR.m4 > QR.mk\n\nQR.mzn: QR.mk\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  100: Makefile -> MiniZinc  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tmake -f QR.mk > QR.mzn\n\nQR.mod: QR.mzn\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  101: MiniZinc -> Modula-2  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tminizinc --solver COIN-BC --soln-sep '' QR.mzn > QR.mod\n\nQR.il: QR.mod\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  102: Modula-2 -> MSIL  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tgm2 -fiso QR.mod -o QR\n\t./QR > QR.il\n\nQR.mustache: QR.il\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  103: MSIL -> Mustache  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tilasm QR.il\n\tmono QR.exe > QR.mustache\n\nQR.asm: QR.mustache\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  104: Mustache -> NASM  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tmustache QR.mustache QR.mustache > QR.asm\n\nQR.neko: QR.asm\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  105: NASM -> Neko  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tnasm -felf QR.asm\n\tld -m elf_i386 -o QR QR.o\n\t./QR > QR.neko\n\nQR.5c: QR.neko\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  106: Neko -> Nickle  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tnekoc QR.neko\n\tneko QR.n > QR.5c\n\nQR.nim: QR.5c\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  107: Nickle -> Nim  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tnickle QR.5c > QR.nim\n\nQR.m: QR.nim\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  108: Nim -> Objective-C  ##\"\n\t@echo \"###############################\"\n\t@echo\n\tnim compile QR.nim\n\t./QR > QR.m\n\nQR.ml: QR.m\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  109: Objective-C -> OCaml  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tgcc -o QR QR.m\n\t./QR > QR.ml\n\nQR.octave: QR.ml\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  110: OCaml -> Octave  ##\"\n\t@echo \"############################\"\n\t@echo\n\tocaml QR.ml > QR.octave\n\nQR.ook: QR.octave\n\t@echo\n\t@echo \"###########################\"\n\t@echo \"##  111: Octave -> Ook!  ##\"\n\t@echo \"###########################\"\n\t@echo\n\tmv QR.m QR.m.bak\n\toctave -qf QR.octave > QR.ook\n\tmv QR.m.bak QR.m\n\nQR.gp: QR.ook\n\t@echo\n\t@echo \"############################\"\n\t@echo \"##  112: Ook! -> PARI/GP  ##\"\n\t@echo \"############################\"\n\t@echo\n\truby vendor/ook-to-bf.rb QR.ook QR.ook.bf\n\truby vendor/bf.rb QR.ook.bf > QR.gp\n\nQR.p: QR.gp\n\t@echo\n\t@echo \"################################\"\n\t@echo \"##  113: PARI/GP -> Parser 3  ##\"\n\t@echo \"################################\"\n\t@echo\n\tgp -f -q QR.gp > QR.p\n\nQR.pas: QR.p\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  114: Parser 3 -> Pascal  ##\"\n\t@echo \"###############################\"\n\t@echo\n\tparser3 QR.p > QR.pas\n\nQR.pl: QR.pas\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  115: Pascal -> Perl 5  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tfpc QR.pas\n\t./QR > QR.pl\n\nQR.pl6: QR.pl\n\t@echo\n\t@echo \"#############################\"\n\t@echo \"##  116: Perl 5 -> Perl 6  ##\"\n\t@echo \"#############################\"\n\t@echo\n\tperl QR.pl > QR.pl6\n\nQR.php: QR.pl6\n\t@echo\n\t@echo \"##########################\"\n\t@echo \"##  117: Perl 6 -> PHP  ##\"\n\t@echo \"##########################\"\n\t@echo\n\tperl6 QR.pl6 > QR.php\n\nQR.png: QR.php\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  118: PHP -> Piet  ##\"\n\t@echo \"########################\"\n\t@echo\n\tphp QR.php > QR.png\n\nQR.pike: QR.png\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  119: Piet -> Pike  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tnpiet QR.png > QR.pike\n\nQR.ps: QR.pike\n\t@echo\n\t@echo \"###############################\"\n\t@echo \"##  120: Pike -> PostScript  ##\"\n\t@echo \"###############################\"\n\t@echo\n\tpike QR.pike > QR.ps\n\nQR.prolog: QR.ps\n\t@echo\n\t@echo \"#################################\"\n\t@echo \"##  121: PostScript -> Prolog  ##\"\n\t@echo \"#################################\"\n\t@echo\n\tgs -dNODISPLAY -q QR.ps > QR.prolog\n\nQR.pr: QR.prolog\n\t@echo\n\t@echo \"#####################################\"\n\t@echo \"##  122: Prolog -> Promela (Spin)  ##\"\n\t@echo \"#####################################\"\n\t@echo\n\tswipl -q -t qr -f QR.prolog > QR.pr\n\nQR.py: QR.pr\n\t@echo\n\t@echo \"#####################################\"\n\t@echo \"##  123: Promela (Spin) -> Python  ##\"\n\t@echo \"#####################################\"\n\t@echo\n\tspin -T QR.pr > QR.py\n\nQR.R: QR.py\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  124: Python -> R  ##\"\n\t@echo \"########################\"\n\t@echo\n\tpython3 QR.py > QR.R\n\nQR.ratfor: QR.R\n\t@echo\n\t@echo \"########################\"\n\t@echo \"##  125: R -> Ratfor  ##\"\n\t@echo \"########################\"\n\t@echo\n\tR --slave -f QR.R > QR.ratfor\n\nQR.rc: QR.ratfor\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  126: Ratfor -> rc  ##\"\n\t@echo \"#########################\"\n\t@echo\n\tratfor -o QR.ratfor.f QR.ratfor\n\tgfortran -o QR QR.ratfor.f\n\t./QR > QR.rc\n\nQR.rexx: QR.rc\n\t@echo\n\t@echo \"#######################\"\n\t@echo \"##  127: rc -> REXX  ##\"\n\t@echo \"#######################\"\n\t@echo\n\trc QR.rc > QR.rexx\n\nQR2.rb: QR.rexx\n\t@echo\n\t@echo \"#########################\"\n\t@echo \"##  128: REXX -> Ruby  ##\"\n\t@echo \"#########################\"\n\t@echo\n\trexx ./QR.rexx > QR2.rb\n\nclean:\n\t@mv QR.rb quine-relay.rb\n\trm -f qr QR qr.* QR.* QR2.rb *.class gst.im\n\t@mv quine-relay.rb QR.rb\n"
  },
  {
    "path": "QR.rb",
    "content": "eval$s=%q(eval(%w(B=92.chr;g=32.chr;puts(eval(%q(N=10.chr;n=0;e=->s{Q[Q[s,B],?\"].K(N,B+?n)};E=->s{'(\"'+e[s]+'\")'};d=->s,t=?\"{s.K(t){t+t}};def~f(s,n)s.K(/.{1,#{n*255}}/m){yield$S=E[$s=$&]}end;Q=->s,t=?${s.K(t){B+$&}};R=\";return~0;\";V=->s,a,z{s.K(/(\n#{B*4})+/){a+\"#{$&.size/2}\"+z}};C=%w(System.Console~Write);$C=C*?.;$D=\"program~QR\";$G=\"~contents~of\"+$F=\"~the~mix!g~bowl\";$L=\"public~static\";$W=\"s.WriteByte\";rp=->s,r{v=\"\";[r.!ject(s){|s,j|o={};m=n=0;s.size.times{|i|o[f=s[i,2]]||=0;c=o[f]+=1;m<c&&\n(m=c;n=f)};v=n+v;s.K(n,(j%256).chr)},v]};%(fn~mX{Z`x21(\"{}\",#{E[\"object~QR~extends~App{#{f(%((display~\"#{e[%(Zf(\"1d;s/.//;s/1/~the~sum~of~a~son~and0/g;s/0/~twice/g;s/2/`x59ou~are~as~bad~as/g;s/3/~a~son`x21Speak~your~m!d`x21/g^n#The~Relay~of~Qu!e.^\nn#Ajax,~a~man.^n#Ford,~a~man.^n#Act~i:~Qu!e.^n#Scene~i:~Relay.^n#[Enter~Ajax~and~Ford]^n#Ajax:^n#\");function[]=f(s);for~i=1:2:length(s),Zf(\"2%s3\",part(dec2b!(hex2dec(part(s,i:i+1))),$:-1:2)),end;endfunction`n#{s,v=rp[\"Z\"+E[%(fun~p~n=Z(Int.toSJ~n`x\n5e\"~\");fun~mX=(p~0;p~0;p~130;List.tabulate(127,p);SJ.map(fn~c=>(p(3+ord~c);Z\"-1~0~\";c))#{E[~~~~~~%(object\"Application\"{state\"ma!\"{foreach(s~![#{f(\"Z#{E[%(puts~\"#{Q[e[%(echo~'a::=`x7e#{Q[Q[\"let~s=#{E[%(void~p(!t[]c){foreach(!t~v~!~c)stdout.Zf(\"%c%c\n\",v/256,v%256);}void~mX{!t[]a;p({19796,26724,0,6,0,1,480,19796,29291,#{s=%(module~QR;!itial~beg!~#{f((%(Module~QR`nSub~MX`nDim~c,n:Dim~s~As~Object=#{C[0]}.OpenStandardOutput():Dim~t()As~Short={26,34,86,127,148,158,200}:For~Each~d~!\"BasmCBBBCRE`x60\nF<<<<C<`x60C<B`x60BBD#C`x58wasi_snapshot_preview1`x4afd_HBBEEDCDGECB@IUD`x48memoryDB`x48_startBDL|DRBAC~BA`x4alACA4RB9MiCD<AERCA>D`x21BE@ABRCABRCABRCA`x4a`x21CE@~B-BB~CACk:CvACqRC~COBMADRCACRCADRCABRCABRC~BACj:B-BBOBMADRCADRCADRCAFRCMM}CBABM`x7e#{\n40.chr}BBBCBBB,BBBDBBB0BBBDBBB4BBB=BBB?BBB;BBB~...^t..^n..(module(import~:wasi_snapshot_preview1:~:fd_H:~(func(param~i32~i32~i32~i32)(result~i32)))(memory(export~:memory:)(data~:^08^00^00^00$:))(func(export~:_start:)i32.const~1~i32.const~0~i32.con\nst~1~i32.const~0~call~0~drop))\":c=Asc(d):If~c=36:For~c=0To~11:#$W(If(c~Mod~3,Asc(#{s=\"<?xml#{O=\"~version='1.0'\"}?><?xml-#{I=\"stylesheet\"}~type='text/xsl'href='QR.xslt'?><xsl:#{I+O}~xmlns:xsl='http://www.w3.org/1999/`x58SL/Transform'><xsl:output~me\nthod='text'/><#{U=\"xsl:template\"}~match='/'><`x21[CDATA[#{%(su b~f(s$,n)  Z(s$);:for~i=1to~n~Z(\"Y\");:next:end~sub:f(\"#{V[e[%(H,format=\"#{y=\"\";f(\"^H{-}{txt}{#{Q[\"echo~-E~$'#{Q[Q[E[%(with~Ada.Text_Io;procedure~qr~is~beg!~Ada.Text_Io.Put(\"#{d[%(trans\n~B(Buffer)`ntrans~O(n){`nB:add(Byte(+~128~n))}`ntra ns~f(v     ~n){      `nO(+(/~    n~64)107)`nO(n:mod~64)`nO~v}`ntrans~D(n){if(<~n~4){f(+(*~6~n)9)48}{if(n:odd-p){D(-~n~3)`nf~27~48`nf~36~11}{D(/~n~2)`nf~21~48`nf~48~20}}}`ntrans~S(Buffer\"#{e[%W[ST\nRINGz:=~226+~153,a:=z+~166,b:=a+\"2\"+z+~160,c:=b+\"   8\"+       z                     +~165,t:=\"#{d[%(class~QR{#$L~void~ma!(SJ[]a){a=#{E[\"H('#{Q[e[\"implement~ma!0()=Z\"+E[                \"BEGIN{Z#{E[%(echo~'#{%(f(s){System.out.Z(s);}s=\"389**6+44*6+00\np45*,\";for(c:#{E[(s=\"#!clude<iostream>`n!t~mX{s    td                                          ::cout<<#{E[%(class~Program{#$L~void~MX{#$C(\"Qu!e~Relay~Coffee.                                  ^n^nIngredients.^n\");for(!t~i=9;i++<126;)#$C($\"{i}~g~ca\nffe!e~{i}^n\");#$C(\"^nMethod.^n\");foreach(char                                                ~c~!#{E[%((doseq[s(lazy-cat[\"IDENTIFICATION~DIVISION.\"\"PROGR                                            AM-ID.~QR.\"\"PROCEDURE~DIVISION.\"'DISPLA`x59](map~#\n(str\"~~~~^\"\"(.replace~%1\"^\"\"\"^\"^\"\")\"^\"\")(re-                                                        seq~#\".{1,45}\"\"#{e[\"(f=(n)->Array(n+1).jo!~'Y');c                                                    onsole.log('%s',#{V[E[%((H-l!e\"#{e[\"puts#{E[\"i\nmport~std.stdio;void~mX{H(`x60#{\"['']p[#{\"I                                                             O.puts\"+E[%((pr!c~\"#{e[\"`nma!(_)->`nio:fH#                                                          {d[E[%(echo~\"#{e['Zfn(\"\"\"'+d[?\"+\"%option~no\nyywrap`n%%`n%%`n!t~mX{puts#{E[\"echo~'#{Q[                                                             Q[%(~:~A~.\"#{g*9}\"~;~:~B~A~.\"~WRITE(*,*)'                                                                \"~A~;~:~C~B~T`x59PE~.\"~'\"~CR~;~:~D~S\"~#$\nD\"~C~S^\"~Z~^\"(&\"~C~S^\"~#{e[%(Z\"#{e[\"s:=     Outp                                                           utTextUser();WriteAll(s,#{E[%(Zf\"#                          {e[d[f('set~Z\"                             -\";Z'+E[%(package~ma!;import\"fmt\";fun\nc~mX{fmt.Pr!t#{E[%(236:j;{119:i;{206i-     :i;.4                                                               8<{71+}{[i]^48-*}if}%}:t;\"al                     goritmo~QR;!\"[195][173]++'ci                       o~imprima(\"'\"013141\"t\"/12131\"t~6*\"/1\n:1918151:??6271413/4=3626612/2/353251      215/                                                              `x5a0`x5a0R\"t\"#{e[%(z=new~j                   ava.util.zip.G`x5aIPOutputStream(Syste                    m.out);z.H('#{\"ma!=putStr\"+E[\"clas\ns~QR{#$L~function~mX{neko.Lib.Z#{E[%(                      procedure~mX;i:=c:=0;s                                :=#{E[%(.class~public~                 QR`n.super~#{$T=\"java/io/Pr!tStream\"}`n.meth                   od~#$L~ma!([L#{S=\"java/lang/S\"}J\n;)V~;]`n.limit~stack~2`ngetstatic~#{S  }yst         em/out~L#$T;`nldc~\"#{e[%(class~QR{                              #$L~void~ma!(SJ[]                v){SJ~c[]=new~SJ[99999],y=\"\",z=y,s=\"#{z=t=(0..r=q=                 126).map{|n|[n,[]]};a=\"\";b=->n{\na<<(n%78+55)%84+42};(%(P={0:'[+[]]',m:'  ((+[])'+(C=\"['constructor']\")+\"+[])['11']\"};for(R                            ~!~B=('`x21[]                @`x21`x21[]@[][[]]@'+(A=\"[]['fill']\")+\"@([]+[])['fontc                 olor']([])@(+('11e20')+[])['s\nplit']([])@\"+A+C+\"('return~escape')(     )(\"+A+')').split('@'))for(E~!~D=eval(G='('+B[R]+'+[                         ])'))P[T=D[E                ]]=P[T]||G+\"['\"+E+\"']\";for(G='[',B=0;++B<36;)P[D=B.toSJ(36                )]=B<10?(G+='+`x21+[]')+']':\nP[D]||\"(+('\"+B+\"'))['to'+([]+[])\"      +C+\"['name']]('36')\";A+=C+\"('console.log(unescape(^\"\";fo                         r(E~!~G=               #{E[\"fun~ma!(a:Array<SJ>){Z#{Q[E[%(p(){~echo~-n~$1;};f(){~for                ~x~!~$(p~\"$1\"|od~-An~-tu1~-\nv);do;p~$4;for((j=$3;j--;));do;h     ~$2~$x~$j;done;done;};p~k^`x60;h(){~p~^`x60${1:$(($2>>$3&1))                         :2};               };f~'console.log#{Q[E[%(@s=global[#{i=(s=%(`x48AI~1.2`nVISIBLE~\"#               {\"x=sJ.K(#{V[E[\"changequot\ne(<@,@>)`ndef!e(p,<@#{\"all:`n`      t@echo~'#{d[\"solve~satisfy;output~[#{E[\"MODULE~QR;FROM~StrIO~IM                        PO   RT~WriteSJ;BEGIN~#{(%(.assembly~t{}.method~#$L~void~MX{.entrypo!t~ldstr\"#{e[\"m{              {`x21:~x`nqr:~|-`n~:db`x60\n#{e[s=\"$Z#{E[\"Zf#{E[\"echo#{E      [\"#import<stdio.h>#{N}!t~mX{puts#{E[\"Z_sJ\"+E[\"s=double#{E[\"Z#{E[\"$c                     onsole                 :l!e[#{\"#$D(output);beg!~H(#{f((p=\"eval\";%($_=\"#{s,v=rp[\"$_='#{              Q[%(<?php~$z=3+$w=strlen(\n$s=#{Q[E[\"!t~mX{H#{E[\"(#{Q[      \"qr:-H('#{Q[e[\"!it{#{f(%(Z('cat(\"')`nfor~c~!\"\".jo!([\"echo~'say~''%s'''                                                      ^n\"%l~for~l~!#{E[d[d[\"eval$s=%q(#$s)\",?'],?']]}.spl               it(\"^n\")]):Z('r=fput(cha\nr(%d))'%ord(c))`nZ('end^n\"      )')#),6){\"Zf#{d[$S,?%]};\"}}}\"],?']}').\",B]})Z~quit\"]+R}}\"]]})*3;echo\"^x8                                                           9PNG^r^n^x1a^n\";$m=\"\";$t=\"^xc0^0^xff\";for($i=-              1;++$i<128*$z;$m.=$c--?(\n$w-$c||$i>$z)&&$i/$z<($c<      $w?ord($s[(!t)($c/3)]):$c--%3+2)?$t[2].$t[$c%3%2].$t[$c%3]:\"^0^0^0\":\"^0\")$c                                                              =$i%$z;foreach(array(\"I`x48DR\".pack(\"NNCV              \",$w+2,128,8,2),\"IDAT\".g\nzcompress($m),\"IEND\")as$d      )echo~pack(\"NA*N\",strlen($d)-4,$d,crc32($d));).K(B,\"`x7f\"),?']}';s:g/^x7f/Y/                                                                 ;Z~$_\",128..287];s=\"$_='#{Q[s,c=/['Y]              /]}';$n=32;$s='#{Q[v,c]}\n';$s=`x7es{..}{$a=$&;$b=      chr(--$n&255);`x7es/$b/$a/g;}eg;Z\";(s+N*(-s.size%6)).unpack(\"B*\")[0].K(/.{6}/){                                                                   n=$&.to_i~2;((n+14)/26*6+n+47).chr              }}\";s|.|$n=ord$&;substr\n~unpack(B8,chr$n-!t($n/3      2)*6-41),2|eg;eval~pack'B*',$_).scan(/[~,-:A-z]+|(.)/){p=\"s++#{$1?\"chr~#{$1.ord}                                                                     +e\":$&+?+};\"+p};p),1){\"'#$s',\"}              }'')end.\".K(/[:;()]/){?\n`x5e+$&}}]\"]};quit\"]};t       =num2cell(b=11-ceil(s/13));for~n=1:9m={};for~i=1:141f=@(x,y,n)repmat(['Ook'~char(x                                                                      )~'~Ook'~char(y)~'~'],[1~ab               s(n)]);m(i)=[f(z=46,63,\nn)~f(q=z-(i<13)*13,q,i-       13)~f(33,z,1)~f(63,z,n)];end;t(x=b==n)=m(diff([0~s(x)])+13);end;Zf('%%s',t{:})\"]]+R                                                                        }}\"]}\"]}`n\"]};\"]}`x60`n~              global~_start`n~_start:m\nov~edx,#{s.size}`n~mov~       ecx,m`n~mov~ebx,1`n~mov~eax,4`n~!t~128`n~mov~ebx,0`n~mov~eax,1`n~!t~128`nx:~|`n~}}  {                                                                         {{qr}}}\"]}\"call~void~              [mscorlib]#{C*\"::\"}(sJ)r\net})).K(/()[#{i=94.chr}       \"]+|[#{i}']+/){[\"WriteSJ(\",$&,\");\"]*($1??\":?')}}END~QR.\"]}];\",?$].K(?'){\"'^''\"}}     '\"                    }@>)`np\"],          ?&,?                             &]},'&(%d+)&',func               tion(s)return~sJ.rep('Y'\n,tonumber(s))end);Z(x)\"       .K(/[:\"]/,\":^0\")}\"`n`x4bT`x48`x58B`x59E~B`x59E)).size+1}x~i8]c\"#{s.K(/[^\"`n`t]/        )                   {\"^%02`x58\"%$     &.ord}}^00\"                          declare~i32@put               s(i8*)def!e~i32@mX{%1=cal\nl~i32@puts(i8*getelement       ptr([#{i}x~i8],[#{i}x~i8]*@s,i32~0,i32~0))ret~i32~0})],?#].K(?',%('\"'\"'))}'~k          k                    i~7~'`x60`x60s  `x60`x60s`x60`          x60s`          x60`x60s`x60                `x60s`x60`x60s`x60`x60s`x\n60`x60si';h(){~p~${1:$((        (($2%83-10)>>((2-$3)*2))%4)):1};};f~'AG-`x48-`x48Fy.IlD==;=jdlAy=;=jldltld             lt                    l{lAulAy=jtlldlAyFy=?=jdlAyGFyF     yG2AFy>zlAFF       BCjldGyGF                y>GFy.AGy=G==n`x48==nlldC=\nj@=jtlldltldlAut11'~ski^`        x60~3)]]}~}\"]})A+=\"'+`x21[]+'\"+G.charCodeAt(E).toSJ(16);for(A+=\"^\".repla             ce(/                    '+`x21[]+'/g,^\"%^\")))')()\",R=0;R   <9;R++)A=A.repla     ce(/'.                *?'/g,function(B){T=[];for(\nE=1;B[E+1];)T.push(P[B[E++        ]]);return~T.jo!('+')});console.log('\"'+A+'\"'))).bytes{|n|r,z=z[n]||(             b[r/78];                    b[r];q<6083&&z[n]=[q+=1,[]];t[n] )};b[r/78];b[r]}\";!   t~i                 =0,n=0,q=0;for(;++n<126;)c[n\n]=\"\"+(char)n;for(;i<#{a.si         ze};){q=q*78+(s.charAt(i)-13)%84;if(i++%2>0){y=q<n?c[q]:y;c[n++]=z              +y.charAt(                     0);System.out.Z(z=c[q]);q=0;}}}})]}\"`n!vokevirtual~# $                  T/Zln(L#{S}J;)V`nreturn`n.end\n~method)+N]};H(\"DO,1<-#\"||*         s);s?while~t:=ord(move(1))do{i+:=1;u:=-i;every~0to~7do{u:=u*2+t              %2;t/:=2};H(\"P                      LEASE\")^(i%4/3);H(\"DO,1SUB#\"||i||\"<-#\"||((c-u)%25                   6));c:=u;};H(\"PLEASEREADOUT,1^\nnPLEASEGIVEUP\");end)]};}}\"].          tr(?\"+B,\"`x21`x7e\")}'.tr('`x7e`x21','Y`u0022')as~byte[]);z.c             lose())]}\"{\"W\"\"w\"@                      j~1+:j^-~118%1+*}%\"/35512416612G61913@921/17A                   331513\"t'\");fim')]};})],61){\"Zn#\n$S`n\"},?%]]}\"`nquit)]});CloseS          tream(s);QUIT;\"]}\")]}\"~DUP~A~.\"~DO~10~I=1,\"~.~CR~S\"~&A,              &\"~C~.\"~10~~~~~~CONTI                        NUE\"~CR~S^\"~&A)^\",&\"~C~0~DO~B~.\"~&char(                     \"~COUNT~.~.\"~),&'\"~CR~LOOP~S^\"~&^\n\"^\"\"~C~S\"~end~#$D\"~C~A~.\"~STOP\"           ~CR~A~.\"~END\"~CR~B`x59E~;~D~),B],?`x21].K(?',%('\"'\"               '))}'\"]};}\".K(?\"){'\"34,\"                          '}.K(N){'\"10,\"'}+?\",?%]+'~\"\"\")'                       ]}\")],?`x7e]}.\"]}\"))]}]p['']pq\"}`x6\n0);}\"]}\"]}\"))].K(?`x60,\"Yx60\"),'#            {f(',')}']})\"]}\"))[\"~~~~^\"~^\".\"\"STOP~RUN.\"])]                (Zln(str\"message(STATUS~^\"~~                              ~~~\"(.replace(.rep                            lace(str~s)\"Y\"\"YY\")\"^\"\"\"Y^\"\")\"^\")\")))\n).reverse]})#$C($\"Put~caffe!e~{(!t)             c}~!to#$F.^n\");#$C(\"Liquify#$G.^nPour#$                G~!to~the~bak!g~dish.^n^nServes~1.                                                                       ^n\");}})]};}/****//****/\";t={};b=\"\";L=\"\n\";n=i=0;D=->n{L<<(n+62)%92+35;D};s.by                tes{|c|n>0?n-=1:(t[c]=(t[c]||[                  ]).reject{|j|j<i-3560};x=[];t[c].map{|                                                                   j|k=(0..90).f!d{|k|not~s[i+1+k]==s[j+k]}|\n|91;k>4&&x<<[k,j]};x=x.max)?(n,j=x;x=b.                     size;(u=[x,3999                       ].m!;D[u%87][u/87];L<<b[0,u];b[0,u]=\"\";x-=u)                                                             while~x>0;x=4001+i-j;D[x%87][x/87][n-5]):b<<\nc;t[c]+=[i+=1]};\"#!clude<stdio.h>`nchar*p=                                                     #{E[L]},s[999999],*q=s;!t~mX{!t~n,m;for(;*p;){n=(*                                                       p-5)%92+(p[1]-5)%92*87;p+=2;if(n>3999)for(m=(*p\n++-5)%92+6;m--;q++)*q=q[4000-n];else~for(;n--                                               ;)*q++=*p++;}puts(s)#{R}}\")]}){s+=\"00g,\";for(m=1;m<256;m*                                               =2)s+=\"00g,4,:\"+(c/m%2>0?\"4+\":\"\")+\",\";f(s);s=\"4,:,\"\n;}f(s+s);for(c:Base64.getDecoder().decode(\"kaARERE                                      `x58/I0ALn3n5ef6l/Pz8+fnz58/BOf5/7/hE`x58/O`x5azM5mC`x58/Oczm`x5a                                       zBPn5+`x58/OczMznBL/nM5m`x5azBPu++fPPOc5zngnnO`x5azO`x5\nagnBMGAW7A==\")){c=c<0?256+c:c;for(i=0;i++<3;c/=8)f(c%8);                         f(\"8*+8*+,\");}f(\"@\");).K(?',%('\"'\"'))}'|sed~-e's/Y/YY/g'~-e's/\"/Yq/g'~-e's/.*/Z                         ~\"&\"^nquit/')]}}\"]],?']}');\".K(/^+/){\"`x5e#{$&.size}`x5e\"}]}.s\nplit(\"Y`x5e\");for(!t~i=1;i<a.length;a[0]+=a[i+1],i+=2){a[0]+=\"Y\".repeat(Integer.parseInt(a[i]));}System.out.Z(a[0]);}})]}\";FORiTO`~UPBtDO`~INTn:=ABSt[i];Z(~(50+n%64)+c+~(50+n%8MOD8)+c+~(50+nMOD8)+b+\"`x4a\"+a)OD]*\"REPR\"]}\")`nwhile(`x21=(S:length)0){\n`ntrans~c(S:read)`nD(c:to-!teger)`nf~35~39}`nf~24~149`n!terp:library\"afnix-sio\"`ntrans~o(afnix:sio:OutputTerm)`no:H~B)].K(N,'\"&Character'+?'+'Val(10)&\"')}\");end;)]+\"`nsys.exit~0\",B],?']}'\",/[^{}]/]}}\",35){y<<\",`n\"+$S;\"%s\"}}\")+y],'\",','):f(\"']}\",0)\n)}]]></#{U}></xsl:#{I}>\";s.size*16+3}.ToSJ(\"x8\")(1`x58or~7-c*2^3)),92)):Next:Else:n=(c>124)*(8*c-#{s.size+1294}):Do~While~n>127:#$W(128+(127And~n)):n^=128:Loop:#$W(If(c<125,If((c-1)^7-8,c+66*(c>65And~c<91),t(c-57)),n)):End~If:Next:For~Each~c~!\"#{d\n[s].K~N,'\"&~VbLf~&\"'}\":#$W(Asc(c)):Next:End~Sub:End~Module)).l!es.map{|s|\"let~s=#{E[s]}`nput=s`nZ`n\"}.jo!+\"qa`x21\",3){%($H(\"%s\",#$S);)+N}}end~endmodule);W=s.size*72+4;\"%d,%d\"%[W/65536,W%65536]}});foreach(!t~c~!#{E[s]}.data)foreach(!t~v~!~a={0,9,7,\n4,5,c/100*7/6+1,c%100/10*7/6+1,c%10*7/6+1,7})p({144,v=15450+v*256,384,v});p({255,12032});})]},i=0,t='k';while(s[i])t='^x60.'+s[i++]+t;console.log(t)\",B],?`x21].K(?',%('\"'\"'))}'\"^n::=^na\")],/[`[`]$]/]}\")]}\",4){$S+?,}}])Console.H(s);Application.exit\n();}})]};Z\"0~0~-1\");)],127..255];f(%(variable~s=`x60#{s.K(/.{1,234}/){$&.K(\"`x60\",%(`x60+\"`x60\"+`x60))+\"`x60+`n`x60\"}}`x60,i;for(i=0;i<129;i++)s=strreplace(s,pack(\"C\",255-i),substrbytes(`x60#{v[0,99]}`x60+`n`x60#{v[99..-1]}`x60,i*2+1,2));Zf(\"%s\",s\n)),7){\"f('%s')`n\"%$s.unpack(\"`x48*\")}}Zf(\"^n#[Exeunt]\");quit)]}\")),196){%(Z#$S;)}}}\"]});})).gsub(/[!HJKXYZ^`~]/){[B*2,:write,B,:tring,:gsub,\"ain()\",B*4,:print,g,:in][$&.ord%47%12]})))*\"\")#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_\n#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffer_for_future_bug_fixes_#_buffe\n####################################################################################  Quine Relay -- Copyright (c) 2013, 2014 Yusuke Endoh (@mametter), @hirekoke  ###################################################################################)\n"
  },
  {
    "path": "README.md",
    "content": "# Quine Relay\n\n[![CI](https://github.com/mame/quine-relay/workflows/CI/badge.svg)](https://github.com/mame/quine-relay/actions?query=workflow%3ACI)\n\n## What this is\n\n[QR.rb](https://github.com/mame/quine-relay/blob/master/QR.rb) is a Ruby program that generates\na Rust program that generates\na Scala program that generates\n...(through 128 languages in total)...\na REXX program that generates\nthe original Ruby code again.\n\n![Language Uroboros][langs]\n\n[langs]: langs.png\n\n(If you want to see the old 50-language version, see the [50](https://github.com/mame/quine-relay/tree/50) branch.)\n\n## Usage\n\n### Ubuntu\n\nIf you are using Ubuntu 25.10 (Questing Quokka), you can follow these steps.\n\n#### 1. Install all the interpreters/compilers.\n\nFirst, you need to type the following apt-get command to install them all.\n\n    $ sudo apt-get install afnix algol68g aplus-fsf aspectj asymptote \\\n      ats2-lang bash bc bsh clisp clojure cmake coffeescript crystal dc \\\n      dhall dotnet8 elixir emacs-nox erlang execline f2c fish flex \\\n      fp-compiler g++ gambas3-gb-pcre gambas3-scripter gap gawk gcc gdb gdc \\\n      genius gforth gfortran ghc ghostscript gm2 gnat gnucobol4 gnuplot \\\n      gobjc golang gpt groovy guile-3.0 gzip haxe icont iconx intercal \\\n      iverilog jasmin-sable jq kotlin ksh libevent-dev libpolyml-dev \\\n      livescript llvm lua5.3 m4 make minizinc mono-devel nasm neko nickle \\\n      nim node-typescript nodejs ocaml octave openjdk-11-jdk pari-gp \\\n      parser3-cgi perl php-cli pike8.0 polyml python3 r-base rakudo ratfor \\\n      rc regina-rexx ruby ruby-mustache rustc scala scilab-cli sed slsh spin \\\n      squirrel3 surgescript swi-prolog swiftlang tcl tcsh valac vim wabt \\\n      xsltproc yabasic yorick zoem zsh\n\nThen, build the bundled interpreters.\n\n    $ sudo apt-get install cmake libpng-dev libgd-dev groff bison curl\n    $ make -C vendor\n\n#### 2. Run each program on each interpreter/compiler.\n\n    $ ulimit -s unlimited\n    $ ruby QR.rb > QR.rs\n    $ rustc QR.rs && ./QR > QR.scala\n    $ scalac QR.scala && scala QR > QR.scm\n    $ guile QR.scm > QR.sci\n    $ scilab-cli -nb -f QR.sci > QR.sed\n    $ sed -E -f QR.sed QR.sed > QR.spl\n    $ spl2c < QR.spl > QR.spl.c && gcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm &&\n      ./QR > QR.sl\n    $ slsh QR.sl > QR.nut\n    $ squirrel QR.nut > QR.sml\n    $ polyc -o QR QR.sml && ./QR > QR.sq\n    $ ruby vendor/subleq.rb QR.sq > QR.ss\n    $ surgescript QR.ss > QR.swift\n    $ swiftc QR.swift && ./QR > QR.tcl\n    $ tclsh QR.tcl > QR.tcsh\n    $ tcsh QR.tcsh > QR.t\n    $ ruby vendor/thue.rb QR.t > QR.ts\n    $ tsc --outFile QR.ts.js QR.ts && nodejs QR.ts.js > QR.unl\n    $ ruby vendor/unlambda.rb QR.unl > QR.vala\n    $ valac QR.vala && ./QR > QR.mid\n    $ mono vendor/local/bin/Vlt.exe /s QR.mid && mono QR.exe > QR.v\n    $ iverilog -o QR QR.v && ./QR -vcd-none > QR.vim\n    $ vim -EsS QR.vim > QR.vb\n    $ echo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.vb\" /></ItemGroup></Project>' > tmp.vbproj &&\n      DOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > QR.wasm\n    $ $(WASI_RUNTIME) QR.wasm > QR.wat\n    $ wat2wasm QR.wat -o QR.wat.wasm && $(WASI_RUNTIME) QR.wat.wasm > QR.ws\n    $ ruby vendor/whitespace.rb QR.ws > QR.xslt\n    $ xsltproc QR.xslt > QR.yab\n    $ yabasic QR.yab > QR.yorick\n    $ yorick -batch QR.yorick > QR.azm\n    $ zoem -i QR.azm > QR.zsh\n    $ zsh QR.zsh > QR.+\n    $ a+ QR.+ > qr.adb\n    $ gnatmake qr.adb && ./qr > QR.als\n    $ LANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > QR.aheui\n    $ ruby vendor/aheui.rb QR.aheui > QR.a68\n    $ a68g QR.a68 > QR.ante\n    $ ruby vendor/ante.rb QR.ante > QR.aj\n    $ ajc QR.aj && java QR > QR.asy\n    $ asy QR.asy > QR.dats\n    $ patscc -o QR QR.dats && ./QR > QR.awk\n    $ awk -f QR.awk > QR.bash\n    $ bash QR.bash > QR.bc\n    $ BC_LINE_LENGTH=4000000 bc -q QR.bc > QR.bsh\n    $ bsh QR.bsh > QR.bef\n    $ cfunge QR.bef > QR.Blc\n    $ ruby vendor/blc.rb < QR.Blc > QR.bf\n    $ ruby vendor/bf.rb QR.bf > QR.c\n    $ gcc -o QR QR.c && ./QR > QR.cpp\n    $ g++ -o QR QR.cpp && ./QR > QR.cs\n    $ echo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.cs\" /></ItemGroup></Project>' > tmp.csproj &&\n      DOTNET_NOLOGO=1 dotnet run --project tmp.csproj > QR.chef\n    $ PERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl &&\n      perl QR.chef.pl > QR.clj\n    $ clojure QR.clj > QR.cmake\n    $ cmake -P QR.cmake > QR.cob\n    $ cobc -O2 -x QR.cob && ./QR > QR.coffee\n    $ coffee --nodejs --stack_size=100000 QR.coffee > QR.lisp\n    $ clisp QR.lisp > QR.cr\n    $ crystal QR.cr > QR.d\n    $ gdc -o QR QR.d && ./QR > QR.dc\n    $ dc QR.dc > QR.dhall || true\n    $ dhall text --file QR.dhall > QR.exs\n    $ elixir QR.exs > QR.el\n    $ emacs -Q --script QR.el > QR.erl\n    $ escript QR.erl > QR.e\n    $ execlineb QR.e > QR.fsx\n    $ echo '<Project Sdk=\"Microsoft.NET.Sdk\"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><EnableDefaultCompileItems>false</EnableDefaultCompileItems></PropertyGroup><ItemGroup><Compile Include=\"QR.fsx\" /></ItemGroup></Project>' > tmp.fsproj &&\n      DOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > QR.false\n    $ ruby vendor/false.rb QR.false > QR.fl\n    $ flex -o QR.fl.c QR.fl && gcc -o QR QR.fl.c && ./QR > QR.fish\n    $ fish QR.fish > QR.fs\n    $ gforth QR.fs > QR.f\n    $ gfortran -o QR QR.f && ./QR > QR.f90\n    $ gfortran -o QR QR.f90 && ./QR > QR.gbs\n    $ gbs3 QR.gbs > QR.g\n    $ gap -q QR.g > QR.gdb\n    $ gdb -q -x QR.gdb > QR.gel\n    $ genius QR.gel > QR.plt\n    $ gnuplot QR.plt > QR.go\n    $ go run QR.go > QR.gs\n    $ ruby vendor/golfscript.rb QR.gs > QR.gpt\n    $ mv QR.c QR.c.bak && gpt -t QR.c QR.gpt && gcc -o QR QR.c && ./QR > QR.grass &&\n      mv QR.c.bak QR.c\n    $ ruby vendor/grass.rb QR.grass > QR.groovy\n    $ groovy QR.groovy > QR.gz\n    $ gzip -cd QR.gz > QR.hs\n    $ rm -f QR.o && ghc QR.hs && ./QR > QR.hx\n    $ haxe -main QR -neko QR.n && neko QR.n > QR.icn\n    $ icont -s QR.icn && ./QR > QR.i\n    $ ick -bfOc QR.i && gcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick &&\n      ./QR > QR.j\n    $ jasmin QR.j && java QR > QR.java\n    $ javac QR.java && java QR > QR.js\n    $ nodejs QR.js > QR.jq\n    $ jq -r -n -f QR.jq > QR.jsfuck\n    $ nodejs --stack_size=100000 QR.jsfuck > QR.kt\n    $ kotlinc QR.kt -include-runtime -d QR.jar && kotlin QR.jar > QR.ksh\n    $ ksh QR.ksh > QR.lazy\n    $ lazyk QR.lazy > QR.ls\n    $ lsc QR.ls > QR.ll\n    $ llvm-as QR.ll && lli QR.bc > QR.lol\n    $ lci QR.lol > QR.lua\n    $ lua5.3 QR.lua > QR.m4\n    $ m4 QR.m4 > QR.mk\n    $ make -f QR.mk > QR.mzn\n    $ minizinc --solver COIN-BC --soln-sep '' QR.mzn > QR.mod\n    $ gm2 -fiso QR.mod -o QR && ./QR > QR.il\n    $ ilasm QR.il && mono QR.exe > QR.mustache\n    $ mustache QR.mustache QR.mustache > QR.asm\n    $ nasm -felf QR.asm && ld -m elf_i386 -o QR QR.o && ./QR > QR.neko\n    $ nekoc QR.neko && neko QR.n > QR.5c\n    $ nickle QR.5c > QR.nim\n    $ nim compile QR.nim && ./QR > QR.m\n    $ gcc -o QR QR.m && ./QR > QR.ml\n    $ ocaml QR.ml > QR.octave\n    $ mv QR.m QR.m.bak && octave -qf QR.octave > QR.ook && mv QR.m.bak QR.m\n    $ ruby vendor/ook-to-bf.rb QR.ook QR.ook.bf && ruby vendor/bf.rb QR.ook.bf > QR.gp\n    $ gp -f -q QR.gp > QR.p\n    $ parser3 QR.p > QR.pas\n    $ fpc QR.pas && ./QR > QR.pl\n    $ perl QR.pl > QR.pl6\n    $ perl6 QR.pl6 > QR.php\n    $ php QR.php > QR.png\n    $ npiet QR.png > QR.pike\n    $ pike QR.pike > QR.ps\n    $ gs -dNODISPLAY -q QR.ps > QR.prolog\n    $ swipl -q -t qr -f QR.prolog > QR.pr\n    $ spin -T QR.pr > QR.py\n    $ python3 QR.py > QR.R\n    $ R --slave -f QR.R > QR.ratfor\n    $ ratfor -o QR.ratfor.f QR.ratfor && gfortran -o QR QR.ratfor.f &&\n      ./QR > QR.rc\n    $ rc QR.rc > QR.rexx\n    $ rexx ./QR.rexx > QR2.rb\n\nYou will see that `QR.rb` is the same as `QR2.rb`.\n\n    $ diff QR.rb QR2.rb\n\nAlternatively, just type `make`.\n\n    $ make\n\nNote: It may take a lot of memory to compile some files.\n\n### Docker\n\nSimply build the image and run a container as follows:\n\n    $ docker build -t qr .\n    $ docker run --privileged --rm -e CI=true qr\n\nNote: You must run in privileged mode, otherwise the `maxima` command will fail.\n\nIf you want to check the generated files, you can mount the local directory in the Docker container (but still use the `vendor` directory of the container), as follows:\n\n    $ docker run --privileged --rm -e CI=true -v $(pwd):/usr/local/share/quine-relay -v /usr/local/share/quine-relay/vendor qr\n\n### Other platforms\n\nYou may find [instructions for other platforms in the wiki](https://github.com/mame/quine-relay/wiki/Installation).\n\nIf you do not use these Linux distributions, please find your own way.\nIf you manage it, please let me know.  I wish you good luck.\n\n## Interpreter/compiler versions tested\n\nI used the following Ubuntu deb packages to test this program.\n\n\\#  |language                    |ubuntu package                    |version\n----|----------------------------|----------------------------------|--------------------------------\n1   |Ruby                        |ruby                              |1:3.3\n2   |Rust                        |rustc                             |1.85.1ubuntu1\n3   |Scala                       |scala                             |2.11.12-6\n4   |Scheme                      |guile-3.0                         |3.0.10+really3.0.10-5\n5   |Scilab                      |scilab-cli                        |2024.1.0+dfsg-7ubuntu1\n6   |sed                         |sed                               |4.9-2build2\n7   |Shakespeare                 |*N/A*                             |-\n8   |S-Lang                      |slsh                              |2.3.3-5\n9   |Squirrel                    |squirrel3                         |3.1-8.2\n10  |Standard ML                 |polyml, libpolyml-dev             |5.7.1-5build1\n11  |Subleq                      |*N/A*                             |-\n12  |SurgeScript                 |surgescript                       |0.5.4.4-1.1\n13  |Swift                       |swiftlang                         |6.0.3-2build1\n14  |Tcl                         |tcl                               |8.6.16\n15  |tcsh                        |tcsh                              |6.24.13-2\n16  |Thue                        |*N/A*                             |-\n17  |TypeScript                  |node-typescript                   |5.0.4+ds1-2\n18  |Unlambda                    |*N/A*                             |-\n19  |Vala                        |valac                             |0.56.18-2\n20  |Velato                      |*N/A*                             |-\n21  |Verilog                     |iverilog                          |12.0-2build2\n22  |Vimscript                   |vim                               |2:9.1.0967-1ubuntu6\n23  |Visual Basic                |dotnet8                           |8.0.120-8.0.20-0ubuntu1\n24  |WebAssembly (Binary format) |wabt                              |1.0.36+dfsg+\\~cs1.0.36-2ubuntu1\n25  |WebAssembly (Text format)   |wabt                              |1.0.36+dfsg+\\~cs1.0.36-2ubuntu1\n26  |Whitespace                  |*N/A*                             |-\n27  |XSLT                        |xsltproc                          |1.1.43-0.1\n28  |Yabasic                     |yabasic                           |1:2.91.4-1\n29  |Yorick                      |yorick                            |2.2.04+dfsg1-14\n30  |Zoem                        |zoem                              |21-341-2\n31  |zsh                         |zsh                               |5.9-8ubuntu2\n32  |A+                          |aplus-fsf                         |4.22.1-13\n33  |Ada                         |gnat                              |14.1ubuntu1\n34  |AFNIX                       |afnix                             |3.8.0-1.1ubuntu1\n35  |Aheui                       |*N/A*                             |-\n36  |ALGOL 68                    |algol68g                          |3.1.2-1\n37  |Ante                        |*N/A*                             |-\n38  |AspectJ                     |aspectj                           |1.9.6-1\n39  |Asymptote                   |asymptote                         |3.05+ds-2\n40  |ATS                         |ats2-lang                         |0.4.2-3\n41  |Awk                         |gawk                              |1:5.3.2-1build1\n42  |bash                        |bash                              |5.2.37-2ubuntu5\n43  |bc                          |bc                                |1.07.1-4\n44  |BeanShell                   |bsh                               |2.0b4-20\n45  |Befunge                     |*N/A*                             |-\n46  |BLC8                        |*N/A*                             |-\n47  |Brainfuck                   |*N/A*                             |-\n48  |C                           |gcc                               |4:15.2.0-4ubuntu1\n49  |C++                         |g++                               |4:15.2.0-4ubuntu1\n50  |C#                          |dotnet8                           |8.0.120-8.0.20-0ubuntu1\n51  |Chef                        |*N/A*                             |-\n52  |Clojure                     |clojure                           |1.12.0-1\n53  |CMake                       |cmake                             |3.31.6-2ubuntu6\n54  |Cobol                       |gnucobol4                         |4.0\\~early\\~20200606-8\n55  |CoffeeScript                |coffeescript                      |2.7.0+dfsg1-2\n56  |Common Lisp                 |clisp                             |1:2.49.20250504.gitf662209-1\n57  |Crystal                     |crystal, libevent-dev             |1.14.0+dfsg-1\n58  |D                           |gdc                               |4:15.2.0-4ubuntu1\n59  |dc                          |dc                                |1.07.1-4\n60  |Dhall                       |dhall                             |1.42.1-1build2\n61  |Elixir                      |elixir                            |1.18.3.dfsg-1\n62  |Emacs Lisp                  |emacs-nox                         |1:30.1+1-9ubuntu1\n63  |Erlang                      |erlang                            |1:27.3.4.1+dfsg-1build1\n64  |Execline                    |execline                          |2.9.6.1-1\n65  |F#                          |dotnet8                           |8.0.120-8.0.20-0ubuntu1\n66  |FALSE                       |*N/A*                             |-\n67  |Flex                        |flex                              |2.6.4-8.2build1\n68  |Fish                        |fish                              |4.0.6-0ubuntu1\n69  |Forth                       |gforth                            |0.7.3+dfsg-9build4.1\n70  |FORTRAN77                   |f2c                               |20240504-1\n71  |Fortran90                   |gfortran                          |4:15.2.0-4ubuntu1\n72  |Gambas script               |gambas3-scripter, gambas3-gb-pcre |3.20.4-1build1\n73  |GAP                         |gap                               |4.15.0-1\n74  |GDB                         |gdb                               |16.3-1ubuntu2\n75  |GEL (Genius)                |genius                            |1.0.27-1build4\n76  |Gnuplot                     |gnuplot                           |6.0.2+dfsg1-2ubuntu1\n77  |Go                          |golang                            |2:1.24\\~2\n78  |GolfScript                  |*N/A*                             |-\n79  |G-Portugol                  |gpt                               |1.1-8\n80  |Grass                       |*N/A*                             |-\n81  |Groovy                      |groovy                            |2.4.21-10\n82  |Gzip                        |gzip                              |1.13-1ubuntu4\n83  |Haskell                     |ghc                               |9.6.6-4\n84  |Haxe                        |haxe                              |1:4.3.7-1\n85  |Icon                        |icont, iconx                      |9.5.25a-1\n86  |INTERCAL                    |intercal                          |30:0.30-6\n87  |Jasmin                      |jasmin-sable                      |2.5.0-3\n88  |Java                        |openjdk-11-jdk                    |11.0.28+6-1ubuntu1\n89  |JavaScript                  |nodejs                            |20.19.4+dfsg-1\n90  |Jq                          |jq                                |1.8.1-3ubuntu1\n91  |JSFuck                      |nodejs                            |20.19.4+dfsg-1\n92  |Kotlin                      |kotlin                            |1.3.31+ds1-3\n93  |ksh                         |ksh                               |20240113-1.0.10-2\n94  |Lazy K                      |*N/A*                             |-\n95  |LiveScript                  |livescript                        |1.6.1+dfsg-3\n96  |LLVM asm                    |llvm                              |1:20.0-63ubuntu1\n97  |LOLCODE                     |*N/A*                             |-\n98  |Lua                         |lua5.3                            |5.3.6-2build2\n99  |M4                          |m4                                |1.4.19-8\n100 |Makefile                    |make                              |4.4.1-2\n101 |MiniZinc                    |minizinc                          |2.9.2+dfsg1-1\n102 |Modula-2                    |gm2                               |4:15.2.0-4ubuntu1\n103 |MSIL                        |mono-devel                        |6.12.0.199+dfsg-6\n104 |Mustache                    |ruby-mustache                     |1.1.1-2\n105 |NASM                        |nasm                              |2.16.03-1\n106 |Neko                        |neko                              |2.4.1-1\n107 |Nickle                      |nickle                            |2.103\n108 |Nim                         |nim                               |2.2.4-1\n109 |Objective-C                 |gobjc                             |4:15.2.0-4ubuntu1\n110 |OCaml                       |ocaml                             |5.3.0-3\n111 |Octave                      |octave                            |9.4.0-1\n112 |Ook!                        |*N/A*                             |-\n113 |PARI/GP                     |pari-gp                           |2.17.2-1\n114 |Parser 3                    |parser3-cgi                       |3.5.1-3\n115 |Pascal                      |fp-compiler                       |3.2.2+dfsg-46\n116 |Perl 5                      |perl                              |5.40.1-6build1\n117 |Perl 6                      |rakudo                            |2024.09-4\n118 |PHP                         |php-cli                           |2:8.4+96ubuntu1\n119 |Piet                        |*N/A*                             |-\n120 |Pike                        |pike8.0                           |8.0.1956-1\n121 |PostScript                  |ghostscript                       |10.05.0dfsg1-0ubuntu4\n122 |Prolog                      |swi-prolog                        |9.2.9+dfsg-1\n123 |Promela (Spin)              |spin                              |6.5.2+dfsg-2\n124 |Python                      |python3                           |3.13.7-1\n125 |R                           |r-base                            |4.5.1-1\n126 |Ratfor                      |ratfor                            |1.07-1\n127 |rc                          |rc                                |1.7.4+97.gceb59bb-6\n128 |REXX                        |regina-rexx                       |3.9.5+dfsg1-0.2\n\nNote that some languages are not available in Ubuntu (marked as *N/A*).\nThis repository contains their implementations in `vendor/`.\nSee also `vendor/README` for detail.\n\n\n## Frequently asked questions\n\n### Q. Why?\n\nA. [Take your pick](https://github.com/mame/quine-relay/issues/11).\n\n### Q. How?\n\nA. Good news: I have published a book, [\"The World of Obfuscated, Esoteric, Artistic Programming\"](http://gihyo.jp/book/2015/978-4-7741-7643-7).\nIt explains how to write a quine, an ascii-art quine, and an uroboros quine like this quine-relay.\nYou can buy my book on [amazon.co.jp](http://www.amazon.co.jp/dp/4774176435).\n\n(It also contains my almost all of my (about forty) works, including\n[alphabet-only Ruby program](http://www.slideshare.net/mametter/ruby-esoteric-obfuscated-ruby-programming-5088683),\n[radiation-hardened quine](https://github.com/mame/radiation-hardened-quine),\netc., and explains many techniques for writing such programs.)\n\nBad news: It is written in Japanese.\nI hope you can translate it into English <strike>and help me earn royalties</strike>.\n\n### Q. Language XXX is missing!\n\nA. See [the language inclusion criteria][criteria] in detail.  (In short, please create a deb package and contribute it to Ubuntu.)\n\nSee also [:heart:][sponsors].\n\n[criteria]: https://github.com/mame/quine-relay/wiki/Language-inclusion-criteria\n[sponsors]: https://github.com/sponsors/mame\n\n\n### Q. Does it really work?\n\nA. [![CI](https://github.com/mame/quine-relay/workflows/CI/badge.svg)](https://github.com/mame/quine-relay/actions?query=workflow%2ACI)\n\n### Q. How long did it take you?\n\nA. [Are you trying to cross the world line?](https://github.com/mame/quine-relay/issues/60)\n\n### Q. The code does not fit in my screen!\n\nA. [Here you go][thumbnail].\n\n[thumbnail]: thumbnail.png\n\n### Q. How was the code generated?\n\nA.\n\n    $ sudo apt-get install rake ruby-cairo ruby-rsvg2 ruby-gdk-pixbuf2 \\\n      optipng advancecomp ruby-chunky-png\n    $ cd src\n    $ rake clobber\n    $ rake\n\n## History\n\n## for Ubuntu 13.04\n\n[50 languages](https://github.com/mame/quine-relay/tree/ad3f8222c796969db8cfb1bae015a46c2387b3d6)\n\nAdded: Ruby, Scala, Scheme, bash, Smalltalk, Unlambda, Tcl, Whitespace, Verilog, Vala, Ada, ALGOL 68, Awk, Brainfuck, Boo, C, C++, C#, Cobol, Clojure, Fortran90, FORTRAN77, Forth, Common Lisp, CoffeeScript, Groovy, Go, INTERCAL, Icon, Haskell, Jasmin, Java, LLVM asm, Logo, Lua, Makefile, MSIL, Objective-C, JavaScript, OCaml, Octave, Parrot asm, Pascal, Perl, PHP, Pike, Prolog, Python, R, REXX\n\n## for Ubuntu 13.10\n\n[50 languages](https://github.com/mame/quine-relay/tree/ea4d39fb1ebc7ee23ec6f60ca7bfa0d465b5806a)\n\n## for Ubuntu 14.04\n\n[50 languages](https://github.com/mame/quine-relay/tree/d16bf072e3063dc476dc440c8f3e33d7426e98db)\n\n## for Ubuntu 14.10\n\n[64 languages](https://github.com/mame/quine-relay/tree/e449baba456d4885102482cbd365335be59241b2)\n\nAdded: Scilab, S-Lang, SPL, LOLCODE, Maxima, NASM, Neko, Nickle, Ook!, PARI/GP, Piet, PPT (Punched tape), PostScript, Ratfor\n\n## for Ubuntu 15.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/7749715289ca162eb1c1eb1ff1ed1393edc41630)\n\nAdded: Subleq, Standard ML, Thue, Visual Basic, XSLT, Yorick, Zoem, A+, AFNIX, Ante, Asymptote, ATS, BLC8, Befunge, bc, Chef, CDuce, D, dc, eC, Emacs Lisp, Erlang, F#, Falcon, FALSE, Gambas script, GAP, GEL (Genius), Gnuplot, G-Portugol, Gri, Haxe, Julia, Lisaac, Lazy K, Kaya\n\n## for Ubuntu 15.10\n\n[100 languages](https://github.com/mame/quine-relay/tree/f45035f867c7c8f7b4e12fa63e7c8eef9aabecad)\n\nRemoved: Boo, Falcon, Kaya\n\nAdded: Elixir, Jq, Nim\n\n## for Ubuntu 16.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/233ba8b4e1d7e4c59a46d64481048a8ea7f4400e)\n\n## for Ubuntu 17.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/e65a798da23df0367d9eb5e4d46f00d87e6cb342)\n\nRemoved: SPL, Gri, Logo, Parrot asm\n\nAdded: Squirrel, Dafny, Grass, MiniZinc\n\n## for Ubuntu 17.10\n\n[100 languages](https://github.com/mame/quine-relay/tree/943b83801a1bd019ebf348adc78df2cdfde06513)\n\nRemoved: CDuce\n\nAdded: Rust\n\n## for Ubuntu 18.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/6e173d76e972e1da7992b84768bf9f4c788949ed)\n\nRemoved: Gambas script, Perl\n\nAdded: Shakespeare, sed, tcsh, TypeScript, Velato, Vimscript, Yabasic, zsh, Aheui, AspectC++, AspectJ, BeanShell, CMake, Flex, Fish, GDB, GolfScript, Gzip, Gri, JSFuck, ksh, LiveScript, M4, Mustache, nesC, Parser 3, Perl 5, Perl 6, Promela (Spin), rc\n\n## for Ubuntu 19.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/c8898351500682cea02219313e9203da7eca5505)\n\nRemoved: Scilab, G-Portugol, nesC\n\nAdded: Curry, Gambas script, GeneratorScriptingLanguage\n\n## for Ubuntu 19.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/13041dbf3f80a90c9221ef94f8e8bc385800b6fd)\n\nRemoved: Gri\n\nAdded: Scilab\n\n## for Ubuntu 20.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/62e2cc2d61d99719328094d185d899bc03a851fb)\n\n## for Ubuntu 20.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/114f44fefd610812d2f5e3032603762752ed51b2)\n\nRemoved: AspectC++, eC\n\nAdded: SurgeScript, Dhall\n\n## for Ubuntu 21.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/d8df33bad3693afd0bd3bf1c2b1cedd5753325dc)\n\nRemoved: Curry\n\nAdded: G-Portugol\n\n## for Ubuntu 21.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/158b6251d36a48122ec0006feaf759d8b1973b0f)\n\n## for Ubuntu 22.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/7b81d8704549d31814499c5300be2be9568467c8)\n\nRemoved: Julia, Nim, Pike\n\nAdded: WebAssembly (Text format), WebAssembly (Binary format), Kotlin\n\n## for Ubuntu 22.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/362962dd2d55d7c36dd9fa3e0d4c0c52c0e6a18f)\n\n## for Ubuntu 23.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/5dfdada5aa58f6a97ae85b84f86c7eb091225a8c)\n\nRemoved: Squirrel, GeneratorScriptingLanguage\n\nAdded: Crystal, Nim\n\n## for Ubuntu 23.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/74c4cc7d79fccbb1c8315070b9efea03cb787755)\n\nRemoved: Smalltalk\n\nAdded: Modula-2\n\n## for Ubuntu 24.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/20d7f437c053b8e0b301ba996d124a4b812e3571)\n\nRemoved: PPT (Punched tape)\n\nAdded: Pike\n\n## for Ubuntu 24.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/2ed61a62c9d31121b39e740c89107085c122f478)\n\nRemoved: Dafny, Maxima\n\nAdded: Execline, Squirrel\n\n## for Ubuntu 25.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/b9c8056cad4589fe650163a3fd0cea4b3055fce4)\n\n## for Ubuntu 25.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/5298413382ea707061e04aa077f99872d159a7b8)\n\nRemoved: Lisaac\n\nAdded: Swift\n\n## License\n\nThe MIT License applies to all resources\n*except* the files in the `vendor/` directory.\n\nThe files in the `vendor/` directory are from third-parties\nand are distributed under different licenses.\nSee `vendor/README` in detail.\n\n---\n\nThe MIT License (MIT)\n\nCopyright (c) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Yusuke Endoh (@mametter), @hirekoke\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "SHA256SUMS",
    "content": "12623f713c91a8a66799c2c48fc6d69b5c8e667534e6ba0f6456eb874076c081 *QR.rb\n9df1959f513e14e295e338bd60324068555aa69f9a39d70f24e789f494d0a82c *QR.rs\n7099d0b66ce499616935a8f40948421faade9fa32f3ade5e61b112fbf90c7b67 *QR.scala\n9e8be7aa29be0373379ce94135a4f3eb3dfb7d13eadf9217f92fdea2aae42bec *QR.scm\n6d765ab621adc206990eeb6b56de0c5fb04ef82b8d927e7b4016f289fdffe4e3 *QR.sci\nb2a6f25d27c2ec1331d64cde25397a6f3ad279664634b5625397c4fa072abf50 *QR.sed\n8960c90239ca53a093cd169c36b82096ffd5e861554023ac9a71c4865d43776e *QR.spl\n1f5a84b47ce3806a97094d2ccb19f598c0cd65be90bbb9860e2c2c6dd9c1490f *QR.sl\nc9e148f618bb8ce458cf105b894ac6dc5c88ab35003998a126bdacc5c1060c07 *QR.nut\n6ec2a8743395bcaa0449aef53561ce3cfedcf043d241ac2309406f5d4bd21f38 *QR.sml\n7e9d0dfa4b902adebc72111b1dc9d820bcacfad059930c01085ac7b3f81e2a1e *QR.sq\n62a990a76ac114ebc67e45382a6dce8bbbbddd550b3a87bc6f3c3fc9233134b1 *QR.ss\n16e55ff01e922ccdd8f8f60588b0ca520835c7962ba4bba78cadc17768295234 *QR.swift\n414a439517704a14dd257be4d9cceeee411a94fceffd8f67808bbd5beb7c8e17 *QR.tcl\nafd18299f737e2b106aa34d937affb01e09a00be66488f2598942791224ad8b4 *QR.tcsh\nde3f2b463d6c24fb873b73bf33e4c64c1fa05b77d001641f6b95ed26ec9c720f *QR.t\nc046065994ea12c8e3d79c2f22db10d7bc4b467f6bd5497e17b94e03252d285f *QR.ts\nc1f686f2e5e28135ebe443443a2e42aa919e9d211d40271c6b75b5b536df0333 *QR.unl\ndfa15a63952a7b401935bdb529c01cbe5c09a4cb2f8f40ca504abdf575662b8d *QR.vala\n21a09c188ce2b7e6a207572ec4e8b5b0ad019d7a7205f362c0d4b7a840897026 *QR.mid\n5f17ee6f8b2c9071220edd280e2e36924a4986c5035b97a79306cd802e509e21 *QR.v\n5c62c705bdc929fc7948abe930e9a9c6ad424e8e0ba39d2e87dec145216d2286 *QR.vim\n45056322828773f4a0d5d20c54be4b846bf0203af201eaac51cf14d539d2d060 *QR.vb\n43790b395321678896f721d8da7fab91a784d0d5c69b1dae9f745f8afc56e036 *QR.wasm\n67a51a505f0f37e6f2ea6f47eabdd0fce42effc4b950d75158ada64459361edd *QR.wat\naaec5d6e1cf79681ef6dfc04fe7796afc568eb4283ae209c43670083a3cbb174 *QR.ws\n5368d3e1658d37b0dfb75a14ed23250a35bc7311301b91450cbc1a7d73eff891 *QR.xslt\n4b426b6364d3b759f321d29737ab0b8bed4e6b1dbff6276afedccd85b129c5af *QR.yab\n310af9cf037708d18f99580d96af2c949f9a536715ebc1b3edcb33b71b2fa478 *QR.yorick\naba3b8abecce9ad46c14597e47d8c7acae5e54069b09b59a001ff04bf9cc2000 *QR.azm\n6b437b52493d214197d834282b7b07d60e6a126689be4f2c7fdca43e27de6e45 *QR.zsh\nbf00ee4220495a50727cc37e345d641202c0a372a6c31ceb522d835b885fba3d *QR.+\n89dba8652bfa4c9e56508c5981258503b49091a8641c40a1b1cc683ad63fdfff *qr.adb\ncf1c668b168e26a401581389c08d41560ed3c0b5e37c35e21552e671a872c524 *QR.als\nc502a439d37b41518368dd277033d335f6ebb54d61d6b17496ba29caea132c34 *QR.aheui\ne0d785bd6bcbae22956ab50265413b8535458896303d7ab9470fdec60db9c6e4 *QR.a68\n8fabf20d41561d2876ff024f550f2c19edda0009579643468a0277fbbd403d28 *QR.ante\n0ad2978a1a2f8aa60929c895557031ce201edd6cb56993735d2e48e3d1947c30 *QR.aj\nac615a877bb6f8434cdec39813a4e052c514a6d3fe0304f0c4b32f9de195772b *QR.asy\n5cd48139791b9f32140664deb448108c97d8aae3578d795ed0a365f8922f9d98 *QR.dats\na21fdb1bc5cc1f8468defac905921156b642cea98f9bd82147b8c7c28b111514 *QR.awk\ndca132455085f2745bacd50cbb9cc8a57a4cf8d1a5de99de8222ff705e3aaaf5 *QR.bash\nd802710fb2ce4af4abf8b6749ed5f66f2e96964f2238c4ef387b030407372efd *QR.bc\n49f6bbf2ad1b3540da516aefa5e12ad866a08b0d3886e36b1e809bcfe244376a *QR.bsh\nde30728cc7125000e0e6cf6f6640538e536c3ff39178a5290e0b67008969c27a *QR.bef\n04fb756bf661fae309465e04d86b030832b45f21969f13a39ca4a37e1f244bd0 *QR.Blc\nfb520c3323b946fc6026179e2312d6e345dd44a384b1dfd38280aadba472c728 *QR.bf\n2f90d2915d01b7d4f5eb01e38efa4f9174551e5e1803dfa1e41aa14dc4d19670 *QR.c\n0b9a14819367894121cb7ac096179c48a5142531a29c05c49892eb51638d7a84 *QR.cpp\ne638911ea743a293eb031011c0099e3749fc01d7d211ef755dc93bdf6616edb8 *QR.cs\n56f4e86a9306260a0b04e5fa33e2b2629ba5a35263ccba2d7e23ec9353835e3f *QR.chef\n0b37f015a5bc532e9a98c308181851ae6881fd47d87eaa969b47050c396a1717 *QR.clj\ne2d787d27bf447a41e42b1a56e6f12036650ba1f28a45d81e0332b8c22be04cd *QR.cmake\nf042e6896aec32247ff3e83b78ed946e34cf88861acf44de0d822568b66a845e *QR.cob\n026db578fb2d1a4df22bc2b2a573cdc96886be831a042ec4a3a1e78e114ed3ef *QR.coffee\n8ae17e1600f94c49604758fd947630b6742bf4d75d5674068e20af80a0e88c6c *QR.lisp\n6065e90fbc5390d7aff7794cc5f0722cd8317704809b2916be4426938b9e4055 *QR.cr\n9c4e3a3e80bff9ba0ffc7584e217e9c279158823870e3d1eb6c6e83053a4282f *QR.d\n1d779f095d0c2b033fb543b20a21f23e4fabaf67b1ef8a8509eb553b58d7eb98 *QR.dc\n589b275a368d00943eef8153d420cb7e45c61072176f5f019abaf47e69a3f871 *QR.dhall\nf78a791439f3855552c8403823e879936fcb5aab24430fddad4ffbe2e2749512 *QR.exs\nbe237d208d1d2cc397adc15e4e2e6b9b5006a487f27b2e3cd449c237ff6fea19 *QR.el\naac501df84bed42ab741cc045a8adf8f789c2edb6ec165de31657acebf02781f *QR.erl\nd916525e98362d3d6f52b9054de1b517147b0c21a5b491137ab960b3fc136226 *QR.e\n971320ceddf347f91b105992aa0714bf1588c61b19fcebe55b86baec25c73db7 *QR.fsx\n86c6dd5a0d58ec1e68b1ed21332a7a4b5bd4e46acf8958a90011d2c2ed996d5e *QR.false\nc9e193115153ce16773ba8837fb935bfa93e24709e5ffb32d85236076daa0d92 *QR.fl\ne9f759f28ecbfeebf7b7b3248074244de4d0043f7a9d7cb86ac7dd5fef5fdb40 *QR.fish\n1657cfafda71d29987615f79c8fd82cbc36b34d56718d4a1d7f51baccebf5c34 *QR.fs\n10f6b1742f4372ee4d054e02a2a10d31e8079270664f77620fc827a1e09fdcdc *QR.f\nf7a2bbdec2bc47162966d206b7b85c6d51a00ab04d8231e90575015153b7c891 *QR.f90\nf56167c040a8fa8ae35db8041e48f1e0c15b8da6222dea044ab27ec06acfa9ca *QR.gbs\n39beb2f88d9289944cd784f674db09bde2054213023e0a1bbe095051024add92 *QR.g\n0fdb573c2c19b7b50c5fbe8b0d69ea607e80eaef1041dd553dbef08fe1685fb9 *QR.gdb\n381830f625dc5359177d3a15dfad69848fdbe705ae83087e6b748ddc8b1c71df *QR.gel\n418cdd7f990d1f019ab8687645d1a4f4252f17bb3c8b838fb2d8b45ec06e3170 *QR.plt\nc603a7a903c99d4ac7098831f31a4601046b88bbb61efbd909f0c2c7b2816183 *QR.go\n94251e39c4e0a7acc1c10904d5eb1080ced2588d96ff0f05cda6e116ff40f6f4 *QR.gs\nc49dc6ccb84103de4d881e2a109fa6bad80b1fb8c6f1e59cc031835f5f135fa4 *QR.gpt\n389faf61261586ec08c209ffe78239ede67f91955a6df12a8fd447025cac36b4 *QR.grass\n6b17989e98a11754c741f7d462bddba17d6c0795294510277aa237053c595c01 *QR.groovy\nf57be29f963e19e54cfc558722b5d8023a66409619c9a00407b44c77a291db88 *QR.gz\n4b5aa836e0e8c7e4a82763e948f66d6bf969474c37176104f1018ca4c9a9207b *QR.hs\n18e31dac4491412fa5b600bf269ebcbbf6084c80540599608370bdcd482ee671 *QR.hx\n33726b852a2b3a55319ea8f764410f2dbe7d2960a06b91e200b4d923a861b2e7 *QR.icn\na53f3bb0269f323e284bbd4007af41a261d9fd9420004806c6ce5e153c1543cc *QR.i\n74c9a0dfe67d4a89b97ee54bf24704d7215b48862d03c80151214269b38c09d6 *QR.j\n1d692da0ba8c6b04a60aefc87ac7da1cb937bab8b1f501a34b1a7013e9688305 *QR.java\n8039f166ab0ce892e0bcdd78fc5f203bb115f94748f374a63cf241f6a33776fb *QR.js\n83e07ba7dff9a8db351a0449e6ef4a1b08b5a069fb357c1e05599fa6bf50e672 *QR.jq\n944b6cf24bf7ddc4a1ce1e40130dacf60b5999d6914f8efa047c1188bdd2ce06 *QR.jsfuck\nad65cf3eda51297f6665d6c14b0b5d3676611f4d595ab07e52a74133f58ef4a2 *QR.kt\ne4955fd14ec9af1409c3c930fa2d26b378cc5a439fb68873698e044cd2f6789f *QR.ksh\n633b7936c4981d8a0e7d75a3f5ee72f17f65c0fc750084e2fe923b4de7d0e06b *QR.lazy\n358ec5fb72e695845036595aef0b0a7c98bdb6c8e0c365faafc898d8b15926a1 *QR.ls\n1d50d0deeeca335bb589f27dfbfe4214ec87cf075268e2822f17ce019d4df930 *QR.ll\n7ad8bfd091fef07608038101557e10454eaf71b1aa0d05ac07904121acf2a1e2 *QR.lol\na0207688cdd56e2a3061a000230affc8de557ae34d77287b62bea1ee8fae1b9f *QR.lua\nd17ae7faca6eedce73d2cad23166eb6b6e55c2a3675c1a9119fd7eea48ee9251 *QR.m4\n4eeffb7c5c3a20a26dfd66fe5ccbbe2bbe0ced830e0ddcab63cc3cf8f2f4eeb9 *QR.mk\nca4359361ae7702db6f816a8e7482ae5b419af8b69be866765164de3acfaceff *QR.mzn\naf97b86c1721993b8476ad2cc9b0aa78880e48588144f099108e52b10e8f7c3d *QR.mod\n2497238e2b1f7977b22e67277c6279921e871b0c2804a9a32212e710d8f85f11 *QR.il\n4af6900b554510b99b8e922ca55871a1783ad4b9f77dd48ef7ea767fdca477fe *QR.mustache\n923564cbf178e5c2025fb8a7e06652f40931bdb4100d3488aaa956bd999f672d *QR.asm\n0a4d3bf1bc0b619e7de55a684788372178450eb4d5eeb9fb7e637fbc45d00eaa *QR.neko\n8d0f55a65ee193fe742b580927c3c71366fa2d386a9fcd52c3660e9435509ad7 *QR.5c\na8a6a3bb228d60182e6855266b77c6f7d43fc28a6d321ee7541511bcc6e86b42 *QR.nim\nb1ccccd92cf89f33119be28a63b536bccaa1789a50ff73d20b1252a2a5af0ef5 *QR.m\nc4d62f4ed17c8734bd9d33e1312fc4b357e0503ab67a25f98c42975a2b6bfaf3 *QR.ml\n1e98dddc2dcf041ed95b44b786772447151bd0dafd52049964b193b11324f9ce *QR.octave\nd855fad9b90051da6e46928f1dc550d014701e2924b138f65214e3a9367266f0 *QR.ook\nadb0980458098bc1a168858461d840242109e9e900cb883ab0d9516a99a0e9c3 *QR.gp\n0b0e2b15a611acd8e2ef03dfb107de9dbea67e04afcf4dc75ce5f6bf33b2ea80 *QR.p\nf76ca81f5cd8f8bf13cc578a051b2268cd422dabe0c755bde02dba75567ce83e *QR.pas\ne73c69d99568d5293561b198933dac0ca1f255258c936c8cf63824794eb8821a *QR.pl\ne5bd8ac748f20dae70c4792280e95fc477a03cbe34696ace3a10c85ebcca0a25 *QR.pl6\ncee0abe37b1f2ee044d18934dba7f2af43287e1a1ed3ae8ab7304f6c41c61c94 *QR.php\n18f3abe96e38466c31969fb5ceea480170f1f9d7089d6620a2a08d5b913386c4 *QR.png\n7639f1d7c80abc8d8c44f3effe72158e2dc8d8d1c0624c68c81f0a8225dcca22 *QR.pike\ncbd418d7d572ceaccd8856bf5153e8f8c3740dc55d47bbd1dbdae55e83285888 *QR.ps\n5a0456754a1f2f5c87b82ca83cf35ddaca605057ba675c758744dc5bf1f8d9f4 *QR.prolog\ne8252e383bcc102cbcb51f0b6d35e44890c70ff0fc2cef6ac0cbe604e7a88a0b *QR.pr\n83ec85f8784ee7765e2679616962250891b99a9d98d42f6300b622a1e52bd56f *QR.py\n3ca5fa842d5ce951ee7a287ea578f63401e8e9e64b8fdec8040abbc0b6df2dd5 *QR.R\ndb14c6a8343fa742e3056f6882f0f024458bcf431b546e9af4d4edf28c34fce8 *QR.ratfor\nea356e5891386571c753178d30d2e86cb59cf7612e925cd1262c87869b849ae9 *QR.rc\n5b74c101ae27ab30e67cb070d25cdadf1436a6f11593edc16320d960a468ae67 *QR.rexx\n"
  },
  {
    "path": "src/Dockerfile.gen.rb",
    "content": "require_relative \"code-gen\"\n\napts = RunSteps.flat_map {|s| s.apt }\nother_packages = %w(libpng-dev libgd-dev groff flex bison curl)\n\napts = [*apts.flatten.compact.uniq, *other_packages].uniq.sort\n\ndockerfile = []\ndockerfile << \"FROM ubuntu:#{ `bash -c 'source /etc/os-release && echo $VERSION_ID'`.chomp }\"\ndockerfile << \"ENV DEBIAN_FRONTEND noninteractive\"\ndockerfile << \"RUN apt-get update && apt-get upgrade -y\"\ndockerfile << \"RUN apt-get -qq install -y apt-utils > /dev/null\"\ndockerfile << \"RUN apt-get -qq install -y moreutils\"\napts.each_slice(4) do |apt|\n  dockerfile << \"RUN chronic apt-get -qq install -y #{ apt.join(\" \") } && chronic apt-get clean\"\nend\ndockerfile << \"ADD . /usr/local/share/quine-relay\"\ndockerfile << \"WORKDIR /usr/local/share/quine-relay\"\ndockerfile << \"RUN make -C vendor\"\ndockerfile << \"CMD make check -j 10000\"\n\nFile.write(\"../Dockerfile\", dockerfile.join(\"\\n\") + \"\\n\")\n"
  },
  {
    "path": "src/Makefile.gen.rb",
    "content": "require_relative \"code-gen\"\n\nOUT = []\n\ndef banner(s1, s2=nil, i=nil)\n  s = \"##  #{ \"#{ i + 1 }: \" if i }#{ s1 }#{ ' -> ' + s2 if s2 }  ##\"\n  OUT << \"\\t@echo\"\n  OUT << \"\\t@echo \\\"#{ \"#\" * s.size }\\\"\"\n  OUT << \"\\t@echo \\\"#{ s }\\\"\"\n  OUT << \"\\t@echo \\\"#{ \"#\" * s.size }\\\"\"\n  OUT << \"\\t@echo\"\nend\n\nOUT << <<-END\nMAKEFLAGS += --no-print-directory\n\nPATH := $(CURDIR)/vendor/local/bin:/usr/games:$(PATH)\nCLASSPATH := .\n\nfind_any0 = $(firstword $(foreach x,$(1),$(if $(shell which $(x) 2>/dev/null),$(x),)))\ncheck = $(if $(2),$(2),$(error $(1) interpreter not found!))\nfind_any = $(call check,$(1),$(call find_any0,$(2)))\n\nJAVASCRIPT   := $(call find_any,JavaScript,nodejs node js)\nSCHEME       := $(call find_any,Scheme,guile csi gosh)\nGBS          := $(call find_any,Gambas script,gbs3 gbs2 gba3)\nWASI_RUNTIME := $(call find_any,WASI runtime,wasmtime node)\n\nifeq ($(SCHEME),csi)\n  SCHEME := csi -s\nendif\nifeq ($(WASI_RUNTIME),node)\n  WASI_RUNTIME := node --experimental-wasi-unstable-preview1 vendor/wasi-runtime.js\nendif\n\n.DELETE_ON_ERROR:\nEND\nOUT << \"all: QR2.rb\"\nbanner(\"CHECK\")\nOUT << \"\\tdiff -s QR.rb QR2.rb\"\nOUT << \"\"\nOUT << \"check: all\"\nOUT << \"\\t@sha256sum --quiet -c SHA256SUMS\"\n\n[*RunSteps, RunStep[\"Ruby\", \"QR2.rb\"]].each_cons(2).with_index do |(s1, s2), i|\n  cmd = s1.cmd_make.gsub(\"OUTFILE\", s2.src)\n\n  OUT << \"\"\n  OUT << \"#{ s2.src }: #{ s1.src }\"\n  banner(s1.name, s2.name, i)\n  if s1.backup\n    if s1.backup.is_a?(String)\n      OUT << \"\\t@mv #{ s1.backup } #{ s1.backup }.bak\"\n    else\n      OUT << \"\\t@#{ s1.backup[0] }\"\n    end\n  end\n  cmd.split(\"&&\").each {|c| OUT << \"\\t\" + c.strip.gsub(/^!/, \"ulimit -s unlimited && \") }\n  if s1.name == \"BeanShell\"\n    # workaround; bsh disables terminal echo\n    OUT << \"\\t@stty echo\"\n  end\n  if s1.backup\n    if s1.backup.is_a?(String)\n      OUT << \"\\t@mv #{ s1.backup }.bak #{ s1.backup }\"\n    else\n      OUT << \"\\t@#{ s1.backup[1] }\"\n    end\n  end\nend\n\nOUT << <<-END\n\nclean:\n\\t@mv QR.rb quine-relay.rb\n\\trm -f qr QR qr.* QR.* QR2.rb *.class gst.im\n\\t@mv quine-relay.rb QR.rb\nEND\n\nFile.write(\"../Makefile\", OUT.join(\"\\n\"))\n"
  },
  {
    "path": "src/QR.rb.gen.rb",
    "content": "require_relative \"code-gen\"\n\ngen_prologue_1 = GenPrologue.split(?;)[0, 2].join(?;)\ngen_prologue_2 = GenPrologue.split(?;)[2..-1].join(?;)\n\ns =\n  gen_prologue_2 + ?; +\n  GenSteps[0..-2].inject('\"eval$s=%q(#$s)\"') {|code, s| s.code.sub(\"PREV\"){ code }.chomp }\n\nif false\n  # search characters rarely used\n  h = {}\n  32.upto(126) {|c| h[c.chr] = 0 }\n  s.chars.group_by {|c| c }.map do |c, a|\n    h[c] = a.size\n  end\n  %w(( ) [ ] { } \\  \\\\ \\\").each {|c| h.delete(c) }\n  p *h.sort_by {|k, v| v }\n  exit\nend\n\nif false\n  # search sequences that often appear\n  h = Hash.new(0)\n  2.upto(10) do |n|\n    s.chars.each_cons(n) do |a|\n      h[a.join] += n-1\n    end\n  end\n  p *h.sort_by {|k, v| v }.reverse\n  exit\nend\n\n# a table of short-hand character for sequences that often appear\nABBREV = {\n  ?~ => \" \",\n  ?` => \"\\\\\",\n  ?^ => \"``\",\n  ?Z => \"print\",\n  ?X => \"ain()\",\n  ?J => \"tring\",\n  ?H => \"write\",\n  ?K => \"gsub\",\n  ?! => \"in\",\n  ?Y => \"^^\",\n}\n\ns = s.gsub(/[#{ ABBREV.keys.join }]/){\"\\\\x%02x\" % $&.ord}\n\n# search perfect and simplest hash\na = ABBREV.keys.join.bytes\nmax = 1000\na.size.upto(90) do |n|\n  a.size.upto(90) do |m|\n    b = a.map {|c| c%n%m }\n    if b.uniq.size >= a.size&&b.max<max\n      $N, $M, $B = n, m, b\n      max = b.max\n    end\n  end\nend\n\nABBREV.each do |k, v|\n  s = s.gsub(v, k)\nend\n\na = [0] * ($B.max + 1)\nABBREV.each do |k, v|\n  v = case v\n      when \"\\\\\" then \"B\"\n      when \"``\" then \"B*2\"\n      when \"^^\" then \"B*4\"\n      when \" \" then \"g\"\n      when \"ain()\" then %(\"ain()\")\n      else \":#{ v }\"\n      end\n  a[k.ord % $N % $M] = v\nend\na = a.join(\",\")\n\ncode = <<-END.split.join\n  eval$s=%q(eval(%w(\n\n    #{gen_prologue_1};\n    puts(eval(\n      %q(#{ s }).gsub(/[#{ ABBREV.keys.sort.join }]/){[#{ a }][$&.ord%#{ $N }%#{ $M }]}\n    ))\n\n  )*\"\"))\nEND\n\n$stderr.puts \"size: #{ code.b.size }\"\ncode.chop!\n\nTEMPLATE = File.read(\"uroboros.txt\")\nwidth = TEMPLATE[/.*/].size\nwhile TEMPLATE.count(\"#\") - width < code.size\n  s = TEMPLATE.count(\"#\")\n  line = TEMPLATE[/^#*$/]\n  TEMPLATE.replace((line + \"\\n\" + TEMPLATE + line).gsub!(/^|$/, \"######\") + \"\\n\")\n  width = TEMPLATE[/.*/].size\n  warn \"overflow!: #{ s - width }->#{ TEMPLATE.count(\"#\") - width }\"\nend\nPADDING = \"\".ljust(width, \"#_buffer_for_future_bug_fixes_\")\nCOPYRIGHT =\n  \"  Quine Relay -- Copyright (c) 2013, 2014 Yusuke Endoh (@mametter), @hirekoke  \".\n  center(width, \"#\")[0..-2]\n\ncode = TEMPLATE.gsub(/#+/) { w = $&.size; code.slice!(0, w).ljust(w, PADDING) }.chomp\ncode[-1] = \")\"\n\ncode[-1 - COPYRIGHT.size, COPYRIGHT.size] = COPYRIGHT\n\nFile.write(\"../QR.rb\", code + \"\\n\")\n"
  },
  {
    "path": "src/README.md.gen.rb",
    "content": "require_relative \"code-gen\"\nrequire \"erb\"\nrequire \"cairo\"\n\nother_packages = %w(cmake libpng-dev libgd-dev groff bison curl)\nother_packages.each do |package|\n  `dpkg -s #{ package }` # just check the packages\nend\n\npkg_versions = {}\napts = RunSteps.map {|s| s.apt }\n`which apt-get >/dev/null && dpkg -s #{ apts.join(\" \") }`.b.split(\"\\n\\n\").each do |s|\n  name = s[/^Package: (.*)$/, 1]\n  version = s[/^Version: (.*)$/, 1]\n  pkg_versions[name] = version if name && version\nend\n\nrows = [[\"\\\\#\", \"language\", \"ubuntu package\", \"version\"]]\nrows += RunSteps.map.with_index do |s, idx|\n  if s.apt.is_a?(Array)\n    apt = s.apt.join(\", \")\n    ver = pkg_versions.values_at(*s.apt)\n    #raise if ver.uniq.size > 1\n    ver = ver.first\n  else\n    apt = s.apt || \"*N/A*\"\n    ver = pkg_versions[apt]\n  end\n  ver = ver.gsub(\"~\") { \"\\\\~\" } if ver\n  [(idx + 1).to_s, s.name, apt, ver || \"-\"]\nend\n\nws = rows.transpose.map {|row| row.map {|s| s.size }.max + 1 }\nrows[1, 0] = [ws.map {|w| \"-\" * w }]\nrows = rows.map do |col|\n  (col.zip(ws).map {|s, w| s.ljust(w) } * \"|\").rstrip\nend\n\napt_get = \"sudo apt-get install #{ [*apts.flatten.compact.uniq].sort * \" \" }\"\napt_get.gsub!(/.{,70}( |\\z)/) do\n  $&[-1] == \" \" ? $& + \"\\\\\\n      \" : $&\nend\n\ncmds = [*RunSteps, RunStep[\"Ruby\", \"QR2.rb\"]].each_cons(2).map do |s1, s2|\n  cmd = s1.cmd_raw\n  src = s2.src\n  cmd = cmd.gsub(\"OUTFILE\", src)\n\n  cmd = cmd.gsub(/^!/, \"\")\n  cmd = cmd.gsub(/.{60,}?&&/, \"\\\\0\\n     \")\n\n  cmd\nend\n\nFile.write(\"../README.md\", ERB.new(DATA.read, trim_mode: \"%\").result(binding))\n\n\n__END__\n# Quine Relay\n\n[![CI](https://github.com/mame/quine-relay/workflows/CI/badge.svg)](https://github.com/mame/quine-relay/actions?query=workflow%3ACI)\n\n## What this is\n\n[QR.rb](https://github.com/mame/quine-relay/blob/master/QR.rb) is a <%= RunSteps[0].name %> program that generates\na <%= RunSteps[1].name %> program that generates\na <%= RunSteps[2].name %> program that generates\n...(through <%= RunSteps.size %> languages in total)...\na <%= RunSteps[-1].name %> program that generates\nthe original <%= RunSteps[0].name %> code again.\n\n![Language Uroboros][langs]\n\n[langs]: langs.png\n\n(If you want to see the old 50-language version, see the [50](https://github.com/mame/quine-relay/tree/50) branch.)\n\n## Usage\n\n### Ubuntu\n\nIf you are using Ubuntu <%= `bash -c 'source /etc/os-release && echo $VERSION'`.chomp %>, you can follow these steps.\n\n#### 1. Install all the interpreters/compilers.\n\nFirst, you need to type the following apt-get command to install them all.\n\n    $ <%= apt_get %>\n\nThen, build the bundled interpreters.\n\n    $ sudo apt-get install <%= other_packages.join(\" \") %>\n    $ make -C vendor\n\n#### 2. Run each program on each interpreter/compiler.\n\n    $ ulimit -s unlimited\n% cmds.each do |cmd|\n    $ <%= cmd %>\n% end\n\nYou will see that `QR.rb` is the same as `QR2.rb`.\n\n    $ diff QR.rb QR2.rb\n\nAlternatively, just type `make`.\n\n    $ make\n\nNote: It may take a lot of memory to compile some files.\n\n### Docker\n\nSimply build the image and run a container as follows:\n\n    $ docker build -t qr .\n    $ docker run --privileged --rm -e CI=true qr\n\nNote: You must run in privileged mode, otherwise the `maxima` command will fail.\n\nIf you want to check the generated files, you can mount the local directory in the Docker container (but still use the `vendor` directory of the container), as follows:\n\n    $ docker run --privileged --rm -e CI=true -v $(pwd):/usr/local/share/quine-relay -v /usr/local/share/quine-relay/vendor qr\n\n### Other platforms\n\nYou may find [instructions for other platforms in the wiki](https://github.com/mame/quine-relay/wiki/Installation).\n\nIf you do not use these Linux distributions, please find your own way.\nIf you manage it, please let me know.  I wish you good luck.\n\n## Interpreter/compiler versions tested\n\nI used the following Ubuntu deb packages to test this program.\n\n% rows.each do |row|\n<%= row %>\n% end\n\nNote that some languages are not available in Ubuntu (marked as *N/A*).\nThis repository contains their implementations in `vendor/`.\nSee also `vendor/README` for detail.\n\n\n## Frequently asked questions\n\n### Q. Why?\n\nA. [Take your pick](https://github.com/mame/quine-relay/issues/11).\n\n### Q. How?\n\nA. Good news: I have published a book, [\"The World of Obfuscated, Esoteric, Artistic Programming\"](http://gihyo.jp/book/2015/978-4-7741-7643-7).\nIt explains how to write a quine, an ascii-art quine, and an uroboros quine like this quine-relay.\nYou can buy my book on [amazon.co.jp](http://www.amazon.co.jp/dp/4774176435).\n\n(It also contains my almost all of my (about forty) works, including\n[alphabet-only Ruby program](http://www.slideshare.net/mametter/ruby-esoteric-obfuscated-ruby-programming-5088683),\n[radiation-hardened quine](https://github.com/mame/radiation-hardened-quine),\netc., and explains many techniques for writing such programs.)\n\nBad news: It is written in Japanese.\nI hope you can translate it into English <strike>and help me earn royalties</strike>.\n\n### Q. Language XXX is missing!\n\nA. See [the language inclusion criteria][criteria] in detail.  (In short, please create a deb package and contribute it to Ubuntu.)\n\nSee also [:heart:][sponsors].\n\n[criteria]: https://github.com/mame/quine-relay/wiki/Language-inclusion-criteria\n[sponsors]: https://github.com/sponsors/mame\n\n\n### Q. Does it really work?\n\nA. [![CI](https://github.com/mame/quine-relay/workflows/CI/badge.svg)](https://github.com/mame/quine-relay/actions?query=workflow%2ACI)\n\n### Q. How long did it take you?\n\nA. [Are you trying to cross the world line?](https://github.com/mame/quine-relay/issues/60)\n\n### Q. The code does not fit in my screen!\n\nA. [Here you go][thumbnail].\n\n[thumbnail]: thumbnail.png\n\n### Q. How was the code generated?\n\nA.\n\n    $ sudo apt-get install rake ruby-cairo ruby-rsvg2 ruby-gdk-pixbuf2 \\\n      optipng advancecomp ruby-chunky-png\n    $ cd src\n    $ rake clobber\n    $ rake\n\n## History\n\n## for Ubuntu 13.04\n\n[50 languages](https://github.com/mame/quine-relay/tree/ad3f8222c796969db8cfb1bae015a46c2387b3d6)\n\nAdded: Ruby, Scala, Scheme, bash, Smalltalk, Unlambda, Tcl, Whitespace, Verilog, Vala, Ada, ALGOL 68, Awk, Brainfuck, Boo, C, C++, C#, Cobol, Clojure, Fortran90, FORTRAN77, Forth, Common Lisp, CoffeeScript, Groovy, Go, INTERCAL, Icon, Haskell, Jasmin, Java, LLVM asm, Logo, Lua, Makefile, MSIL, Objective-C, JavaScript, OCaml, Octave, Parrot asm, Pascal, Perl, PHP, Pike, Prolog, Python, R, REXX\n\n## for Ubuntu 13.10\n\n[50 languages](https://github.com/mame/quine-relay/tree/ea4d39fb1ebc7ee23ec6f60ca7bfa0d465b5806a)\n\n## for Ubuntu 14.04\n\n[50 languages](https://github.com/mame/quine-relay/tree/d16bf072e3063dc476dc440c8f3e33d7426e98db)\n\n## for Ubuntu 14.10\n\n[64 languages](https://github.com/mame/quine-relay/tree/e449baba456d4885102482cbd365335be59241b2)\n\nAdded: Scilab, S-Lang, SPL, LOLCODE, Maxima, NASM, Neko, Nickle, Ook!, PARI/GP, Piet, PPT (Punched tape), PostScript, Ratfor\n\n## for Ubuntu 15.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/7749715289ca162eb1c1eb1ff1ed1393edc41630)\n\nAdded: Subleq, Standard ML, Thue, Visual Basic, XSLT, Yorick, Zoem, A+, AFNIX, Ante, Asymptote, ATS, BLC8, Befunge, bc, Chef, CDuce, D, dc, eC, Emacs Lisp, Erlang, F#, Falcon, FALSE, Gambas script, GAP, GEL (Genius), Gnuplot, G-Portugol, Gri, Haxe, Julia, Lisaac, Lazy K, Kaya\n\n## for Ubuntu 15.10\n\n[100 languages](https://github.com/mame/quine-relay/tree/f45035f867c7c8f7b4e12fa63e7c8eef9aabecad)\n\nRemoved: Boo, Falcon, Kaya\n\nAdded: Elixir, Jq, Nim\n\n## for Ubuntu 16.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/233ba8b4e1d7e4c59a46d64481048a8ea7f4400e)\n\n## for Ubuntu 17.04\n\n[100 languages](https://github.com/mame/quine-relay/tree/e65a798da23df0367d9eb5e4d46f00d87e6cb342)\n\nRemoved: SPL, Gri, Logo, Parrot asm\n\nAdded: Squirrel, Dafny, Grass, MiniZinc\n\n## for Ubuntu 17.10\n\n[100 languages](https://github.com/mame/quine-relay/tree/943b83801a1bd019ebf348adc78df2cdfde06513)\n\nRemoved: CDuce\n\nAdded: Rust\n\n## for Ubuntu 18.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/6e173d76e972e1da7992b84768bf9f4c788949ed)\n\nRemoved: Gambas script, Perl\n\nAdded: Shakespeare, sed, tcsh, TypeScript, Velato, Vimscript, Yabasic, zsh, Aheui, AspectC++, AspectJ, BeanShell, CMake, Flex, Fish, GDB, GolfScript, Gzip, Gri, JSFuck, ksh, LiveScript, M4, Mustache, nesC, Parser 3, Perl 5, Perl 6, Promela (Spin), rc\n\n## for Ubuntu 19.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/c8898351500682cea02219313e9203da7eca5505)\n\nRemoved: Scilab, G-Portugol, nesC\n\nAdded: Curry, Gambas script, GeneratorScriptingLanguage\n\n## for Ubuntu 19.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/13041dbf3f80a90c9221ef94f8e8bc385800b6fd)\n\nRemoved: Gri\n\nAdded: Scilab\n\n## for Ubuntu 20.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/62e2cc2d61d99719328094d185d899bc03a851fb)\n\n## for Ubuntu 20.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/114f44fefd610812d2f5e3032603762752ed51b2)\n\nRemoved: AspectC++, eC\n\nAdded: SurgeScript, Dhall\n\n## for Ubuntu 21.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/d8df33bad3693afd0bd3bf1c2b1cedd5753325dc)\n\nRemoved: Curry\n\nAdded: G-Portugol\n\n## for Ubuntu 21.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/158b6251d36a48122ec0006feaf759d8b1973b0f)\n\n## for Ubuntu 22.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/7b81d8704549d31814499c5300be2be9568467c8)\n\nRemoved: Julia, Nim, Pike\n\nAdded: WebAssembly (Text format), WebAssembly (Binary format), Kotlin\n\n## for Ubuntu 22.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/362962dd2d55d7c36dd9fa3e0d4c0c52c0e6a18f)\n\n## for Ubuntu 23.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/5dfdada5aa58f6a97ae85b84f86c7eb091225a8c)\n\nRemoved: Squirrel, GeneratorScriptingLanguage\n\nAdded: Crystal, Nim\n\n## for Ubuntu 23.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/74c4cc7d79fccbb1c8315070b9efea03cb787755)\n\nRemoved: Smalltalk\n\nAdded: Modula-2\n\n## for Ubuntu 24.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/20d7f437c053b8e0b301ba996d124a4b812e3571)\n\nRemoved: PPT (Punched tape)\n\nAdded: Pike\n\n## for Ubuntu 24.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/2ed61a62c9d31121b39e740c89107085c122f478)\n\nRemoved: Dafny, Maxima\n\nAdded: Execline, Squirrel\n\n## for Ubuntu 25.04\n\n[128 languages](https://github.com/mame/quine-relay/tree/b9c8056cad4589fe650163a3fd0cea4b3055fce4)\n\n## for Ubuntu 25.10\n\n[128 languages](https://github.com/mame/quine-relay/tree/5298413382ea707061e04aa077f99872d159a7b8)\n\nRemoved: Lisaac\n\nAdded: Swift\n\n## License\n\nThe MIT License applies to all resources\n*except* the files in the `vendor/` directory.\n\nThe files in the `vendor/` directory are from third-parties\nand are distributed under different licenses.\nSee `vendor/README` in detail.\n\n---\n\nThe MIT License (MIT)\n\nCopyright (c) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Yusuke Endoh (@mametter), @hirekoke\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "src/Rakefile",
    "content": "require \"rake/clean\"\n\nCLEAN.include(\"../QR.*\")\nCLEAN.include(\"../qr.*\")\nCLEAN.include(\"../QR$*\")\nCLEAN.include(\"../QR\")\nCLEAN.include(\"../qr\")\nCLEAN.include(\"../QR2.rb\")\nCLEAN.include(\"../README.md\")\nCLEAN.include(\"../langs.png\")\nCLEAN.include(\"../Makefile\")\n\nLIBS = %w(code-gen.rb code-gen-pool.rb lazyk-boot.dat blc-boot.dat grass-boot.dat wasm-tmpl.dat)\n\nfile \"lazyk-boot.dat\" => \"lazyk-boot.dat.gen.rb\" do\n  ruby \"lazyk-boot.dat.gen.rb\"\nend\n\nfile \"blc-boot.dat\" => \"blc-boot.dat.gen.rb\" do\n  ruby \"blc-boot.dat.gen.rb\"\nend\n\nfile \"grass-boot.dat\" => \"grass-boot.dat.gen.rb\" do\n  ruby \"grass-boot.dat.gen.rb\"\nend\n\nfile \"wasm-tmpl.dat\" => \"wasm-tmpl.dat.gen.rb\" do\n  ruby \"wasm-tmpl.dat.gen.rb\"\nend\n\nfile \"../QR.rb\" => [\"QR.rb.gen.rb\", *LIBS, \"uroboros.txt\"] do\n  ruby \"QR.rb.gen.rb\"\nend\n\nfile \"../README.md\" => [\"README.md.gen.rb\", *LIBS] do\n  ruby \"README.md.gen.rb\"\nend\n\nfile \"../langs.png\" => [\"langs.png.gen.rb\", \"uroboros.svg\", *LIBS] do\n  ruby \"langs.png.gen.rb\"\nend\n\nfile \"../thumbnail.png\" => [\"thumbnail.png.gen.rb\", \"../QR.rb\"] do\n  ruby \"thumbnail.png.gen.rb\"\nend\n\nfile \"../Makefile\" => [\"Makefile.gen.rb\", *LIBS] do\n  ruby \"Makefile.gen.rb\"\nend\n\nfile \"../.github/workflows/main.yml\" => [\"dot.github.workflows.main.yml.gen.rb\", *LIBS] do\n  ruby \"dot.github.workflows.main.yml.gen.rb\"\nend\n\nfile \"../Dockerfile\" => [\"Dockerfile.gen.rb\", *LIBS] do\n  ruby \"Dockerfile.gen.rb\"\nend\n\ntask :test do\n  ruby \"test.rb\"\nend\n\ntask :default => %w(\n  ../QR.rb\n  ../README.md\n  ../langs.png\n  ../thumbnail.png\n  ../Makefile\n  ../.github/workflows/main.yml\n  ../Dockerfile\n)\n\ntask \"../SHA256SUMS\" => [\"SHA256SUMS.gen.rb\", *LIBS] do\n  ruby \"SHA256SUMS.gen.rb\"\nend\n\ntask :run => :default do\n  sh \"make -C ..\"\nend\n\ntask :gen => [:run, \"../SHA256SUMS\"]\n"
  },
  {
    "path": "src/SHA256SUMS.gen.rb",
    "content": "require_relative \"code-gen\"\n\nDir.chdir(\"..\") do\n  system(\"sha256sum\", \"-b\", *RunSteps.map {|s| s.src }, out: \"SHA256SUMS\")\nend\n"
  },
  {
    "path": "src/blc-boot.dat.gen.rb",
    "content": "def dump(e, env)\n  if e.is_a?(Symbol)\n    ?1 * (env.index(e) + 1) + ?0\n  elsif e[0] == :abs!\n    vs = [*e[1]].reverse\n    \"00\" * vs.size + dump(e[2], vs + env)\n  else\n    \"01\" * (e.size - 1) + e.map {|x| dump(x, env) } * \"\"\n  end\nend\n\nL = -> x, y { [:abs!, x, y] }\nLet = -> v, x, y { [L[v, y], x] }\nCons = -> x, y { L[:f, [:f, x, y]] }\nFalse = L[[:x, :y], :y]\nTrue  = L[[:x, :y], :x]\n\nNum = -> n {\n  [n[7] == 1 ? :ConsFalse : :ConsTrue,\n  [n[6] == 1 ? :ConsFalse : :ConsTrue,\n  [n[5] == 1 ? :ConsFalse : :ConsTrue,\n  [n[4] == 1 ? :ConsFalse : :ConsTrue,\n  [n[3] == 1 ? :ConsFalse : :ConsTrue,\n  [n[2] == 1 ? :ConsFalse : :ConsTrue,\n  [n[1] == 1 ? :ConsFalse : :ConsTrue,\n  [n[0] == 1 ? :ConsFalse : :ConsTrue, False]]]]]]]]\n}\n\nOutBF = -> tl { [:Cons, Num[?..ord], [:ConsGt, tl]] }\nDblBF = # [->++<]>\n  L[:tl,\n    Let[:ConsTrue, :ConsTrue,\n    Let[:ConsFalse, :ConsFalse,\n        [:Cons, Num[?[.ord],\n        [:Cons, Num[?-.ord],\n        [:ConsGt,\n        [:ConsPlus,\n        [:ConsPlus,\n        [:Cons, Num[?<.ord],\n        [:Cons, Num[?].ord],\n        [:ConsGt, :tl]]]]]]]]]]]\n\n# each_bit bit tl =\n#   (\"[->++<]>\" concat (tl each_bit))\nEachBit =\n  [L[:x, [:x, :x]], # recursive\n   L[[:self, :bit, :tl, :next],\n     [:tl, [:self, :self], [:DblBF, [:bit, [:ConsPlus, :next], :next]]]]]\n\n# each_byte byte tl =\n#   (byte each_bit \".>\") concat (tl each_byte)\nEachByte =\n  [L[:x, [:x, :x]], # recursive\n   L[[:self, :byte, :tl],\n     Let[:Cons, L[[:x, :y, :f], [:f, :x, :y]],\n     Let[:ConsTrue, [:Cons, True],\n     Let[:ConsFalse, [:Cons, False],\n     Let[:ConsPlus, [:Cons, Num[?+.ord]],\n     Let[:ConsGt, [:Cons, Num[?>.ord]],\n     Let[:DblBF, DblBF,\n         [:byte, EachBit, OutBF[[:tl, [:self, :self]]]]]]]]]]]]\n\ntree = EachByte\nboot = \"10\" + dump(tree, [])\n\n# 20 x ? boot = 00010100 x ? boot = \\a (\\b x) ? boot = \\a x boot\n# 22 x y = 00010110 x y = \\a a x y = cons x y\n# 4 222  = 00000100 11011110 = \\a \\b (\\c b) (????) = \\a \\b b = false\n# 4 226  = 00000100 11100010 = \\a \\b (\\c a) (\\c c) = \\a \\b a = true\nif ARGV[0]\n  $stderr.puts(boot.size, (boot.size + 7) / 8)\n  a = [20]\n  (\"foo\" * 100 + \"\\n\").each_byte do |b|\n    a << 22\n    0.upto(7) do |i|\n      a << 22 << 4 << 222 + b[i] * 4\n    end\n    a << 4 << 222\n  end\n  a << 4 << 222\n  print a.pack(\"C*\") + [boot].pack(\"B*\")\nelse\n  File.write(\"blc-boot.dat\", [boot].pack(\"B*\"))\nend\n"
  },
  {
    "path": "src/code-gen-pool.rb",
    "content": "original_list_size = CodeGen::List.size\n\n#class NesC < CodeGen\n#  Name = \"nesC\"\n#  File = \"QR.nc\"\n#  Cmd = \"nescc -o QR QR.nc && ./QR > OUTFILE\"\n#  Apt = \"nescc\"\n#  def code\n#    <<-'END'.lines.map {|l| l.strip }.join\n#      %(\n#        #include<stdio.h>\\n\n#        module QR{}implementation{\n#          int main()__attribute__((C,spontaneous)){\n#            puts#{E[PREV]};\n#            return 0;\n#        } }\n#      )\n#    END\n#    # avoid \"}}\" because of Mustache\n#  end\n#end\n\n#class Nim_NVSPL2 < CodeGen\n#  After = Nim\n#  Obsoletes = Nim\n#  File = [\"QR.nim\", \"QR.nvspl2\"]\n#  Cmd = [\"nim c QR.nim && ./QR > OUTFILE\", \"ruby vendor/nvspl2.rb QR.nvspl2 > OUTFILE\"]\n#  Apt = [\"nim\", nil]\n#  Code = %q(%((for i, c in#{E[PREV]}:echo \",\",int(c),\"CO\");echo \"Q\"))\n#end\n\nCodeGen::List.slice!(original_list_size..-1).each do |s|\n  i = CodeGen::List.find_index(s::After)\n  CodeGen::List.insert(i, s)\n  [*s::Obsoletes].each {|s_| CodeGen::List.delete(s_) } if defined?(s::Obsoletes)\nend\n\nCodeGen::List.delete(GeneratorScriptingLanguage)\n\nclass Zig < CodeGen\n  File = \"QR.zig\"\n  Cmd = \"zig run QR.zig > OUTFILE\"\n  Apt = \"zig\"\n  Code = %q(%(pub fn main()!void{_=try @import(\"std\").io.getStdOut().write#{E[PREV]};}))\nend\n\n# aribas\n# elvish\n# hare\n# raku\n# snek\n# storm-lang\n"
  },
  {
    "path": "src/code-gen.rb",
    "content": "# A source for generating Quine Relay\n\nGenStep = Struct.new(:name, :code, :run_steps)\nRunStep = Struct.new(:name, :src, :cmd_make, :cmd_raw, :backup, :apt)\n\n# A class that generates Ruby code that generates a code (in a language X) that prints PREV.\nclass CodeGen\n  # File = source file name of X\n  # Cmd = command for execution/compilation\n  # Apt = ubuntu package name of the interpreter/compiler of X\n\n  List = []\n  def self.inherited(c)\n    List << c\n  end\n\n  def self.gen_step\n    GenStep[name, new.code, run_steps]\n  end\n\n  def code\n    self.class::Code\n  end\n\n  def self.run_steps\n    a = []\n    a << (defined?(self::Name) ? [*self::Name] : self.to_s.split(\"_\"))\n    a << [*self::File]\n    a << [*self::Cmd]\n    a << (defined?(self::Backup) ? [*self::Backup] : [*self::Cmd].map { nil })\n    a << [*self::Apt]\n    a.transpose.map do |name, src, cmd_make, backup, apt|\n      cmd_raw = cmd_make\n      cmd_raw = cmd_raw.gsub(\"$(SCHEME)\", \"guile\")\n      cmd_raw = cmd_raw.gsub(\"$(JAVASCRIPT)\", \"nodejs\")\n      cmd_raw = cmd_raw.gsub(\"$(CC)\", \"gcc\")\n      cmd_raw = cmd_raw.gsub(\"$(CXX)\", \"g++\")\n      cmd_raw = cmd_raw.gsub(\"$(GBS)\", \"gbs3\")\n      RunStep[name, src, cmd_make, cmd_raw, backup, apt]\n    end\n  end\nend\n\n# Common part\nGenPrologue = <<-'END'.lines.map {|l| l.strip }.join\n  B=92.chr;\n  g=32.chr;\n  N=10.chr;\n  n=0;\n  e=->s{Q[Q[s,B],?\"].gsub(N,B+?n)};\n  E=->s{'(\"'+e[s]+'\")'};\n  d=->s,t=?\"{s.gsub(t){t+t}};\n  def f(s,n)s.gsub(/.{1,#{n*255}}/m){yield$S=E[$s=$&]}end;\n  Q=->s,t=?${s.gsub(t){B+$&}};\n  R=\";return 0;\";\n  V=->s,a,z{s.gsub(/(#{B*4})+/){a+\"#{$&.size/2}\"+z}};\n  C=%w(System.Console Write);\n  $C=C*?.;\n  $D=\"program QR\";\n  $G=\" contents of\"+$F=\" the mixing bowl\";\n  $L=\"public static\";\n  $W=\"s.WriteByte\";\n  rp=->s,r{\n    v=\"\";\n    [r.inject(s){|s,j|\n      o={};\n      m=n=0;\n      s.size.times{|i|\n        o[f=s[i,2]]||=0;\n        c=o[f]+=1;\n        m<c&&(m=c;n=f)\n      };\n      v=n+v;\n      s.gsub(n,(j%256).chr)\n    },v]\n  };\nEND\n# rp: Re-Pair (Naive byte pair encoding)\n\nclass Python_R_Ratfor_Rc_REXX < CodeGen\n  Name = [\"Python\", \"R\", \"Ratfor\", \"rc\", \"REXX\"]\n  File = [\"QR.py\", \"QR.R\", \"QR.ratfor\", \"QR.rc\", \"QR.rexx\"]\n  Cmd = [\n    \"python3 QR.py > OUTFILE\",\n    \"R --slave -f QR.R > OUTFILE\",\n    \"ratfor -o QR.ratfor.f QR.ratfor && gfortran -o QR QR.ratfor.f && ./QR > OUTFILE\",\n    \"rc QR.rc > OUTFILE\",\n    \"rexx ./QR.rexx > OUTFILE\"\n  ]\n  Apt = [\"python3\", \"r-base\", \"ratfor\", \"rc\", \"regina-rexx\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        print('cat(\"')\\n\n        for c in\"\".join([\"echo 'say ''%s'''\\\\n\"%l for l in#{E[d[d[PREV,?'],?']]}.split(\"\\\\n\")]):\n          print('r=fput(char(%d))'%ord(c))\\n\n        print('end\\\\n\")')#\n      )\n    END\n  end\nend\n\nclass Promela < CodeGen\n  Name = \"Promela (Spin)\"\n  File = \"QR.pr\"\n  Cmd = \"spin -T QR.pr > OUTFILE\"\n  Apt = \"spin\"\n  Code = %q(\"init{#{f(PREV,6){\"printf#{d[$S,?%]};\"}}}\")\nend\n\nclass Prolog < CodeGen\n  File = \"QR.prolog\"\n  Cmd = \"swipl -q -t qr -f QR.prolog > OUTFILE\"\n  Apt = \"swi-prolog\"\n  Code = %q(\"qr:-write('#{Q[e[PREV],?']}').\")\nend\n\nclass PostScript < CodeGen\n  Name = \"PostScript\"\n  File = \"QR.ps\"\n  Cmd = \"gs -dNODISPLAY -q QR.ps > OUTFILE\"\n  Apt = \"ghostscript\"\n  Code = %q(\"(#{Q[PREV,B]})print quit\")\nend\n\nclass Pike < CodeGen\n  File = \"QR.pike\"\n  Cmd = \"pike QR.pike > OUTFILE\"\n  Apt = \"pike8.0\"\n  Code = %q(\"int main(){write#{E[PREV]+R}}\")\nend\n\nclass PHP_Piet < CodeGen\n  File = [\"QR.php\", \"QR.png\"]\n  Cmd = [\"php QR.php > OUTFILE\", \"npiet QR.png > OUTFILE\"]\n  Apt = [\"php-cli\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        <?php $z=3+$w=strlen($s=#{Q[E[PREV]]})*3;\n          echo\"\\\\x89PNG\\\\r\\\\n\\\\x1a\\\\n\";\n          $m=\"\";\n          $t=\"\\\\xc0\\\\0\\\\xff\";\n          for($i=-1;++$i<128*$z;\n              $m.=$c--?\n                ($w-$c||$i>$z)&&$i/$z<($c<$w?ord($s[(int)($c/3)]):$c--%3+2)?\n                  $t[2].$t[$c%3%2].$t[$c%3]:\"\\\\0\\\\0\\\\0\":\"\\\\0\"\n          )\n            $c=$i%$z;\n          foreach(array(\n            \"IHDR\".pack(\"NNCV\",$w+2,128,8,2),\n            \"IDAT\".gzcompress($m),\n            \"IEND\"\n          )as$d)\n            echo pack(\"NA*N\",strlen($d)-4,$d,crc32($d));\n      )\n    END\n  end\nend\n\nclass Perl6 < CodeGen\n  Name = \"Perl 6\"\n  File = \"QR.pl6\"\n  Cmd = \"perl6 QR.pl6 > OUTFILE\"\n  Apt = \"rakudo\"\n  Code = %q(\"$_='#{Q[PREV.gsub(B,\"\\x7f\"),?']}';s:g/\\\\\\\\x7f/\\\\\\\\\\\\\\\\/;print $_\")\nend\n\nclass Perl5 < CodeGen\n  Name = \"Perl 5\"\n  File = \"QR.pl\"\n  Cmd = \"perl QR.pl > OUTFILE\"\n  Apt = \"perl\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      (\n        p=\"eval\";\n        %(\n          $_=\"#{\n            s,v=rp[PREV,128..287];\n            s=\"\n              $_='#{Q[s,c=/['\\\\\\\\]/]}';\n              $n=32;\n              $s='#{Q[v,c]}';\n              $s=~s{..}{\n                $a=$&;\n                $b=chr(--$n&255);\n                ~s/$b/$a/g;\n              }eg;\n              print\n            \";\n            (s+N*(-s.size%6)).unpack(\"B*\")[0].\n              gsub(/.{6}/){n=$&.to_i 2;((n+14)/26*6+n+47).chr}\n          }\";\n          s|.|$n=ord$&;substr unpack(B8,chr$n-int($n/32)*6-41),2|eg;\n          eval pack'B*',$_\n        ).scan(/[ ,-:A-z]+|(.)/){p=\"s++#{$1?\"chr #{$1.ord}+e\":$&+?+};\"+p};\n        p\n      )\n    END\n  end\nend\n\nclass Pascal < CodeGen\n  File = \"QR.pas\"\n  Cmd = \"fpc QR.pas && ./QR > OUTFILE\"\n  Apt = \"fp-compiler\"\n  Code = %q(\"#$D(output);begin write(#{f(PREV,1){\"'#$s',\"}}'')end.\")\nend\n\nclass Parser3 < CodeGen\n  Name = \"Parser 3\"\n  File = \"QR.p\"\n  Cmd = \"parser3 QR.p > OUTFILE\"\n  Apt = \"parser3-cgi\"\n  Code = %q(\"$console:line[#{PREV.gsub(/[:;()]/){?^+$&}}]\")\nend\n\nclass PARIGP < CodeGen\n  Name = \"PARI/GP\"\n  File = \"QR.gp\"\n  Cmd = \"gp -f -q QR.gp > OUTFILE\"\n  Apt = \"pari-gp\"\n  Code = %q(\"print#{E[PREV]};quit\")\nend\n\nclass Octave_Ook < CodeGen\n  Name = [\"Octave\", \"Ook!\"]\n  File = [\"QR.octave\", \"QR.ook\"]\n  Cmd = [\n    \"mv QR.m QR.m.bak && octave -qf QR.octave > OUTFILE && mv QR.m.bak QR.m\",\n    \"ruby vendor/ook-to-bf.rb QR.ook QR.ook.bf && ruby vendor/bf.rb QR.ook.bf > OUTFILE\"\n  ]\n  Apt = [\"octave\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"\n        s=double#{E[PREV]};\n        t=num2cell(b=11-ceil(s/13));\n        for n=1:9\n            m={};\n            for i=1:141\n              f=@(x,y,n)repmat(['Ook' char(x) ' Ook' char(y) ' '],[1 abs(n)]);\n              m(i)=[f(z=46,63,n) f(q=z-(i<13)*13,q,i-13) f(33,z,1) f(63,z,n)];\n            end;\n            t(x=b==n)=m(diff([0 s(x)])+13);\n        end;\n        printf('%%s',t{:})\n      \"\n    END\n    # NOTE: %% is a hack for Nickle printf escaping.\n  end\nend\n\nclass OCaml < CodeGen\n  File = \"QR.ml\"\n  Cmd = \"ocaml QR.ml > OUTFILE\"\n  Apt = \"ocaml\"\n  Code = %q(\"print_string\"+E[PREV])\nend\n\nclass ObjC < CodeGen\n  Name = \"Objective-C\"\n  File = \"QR.m\"\n  Cmd = \"gcc -o QR QR.m && ./QR > OUTFILE\"\n  Apt = \"gobjc\"\n  Code = %q(\"#import<stdio.h>#{N}int main(){puts#{E[PREV]+R}}\")\nend\n\nclass Nim < CodeGen\n  File = \"QR.nim\"\n  Cmd = \"nim compile QR.nim && ./QR > OUTFILE\"\n  Apt = \"nim\"\n  Code = %q(\"echo#{E[PREV]}\")\nend\n\nclass Nickle < CodeGen\n  File = \"QR.5c\"\n  Cmd = \"nickle QR.5c > OUTFILE\"\n  Apt = \"nickle\"\n  Code = %q(\"printf#{E[PREV]}\\\\n\")\nend\n\nclass Neko < CodeGen\n  File = \"QR.neko\"\n  Cmd = \"nekoc QR.neko && neko QR.n > OUTFILE\"\n  Apt = \"neko\"\n  Code = %q(\"$print#{E[PREV]};\")\nend\n\nclass Mustache_NASM < CodeGen\n  File = [\"QR.mustache\", \"QR.asm\"]\n  Cmd = [\n    \"mustache QR.mustache QR.mustache > OUTFILE\",\n    \"nasm -felf QR.asm && ld -m elf_i386 -o QR QR.o && ./QR > OUTFILE\",\n  ]\n  Apt = [\"ruby-mustache\", \"nasm\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip.gsub(\"^^^\", \" \") }.join(\"\\\\n\")\n      \"m{{!: x\n      qr: |-\n      ^^^:db\\x60#{e[s=PREV]}\\x60\n      ^^^global _start\n      ^^^_start:mov edx,#{s.size}\n      ^^^mov ecx,m\n      ^^^mov ebx,1\n      ^^^mov eax,4\n      ^^^int 128\n      ^^^mov ebx,0\n      ^^^mov eax,1\n      ^^^int 128\n      x: |\n      ^^^}}{{{qr}}}\"\n    END\n  end\nend\n\nclass MSIL < CodeGen\n  File = \"QR.il\"\n  Cmd = \"ilasm QR.il && mono QR.exe > OUTFILE\"\n  Apt = \"mono-devel\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        .assembly t{}\n        .method #$L void Main()\n        {\n          .entrypoint ldstr\"#{e[PREV]}\"\n          call void [mscorlib]#{C*\"::\"}(string)\n          ret\n        }\n      )\n    END\n  end\nend\n\nclass Modula2 < CodeGen\n  Name = \"Modula-2\"\n  File = \"QR.mod\"\n  Cmd = \"gm2 -fiso QR.mod -o QR && ./QR > OUTFILE\"\n  Apt = \"gm2\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"\n        MODULE QR;\n        FROM StrIO IMPORT WriteString;\n        BEGIN #{\n          (PREV).gsub(/()[#{i=94.chr}\"]+|[#{i}']+/){\n            [\"WriteString(\",$&,\");\"]*($1??\":?')\n          }\n        }END QR.\n      \"\n    END\n  end\nend\n\nclass MiniZinc < CodeGen\n  File = \"QR.mzn\"\n  Cmd = \"minizinc --solver COIN-BC --soln-sep '' QR.mzn > OUTFILE\"\n  Apt = \"minizinc\"\n  Code = %q(\"solve satisfy;output [#{E[PREV]}];\")\nend\n\nclass Makefile < CodeGen\n  File = \"QR.mk\"\n  Cmd = \"make -f QR.mk > OUTFILE\"\n  Apt = \"make\"\n  Code = %q(\"all:\\n\\t@echo '#{d[PREV,?$].gsub(?'){\"'\\\\\\\\''\"}}'\")\nend\n\nclass M4 < CodeGen\n  File = \"QR.m4\"\n  Cmd = \"m4 QR.m4 > OUTFILE\"\n  Apt = \"m4\"\n  Code = %q(\"changequote(<@,@>)\\ndefine(p,<@#{PREV}@>)\\np\")\nend\n\nclass Lua < CodeGen\n  File = \"QR.lua\"\n  Cmd = \"lua5.3 QR.lua > OUTFILE\"\n  Apt = \"lua5.3\"\n  Code = %q(\"x=string.gsub(#{V[E[PREV],?&,?&]},'&(%d+)&',function(s)return string.rep('\\\\\\\\\\\\\\\\',tonumber(s))end);print(x)\")\nend\n\nclass LOLCODE < CodeGen\n  File = \"QR.lol\"\n  Cmd = \"lci QR.lol > OUTFILE\"\n  Apt = [nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        HAI 1.2\\n\n        VISIBLE \"#{\n          PREV.gsub(/[:\"]/,\":\\\\0\")\n        }\"\\n\n        KTHXBYE BYE\n      )\n    END\n  end\nend\n\nclass LLVMAsm < CodeGen\n  Name = \"LLVM asm\"\n  File = \"QR.ll\"\n  Cmd = \"llvm-as QR.ll && lli QR.bc > OUTFILE\"\n  Apt = \"llvm\"\n  Backup = \"QR.bc\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        @s=global[#{i=(s=PREV).size+1}x i8]\n          c\"#{s.gsub(/[\\\\\"\\n\\t]/){\"\\\\%02X\"%$&.ord}}\\\\00\"\n        declare i32@puts(i8*)\n        define i32@main(){\n          %1=call i32@puts(i8*getelementptr([#{i}x i8],[#{i}x i8]*@s,i32 0,i32 0))\n          ret i32 0\n        }\n      )\n    END\n  end\nend\n\nclass Ksh_LazyK_LiveScript < CodeGen\n  Name = [\"ksh\", \"Lazy K\", \"LiveScript\"]\n  File = [\"QR.ksh\", \"QR.lazy\", \"QR.ls\"]\n  Cmd = [\n    \"ksh QR.ksh > OUTFILE\",\n    \"lazyk QR.lazy > OUTFILE\",\n    \"lsc QR.ls > OUTFILE\",\n  ]\n  Apt = [\"ksh\", nil, \"livescript\"]\n  Backup = [nil, nil, \"QR.c\"]\n  def code\n    lazyk = ::File.read(::File.join(__dir__, \"lazyk-boot.dat\"))\n    lazyk = lazyk.tr(\"ski`\",\"0123\").scan(/.{1,3}/).map do |n|\n      n = n.reverse.to_i(4)\n      [*93..124,*42..73][n]\n    end.pack(\"C*\")\n    lazyk = lazyk.gsub(/[ZHJK\\^`~X]/) {|c| \"\\\\x%02x\" % c.ord }\n    <<-'END'.lines.map {|l| l.strip }.join.sub(\"LAZYK\"){lazyk}\n      %(\n        p(){ echo -n $1;};\n        f(){ for x in $(p \"$1\"|od -An -tu1 -v);do;\n            p $4;\n            for((j=$3;j--;));do;\n              h $2 $x $j;\n            done;\n          done;\n        };\n        p k\\\\`;\n        h(){ p \\\\`${1:$(($2>>$3&1)):2};};\n        f 'console.log#{Q[E[PREV],?#].gsub(?',%('\"'\"'))}' kki 7 '``s``s``s``s``s``s``s``si';\n        h(){ p ${1:$(((($2%83-10)>>((2-$3)*2))%4)):1};};\n        f 'LAZYK' ski\\\\` 3\n      )\n    END\n  end\nend\n\nclass Kotlin < CodeGen\n  File = \"QR.kt\"\n  Cmd = \"kotlinc QR.kt -include-runtime -d QR.jar && kotlin QR.jar > OUTFILE\"\n  Apt = \"kotlin\"\n  Code = %q(\"fun main(a:Array<String>){print#{Q[E[PREV]]} }\")\nend\n\nclass JavaScript_Jq_JSFuck < CodeGen\n  File = [\"QR.js\", \"QR.jq\", \"QR.jsfuck\"]\n  Cmd = [\n    \"$(JAVASCRIPT) QR.js > OUTFILE\",\n    \"jq -r -n -f QR.jq > OUTFILE\",\n    \"!$(JAVASCRIPT) --stack_size=100000 QR.jsfuck > OUTFILE\",\n  ]\n  Apt = [\"nodejs\", \"jq\", \"nodejs\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        P={0:'[+[]]',m:'((+[])'+(C=\"['constructor']\")+\"+[])['11']\"};\n        for(R in B=\n          (\n            '![]@!![]@[][[]]@'+\n            (A=\"[]['fill']\")+\n            \"@([]+[])['fontcolor']([])@(+('11e20')+[])['split']([])@\"+\n            A+C+\"('return escape')()(\"+A+')'\n          ).split('@')\n        )\n          for(E in D=eval(G='('+B[R]+'+[])'))\n            P[T=D[E]]=P[T]||G+\"['\"+E+\"']\";\n        for(G='[',B=0;++B<36;)\n          P[D=B.toString(36)]=\n            B<10?\n              (G+='+!+[]')+']'\n            :\n              P[D]||\"(+('\"+B+\"'))['to'+([]+[])\"+C+\"['name']]('36')\";\n        A+=C+\"('console.log(unescape(\\\\\"\";\n        for(E in G=#{E[PREV]})\n          A+=\"'+![]+'\"+G.charCodeAt(E).toString(16);\n        for(A+=\"\\\\\".replace(/'+![]+'/g,\\\\\"%\\\\\")))')()\",R=0;R<9;R++)\n          A=A.replace(/'.*?'/g,function(B){\n            T=[];\n            for(E=1;B[E+1];)\n              T.push(P[B[E++]]);\n            return T.join('+')\n          });\n        console.log('\"'+A+'\"')\n      )\n    END\n  end\nend\n\nclass Java_ < CodeGen\n  Name = \"Java\"\n  File = \"QR.java\"\n  Cmd = \"javac QR.java && java QR > OUTFILE\"\n  Apt = \"openjdk-11-jdk\"\n  def code\n    # LZ78-like compression\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        class QR{\n          #$L void main(String[]v){\n            String c[]=new String[99999],y=\"\",z=y,s=\"#{\n              z=t=(0..r=q=126).map{|n|[n,[]]};\n              a=\"\";\n              b=->n{a<<(n%78+55)%84+42};\n              (PREV).bytes{|n|\n                r,z=z[n]||(\n                  b[r/78];b[r];\n                  q<6083&&z[n]=[q+=1,[]];\n                  t[n])\n              };\n              b[r/78];b[r]\n            }\";\n            int i=0,n=0,q=0;\n            for(;++n<126;)c[n]=\"\"+(char)n;\n            for(;i<#{a.size};){\n              q=q*78+(s.charAt(i)-13)%84;\n              if(i++%2>0){\n                y=q<n?c[q]:y;\n                c[n++]=z+y.charAt(0);\n                System.out.print(z=c[q]);\n                q=0;\n              }\n            }\n          }\n        }\n      )\n    END\n  end\nend\n\nclass Jasmin < CodeGen\n  File = \"QR.j\"\n  Cmd = \"jasmin QR.j && java QR > OUTFILE\"\n  Apt = \"jasmin-sable\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        .class public QR\\n\n        .super #{$T=\"java/io/PrintStream\"}\\n\n        .method #$L main([L#{S=\"java/lang/S\"}tring;)V ;]\\n\n        .limit stack 2\\n\n        getstatic #{S}ystem/out L#$T;\\n\n        ldc \"#{e[PREV]}\"\\n\n        invokevirtual #$T/println(L#{S}tring;)V\\n\n        return\\n\n        .end method\n      )\n    END\n  end\nend\n\nclass Icon_INTERCAL < CodeGen\n  File = [\"QR.icn\", \"QR.i\"]\n  Cmd = [\n    \"icont -s QR.icn && ./QR > OUTFILE\",\n    \"ick -bfOc QR.i && gcc -std=c99 -static QR.c -I /usr/include/ick-* -o QR -lick && ./QR > OUTFILE\"\n  ]\n  Backup = [nil, \"QR.c\"]\n  Apt = [[\"icont\", \"iconx\"], \"intercal\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        procedure main();\n          i:=c:=0;\n          s:=#{E[PREV+N]};\n          write(\"DO,1<-#\"||*s);\n          s?while t:=ord(move(1))do{\n            i+:=1;\n            u:=-i;\n            every 0to 7do{u:=u*2+t%2;t/:=2};\n            write(\"PLEASE\")\\\\(i%4/3);\n            write(\"DO,1SUB#\"||i||\"<-#\"||((c-u)%256));\n            c:=u;\n          };\n          write(\"PLEASEREADOUT,1\\\\nPLEASEGIVEUP\");\n        end\n      )\n    END\n  end\nend\n\nclass Haxe < CodeGen\n  File = \"QR.hx\"\n  Cmd = \"haxe -main QR -neko QR.n && neko QR.n > OUTFILE\"\n  Apt = \"haxe\"\n  Code = %q(\"class QR{#$L function main(){neko.Lib.print#{E[PREV]};}}\")\nend\n\nclass Haskell < CodeGen\n  File = \"QR.hs\"\n  Cmd = \"rm -f QR.o && ghc QR.hs && ./QR > OUTFILE\"\n  Apt = \"ghc\"\n  Code = %q(\"main=putStr\"+E[PREV])\nend\n\nclass Groovy_Gzip < CodeGen\n  File = [\"QR.groovy\", \"QR.gz\"]\n  Cmd = [\"groovy QR.groovy > OUTFILE\", \"gzip -cd QR.gz > OUTFILE\"]\n  Apt = [\"groovy\", \"gzip\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        z=new java.util.zip.GZIPOutputStream(System.out);\n        z.write('#{PREV.tr(?\"+B,\"!~\")}'.tr('~!','\\\\\\\\\\u0022')as byte[]);\n        z.close()\n      )\n    END\n  end\nend\n\nclass GolfScript_GPortugol_Grass < CodeGen\n  Name = [\"GolfScript\", \"G-Portugol\", \"Grass\"]\n  File = [\"QR.gs\", \"QR.gpt\", \"QR.grass\"]\n  Cmd = [\"ruby vendor/golfscript.rb QR.gs > OUTFILE\", \"mv QR.c QR.c.bak && gpt -t QR.c QR.gpt && gcc -o QR QR.c && ./QR > OUTFILE && mv QR.c.bak QR.c\", \"ruby vendor/grass.rb QR.grass > OUTFILE\"]\n  Apt = [nil, \"gpt\", nil]\n  def code\n    r = <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        @@BASE@@:j;\n        {\n          119:i;\n          {\n            206i-:i;\n            .48<{71+}{[i]\\\\48-*}if\n          }%\n        }:t;\n        \"algoritmo QR;in\"[195][173]++'cio imprima(\"'\n        @@PROLOGUE@@\n        \"#{e[PREV]}\"\n        {\n          \"W\"\"w\"@j 1+:j\\\\- @@MOD@@%1+*\n        }%\n        @@EPILOGUE@@\n        '\");fim'\n      )\n    END\n    mod, prologue, epilogue = ::File.read(::File.join(__dir__, \"grass-boot.dat\")).lines\n    prologue += \"t\"\n    epilogue += \"t\"\n    prologue = prologue.gsub(/(\\/12131)+/) { \"\\\"t\\\"/12131\\\"t #{ $&.size / 6 }*\\\"\" }\n    mod = mod.to_i\n    r.gsub(/@@\\w+@@/, {\n      \"@@PROLOGUE@@\" => prologue.chomp,\n      \"@@EPILOGUE@@\" => epilogue.chomp,\n      \"@@BASE@@\" => 119 + mod - 1,\n      \"@@MOD@@\" => mod,\n    })\n  end\nend\n\nclass Go < CodeGen\n  File = \"QR.go\"\n  Cmd = \"go run QR.go > OUTFILE\"\n  Apt = \"golang\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        package main;\n        import\"fmt\";\n        func main(){\n          fmt.Print#{E[PREV]};\n        }\n      )\n    END\n  end\nend\n\nclass Gnuplot < CodeGen\n  File = \"QR.plt\"\n  Cmd = \"gnuplot QR.plt > OUTFILE\"\n  Apt = \"gnuplot\"\n  Code = %q('set print\"-\";print'+E[PREV])\nend\n\nclass GEL < CodeGen\n  Name = \"GEL (Genius)\"\n  File = \"QR.gel\"\n  Cmd = \"genius QR.gel > OUTFILE\"\n  Apt = \"genius\"\n  Code = %q(f(PREV,61){\"printn#$S\\n\"})\nend\n\nclass GDB < CodeGen\n  File = \"QR.gdb\"\n  Cmd = \"gdb -q -x QR.gdb > OUTFILE\"\n  Apt = \"gdb\"\n  Code = %q(%(printf\"#{e[d[PREV,?%]]}\"\\nquit))\nend\n\nclass GAP < CodeGen\n  File = \"QR.g\"\n  Cmd = \"gap -q QR.g > OUTFILE\"\n  Apt = \"gap\"\n  Code = %q(\"s:=OutputTextUser();WriteAll(s,#{E[PREV]});CloseStream(s);QUIT;\")\nend\n\nclass Gambas < CodeGen\n  Name = \"Gambas script\"\n  File = \"QR.gbs\"\n  Cmd = \"$(GBS) QR.gbs > OUTFILE\"\n  Apt = [[\"gambas3-scripter\", \"gambas3-gb-pcre\"]]\n  Code = %q(%(print\"#{e[PREV]}\"))\nend\n\nclass Forth_FORTRAN77_Fortran90 < CodeGen\n  File = [\"QR.fs\", \"QR.f\", \"QR.f90\"]\n  Cmd = [\n    \"gforth QR.fs > OUTFILE\",\n    \"gfortran -o QR QR.f && ./QR > OUTFILE\",\n    \"gfortran -o QR QR.f90 && ./QR > OUTFILE\"\n  ]\n  Backup = [nil, \"QR.c\", nil]\n  Apt = [\"gforth\", \"f2c\", \"gfortran\"]\n  def code\n    # assuming that PREV has no '\n    <<-'END'.lines.map {|l| l.strip }.join(\" \")\n      %(\n        : A .\"#{g*9}\" ;\n        : B A .\" WRITE(*,*)'\" A ;\n        : C B TYPE .\" '\" CR ;\n        : D\n          S\" #$D\" C\n          S\\\\\" print \\\\\"(&\" C\n          S\\\\\" #{e[PREV]}\" DUP A .\" DO 10 I=1,\" . CR\n          S\" &A,&\" C\n          .\" 10      CONTINUE\" CR\n          S\\\\\" &A)\\\\\",&\" C\n          0 DO B .\" &char(\" COUNT . .\" ),&'\" CR LOOP\n          S\\\\\" &\\\\\"\\\\\"\" C\n          S\" end #$D\" C\n          A .\" STOP\" CR\n          A .\" END\" CR\n          BYE ;\n        D\n      )\n    END\n  end\nend\n\nclass Fish < CodeGen\n  File = \"QR.fish\"\n  Cmd = \"fish QR.fish > OUTFILE\"\n  Apt = \"fish\"\n  Code = %q(\"echo '#{Q[Q[PREV,B],?!].gsub(?',%('\"'\"'))}'\")\nend\n\nclass Flex < CodeGen\n  File = \"QR.fl\"\n  Cmd = \"flex -o QR.fl.c QR.fl && gcc -o QR QR.fl.c && ./QR > OUTFILE\"\n  Apt = \"flex\"\n  Code = %q(\"%option noyywrap\\n%%\\n%%\\nint main(){puts#{E[PREV]};}\")\nend\n\nclass FALSELang < CodeGen\n  Name = \"FALSE\"\n  File = \"QR.false\"\n  Cmd = \"ruby vendor/false.rb QR.false > OUTFILE\"\n  Apt = [nil]\n  Code = %q(?\"+PREV.gsub(?\"){'\"34,\"'}.gsub(N){'\"10,\"'}+?\")\nend\n\nclass FSharp < CodeGen\n  Name = \"F#\"\n  File = \"QR.fsx\"\n  fsproj = <<-END\n    <Project Sdk=\"Microsoft.NET.Sdk\">\n      <PropertyGroup>\n        <OutputType>Exe</OutputType>\n        <TargetFramework>net8.0</TargetFramework>\n        <EnableDefaultCompileItems>false</EnableDefaultCompileItems>\n      </PropertyGroup>\n      <ItemGroup>\n        <Compile Include=\"QR.fsx\" />\n      </ItemGroup>\n    </Project>\n  END\n  Cmd = %(echo '#{ fsproj.lines.map {|s| s.strip }.join }' > tmp.fsproj && DOTNET_NOLOGO=1 dotnet run --project tmp.fsproj > OUTFILE)\n  Apt = \"dotnet8\"\n  Code = %q('printfn(\"\"\"'+d[PREV,?%]+' \"\"\")')\nend\n\nclass Execline < CodeGen\n  File = \"QR.e\"\n  Cmd = \"execlineb QR.e > OUTFILE\"\n  Apt = \"execline\"\n  Code = %q(%(echo \"#{e[PREV]}\"))\nend\n\nclass Erlang < CodeGen\n  File = \"QR.erl\"\n  Cmd = \"escript QR.erl > OUTFILE\"\n  Apt = \"erlang\"\n  Code = %q(\"\\nmain(_)->\\nio:fwrite#{d[E[PREV],?~]}.\")\nend\n\nclass EmacsLisp < CodeGen\n  Name = \"Emacs Lisp\"\n  File = \"QR.el\"\n  Cmd = \"emacs -Q --script QR.el > OUTFILE\"\n  Apt = \"emacs-nox\"\n  Code = %q(%((princ \"#{e[PREV]}\")))\nend\n\nclass Elixir < CodeGen\n  File = \"QR.exs\"\n  Cmd = \"elixir QR.exs > OUTFILE\"\n  Apt = \"elixir\"\n  Code = %q(\"IO.puts\"+E[PREV])\nend\n\n#class Dhall < CodeGen\n#  Name = \"dhall\"\n#  File = \"QR.dhall\"\n#  Cmd = \"dhall text --file QR.dhall > OUTFILE\"\n#  Apt = \"dhall\"\n#  Code = %q(E[PREV])\n#end\n#\n#class Dc < CodeGen\n#  Name = \"dc\"\n#  File = \"QR.dc\"\n#  Cmd = \"dc QR.dc > OUTFILE || true\" # XXX\n#  Apt = \"dc\"\n#  Code = %q(\"[#{PREV}]pq\")\n#end\n\nclass Dc_Dhall < CodeGen\n  Name = [\"dc\", \"Dhall\"]\n  File = [\"QR.dc\", \"QR.dhall\"]\n  Cmd = [\n    \"dc QR.dc > OUTFILE || true\", # XXX\n    \"dhall text --file QR.dhall > OUTFILE\",\n  ]\n  Apt = [\"dc\", \"dhall\"]\n  Code = %q(\"['']p[#{PREV}]p['']pq\")\nend\n\nclass D < CodeGen\n  File = \"QR.d\"\n  Cmd = \"gdc -o QR QR.d && ./QR > OUTFILE\"\n  Apt = \"gdc\"\n  Code = %q(\"import std.stdio;void main(){write(`#{PREV}`);}\")\nend\n\n# pakcs package is broken in Ubuntu 20.10; I guess it will be fixed in Ubuntu 21.04\n# it was fixed since 21.04, but it is broken again in Ubuntu 22.04\n#class Curry < CodeGen\n#  Disabled = true\n#  File = \"QR.curry\"\n#  Cmd = \"pakcs --nocypm :load QR.curry :save :quit && ./QR > OUTFILE\"\n#  Apt = \"pakcs\"\n#  Code = %q(\"main=putStr\"+E[PREV])\n#end\n\nclass Crystal < CodeGen\n  Name = \"Crystal\"\n  File = \"QR.cr\"\n  Cmd = \"crystal QR.cr > OUTFILE\"\n  Apt = [[\"crystal\", \"libevent-dev\"]]\n  Code = %q(\"puts#{E[PREV]}\")\nend\n\nclass CommonLisp < CodeGen\n  Name = \"Common Lisp\"\n  File = \"QR.lisp\"\n  Cmd = \"clisp QR.lisp > OUTFILE\"\n  Apt = \"clisp\"\n  Code = %q(%((write-line\"#{e[PREV]}\")))\nend\n\nclass CoffeeScript < CodeGen\n  File = \"QR.coffee\"\n  Cmd = \"coffee --nodejs --stack_size=100000 QR.coffee > OUTFILE\"\n  Apt = \"coffeescript\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"\n        (f=(n)->Array(n+1).join '\\\\\\\\');\n        console.log('%s',#{V[E[PREV].gsub(?`,\"\\\\\\\\x60\"),'#{f(',')}']})\n      \"\n    END\n  end\nend\n\nclass Clojure_CMake_Cobol < CodeGen\n  File = [\"QR.clj\", \"QR.cmake\", \"QR.cob\"]\n  Cmd = [\n    \"clojure QR.clj > OUTFILE\",\n    \"cmake -P QR.cmake > OUTFILE\",\n    \"cobc -O2 -x QR.cob && ./QR > OUTFILE\",\n  ]\n  Apt = [\"clojure\", \"cmake\", \"gnucobol4\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        (doseq[s\n          (lazy-cat\n            [\"IDENTIFICATION DIVISION.\"\n             \"PROGRAM-ID. QR.\"\n             \"PROCEDURE DIVISION.\"\n             'DISPLAY]\n             (map #(str\n                  \"    \\\\\"\"\n                  (.replace %1\"\\\\\"\"\"\\\\\"\\\\\"\")\n                  \"\\\\\"\")\n               (re-seq #\".{1,45}\"\n                  \"#{e[PREV]}\"))\n             [\"    \\\\\" \\\\\".\"\n              \"STOP RUN.\"])]\n          (println(str\n            \"message(STATUS \\\\\"     \"\n            (.replace(.replace(str s)\"\\\\\\\\\"\"\\\\\\\\\\\\\\\\\")\"\\\\\"\"\"\\\\\\\\\\\\\"\")\n            \"\\\\\")\")))\n        )\n    END\n  end\nend\n\nclass CSharp_Chef < CodeGen\n  Name = [\"C#\", \"Chef\"]\n  File = [\"QR.cs\", \"QR.chef\"]\n  csproj = <<-END\n    <Project Sdk=\"Microsoft.NET.Sdk\">\n      <PropertyGroup>\n        <OutputType>Exe</OutputType>\n        <TargetFramework>net8.0</TargetFramework>\n        <EnableDefaultCompileItems>false</EnableDefaultCompileItems>\n      </PropertyGroup>\n      <ItemGroup>\n        <Compile Include=\"QR.cs\" />\n      </ItemGroup>\n    </Project>\n  END\n  Cmd = [\n    %(echo '#{ csproj.lines.map {|s| s.strip }.join }' > tmp.csproj && DOTNET_NOLOGO=1 dotnet run --project tmp.csproj > OUTFILE),\n    \"PERL5LIB=vendor/local/lib/perl5 compilechef QR.chef QR.chef.pl && perl QR.chef.pl > OUTFILE\"\n  ]\n  Apt = [\"dotnet8\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        class Program{\n          #$L void Main(){\n            #$C(\"Quine Relay Coffee.\\\\n\\\\nIngredients.\\\\n\");\n            for(int i=9;i++<126;)#$C($\"{i} g caffeine {i}\\\\n\");\n            #$C(\"\\\\nMethod.\\\\n\");\n            foreach(char c in#{E[PREV.reverse]})#$C($\"Put caffeine {(int)c} into#$F.\\\\n\");\n            #$C(\"Liquify#$G.\\\\nPour#$G into the baking dish.\\\\n\\\\nServes 1.\\\\n\");\n          }\n        }\n      )\n    END\n  end\nend\n\nclass Cplusplus < CodeGen\n  Name = \"C++\"\n  File = \"QR.cpp\"\n  Cmd = \"$(CXX) -o QR QR.cpp && ./QR > OUTFILE\"\n  Apt = \"g++\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"\n        #include<iostream>\\n\n        int main(){\n          std::cout<<#{E[PREV]};\n        }/****//****/\n      \"\n    END\n  end\nend\n\nclass C < CodeGen\n  File = \"QR.c\"\n  Cmd = \"$(CC) -o QR QR.c && ./QR > OUTFILE\"\n  Apt = \"gcc\"\n  def code\n    # LZ77-like compression\n    <<-'END'.lines.map {|l| l.strip.gsub(/^_+/) { \" \" * $&.size } }.join\n    (\n      s=PREV;\n      t={};b=\"\";L=\"\";n=i=0;D=->n{L<<(n+62)%92+35;D};\n      s.bytes{|c|\n        n>0?\n          n-=1:\n          (t[c]=(t[c]||[]).reject{|j|j<i-3560};\n           x=[];\n           t[c].map{|j|\n             k=(0..90).find{|k|not s[i+1+k]==s[j+k]}||91;\n             k>4&&x<<[k,j]\n           };\n           x=x.max)?\n          (\n            n,j=x;\n            x=b.size;(u=[x,3999].min;D[u%87][u/87];L<<b[0,u];b[0,u]=\"\";x-=u)while x>0;\n            x=4001+i-j;D[x%87][x/87][n-5]\n          ):b<<c;\n        t[c]+=[i+=1]\n      };\n      \"\n        #include<stdio.h>\\n\n        char*p=#{E[L]},s[999999],*q=s;\n        int main(){\n          int n,m;\n          for(;*p;){\n            n=(*p-5)%92+(p[1]-5)%92*87;\n            p+=2;\n            if(n>3999)\n              for(m=(*p++-5)%92+6;m--;q++)*q=q[4000-n];\n            else for(;n--;)*q++=*p++;\n          }\n          puts(s)#{R}\n        }\n      \"\n    )\n    END\n  end\nend\n\nclass BeanShell_Befunge_BLC8_Brainfuck < CodeGen\n  Name = [\"BeanShell\", \"Befunge\", \"BLC8\", \"Brainfuck\"]\n  File = [\"QR.bsh\", \"QR.bef\", \"QR.Blc\", \"QR.bf\"]\n  Cmd = [\n    \"bsh QR.bsh > OUTFILE\",\n    \"cfunge QR.bef > OUTFILE\",\n    \"ruby vendor/blc.rb < QR.Blc > OUTFILE\",\n    \"ruby vendor/bf.rb QR.bf > OUTFILE\",\n  ]\n  Apt = [\"bsh\", nil, nil, nil]\n  def code\n    blc = ::File.read(::File.join(__dir__, \"blc-boot.dat\"))\n    <<-'END'.lines.map {|l| l.strip }.join.sub(\"BLC\", [blc].pack(\"m0\"))\n      %(\n        f(s){System.out.print(s);}\n        s=\"389**6+44*6+00p45*,\";\n        for(c:#{E[PREV]}){\n          s+=\"00g,\";\n          for(m=1;m<256;m*=2)\n            s+=\"00g,4,:\"+(c/m%2>0?\"4+\":\"\")+\",\";\n          f(s);\n          s=\"4,:,\";\n        }\n        f(s+s);\n        for(c:Base64.getDecoder().decode(\"BLC\")){\n          c=c<0?256+c:c;\n          for(i=0;i++<3;c/=8)f(c%8);\n          f(\"8*+8*+,\");\n        }\n        f(\"@\");\n      )\n    END\n  end\nend\n\nclass Bash_Bc < CodeGen\n  Name = [\"bash\", \"bc\"]\n  File = [\"QR.bash\", \"QR.bc\"]\n  Cmd = [\n    \"bash QR.bash > OUTFILE\",\n    \"BC_LINE_LENGTH=4000000 bc -q QR.bc > OUTFILE\",\n  ]\n  Apt = [\"bash\", \"bc\"]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(echo '#{PREV.gsub(?',%('\"'\"'))}'|sed -e's/\\\\\\\\/\\\\\\\\\\\\\\\\/g' -e's/\"/\\\\\\\\q/g' -e's/.*/print \"&\"\\\\nquit/')\n    END\n  end\nend\n\nclass Awk < CodeGen\n  Name = \"Awk\"\n  File = \"QR.awk\"\n  Cmd = \"awk -f QR.awk > OUTFILE\"\n  Apt = \"gawk\"\n  Code = %q(\"BEGIN{print#{E[PREV]}}\")\nend\n\nclass ATS < CodeGen\n  File = \"QR.dats\"\n  Cmd = \"patscc -o QR QR.dats && ./QR > OUTFILE\"\n  Apt = \"ats2-lang\"\n  Code = %q(\"implement main0()=print\"+E[PREV])\nend\n\nclass Asymptote < CodeGen\n  File = \"QR.asy\"\n  Cmd = \"asy QR.asy > OUTFILE\"\n  Apt = \"asymptote\"\n  Code = %q(\"write('#{Q[e[PREV],?']}');\")\nend\n\nclass AspectJ < CodeGen\n  File = \"QR.aj\"\n  Cmd = \"ajc QR.aj && java QR > OUTFILE\"\n  Apt = \"aspectj\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        class QR{\n          #$L void main(String[]a){\n            a=#{E[PREV.gsub(/\\\\+/){\"^#{$&.size}^\"}]}.split(\"\\\\\\\\^\");\n            for(int i=1;i<a.length;a[0]+=a[i+1],i+=2){\n              a[0]+=\"\\\\\\\\\".repeat(Integer.parseInt(a[i]));\n            }\n            System.out.print(a[0]);\n          }\n        }\n      )\n    END\n  end\nend\n\nclass ALGOL68_Ante < CodeGen\n  Name = [\"ALGOL 68\", \"Ante\"]\n  File = [\"QR.a68\", \"QR.ante\"]\n  Cmd = [\n    \"a68g QR.a68 > OUTFILE\",\n    \"ruby vendor/ante.rb QR.ante > OUTFILE\",\n  ]\n  Apt = [\"algol68g\", nil]\n  def code\n    <<-'end'.lines.map {|l| l.strip }.join\n      %W[\n        STRINGz:= 226+ 153,a:=z+ 166,b:=a+\"2\"+z+ 160,c:=b+\"8\"+z+ 165,t:=\"#{d[PREV]}\";\n        FORiTO\\ UPBtDO\\ INTn:=ABSt[i];\n          print( (50+n%64)+c+ (50+n%8MOD8)+c+ (50+nMOD8)+b+\"J\"+a)\n        OD\n      ]*\"REPR\"\n    end\n  end\nend\n\nclass AFNIX_Aheui < CodeGen\n  File = [\"QR.als\", \"QR.aheui\"]\n  Cmd = [\"LANG=C LD_LIBRARY_PATH=/usr/lib/afnix axi QR.als > OUTFILE\", \"ruby vendor/aheui.rb QR.aheui > OUTFILE\"]\n  Apt = [\"afnix\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        trans B(Buffer)\\n\n        trans O(n){\\n\n          B:add(Byte(+ 128 n))\n        }\\n\n        trans f(v n){\\n\n          O(+(/ n 64)107)\\n\n          O(n:mod 64)\\n\n          O v\n        }\\n\n        trans D(n){\n          if(< n 4){\n            f(+(* 6 n)9)48\n          }{\n            if(n:odd-p){\n              D(- n 3)\\n\n              f 27 48\\n\n              f 36 11\n            }{\n              D(/ n 2)\\n\n              f 21 48\\n\n              f 48 20\n            }\n          }\n        }\\n\n        trans S(Buffer\"#{e[PREV]}\")\\n\n        while(!=(S:length)0){\\n\n          trans c(S:read)\\n\n          D(c:to-integer)\\n\n          f 35 39\n        }\\n\n        f 24 149\\n\n        interp:library\"afnix-sio\"\\n\n        trans o(afnix:sio:OutputTerm)\\n\n        o:write B\n      )\n    END\n  end\nend\n\nclass Ada < CodeGen\n  File = \"qr.adb\"\n  Cmd = \"gnatmake qr.adb && ./qr > OUTFILE\"\n  Apt = \"gnat\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join.gsub(\"$$$\", \" \")\n      %(\n        with Ada.Text_Io;\n        procedure qr is$$$\n        begin$$$\n          Ada.Text_Io.Put(\"#{d[PREV].gsub(N,'\"&Character'+?'+'Val(10)&\"')}\");\n        end;\n      )\n    END\n    #<<-'END'.lines.map {|l| l.strip }.join.gsub(\"$$$\", \" \")\n    #  %(\n    #    with Ada.Text_Io;\n    #    procedure qr is$$$\n    #    begin$$$\n    #      #{f(PREV,120){\n    #        %(Ada.Text_Io.Put(\"#{d[$s].gsub(N,'\"&Character'+?'+'Val(10)&\"')}\");\\n)\n    #      }}\n    #      Ada.Text_Io.Put_Line(\"\");\n    #    end;\n    #  )\n    #END\n  end\nend\n\nclass Aplus < CodeGen\n  Name = \"A+\"\n  File = \"QR.+\"\n  Cmd = \"a+ QR.+ > OUTFILE\"\n  Apt = \"aplus-fsf\"\n  Code = %q(E[PREV]+\"\\nsys.exit 0\")\nend\n\nclass Zsh < CodeGen\n  Name = \"zsh\"\n  File = \"QR.zsh\"\n  Cmd = \"zsh QR.zsh > OUTFILE\"\n  Apt = \"zsh\"\n  Code = %q(\"echo -E $'#{Q[Q[PREV,B],?']}'\")\nend\n\nclass Zoem < CodeGen\n  File = \"QR.azm\"\n  Cmd = \"zoem -i QR.azm > OUTFILE\"\n  Apt = \"zoem\"\n  Code = %q(\"\\\\\\\\write{-}{txt}{#{Q[PREV,/[\\\\\\\\{}]/]}}\")\nend\n\nclass Yorick < CodeGen\n  File = \"QR.yorick\"\n  Cmd = \"yorick -batch QR.yorick > OUTFILE\"\n  Apt = \"yorick\"\n  Code = %q(%(write,format=\"#{y=\"\";f(PREV,35){y<<\",\\\\n\"+$S;\"%s\"}}\")+y)\nend\n\nclass Yabasic < CodeGen\n  File = \"QR.yab\"\n  Cmd = \"yabasic QR.yab > OUTFILE\"\n  Apt = \"yabasic\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        sub f(s$,n)\n          print(s$);:\n          for i=1to n print(\"\\\\\\\\\");:\n          next:\n        end sub:\n        f(\"#{V[e[PREV],'\",','):f(\"']}\",0)\n      )\n    END\n  end\nend\n\nclass XSLT < CodeGen\n  File = \"QR.xslt\"\n  Cmd = \"xsltproc QR.xslt > OUTFILE\"\n  Apt = \"xsltproc\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join.gsub(\"$$$\", \"\\n\")\n      \"\n        <?xml#{O=\" version='1.0'\"}?>$$$\n        <?xml-#{I=\"stylesheet\"} type='text/xsl'href='QR.xslt'?>$$$\n        <xsl:#{I+O} xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n          <xsl:output method='text'/>\n          <#{U=\"xsl:template\"} match='/'>\n            <![CDATA[#{PREV}]]>\n          </#{U}>\n        </xsl:#{I}>\n      \"\n    END\n  end\nend\n\nclass VisualBasic_WebAssemblyBinary_WebAssemblyText_Whitespace < CodeGen\n  Name = [\"Visual Basic\", \"WebAssembly (Binary format)\", \"WebAssembly (Text format)\", \"Whitespace\"]\n  File = [\"QR.vb\", \"QR.wasm\", \"QR.wat\", \"QR.ws\"]\n  vbproj = <<-END\n    <Project Sdk=\"Microsoft.NET.Sdk\">\n      <PropertyGroup>\n        <OutputType>Exe</OutputType>\n        <TargetFramework>net8.0</TargetFramework>\n        <EnableDefaultCompileItems>false</EnableDefaultCompileItems>\n      </PropertyGroup>\n      <ItemGroup>\n        <Compile Include=\"QR.vb\" />\n      </ItemGroup>\n    </Project>\n  END\n  Cmd = [\n    %(echo '#{ vbproj.lines.map {|s| s.strip }.join }' > tmp.vbproj && DOTNET_NOLOGO=1 dotnet run --project tmp.vbproj > OUTFILE),\n    \"$(WASI_RUNTIME) QR.wasm > OUTFILE\",\n    \"wat2wasm QR.wat -o QR.wat.wasm && $(WASI_RUNTIME) QR.wat.wasm > OUTFILE\",\n    \"ruby vendor/whitespace.rb QR.ws > OUTFILE\"\n  ]\n  Apt = [\"dotnet8\", \"wabt\", \"wabt\", nil]\n  def code\n    r = <<-'END'.lines.map {|l| l.strip }.join(?:)\n      %(Module QR\\nSub Main()\\nDim c,n:Dim s As Object=#{C[0]}.OpenStandardOutput():Dim t()As Short={@@TBL@@}\n          For Each d in\"@@DATA1@@}@@DATA2@@~@@DATA3@@$@@DATA4@@\"\n            c=Asc(d)\n            If c=36\n              For c=0To 11\n                #$W(If(c Mod 3,Asc(#{s=PREV;s.size*16+3}.ToString(\"x8\")(1Xor 7-c*2\\\\3)),92))\n              Next\n            Else\n              n=(c>124)*(@@CONST1@@*c-#{s.size+@@CONST2@@})\n              Do While n>127\n                #$W(128+(127And n))\n                n\\\\=128\n              Loop\n              #$W(If(c<125,If((c-1)\\\\7-8,c+66*(c>65And c<91),t(c-57)),n))\n            End If\n          Next\n          For Each c in\"#{d[s].gsub N,'\"& VbLf &\"'}\"\n            #$W(Asc(c))\n          Next\n        End Sub\n      End Module)\n    END\n    tbl, data1, data2, data3, data4 = ::File.read(::File.join(__dir__, \"wasm-tmpl.dat\")).lines.map {|s| s.chomp }\n    raise unless data3[0] == '('\n    r.gsub(/@@\\w+@@/, {\n      \"@@TBL@@\" => tbl,\n      \"@@DATA1@@\" => data1.gsub(\"\\\\\"){\"\\\\\\\\\"},\n      \"@@DATA2@@\" => data2.gsub(\"\\\\\"){\"\\\\\\\\\"},\n      \"@@DATA3@@\" => '#{40.chr}'+data3[1..].gsub(\"\\\\\"){\"\\\\\\\\\"},\n      \"@@DATA4@@\" => data4.gsub(\"\\\\\"){\"\\\\\\\\\"},\n\n      # precompute some expressions by assuming that 2**14 <= (292+s.size) < 2**21\n    # \"@@CONST1@@\" => '#{6+((292+s.size).bit_length-1)/7}',\n      \"@@CONST1@@\" => \"8\",\n    # \"@@CONST2@@\" => '292+125*6+126*(((292+s.size).bit_length-1)/7)',\n      \"@@CONST2@@\" => \"1294\"\n    })\n  end\nend\n\nclass VimScript < CodeGen\n  Name = [\"Vimscript\"]\n  Apt = \"vim\"\n  File = \"QR.vim\"\n  Cmd = \"vim -EsS QR.vim > OUTFILE\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      (PREV).lines.map{|s|\"let s=#{E[s]}\\nput=s\\nprint\\n\"}.join+\"qa!\"\n    END\n  end\nend\n\nclass Verilog < CodeGen\n  File = \"QR.v\"\n  Cmd = \"iverilog -o QR QR.v && ./QR -vcd-none > OUTFILE\"\n  Apt = \"iverilog\"\n  Code = %q(%(module QR;initial begin #{f(PREV,3){%($write(\"%s\",#$S);)+N}}end endmodule))\nend\n\nclass Vala_Velato < CodeGen\n  File = [\"QR.vala\", \"QR.mid\"]\n  Cmd = [\n    \"valac QR.vala && ./QR > OUTFILE\",\n    \"mono vendor/local/bin/Vlt.exe /s QR.mid && mono QR.exe > OUTFILE\",\n  ]\n  Apt = [\"valac\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        void p(int[]c){\n          foreach(int v in c)\n            stdout.printf(\"%c%c\",v/256,v%256);\n        }\n        void main(){\n          int[]a;\n          p({19796,26724,0,6,0,1,480,19796,29291,#{s=PREV;W=s.size*72+4;\"%d,%d\"%[W/65536,W%65536]}});\n          foreach(int c in#{E[s]}.data)\n            foreach(int v in a={0,9,7,4,5,c/100*7/6+1,c%100/10*7/6+1,c%10*7/6+1,7})\n              p({144,v=15450+v*256,384,v});\n          p({255,12032});\n        }\n      )\n    END\n  end\nend\n\nclass TypeScript_Unlambda < CodeGen\n  File = [\"QR.ts\", \"QR.unl\"]\n  Cmd = [\"tsc --outFile QR.ts.js QR.ts && $(JAVASCRIPT) QR.ts.js > OUTFILE\", \"ruby vendor/unlambda.rb QR.unl > OUTFILE\"]\n  Apt = [\"node-typescript\", nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"let s=#{E[PREV]},i=0,t='k';while(s[i])t='\\\\x60.'+s[i++]+t;console.log(t)\"\n    END\n  end\nend\n\nclass Tcsh_Thue < CodeGen\n  Name = [\"tcsh\", \"Thue\"]\n  File = [\"QR.tcsh\", \"QR.t\"]\n  Cmd = [\"tcsh QR.tcsh > OUTFILE\", \"ruby vendor/thue.rb QR.t > OUTFILE\"]\n  Apt = [\"tcsh\", nil]\n  Code = %q(%(echo 'a::=~#{Q[Q[PREV,B],?!].gsub(?',%('\"'\"'))}'\"\\\\\\\\n::=\\\\\\\\na\"))\nend\n\nclass Tcl < CodeGen\n  File = \"QR.tcl\"\n  Cmd = \"tclsh QR.tcl > OUTFILE\"\n  Apt = \"tcl\"\n  Code = %q(%(puts \"#{Q[e[PREV],/[\\[\\]$]/]}\"))\nend\n\nclass Swift < CodeGen\n  File = \"QR.swift\"\n  Cmd = \"swiftc QR.swift && ./QR > OUTFILE\"\n  Apt = \"swiftlang\"\n  Code = %q(\"print#{E[PREV]}\")\nend\n\nclass SurgeScript < CodeGen\n  File = \"QR.ss\"\n  Cmd = \"surgescript QR.ss > OUTFILE\"\n  Apt = \"surgescript\"\n  def code\n    <<-'END'\n      %(object\"Application\"{state\"main\"{foreach(s in[#{f(PREV,4){$S+?,}}])Console.write(s);Application.exit();}})\n    END\n  end\nend\n\nclass StandardML_Subleq < CodeGen\n  Name = [\"Standard ML\", \"Subleq\"]\n  File = [\"QR.sml\", \"QR.sq\"]\n  Cmd = [\"polyc -o QR QR.sml && ./QR > OUTFILE\", \"ruby vendor/subleq.rb QR.sq > OUTFILE\"]\n  Apt = [[\"polyml\", \"libpolyml-dev\"], nil]\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        fun p n=print(Int.toString n^\" \");\n        fun main()=(\n          p 0;p 0;p 130;\n          List.tabulate(127,p);\n          String.map(fn c=>(p(3+ord c);print\"-1 0 \";c))#{E[PREV]};\n          print\"0 0 -1\"\n        );\n      )\n    END\n  end\nend\n\nclass Squirrel < CodeGen\n  File = \"QR.nut\"\n  Cmd = \"squirrel QR.nut > OUTFILE\"\n  Apt = \"squirrel3\"\n  Code = %q(\"print\"+E[PREV])\nend\n\nclass Scilab_Sed_Shakespeare_SLang < CodeGen\n  Name = [\"Scilab\", \"sed\", \"Shakespeare\", \"S-Lang\"]\n  File = [\"QR.sci\", \"QR.sed\", \"QR.spl\", \"QR.sl\"]\n  Cmd = [\n    \"scilab-cli -nb -f QR.sci > OUTFILE\",\n    \"sed -E -f QR.sed QR.sed > OUTFILE\",\n    \"spl2c < QR.spl > QR.spl.c && gcc -z muldefs -o QR -I ./vendor/local/include -L ./vendor/local/lib QR.spl.c -lspl -lm && ./QR > OUTFILE\",\n    \"slsh QR.sl > OUTFILE\",\n  ]\n  Apt = [\"scilab-cli\", \"sed\", nil, \"slsh\"]\n  def code\n    # NOTE: This code does not work for a short or simple text.\n    # This assumes the input is so complex enough that\n    # the compressed result won't be one character.\n    #\n    # * The Scheme program generates the encoded Shakespeare code.\n    # * sed program decodes and completes Shakespeare code.\n    # * The S-Lang program includes 8-bit characters and decompress the compression.\n    <<-'END'.lines.map {|l| l.strip }.join\n      %(\n        printf(\"\n          1d;\n          s/.//;\n          s/1/ the sum of a son and0/g;\n          s/0/ twice/g;\n          s/2/You are as bad as/g;\n          s/3/ a son!Speak your mind!/g\\\\n\n          #The Relay of Quine.\\\\n\n          #Ajax, a man.\\\\n\n          #Ford, a man.\\\\n\n          #Act i: Quine.\\\\n\n          #Scene i: Relay.\\\\n\n          #[Enter Ajax and Ford]\\\\n\n          #Ajax:\\\\n\n          #\");\n        function[]=f(s);\n          for i=1:2:length(s),\n            printf(\"2%s3\",part(dec2bin(hex2dec(part(s,i:i+1))),$:-1:2)),\n          end;\n        endfunction\\n\n        #{\n          s,v=rp[PREV,127..255];\n          f(\n            %(\n              variable s=`#{s.gsub(/.{1,234}/){$&.gsub(\"`\",%(`+\"`\"+`))+\"`+\\n`\"}}`,i;\n              for(i=0;i<129;i++)\n                s=strreplace(\n                  s,\n                  pack(\"C\",255-i),\n                  substrbytes(`#{v[0,99]}`+\\n`#{v[99..-1]}`,i*2+1,2));\n              printf(\"%s\",s)\n            ),7\n          ){\n            \"f('%s')\\n\"%$s.unpack(\"H*\")\n          }\n        }\n        printf(\"\\\\n#[Exeunt]\");\n        quit\n      )\n    END\n  end\nend\n\nclass Scheme < CodeGen\n  File = \"QR.scm\"\n  Cmd = \"$(SCHEME) QR.scm > OUTFILE\"\n  Apt = \"guile-3.0\"\n  Code = %q(%((display \"#{e[PREV]}\")))\nend\n\nclass Scala < CodeGen\n  File = \"QR.scala\"\n  Cmd = \"scalac QR.scala && scala QR > OUTFILE\"\n  Apt = \"scala\"\n  def code\n    <<-'END'.lines.map {|l| l.strip }.join\n      \"\n        object QR extends App{\n          #{f(PREV,196){%(print#$S;)}}\n        }\n      \"\n    END\n  end\nend\n\nclass Rust < CodeGen\n  File = \"QR.rs\"\n  Cmd = \"rustc QR.rs && ./QR > OUTFILE\"\n  Apt = \"rustc\"\n  Code = %q(%(fn main(){print!(\"{}\",#{E[PREV]});}))\nend\n\nclass Ruby_ < CodeGen\n  Name = \"Ruby\"\n  File = \"QR.rb\"\n  Cmd = \"ruby QR.rb > OUTFILE\"\n  Apt = \"ruby\"\n  Code = nil\nend\n\nload \"code-gen-pool.rb\" if ENV[\"ALL\"]\n\nGenSteps = CodeGen::List.map {|s| s.gen_step }\nRunSteps = CodeGen::List.reverse.flat_map {|s| s.run_steps }\n"
  },
  {
    "path": "src/dot.github.workflows.main.yml.gen.rb",
    "content": "require \"yaml\"\nrequire_relative \"code-gen\"\n\napts = RunSteps.flat_map {|s| s.apt }\napts = apts.flatten.map {|apt| apt }.compact\napts.delete(\"ruby2.1\")\n\nsrcs = RunSteps.flat_map {|s| s.src }\n\ncp_cmds = srcs.map do |s|\n  \"          sudo docker cp qr:/usr/local/share/quine-relay/#{ s } spoiler/\"\nend.join(\"\\n\")\n\nFile.write(File.join(__dir__, \"../.github/workflows/main.yml\"), <<END)\nname: CI\non:\n  - push\n  - pull_request\n  - workflow_dispatch\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n      - name: docker build\n        run: |\n          sudo docker build -t quine-relay .\n      - name: docker run\n        run: |\n          sudo docker run --privileged --name qr -e CI=true -t quine-relay\n      - name: push spoiler\n        run: |\n          git clone https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git spoiler --branch spoiler\n          git -C spoiler rm --quiet -r '*'\n#{ cp_cmds }\n          cd spoiler\n          git add .\n          GIT_AUTHOR_NAME=\"$(git show -s --format=%an \"$GITHUB_SHA\")\" \\\\\n          GIT_AUTHOR_EMAIL=\"$(git show -s --format=%ae \"$GITHUB_SHA\")\" \\\\\n          GIT_AUTHOR_DATE=\"$(git show -s --format=%ad \"$GITHUB_SHA\")\" \\\\\n          GIT_COMMITTER_NAME='GitHub Actions' \\\\\n          GIT_COMMITTER_EMAIL='actions@github.com' \\\\\n          TZ=UTC \\\\\n          git commit --allow-empty -m \"spoiler: $(git show -s --format=%s \"$GITHUB_SHA\")\"\n          git push --quiet origin spoiler\n          echo The intermediate sources are available: https://github.com/${GITHUB_REPOSITORY}/tree/spoiler\n        if: github.event_name == 'push' && github.ref == 'refs/heads/master'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\nEND\n"
  },
  {
    "path": "src/grass-boot.dat.gen.rb",
    "content": "class Sym\n  def initialize(name = \"<gen:%016x>\" % self.object_id)\n    @name = name.to_s\n  end\n\n  def inspect\n    @name\n  end\n\n  def [](*others)\n    prev = self\n    others.each do |other|\n      sym = Sym.new\n      $prog << [:app, sym, prev, other]\n      prev = sym\n    end\n    prev\n  end\nend\n\nw = Sym.new(:W)\nsucc = Sym.new(:Succ)\nout = Sym.new(:Out)\n\ndef fn(name, &blk)\n  params = blk.parameters.map {|_, param_name| Sym.new(param_name) }\n  sym = Sym.new(name)\n  $prog << [:abs, sym, params]\n  blk[*params]\n  $prog << [:ret]\n  sym\nend\n\n$result = []\n[10, 32].each do |smallest_char|\n  $prog = []\n\n  succ2 = fn(:succ2) {|n| succ[succ[n]] }\n  succ4 = fn(:succ4) {|n| succ2[succ2[n]] }\n  succ8 = fn(:succ8) {|n| succ4[succ4[n]] }\n  succ16 = fn(:succ16) {|n| succ8[succ8[n]] }\n  succ32 = fn(:succ32) {|n| succ16[succ16[n]] }\n  succ64 = fn(:succ64) {|n| succ32[succ32[n]] }\n  succ128 = fn(:succ128) {|n| succ64[succ64[n]] }\n\n  add_num = ->(n, v) do\n    ary = [succ128, succ64, succ32, succ16, succ8, succ4, succ2, succ]\n    until v == 0\n      f = ary.pop\n      n = f[n] if v % 2 == 1\n      v /= 2\n    end\n    n\n  end\n\n  next_char = fn(:next_char) do |n|\n    sc = add_num[n, 129 + smallest_char]\n    # n == 127 ? c10 : succ[n]\n    add_num[w, 8][n, sc, add_num[n, 1]]\n  end\n\n  sub = fn(:sub) do |magic, n, _, m|\n    out[n]\n    magic[magic, next_char[m]]\n  end\n\n  # http://d.hatena.ne.jp/kikx/20080914\n  app23 = fn(:app23) {|x, y| y }\n  magic = fn(:magic) {|magic_, n, g| g[app23, sub[magic_], n] }\n\n  #main = fn(:main) do |n120,n121,n122,n123,n124,n125,n126,n127,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n33,n34,n35,n36,n37,n38,n39,n40,n41,n42,n43,n44,n45,n46,n47,n48,n49,n50,n51,n52,n53,n54,n55,n56,n57,n58,n59,n60,n61,n62,n63,n64,n65,n66,n67,n68,n69,n70,n71,n72,n73,n74,n75,n76,n77,n78,n79,n80,n81,n82,n83,n84,n85,n86,n87,n88,n89,n90,n91,n92,n93,n94,n95,n96,n97,n98,n99,n100,n101,n102,n103,n104,n105,n106,n107,n108,n109,n110,n111,n112,n113,n114,n115,n116,n117,n118,n119|\n  #  $prog << [:raw, \"!\"]\n  #  n120 = n119[n33]\n  #  n121 = n120[n33]\n  #  n122 = n121[n33]\n  #  n123 = n122[n33]\n  #  n124 = n123[n33]\n  #  n125 = n124[n33]\n  #  n126 = n125[n33]\n  #end\n  main = Sym.new(:main)\n  $prog << [:abs, main, (smallest_char..127).map { Sym.new }]\n  $prog << [:raw, \"!\"]\n  $prog << [:ret]\n\n  start = fn(:start) do |start_, main_, n|\n    m = main_[magic[magic, n]]\n    w[n, start_, start_[start_, m]][next_char[n]]\n  end\n\n  fn(:kick) {|_kick| start[start, main, next_char[w]] }\n\n  stacks = []\n  stack = [out, succ, w]\n  a = []\n  $prog[0..-2].each do |type, *args|\n    case type\n    when :abs\n      new_sym, params = args\n      a << \"w\" * params.size\n      stacks << ([new_sym] + stack)\n      stack = params.reverse + stack\n    when :app\n      new_sym, sym0, sym1 = args\n      a << \"  \" + \"W\" * (stack.index(sym0) + 1) + \"w\" * (stack.index(sym1) + 1)\n      stack.unshift(new_sym)\n    when :ret\n      stack = stacks.pop\n      a << \"v\"\n    when :raw\n      a << args.first\n    end\n  end\n\n  prologue, epilogue = a.join.split.join.split(\"!\")\n  def dump(s)\n    aa = [*\"0\"..\"Z\"]\n    a = \"\"\n    s.scan(/(v|W*)(w{1,#{aa.size-1}})/) do |s1, s2|\n      a << (s1 == \"v\" ? \"/\" : aa[s1.size]) << aa[s2.size]\n    end\n    \"#{ a.dump }\"\n  end\n  epilogue = dump(epilogue)\n  prologue = dump(prologue)\n  $result << 128 - smallest_char\n  $result << prologue\n  $result << epilogue\nend\n\nopen(\"grass-boot.dat\", \"w\") do |f|\n  $result.each do |e|\n    f.puts e\n  end\nend\n"
  },
  {
    "path": "src/langs.png.gen.rb",
    "content": "require_relative \"code-gen\"\nrequire \"cairo\"\nrequire \"rsvg2\"\n\n# You need to install the two fonts: Raleway and UnifrakturCook.\n# * https://www.google.com/fonts/specimen/Raleway\n# * https://www.google.com/fonts/specimen/UnifrakturCook\n\n%w(Raleway UnifrakturCook).each do |font|\n  if `fc-list #{ font }`.strip.empty? && !ENV[\"SKIP_FONT_CHECK\"]\n    raise \"Font `#{ font }' is not available; to skip this check, set SKIP_FONT_CHECK=1\"\n  end\nend\n\nW = H = 750\nsurface = Cairo::ImageSurface.new(W, H)\nctx = Cairo::Context.new(surface)\n\nctx.line_width = 1\nctx.set_source_rgb(1, 1, 1)\nctx.rectangle(0, 0, W, H)\nctx.fill\nctx.set_source_rgb(0, 0, 0)\n\nctx.translate(W / 2, H / 2)\nctx.select_font_face(\"Raleway\")\nctx.antialias = Cairo::Antialias::GRAY\n\nBaseFontSize = 13\nSubFontSize = 10\n\nRadius = 210.0\nRunSteps.each_with_index do |s, i|\n  ctx.save do\n    angle = i / (RunSteps.size / 4.0)\n    dir = 1 < angle && angle <= 3 ? 1 : -1\n    ctx.rotate(Math::PI / 2 * (dir < 0 ? -angle : 2 - angle + 0.02))\n    s.name =~ /^(.*?)(\\(.*\\))?$/\n    name, sub_name = $1, $2 || \"\"\n    ctx.font_size = BaseFontSize; e1 = ctx.text_extents(name)\n    ctx.font_size = SubFontSize ; e2 = ctx.text_extents(sub_name)\n    ctx.move_to(dir * (Radius + 10) - (dir < 0 ? e1.x_advance + e2.x_advance : 0), 0)\n    ctx.font_size = BaseFontSize; ctx.show_text(name)\n    ctx.font_size = SubFontSize ; ctx.show_text(sub_name)\n  end\nend\n\nArrowCount = 7\nArrowCount.times do |i|\n  ctx.save do\n    ctx.rotate(Math::PI * (2 * i) / ArrowCount - Math::PI + 0.1)\n\n    ctx.line_width = 2\n    ctx.line_cap = Cairo::LineCap::SQUARE\n    ctx.new_path\n    ctx.arc(0, 0, Radius, 0.0, Math::PI * 2 / ArrowCount - 0.1)\n    ctx.stroke\n\n    ctx.line_width = 1\n    ctx.move_to(Radius    , -8)\n    ctx.line_to(Radius - 6,  2)\n    ctx.line_to(Radius + 6,  2)\n    ctx.fill\n  end\nend\n\nUroboros = 350.0\nctx.select_font_face(\"UnifrakturCook\")\nctx.font_size = 25\nTitle = \"#{ RunSteps.size }-Language Uroboros Quine\"\ne = ctx.text_extents(Title)\nheight = Uroboros / 2 + e.height + 20\nctx.move_to(-e.width / 2, height / 2)\nctx.show_text(Title)\nctx.save do\n  svg = RSVG::Handle.new_from_file(\"uroboros.svg\")\n  ctx.translate(-Uroboros / 2, -height / 2)\n  ctx.scale(Uroboros / svg.width, Uroboros / svg.width)\n  ctx.render_rsvg_handle(svg)\nend\n\nsurface.write_to_png(\"../langs.png\")\nunless ENV[\"NO_PNG_OPT\"]\n  system 'optipng -fix -i0 -o7 -strip all ../langs.png'\n  system 'advdef -z4 ../langs.png'\n  system 'advpng -z4 ../langs.png'\nend\n\n# convert svg to template\n#\n#require \"cairo\"\n#require \"rsvg2\"\n#H = 52.0\n#W = H * 4\n#surface = Cairo::ImageSurface.new(W, H)\n#ctx = Cairo::Context.new(surface)\n#svg = RSVG::Handle.new_from_file(\"uroboros2.svg\")\n#ctx.translate(4, 2)\n#ctx.rotate(-0.014)\n#ctx.scale((W - 8) / svg.width, (H - 4) / svg.height)\n#ctx.render_rsvg_handle(svg)\n#data = surface.data.unpack(\"C*\")\n#M = (0...H).map do |y|\n#  (0...W).map do |x|\n#    idx = y * surface.stride + x * 4\n#    data[idx] < 40 && data[idx + 3] > 48 ? \" \" : \"#\"\n#  end.join\n#end\n#puts *M\n"
  },
  {
    "path": "src/lazyk-boot.dat.gen.rb",
    "content": "Var = Struct.new(:name)\nAbs = Struct.new(:var, :exp)\nApp = Struct.new(:exp1, :exp2)\nComb = Struct.new(:type)\nS, K, I = Comb[:S], Comb[:K], Comb[:I]\n\nclass Var\n  def fvs\n    { name => 1 }\n  end\n  def remove_abs\n    self\n  end\n  def remove_var(n)\n    if n == name\n      I\n    else\n      App[K, self]\n    end\n  end\n  def inspect(need_paren = true)\n    name.to_s\n  end\nend\n\nclass Abs\n  def fvs\n    @fvs ||= (\n      s = exp.fvs.dup\n      s.delete(var)\n      s\n    )\n  end\n  def remove_abs\n    exp.remove_abs.remove_var(var)\n  end\n  def remove_var(v)\n    if exp.fvs[v]\n      exp.remove_abs.remove_var(v)\n    else\n      App[K, self]\n    end\n  end\n  def inspect(need_paren = true)\n    vs, e = [var], exp\n    while e.is_a?(Abs)\n      vs << e.var\n      e = e.exp\n    end\n    \"(\\\\#{ vs * \" \" }. #{ e.inspect(false) })\"\n  end\nend\nclass App\n  def fvs\n    @fvs ||= (\n      s = exp1.fvs.dup\n      exp2.fvs.each do |v, n|\n        s[v] ||= 0\n        s[v] += n\n      end\n      s\n    )\n  end\n  def remove_abs\n    App[exp1.remove_abs, exp2.remove_abs]\n  end\n  def remove_var(v)\n    if fvs[v]\n      if exp2.is_a?(Var) && exp2.name == v && !exp1.fvs[v]\n        exp1\n      else\n        App[App[S, exp1.remove_var(v)], exp2.remove_var(v)]\n      end\n    else\n      App[K, self]\n    end\n  end\n  def inspect(need_paren = true)\n    s = \"%s %s\" % [exp1.inspect(false), exp2.inspect(true)]\n    s = \"(#{ s })\" if need_paren\n    s\n  end\n  def to_unlambda\n    \"`\" + exp1.to_unlambda + exp2.to_unlambda\n  end\n  def simplify\n    if exp1 == I\n      exp2.simplify # I x -> x\n    elsif exp1.is_a?(App)\n      if exp1.exp1 == K\n        exp1.simplify # K x y -> x\n      elsif exp1.exp1.is_a?(App) && exp1.exp1.exp1 == S\n        if exp1.exp1.exp2.is_a?(App) && exp1.exp1.exp2.exp1 == K\n          App[exp1.exp1.exp2.exp2, App[exp1.exp2, exp2]].simplify # S (K x) y z -> x (y z)\n        elsif exp1.exp2.is_a?(App) && exp1.exp2.exp1 == K\n          App[App[exp1.exp1.exp2, exp2], exp1.exp2.exp2].simplify # S x (K y) z -> x z y\n        else\n          App[exp1.simplify, exp2.simplify]\n        end\n      else\n        App[exp1.simplify, exp2.simplify]\n      end\n    else\n      App[exp1.simplify, exp2.simplify]\n    end\n  end\nend\n\nclass Comb\n  def fvs\n    {}\n  end\n  def remove_abs\n    self\n  end\n  def remove_var(v)\n    App[K, self]\n  end\n  def inspect(need_paren = true)\n    type.to_s\n  end\n  def to_unlambda\n    type.to_s.downcase\n  end\n  def simplify\n    self\n  end\nend\n\ndef ary2app(exp)\n  if exp.is_a?(Array)\n    exp = exp.map {|e| ary2app(e) }\n    e1 = App[*exp.shift(2)]\n    exp.each {|e2| e1 = App[e1, e2] }\n    e1\n  elsif exp.is_a?(Abs)\n    Abs[exp.var, ary2app(exp.exp)]\n  else\n    exp\n  end\nend\n\ndef to_unlambda(exp)\n  ary2app(exp).remove_abs.simplify.to_unlambda\nend\n\ndef abs(&b)\n  vars = b.parameters.map {|type, name| name }\n  exp = yield(*vars.map {|name| Var[name] })\n  vars.reverse_each {|v| exp = Abs[v, exp] }\n  exp\nend\n\nZero = abs {|s, z| z }\nOne = abs {|s, z| [s, z] }\nTwo = abs {|s, z| [s, [s, z]] }\nThree = abs {|s, z| [s, [s, [s, z]]] }\nSix = abs {|s| [Two, [Three, s]] }\nN256 = [abs {|n| [n, n] }, [abs {|n| [n, n] }, abs {|s, z| [s, [s, z]] }]]\nInc = abs {|n, s, z| [s, [[n, s], z]] }\nDbl = abs {|n, s| [n, abs {|x| [s, [s, x]] }] }\nCons = abs {|hd, tl| abs {|f| [f, hd, tl] } }\nPow = abs {|n, m| [m, n] }\nIfLE6 = -> m, t, e { [[m, Pow, [K, t]], [Six, Pow, [K, e]]] }\nMain =\n  [\n    abs {|x| [x, x, Zero, Zero] },\n    abs {|main, count, num, code|\n      IfLE6[count,\n       [main, main, [Inc, count], [code, I, Inc, [Dbl, num]]],\n       [Cons, num, code]\n      ]\n    }\n  ]\n\nif ARGV[0]\n  puts \"k`\"\n  \"foobar\\n\".bytes do |c|\n    print \"``s\" * 8 + \"i\"\n    6.downto(0) {|j| print \"`\" + \"kki\"[c[j], 2] }\n    puts\n  end\n  puts \"`k`k\" + to_unlambda(N256) + to_unlambda(Main)\nelse\n  File.write(\"lazyk-boot.dat\", \"`k`k\" + to_unlambda(N256) + to_unlambda(Main))\nend\n"
  },
  {
    "path": "src/test.rb",
    "content": "# usage:\n#   ruby test.rb      # test all Steps\n#   ruby test.rb Perl # test only Perl Step\n\nrequire_relative \"code-gen\"\n\nENV[\"PATH\"] = \"vendor/local/bin:#{ ENV[\"PATH\"] }\"\n\ndir = File.join(File.dirname(__dir__), \"tmp\")\nDir.mkdir(dir) unless File.directory?(dir)\nDir.chdir(dir)\nFile.symlink(\"../vendor\", \"vendor\") unless File.symlink?(\"vendor\")\n\ngens = ARGV[0] ? [eval(ARGV[0]).gen_step] : GenSteps[0..-2]\ntext = ARGV[1] || \"Hello\"\n\nall_check = true\n\ngens.each do |gen_step|\n  puts \"test: %s\" % gen_step.name\n\n  code = Object.new.instance_eval(GenPrologue + gen_step.code.sub(\"PREV\") { text.dump }) + \"\\n\"\n  code.sub!(\"%%\", \"%\") if gen_step.name == \"Octave_Ook\"\n\n  steps = [*gen_step.run_steps, RunStep[nil, \"QR.txt\"]]\n\n  File.write(steps.first.src, code)\n\n  steps.each_cons(2) do |src, dst|\n    cmd = src.cmd_raw.gsub(\"OUTFILE\", dst.src)\n    puts \"cmd: \" + cmd\n    system(cmd) || raise(\"failed\")\n  end\n\n  check = File.read(\"QR.txt\").strip == text\n  all_check &&= check\n  puts \"result: #{ check ? \"OK\" : \"NG\" }\"\n  puts\nend\n\nputs all_check ? \"all ok\" : \"something wrong\"\n"
  },
  {
    "path": "src/thumbnail.png.gen.rb",
    "content": "require \"chunky_png\"\n\n# zcat /usr/share/fonts/X11/misc/4x6.pcf.gz |\n# pcf2bdf |\n# ruby -e '$<.each(\"\") {|s| (n = $1.to_i; puts \"  %3d => 0x%s,\" % [n, $2.split.map {|n| n[0] }.join] if 32 <= n && n <= 126) if s =~ /ENCODING (\\d+).*BITMAP(.*)ENDCHAR/m }'\n\nFONT = {\n   32 => 0x000000,  33 => 0x444040,  34 => 0xAA0000,  35 => 0xAFAFA0,\n   36 => 0x4EC2E4,  37 => 0x824820,  38 => 0x4A4A50,  39 => 0x440000,\n   40 => 0x244442,  41 => 0x844448,  42 => 0xA4E4A0,  43 => 0x44E440,\n   44 => 0x000048,  45 => 0x00E000,  46 => 0x000040,  47 => 0x224880,\n   48 => 0x4AEA40,  49 => 0x4C44E0,  50 => 0x4A24E0,  51 => 0xE242C0,\n   52 => 0xAAE220,  53 => 0xE8C2C0,  54 => 0x68CA40,  55 => 0xE24880,\n   56 => 0x6A4AC0,  57 => 0x4A62C0,  58 => 0x040040,  59 => 0x040048,\n   60 => 0x248420,  61 => 0x0E0E00,  62 => 0x842480,  63 => 0xC24040,\n   64 => 0x6AA860,  65 => 0x4AEAA0,  66 => 0xCACAC0,  67 => 0x4A8A40,\n   68 => 0xCAAAC0,  69 => 0xE8C8E0,  70 => 0xE8C880,  71 => 0x68AA60,\n   72 => 0xAAEAA0,  73 => 0xE444E0,  74 => 0x222A40,  75 => 0xAACAA0,\n   76 => 0x8888E0,  77 => 0xAEEAA0,  78 => 0x2AEA80,  79 => 0x4AAA40,\n   80 => 0xCAC880,  81 => 0x4AAA42,  82 => 0xCACAA0,  83 => 0x6842C0,\n   84 => 0xE44440,  85 => 0xAAAAE0,  86 => 0xAAAE40,  87 => 0xAAEEA0,\n   88 => 0xAA4AA0,  89 => 0xAA4440,  90 => 0xE248E0,  91 => 0x644460,\n   92 => 0x884220,  93 => 0xC444C0,  94 => 0x4A0000,  95 => 0x00000E,\n   96 => 0x420000,  97 => 0x06AA60,  98 => 0x8CAAC0,  99 => 0x068860,\n  100 => 0x26AA60, 101 => 0x04AC60, 102 => 0x24E440, 103 => 0x06A62C,\n  104 => 0x8CAAA0, 105 => 0x40C4E0, 106 => 0x20222C, 107 => 0x8ACAA0,\n  108 => 0xC444E0, 109 => 0x0AEAA0, 110 => 0x0CAAA0, 111 => 0x04AA40,\n  112 => 0x0CAC88, 113 => 0x06AA62, 114 => 0x0AC880, 115 => 0x06C2C0,\n  116 => 0x4E4420, 117 => 0x0AAA60, 118 => 0x0AAA40, 119 => 0x0AAEA0,\n  120 => 0x0A44A0, 121 => 0x0AA62C, 122 => 0x0E24E0, 123 => 0x24C442,\n  124 => 0x444440, 125 => 0x846448, 126 => 0x5A0000\n}\n\nsrc = File.foreach(\"../QR.rb\").to_a\n\nw = src.map {|line| line.chomp.size }.max\nh = src.size\n\npng = ChunkyPNG::Image.new(w * 4, h * 8, :black)\nsrc.each_with_index do |line, j|\n  line.chomp.chars.each_with_index do |ch, i|\n    6.times do |y|\n      4.times do |x|\n        png[i * 4 + 3 - x, j * 8 + y + 1] =\n          [:black, :white][FONT[ch.ord][x + (5 - y) * 4]]\n      end\n    end\n  end\nend\npng.save('../thumbnail.png')\n"
  },
  {
    "path": "src/uroboros.txt",
    "content": "###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n############################################ #########  ###########################################################################################################################################################\n################################# ######     ####      ########    ################################################################################################################################################\n###############################   ###       #                     ####################################################################################                #############################################\n#############################    ##                                          ###############################################################                                  #####################################\n###########################                                                ############################################################                                            ################################\n##########################                                                        #################################################                                                    ############################\n#########################                                                             ##########################################                                                          #########################\n#######################                                                             #########################################                                                                ######################\n#####################     ####                                                           ##################################                          ##############                             ###################\n####################     #####                                                               ############################                     ############################                       ##################\n###################      ####                                                              ###########################                   ######################################                    ################\n###################                      ######################                                ######################                 ############################################                   ##############\n###################  ####         ##################################                              #################                ##################################################                 #############\n#####################  #################################################                            #############                ######################################################                 ###########\n##################     ###################################################                         ############                ##########################################################                ##########\n###############      ########################################################                         ########               #############################################################                #########\n##############     ############################################################                         ####               #################################################################               ########\n############      ###############################################################                        ##   ###############################################################################              ########\n##########      ###################################################################                     ######                 ###############################################################              #######\n#########      ######################################################################                                                      ###################################################               ######\n########      ########################################################################                                                           ##############################################              ######\n#######      ###########################################################################                                                              #########################################              ######\n#######      ############################################################################                                                                 #####################################              ######\n######      ###############################################################################                                                                   ##################################              #####\n######      ################################################################################                                                                     ###############################              #####\n#####       ##################################################################################                                                                      ###########################               #####\n#####       ###################################################################################                                                                        ########################              ######\n#####       ##################################################################################  #                                                                         #####################              ######\n#####       ################################################################################     ##                    ##########          ####                             ##################               ######\n#####       ###############################################################################        #                   #############     ###########                          ###############               #######\n######       #############################################################################          #                    ##############  ##############          #####          ############                #######\n######        ##########################################################################             ##                    ###############################     ############       #########                ########\n#######        ########################################################################             ####                    ################################   ################     ######                #########\n########        #####################################################################             ########                    ################################ ###################   ###                 ##########\n########         ##################################################################              ##########                     #################################################### #                  ###########\n#########         ###############################################################              ##############                      #################################################                   ############\n##########          ############################################################             ##################                      #############################################                   ##############\n############          #######################################################              #####################                        #######################################                     ###############\n#############           ###################################################               ########################                          ###############################                       #################\n###############            #############################################                ############################                              ##################                            ###################\n#################             #######################################                ##################################                                                                       #####################\n###################                ##############################                  ######################################                                                                   #######################\n#####################                     ###############                       ############################################                                                             ##########################\n########################                                                     ##################################################                                                       #############################\n###########################                                               #########################################################                                               #################################\n################################                                      #################################################################                                       #####################################\n######################################                         ###############################################################################                         ############################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n###################################################################################################################################################################################################################\n"
  },
  {
    "path": "src/wasm-tmpl.dat.gen.rb",
    "content": "def f(s)\n  enc = -> n { [n].pack(\"V\").unpack1(\"H*\").gsub(/../){\"\\\\\"+$&} }\n  esc = -> s { s.gsub(?\\\\){'\\\\\\\\'}.gsub(?\"){'\\\\\"'} }\n\n  wasm_txt_pre = <<-'END'.lines.map {|s| s.strip }.join + enc[s.size * 16 + 3]\n    (module\n      (import \"wasi_snapshot_preview1\" \"fd_write\" (func(param i32 i32 i32 i32)(result i32)))\n      (memory(export \"memory\")(data \"\\08\\00\\00\\00\n  END\n\n  raise unless wasm_txt_pre.size % 4 == 0\n\n  wasm_txt_post = <<-'END'.lines.map {|s| s.strip }.join\n      \"))\n      (func(export \"_start\")i32.const 1 i32.const 0 i32.const 1 i32.const 0 call 0 drop)\n    )\n  END\n\n  txt = <<-END\n    (module\n      (import \"wasi_snapshot_preview1\" \"fd_write\"(func $fd_write(param i32 i32 i32 i32)(result i32)))\n      (memory 64)\n      (export \"memory\"(memory 0))\n      (data(i32.const 0)\"#{\n        enc[8*5]+enc[1] # \" \"\n      }#{\n        enc[8*5+4]+enc[2] # \"\\t\"\n      }#{\n        enc[8*5+8]+enc[2] # \"\\n\"\n      }#{\n        enc[8*5+12]+enc[wasm_txt_pre.size]\n      }#{\n        enc[8*5+12+wasm_txt_pre.size]+enc[wasm_txt_post.size]\n      } ...\\\\\\\\t..\\\\\\\\n..#{ esc[wasm_txt_pre] }#{ esc[wasm_txt_post] }#{ s }\")\n      (func $out(param i32)\n        i32.const 1\n        local.get 0\n        i32.const 8\n        i32.mul\n        i32.const 1\n        i32.const #{ 8 * 5 + 12 }\n        call $fd_write\n        drop\n      )\n      (func(export \"_start\")\n        (local $idx i32)\n        (local $shift i32)\n\n        i32.const 3\n        call $out\n\n        i32.const #{ 8*5+12+wasm_txt_pre.size+wasm_txt_post.size }\n        local.set $idx\n        (loop\n          i32.const 0 call $out (; out << 32 ;)\n          i32.const 0 call $out (; out << 32 ;)\n          i32.const 0 call $out (; out << 32 ;)\n\n          i32.const 8\n          local.set $shift\n          (loop\n            local.get $idx\n            i32.load8_u\n            local.get $shift\n            i32.const 1\n            i32.sub\n            local.tee $shift\n            i32.shr_u\n            i32.const 1\n            i32.and\n            call $out (; out << 32 - c[7-i] * 23 ;)\n\n            local.get $shift\n            br_if 0\n          )\n          i32.const 2 call $out (; out << 10 ;)\n          i32.const 1 call $out (; out <<  9 ;)\n          i32.const 2 call $out (; out << 10 ;)\n          i32.const 0 call $out (; out << 32 ;)\n          i32.const 0 call $out (; out << 32 ;)\n\n          local.get $idx\n          i32.const 1\n          i32.add\n          local.tee $idx\n          i32.load8_u\n          br_if 0\n        )\n        i32.const 2 call $out (; out << 10 ;)\n        i32.const 2 call $out (; out << 10 ;)\n        i32.const 2 call $out (; out << 10 ;)\n\n        i32.const 4\n        call $out\n      )\n    )\n  END\nend\n\nFile.write(\"ABCD.wat\", f(\"abcd\"))\nFile.write(\"ABCDE.wat\", f(\"abcde\"))\nsystem(\"wat2wasm ABCD.wat\", exception: true)\nsystem(\"wat2wasm ABCDE.wat\", exception: true)\nabcd = File.binread(\"ABCD.wasm\")\nabcde = File.binread(\"ABCDE.wasm\")\ni = (0..).find {|i| abcd[i] != abcde[i] }\nj = (abcd.size - 4).downto(0).find {|i| abcd[i] != abcde[i] }\n\ndata1 = abcd[0, i]\nraise unless data1 == abcde[0, i]\ndata2 = abcd[i + 2, 5]\nraise unless data2 == abcde[i + 2, 5]\ndata3 = abcd[i + 2 + 5 + 2...j-1]\nraise unless data3 == abcde[i + 2 + 5 + 2...j-1]\ndata4 = abcd[j + 12-1...-4]\n\n# wasm template:\n#   data1 + LSB128(length+const) + data2 + LSB128(length+const) + data3 + Hexdump(length) + data4\n\n\nA = [26, 34, 86, 127, 148, 158, 200]\ndef e(data)\n  enc = \"\".b\n  data.bytes do |n|\n    case\n    when n < 0x1a\n      enc << [n + ?B.ord].pack(\"C*\")\n    when ?9.ord <= n && n < ?9.ord + A.size\n      raise\n    when n < 32 || n == ?\".ord || (?B.ord <= n && n <= ?Z.ord) || n >= 127\n      enc << [?9.ord + A.index(n)].pack(\"C*\")\n    else\n      enc << n\n    end\n  end\n  enc\nend\n\ndef d(data)\n  data.gsub(/./) { \"9\" <= $& && $& < \"@\" ? [A[$&.ord - ?9.ord]].pack(\"C*\") : \"A\" < $& && $& < \"Z\" ? [$&.ord - ?B.ord].pack(\"C*\") : $& }\nend\n\n[data1, data2, data3, data4].each do |data|\n  raise unless data == d(e(data))\nend\n\nFile.open(\"wasm-tmpl.dat\", \"w\") do |f|\n  f.puts A.join(\",\")\n  f.puts e(data1)\n  f.puts e(data2)\n  f.puts e(data3)\n  f.puts e(data4)\nend\n\nd=->s,t=?\"{s.gsub(t){t+t}};\nout = \"ABCDE\"\n\n# test code\nraise if data3.size + data4.size + 18 != 292\nn = 292+out.size\nm = (n.bit_length - 1) / 7\nputs <<END.lines.map {|s| s.strip }.join(\":\")\nModule QR\n  Sub Main()\n    Dim c,n,s As Object=System.Console.OpenStandardOutput(),t()As Short={#{A.join(\",\")}}\n    For Each c in\"#{e(data1)}}#{e(data2)}~#{e(data3)}$#{e(data4)}\"\n      c=Asc(c)\n      If c=36\n        For c=0To 11\n          s.WriteByte(If(c Mod 3,Asc(#{out.size*16+3}.ToString(\"x8\")(1Xor 7-c*2\\\\3)),92))\n        Next\n      Else\n        n=(c>124)*(#{6+m}*c-#{m+n+125*(6+m)})\n        Do While n>127\n          s.WriteByte(128+(127And n))\n          n\\\\=128\n        Loop\n        s.WriteByte(If(c<125,If((c-1)\\\\7-8,c+66*(c>65And c<91),t(c-57)),n))\n      End If\n    Next\n    For Each c in\"#{d[out]}\"\n      s.WriteByte(Asc(c))\n    Next\n  End Sub\nEnd Module\nEND\n"
  },
  {
    "path": "vendor/.gitignore",
    "content": "Spl/\ngoaheui/\nlci-*/\nnpiet-*/\ncfunge-*/\nAcme-Chef-*/\nlocal/\nspl-*/\n"
  },
  {
    "path": "vendor/Makefile",
    "content": "LCI       := lci-0.10.5\nNPIET     := npiet-1.3e\nCFUNGE    := cfunge-0.9.0\nACME_CHEF := Acme-Chef-1.03\nSPL\t  := spl-1.2.1\nLOCAL     := $(CURDIR)/local\n\n.NOTPARALLEL:\nall: $(LOCAL)/bin/lci $(LOCAL)/bin/npiet $(LOCAL)/bin/cfunge $(LOCAL)/bin/compilechef $(LOCAL)/bin/lazyk $(LOCAL)/bin/spl2c $(LOCAL)/bin/Vlt.exe\n\n$(LOCAL)/bin/lci:\n\tunzip -q $(LCI).zip\n\t(cd $(LCI) && cmake -DCMAKE_INSTALL_PREFIX=$(LOCAL) . && make && make install)\n\n$(LOCAL)/bin/npiet:\n\ttar xzf $(NPIET).tar.gz\n\t(cd $(NPIET) && ./configure CC=\"gcc -std=c99 -Wno-implicit-function-declaration -Wno-int-conversion\" --prefix=$(LOCAL) && make && make install)\n\n$(LOCAL)/bin/cfunge:\n\ttar xjf $(CFUNGE).tar.bz2\n\t(cd $(CFUNGE) && cmake -DCMAKE_INSTALL_PREFIX=$(LOCAL) . && make && make install)\n\n$(LOCAL)/bin/compilechef:\n\ttar xzf $(ACME_CHEF).tar.gz\n\t(cd $(ACME_CHEF) && perl Makefile.PL INSTALL_BASE=$(LOCAL) && make && make install)\n\n$(LOCAL)/bin/lazyk:\n\t$(CC) lazyk.c -o $@\n\n$(LOCAL)/bin/spl2c:\n\ttar xzf $(SPL).tar.gz\n\t(cd $(SPL) && ln -s ../local spl && make spl2c CCFLAGS=\"-O0 -g -Wall\" && make install)\n\n$(LOCAL)/bin/Vlt.exe:\n\tunzip -d $(LOCAL)/bin -q Velato_0_1.zip\n\nclean:\n\trm -rf $(LOCAL)/ $(LCI)/ $(NPIET)/ $(CFUNGE)/ $(ACME_CHEF)/ $(SPL)/\n"
  },
  {
    "path": "vendor/README",
    "content": "Unlambda: unlambda.rb\n  * self-made\n  * License: MIT\n\nWhitespace: whitespace.rb\n  * self-made\n  * License: MIT\n\nSubleq: subleq.rb\n  * self-made\n  * License: MIT\n\nThue: thue.rb\n  * self-made\n  * License: MIT\n\nOok!: ook-to-bf.rb\n  * self-made\n  * License: MIT\n\nBLC8: blc.rb\n  * self-made\n  * License: MIT\n\nFALSE: false.rb\n  * self-made\n  * License: MIT\n\nAheui: aheui.rb\n  * self-made\n  * License: MIT\n\nante: ante.rb\n  * https://github.com/michaeldv\n  * License: MIT\n\nBefunge: cfunge-0.9.0.tar.bz2\n  * http://sourceforge.net/projects/cfunge/\n  * License: GPL3\n\nChef: Acme-Chef-1.03.tar.gz\n  * https://metacpan.org/pod/Acme::Chef\n  * License: the same terms as Perl (Artistic License)\n\nGrass: grass.rb\n  * http://www.blue.sky.or.jp/grass/\n  * License: BSD 2-Clause\n  * slightly modified for Ruby 2+\n\nGolfScript: golfscript.rb\n  * http://www.golfscript.com/golfscript/\n  * License: MIT\n\nLOLCODE: lci-0.10.5.zip\n  * http://lolcode.org/\n  * License: GPL3+\n\nPiet: npiet-1.3e.tar.gz\n  * http://www.bertnase.de/npiet/\n  * License: GPL2\n\nLazy K: lazyk.c\n  * https://github.com/irori/lazyk\n  * License: GPL2+\n\nShakespeare: spl-1.2.1.tar.gz\n  * http://shakespearelang.sourceforge.net/\n  * License: GPL\n\nVelato: Velato_0_1.zip\n  * http://velato.net/\n  * License: freeware\n"
  },
  {
    "path": "vendor/aheui.rb",
    "content": "# https://aheui.readthedocs.io/en/latest/specs.en.html\n\ncode = $<.each_line.map do |s|\n  s.chomp.unpack(\"U*\").map do |c|\n    if 0xac00 <= c && c <= 0xd7a3\n      c -= 0xac00\n      # Hangul initial consonant, vowel, final consonant\n      [c / 21 / 28, c / 28 % 21, c % 28]\n    end\n  end\nend\n\ndef read_int\n  s = \"\"\n  while true\n    ch = $stdin.getc\n    case ch\n    when /\\d+/ then s << ch\n    when /\\s+/ then break\n    else raise \"Integer expected\"\n    end\n  end\n  s.to_i\nend\n\nSTROKE_TABLE = [0,2,4,4,2,5,5,3,5,7,9,9,7,9,9,8,4,4,6,2,4,nil,3,4,3,4,4,nil]\n\nx, y, dx, dy, s = 0, 0, 0, 1, 0\nss = (0..27).map { [] }\ndef (ss[21]).pop; shift; end # queue\nss[27] = nil # extension protocol\n\ncheck_size = -> n do\n  if ss[s].size >= n\n    true\n  else\n    dx, dy = -dx, -dy\n    false\n  end\nend\n\nwhile true\n  ic, vo, fc = code[y][x]\n\n  case ic\n  when 11 # null\n  when 18 then exit # terminate\n  when  3 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b + a)\n  when  4 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b * a)\n  when  2 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b / a)\n  when 16 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b - a)\n  when  5 then check_size[2] && (a, b = ss[s].pop, ss[s].pop; ss[s] << b % a)\n  when 6 # pop\n    if check_size[1]\n      v = ss[s].pop\n      case fc\n      when 21 then puts v\n      when 27 then print v.chr(\"UTF-8\")\n      end\n    end\n  when 7 # push\n    case fc\n    when 21 then ss[s] << read_int\n    when 27 then ss[s] << $stdin.getc.ord\n    else ss[s] << STROKE_TABLE[fc]\n    end\n  when 8 then check_size[1] && ss[s] << ss[s][s != 21 ? -1 : 0] # duplicate\n  when 17 # swap\n    if check_size[2]\n      r = s != 21 ? (-2..-1) : (0..1)\n      ss[s][r] = ss[s][r].reverse\n    end\n  when 9 then s = fc # select\n  when 10 then check_size[1] && ss[fc] << ss[s].pop # transfer\n  when 12 # compare\n    check_size[2] && ss[fc] << (ss[s].pop <= ss[s].pop ? 1 : 0)\n  when 14 # fork\n    dx, dy = -dx, -dy if check_size[1] && ss[fc].pop != 0\n  end\n\n  case vo\n  when  0 then dx, dy =  1,  0\n  when  2 then dx, dy =  2,  0\n  when  4 then dx, dy = -1,  0\n  when  6 then dx, dy = -2,  0\n  when  8 then dx, dy =  0, -1\n  when 12 then dx, dy =  0, -2\n  when 13 then dx, dy =  0,  1\n  when 17 then dx, dy =  0,  2\n  when 18 then dy = -dy\n  when 19 then dx, dy = -dx, -dy\n  when 20 then dx = -dx\n  end\n\n  x, y = x + dx, y + dy\nend\n"
  },
  {
    "path": "vendor/ante.rb",
    "content": "#!/usr/bin/env ruby\n# encoding: utf-8\n#\n# Copyright (c) 2013 Michael Dvorkin\n#\n# Ante is an esoteric programming language where all you've got is\n# a deck of cards.\n#\n# 95% of this code was developed on the way back from RubyConf 2013\n# during 5-hour flight from Miami to San Francisco.\n# \n### require \"awesome_print\"\n\nclass Array\n  def rank; self[0] end\n  def suit; self[1] end\n  def rank=(value); self[0] = value end\n  def suit=(value); self[1] = value end\nend\n\nclass Ante\n  def initialize()\n    @♦, @♥, @♠, @♣ = 0, 0, 0, 0\n    @line, @pc = 0, 0\n    @code, @labels = [], {}\n  end\n\n  def run(source)\n    parse(source)\n    ### ap @code; ap @labels\n\n    while card = @code[@pc]\n      @pc += 1\n      case card.rank\n      when nil then newline(card)\n      when \"K\" then jump(card)\n      when \"Q\" then next\n      when \"J\" then dump(card, :char)\n      when 10  then dump(card)\n      else          assign(card)\n      end\n    end\n  end\n\n  def parse(source)\n    lines = source.split(\"\\n\").map { |line| line.sub(/#.*$/, \"\").strip }\n    ### ap lines\n\n    # Turn source file into array of cards. Each card is 2-item\n    # array of rank and suit.\n    lines.each_with_index do |line, i|\n      @code += [[ nil, i + 1 ]] # <-- Line number cards have nil rank.\n      @code += line.scan(/(10|[2-9JQKA])([♦♥♠♣])/)\n    end\n\n    # A pass to convert ranks to Fixnum and extract labels.\n    pc = 0\n    while card = @code[pc]\n      pc += 1\n      if card.rank =~ /\\d/\n        card.rank = card.rank.to_i\n      elsif card.rank == \"Q\"\n        queen = card.suit\n        while @code[pc] && @code[pc].rank == \"Q\" && @code[pc].suit == card.suit\n          queen += card.suit\n          pc += 1\n        end\n        @labels[queen] = pc\n      end\n    end\n  end\n\n  def newline(card)\n    # puts \"newline #{card}\"\n    @line = card.suit\n  end\n\n  def assign(card)\n    # puts \"assign #{card.inspect}\"\n    operands = remaining(card)\n    expression(operands)\n  end\n\n  def jump(card)\n    # puts \"jump #{card.inspect}, pc: #{@pc.inspect}, #{@labels.inspect}\"\n    suit = card.suit\n    while @code[@pc] && @code[@pc].rank == \"K\" && @code[@pc].suit == card.suit\n      suit += card.suit\n      @pc += 1\n    end\n\n    if instance_variable_get(\"@#{suit[0]}\") != 0\n      # puts \"jumping to \" << \"Q#{suit[0]}\" * suit.size\n      if @labels[suit]\n        @pc = @labels[suit]\n      else\n        exception(\"can't find \" << \"Q#{suit[0]}\" * suit.size << \" to go to\")\n      end\n    end\n  end\n\n  def dump(card, char = nil)\n    # puts \"dump #{card.inspect} => \"\n    value = instance_variable_get(\"@#{card.suit}\")\n    if char\n      if value.between?(0, 255)\n        print value.chr\n      else\n        exception(\"character code #{value} is out of 0..255 range\")\n      end\n    else\n      print value\n    end\n  end\n\n  # Fetch the rest of the assignment expression.\n  def remaining(card)\n    operands = [ card ]\n    while card = @code[@pc]\n      break if card.rank.nil? || card.rank.to_s =~ /[KQJ]/\n      operands += [ card ]\n      @pc += 1\n    end\n    ### ap \"remaining: #{operands.inspect}\"\n    operands\n  end\n\n  def expression(operands)\n    initial, target = operands.shift\n    initial = instance_variable_get(\"@#{target}\") if initial == \"A\"\n    operands.each do |rank, suit|\n      # puts \"rank: #{rank.inspect}, suit: #{suit.inspect}\"\n      rank = instance_variable_get(\"@#{suit}\") if rank == \"A\"\n      case suit\n      when \"♦\" then initial += rank\n      when \"♥\" then initial *= rank\n      when \"♠\" then initial -= rank\n      when \"♣\" then\n        if rank != 0\n          initial /= rank\n        else\n          exception(\"division by zero\")\n        end\n      end\n    end\n    instance_variable_set(\"@#{target}\", initial)\n    # dump_registers\n  end\n\n  def exception(message)\n    abort(\"Ante exception: #{message} on line #{@line} (pc:#{@pc})\")\n  end\n\n  def dump_registers\n    instance_variables.each do |i|\n      puts \"  #{i}: \" + instance_variable_get(\"#{i}\").to_s if i.size == 2\n    end\n  end\nend\n\nif ARGV[0]\n  Ante.new.run(IO.read(ARGV[0], encoding: \"UTF-8\"))\nelse\n  puts \"usage: ante filename.ante\"\nend\n"
  },
  {
    "path": "vendor/bf.rb",
    "content": "code = File.read($*[0]).unpack(\"C*\")\ndata = [0]\ni = j = 0\nwhile code[i]\n  case code[i]\n  when 60 # <\n    j -= 1\n  when 62 # >\n    j += 1\n    data[j] ||= 0\n  when 43 # +\n    data[j] += 1\n  when 45 # -\n    data[j] -= 1\n  when 91 # [\n    if data[j] == 0\n      d = 0\n      i += 1\n      until d == 0 && code[i] == 93 # ]\n        case code[i]\n        when 91 # [\n          d += 1\n        when 93 # ]\n          d -= 1\n        end\n        i += 1\n      end\n    end\n  when 93 # ]\n    d = 0\n    i -= 1\n    until d == 0 && code[i] == 91 # [\n      case code[i]\n      when 91 # [\n        d -= 1\n      when 93 # ]\n        d += 1\n      end\n      i -= 1\n    end\n    next\n  when 46 # .\n    putc(data[j])\n  when 44 # ,\n    data[j] = $stdin.getc\n  end\n  i += 1\nend\n"
  },
  {
    "path": "vendor/blc.rb",
    "content": "# Binary lambda calculus interpreter\n#\n# (C) Copyright 2014, 2015, Yusuke Endoh\n# License: MIT\n#\n# See in detail: http://tromp.github.io/cl/cl.html\n\n# BLC8 or not\nbinary_mode = ARGV.empty?\n$stdout.sync = true\n\n# abstract syntax tree\nVar = -> v { [:var, v] }\nAbs = -> e { [:abs, e] }\nApp = -> e1, e2 { [:app, e1, e2] }\n\n# bit stream\ncurrent_byte, bit_offset = nil, 0\nget_byte = -> do\n  bit_offset = binary_mode ? 8 : 1\n  current_byte = $stdin.getbyte\nend\nget_bit = -> do\n  get_byte[] if bit_offset == 0\n  bit_offset -= 1\n  current_byte ? current_byte[bit_offset] == 0 : false\nend\n\n# parse\nstack, acc = [:exp], nil\nuntil stack.empty?\n  v = stack.pop\n  acc = case v\n  when :exp\n    if get_bit[]\n      stack << (get_bit[] ? :abs : :app1) << :exp\n      nil\n    else\n      v = 0\n      v += 1 until get_bit[]\n      Var[v]\n    end\n  when :abs then Abs[acc]\n  when :app1 then stack << acc << :exp; nil\n  else App[v, acc] # parsing two exps of app finished\n  end\nend\nbit_offset = 0 # force to align bit offset\n\n# I/O\ncons = -> a, b { Abs[App[App[Var[0], a], b]] }\nbool = -> b { Abs[Abs[Var[b ? 1 : 0]]] }\nif binary_mode\n  read = -> i { i > 0 ? cons[bool[get_bit[]], read[i - 1]] : bool[false] }\n  in_ = [:in, -> { get_byte[] ? cons[read[8], in_] : bool[false] }]\n  outc = 0\n  out0, out1 = [0, 1].map {|n| [:out, -> { outc = (2 * outc + n) & 255 }] }\n  out0[2] = out1[2] = App[Var[0], cons[out0, out1]]\n  outn = [:out, -> { putc(outc) }]\n  out_ = outn[2] = App[Var[0], cons[cons[out0, out1], outn]]\nelse\n  in_ = [:in, -> { get_byte[] ? cons[bool[get_bit[]], in_] : bool[false] }]\n  out0, out1 = [0, 1].map {|n| [:out, -> { print(n) }] }\n  out_ = out0[2] = out1[2] = App[Var[0], cons[out0, out1]]\nend\n\n# eval-loop\nexp = App[Abs[out_], App[acc, in_]]\nenv, stack = [], [[nil, nil]]\nwhile true\n  case exp[0]\n  when :var\n    exp[1].times { env = env[2] }\n    if env.frozen?\n      valexp, valenv = env # already forced\n    else # not forced yet\n      stack.last << env\n      exp, env = env[0], env[1]\n      next\n    end\n  when :app\n    stack << [exp[2], env]\n    next exp = exp[1]\n  when :abs\n    valexp, valenv = exp[1], env\n  when :in  then next exp = exp[1][]\n  when :out then exp[1][]; valexp, valenv = exp[2], env\n  end\n  env = stack.pop\n  until env.size == 2\n    th = env.pop\n    th[0] = valexp # force\n    th[1] = valenv\n    th.freeze\n  end\n  break unless env[0]\n  exp = valexp\n  env[2] = valenv\nend\n"
  },
  {
    "path": "vendor/dummy-wasi-runtime.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#define/*\n\nf = ARGV[0]\nsystem(\"wasm2c\", f, \"-o\", f + \".c\", exception: true)\nsystem(\"gcc\", \"-DWASM_RT_MODULE_PREFIX=Z_\" + File.basename(f, \".wasm\").gsub(\".\", \"Z2E\"), \"-o\", \"dummy-wasi-exec\", f + \".c\", __FILE__, \"-include\", f + \".h\", \"-lwasm-rt-impl\", \"-I.\", exception: true)\nexec(\"./dummy-wasi-exec\")\n__END__\n*/DUMMY\n\n#ifndef WASM_RT_ADD_PREFIX\n#define WASM_RT_PASTE_(x, y) x ## y\n#define WASM_RT_PASTE(x, y) WASM_RT_PASTE_(x, y)\n#define WASM_RT_ADD_PREFIX(x) WASM_RT_PASTE(WASM_RT_MODULE_PREFIX, x)\n#endif\n\n// This is a dummy WASI implementation based on wasm2c.\n// It supports only \"wasi_snapshot_preview1.fd_write\" for stdout.\n// This should be replaced if a proper WASI implementation\n// (such as wasmtime) becomes available.\n//\n// Usage:\n//   ruby dummy-wasi-runtime.c foo.wasm\n\nu32 fd_write(u32 fd, u32 iovs, u32 iovsLen, u32 size) {\n\tif (fd != 1) abort();\n\n\tu32 total_len = 0;\n\tu8 *mem = WASM_RT_ADD_PREFIX(Z_memory)->data;\n\tfor (; iovsLen--; iovs += 8) {\n\t\tu32 ptr = *(u32*)&mem[iovs];\n\t\tu32 len = *(u32*)&mem[iovs + 4];\n\t\tfwrite(&mem[ptr], 1, len, stdout);\n\t\ttotal_len += len;\n\t}\n\t*(u32*)&mem[size] = total_len;\n\n\treturn 0;\n}\n\nu32 (*Z_wasi_snapshot_preview1Z_fd_write)(u32, u32, u32, u32) = fd_write;\n\nint main() {\n\tWASM_RT_ADD_PREFIX(_init)();\n\tWASM_RT_ADD_PREFIX(Z__start)();\n\tWASM_RT_ADD_PREFIX(_free)();\n\treturn 0;\n}\n"
  },
  {
    "path": "vendor/false.rb",
    "content": "code = File.read($*[0])\nstack = []\n\npos = 0\n\nparse = ->(re) do\n  m = code.match(re, pos)\n  pos = m.end(0) - 1\n  m[1]\nend\n\nwhile code[pos]\n  case code[pos]\n  when /\\d/ then s = parse[/(\\d+)/]; stack << s.to_i\n  when /[a-z]/ then stack << code[pos].to_sym\n  when ?+ then a, b = stack.pop, stack.pop; stack << b + a\n  when ?- then a, b = stack.pop, stack.pop; stack << b - a\n  when ?* then a, b = stack.pop, stack.pop; stack << b * a\n  when ?/ then a, b = stack.pop, stack.pop; stack << b / a\n  when ?& then a, b = stack.pop, stack.pop; stack << b & a\n  when ?| then a, b = stack.pop, stack.pop; stack << b | a\n  when ?_ then stack << -stack.pop\n  when ?~ then stack << ~stack.pop\n  when ?= then a, b = stack.pop, stack.pop; stack << (b == a ? -1 : 0)\n  when ?> then a, b = stack.pop, stack.pop; stack << (b >  a ? -1 : 0)\n  when ?% then stack.pop\n  when ?$ then stack << stack.last\n  when ?\\\\ then a, b = stack.pop, stack.pop; stack << a << b\n  when ?@ then a, b, c = stack.pop, stack.pop, stack.pop; stack << b << a << c\n  when ?O then a = stack.pop; stack << stack[-1 - a]\n  when ?: then a, b = stack.pop, stack.pop; vars[a] = b\n  when ?; then a = stack.pop; stack << vars[a]\n  when ?. then print \"%d\" % stack.pop\n  when ?, then print stack.pop.chr\n  when ?^ then stack << $stdin.getc\n  when ?B then $stdin.flush; $stdout.flush\n  when ?\" then s = parse[/\"(.*?)\"/]; print s\n  when ?{ then s = parse[/\\}/]\n  when ?' then stack << code[pos += 1].ord\n  when ?` then raise\n  when ?[\n    stack << [:func, pos]\n    m = code.match(/(?<b>\\[(\\g<b>|\\{.*?\\}|\\\".*?\\\"|[^\\{\\}\\\"\\[\\]])*\\])/)\n    pos = m.end(0) - 1\n  when ?]\n    case npos = ret.pop\n    when :det\n      if stack.pop == 0\n        pos = ret.pop\n        ret.pop; ret.pop\n      else\n        ret << :body\n        pos = ret[-3]\n      end\n    when :body\n      stack << :det\n      pos = ret[-4]\n    else\n      pos = npos\n    end\n  when ?! then ret << pos; pos = stack.pop[1]\n  when ??\n    tpos = stack.pop[1]; b = stack.pop; (ret << pos; pos = tpos) if b\n  when ?#\n    body = stack.pop[1]\n    det = stack.pop[1]\n    ret << det << body << pos << :det\n    pos = det\n  when /\\A\\s\\z/\n  else\n    raise \"unknown symbol: %p\" % code[pos]\n  end\n  pos += 1\nend\n"
  },
  {
    "path": "vendor/golfscript.rb",
    "content": "#!/usr/bin/ruby\n#(c) Copyright 2008 Darren Smith. All Rights Reserved.\n$lb = []\nclass Gtype\n\tdef go\n\t\t$stack<<self\n\tend\n\tdef val\n\t\t@val\n\tend\n\t\n\t'+-|&^'.each_byte{|i|\n\t\teval'def %c(rhs)\n\t\t\tif rhs.class != self.class\n\t\t\t\ta,b=coerce(rhs)\n\t\t\t\ta %c b\n\t\t\telse\n\t\t\t\tfactory(@val %c rhs.val)\n\t\t\tend\n\t\tend'%([i]*3)\n\t}\n\tdef ==(rhs)\n\t\t@val==rhs.val\n\tend\n\tdef eql?(rhs)\n\t\t@val==rhs.val\n\tend\n\tdef hash\n\t\t@val.hash\n\tend\n\tdef <=>(rhs)\n\t\t@val<=>rhs.val\n\tend\nend\n\nclass Gint < Gtype\n\tdef initialize(i)\n\t\t@val = case i\n\t\t\twhen true then 1\n\t\t\twhen false then 0\n\t\t\telse;i\n\t\tend\n\tend\n\tdef factory(a)\n\t\tGint.new(a)\n\tend\n\tdef to_gs\n\t\tGstring.new(@val.to_s)\n\tend\n\tdef to_int #for pack\n\t\t@val\n\tend\n\tdef ginspect\n\t\tto_gs\n\tend\n\tdef class_id; 0; end\n\tdef coerce(b)\n\t\t[if b.class == Garray\n\t\t\tGarray.new([self])\n\t\telsif b.class == Gstring\n\t\t\tto_gs\n\t\telse #Gblock\n\t\t\tto_gs.to_s.compile\n\t\tend,b]\n\tend\n\t\n\tdef ~\n\t\tGint.new(~@val)\n\tend\n\tdef notop\n\t\tGint.new(@val == 0)\n\tend\n\t'*/%<>'.each_byte{|i|\n\t\teval'def %c(rhs)\n\t\t\tGint.new(@val %c rhs.val)\n\t\tend'%[i,i]\n\t}\n\tdef equalop(rhs)\n\t\tGint.new(@val == rhs.val)\n\tend\n\tdef question(b)\n\t\tGint.new(@val**b.val)\n\tend\n\tdef base(a)\n\t\tif Garray===a\n\t\t\tr=0\n\t\t\ta.val.each{|i|\n\t\t\t\tr*=@val\n\t\t\t\tr+=i.val\n\t\t\t}\n\t\t\tGint.new(r)\n\t\telse\n\t\t\ti=a.val.abs\n\t\t\tr=[]\n\t\t\twhile i!=0\n\t\t\t\tr.unshift Gint.new(i%@val)\n\t\t\t\ti/=@val\n\t\t\tend\n\t\t\tGarray.new(r)\n\t\tend\n\tend\n\tdef leftparen\n\t\tGint.new(@val-1)\n\tend\n\tdef rightparen\n\t\tGint.new(@val+1)\n\tend\nend\n\nclass Garray < Gtype\n\tdef initialize(a)\n\t\t@val = a || []\n\tend\n\tdef factory(a)\n\t\tGarray.new(a)\n\tend\n\tdef to_gs\n\t\t@val.inject(Gstring.new(\"\")){|s,i|s+i.to_gs}\n\tend\n\tdef flatten #maybe name to_a ?\t\t\n# \t\tGarray.new(@val.inject([]){|s,i|s+case i\n# \t\t\twhen Gstring then i.val\n# \t\t\twhen Gint then [i]\n# \t\t\twhen Garray then i.flatten.val\n# \t\t\twhen Gblock then i.val\n# \t\t\tend\n# \t\t})\n# \tend\n\t\t#use Peter Taylor's fix to avoid quadratic flatten times\n\t\tGarray.new(flatten_append([]))\n\tend\n\tdef flatten_append(prefix)\n\t\t@val.inject(prefix){|s,i|case i\n\t\t\twhen Gint then s<<i\n\t\t\twhen Garray then i.flatten_append(s)\n\t\t\twhen Gstring then s.concat(i.val)\n\t\t\twhen Gblock then s.concat(i.val)\n \t\t\tend\n\t\t}\n\tend\n\tdef ginspect\n\t\tGstring.new('[')+Garray.new(@val.map{|i|i.ginspect})*Gstring.new(' ')+Gstring.new(']')\n\tend\n\tdef go\n\t\t$stack<<self\n\tend\n\tdef class_id; 1; end\n\tdef coerce(b)\n\t\tif b.class == Gint\n\t\t\tb.coerce(self).reverse\n\t\telsif b.class == Gstring\n\t\t\t[Gstring.new(self),b]\n\t\telse\n\t\t\t[(self*Gstring.new(' ')).to_s.compile,b]\n\t\tend\n\tend\n\t\n\tdef leftparen\n\t\t[factory(@val[1..-1]),@val[0]]\n\tend\n\tdef rightparen\n\t\t[factory(@val[0..-2]),@val[-1]]\n\tend\n\tdef *(b)\n\t\tif b.class == Gint\n\t\t\tfactory(@val*b.val)\n\t\telse\n\t\t\treturn b*self if self.class == Gstring && b.class == Garray\n\t\t\treturn self/Gint.new(1)*b if self.class == Gstring\n\t\t\treturn b.factory([]) if @val.size<1\n\t\t\tr=@val.first\n\t\t\tr,x=r.coerce(b) if r.class != b.class #for size 1\n\t\t\t@val[1..-1].each{|i|r=r+b+i}\n\t\t\tr\n\t\tend\n\tend\n\tdef /(b)\n\t\tif b.class == Gint\n\t\t\tr=[]\n\t\t\ta = b.val < 0 ? @val.reverse : @val\n\t\t\ti = -b = b.val.abs\n\t\t\tr << factory(a[i,b]) while (i+=b)<a.size\n\t\t\tGarray.new(r)\n\t\telse\n\t\t\tr=[]\n\t\t\ti=b.factory([])\n\t\t\tj=0\n\t\t\twhile j<@val.size\n\t\t\t\tif @val[j,b.val.size]==b.val\n\t\t\t\t\tr<<i\n\t\t\t\t\ti=b.factory([])\n\t\t\t\t\tj+=b.val.size\n\t\t\t\telse\n\t\t\t\t\ti.val<<@val[j]\n\t\t\t\t\tj+=1\n\t\t\t\tend\n\t\t\tend\n\t\t\tr<<i\n\t\t\tGarray.new(r)\n\t\tend\n\tend\n\tdef %(b)\n\t\tif b.class == Gint\n\t\t\tb=b.val\n\t\t\tfactory((0..(@val.size-1)/b.abs).inject([]){|s,i|\n\t\t\t\ts<<@val[b < 0 ? i*b - 1 : i*b]\n\t\t\t})\n\t\telse\n\t\t\tself/b-Garray.new([Garray.new([])])\n\t\tend\n\tend\n\tdef notop\n\t\tGint.new(@val.empty?)\n\tend\n\tdef question(b)\n\t\tGint.new(@val.index(b)||-1)\n\tend\n\tdef equalop(b)\n\t\tif b.class == Gint\n\t\t\t@val[b.val]\n\t\telse\n\t\t\tGint.new(@val==b.val)\n\t\tend\n\tend\n\tdef <(b)\n\t\tif b.class == Gint\n\t\t\tfactory(@val[0...b.val])\n\t\telse\n\t\t\tGint.new(@val<b.val)\n\t\tend\n\tend\n\tdef >(b)\n\t\tif b.class == Gint\n\t\t\tfactory(@val[[b.val,-@val.size].max..-1])\n\t\telse\n\t\t\tGint.new(@val>b.val)\n\t\tend\n\tend\n\tdef sort\n\t\tfactory(@val.sort)\n\tend\n\tdef zip\n\t\tr=[]\n\t\t@val.size.times{|x|\n\t\t\t@val[x].val.size.times{|y|\n\t\t\t\t(r[y]||=@val[0].factory([])).val<<@val[x].val[y]\n\t\t\t}\n\t\t}\n\t\tGarray.new(r)\n\tend\n\tdef ~\n\t\tval\n\tend\nend\n\nclass Gstring < Garray\n\tdef initialize(a)\n\t\t@val=case a\n\t\t\twhen NilClass then []\n\t\t\twhen String then a.unpack('C*').map{|i|Gint.new(i)}\n\t\t\twhen Array then a\n\t\t\twhen Garray then a.flatten.val\n\t\tend\n\tend\n\tdef factory(a)\n\t\tGstring.new(a)\n\tend\n\tdef to_gs\n\t\tself\n\tend\n\tdef ginspect\n\t\tfactory(to_s.inspect)\n\tend\n\tdef to_s\n\t\t@val.pack('C*')\n\tend\n\tdef class_id; 2; end\n\tdef coerce(b)\n\t\tif b.class == Gblock\n\t\t\t[to_s.compile,b]\n\t\telse\n\t\t\tb.coerce(self).reverse\n\t\tend\n\tend\n\tdef question(b)\n\t\tif b.class == Gstring\n\t\t\tGint.new(to_s.index(b.to_s)||-1)\n\t\telsif b.class == Garray\n\t\t\tb.question(self)\n\t\telse\n\t\t\tGint.new(@val.index(b)||-1)\n\t\tend\n\tend\n\tdef ~\n\t\tto_s.compile.go\n\t\tnil\n\tend\nend\n\nclass Gblock < Garray\n\tdef initialize(_a,_b=nil)\n\t\t@val=Gstring.new(_b).val\n\t\t@native = eval(\"lambda{#{_a}}\")\n\tend\n\tdef go\n\t\t@native.call\n\tend\n\tdef factory(b)\n\t\tGstring.new(b).to_s.compile\n\tend\n\tdef class_id; 3; end\n\tdef to_gs\n\t\tGstring.new(\"{\"+Gstring.new(@val).to_s+\"}\")\n\tend\n\tdef ginspect\n\t\tto_gs\n\tend\n\tdef coerce(b)\n\t\tb.coerce(self).reverse\n\tend\n\t\n\tdef +(b)\n\t\tif b.class != self.class\n\t\t\ta,b=coerce(b)\n\t\t\ta+b\n\t\telse\n\t\t\tGstring.new(@val+Gstring.new(\" \").val+b.val).to_s.compile\n\t\tend\n\tend\n\tdef *(b)\n\t\tif b.class == Gint\n\t\t\tb.val.times{go}\n\t\telse\n\t\t\tgpush b.val.first\n\t\t\t(b.val[1..-1]||[]).each{|i|$stack<<i; go}\n\t\tend\n\t\tnil\n\tend\n\tdef /(b)\n\t\tif b.class==Garray||b.class==Gstring\n\t\t\tb.val.each{|i|gpush i; go}\n\t\t\tnil\n\t\telse #unfold\n\t\t\tr=[]\n\t\t\tloop{\n\t\t\t\t$stack<<$stack.last\n\t\t\t\tgo\n\t\t\t\tbreak if gpop.notop.val!=0;\n\t\t\t\tr<<$stack.last\n\t\t\t\tb.go\n\t\t\t}\n\t\t\tgpop\n\t\t\tGarray.new(r)\n\t\tend\n\tend\n\tdef %(b)\n\t\tr=[]\n\t\tb.val.each{|i|\n\t\t\tlb=$stack.size\n\t\t\t$stack<<i; go\n\t\t\tr.concat($stack.slice!(lb..$stack.size))\n\t\t}\n\t\tr=Garray.new(r)\n\t\tb.class == Gstring ? Gstring.new(r) : r\n\tend\n\tdef ~\n\t\tgo\n\t\tnil\n\tend\n\tdef sort\n\t\ta=gpop\n\t\ta.factory(a.val.sort_by{|i|gpush i; go; gpop})\n\tend\n\tdef select(a)\n\t\ta.factory(a.val.select{|i|gpush i;go; gpop.notop.val==0})\n\tend\n\tdef question(b)\n\t\tb.val.find{|i|gpush i; go; gpop.notop.val==0}\n\tend\nend\n\nclass NilClass\n\tdef go\n\tend\nend\nclass Array\n\tdef ^(rhs)\n\t\tself-rhs|rhs-self\n\tend\n\tinclude Comparable\nend\ncode=gets(nil)||''\n$_=$stdin.isatty ? '' : $stdin.read\n$stack = [Gstring.new($_)]\n$var_lookup={}\n\ndef var(name,val=nil)\n\teval\"#{s=\"$_#{$var_lookup[name]||=$var_lookup.size}\"}||=val\"\n\ts\nend\n\n$nprocs=0\n\nclass String\n\tdef compile(tokens=scan(/[a-zA-Z_][a-zA-Z0-9_]*|'(?:\\\\.|[^'])*'?|\"(?:\\\\.|[^\"])*\"?|-?[0-9]+|#[^\\n\\r]*|./m))\n\t \torig=tokens.dup\n\t\tnative=\"\"\n\t\twhile t=tokens.slice!(0)\n\t\t\tnative<<case t\n\t\t\t\twhen \"{\" then \"$stack<<\"+var(\"{#{$nprocs+=1}\",compile(tokens))\n\t\t\t\twhen \"}\" then break\n\t\t\t\twhen \":\" then var(tokens.slice!(0))+\"=$stack.last\"\n\t\t\t\twhen /^[\"']/ then var(t,Gstring.new(eval(t)))+\".go\"\n\t\t\t\twhen /^-?[0-9]+/ then var(t,Gint.new(t.to_i))+\".go\"\n\t\t\t\telse; var(t)+\".go\"\n\t\t\t\tend+\"\\n\"\n\t\tend\n\t\tsource=orig[0,orig.size-tokens.size-(t==\"}\"?1:0)]*\"\"\n\t\tGblock.new(native,source)\n\tend\nend\ndef gpop\n\t($lb.size-1).downto(0){|i|\n\t\tbreak if $lb[i]<$stack.size\n\t\t$lb[i]-=1\n\t}\n\t$stack.pop\nend\ndef gpush a\n\t$stack.push(*a) if a\nend\n\nclass String\n\tdef cc\n\t\tGblock.new(self)\n\tend\n\tdef cc1\n\t\t('a=gpop;'+self).cc\n\tend\n\tdef cc2\n\t\t('b=gpop;a=gpop;'+self).cc\n\tend\n\tdef cc3\n\t\t('c=gpop;b=gpop;a=gpop;'+self).cc\n\tend\n\tdef order\n\t\t('b=gpop;a=gpop;a,b=b,a if a.class_id<b.class_id;'+self).cc\n\tend\nend\n\nvar'[','$lb<<$stack.size'.cc\nvar']','gpush Garray.new($stack.slice!(($lb.pop||0)..-1))'.cc\nvar'~','gpush ~a'.cc1\nvar'`','gpush a.ginspect'.cc1\nvar';',''.cc1\nvar'.','$stack<<a<<a'.cc1\nvar'\\\\','$stack<<b<<a'.cc2\nvar'@','$stack<<b<<c<<a'.cc3\nvar'+','gpush a+b'.cc2\nvar'-','gpush a-b'.cc2\nvar'|','gpush a|b'.cc2\nvar'&','gpush a&b'.cc2\nvar'^','gpush a^b'.cc2\nvar'*','gpush a*b'.order\nvar'/','gpush a/b'.order\nvar'%','gpush a%b'.order\nvar'=','gpush a.equalop(b)'.order\nvar'<','gpush a<b'.order\nvar'>','gpush a>b'.order\nvar'!','gpush a.notop'.cc1\nvar'?','gpush a.question(b)'.order\nvar'$','gpush (a.class==Gint ? $stack[~a.val] : a.sort)'.cc1\nvar',','gpush case a\n\twhen Gint then Garray.new([*0...a.val].map{|i|Gint.new(i)})\n\twhen Gblock then a.select(gpop)\n\twhen Garray then Gint.new(a.val.size)\n\tend'.cc1\nvar')','gpush a.rightparen'.cc1\nvar'(','gpush a.leftparen'.cc1\n\nvar'rand','gpush Gint.new(rand([1,a.val].max))'.cc1\nvar'abs','gpush Gint.new(a.val.abs)'.cc1\nvar'print','print a.to_gs'.cc1\nvar'if',\"#{var'!'}.go;(gpop.val==0?a:b).go\".cc2\nvar'do',\"loop{a.go; #{var'!'}.go; break if gpop.val!=0}\".cc1\nvar'while',\"loop{a.go; #{var'!'}.go; break if gpop.val!=0; b.go}\".cc2\nvar'until',\"loop{a.go; #{var'!'}.go; break if gpop.val==0; b.go}\".cc2\nvar'zip','gpush a.zip'.cc1\nvar'base','gpush b.base(a)'.cc2\n\n'\"\\n\":n;\n{print n print}:puts;\n{`puts}:p;\n{1$if}:and;\n{1$\\if}:or;\n{\\!!{!}*}:xor;\n'.compile.go\ncode.compile.go\ngpush Garray.new($stack)\n'puts'.compile.go\n"
  },
  {
    "path": "vendor/grass.rb",
    "content": "#!/usr/bin/ruby -Ku\n#\n# grass.rb - Grass interpreter\n# http://www.blue.sky.or.jp/grass/\n#\n# Copyright (C) 2006, 2007 UENO Katsuhiro. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions\n# are met:\n# 1. Redistributions of source code must retain the above copyright\n#    notice, this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright\n#    notice, this list of conditions and the following disclaimer in\n#    the documentation and/or other materials provided with the\n#    distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS\n# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\n# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# History:\n#\n# 2007-10-02\n#   - Follow the latest changes of the definition of Grass.\n# 2007-09-20\n#   - First version.\n#\n\nrequire 'pp'\n\nclass Grass\n\n  RELEASE_DATE = '2007-10-02'\n\n  class Error < StandardError ; end\n  class RuntimeError < Error ; end\n  class IllegalState < Error ; end\n\n  Machine = Struct.new(:code, :env, :dump)\n\n  class Value\n    def char_code\n      raise RuntimeError, \"not a char\"\n    end\n\n    def app(m, arg)\n      raise RuntimeError, \"app undefined\"\n    end\n  end\n\n  class Insn\n  end\n\n  class App < Insn\n    def initialize(m, n)\n      @m, @n = m, n\n    end\n\n    def eval(m)\n      f, v = m.env[-@m], m.env[-@n]\n      raise \"out of bound\" unless f and v\n      f.app m, v\n    end\n\n    def pretty_print(q)\n      q.text 'App'\n      q.group(4, '(', ')') { q.seplist([@m,@n]) { |i| q.text \"#{i}\" } }\n    end\n    alias inspect pretty_print_inspect\n  end\n\n  class Abs < Insn\n    def initialize(body)\n      @body = body\n    end\n\n    def eval(m)\n      m.env.push Fn.new(@body, m.env.dup)\n    end\n\n    def pretty_print(q)\n      q.text 'Abs'\n      q.group(4, '(', ')') { @body.pretty_print(q) }\n    end\n    alias inspect pretty_print_inspect\n  end\n\n  class Fn < Value\n    def initialize(code, env)\n      @code, @env = code, env\n    end\n\n    def app(m, arg)\n      m.dump.push [m.code, m.env]\n      m.code, m.env = @code.dup, @env.dup\n      m.env.push arg\n    end\n  end\n\n  ChurchTrue  = Fn.new([Abs.new([App.new(3,2)])], [Fn.new([],[])])\n  ChurchFalse = Fn.new([Abs.new([])], [])\n\n  class CharFn < Value\n    def initialize(char_code)\n      @char_code = char_code\n    end\n    attr_reader :char_code\n\n    def app(m, arg)\n      ret = @char_code == arg.char_code ? ChurchTrue : ChurchFalse\n      m.env.push ret\n    end\n  end\n\n  class Succ < Value\n    def app(m, arg)\n      m.env.push CharFn.new((arg.char_code + 1) & 255)\n    end\n  end\n\n  class Out < Value\n    def app(m, arg)\n      $stdout.print arg.char_code.chr\n      $stdout.flush\n      m.env.push arg\n    end\n  end\n\n  class In < Value\n    def app(m, arg)\n      ch = $stdin.getc\n      ret = ch ? CharFn.new(ch) : arg\n      m.env.push ret\n    end\n  end\n\n  private\n\n  def eval(m)\n    while true\n      insn = m.code.shift\n      if insn then\n        insn.eval m\n      else\n        break if m.dump.empty?\n        ret = m.env.last\n        raise IllegalState, \"no return value\" unless ret\n        m.code, m.env = m.dump.pop\n        m.env.push ret\n      end\n    end\n    raise IllegalState, \"illegal final machine state\" unless m.env.size == 1\n    m.env.first\n  end\n\n  InitialEnv = [In.new, CharFn.new(?w.ord), Succ.new, Out.new]\n  InitialDump = [[[], []], [[App.new(1, 1)], []]]\n\n  def start(code)\n    eval Machine.new(code, InitialEnv, InitialDump)\n  end\n\n  def parse(src)\n    code = []\n    src = src.sub(/\\A[^wｗ]*/, '').gsub(/[^wｗWＷvｖ]/, '')\n    src.split(/[vｖ]+/).each { |s|\n      a = s.scan(/[wｗ]+|[WＷ]+/).map { |i| i.split(//).size }\n      arity = 0\n      arity = a.shift if /\\A[wｗ]/ =~ s\n      raise \"parse error at app\" unless a.size % 2 == 0\n      body = []\n      0.step(a.size - 1, 2) { |i| body.push App.new(a[i], a[i+1]) }\n      insn = (0...arity).inject(body) { |body,| [Abs.new(body)] }\n      code.concat insn\n    }\n    code\n  end\n\n  public\n\n  def run(src)\n    start parse(src)\n  end\n\nend\n\nif $0 == __FILE__ then\n  $stderr.puts \"Grass #{Grass::RELEASE_DATE}\" if $VERBOSE\n  Grass.new.run $<.read\nend\n\n\n# Local Variables:\n# coding: utf-8\n# End:\n"
  },
  {
    "path": "vendor/lazyk.c",
    "content": "/*\n *  Lazy K interpreter\n *\n *  Copyright 2008 irori <irorin@gmail.com>\n *  This code is licensed under the MIT License (see LICENSE file for details).\n */\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <ctype.h>\n#include <time.h>\n#include <assert.h>\n#include <stdint.h>\n\n#define VERSION \"1.0.0\"\n\n#define INITIAL_HEAP_SIZE 128*1024\n#define RDSTACK_SIZE\t100000\n\n// Verbosity levels\nenum {\n    V_NONE,\n    V_STATS,\n    V_GC,\n} verbosity = V_NONE;\n\n/**********************************************************************\n *  Storage management\n **********************************************************************/\n\n/* TAG STRUCTURE\n *\n *  -------- -------- -------- ------00   Pair\n *  -------- -------- -------- ------01   Int\n *  -------- -------- -------- ------10   Combinator\n *  -------- -------- -------- -----011   Character\n *  -------- -------- -------- -----111   Miscellaneous\n */\n\nstruct tagPair;\ntypedef struct tagPair *Cell;\n#define CELL(x)\t((Cell)(x))\n#define TAG(c)\t((intptr_t)(c) & 0x03)\n\n/* pair */\ntypedef struct tagPair {\n    Cell car;\n    Cell cdr;\n} Pair;\n#define ispair(c)\t(TAG(c) == 0)\n#define car(c)\t\t((c)->car)\n#define cdr(c)\t\t((c)->cdr)\n#define SET(c,fst,snd)  ((c)->car = (fst), (c)->cdr = (snd))\n\n/* integer */\n#define isint(c)\t(TAG(c) == 1)\n#define mkint(n)\tCELL(((n) << 2) + 1)\n#define intof(c)\t((intptr_t)(c) >> 2)\n\n/* combinator */\n#define iscomb(c)\t(TAG(c) == 2)\n#define mkcomb(n)\tCELL(((n) << 2) + 2)\n#define combof(c)\t((intptr_t)(c) >> 2)\n#define COMB_S\t\tmkcomb(0)\n#define COMB_K\t\tmkcomb(1)\n#define COMB_I\t\tmkcomb(2)\n#define COMB_IOTA\tmkcomb(3)\n#define COMB_KI\t\tmkcomb(4)\n#define COMB_READ\tmkcomb(5)\n#define COMB_WRITE\tmkcomb(6)\n#define COMB_INC\tmkcomb(7)\n#define COMB_CONS\tmkcomb(8)\n\n/* character */\n#define ischar(c)\t(((intptr_t)(c) & 0x07) == 0x03)\n#define mkchar(n)\tCELL(((n) << 3) + 0x03)\n#define charof(c)\t((intptr_t)(c) >> 3)\n\n/* immediate objects */\n#define isimm(c)\t(((intptr_t)(c) & 0x07) == 0x07)\n#define mkimm(n)\tCELL(((n) << 3) + 0x07)\n#define NIL\t\tmkimm(0)\n#define COPIED\t\tmkimm(1)\n#define UNUSED_MARKER\tmkimm(2)\n\nPair *heap_area, *free_ptr;\nint heap_size, next_heap_size;\n\ndouble total_gc_time = 0.0;\n\nvoid gc_run(Cell *save1, Cell *save2);\nvoid rs_copy(void);\nCell copy_cell(Cell c);\n\nvoid errexit(char *fmt, ...)\n{\n    va_list arg;\n    va_start(arg, fmt);\n    vfprintf(stderr, fmt, arg);\n    va_end(arg);\n\n    exit(1);\n}\n\nvoid storage_init(int size)\n{\n    heap_size = size;\n    heap_area = malloc(sizeof(Pair) * heap_size);\n    if (heap_area == NULL)\n        errexit(\"Cannot allocate heap storage (%d cells)\\n\", heap_size);\n    assert(((intptr_t)heap_area & 3) == 0 && (sizeof(Pair) & 3) == 0);\n    \n    free_ptr = heap_area;\n    heap_area += heap_size;\n    next_heap_size = heap_size * 3 / 2;\n}\n\nCell pair(Cell fst, Cell snd)\n{\n    Cell c;\n    if (free_ptr >= heap_area)\n        gc_run(&fst, &snd);\n\n    assert(free_ptr < heap_area);\n    c = free_ptr++;\n    car(c) = fst;\n    cdr(c) = snd;\n    return c;\n}\n\nCell alloc(int n)\n{\n    Cell p;\n    if (free_ptr + n > heap_area)\n        gc_run(NULL, NULL);\n\n    assert(free_ptr + n <= heap_area);\n    p = free_ptr;\n    free_ptr += n;\n    return p;\n}\n\n\nvoid gc_run(Cell *save1, Cell *save2)\n{\n    static Pair* free_area = NULL;\n    int num_alive;\n    Pair *scan;\n    clock_t start = clock();\n\n    if (free_area == NULL) {\n        free_area = malloc(sizeof(Pair) * next_heap_size);\n        if (free_area == NULL)\n            errexit(\"Cannot allocate heap storage (%d cells)\\n\",\n                    next_heap_size);\n    }\n\n    free_ptr = scan = free_area;\n    free_area = heap_area - heap_size;\n    heap_area = free_ptr + next_heap_size;\n\n    rs_copy();\n    if (save1)\n        *save1 = copy_cell(*save1);\n    if (save2)\n        *save2 = copy_cell(*save2);\n\n    while (scan < free_ptr) {\n        car(scan) = copy_cell(car(scan));\n        cdr(scan) = copy_cell(cdr(scan));\n        scan++;\n    }\n\n    num_alive = free_ptr - (heap_area - next_heap_size);\n    if (verbosity >= V_GC)\n        fprintf(stderr, \"GC: %d / %d\\n\", num_alive, heap_size);\n\n    if (heap_size != next_heap_size || num_alive * 8 > next_heap_size) {\n        heap_size = next_heap_size;\n        if (num_alive * 8 > next_heap_size)\n            next_heap_size = num_alive * 8;\n\n        free(free_area);\n        free_area = NULL;\n    }\n\n    total_gc_time += (clock() - start) / (double)CLOCKS_PER_SEC;\n}\n\nCell copy_cell(Cell c)\n{\n    Cell r;\n\n    if (!ispair(c))\n        return c;\n    if (car(c) == COPIED)\n        return cdr(c);\n\n    r = free_ptr++;\n    car(r) = car(c);\n    if (car(c) == COMB_I) {\n        Cell tmp = cdr(c);\n        while (ispair(tmp) && car(tmp) == COMB_I)\n            tmp = cdr(tmp);\n        cdr(r) = tmp;\n    }\n    else\n        cdr(r) = cdr(c);\n    car(c) = COPIED;\n    cdr(c) = r;\n    return r;\n}\n\n/**********************************************************************\n *  Reduction Machine\n **********************************************************************/\n\ntypedef struct {\n    Cell *sp;\n    Cell stack[RDSTACK_SIZE];\n} RdStack;\n\nRdStack rd_stack;\n\nvoid rs_init(void)\n{\n    int i;\n    rd_stack.sp = rd_stack.stack + RDSTACK_SIZE;\n\n    for (i = 0; i < RDSTACK_SIZE; i++)\n        rd_stack.stack[i] = UNUSED_MARKER;\n}\n\nvoid rs_copy(void)\n{\n    Cell *c;\n    for (c = rd_stack.stack + RDSTACK_SIZE - 1; c >= rd_stack.sp; c--)\n        *c = copy_cell(*c);\n}\n\nint rs_max_depth(void)\n{\n    int i;\n    for (i = 0; i < RDSTACK_SIZE; i++) {\n        if (rd_stack.stack[i] != UNUSED_MARKER)\n            break;\n    }\n    return RDSTACK_SIZE - i;\n}\n\nvoid rs_push(Cell c)\n{\n    if (rd_stack.sp <= rd_stack.stack)\n        errexit(\"runtime error: stack overflow\\n\");\n    *--rd_stack.sp = c;\n}\n\n#define TOP\t\t(*rd_stack.sp)\n#define POP\t\t(*rd_stack.sp++)\n#define POP_\t\t(rd_stack.sp++)\n#define PUSH(c)\t\trs_push(c)\n#define PUSHED(n)\t(*(rd_stack.sp+(n)))\n#define DROP(n)\t\t(rd_stack.sp += (n))\n#define ARG(n)\t\tcdr(PUSHED(n))\n#define APPLICABLE(n)\t(bottom - rd_stack.sp > (n))\n\n/**********************************************************************\n *  Loader\n **********************************************************************/\n\nCell read_one(FILE *fp, int i_is_iota);\nCell read_many(FILE *fp, int closing_char);\n\nCell load_program(const char *fname)\n{\n    FILE *fp;\n    Cell c;\n    \n    if (fname == NULL)\n        fp = stdin;\n    else {\n        fp = fopen(fname, \"r\");\n        if (fp == NULL)\n            errexit(\"cannot open %s\\n\", fname);\n    }\n\n    c = read_many(fp, EOF);\n\n    if (fname != NULL)\n        fclose(fp);\n\n    return c;\n}\n\nint next_char(FILE *fp)\n{\n    int c;\n    do {\n        c = fgetc(fp);\n        if (c == '#') {\n            while (c = fgetc(fp), c != '\\n' && c != EOF)\n                ;\n        }\n    } while (isspace(c));\n    return c;\n}\n\nCell read_many(FILE *fp, int closing_char)\n{\n    int c;\n    Cell obj;\n\n    c = next_char(fp);\n    if (c == closing_char)\n        return COMB_I;\n    ungetc(c, fp);\n\n    PUSH(read_one(fp, 0));\n    while ((c = next_char(fp)) != closing_char) {\n        ungetc(c, fp);\n        obj = read_one(fp, 0);\n        obj = pair(TOP, obj);\n        TOP = obj;\n    }\n    return POP;\n}\n\nCell read_one(FILE *fp, int i_is_iota)\n{\n    int c;\n    Cell obj;\n\n    c = next_char(fp);\n    switch (c) {\n    case '`': case '*':\n        PUSH(read_one(fp, c == '*'));\n        obj = read_one(fp, c == '*');\n        obj = pair(TOP, obj);\n        POP_;\n        return obj;\n    case '(':\n        obj = read_many(fp, ')');\n        return obj;\n    case 's': case 'S': return COMB_S;\n    case 'k': case 'K': return COMB_K;\n    case 'i': return i_is_iota ? COMB_IOTA : COMB_I;\n    case 'I': return COMB_I;\n    case '0': case '1': {\n        obj = COMB_I;\n        do {\n            if (c == '0')\n                obj = pair(pair(obj, COMB_S), COMB_K);\n            else\n                obj = pair(COMB_S, pair(COMB_K, obj));\n            c = next_char(fp);\n        } while (c == '0' || c == '1');\n        ungetc(c, fp);\n        return obj;\n    }\n    case EOF:\n        errexit(\"parse error: unexpected EOF\\n\");\n\treturn NULL;\n    default:\n        errexit(\"parse error: %c\\n\", c);\n\treturn NULL;\n    }\n}\n\n/**********************************************************************\n *  Reducer\n **********************************************************************/\n\nint reductions;\n\nvoid eval(Cell root)\n{\n    Cell *bottom = rd_stack.sp;\n    PUSH(root);\n\n    for (;;) {\n        while (ispair(TOP))\n            PUSH(car(TOP));\n\n        if (TOP == COMB_I && APPLICABLE(1))\n        { /* I x -> x */\n            POP_;\n            TOP = cdr(TOP);\n        }\n        else if (TOP == COMB_S && APPLICABLE(3))\n        { /* S f g x -> f x (g x) */\n            Cell a = alloc(2);\n            SET(a+0, ARG(1), ARG(3));\t/* f x */\n            SET(a+1, ARG(2), ARG(3));\t/* g x */\n            DROP(3);\n            SET(TOP, a+0, a+1);\t/* f x (g x) */\n        }\n        else if (TOP == COMB_K && APPLICABLE(2))\n        { /* K x y -> I x */\n            Cell x = ARG(1);\n            DROP(2);\n            SET(TOP, COMB_I, x);\n            TOP = cdr(TOP);\t/* shortcut reduction of I */\n        }\n        else if (TOP == COMB_IOTA && APPLICABLE(1))\n        { /* IOTA x -> x S K */\n            Cell xs = pair(ARG(1), COMB_S);\n            POP_;\n            SET(TOP, xs, COMB_K);\n        }\n        else if (TOP == COMB_KI && APPLICABLE(2))\n        { /* KI x y -> I y */\n            DROP(2);\n            car(TOP) = COMB_I;\n        }\n        else if (TOP == COMB_CONS && APPLICABLE(3))\n        { /* CONS x y f -> f x y */\n            Cell fx, y;\n            fx = pair(ARG(3), ARG(1));\n            y = ARG(2);\n            DROP(3);\n            SET(TOP, fx, y);\n        }\n        else if (TOP == COMB_READ && APPLICABLE(2))\n        { /* READ NIL f -> CONS CHAR(c) (READ NIL) f */\n            intptr_t c = getchar();\n            Cell a = alloc(2);\n            SET(a+0, COMB_CONS, mkchar(c == EOF ? 256 : c));\n            SET(a+1, COMB_READ, NIL);\n            POP_;\n            SET(TOP, a+0, a+1);\n        }\n        else if (TOP == COMB_WRITE && APPLICABLE(1))\n        { /* WRITE x -> putc(eval((car x) INC NUM(0))); WRITE (cdr x) */\n            Cell a = alloc(3);\n            SET(a+0, ARG(1), COMB_K);\t/* (car x) */\n            SET(a+1, a+0, COMB_INC);\t/* (car x) INC */\n            SET(a+2, a+1, mkint(0));\t/* (car x) INC NUM(0) */\n            POP_;\n            eval(a+2);\n\n            if (!isint(TOP))\n                errexit(\"invalid output format (result was not a number)\\n\");\n            if (intof(TOP) >= 256)\n                return;\n\n            putchar(intof(TOP));\n            POP_;\n            a = pair(cdr(TOP), COMB_KI);\n            cdr(TOP) = a;\n        }\n        else if (TOP == COMB_INC && APPLICABLE(1))\n        { /* INC x -> eval(x)+1 */\n            Cell c = ARG(1);\n            POP_;\n            eval(c);\n\n            c = POP;\n            if (!isint(c))\n                errexit(\"invalid output format (attempted to apply inc to a non-number)\\n\");\n            SET(TOP, COMB_I, mkint(intof(c) + 1));\n        }\n        else if (ischar(TOP) && APPLICABLE(2)) {\n            intptr_t c = charof(TOP);\n            if (c <= 0) {  /* CHAR(0) f z -> z */\n                Cell z = ARG(2);\n                DROP(2);\n                SET(TOP, COMB_I, z);\n            }\n            else {       /* CHAR(n+1) f z -> f (CHAR(n) f z) */\n                Cell a = alloc(2);\n                Cell f = ARG(1);\n                SET(a+0, mkchar(c-1), f);\t/* CHAR(n) f */\n                SET(a+1, a+0, ARG(2));\t\t/* CHAR(n) f z */\n                DROP(2);\n                SET(TOP, f, a+1);\t\t/* f (CHAR(n) f z) */\n            }\n        }\n        else if (isint(TOP) && APPLICABLE(1))\n            errexit(\"invalid output format (attempted to apply a number)\\n\");\n        else\n            return;\n        reductions++;\n    }\n}\n\nvoid eval_print(Cell root)\n{\n    eval(pair(COMB_WRITE,\n              pair(root,\n                   pair(COMB_READ, NIL))));\n}\n\n/**********************************************************************\n *  Main\n **********************************************************************/\n\nvoid help(const char *progname) {\n    printf(\"Usage: %s [options] sourcefile\\n\", progname);\n    printf(\"  -h       print this help and exit\\n\");\n    printf(\"  -u       disable stdout buffering\\n\");\n    printf(\"  -v       print version and exit\\n\");\n    printf(\"  -v[0-2]  set verbosity level (default: 0)\\n\");\n}\n\nint main(int argc, char *argv[])\n{\n    Cell root;\n    clock_t start;\n    char *prog_file = NULL;\n    int i;\n    \n    for (i = 1; i < argc; i++) {\n        if (argv[i][0] == '-' && argv[i][1] == 'v' && isdigit(argv[i][2])) {\n            verbosity = argv[i][2] - '0';\n        } else if (strcmp(argv[i], \"-h\") == 0) {\n            help(argv[0]);\n            return 0;\n        } else if (strcmp(argv[i], \"-u\") == 0) {\n            setbuf(stdout, NULL);\n        } else if (strcmp(argv[i], \"-v\") == 0) {\n            printf(\"Lazy K interpreter \" VERSION \" by irori\\n\");\n            return 0;\n        } else if (argv[i][0] == '-') {\n            fprintf(stderr, \"bad option %s  (Try -h for more information).\\n\", argv[i]);\n            return 1;\n        } else {\n            prog_file = argv[i];\n        }\n    }\n\n    storage_init(INITIAL_HEAP_SIZE);\n    rs_init();\n\n    root = load_program(prog_file);\n\n    start = clock();\n    eval_print(root);\n\n    if (verbosity >= V_STATS) {\n        double evaltime = (clock() - start) / (double)CLOCKS_PER_SEC;\n\n        printf(\"\\n%d reductions\\n\", reductions);\n        printf(\"  total eval time --- %5.2f sec.\\n\", evaltime - total_gc_time);\n        printf(\"  total gc time   --- %5.2f sec.\\n\", total_gc_time);\n        printf(\"  max stack depth --- %d\\n\", rs_max_depth());\n    }\n    return 0;\n}\n"
  },
  {
    "path": "vendor/ook-to-bf.rb",
    "content": "RE = /\\G(?:\\s*Ook(?<c1>.)\\s*Ook(?<c2>.)|(?<eof>)\\s*\\z|(?<error>))/\n\nT = {\n  \".?\" => \">\",\n  \"?.\" => \"<\",\n  \"..\" => \"+\",\n  \"!!\" => \"-\",\n  \".!\" => \",\",\n  \"!.\" => \".\",\n  \"!?\" => \"[\",\n  \"?!\" => \"]\",\n}\n\nif $*.size != 2\n  $stderr.puts \"usage: #$0 in.ook out.bf\"\n  exit 1\nend\n\nc = \"\"\nFile.read($*[0]).scan(RE) do\n  if $~[:c1]\n    c << T[$~[:c1] + $~[:c2]]\n  elsif $~[:error]\n    raise \"Ook? Ook? Ook?\"\n  end\nend\nFile.write($*[1], c)\n"
  },
  {
    "path": "vendor/subleq.rb",
    "content": "IN_ADDR = -1\nOUT_ADDR = -1\n\nmem = File.read(ARGV[0]).split.map do |v|\n  if v.start_with?(?#)\n    case v\n    when \"#IN\"  then IN_ADDR\n    when \"#OUT\" then OUT_ADDR\n    else raise \"Unresolved register: #{ v }\"\n    end\n  else\n    v.to_i\n  end\nend\n\nip = 0\nwhile 0 <= ip && ip < mem.size\n  a, b, c = mem[ip], mem[ip + 1], mem[ip + 2]\n  ip += 3\n\n  if a == IN_ADDR\n    ma = -($stdin.getc || -1).ord\n  else\n    ma = mem[a]\n  end\n\n  if b == OUT_ADDR\n    putc ma\n  else\n    mb = mem[b] -= ma\n    ip = c if mb <= 0\n  end\nend\n"
  },
  {
    "path": "vendor/thue.rb",
    "content": "RE = /^\\s*::=.*\\n(?<body>(?m:.*))|^(?<lhs>.+?)::=(?<rhs>.*)$/\n\nrules, body = {}, \"\"\nFile.binread($*[0]).scan(RE) do\n  $~[:lhs] ? rules[$~[:lhs]] = $~[:rhs] : body = $~[:body].delete(\"\\n\")\nend\n\nloop do\n  #puts body\n  targets = []\n  rules.each do |lhs, rhs|\n    pos = 0\n    while npos = body.index(lhs, pos)\n      targets << [npos, lhs, rhs]\n      pos = npos + 1\n    end\n  end\n  break if targets.empty?\n  pos, lhs, rhs = targets.sample\n  case rhs\n  when \":::\" then rhs = gets\n  when /^~/ then print $'; rhs = \"\"\n  end\n  body[pos, lhs.size] = rhs\nend"
  },
  {
    "path": "vendor/unlambda.rb",
    "content": "tokens = [] \nFile.read($*[0]).scan(/\\.(?<out>.)|(?<insn>[r`ikscd])|#.*/) do\n  if $~[:out]\n    tokens << [:o, $~[:out]]\n  elsif $~[:insn]\n    case $~[:insn]\n    when ?r then tokens << [:o, ?\\n]\n    when ?` then tokens << :a\n    else tokens << $~[:insn].to_sym\n    end\n  end\nend\ntokens.reverse!\n\nstack = [nil, :S]\nacc = nil\nwhile stack\n  stack, cmd = stack\n  acc = if cmd == :S\n    stack = [stack, acc] if acc\n    insn, arg = tokens.pop\n    case insn\n    when :o then [:o, arg]\n    when :a then stack = [[stack, :S], :S]; nil\n    when nil then raise \"EOF\"\n    else [insn]\n    end\n  else\n    [:a, cmd, acc]\n  end\nend\n\nstack = [nil, :E, acc]\nacc = nil\nwhile stack\n  stack, cmd, cls = stack\n  acc = if cmd == :E\n    if acc && acc[0] == :d\n      [:d1, cls]\n    else\n      stack = [stack, :A, acc] if acc\n      cls[0] == :a ? (stack = [[stack, :E, cls[2]], :E, cls[1]]; nil) : cls\n    end\n  else\n    type, x, y = cls\n    case type\n    when :o  then print x; acc\n    when :i  then acc\n    when :k  then [:k1, acc]\n    when :k1 then x\n    when :s  then [:s1, acc]\n    when :s1 then [:s2, x, acc]\n    when :s2 then stack = [stack, :E, [:a, [:a, x, acc], [:a, y, acc]]]; nil\n    when :c  then stack = [stack, :A, acc]; [:c1, stack[0]]\n    when :c1 then stack = x; acc\n    when :d  then acc\n    when :d1 then stack = [stack, :E, [:a, x, acc]]; nil\n    end\n  end\nend\n"
  },
  {
    "path": "vendor/wasi-runtime.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst { WASI } = require('wasi');\nconst wasi = new WASI({ version: \"preview1\" });\nconst importObject = { wasi_snapshot_preview1: wasi.wasiImport };\n\n(async () => {\n  const wasm = await WebAssembly.compile(fs.readFileSync(process.argv[2]));\n  const instance = await WebAssembly.instantiate(wasm, importObject);\n  wasi.start(instance);\n})();\n"
  },
  {
    "path": "vendor/whitespace.rb",
    "content": "RE = /\\G(?<num>[01]+){0}(?<label>[01]*){0}\n  ( 00  (?<push> )\\g<num>2\n  | 010 (?<copy> )\\g<num>2\n  | 012 (?<slide>)\\g<num>2\n  | 020 (?<dup>)\n  | 021 (?<swap>)\n  | 022 (?<pop>)\n  | 1000(?<add>)\n  | 1001(?<sub>)\n  | 1002(?<mul>)\n  | 1010(?<div>)\n  | 1011(?<mod>)\n  | 110 (?<set>)\n  | 111 (?<get>)\n  | 1200(?<outc>)\n  | 1201(?<outn>)\n  | 1210(?<readc>)\n  | 1211(?<readn>)\n  | 200 (?<mark>)\\g<label>2\n  | 201 (?<call>)\\g<label>2\n  | 202 (?<jump>)\\g<label>2\n  | 210 (?<jz>)\\g<label>2\n  | 211 (?<jn>)\\g<label>2\n  | 212 (?<ret>)\n  | 222 (?<end>)\n  |     (?<eof>)\\z\n  |     (?<error>)\n  )/x\n\nnames = RE.names.map {|n| n.to_sym } - [:num, :label]\ncode, labels = [], {}\nFile.read($*[0]).gsub(/[^ \\t\\n]/m, \"\").tr(\" \\t\\n\", \"012\").scan(RE) do\n  insn = names.find {|n| $~[n] }\n  arg = $~[:num]\n  arg = arg[1..-1].to_i(2) * (arg[0] == ?0 ? 1 : -1) if arg\n  arg = $~[:label] if $~[:label]\n  raise \"Unrecognised input\" if insn == :error\n  insn == :mark ? labels[arg] = code.size : code << [insn, arg]\nend\n\ndef read_int\n  s = \"\"\n  while true\n    ch = $stdin.getc\n    case ch\n    when /\\d+/ then s << ch\n    when /\\s+/ then break\n    else raise \"Integer expected\"\n    end\n  end\n  s.to_i\nend\n\npc, call, stack, heap = 0, [], [], Hash.new(0)\nloop do\n  insn, arg = code[pc]\n  pc += 1\n  case insn\n  when :push  then stack << arg\n  when :dup   then stack << stack.last\n  when :copy  then stack << stack[-arg - 1]\n  when :slide then n = stack.pop; stack.pop(arg); stack << n\n  when :swap  then n = stack.pop; m = stack.pop; stack << n << m\n  when :pop   then stack.pop\n  when :add   then n = stack.pop; stack << stack.pop + n\n  when :sub   then n = stack.pop; stack << stack.pop - n\n  when :mul   then n = stack.pop; stack << stack.pop * n\n  when :div   then n = stack.pop; stack << stack.pop / n\n  when :mod   then n = stack.pop; stack << stack.pop % n\n  when :set   then n = stack.pop; heap[stack.pop] = n\n  when :get   then stack << heap[stack.pop]\n  when :outc  then putc stack.pop\n  when :readc then heap[stack.pop] = $stdin.getc.ord\n  when :outn  then print stack.pop\n  when :readn then heap[stack.pop] = read_int\n  when :call  then call << pc; pc = labels[arg]\n  when :jump  then pc = labels[arg]\n  when :jz    then pc = labels[arg] if stack.pop == 0\n  when :jn    then pc = labels[arg] if stack.pop <  0\n  when :ret   then pc = call.pop\n  when :end   then break\n  when :eof   then raise(\"Reached EOF\")\n  end\nend\n"
  }
]