From 0e848c5e7beb46c6fd67304666091915f759de8d Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 14:44:03 -0700 Subject: [PATCH 01/19] Change cosmo '$' escape string in markdown renderer so that we can put 2 selectors next to each other and still be able to tell where one ends and the other one begins --- renderers/markdown.moon | 74 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/renderers/markdown.moon b/renderers/markdown.moon index 765ed9e..93cc393 100644 --- a/renderers/markdown.moon +++ b/renderers/markdown.moon @@ -1,5 +1,70 @@ Path = require "sitegen.path" +dollar_temp = "z000sitegen_markdown00dollar0000" + +-- a constructor for quote delimited strings +simple_string = (delim) -> + import P from require "lpeg" + + inner = P("\\#{delim}") + "\\\\" + (1 - P delim) + inner = inner^0 + P(delim) * inner * P(delim) + +lua_string = -> + import P, C, Cmt, Cb, Cg from require "lpeg" + check_lua_string = (str, pos, right, left) -> + #left == #right + + string_open = P"[" * P"="^0 * "[" + string_close = P"]" * P"="^0 * "]" + + valid_close = Cmt C(string_close) * Cb"string_open", check_lua_string + + Cg(string_open, "string_open") * + (1 - valid_close)^0 * string_close + +-- returns a pattern that parses a cosmo template. Can be used to have +-- pre-processors ignore text that would be handled by cosmo +parse_cosmo = -> + import P, R, Cmt, Cs, V from require "lpeg" + curly = P { + P"{" * ( + simple_string("'") + + simple_string('"') + + lua_string! + + V(1) + + (P(1) - "}") + )^0 * P"}" + } + + alphanum = R "az", "AZ", "09", "__" + P"$" * alphanum^1 * (curly)^-1 + +escape_cosmo = (str) -> + escapes = {} + import P, R, Cmt, Cs, V from require "lpeg" + + counter = 0 + + cosmo = parse_cosmo! / (tpl) -> + counter += 1 + key = "#{dollar_temp}.#{counter}" + escapes[key] = tpl + key + + patt = Cs (cosmo + P(1))^0 * P(-1) + str = patt\match(str) or str, escapes + str, escapes + +unescape_cosmo = (str, escapes) -> + import P, R, Cmt, Cs from require "lpeg" + + escape_patt = P(dollar_temp) * P(".") * R("09")^1 / (key) -> + escapes[key] or error "bad key for unescape_cosmo" + + patt = Cs (escape_patt + P(1))^0 * P(-1) + assert patt\match(str) + needs_shell_escape = (str) -> not not str\match "[^%w_-]" shell_escape = (str) -> str\gsub "'", "''" @@ -21,10 +86,13 @@ write_exec = (cmd, content) -> -- config command like this in site.moon: -- require("renderers.markdown").cmd = "pandoc --mathjax >" -class PandocRenderer extends require "sitegen.renderers.markdown" - unescape_cosmo = @unescape_cosmo - escape_cosmo = @escape_cosmo +class PandocRenderer extends require "sitegen.renderers.html" + @escape_cosmo: escape_cosmo + @unescape_cosmo: unescape_cosmo + @parse_cosmo: parse_cosmo + source_ext: "md" + ext: "html" cmd: "pandoc --mathjax --lua-filter pygments.lua >" pandoc: (content) => Path.read_file write_exec @@cmd, content -- 2.39.5 From 4ad479f8f9587d81a40757ff2a5f376061806224 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 14:47:23 -0700 Subject: [PATCH 02/19] Update commands in README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 53baf11..5b06add 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,13 @@ $ make build +### build a single file + + $ make build file=index.html + ### start dev server - $ make + $ make serve Visit `localhost:8080` in web browser -- 2.39.5 From 95b3589d22815682f6316bcbe12763ba63fe0cf4 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Sat, 21 Jun 2025 18:49:20 -0700 Subject: [PATCH 03/19] Add markdown file --- posts/2025-06-18-test-nginx-conf-directives.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 posts/2025-06-18-test-nginx-conf-directives.md diff --git a/posts/2025-06-18-test-nginx-conf-directives.md b/posts/2025-06-18-test-nginx-conf-directives.md new file mode 100644 index 0000000..e69de29 -- 2.39.5 From b7e6a93bf992eb3483d033f43b98817230c8da7e Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 14:49:33 -0700 Subject: [PATCH 04/19] Add post draft --- html/images/openresty-splash-page.png | Bin 0 -> 70330 bytes .../2025-06-22-test-nginx-conf-directives.md | 415 ++++++++++++++++++ 2 files changed, 415 insertions(+) create mode 100644 html/images/openresty-splash-page.png create mode 100644 posts/2025-06-22-test-nginx-conf-directives.md diff --git a/html/images/openresty-splash-page.png b/html/images/openresty-splash-page.png new file mode 100644 index 0000000000000000000000000000000000000000..deb1443fba6a4d634cac0130d05b54b263f2a08f GIT binary patch literal 70330 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 + + + + + + + + hello world! + + +``` + +Start nginx: + +```console +$ docker run --rm -it -p 80:80 \ +-v $PWD/conf/conf.d:/etc/nginx/conf.d -v $PWD/html:/var/www \ +openresty/openresty:bookworm-buildpack +``` + +Then, in another console: + +```console +$ curl -v localhost +* Trying 127.0.0.1:80... +* Connected to localhost (127.0.0.1) port 80 (#0) +> GET / HTTP/1.1 +> Host: localhost +> User-Agent: curl/7.88.1 +> Accept: */* +> +< HTTP/1.1 200 OK +< Server: openresty/1.27.1.2 +< ... +< + + + ... + + hello world! + + +``` + +If we wanted to write a test for that, we need some packages from `luarocks`. + +`Dockerfile` + +```Dockerfile +FROM openresty/openresty:bookworm-buildpack + +WORKDIR /opt/app + +# needed for testing +RUN luarocks install busted +RUN luarocks install luajit-curl +RUN luarocks install luasocket # needed for testing nginx reverse proxy +``` + +```console +$ docker build -t test-nginx . +$ mkdir spec +``` + +`spec/nginx_spec.moon` + +```moonscript +http = require "luajit-curl-helper.http" + +req = (url) -> + request = http.init url + st = request\perform! + error request\lastError! if not st + request + +describe "http://localhost", -> + it "sends /index.html", -> + request = req "http://localhost" + assert.same request\statusCode!, 200 + assert.same request\statusMessage!, "OK" + assert.same request\body!\match("%s+(.-)%s+"), "hello world!" +``` + +Start the test server: + +```console +$ ct=$(docker run --rm -d \ +-v $PWD/conf/conf.d:/etc/nginx/conf.d \ +-v $PWD/html:/var/www \ +-v $PWD:/opt/app \ +test-nginx) +``` + +Run the tests. + +```console +$ docker exec -t $ct busted +● +1 success / 0 failures / 0 errors / 0 pending : 0.008246 seconds +``` + +Stop the test server. + +```console +$ docker exec -t $ct openresty -s stop +``` + +## Edit hosts + +Instead of `localhost` we'd like to use an actual domain name. We can do this +with the `--add-host` option. But before we do that, we want to make sure our +container does not have access to the internet, otherwise we might +unintentionally get a response from a domain's server on the internet rather +than from our test server. + +$ docker network create --internal no-internet + +Now we can start the test server with our host: + +```console +$ ct=$(docker run --rm -d \ +-v $PWD/conf/conf.d:/etc/nginx/conf.d \ +-v $PWD/html:/var/www \ +-v $PWD:/opt/app \ +--network no-internet \ +--add-host=domain.abc=127.0.0.1 \ +test-nginx) +``` + +Update our test + + request = req "http://localhost" + +to + + request = req "http://domain.abc" + +Run the tests. + +```console +$ docker exec -t $ct busted +● +1 success / 0 failures / 0 errors / 0 pending : 0.008246 seconds +``` + +Stop the test server. + +```console +$ docker exec -t $ct openresty -s stop +``` + +## Add a test to make sure the test server is offline + +```moonscript +describe "test environment", -> + it "can't connect to the internet", -> + assert.has_error (-> req "http://example.org"), + "Couldn't resolve host name" +``` + +## Create a Makefile + +Let's create a `Makefile` to make running all these commands easier. + +`Makefile` + +```Makefile +image = test-nginx +loopback = 127.0.0.1 + +image-build: + docker build -t $(image) . + +image-rm: + docker image rm $(image) + +test: + @ct=$(shell docker run --rm -d \ + -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ + -v $(PWD)/html:/var/www \ + -v $(PWD):/opt/app \ + --network no-internet \ + --add-host=domain.abc=$(loopback) \ + $(image)); \ + docker exec -t $$ct busted; \ + docker exec $$ct openresty -s stop +``` + +Now we can run tests by running `make test`. + +```console +$ make test +●● +2 successes / 0 failures / 0 errors / 0 pending : 0.008812 seconds +``` + +## SSL + +We want our server to redirect all `http` requests to `https`. + +Our test: + +```moonscript +describe "http://domain.abc", -> + it "redirects to https", -> + request = req "http://domain.abc" + assert.same request\statusCode!, 301 + assert.same request\statusMessage!, "Moved Permanently" + assert.same request\header!.Location, "https://domain.abc/" +``` + +```console +$ make test +●●◼ +2 successes / 1 failure / 0 errors / 0 pending : 0.010449 seconds + +Failure → .../luajit/lib/luarocks/rocks-5.1/busted/2.2.0-1/bin/busted @ 3 +http://domain.abc redirects to https +spec/nginx_spec.moon:24: Expected objects to be the same. +Passed in: +(number) 301 +Expected: +(number) 200 +``` + +Make self-signed certs in Dockerfile: + +```Dockerfile +RUN openssl req -x509 -newkey rsa:4096 -nodes \ + -keyout /etc/ssl/private/domain.abc.pem \ + -out /etc/ssl/certs/domain.abc.pem \ + -sha256 -days 365 -subj '/CN=domain.abc' \ + -addext "subjectAltName=DNS:domain.abc" +``` + +Edit `default.conf`: + +``` +server { + listen 80; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name domain.abc; + ssl_certificate /etc/ssl/certs/domain.abc.pem; + ssl_certificate_key /etc/ssl/private/domain.abc.pem; +``` + +Rebuild the image: + +```console +$ make image-rm +$ make image-build +``` + +Run tests: + +```console +$ make test +●◼● +2 successes / 1 failure / 0 errors / 0 pending : 0.009618 seconds + +Failure → .../luajit/lib/luarocks/rocks-5.1/busted/2.2.0-1/bin/busted @ 3 +http://domain.abc sends /index.html +spec/nginx_spec.moon:17: Expected objects to be the same. +Passed in: +(number) 200 +Expected: +(number) 301 +``` + +Fix test: + +```moonscript +describe "https://domain.abc", -> + it "sends /index.html", -> + request = req "https://domain.abc" +``` + +Run tests: + +```console +$ make test +●●● +3 successes / 0 failures / 0 errors / 0 pending : 0.017065 seconds +``` + +## Reverse proxy a subdomain to a Gitea unix socket + +Add to `default.conf`: + +``` +server { + listen 443 ssl; + server_name git.domain.abc; + + location / { + client_max_body_size 1024M; + proxy_pass http://unix:/run/gitea/gitea.socket; + proxy_set_header Connection $http_connection; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +Add subdomain to certs in Dockerfile: + +``` + -addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" +``` + +Add a test socket server: + +`spec/unixstreamsrvr.moon` + +```moonscript +-- modified from +-- https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua +socket = require "socket" +socket.unix = require "socket.unix" +u = assert socket.unix.stream! +assert u\bind "/run/gitea/gitea.socket" +assert u\listen! +assert u\settimeout 1 +c = assert u\accept! + +while true + m = assert c\receive! + break if m == "" + print m +``` + +Add a spec: + +```moonscript +describe "https://git.domain.abc", -> + it "reverse-proxies request to a gitea unix socket", -> + Path = require "sitegen.path" + socket_fname = "unixstreamsrvr.moon" + socket_dir = "/run/gitea" + socket_owner = "nobody" + basepath = Path.basepath debug.getinfo(1).short_src + + Path.exec "install", "-o", socket_owner, "-d", socket_dir + cmd = "su -s /bin/bash -c 'moon %s' %s" + server = io.popen cmd\format Path.join(basepath, socket_fname), socket_owner + Path.exec "sleep", "0.1" + result = Path.read_exec "find", socket_dir, "-type", "s", "-ls" + assert.truthy result\match "nobody%s+nogroup.+" .. Path.join(socket_dir, "gitea.socket") + + req "https://git.domain.abc" + + reqheader = with server\read "*a" + server\close! + + assert.truthy reqheader\match "Host: git.domain.abc" +``` + +Edit Makefile: + + --add-host=git.domain.abc=$(loopback) \ + + +```console +$ make image-rm image-build +``` + +```console +$ make test +●●●● +4 successes / 0 failures / 0 errors / 0 pending : 0.131619 seconds +``` + + +## Conclusion + + -- 2.39.5 From dce537b50c866e4250b745858d74cf549bd37002 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 15:25:08 -0700 Subject: [PATCH 05/19] Delete duplicate post --- html/.gitignore | 1 + posts/2025-06-18-test-nginx-conf-directives.md | 0 site.moon | 1 - 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 posts/2025-06-18-test-nginx-conf-directives.md diff --git a/html/.gitignore b/html/.gitignore index 628bfae..8d3b786 100644 --- a/html/.gitignore +++ b/html/.gitignore @@ -15,4 +15,5 @@ posts/resize-a-qemu-disk-image.html posts/set-up-a-gitweb-server.html posts/start-erlangs-dialyzer-with-gui-from-a-docker-container.html posts/test-mix-task-file-modify.html +posts/test-nginx-conf-directives.html pygments.css \ No newline at end of file diff --git a/posts/2025-06-18-test-nginx-conf-directives.md b/posts/2025-06-18-test-nginx-conf-directives.md deleted file mode 100644 index e69de29..0000000 diff --git a/site.moon b/site.moon index 1d889a6..4bfdca5 100644 --- a/site.moon +++ b/site.moon @@ -29,7 +29,6 @@ get_files = (path, prefix=path) -> files = for file in *files file\gsub "^#{escape_patt prefix}/?", "" - table.sort files files -- strip file extension from filename -- 2.39.5 From c26453415d84aa33f456e011435c18551e8f6367 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 15:49:54 -0700 Subject: [PATCH 06/19] Clean up last spec --- .../2025-06-22-test-nginx-conf-directives.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index 7cdbbcc..940dab4 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -372,19 +372,19 @@ Add a spec: ```moonscript describe "https://git.domain.abc", -> - it "reverse-proxies request to a gitea unix socket", -> - Path = require "sitegen.path" - socket_fname = "unixstreamsrvr.moon" - socket_dir = "/run/gitea" - socket_owner = "nobody" - basepath = Path.basepath debug.getinfo(1).short_src + it "reverse-proxy's request to a gitea unix socket", -> + socket = fname: "unixstreamsrvr.moon", dir: "/run/gitea", owner: "nobody" + basepath = debug.getinfo(1).short_src\match"^(.*)/[^/]*$" or "." + seconds = 0.1 - Path.exec "install", "-o", socket_owner, "-d", socket_dir + os.execute "install -o #{socket.owner} -d #{socket.dir}" cmd = "su -s /bin/bash -c 'moon %s' %s" - server = io.popen cmd\format Path.join(basepath, socket_fname), socket_owner - Path.exec "sleep", "0.1" - result = Path.read_exec "find", socket_dir, "-type", "s", "-ls" - assert.truthy result\match "nobody%s+nogroup.+" .. Path.join(socket_dir, "gitea.socket") + server = io.popen cmd\format "#{basepath}/#{socket.fname}", socket.owner + os.execute "sleep #{seconds}" + f = io.popen "find #{socket.dir} -type s -ls", "r" + result = with f\read "*a" + f\close! + assert.truthy result\match "nobody%s+nogroup.+#{socket.dir}/gitea.socket" req "https://git.domain.abc" -- 2.39.5 From 766c9bad627e43ea337ad2dc6a9873794e7dda54 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Wed, 25 Jun 2025 21:10:23 -0700 Subject: [PATCH 07/19] Use '_' instead of '.' for numbering cosmo escapes because it gets syntax highlighted weird because '.' is not valid for like a variable name so the syntax highlighter is splitting the escape phrase at the '.' which means that phrase won't match when unescaped so it fails to get unescaped for example, this would fail: ``` $$ct ``` --- posts/2025-06-22-test-nginx-conf-directives.md | 3 +++ renderers/markdown.moon | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index 940dab4..b7ea346 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -398,11 +398,14 @@ Edit Makefile: --add-host=git.domain.abc=$(loopback) \ +Rebuild image: ```console $ make image-rm image-build ``` +Run tests: + ```console $ make test ●●●● diff --git a/renderers/markdown.moon b/renderers/markdown.moon index 93cc393..131ddad 100644 --- a/renderers/markdown.moon +++ b/renderers/markdown.moon @@ -48,7 +48,7 @@ escape_cosmo = (str) -> cosmo = parse_cosmo! / (tpl) -> counter += 1 - key = "#{dollar_temp}.#{counter}" + key = "#{dollar_temp}_#{counter}" escapes[key] = tpl key @@ -59,7 +59,7 @@ escape_cosmo = (str) -> unescape_cosmo = (str, escapes) -> import P, R, Cmt, Cs from require "lpeg" - escape_patt = P(dollar_temp) * P(".") * R("09")^1 / (key) -> + escape_patt = P(dollar_temp) * P("_") * R("09")^1 / (key) -> escapes[key] or error "bad key for unescape_cosmo" patt = Cs (escape_patt + P(1))^0 * P(-1) @@ -84,8 +84,6 @@ write_exec = (cmd, content) -> fname --- config command like this in site.moon: --- require("renderers.markdown").cmd = "pandoc --mathjax >" class PandocRenderer extends require "sitegen.renderers.html" @escape_cosmo: escape_cosmo @unescape_cosmo: unescape_cosmo -- 2.39.5 From eb896676cc2ce25f0d3414b874d46cd26c978263 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Thu, 26 Jun 2025 13:15:40 -0700 Subject: [PATCH 08/19] Add a renderer spec for escape and undescape double dollar signs (`$$name`) --- spec/renderers_spec.moon | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/renderers_spec.moon b/spec/renderers_spec.moon index ca821fa..ee4e3ff 100644 --- a/spec/renderers_spec.moon +++ b/spec/renderers_spec.moon @@ -86,3 +86,11 @@ this code block has no label assert.same [[
<.greet name="Jane"/>
]], out + + it "escapes and unescapes double dollar signs", -> + out = flatten_html render [[ +```Makefile + $$name +```]] + + assert.same [[
$$name
]], out -- 2.39.5 From 82f4e9c92e692a68c5f2cdeeffa7e8d8d0568137 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Thu, 26 Jun 2025 13:19:15 -0700 Subject: [PATCH 09/19] Assert /posts/index.html exists before request in nginx spec --- spec/nginx_spec.moon | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/nginx_spec.moon b/spec/nginx_spec.moon index dfd8403..a5ef9d8 100644 --- a/spec/nginx_spec.moon +++ b/spec/nginx_spec.moon @@ -104,6 +104,10 @@ describe "https://miti.sh/posts/", -> describe "https://miti.sh/posts", -> it "sends /posts/index.html", -> + with require "sitegen.path" + assert .exists("html/posts/index.html"), + "missing html/posts/index.html (try `make build file=blog.html`)" + request = req "https://miti.sh/posts" assert.same request\statusCode!, 200 assert.same request\statusMessage!, "OK" -- 2.39.5 From ca15a32429d9dc0c7225af725793145213561685 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Thu, 26 Jun 2025 13:20:01 -0700 Subject: [PATCH 10/19] Edit post --- posts/2025-06-22-test-nginx-conf-directives.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index b7ea346..ef9a5a7 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -416,3 +416,7 @@ $ make test ## Conclusion +## Bonus!: Issues We Ran Into Just Trying To Make This Post + +1. `$host$request_uri` +2. `$$ct` -- 2.39.5 From 3cb0b83e8ab0299df3c1763977551fd0aa2cfe92 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Thu, 26 Jun 2025 13:41:35 -0700 Subject: [PATCH 11/19] Update image in post --- html/images/openresty-default-index-page.png | Bin 0 -> 50282 bytes posts/2025-06-22-test-nginx-conf-directives.md | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 html/images/openresty-default-index-page.png diff --git a/html/images/openresty-default-index-page.png b/html/images/openresty-default-index-page.png new file mode 100644 index 0000000000000000000000000000000000000000..3705222b9a7287eb84d7bcb4c78f262a61468828 GIT binary patch literal 50282 zcmd3O1y@yF*e!^3qmoim(%mU3Ez;c_y1S(tBt#lSKw7%HyQI6jyYJ$?_xlTXd}j;> z0%vd5UNN5;4~Bk`lR!nnM}mTaLY4e1`V|TaS|1AP6)gfB_>RE8k3!(nYX@OTB?R#D zL@){gU*kE7sW~dzm^ixV+Z#hctZl4}=^YI1jg74xOl=&GVOj*ho9JKOBw}x@?`URY zO`>FGWelZc>O{iAK_ca3O~S&&!cM}(%)`pY!^TSTMV91?sFKQX;W88y36!MhCneX^ zgESXcCFQ#w!HIDXo8Pg*pFjIyxW`d`_}KNzK$T9-*{ZPNiLT*lvZ|zzp(`lu*DpV* z<1A_4w+NCXkuf@X#@;@iC=Pk#aWPE&=_BWZtPaZ_BizUQ4%;3hUh;T&B=AO+6SEDs z5Y79dCYLL95)1@yM%?-v%frQoiefL7Wn!$QKShDX(`Li1oH#lqx(R>0vqV;(n7v5>z)B(*V)lFM z{KbZnZiMvu9-XSzdBwc+1{U+Lz6sfq?$Ti|B>k*T^7@f9%QOpllQZiKS+lsaw#Z;- z?(T<7xSXHCzWSC~T2}MUQZ|4$K*jn@-Q;Y^gp5&jSdZEc<2rstY;HDwpPvsXsn4F`Kjim0g%uZW43*k>f4o12TK zn6LDSo}PZ^(w(&R)wdO&ShT~5{Yz6e{M58GFF)`aPUU_BYXlv6Wt0u2Y_MkPY(l+{=jT!XNL$2r$^n4oorz- zS6=6SkB0)Mtn1k7b+Zb8aZKE^9{rp^uUUWt9{AWuwDeB-m+P!3<0? zaSR+BX=UYi+}zxa&rb&Z{r&EJhWEEC{yCjJJp?uT`}^E>Yp9hv z+)HqEb!9Rek0(kn8@V(dC|!Ce;k`NOFcy`NV0GGK)6mqUx3rk@^!Vh1zIEw9>K&~; zSy;uxl9QPU1qR~h@2~K24kzi~{-u(V(&*frl%-`6zcm;1Q{{f%tqgCU5r-zT{`nXt zVaJSnT2T=l)K^8tNDfX;PB`@8){YMUv1|#+D0yju3(b0duhpmyw};anwHoWHpGH3Uf+3EUO>(ijV7I}3}f1u!<> zphSvCg8foDJux@ef3}(NMMcG+lz_0qM;4x24ORLl9%>rCO0- zZ?R&PxcK-GsT|?LNfx7C3=}w+LY3mJWQ!6?R)>$vKF=_in3y;B_Z9jbaO;La;o-Xs2@)HZz_JKL$4G)NJ_`^W;cBehhg-g``&Rh^MZu-n(gUU8@hR zm@7ld#TC-tF8qT|y?Z!~H*(kKc9V+3YEDL48hO1tQmoX*aI;_8a|&~bBdairJ%6|3V82H0K)G?0TC<^|7lSy6HEv48(Q z>+5663*5d%7r22GI@LJtVqv{`Q@fq+!R`3x@!s{MO^_8bY`NcXxr9!z3QIXJMawqET1tKZ?en}buv9(mUW z|2&xH!XTRUrQB-XSxZ~n%-WjcNVE0?4Iq4j3*>uDOe<|^ql|_|GI_Mw1cTwsUl}Ci za0G;t?UDxUv(?}MTYLL8u(3P4yU(s$o(ZX_@~m%b?bgMSkdUC%n%vn3et40b&J!&| z-CgbngAp<^M$gS@gg>Tm+CY;~QqGyCa31r-#>URn*a)_@ed0Uo?TEl*t=GKdvzlWQ zk9yzN7Z>R2;o&eq&&g{3?{ncYjF6UA(J8#cN^2X#03tH-`Yh!6TT6=|*!2bzxkLY^ zrxjIIAr(g)mNQT!h%FJg%&FiPq7m}^qg_P+*dQK(I~@83_U7)+cE7lW37oCgE0?)h z7t}N#;;gJJuNcSqpKnwe3ja9D|F zePOa$a$0blh~zI}^zhv4bJDZ%f>KgZDK{N!dW((Ctk((^8y81SO})D0alCJ>8&;gv z;_Nh-6mFj}95&G3Zvdtfpd>dy-?B1hI^8Ggx;i%{W#yMWYs8XtD&5;Z=ijE6>GS*q zp2Lrj*ZJh1qCCvX+S*_M;+v3=kQhE5TogD^D{IgCliuQFtOXHR$MXfj!Pgw~x}A~N zEV&c#q(vpMLQZB3ee|Cm+`wrZb+t4!B%9XeByQ3fA#_<7rmtBTL>GK$4QFgdY0b;< z7It)G`~LkqxN(EmLap7KHZ-s z)aU9%I`w`4Ck=FY+1bA{SIB8qOMX{gETFfmEEemwe0#ZoRD@x*M&EwCezs6Z=f5LFW-Ab!FEzR$ z!})*v^XGHxll#=}MYsE*shJvYkJJ7XX(H`UJ~ynKoSg0{Db-CQ2*lxRLz0Cx`0R38 z*Y3=Sl-T=*RPgblV)Fcet0y(}J=oTEE-sLplPhdh31s!`v9%4OTmOsG)0fKgeWv+t z&%)f?oGxn8+^L(`$@vO1v#H8O!12lp3VS>C2S=|I-^{p482_{~qy^9Pc%bfXkDHtd zy>ogRK1n91#$|ij3Gy=g{B>vt`O#=#>N9+v@DLFZyWzwwE$K46s#Et%QkDrZtEZ5v zF^qE5Uumuf-p9vL$=hEYsKcR3<&>156{`%Cwh+PT-CsFlHm`;4zU&_RO&Y`cyE`5z z=YyFxfZ+6f6LW_C4Gp}$lV1W0E$*dKr8eu3obBw|^q5A+4H{JIL?Wza>-WLL?rYlF zF@yOF2yg{lDF4r&m;+)COI#=_xzxWJIuf4MWIq<-9R8{>5;i{FrTm+m#C-c!RAY_= z(3ruws{MMpyrw{}H`(Hm1_v`^TJF0!e2*830In)5rma&pUv~TN-{dST<9Gs|xK2(^ z-6uWcInoL=Ly41cjEpwc&9{`HhuaxGWi;*M=SPotIa|xY>~QErD6LCP_dHce1|v?B zvo@40<;0+Fz)?`-@I5~u0}v`VpG0aHL8jXuAj(KiN%3$bbW|oLq|>ba_pvn`dlA01 z<@pi&@&0<-AN@y}?P}U0x0oV7JC0uKS5vDXvb*HPhKiHZQ~kA0>BuxED37ayPo>kW z4qGTI3#LfEaa71=78Ya_6oG&mg@uPlGEOv9Yb|-ZcXj1K;W8TpFzd{J($~KywE6c( zq1%g097TdMPMwd&8Q#O|Kq$`whj9Yi$i>UT+8U6kV}*PrzNZ_*Zer%vB6U?}0D^L< zTy0l}yb;cT4)XEwLE-W^eq>1+{5ZbI5AUH~U)jXE6~${Uk@M9_JxXTkiQgLV4^YF~ zX8ewpTUv(dVP^j7lR*KtV{o#9!eO&y&?xEZaldkSXt?^anq(4DKN{uI`DU}vD>oDA zc^#j;puoz!?vCK*{6$VimIi2ry}dn8Ra@P%|9_h`DL(#fYHI3Cl?BfI^>NMIvz|se z|IE6gd?}3PrM{fGInwQIk9y^fKtW+)eo2YR*suHE5kWbrexZhuO-{=pDY&>Fwvbaj ztKCjQ&M_n$_&TMt2|HI;Q0kW(PE=g~*6o5dvL6_>r#s-i=GBPr3RaH)nH*3Os6M&Go*w}VuRqZZSU9U+q?$guL#G0865s;2MZM%8j9UPG&Hb}6gVr^{{&p0iou0^PS_l!$@q%gMs*3e-8D)ZBaL15=waLVox7pdh%u zW}rFPpUyK}#`Z54Y&%{73^X${%j(#!S@upTD4;2+-=kR{Y-G1+?wOc~1LbdZe?L4< z(W7T@`RU51NT&&3Rh1J^norJG`qnL8q+()S*wW6)cY4;mHIdo^$<57A?y!PSwLex? z^j@lkl2ZI)b5iphV{(dG^MhjlzyKbbDF&Pf!Ls)~Au{%Y5P;Rt7ElA@eE=qVL;K&<7j z4(FH67J+D;DqZ&dn*Td1>l>iW`b@Zg3JTVC#AZ4cIt5S?$N!zpFUr z78XhT9wph@yR2aL+6qgX+W}qa6?{4^%3j=!Kk_C9IM(3@JMFL@$w@%PtX}cRxE^xX zJ2bS2zJO>7oz~~kBaOZ@2pQDBy7deA@Y=801Q40lI_7blHxv{Uo)4!~u}{zz)z8N7 z)rhy4^#%n7EFb6XA)&B-f^TUO!VuqdXOEeZ6E@%==du#;zT7_Z?r%;G7Jottp{08a zhF+UkTL@;yDPS1179-DtA2|G$QK!VyC9nE?h3MAX2+LNYrhTxmuvi!(MqZqS9x6u0 zV<=nBL-2#d;e(tSb~v?4?-xJFrL3Uvhhm^5`A#8o{L5PfeTRaI$NQnD);eT#8ML*u zfd}@wTAkYkW+ntC#k-kAF&11Wq(^v;=U^Zj06d8cRF&ZT&>z62!r+P-7FDYZ`tQbn z^YeaD(1DB5e$!%N7XzD%giDZTQeg}W8{zdU_z$9L;Lh(uUi>c-TN2>_a8c_w1kC?s zKm15|=(}<~gqn|BN3*ICdU&2qd@@-UO}O!0$kvWj^oCEJ?@`)Q`yp~(qbX>ptK}r) zv2-rssl1jpDbW*|NG=`F+OR!jSA&TR(=m3Jq$%ay?(jEDlnbm_NirstEfvS_rf{BS z9^)_(UgNySjN+0<+D9UvrwM%1(JnEc=Kb|z)0NBZ6-iuQ$W@e~cYm>SPFfmUG(zde zP^jsAi$JL7=(PgJ_0?7R(~F-zXW#>C|IM*!;%jFTFgR|dvg!7%-Hon*Kl$3ZsLtpV z?X2VN058v`*{4JA?WWz0wQ8dJUAAI7$#1t4TlEpPhB zX6LrG3vd~!C7R`3XGBV^8tJ27A4vT5FiqSgYy3rL*^EvD_#Fo*v zpt-jl`;c(nxE>mMO0!W836k5TJ!v*K_DH#6H8pNF#Zkd>J;5;WPAm0wJskHO>?d@L z4-3fe`R@w@>1X&WCw_z$e-VZ6<9J=~pOr;MZ<$Ac#4AfyTYJj9OM?Ai_wr^>A5U2G zCJh6{-UKatr=%gaiM5h;$yLh*Yt~B1D+yPz^<#WfR6Q<%ZP712>=}~ZW$c?esBp11J<|#BJT!}G z_)H7=@wbz66zg=<``Hx#a2oO@kVGdE{v*M~Af*~_{|+p_h7)R_6V(mJF|B=pyL>BE zj|@cgM(xf`Y(3Y$M{+fySym#vB(S_23r)$$iF?@f^9}-KmzLabRTQ1!B`)ezW?YoY zJ&ix+`5U6L3>n0aF$F)QQr!4BpHO2T6n(G04Bf-)K=$)52SYLjW_l$9YJ*pc9J9pc zWh6zIb+KM`zUz$D7A$-p*r+s3p|+sYHyqQLdglpI^}0}gL`NiS zYy4KTvU%X27nj)e^i1&hE6{21Ks9JrKMpqvQLa%~U4j zBh$V~mBh|S5y&f!DN&Xg2Su*k#m^T9@uwy*yrvaF1Y45K_2WMBbotFn3dhI@k>8?7 zolURq=L_NxElRK6SlZMt)Tt--SCnIdNeYdrfa;lx#i_rU_gDIPj{ zK5p38T4zk_AE-2MR#rD88+Eblnh`IqW!IMPpUf%-n@fDavKPvWE*k51!$jdik95zHza9Hy zw$kuWN?pXyz|AmDJNN4xHKy_>Z*S@FcT4$*^zL8MM7wN93*X|}lLppI%6DQV>iMRy z%LGpO*tarJ5I$F7=viExhi!cuY>^rsS!Rz(WO(GnYZIY|ok0Qs^RgTKJDx@uh$sAm zWAHfobA8g~bOwoC32Jib4Gbv+YdT#RjzeI?n+H*I`o(vX(PF#qdkA* zm$4oq8UJ}JX9U(}Qu27c;B8j)l5k~!N9a0xof6v*ER(4_!uKo@;Ni%tzkM6WwjQ%F z^tk?U7>{D*pi3h>vIn?mAO6jpP@X- z`Om%<7%;ECB03_&2?a&iDa3KRU#TMd9O{GF#qQX?2}1ge-)jZ#)TEuuX-Y3HNXNAaMD@2l%vabLTsX2W?e$HaD# zDub=%INxSZ)nIL4`(;@8p8hmF<`R|>=0{C-?rN=}4Z8!F@@Vq%wdD?*W@o@K=ncOj;)1+0%&5$}_=-m#g`-9d) z=t+dAzP(7;Rn!aoo<&rIs_nGf9SC|qZ6I+{F7W$f&R#s^TB;b<~|_W33k~| z`)nxo)76$>(Ra-C6T7Q~nPIjByMqJ$^{a<(HBwQ`dMhc7j74Gp3gebI1;%NNkQl-n z%I80LDz{g4-lN9M;IpH8I^OVy&w8w9=i0h0(6PCrmO}V#Ds_oC!+-m}?JINI)4(S7 z3@6OvlsrKGdZcIapq0%80uxGc-QloQ`G(XZ?IpGLSP>g(gO-s9uSvC$7ll&^TXox5 zzK>`4lZt)^>uAJN>uXILk^XO3?GK2BTD^D6S`VzFPe%H~tE})`YGpm<^?KJ|y2a#v z%v4%wsBC)=Z%YWq%=C!KZB12*#isOUW=i7{aEH=&wagqAw(@*3zGOh!I?8YX_C?Ih1`D^MLCKCZ&NBqmqVNOy zc}e8~^-x(-RTgTKdOO}Oy0;2iK3~hdMlJCx0b0?%DPgwmxlwcOJfNF3c;KUO4mvHH z|Hr6#z_3V(hzQUh&!#8dLUB;@`CVj=XUem3%^A~iC!GzA@nNWqCDF6hlPWgzjqCDn zxdBtwN`*Psx%PBbuXq!yxK5S4k_0|&N852aYxF}-U$pmN*rZdc^(6r+rK^R8#ItWL50D1D>@){x+>qt3Y;|!A0>A|#JO1I~q0FkJuu}l<$NJ!AysI2jY&irvIE*ee{*n&#_fY^at<}eA6W8E!Tb0%3a&u7t z-h(+h=T+?P4F6DvCrcRnVDwnEll;TIAF}o{f7YK8sHRWR!nsUy@%Ca=)N^)U)x4>u zR50E;qK{!6!3=7aL)kS;#&VU4mu}s!(-!C2jIlcuG=DKbJ_kOpyT5TBk&t#_<-4Qb zwkAfMuDtxm0#muDF4bFs?1PXy=$raGr=;P#t`H*>-L}Ak3{mTja^4*rcSHBB949o-_HoaY%cmDtM0@O^IIcL?qEFnz_ zE&2RY$v5rplA-H){7)Zth=c>~LnbcAF<<4TaSA0OR|Bd@fghJJE7LP7>><4cAeMgo zkgF-wydtWsa)p#*n&Bw3#l|2H8OlXao}ME*BaKU!r2=E6GQp`5 zb`daQ;<2ROy*bCCs zae3VjaogQ3eTs%UCYBq&g%-ap{K?EBOodg$6_?Gwi={N?RM7-sWM2hUP| z9G*?A(di%|8ezO7Bu$!*%P-5KLO2(E;pBvhd?4aDc!??a&a=nZPF3SjkH(D4Se5oe zPk+B9;f6ACMbgnDOlchcPlhB>%nj`JjG(6ki#VIy>MDFZ7Edit#8U*$>W>Nb6r8^o zK3Pv<7TRfOdd6MDW`F2@vz?+>Sy#wcOaCa4+pQz1EKPxwlnP3NFkgFQ&!AkYgu)`? zRU+i{ypKI%k2C#WE6TdJ4TSiJ;OwJA?3UuZMx<6Q$teF%k{S%jTY&W$2U;p;!Y|KP z6g`xV%Nhxe5}<^q_E%XMs%*yx9cY4sr&)8CMTa>uvW7By zrn@q}j39*PMZs*Ut3X(h>Z45&uQ36VQQOd!)sHOoY-Pxoe45U!_`5&v_~3bVFE_y; zaPylWWZKO%RVbQ-MFbP>% zuy01@bRSMT3tEhk=Eun)Uu?2FFLAxa+{K(a(W0pMF9F z4G%nxI=Lj(HvDy$DGD7ME)ZYiwH;-lpvaK1n=)bQC}0bu|LNNdB$RiYm-yxcCa3%0X^N6XFq@XM!FJd-|!0zv30up+jAQ=QG_N zhi5~nfb=z1o=X-^xDSn0o6YK`cfCn@CJ&_oYSYbg-RppM+4yqHP!8bHq?_(ZcRG&y zhJ&s>nD>?7H-)^#oZR-|wdVu88EZXn3X9R+ut|XOT4+QYZC#t!BY;GQxf&v1Bz?*V z2!jeCaJifPfBm@XD?|81QoqFytxJ5z$gfVnk`j-CKdQ}>3)AFZk+ zp??cWZffh?Y50t&s+HV(a^vjejyEZeEdz)|#LJLYz08M<>B6Z)hP8(Hu7rCBYFKL9J_6*cX)H5b$Z%nnp>pETqSYZc-D zzxx3Oi2V7d#OpW%2C6n2lC~pKE?RBy5Wr&q3l60D(^V;E-GluZJd*i2;o;eFtljsx zI-ecGG@@+Iow2IjFZ&vQ%!+d>PuU2Nr)M7|(7#a}>ppP<2<|>iqtJ9Uo@Pb6*jW<| zIe{fZx!u$j1b~qjfQyG9LekK+@7&bH|UCaN&4Af0SObd#ImauLRQ2=FjfUj#2>V_ zDCt`}`YJScm5`{u`ojTe=^UY&J{eoRzU%FHCfq2$608TLnYGbnzp@Mi>MrS2^}Kbo$78G_937PQxheDY!cU6P)v^|s zYCvgP6FE-9Uj2o*k4CaYtBHrb%$>LP>Z_tNF9Lb zq#Jbgy+&`e%hEc)Y##QGa{e^h1B5rsxF3VQ^O`3z^it;nxecsPxB6^i$kNkJb5y(i@Iv+H~S)%Frhmiu=JD9~+sdq$sJ? z4O7n7UJ(cq7tj@PTfnS{n_&YN3#c7X03Z^A}3> zYSAw#jSU@-C7XYoHyLP8HPw@}v8#m}&d+zngC5dA~9R3UV;9{B=P?2?f)<7da0(|dM-<1KnQ$-sYAS-~UE^vgalf3&bN>A*} ze2Pj;Y1XrJvB!T|nAi`#iwI8@t%Z0E+{;g9&r^KC%h!zVHVDW&rn`_g8A;f4p1)%$QjjV~A4M*J6MIaDMgh=3m8^*Ix z;5Q}1$?|tyQh`UkHcGJOB=P}*54=ho&gfPZ1**>B}7NX2M|7`0T42ilH&Zs#YHMEks% zR2=P0Lw=3s77sKtUC=B;oQ$erodv7MD3@ z`Kj%hk&qD5<0Dq+W$1R?L08%qgb_T-$D!s#6>V^=AymT<_XkVQR4@9gy8MMur7n!! zcOoV;rp-K8%;4dy>{5XSYKe4Dhlb9_z6ah9fE)x{MaUjrn>WMTq%<)+dwUL8Qau=7xkeW+Jlo+dug=e%FadfKsf z-z}OY;~sNioABw8wr&BfymI<|WNzVkV<+(^2K(gJjEUlh#$T>X=ZJUrl+JDkslWH@ z$c<_z~vF`D!)yA8!)2 zOF~z3OO*R?0aQwM3@siOPbz`p@#{<-?P+6thbSeYUzr^82IqFChTwpvm~D{{^~}?~ zuXy~|ZJkKZE6WAR*f|i4rlgPaG67+;%*TK@Rg! zF?%4!HIpGxWHQ{;dtK7L8p#QS)*ow^D~2F+?Z)E> zpzCA{`;!fcXf00YNm%*LkjlOW1#`<$EKtCdR@tI_n=IV^esJgKeaBY06MO8Iba$cG zXpJV7ZoK!P4`gUkr1>^6OB9>uXsfnGI1%Z!n+-uX$a%03T39tUqg;T26M~ zQnE1Ev!sOk99=X5wR&?lBVkE%*Jnxq%naUf;uuGBagQG0xbL%EnajocAR&6gd`9ip z)6?S_rX-VvIxC1Ozv|>P*|x7Dms=QTc%ctmsV?3uROfi5o#W9rz_1sv*J~_?wsEx z6M?j4*iz>9e(I)Y+IeWFPF~4og7(Nscf4_IS?^=xFR;6rt2atyYE?dH+;I>RLl~>) z&Yl>aErJ3g^@W5ydNQ>rA+9$+<-~3*&+(pY&NJx6LoKPF0$qioMe0;s9QIjZ zrXfUow(bP_0zcaKI@4kw>CNvkuKIxA~wBRM8kt+&=2 z_t~AWU!fdsdo&k&Dx$?hB!$VO>S71hOUf};Y41jUuwiRB(HHfqTYt|ek)@hd+1KV`q0MOo%( ziJ%lma*b@sc_W9POS^Xl$SExrLV35d;nlJOOXX>N)%xGNP$}qdu==XSOOG5ogX>(A zyO-JBcOyAx=;MQf9(Cmxt5Y^-rA_~_eYVV%=O+ZmA<=Rh=pc9h$>g-);wTxQcs1Ia zLaL^sZVheaZOdbWi(UWn$8)59p#Mz6^C-h}|1c;zGC!N>!cf7m=iBuMMl~lTlB@x6 zM?-xF6~{&9nRmc1y}jsVLDSgXd5yr~77={KG=%(S>4;4p^k$*(0;d-6gRe@eLOPcU zaImNXiHS1Zy&f&hjfVsajqu9h3*ehVXu zOrULZAKB+`vTj_pLb>*=XYRBYHeeRYfH!ANT98M(4@=>I;&jQyu&~UD$(hj5X~Klt zo8Ny_mQhvwLwK4r703_lU&pH(v&EN;gJQSBqeWIM)hCO}L|||q64N|J!>@MbW1odm zJ{%M{CRi4}m3!R~>^u+*HBAz>hjeq$%OV~SO|iiGwS2jwFYaO`>o+|5=H74E_xv6| z<;$NvbU2k9yt$gCShP^})MiYx5u&40>F`{<>$5_vIK;(%>QdDyOSliogN*>{LB3_l z-@mAcgk$Ru;@1sIA1I+frB0m=)0i^wAQaTVVP)P!j51|rHz#m49}wZI+9V~?@u8ZR zmktyoRb(RbX4q{LDb7vo8$Qk(1?6ojSbQ@r)R@?!-a#$L;LC@aVv>*W<&KKwbf(n8z!gz zic>W)r&)j8`j%n6Yj+C-o15i&lU9-~{fjo*d}ruHhyX-!iF9+)+Fe{zb@wR%Qc(Mt ztZ6r-K;qW55+l?1Mz*Q`2iUfjTNRW(fn|y#e8coR{4bSg*4f-&EKfaClgZ`x^73J0 ziG1CV@F*%A46k%`dSdhxrQOeN1I^0uRlVHjk`oC7;35L+JCwdVPY`4a45RK-$8>`n0D*jsBtx>4e{da0UAjYF0bM8>oHt zocTVQMQhdwGA^GNaswvfyCH=$2eUhV1y*SVZwBCo^HgR(JCC8{{%w_Io%Ecam1WFU zs=>ekRmWki%9bE?73^_!FM@PBLe)}3L-ghs11m%P(zn}*z~DGYX%ONIey>bFpNujh z-|kFbn{qUasi$l>2plkul=m)Io-5DiZUX1aqe|w}2tZBv7mPV215ox8M7QXu9_15g z#Q)cFz_G@2tP%56$yR-t!pQh5kO#c}ZlYLNm`qC%-M+<%36AmPRCZOPk4O@Hb|e2@E;&Vcu$U{OEIs%0?0$>0^+^!Twr}}BZZ<&IZ&&w zH^dGcomC|-QVP_re@XOvOCz*%d!Jv!z)fL$4ooR(%YU|2s6V@yQFXPtu82iz{PxXk zA-THO;F9TFO!EiP9cT8PYz$v41jIj2S<$Ck={WTLnlbk9h99V~R`7dQ`(gN+Hdh(E z8owx2DV=qkCJYj|7K(PRdA_M*b|NJv^d>gdH9mB8iZU7(3s8MK66xa)M9U{2g~^w} zA|_#Zzyjk_i9_|IGglC=N1%abu@H z=&{%Ht+@w!S`fceznERX-|ha6XP=Y`gl``Lkrb#Qfcpax;J4TjG2z17-^Bm;v^**3 z3*=9H#EO2mx)-5LRGnYZIAJ&TDhOF_6}NOL2ooirsQCn+Wc%?!$>7M0&j*Y*KEyOe z6TxTL(~pWn5UQ0wkFKJ%M=C0qm^% zBE_`K^$R3CtMJl%_+qVgdTA}Yd7j={r)wqf&{;`&V5HA&*XZ#5_NzYb z0kT}UsL}W&{2j1HR51(s14QpWkdvm^c>rL0xNap#HDjouT?VOpbN}tnnycp5l`gGb zY3GRS#md^bR;-m}HI_IdR?mf#k3gZ47dmR@xdBE?ry|cv(IU>HQl~y|nOZxB*E4LQ zDO1O2LAT42mU$oY;{-PIPl<1$vw&p03*DPvxv?vpzCza+T5lN+=^2txs^lUymfL5y zq@t!b%5!dT&I+Qh{xouk5THLeBD3U)t!-lFabGRZSp}O2V>A2{N&IvniYNp4Ve$@7H;uy&y#S zXnP^1KIR*=|J(%a;+KA9(|I;FbNr8Hd|ln`PTD0L*CW~^w&$4*eJBKh8R3Fbbx4sq zvH|VS(Cvk;dWU3FX}rP1UW_&3<&<7>@@~3W8LZ(5^d)f$<#a&Y6i(tKI(s zcjhiU-Hk%Wu6C6LV^p02@@fPO*oQ!OfmWO+S%Y--sm4?VPX8pbxcuIRr-%dUi^^1=7X{5Kf~jg<0FXVJ8cWoiyQCUZo1mHWgtDi<%xbkUQnhS@Zix}zXAlNh z%eQ1~R||SCxm{v|Zi<&|xd?=m(daG5rY`kE$2tMUb`zNmpfzfJ{(+HOt?b(8t1mQM zFiLj$txU~0E|VTprG92{bfY~Te|}v03h0!oJGH^uBoqOo01QN7Ujxw*opOmYR4kEC zIK+bsw9$-jH~(~~zC~$y`{etzguItNAR%TE{Qg+;51buPXcK#4uJ0Z!TD7Ss+~a{mvriWNUS59hH`N36xeeGxe=q;J>x{VT zlr!?Xendy{N-e}H-2}J@4*pf0V6N$fIq*x$?C$#mEM7`$VgQPu4JO)o2$$~lYmyzlOXCZ*-?0fhe?~2ze$Oa;IkMSQ!Iy!n*a_#eg zZC(nw0;}(Uy(t44Tfog%L3n8UnUZ#^Xd4K}qX#=8DElP8?Vc9NB6&V5+>d|y)-xK? zf%>sPIet+38w5mqcWWyfpj+sx>5ouc6IyM13nQ~?mBYUlrl}aSKog0T1uB5C_20Hz zmJYBlT~Z)4fnoAlDUJwD4QY{v0(ROsNj}@M1@Rn&j9QFPw(L z&G4?L>6vo!l%87zeMQ0yaTNw~4I_f-H$i|}e6*lj9Yb{?7(j7G-vpgE4!_SZ7!O?A zOG>@twd{dPLzcR^09#}vcL zF!7f9`wEcGyz~(f{%tiS0IgC8BOgJ78s-5}zn939ALw8yJQINIX89;CDfL&uSg#cX zSa=-FFF+%kj#YvDXB&vsuNsa+m3S9We0&eo2A+4Iw@)#B`Sdk6qyltJ@&E*eZUy&h z2VIDkyj9<~tNDlT+KKV-Il{oPvs8HbqRwSe7VLjC(1w#?$`cV zcrjZ>pE?>ocrz#uC4dm&Cm}_OB+_T*A71JU3BdXuZVTh*Yd+NhZ6p%Yx$B_oPVl|1 z7>GuIL;5yHrqAPEcRiAyalF80bL*3f)9fqW44z%jtE z)-3BSi71Sudjt%m4&DJZ!9K?jnJ!*Y5-MMj zXm2t1fiJD;_Ik+&pE0b8s(H0#qQ%JIf=y-HYmBUgPl@R56cM27Lr@Q{232JTAQV&C z^6m#L_}kUgIB%lYi%b3BX^$$>A#T5MKnm#S8(+|AgL(KyLh4Jeu0i9ui${mefnngKf>6}UIX6mZqNxp_dW~iq)IsX6Y1psP# z=QySJ-wfUh?10?_g36}1lkae&iE)35U)UG}%TIJVcM~Z3S0JcQWPYT?AMnxJS+AvD zbag&9?8cU}(}o7f*?#jUKX$l!sVJ@xeqprOzA4QM+H~}v%U-m`a#;A<0%~zZJ*!aS zG=h-wzWP)1A!GL)0Wo(HXdjKW7vU$nv7h4EV1c!Q;|JoO?!I`^bfn63pC{-_05<07 z3UDzAjS~#8P{5VKh5|h{Z>Q6YbZ;3#Z6s*W0SHClW^iRb=3=d34wqE~Q%swJpaT2^ znu*(l2Vfar&0}fzBWM)`Or8ix!)z-MqtfwT94~v`{V-N7A|Z3#Ic}~vLZ@!Ovb`CE z?iQ6Z(%LWrH7gDf&V>RpU5Q}tJT-GxYD4{>Rqq38`RhzM%g?pR*B>=K{Zqa$zN6UF6$ z7s0KQ{!8CmKCV-mbpnvpwLouHV82QQ08t)yy?O52!ULzyOUxE&Xo3i@SMneRd=(Z*?p5iZT2Y<>TiP)fz6>; zpMj5VIcP`gE8**{?Uf|ILEpHlyhpf1fXrsO97r8sq(JS=IYNN|t`*$vbuH{Fxl6nH zs*JM5eY6K?6~o2i@dLHxrTGpdVt|dEwUr*fA`uY}uTDy7ZYV$>{>QOM?{dE@3uJt_ zDAZsb!>tJjWa8OU%iSW(7VAFpwul2LlN|tk&a+=1kY5M}*t092H$Q=X3@0~wzr+1n z))qh)1}~{=>)rMQnbX~P%yi;=30F$u)xFRgLL(y$^T5}EOZ zf2@j4L{_7rdX4PE_K_)=A&R-z8CH`eG1PPcx7WSI43w6PVotCds@oXHDWdM97$Bd+ z_Xq-M48V96Qu6|G*-Vd+GWOA57N4jUKVJx+S!3h5Bv^eoSYunzd4>Y# zPi|t;pT&9)&Tob)?Sm)4kYPa={*K3e>)hO`{+VB8!LBXjzz79CB5>PyLC_;(>;MZ; zatL*Kctc6#`{|6da8Mk!BO+*mA9|Qfbl6Ykj*aSx4Ki3r<0EGtMgHV6P;8!0-f)IN zO0)_%UMcoHYlk>9g)aWM2#ciSkqOc4LD0X^f=RCW&I9AfQdLm;Qu`uwMNALQkdxj&YA9%Lk7}~h{ zYGPdO@ra8>^i0o2Z}zCZdI>RsckgO+GvVp%h?h-9$pl&|IR^Fsi~`#BB6RNuTv!X1 zT{9oYEI`k>7B*)bxL~wux3^G0>W{>05XOTU?Uo2$hTP{z%0#C0EsHm`HlJzN7B1l7 z^Tfi*`VW0OHE&Ax)=_xTr-0;7uYkB}7;{0`DpaIg;g{W+qqoi4XW zl6=;uS?_m`Q#w~-^g$}3573daTSjC$*I4!m$-bbx?$`5sz;+`^6M)4C?Ear|j{K?= zI>BvvLd7z*fUJN948Jlw$BO1hH{2K0MK@v#Nv@ee2b9H%cakamY1})y-LHPphAX!s|piS98sFh@+S1s)tmRot&d6IB+lYRV6 z_1kB`|HIi^$5k1v>!Kh^i-dH8ba#UYf^>IxcY}mTNQ;y-NJ&d~cTBody1V-h)>`N8 zz0Y0yp8Y%jIb}|m^BZHl?^EwLy|xIkCd;_~x+RpKM}9gYq^AzWl={;x8BXDuWx+Li zjz8Yg`HrhkreWt}RvnFHC@D)>S4J5fmh#(JTE*izOR%f!9?V+zQjXM$0~F@r;3 zW_oCr*vZs%Yw_cs0}{$wnT@iMt()U(e8RLX`^#q6bR)mrdfIICoecydggZ7jhw9_E zP-cj-=!bY;3WU3=2bQxgYvtqHzdssGOsG@{9H>D>ZW6qkFnEXl&RSwAyRU(RA~ZNy z5W+^TYvgOn9_sn(>s_#+nenjE=#}|tAWwL1Zb_)73d5QXRaPl^!=YV^fN(lWyBFJ| zaoVyW@B=RsAI2w%FjhGIL2JD z^1;z>RkzSmo8xAik>>c-Y`hsbTqXxEQ-@QbpE5KxB%E(mU3ISs{c55b2SYRIa97yl zPfB8<3oSn}Ntx(vGD0=;KcHFa$0~7uJ@}AsB@dP?{ff3gB3n~|E`&ojr(CX@sh7(lcy>HgxRp=`LKeuc=U*C8R*XpRo+~HE()IK5+iATWK=N=M?pWa3M)SXY zZ5p7&&5KUBUVz8iKYmSqaHTph&uhuIeUDqG39cbF7ZQ^gZ=h4jwsi1TzS^|gHNjK# zCH|Lc7zDRe(YjyZVH*}nBm{A_UlfMc>g1E89jR=Hopzu)2*qM_<9|uar`Lsb315+p zv*=sx#&Lav(P&_aNpxyZdl%+^_^K*tb&l+k%L<#ratJHUF!w4IX9rg)lip0Ke>j!V zrV;HsR5d&7+UC=F(!=;G!Q{KMfa<&*JADG_6nC>#?36*ielKyoy@TC_^UtVdC?Y!K zkh%H8)7jVyP@GRCE7IR2571vb-pcLEF1PI}9l2?CcZj5S%TIrEGgQ@4A@mHhvS~>E zg1hAQ$GKIcNZ_GtDl}9pPVew~@9iG~d1x2NV}8=p-nhWZr?$I`ATfcLfN@Tg-qYOkl~j(k%LvQqGxjg}$sbB_klmOgr_5O^3om0e$D4 znWcOC4I`D#56M)6ri#b* zWm4p`Y}M9I-NvU~E*INo2VYldLd?pJbmPbhsN5Z=9|TlYGY(o^F;)DNlLc`D^1L7> zvwj=apVWJ7Y?aD5%CoAQ<7@BLm-ucilY7FQQah!OJZ6%)$>O%ZtEF~yU%L=MczSp9 zmyJx!zlxHr`ah+0rg5Ip<9{56sPQZ*I$d3h++p{TFi~2D7^vmt&?jlIP$pN?>fGo*rEmOuC|A-L|u#RNZy3Fas7xWrVlyMtb#bF@4$jHkFn)yYIG&~t4BCw zWm#>1f*cxQLbcv%XhD6GT=jed?_#)Pp*0UaQ_M*hmAA@UWuJSMr0rANPZl~rEep!Z$G}*~EqA;g(8PjLb9z${ zr$R8eBx0-Ls+5DUBNVO|(@e!E6fZ84ZnEPSOsy7sdb_gaz;UK8ar{6JU#n%baPV!D z_s;PnZdOWnRbfR-hcAmsRnBMk``3de@d4+=OOlbZL{mZ4^n}N#7nYbU6i=UgT!=C+ z$=TyKFh$bZ`vxN(5=Y-*rg!wvLIn?e*^JH{W}fqSF}gF)o#yoIuMes8SyD$RsoaUh zegmPdh?k3x?J)Vh)wNW(GvZdC&XrQ(j~Knw0jaFgrRAEl_M^e`#GdyJq?$Y64JqVO zTVVRli;@{+D{*_V{kj=mc`{0xCNT9_?i2EV>g%Cevb@p+OTd{x%ceo#ETj;EKjZBH zS4GR?3U?JZU6+bv#zPhzW4eCz4O?KV(J=!jOIVZ-_Yiph? ze7%@eYUxqj$nbF7zz>_E;PVBx3J=tin_m@4{Ah>c(A3e`7OEeS-Ed?)J!tI+JtSh} zXh#j|r?oe)87GjjKT+^Dx}8_43d~LX5QSjhO1IJEdJY*{S-wRGba?l+n`P9S_7aGX z^^b?!`+Q?5Zr%QVIY0Xc)xA%>BV=9`a7TBZwU`>^aQ+Bcdh6%qujJA5bC)N%t~ua*VE1W%kg*B}GZOuJ=yeAUQ-}vm)N+r~5bpmg!1ZqJ4=kUGfHT0iX=BIDG zp|Hr>^x#YNO&QKDG7DJ4`88g{+9?>mABw!h|Jmf%^lYVr+*UOhCOlB|zBJu8b~=rM zDvEmg@%^y_{txbZ=UYx&r{th=-8L_l(jQKBPGsX8`qjhtvZXtwIiPXI$B)neTW{1hgpbxYjpD2q#U zLk2T0uAQ}<#m$y=ARbQp;RpFDee>rY9-6l#!tHgx*op;_Dha=pr6CBaK5Fth<%<^J z_8e^EmE;Vmbp&0zguB#5F!zk!|EP@K(T&bft)MVb+JfU6{Sd1$EuV+GcQEu|`D?>T zOGzyvI?W+((p(dhz0VsqX2HyS%q6Ejwm0k#TXm20a!U4U0Hcno+isR^bc^t!UuGH_ z)Km~B_&GcDwQ9!m#{^Xw4{y$=i)f8MdVV1fK*MjDC1~|yX;w*TDWpdzi=(r85u1%6 zk#hw*ZxWTq=2VL5Ecg$%bG~Y>73nkuS>>NilBiAEH*eDeJc>|B`04w>`?3BXUe-45 zZii|ZZr2Qy0BduKJ&Yvml8;9#XlqUE)MfwZp3JwB^Ib6Ys!Q@BiT)(d@w?vTwVGD? z=0(BLDzm!YO1uWuzW!=JT;^*E8-7%nyVnLc-+c`-ta>-Ii9Pi1UH}lkf62qz&m>=5 z)SlU8FZ{dX6V%wiSV_t0^m{kw%L9v{y~ry3cSv< zu&;+k!mWykR;LmKdm-Bn!8-k95A1b`0NB2AD{uJPpp#RP&4Z$pskD0`pEI%K$eCnu}^}>Wboy zy{MYOn`N2v;Ab>Fw3faufH)Bi@N{xdOB5k%b?w}*f!2?9h%W5<5w_)>i@|9w+)lyJ z(!f}a2*g9!g=i_>C!j%8o{Y&b?FoJGf`Ph(21!4BnN4P-Y0$b(DN55**~f+V1{xC6jW&_CB6$f!RfDQod&@mKr^5t!|MH-AZJhk)e<8dsQ+`8XJNW!Pf%ekB)sj z06O7pGKU)Rz};N#<0(pFoKzsL6SuuVO?Hb#C{a4DKDD}n9BS^4cY@0@cv=?|XHZ!3 zGqvFaCN4QzkT3wr^7Q8+W=Kdg4S*RwyjKi>xmm{@UB$`(E(4KH=S$pY`6_Ah$_z;s z?Ec?PcaSXjrH2lcSan0QTHCG0XCk?dA=WaIvbAd`!>ffd8bN zY$F7~A0z+yx0D`(8QKc{EBoHPDjc6ZZpkNFsq^e%=K~d|Gv3wgqQh1A>>c9)jL%o( zq;;QGjzGKz1v~qi0vxKqNe|IHJCo`of7_}((9hj9Z|!-XL~A1V!XppW26G-jDPOT7 z{8o{OA6$M}&UWCY4H0m+IM?dk+W;gqMx7w4P-6?j3CfPxBN0d|%88vAAUVu^5BB1_H_{e`|E45wEn+s4AuLeB-fp6&yS1<6*?5OIv zzW~rzeQOP9$071HoH!HV{*Pa|RM*4Ta&uJ_>^Hk5@$gqW*BWpZ2iW(*oxI2{5!YLh zfoeL35uKm%>`m_mdzLy8V01*l=Dun1mOFQ?@)Pr(*ty5h^nxwLDMuH`CkpeiYPv9& zJ6WEeGPE)8K)NFuuf=?2L+*e4TFlO3Zx3G?T+e(JPd5l61FkujvXR4fA>cKyMt-YF zGRV|t`VWCp@^)(7Do2N2Zco8Nc>cGSjH!JE>A!vfzI+9XflgF{m4*J~n#s~9u-^l7 zzHrQs``EZe?JTt~Q{p6+2p66wTs`g8r{DGIc)RWOrHQ>X_`8xRhjEDB7TmM^SAU8q zV-%Ht$pvva<-wnUMhNB)AWP2xijSp`JIU#|VDged1NV{@l)p2nu`A+#y3fS`IsSP`td<{ZRL|1Jp zRYz`S)6cBER?D4yJWc^Xlc-9FD21(Y*Y`Yj{Hfs!txj#dgUs~(ercJE{UXBpQ{?J( zp*5k*^fG}f>xh?sn}wrT$MR1a6pM?QFBKh@j*HN{Xi{)dRc{% z{RQ^J?VIVBD^SV$p;lqfmw9gD65?(+gM?g0+y+|UjPoO35Kp*eT+c%559n%AP&q^- zt)$e6PMJ(^7WyJ9A)uVlBQz5ON->pk>sLOf82@rPDkh&UImUNe6{?!8diwSW2t$q^ zHKtLTi=2k@2Tg~&Qr}_qII$j4mj<>(l_*E4X@>i1;m;WYl5>TiXJBFuVISrhd{e81 z5x_TICbDIN57Z?fWcAX^nOXG@gWEC&@kMse4o3JV@e|?RA{W47wopE0C=3o?wItVj z=5)g@ME`mSi#dt`uo-9(e>gZKD?%PtGwyI_t=GV#}6j{p#^P4fD~#FliwOOWd^ zWKcc)0>$*e!24bk(ehLS^-pXujgV90EYZxHH{N)u1084ptLs<>52dw5;_SQ~dKWbx z0*N5y^`;Y4h2~DKb3LfHgBC@FMMqqt{yhXJCk7O8A=GU$w`22mQT)^3Xk{7Pi|LZ; z;BJYSl}Mv&h8uAo?kksuix`rXSpYqWE@v9E29KM+fm=mV3&Ia`cIG&Eo2(vBr zO15V**Q#ID9+YRULOPf%{THVus52ZK`;|?H@~D;!Z< zo5N?6qM3v!pEG#d3pn^@xZI@;@`aYAg>*|>7ud-HIpV{CcsU0LVqn4ORB@3S_;mYm z{zl=(iuvPl4 zs9H|3VU|XCf(MA9VUbxlfT=xBQRm<01V>y^6+>b>SKT3WuHx)RHWLNwQ0m%5b__** zJp*G2qz@g`#SEt37v)1Y0vD4=3hd;|XcYM1-P~aA;xXP6jyjHsmHfzZ)1aJ7jBE02y>@J3pozyW zzmMvoN2!k@nHLUs#FNW_v8 zpx|y``=u$(`+i#|2R`SC}{u^7X{pLSmpDb{3C)QP$lO)hc ze(6RS1Z|xCH~!4xhkXJ}Y=8!6digK4buUj7FG_SKS%#Q8B^lZvk{A&q>`!FSlhrBz#)vbi;m0 zi1m`5V$2PVS5fEEg?;~jWdZsvrDkHU30o*1MmC(B#ncXmC##PD>U_riTx@u1)G56Y zncW4NXE%?7IzY~71r7mn*&8F@O-5I}1>wYBvA03p2wg2%grVz!INNxRPZ{FTpRxg$ zwEdY`iVwZ=v!U;~HuK$MI~`5&RZ?2$;#^Rs#S136B>69`h}8;-+y+PMB$86LKbi)d zK4OvPyh8(0n(u4h5TWrJd0j0rz~Elkz}jDrH7}JcF$_o8`vTJO7=H#|f`S%c=LjAE z^{@4r0|ER5wlU&I+&fk`o$+oy|1{wRVqvpy{}>ytMSiLw~_GUpuVyrD3*t{yWzhoc)t=s!$raJaQ%C{!+m)QtclLHm7 z#aL#IDBWHyN~v~zToOEGU8edRm6+p9Y@`ev||6H zo}cv`x4S`h6JS7Hp=*K$rbChmgST{ybYFlEX9B1t*i_e>gV_7hcZ7Tx!B#eyUou2Q z<005xHn!vPQ*`c3n<^1Vvbk2R*6BCX+Sp$*1VmA>&Z!xy z_Tynyfns(H35RIzxV&}&VA0TS)vsJP6QOmwkP*m6EK_W4J^gxxjEW)3S)a=}D>FrP zopp@!UkH1FWveau^iGkLj?wbsQ!*P+bS$fG>!(H3#;$)8H#z^&nf)Vpfm1FM~i^R2s=>g>g zoNErElwZ^-ZJHUEJHFcZLRgO6v)zBMA5dRlcd!qKyFW{y)Vr9-hs2?&(E?E)mpk;Z zpY&@x%;R4!27e8~fUO7jg-Xm&5mR({0rYWo-0IMy;RgV%*KiN`GgH~Bhck-=q%TwY zkg}HEaWcUg2^aw|pqO8@ejzgK!285q@%hl$WQO(`Q@o%50<;11xRb-q$)5xC?&rfM zY9=LE@S0@)fBx1xl2~z>vO3vbg&Hf2G-aqNX=`;p4(#5J-}Kxt+)z>0%b5uORqV$! zv6cw|a_AfL{%Zjf48bXAlEN zmKSwO(bgYlno(qy*Ec`6{uVgm~jr2^N6QVTUx--4r^#qWz ziqZxUh2uZx!nsDRQxm`U23qJ{VMIc-WSh|hqloAdgdZo<~HD&?LU#8gc+4JU3kWj~;RV@7BM8Aa!Y~lt;eN~RBkfVhVifI zBSu9i@C~3u4#fX3+v7&&GX9=?4IGLSz#x<24>rp?g{F`eoDc)b8TYEJi3f? zDbO>m@3h39DbEZ54+~8Xrw8?JWn1EcN6G%jOd}33%{$v$LzC()FHOYGT55;cO$JXB zhk-1njysnjPt!{+x3naqRTi*YQCFGkZI}jDA~nmH{w07iE1$v|O~%h~b1DB9=UUJ}f^C52T)F0=UVFP88?}pd7ucAWH?#2f+Z(#O_<*=AxOi`8{JR?_F=%En>6SGk4XXrXrOgV43VU z9`i*#dAyP6+5%=u{vHNz!sLEFg+$TJ%^TNjo9|FwF1$1;ElcQ`8p;-Ut#C zJ-q?i9I%~8P$*@KL#-5h@po`BKx!a;$UDpf$z&K1D|!SUKS>jwl2DX!y3KUO`7Gd5y4eCB)(Tqn7fO?useIG zdxAy6>LsmG*cC>lC6}WNuQ;39ER~-U$t$4F8Ga!A2I-! zHg?aa<&L;$+Ezq2EMj(5K>>ClC|+&NgXX~Gg$3ZE!W+wcC*yO`i;=kPa?2;BBEbu2 zELhcN>V9@()RERRK9($i>w5~eI(1QBhqmeLp|^+r@fva^e*X}Xmit}rKuSMfXl98* z!V#TcO`H&`4vg-?6?dVWx8IjEw6L#95kgY$fYkfm(t`EPQDbs3jRH_bDy-jUS^X(o zR>JUR>*kev$N2OTs7)KGKh@?Md$`!RY~*IzIz#@!ljq}ak-(_{uF}nUC*OXb`TpcR zNO|bVK81iYGn;asMd_<3@xqS4GZS*!!!6f2(4XLqJ6gnZK?()D!9T2(q}fmQMXzl* zJg!XlCt@1}AEkh1Lf&fn{Ns9O1__F-=gkE5Yw# z6bU3aA{|O%v|jfC4ic0&m;yGciPkRDd#k|vcTu>#dzS7GBWFoV8sLl#hkuR(;Px!N z6&84mh_*@@TU+=;K%L1#`t-w>;~c5R|!2db3VTViZ;46>=cF%xwt*9}-&_mh2dF3rs-QvPV@#nL^P$Q~2|*n`iwZ~iCCUj07Rek< zMi~&V&umVhoBT?8;i|Jx5*M%jb{Hr*Kq5%OpBFW7(Jf^9pbA%r!O!6RorJWEJ9Cl+ zniB@}|9lCnL&PEKmiJ%lp+%Z(&*?R1g7)xs*^P7`!tcI{wm(HoalR~^xcIr9TuIx% z)cFPINR&`DfpK4+;brmk8mQj|v2o{Y<x-VNR6?Ck zm_5f;tLSj$c-cZc`)o$sMJOY21yIgFL<&@nujw+VAnNniWMiP-H8pyG07N(EKp(P=@$DY zUIFK0jVIVEyE)Y%pB2N%8-r}Y?nv>GGVq?HL0(34plt2OoFO=qRi6Gp4mS8@Cn+qm zwx^Tdh=ZTyquBuk0jU$qW_P@Ii@j61Trj7la*@;+Lc#p?Y%i#a-(Ngwz` z9o_+1z<{cgj4Tnodn2rNSWpv3Y+03*z3OzZ>A>vp>w|`D-LL(m<~*ClwdBO)YN`by zA*zz;BFg`&8f1P|JC7&mor4@KML&CFB|ku}?8Em1{re&qo;0s)alLUqL(mdnuZX+- zTXSY`uc%shv4N)OfA`w-U?+-$ZC%Fv?P=Q;@H-7C+05dHKNnB;=92)&^CHIi>!IWKpo3HCxSS#G;ks_MUssEvlh0_RW4oq3irXA|7wf;v5BxZI zw~!1`-A-_(e(q_>FBm4Oxy>Y@cY$!(W+GZ?nGhS^$0q-_2az(i@~yIMuX<&%an_2z zK3_+tNAt85BC8aH0BTP<>AQm!@RwHea(}N;+S%P353COdPN%gk(Sw_yy$gQzUiuKG z@U7m{yb=c1rmSr{F|A;m8E2(0&43m zFYGznq1@<(s}!v)3E-;F87S-yIl&rt-z=M?6^w! z+>z&-$VS0y^NapU3tJaLAlM+nY)}QrQig!HGWlZ zPQblOV81l}@5C104W!7s|A>Kw=$TuOk}n_t5J4Cc^u)-PCof{r`UEgZrUQBnZdmwj87oj;d^Ur|%&ky;KW>Z{}jE@ZQWSQd?k#uI2lO zZe!~Su6#SdCY}v=YJty+PKFjgk+)r*N7B>&&C&akf*Y;j>6r663d?79$VU1<=6(N( zB-TiyqPT^S&^mHmA#0D$tL!MK1{JS@1-Z5ulEs2$+$(b=U&uS_9WnDP;%}>BnS!Kv z1v{FnzU4uskzuXC6XQpc54gKXJ z(bH^h&KH%ac&b`XdSl;~o$S0DjvX%_nK9Sp#QwpLsD}rL=WlfstZTB#n|Mb`C<#eG zmTdr*eww=qSSPb7=U=-MFZ6q3Kviq|H2l-j1QS@*^HuHDIhQ`}TSE4nPF89zPn*|K zCuN9G`VU3j5mLXJB!iibP-`-iXou~E1^a*yb8Y`rH%evU*D&qHQ6%hZn&^Htx- zg^xg4ZNxtdrLvC8b;WydTcxe71>5bPL!e;57B(M_Ec?$;fF(;01PUzZuX_n%p?Q2@c$tB-k)=JzJQ8<$ zUlPXsbC<1W8P7|}8*c(g_dS>E=#j=8w#`1%P+CE}Nru0ea&k+)oCP{IbEgg5DG4yg z?T|oEL2N(sX%MTm>cHGNyesr~DZ5Fkmpd(AA9|1PBcL}}y-w#v3L|}5ssAhQm1$fFK-8m)KX;lxU?OcYBfb>nCikBV@mhB`k z?>X`a9NjLETi+N)(vo11SqJuFMkzTtus1=NRY_T?RmhFLb7-cy!>qP+)Xd*L#?b4k zOURvS6BC4ojdO?j<6pb~h6ue;XcC|ACO+9-CM8$vl3h3p+PI)nklpYD?sk(XCU1|Vmr zitG_8XS8fnaSNGTqNwWH{^acLzC9j09bbOCe%Gtw2=Zw9JAQByG(5vjUPLQ;9eRc! zsV8?>pAM`^5ZhTwyne+QRQ;TUsvLU@v`AB61_DObIY(Y4O%_jHHNc^-)F%$UsFNHjOA!GlohPM9O-U9=hUlTI z>@Fd6-?|{}F&RDwM`6o~2M_AoPN@Zl$=X^n(C+_{_!B#E1Y%~ojK(m04@(l9I_>C6 zQ&y=3Jsty%TC4@VE+lUCA5#En{aWI>W7!fEywX=m0|d)~#kw2~Ss_P=5)=rH4%>m8 zLimTqp~*SW;^nmJ#M9TF4NrzV@jIf&aULmU+|j0CTi3kHvULi+R_SBh0&7l)|F{_lJy|7_jIlih##9aTaXI(*q;c~ z^&l_bAm!eumkHFpbd!S79yCd*U8t~;txe{sqU9ha>Klzs(8*knUI77BtF9gv9-Aqz zpD{E+o{Eur1*@M8UT+~8{Qio7l6$)^!DQz`^q);%9ICU(DvuT@NRyp>A;++WTKY<} zXgXp$AyLaQ*8yASLPj)xRYAmu?JX_P<6Or7G3RWCzX*)pY{( z4Fz8B*`hiBQ}|Hxv{Uk{h zU;)rcs%ll~1oA$FL{*V~y~Vd0!_#ypD~!Fs+2e|=OB!%y8H+g`t)!cC2@&-#5RPaF z{6bmmfi{bYh&Q4CJFjWxH_dnG8N3~`=vEAJg38m0!nRLx!2&xJ;jS!3Ni~?6k-6D% z6Q^2+WvU}K5)*ZX?I{qPRsBIw$ZgO5ye|$C8kf}CsA8VT5!KDZ92s6$QOdDy?f%4v z%wFmyS(cJi4;wUtkCCny(UdPJYkIq`TBTDefXkQomou=g83}jet*l}nj}QM<#1!#a zG5ZQ*&599WuQv>F+fpaEZ>%^px95&N-Il7` zcF8VL36AS@+T%|!s#1Epu$Yh7i%jVoqS$o3DJjyEMpowzO&C5Jwd)U#NJt zeObLl1(g=j{K?qwwNG_W0B_P?E2EjspH>)E1+a>t8!s=|+NZlw^|VA-`z`yZm9%vT z=QET`R!fmgq))2XyX?(&CnJ2FIXkNa5>@G$jBkj;K>k^8Z6s#g9hh*gzdu;Y+VOWZ z$)xL2Eohf5{unyn)fvqu1|dW~meS+xp`6$$tTi)2(f=?x=xYj{)m+{@M?nGU0y*1~ zodug{5KadD3i#ccJDDit(4UyB7;g3pD4Rh_wmGu-vh7F7x2aP5vPvwDza};rakh2^ zQRTXjoyO{oL|4jNb-Z0gN;`rm`jY&PDfKs6MoqSaX7mY2ySdg%z6`bWV*`< zT}$VVMaV9=t0R|Mau~ik)FNbG>YzE*@wU-p7OM^Fq)XcS<=?<8(&^pk^BGB>=e(W# z&CB0|qvnJjwobpC)J;A==DzoylP9hpB}#+1CEo0ce{cw?#mHzPin*tZaMNzpQ?P@J z*1LdeA=+1PS3!-c?uew4pcpNJU;;Cf9~_dV2d?LSnDEpdv*hb zG+R-lZ!b7)Z>;M15=B(6{`V2bB*vPY#u8X9CpTc^c1`t0M#(jHfs*+=^U?oDC1pqm zWG67d9Lw{>j+CMm#9fW!k8{wNbHB^*^=m0kT z^%0xF**o!Vm?uWr3IFZ%5!6VQ`DHwOasfoE-Q!Bu*5&SRugws*&5FdoeMJanqw6g$ z=;-<&CZhvW#uKsD0QMsR#CY(uqPzQ3f=hy$A!v!;RZ2R?`~BK?c_G}z4LQ(Jfjr-} za@LDsX7`7G>-W9aO2gaejV_WrcX=1?!X~azYReHa{iEHILiizEoo^r+#NFdGWei*h zg;E$+KWAQ|&L8MTTzP@m45NzaiouGEiw-7B!X?|FfpTFv<^|$&q++Y(CD7gWWPQhW z*zW(s`{Jrn$O;j}4B%4)sF|(F(=6${J?X_W-T{gom;=}f8@7zs@&0$g%zDAcS)EC5 zjDH`Wv^8IYzBD_0PT&HR^R9s^`t5yAg0Ncyf>@XVuO!}%k|lhZ0JAQ?u$Bm&fp z2Y9?)r&9uZL+ajSQC%>1EMr~aCkY9^Q+x9bAtC(5pFeWAENohQ32Ba{HGyfNh_~mi zV1XxwlyoZRiUj1na)K#RD9o%>{V1(EFEGgMs@U|uvH&HDnZLIRV{Qgt{~>K3e?gcZ zKx-nfg=F<@pwJYoA#APQFkeB_ID%KM8Qv|;63V$T}cuJp@W&f#1c|!*SrlKQ# z(}xP%CqIaNXp8g9ri#nRBNx`oJBcuS>T(P}&klFvG86t2VHz^$mWRZ?QQ770=5(99 zTR~SGE)^$vo{df*eSy1U*zHU_pekJZN%tF2p03__z6}wT3~BsiRgy*Vyna&@{-DT8 z)bq=Y&a%;uM`z|`MS;Y7I()mgn8z}Hs7)KB%O(wr9=X~CbYUT?^Hhm6%#MA8ZL`j> z2DVDidx5q!asqqixRdkrIiqnqv08=v-&+w68Umip&CfK|mL|!kbA;%$9+s19PeTyL zQtr1=&ss4TFSr`l>*kC;)ncH1u(tQb_P$RhqI*hk>H=*WVc)D%fYg;>phQ$pT=HiH zO+0MiV0_=jebgiaym2(;asa`G}7u=%hr9Xa135xjn&OaG#7Ww}bqjg42 z0~wMx9Re z05dDA18VOvlxgUgV>DK6HhO@ID8b0HTtZUGlqt68k*nobQZQ{-d1)y{?puMj%N)8; zAl0N3p}Q83-2N)-ldJqp$u!Aw#nb2c?&}6QA_Q_S7nusCwe}J*_2kZ zpK@UUe?NMsmv?w3xQ^oMF?F89#3bF#;eL|pU35HM|BUxZzt}NQRrHg#2#O-C6$&TU zRdiN+&Xz4Z(}+cjL`n)kEPKsh=W9V`lpx{t!O`76ioNL6D?# znGzm`Pz1PtKp#@B7(N5oj2{0_N(6!)3ka^n!%n623(0;zXyu&TW3ZUj{ddk{apc*b zV^a|MvadN7%caW#`Cej+7{?7~h-SQ-QoCS@b8M zjco!0EqXjC1YaMht6+Gky?+EYP*PaT15YpgMw>kQV7Ka@KCRqKykOX^8>SWOwmvOe zzBw&N=^4;e!IkgC>~#HU_iJ7`{-x0SobnXA;iAo8C%vq^tYMIOUp3h&?Ax-~k+Pkn zAi8tH-3lGDPo8H7gUJ=ZXvb`Tg>e(eH;-x%P4 zezQ*>0`UoD+J3N&@uqr8b4r9mDiXB{t)2%dK|u8z&}W~`XcdQO`)PRKi|Uw3yXQ$h=ZY{iNj_aFcSo0G^6WaSXdn7Xu|G@%r5fZ zFpsbqI*fQH4XXtelZ}`{fviy3?Zh2`8AH@tCq>9!bsFPRKR2AH5;1qcw1E-G1-QF! zEmH4cK0oDD2?9z!5~Li#{? zxHlcf^sC7s4&-=M6m}Q;Rl^r#F+0Fpu&QVTIjuUnZQXKO#?#B_gd4#XIxv4#*OGcq zsB=d}wX}KX6ya-}h0gT{=#HpjEw;I2Xu(#J+UrGM-AGRN!oX&r>{ovl`H>!^t z-BX-+1%)G#XHrK3l^808iMN9~??f~73JlXljNSd)VY&owTb)V2gz0$85UFR~695Z4 zA|C~(rQ&=A8{Iu{lK_y&{b`B=t{aQs&vQ&r)n?Kzt%46G2q7L`V7?P1P>OQXmZ|Qe zw!|KiPi$j2eCY>3`s%99?2Fh|YC;ZEjDRWgs10quCxxzR^Zvj$Q%L?BXduS~fe|XO zL5*z83whN3<*2FwJpuzQH7lXIzg3aW|;>I=p{R56V)W_W!yx5nv<9&;U99|(?+jaZ%*x! zzLKBd+ANmWo=vZM9=>bE+pdRg{6pEI@(>2X#r$Sk>`&#J|1|q1WTy*w?0$I&7@Zl) z7rX^gH;b_e%L9qB{ZO&3TirRDbRZ+49e6 zQ9b zE=WnIrlreH%=Ad@*YH^SY@{2PT%h^ZDR4URBd)XcXdr6o2<^a`idu z#GG*WWmy#;t153-htwc@F$Z2@qPBD7Z6&K1QKONOc|WVFde7pm=q0(4IuowX3z`|@ z+xF89(-zHiO%M;4N<0Rvu)4XEYGxJ<>DukxD~-~L$ZMIDVSx^tgQM&UJ+8xj_P}pg zsqO|_<0`ok#|NDOLrMr2w!y(|7&;D!wQ50s|)|lZfn7+$uw(prZJpBWDyI$y zrWba{bonU_$zW5ZB6JdXE4RacQKt;@4khj@QBynH&Q`Uvlcw3QBuU*cc&IfAO6h3# z3Jk!(E&n}->d$??Xqc9~mo-ptNg=W)VbXDXnDzx=y>I?6fxHpDlmr6**tV?Azj zWn=fFXc+#n>jh~Y$rs4h6f51SgD%b~FCU|IyUJ1j@8fwIj<|BN%cwo9i4mf0=5#{Omi9`9y~h;u!C;;q^5x1(vWviafQymyf_c=+&E zw`9qhw+0qF6(1S`(^r%mmK;^cB+iC%0y+5@;2y|IVr(8~;S;VU>)b2vd409%K81Ei z`q^rj^C!JYQOI4|Oi@;N$j?twZcn_aAg+sXV-4KUlZDr#(yI!EwMV+l8Js_nbo);?GvGf zgbf8QjA^T;-sVmXZ%UU8pu)PJY_%|FZDonRdYvJs?|ZHZ)0Jzeh=_i@c}?c!rOoyg zE^9t&O-{gUzTr1RxX1jG%YM|@cd!WD4S2*gSPKM#L2#Z!ZRRZK>0UzyHs*JM5zl9; zYfV+jl5tbol>otGYfrfvT>mssSE};V?3Jz$8rjcf5W{b*8~(JdsD!*S@sK{ag(~sn z8bkb{;dmZ{cn|`X0j$t?&Bc3mbM92{@(uDR-vIMD`u2oN$P@E|@(eg*G{6gC;ZYrQel z?&(_?v!%c3=D#CuKaDga%GKKwzUDy6=u~cB%GSF+{+o=FaO2dD1@;jx21|7QBGJo_ zq=oNdQYY_GtnT)`ez-c)uc3m!_x}|4l|gYuVS7tRkl^kRBDlMgph>U*!QBb&ZV9qD z2?Tc!!QI{6g1fuxqCI?HJMB!To#{-cW%#kXchBDUo>!meJ@=mMFcrdPDvRO^dtQ>- z?xZgZEyRf%fAo8NywwWKgp;fQGR_($>4`c7m0~4f`s=835C)x_^qEmril1|41A5ON9p(F zmtP5{$e)iQsyxZijAuk6U5W?#Nb=O!ZEZVZ2(FkT^Vyfk{-)2tIK`dyt?&@pOea>q zKkTq2tf{}2=zqvo83xG|-7s#H*g z!be4?*6GWADTY_`Q_+(tOdZDfXI;ggq>u34A5D^Tu$$7-mD?~h2KwI?UQzF@Zw>uE ze0c7rYF@7v0o7n{Y8E zD!#L!p1QWJ3i-rtV=?8y&#hj6{_2E|*^ZmX|C<;V^12NBP;ud8bdYDUxDYk4Q=l*5d~9SISM8Z_*<`g{L9G4A z83ew6;xx|QWG{8=f<|nGdf8&}U1#-dI_l@JuctcJ!eoeN5Uin+KOTsNMYP@;+M^7S z-d=?kC#Gz4v%&Ut>1bgRniuLq{Bg#Q@Fkn;;wdu@DKBmn0_#ZLqgnof;ChK8Edvws~kt$Fq(f;RBXnt}u)-ksXu7{EJY|?5^a1s0L zGxC+Kfocu6uV~{JpDz?DlPPsQvx)?8JPFzz^xXcVxs}kyfLJa4)j_REqojT&%DOND z%SQS|F52RMn&~lo+4aJ?Y$0lH)9PmeDcWKr%qo1h8rA~4I~kcBhLlv93DcE23L#Dl$Vy)l?3CRx!e{qe+vU$t%pnH8d2&GeiW6ne{2pgE`l%w9{u^AF)5 zK5F!=MR{=F{xCnRc6=Z$8yLu9<8N;rP~f zdf+ue#Yu)I3isgw)_Zykf+it_`#}M3DLP&K*qHf=i3l4VZab-gJ3{x;K8FCQy{Ug| z^V(Wf$(R$rxWJ6)YtsUEE)<}1TG_=jwPX$(W-N4C1Y>Yt3>n4(ISIwnMfmq7Yy=tu zpJm2l9wi)|lSV1@{P3g|sD?e`&8Bi^tgaK#bl!bE^NtEAfO=pmIx0T=NZCUu_qh)` z<9vQ-eWWF|m}3@|2U+kZ#<##k>~9ck-!=xm$ABNTZ2UOHU3U0yV>Ue^F&soT-e2-! zHN_+g8k}32vO$exj$$?3p6c$p%Idb8`pDnO5!_z5VMZymoEpTVF)dktdVz{^WxVJ! zN&1;FEB=FIaoQ#>@nAzEe>`=jZ!ZnQ+LWKbYjxE`W_|Vo8RDv(Fs6sYn(ezD?gSX^ z(5$Tc>&8Gh%SILrT(0Cs4}vXkbnB4Ze6UMcQwuY}DIs{$KL}s*CNGyQoRE|6=aH`* z*OvIPL7drr(^ic$jOG!ab@%+C)Ii&}I?*%%=uR}1Lb}~TetUe@x91f`Xl$LDr+vlh ziicNTyfQh$Yu{%hkS)8<*9Dq5t+%%daac3KeltMB5vBnJZK7 z=vmdCuBScCz7_n7Qxn8#My$tNwWY(}h=S+`>kqIuBiQ&`%i9)PUk@uiw?WY8pYZdq z!QXZ3cL$-=M5r-SG;A%TpJ71Dz3buT7m05T>-3sB!CnI2FZqtWX0XeAN7O(D+q^@9 zdUZR+PHVKS8NmmT%C7kom&hL4mlUp#tIfa034byCVn6FrUvjU>w6|KO=A4(Tic|^G zA@sqz|3zhpjZ$Y8E}Qwpx5^MoF}yKxng7GY`TybT=Z?w8w?P_3M!bHQZF%6Sncw*G zkpK7T{r{dUGp``w??enq#zO zr|hMw3}yt1Nb*6-`PtdI6l6d6$EwF665@;d=XwQjcclTgu+}eDBk(A=;z3{Ye_rUJ zXqV4~_8RJUj~05A+Y=Gh?wAqCAj!);EW*w6>+^A6G>IQ%{7aO`41yznA^l#hw)Lx* z&EEtY*fAqL{aU|eYN^*Fab?ImKhw0(d56V^6;4^|RQ=1i?te@}oGToZ7AU%zqk*HQ zhC4&z*exPFL7eU?a6Cqs{NhJQ;_~}&n(FF(%+yYwAt)<`llxkoIld(Sn7Wjv)uO;TJ-_W?_N>sJ%7 z8Y!En<(L1r7g|!t+vap4uI!c5_YRDa8mfxm7e`WQ5|Kq(X-Kl9upXn-6!P%LoWd}f z-Adln59>;+)vz~S;7f$#M(t={DDV0f64v?Fgi67Xfr^&>mz?*_&y2AQv)okP8?20a z^bDXD$jpnG{jh~jMDqt{C1Ft`Ez$b3-GS=;;xMD^w}w9H$5_IcrSh3y5L9E3j z0nX=8Pq2r!$M_^>m`wJzx_6khW{xGio5E=A`$Zh1@$0#(mCL3z)18g(=9v4lzn%fR z1=kxIUV;zoKw5)&ALM}=qe(n}o8}?-Ym0V~Kaxm~HMfZ5bqDe}OXsgbxIACBgeBjM z@~=ubkLl9J}99f%E7$JmYjwG#&qSp@XB9KrjgT|PNFOMlF#NeZ8XFH5idn7vrDt3IXxtdL$2T7wV)-p9mRLI`2_n%%u6s% zIXSlgJwXXJzFjV_+2*3wy`m7d@}Oxy95Br-?F&)8qKD}QHq^53k_)cNGWagVi}N4l ztS=U$QFmBF<$qNl9}E@KFfpzkQY!Y+_iYT~6;HamvYMbzr(zuOVu$G0t|nM|4v=w2 zjQFtNTf>s9ofyiSALGxoaH-5*0Rds|xBMR7bLoR(6^9>59;+sXNS4R@R&GVzLt6~F zPDW?1@8 z*ncX<4VGDk%wU)Qs$JV0E!TRh<{Ix;`BJiYy!>jNTwCLztevfvShJJ{pJ`L4z_wPN z?3T^^+(O;$R*x-l+S`nR8b{9Nv4;rK!0k*)rAVX(Q;Qog5_o9Myma(9-x~fjD7%sx zl3G}DXrw`KcGt*!(sN+XgXNtRPMHidyTyi(*LpJf)}v+DCL+Fg2ixaq2#c8VhO{_8 zRwu|HdaY(UP99tz5fzV)mA{K}ZTz+$_ zJQ{4T77WgB4Lkd`O~$yY>kBROYQul604tUA?3lqG;b)=Q$){U1%y$Zu;I~(!stVjH6oX z{^DsioyERpvvC=CoQnlq5)S2csIr~0nQ0z&e24;?G;VSgF802nV9H80xJZd+n7MfY zv0rizq;3ql5k|nFa4&p9dm-X!{PL0GO@FK3Zy~3(BR&cH0aegF5Xy=k$1LFA; ztj?|N4YjLEb^eYfU4!L+2aXoz6AKz<>oqD*k=NhP3z2)7ARxz|%uhNq=vsF5F%PXR z=`{Cr?+LF5aA_TQFOQgR6OP4KD>rlvROjf)Gt3hS?wqpa!2X&jeP?Ti&4Sdo0$(ooID$u^IjF1h0%=@Is}--=6|^Y zcMK0vtc=VM21|ti<7O_@K!6`9w&yt6A-Fc1(}#dW=I9~dQCq4g4EY?|$)I|V4w0(z z_?|)I@NI6QX}%soP7h|E?{XXi4V2rU6_)mS(>rtsfZ`qlB{rB*H z#w34snEK$j=yXwOc7;J2A>38Bq-;;O^H#60?MW<=yV(-sVY)~*oEdw40_xR>QN{wv zi5I3EjyKOHikAP|S^((Ar+8$KrV|{6a>YPiPt4TKCJ4h!UErg}IqH*`3)cC)eZyG? z+3Ktdgwt!$k);Q3i*e(>R`&IZ%s zDKAF2SDZUk&R{jI*MhI6)s1cFyKn9l&VmukfrfLM!AFy(rhgq@7Pdb3)V!x(dVkyd z0fSraG~|pkLRpDaujUy?!%_2#)=(IdUnFMINV+PTz>{Dpl2wf?-9 zi%gD6#$2=B2430^AeQLOB8o3>t_GN}Gh>gfkqw#14@@XyFP~l=>>T=QoBTQUtRvQB zMz0zd#EwppAHdW=%7H!Cyq=`dnj_HE*gH zcw&Gb>US3Rn`<()=m@1qrdea!cL@${|C!52TPdz)HUj4p@ak4vC)hdxNoe;gRpO7x zJGzBuiS^)Fvfd2%N`|`2=l7JSK!F3&0cnVSx_u(aHVDg})K_1( ziAF)0QCD#gTn%L&)k45>{wDcwaXmax^Nng;Vo(=0yfjj*=zZfzzI^PbBO|1FMo#9- zZwn+O<-2kZ>u-GHhTTgLHSMA+I0GY~Wu$+RmR1AtX4^NbSUG`44`e#+6FvNVV(V$`#HwiQ%KkGVcpskaCe)0=2oZ@G&L4Y`rS` z`v(ToL~W?s;OF#4h_=Tm|MqbJDQ)lCA(-rO4DgsZQZLndE65sv@72 z*>DhLsB&5A`;coerkdooxU}N16F!xPsEnVC2rPlBMbAwb_hGX-}ZSb{FB;9hq97#%vGJ6W|}G% zjcy)dtxv9yb-x~shElNnYKwgKRN(Il(!-fwRnVTt>DN$X)I?aV;;UKp^z&6SU$j=A`+uT9G`c5b#5m}DC_m4ymgkID=)*o^y*O3{K zB9Ud0yY(}F1Lc}qGGtO&^+vQjuD6C+GzK(33U_x3bW{KCj5Z(RzNt`UAPkcT4h{xb z1VAoh&oAzUXX@V;*y3R0I+P>TH_3Cq)(hUIJf0q9X-YR`TrhiX@}qa%cabbTUIoWw z#$0WA4RqcyJXnvin-Pd}*yZcYs}^s*=G2VkzWJ(Qr;N?Mlpvv+f2_`|QN4gvaiFm+CLBz38Y`MxUI4GB>v;PxV(=b z0at{1POL?Axk!4+vMTANUTr@0Um1R3uBz9%_k7L$`@$E;uS7Y&5?XT5AN2C5dt0b_ ziY*s2gSM8_3{|u~?B^m@SWqFdNb!^b3nAU}la3~5DNK}=w^m`q?G-B+X;XXoNr+~< z33qt*Rhvk@tv)jr67skV_$a{{ETu;aemBrk{VO{*yYUI8znB>*ca89Igr3~KR)jym zjtIHqyh;$?s3!r$i>KCBSAS&C0HiqM%R|>dA-{4z?QO*j9qP8B+Tc)w#RH92hA{d4 z5zC(#8yk@UluDS)Y=ac@CL7S=MC9oBqnfPC^#1%?8GtchFxk@#CGJzv+CR zj)T!0G`W!4?~N=0IM)9aH@l586m%QHR5nT+FOMs2`!K6&wVS^JMXw|=E{GtFihcYa zdK9t?RGKicq@*~UjFUR;;T0Yuq}ZcK_cJAsnq*-ot0V4gXl#Vk?P!#H_oAWFm4 z+MEFEO0j^$TxJCtl2ZLg5soaWfQ5dHi=0g6a*(r86!zf;!eZpKmA0T%0cvpDJMUt3sH{;&OC+7W&QT3qO2+ysjzPBdq0pMt(<zvq`c8-J)o?{>!6`=oCy;t#1(D|f~Ni4b=UVZL|tO!B(fT}L0V zDPqn<((F^lZw))nHiI9rQ@y_TTzb0LoQpoMMok~k>`E_hK07MbhUo4r#n^9Kpgvi| z%H{`cd2*B~X5A;;(Qi0HM8h5pH<=SjO?4Mtq_^-v{$r2yawEmkCJJ`@KM0cIvLVP6V)D36x6KozLL{PB$J+Zs4=C0}E_fy6@(n_JT3*+Vyi!$6f5)Ai zad!ph#7~zQF|hWh5PYsfQ9Q~XM8mas+CYgKFK|vSu+V73UXwmyCXegi?8O$bcGA6D zAv=1`v4dlu;Y1u30DNa>oHDp#9~V8j@IgQ3`W!`|YFTfS$%Qa#=IepO;$UNMpZ&ay z=@Yj!K&4)d3fCfjB%+#cL+<`a`B1r^3Mz@!hhOXv7sCO~3UxAj0)c@w>!;wvesvGE z9j!lZ87$wP-$al&ZwLZ(jlo!R*9oX>-H7hwJ*HP2@H^YQo9_v>#)sfa zcyj{0e`k!QeYq+hCqXZu&Sindu_N+CkxHuS@^CxtN(SnXEIyu)0l4^tGdCAAckn0M zg_Z#1yA&n{aIXT{RHF!qSh=|dt58`=?-OOBKGzfT2$>(Lq6e(NF(3#b7Qzkw{Fz5( z+9SRq)g|N|RHVhF3vPo=N&?T(5p(Of^Uj#KS`@_^xrrB?RBQ=<-YBvsA>zWzAhR_wkQL04}cq!Z@QIwZoLI6EJ~C-mt1! z%hP-2rPGbg;p13Ek~(ds5z%-xXYa~UAnQGvr))d8*y0gfr*BO z*Cqc~07xH7GUqMuq7!xpn9^CTm&vDqtDs?^T{dj91zoB8iKFAW-bSU1Ix2`d4p7|K z?AX`0TXKq;>R*>Y*-G;bbh7bq2}+vAR!)B&wzF<)L2Ni{GDc0e$Exz%VN16smVg!6 zdXQ(o?*2y*4}em{yin|m2u~3gUH8eu+ftF?!0%cJ0HbwiiRNHp{rfIzVh||9(+aDw zm!`OY0IOQv+8A!H9$Yz0SKPaIT~vc17?%f0T2)sSk_&prJtQOA*r#g1#c{a21aMgv zB(&=@GPx%vyk=c7Zov5E=a&$c_`c%{)7CUAQKD%_7D&F6r<{ZpAGoj?m$Xgdy!_Va zqV$EGDOX5DnD-Azs&bN4KH)5Ms0$MW;kn!JOmna=FZ9ar>pEkS9DhFu@kug*qGEgK z9`{#x1#T^wF>Y&Yym!=n3ly5bW@I)Kj(!tdJ5 zK>2Kx$gt-F!DhJk4<^g{(c*Ck@R6OFZyu#5QFN7S_$iDo)`ubv#EbwWZTWIO!Y{8~ zP#gmtx|}@3j+#|uZDp0NPVHjA@}qvo_dF5&AS$12@u#dWC|RFW*QXe4ZcE0oU)lo3 zVFoB0pvw{3bp-sO+h;!Iv?kX!gYJ+!Co>9XF}d|1{>Qe>IJ7&reG^Dzc_a-Zy%Aui zIb&ABw}a-f1hL9HrS(3+)yv)W-3m7;u9(6vw^tsWfb*TKR>Z=YYg_?BuVuJD6?6@r zngk#QvdwEHvff_Sf`s<<=zuaIhRQQjE~N7ZDBk}3K?41vPJO*e#PNSj%2A_rMl8e9 z4^TlGTye@b-0)!%?Z6-#>QB*LO1&g$xOde)H*in36}bH3H2g=OQ`y32m`gem3Y&eJ3rXYG<48KA3H;4oHW8oUs0*P9+ZO z5}H0oHFwy;@W)h<{|fcOyM*NweS)%lMb!_J5dG>R4Dir@ROZDB%nWRhp+MvZrl#h|-UVK`Q?hszhF*;(iIc5uX)_Z=hmT+=Xq?6}>RLwAYe4F2YIuwo36tLX zt(<0u0^oKTrv-Ypa`mSU}NezDTRybg{wJ z|0;%2BOoFIL!-(f&;5Jxdwt61ocY(4pQ^BfBv0af?vaDj731IDce)-c^CH=cBn055ymHng_Z;c%YF zx3%S8p5h*?cQ?x;fN#FE@+;bWAN#)qBhzBje(F8eGp@ zE@w<=X=u{Y(jb5|TI0dMz!)1JcLkr$RGJf%mX=DV3N^OfG&DATl9e@HZuyShKb|Rx zF+V>)UGHq&*rilmpjGemD>k-!G*hznVp8K^ZGK?^w(N@mbd{Bs=7UDUl{RV$iDNT* zDH%>mNlgu{si|?BfRI@Z&-RT~S!z^S&Pf1G5)l#IZ3#cZnLUsf8P1S>Zg+dX5 zlf(^f5_iL0-`*N<5C?^a8($xHN?p7srJ~G zqW@S5=QAeK;({ zl39gqrEY<7xOjL<*CCD8OG4pf{0J?ZgNeZKU(wL~k==8w5HzQkvan$AMa0OFieB7+HB+! zpPn)uk@52KR+uSOm%rj(aKN#(wbiV#N!MN@J-ND~W@RmHa}Np%dXAtTp{G%4rnFKX z%dOvm^zd-iJpNaS9#FPkUS8W5j{HvlapC=K{wTDJj7A%M(WLxNp{{3}whwnOzQW=r zaPb)#uibgQ9`BtI(1^u8eE8rSyY#ZbtNeAirYM-R^7GeAh)?yhO1H+7cWSM{7fKUS;@*PR{GJ8e6ezv*y2DrL! zLU~?f-Fn`$k!O3OvacpD@4uu8PA+{^DOe!7;#dC(g+eoEf>&2o^t`QyQw00sSPk}z z@9*w@gXBS@rl$5;T|HqePcfIc+ttN|hAQfl>)lCr^!d5NJ0T(Mcp*aj*Cl~h~KHeQ=6HY*=VKB|LLresj0;lOHB(xR=^`ZJ2_QFCM5h7xSF@` z`woxzyQHLqcuHmNvLKIvx#>D1G9{&GeQS#zib0_)5lSe(Vy}E9_^)D+6irW04}=f1 zt{QLDdMqa-!V9W1uHz;w1tL>U8ReopP zez|$^&(by7qoDtfK*M6Q-bM)I9Xzfl>>e3+V=VLj7SU)Rdu!pt4BBTQn$on;!U}2O zFI+y6FFq5~B){K5`%FqBo~HW#(~FJfjm=t$-|JHCl4%7mj4){;G}WC$q}DP%sJVRm zGrU!Bc*W*=YPhjIn%UPGLJ+;a{vWSD8yXrGHuolMn)e(rP*Y0=1qS{()^@yA(<;jw zE1@v=a_UUTJt*BYN1AN7=uT+9e&(ebA@-w`e50b>?Jx~xGKCdg^jaOY>Xn_N;}C@=e-j zY}!TOA!ra(?wYl!KP)HMeE9JF-wyy(WZ}ztV=^}=@=-TLr+-u$YkHM5Qu|?MJTP#g zUSb9$n70#uHO0Xf38X6WNVIVz3d!6=lH}BXVXh)RXKv;i?zZ=i@{;xwj3~ob30C`CYr(7jP(d1vqd_M(uM5byJL~(fzg^qD8CaJTm#^8< zH_rbTP6b`x%mo*~uNHZvIdZZIzkKsEN8F~$lsItDzJ}rl^Ib(vUO(I81~z0vN>tz{Z1*Rzr^Gg$Ku*OLxhEgRpFzOc1CnjmcZ!Wn4k>EDl78W7B> zCwU)Yd#nnp1-A#`N5j{g8pv?!OIEJ!F6P_m7oGN{ufFTwV4f{`VY?xfxHm>7lknOP sGfYNC274n_g`kbo->!1ST;uu?UM(3J4+GO%2?G8;iOY%=iRk|LFBf4G>;M1& literal 0 HcmV?d00001 diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index ef9a5a7..6ed6b58 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -1,3 +1,7 @@ +{ + title: "Test `nginx.conf` Directives (subtitle: With MoonScript, OpenResty, + and Busted)" +} $index ## Introduction @@ -10,7 +14,7 @@ $ docker run --rm -it -p 80:80 openresty/openresty:bookworm-buildpack Visit `localhost` in browser. Should see OpenResty splash page. -![OpenResty default nginx index page](/images/openresty-splash-page.png) +![OpenResty default nginx index page](/images/openresty-default-index-page.png) https://openresty.org/en/getting-started.html#prepare-directory-layout @@ -344,7 +348,7 @@ server { Add subdomain to certs in Dockerfile: ``` - -addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" +-addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" ``` Add a test socket server: -- 2.39.5 From be52884226866fc49fc98acc186647867c834124 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Thu, 26 Jun 2025 18:14:32 -0700 Subject: [PATCH 12/19] Update post --- .../2025-06-22-test-nginx-conf-directives.md | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index 6ed6b58..07f9336 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -8,22 +8,32 @@ $index We'll need nginx and luarocks. Buildpack has luarocks installed. -docker pull openresty/openresty:bookworm-buildpack +```console +$ docker pull openresty/openresty:bookworm-buildpack +``` +Start a server on `localhost`: + +```console $ docker run --rm -it -p 80:80 openresty/openresty:bookworm-buildpack +``` Visit `localhost` in browser. Should see OpenResty splash page. ![OpenResty default nginx index page](/images/openresty-default-index-page.png) -https://openresty.org/en/getting-started.html#prepare-directory-layout +[Prepare directory layout](ehttps://openresty.org/en/getting-started.html#prepare-directory-layout) +```console $ mkdir -p logs/ conf/conf.d/ html/ +``` -https://github.com/openresty/docker-openresty?tab=readme-ov-file#nginx-config-files +[Copy config file](https://github.com/openresty/docker-openresty?tab=readme-ov-file#nginx-config-files) +```console $ docker run --rm -it -w /opt -v $PWD:/opt openresty/openresty:bookworm-buildpack \ cp /etc/nginx/conf.d/default.conf /opt/conf.d/ +``` edit default.conf change `root /usr/local/openresty/nginx/html;` to: @@ -149,7 +159,9 @@ container does not have access to the internet, otherwise we might unintentionally get a response from a domain's server on the internet rather than from our test server. +```console $ docker network create --internal no-internet +``` Now we can start the test server with our host: @@ -287,8 +299,7 @@ server { Rebuild the image: ```console -$ make image-rm -$ make image-build +$ make image-rm image-build ``` Run tests: @@ -323,7 +334,7 @@ $ make test 3 successes / 0 failures / 0 errors / 0 pending : 0.017065 seconds ``` -## Reverse proxy a subdomain to a Gitea unix socket +## Reverse proxy a subdomain to a unix socket Add to `default.conf`: @@ -351,13 +362,13 @@ Add subdomain to certs in Dockerfile: -addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" ``` -Add a test socket server: +Add a test socket server (copied and modified from [here](https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua)): +::: filename-for-code-block `spec/unixstreamsrvr.moon` +::: ```moonscript --- modified from --- https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua socket = require "socket" socket.unix = require "socket.unix" u = assert socket.unix.stream! @@ -384,7 +395,7 @@ describe "https://git.domain.abc", -> os.execute "install -o #{socket.owner} -d #{socket.dir}" cmd = "su -s /bin/bash -c 'moon %s' %s" server = io.popen cmd\format "#{basepath}/#{socket.fname}", socket.owner - os.execute "sleep #{seconds}" + os.execute "sleep #{seconds}" -- wait for server to start f = io.popen "find #{socket.dir} -type s -ls", "r" result = with f\read "*a" f\close! @@ -423,4 +434,28 @@ $ make test ## Bonus!: Issues We Ran Into Just Trying To Make This Post 1. `$host$request_uri` + + `renderers/markdown.moon` + + ```moonscript + dollar_temp = "0000sitegen_markdown00dollar0000" + ``` + + So, when two cosmo selectors had no space between them, it was ambiguous + to which selector the numbers belonged. + + ``` + 0000sitegen_markdown00dollar0000.10000sitegen_markdown00dollar0000.2 + ``` + + Solution was to change the first `0` to a letter `z`: + + ``` + z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2 + ``` + + Because `dollar_temp` is a private attribute, I had to copy every function + from the sitegen markdown renderer. Which makes my renderer a copy with + some additions. + 2. `$$ct` -- 2.39.5 From 0cc8f183020e18723d83eb9175cd73c5aee27355 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Fri, 27 Jun 2025 10:54:11 -0700 Subject: [PATCH 13/19] Update post --- .../2025-06-22-test-nginx-conf-directives.md | 90 ++++++++++++++----- 1 file changed, 70 insertions(+), 20 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index 07f9336..aeb214a 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -387,7 +387,7 @@ Add a spec: ```moonscript describe "https://git.domain.abc", -> - it "reverse-proxy's request to a gitea unix socket", -> + it "reverse-proxy's a subdomain request to a unix socket", -> socket = fname: "unixstreamsrvr.moon", dir: "/run/gitea", owner: "nobody" basepath = debug.getinfo(1).short_src\match"^(.*)/[^/]*$" or "." seconds = 0.1 @@ -433,29 +433,79 @@ $ make test ## Bonus!: Issues We Ran Into Just Trying To Make This Post -1. `$host$request_uri` +### `$host$request_uri` - `renderers/markdown.moon` +::: filename-for-code-block +`renderers/markdown.moon` +::: - ```moonscript - dollar_temp = "0000sitegen_markdown00dollar0000" - ``` +```moonscript +dollar_temp = "0000sitegen_markdown00dollar0000" +``` - So, when two cosmo selectors had no space between them, it was ambiguous - to which selector the numbers belonged. +So, when two cosmo selectors had no space between them, it was ambiguous +to which selector the numbers belonged. - ``` - 0000sitegen_markdown00dollar0000.10000sitegen_markdown00dollar0000.2 - ``` +``` +0000sitegen_markdown00dollar0000.10000sitegen_markdown00dollar0000.2 +``` - Solution was to change the first `0` to a letter `z`: +Solution was to change the first `0` to a letter `z`: - ``` - z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2 - ``` - - Because `dollar_temp` is a private attribute, I had to copy every function - from the sitegen markdown renderer. Which makes my renderer a copy with - some additions. +``` +z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2 +``` -2. `$$ct` +Because `dollar_temp` is a private attribute, I had to copy every function +from the sitegen markdown renderer. Which makes my renderer a copy with +some additions. + +::: filename-for-code-block +`spec/renderers_spec.moon` +::: + +```moonscript +import escape_cosmo, unescape_cosmo from require "renderers.markdown" + +it "escapes and unescapes adjacent cosmo selectors", -> + str = "$one$two" + escaped = escape_cosmo str + assert.same escaped, + "z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2" + assert.same str, (unescape_cosmo escape_cosmo str) +``` + +### `$$ct` + +``` +z000sitegen_markdown00dollar0000.1 +``` + +Because `.` is not a valid character for a variable name, when this string +is syntax-highlighted, it gets split, like this: + +``` +z000sitegen_markdown00dollar0000.1 +``` + +The string is then 'unescaped', but because the string got split by the +closing `` tag, it will no longer match the pattern and the +'unescape' fails. + +The solution was to change the `.` in the dollar temp pattern to `_`, which is +a valid character in a variable name. Update the `$one$two` spec escaped +string. + +::: filename-for-code-block +`spec/renderers_spec.moon` +::: + +```moonscript +it "escapes and unescapes double dollar signs", -> + out = flatten_html render [[ +```Makefile + $$name +```]] + + assert.same [[
$$name
]], out +``` -- 2.39.5 From 5d7896e9e576a68da667f134fd460f32b47f5e53 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Sun, 29 Jun 2025 20:28:07 -0700 Subject: [PATCH 14/19] Update post --- .../2025-06-22-test-nginx-conf-directives.md | 275 ++++++++++++------ pygments.css | 4 +- 2 files changed, 183 insertions(+), 96 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index aeb214a..bfdae27 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -1,12 +1,36 @@ { - title: "Test `nginx.conf` Directives (subtitle: With MoonScript, OpenResty, - and Busted)" + title: "Test nginx Configuration Directives" + blurb: "Write tests for `nginx.conf` directives and run them against a test + server." } $index ## Introduction -We'll need nginx and luarocks. Buildpack has luarocks installed. +[`nginx`](https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#rewrite-uris-in-requests) +config file `nginx.conf` can contain any number of important directives +(redirects and rewrites, for example) that need to be verified for correctness. +We can write `specs` for directives and run them against a running test server +to ensure they are correct. + +We'll use... + +- [MoonScript](https://moonscript.org) and (by extension) +[Lua](https://www.lua.org/) programming languages +- `nginx` we'll get from [OpenResty](https://openresty.org/en/), a web platform +created by Chinese developer, [Yichun Zhang](https://agentzh.org/) +- the [Busted testing framework](https://lunarmodules.github.io/busted/) +- the Lua package manager, [LuaRocks](https://luarocks.org/) +- a fantastic little library, +[`luajit-curl`](https://bitbucket.org/senanetworksinc/luajit-curl/src/master/), +from Japanese developer [SENA Networks, Inc](https://www.sena-networks.co.jp) +- another great library, written by volunteers, [LuaSocket](https://github.com/lunarmodules/luasocket) +- our favorite container manager, [Docker Engine](https://docs.docker.com/engine/) + +## Setup + +Since we require LuaRocks, we'll use a Buildpack tag, which comes with it +already installed. ```console $ docker pull openresty/openresty:bookworm-buildpack @@ -18,29 +42,44 @@ Start a server on `localhost`: $ docker run --rm -it -p 80:80 openresty/openresty:bookworm-buildpack ``` -Visit `localhost` in browser. Should see OpenResty splash page. +Visit `localhost` in browser. We should see the OpenResty splash page. ![OpenResty default nginx index page](/images/openresty-default-index-page.png) -[Prepare directory layout](ehttps://openresty.org/en/getting-started.html#prepare-directory-layout) +## Get `nginx` running + +First, let's [prepare the directory layout](https://openresty.org/en/getting-started.html#prepare-directory-layout). ```console $ mkdir -p logs/ conf/conf.d/ html/ ``` -[Copy config file](https://github.com/openresty/docker-openresty?tab=readme-ov-file#nginx-config-files) +Next, we copy over [the default `nginx` config file](https://github.com/openresty/docker-openresty?tab=readme-ov-file#nginx-config-files). ```console $ docker run --rm -it -w /opt -v $PWD:/opt openresty/openresty:bookworm-buildpack \ cp /etc/nginx/conf.d/default.conf /opt/conf.d/ ``` -edit default.conf -change `root /usr/local/openresty/nginx/html;` to: +Then, we edit `default.conf` to change `root /usr/local/openresty/nginx/html;` +to `root /var/www;`: - root /var/www; +::: filename-for-code-block +`conf/conf.d/default.conf` +::: +```diff + location / { +- root /usr/local/openresty/nginx/html; ++ root /var/www; + index index.html index.htm; +``` + +Now, let's add an index file. + +::: filename-for-code-block `html/index.html` +::: ```html @@ -56,7 +95,7 @@ change `root /usr/local/openresty/nginx/html;` to: ``` -Start nginx: +Last, we start `nginx`: ```console $ docker run --rm -it -p 80:80 \ @@ -64,6 +103,8 @@ $ docker run --rm -it -p 80:80 \ openresty/openresty:bookworm-buildpack ``` +## Test an HTTP request + Then, in another console: ```console @@ -88,27 +129,40 @@ $ curl -v localhost ``` -If we wanted to write a test for that, we need some packages from `luarocks`. +If we want to write a test for that, we need some packages from LuaRocks. Let's +add a Dockerfile. -`Dockerfile` +### Add a `Dockerfile` ```Dockerfile FROM openresty/openresty:bookworm-buildpack WORKDIR /opt/app -# needed for testing RUN luarocks install busted RUN luarocks install luajit-curl -RUN luarocks install luasocket # needed for testing nginx reverse proxy +RUN luarocks install luasocket ``` +Now let's build our image: + ```console $ docker build -t test-nginx . +``` + +### Write the test + +Let's first make a new directory for our 'specs'. + +```console $ mkdir spec ``` +Our test makes a cURL request against our test server: + +::: filename-for-code-block `spec/nginx_spec.moon` +::: ```moonscript http = require "luajit-curl-helper.http" @@ -127,6 +181,8 @@ describe "http://localhost", -> assert.same request\body!\match("%s+(.-)%s+"), "hello world!" ``` +### Run the test suite + Start the test server: ```console @@ -137,7 +193,7 @@ $ ct=$(docker run --rm -d \ test-nginx) ``` -Run the tests. +Start the test run: ```console $ docker exec -t $ct busted @@ -148,67 +204,13 @@ $ docker exec -t $ct busted Stop the test server. ```console -$ docker exec -t $ct openresty -s stop +$ docker exec $ct openresty -s stop ``` -## Edit hosts +## Create a `Makefile` -Instead of `localhost` we'd like to use an actual domain name. We can do this -with the `--add-host` option. But before we do that, we want to make sure our -container does not have access to the internet, otherwise we might -unintentionally get a response from a domain's server on the internet rather -than from our test server. - -```console -$ docker network create --internal no-internet -``` - -Now we can start the test server with our host: - -```console -$ ct=$(docker run --rm -d \ --v $PWD/conf/conf.d:/etc/nginx/conf.d \ --v $PWD/html:/var/www \ --v $PWD:/opt/app \ ---network no-internet \ ---add-host=domain.abc=127.0.0.1 \ -test-nginx) -``` - -Update our test - - request = req "http://localhost" - -to - - request = req "http://domain.abc" - -Run the tests. - -```console -$ docker exec -t $ct busted -● -1 success / 0 failures / 0 errors / 0 pending : 0.008246 seconds -``` - -Stop the test server. - -```console -$ docker exec -t $ct openresty -s stop -``` - -## Add a test to make sure the test server is offline - -```moonscript -describe "test environment", -> - it "can't connect to the internet", -> - assert.has_error (-> req "http://example.org"), - "Couldn't resolve host name" -``` - -## Create a Makefile - -Let's create a `Makefile` to make running all these commands easier. +Ok, we now have a number of long `docker` commands, let's create a `Makefile` +to make running them easier. `Makefile` @@ -242,10 +244,74 @@ $ make test 2 successes / 0 failures / 0 errors / 0 pending : 0.008812 seconds ``` -## SSL +## Configure the domain name + +Instead of `localhost` we'd like to use an actual domain name. We can do this +with the `--add-host` option. But before we do that, we want to make sure our +container does not have access to the internet, otherwise we might +unintentionally get a response from a domain's server on the internet rather +than from our test server. + +```console +$ docker network create --internal no-internet +``` + +Now we can start the test server with our host: + +```console +$ ct=$(docker run --rm -d \ +-v $PWD/conf/conf.d:/etc/nginx/conf.d \ +-v $PWD/html:/var/www \ +-v $PWD:/opt/app \ +--network no-internet \ +--add-host=domain.abc=127.0.0.1 \ +test-nginx) +``` + +Update our test: + +::: filename-for-code-block +`spec/nginx_spec.moon` +::: + +```diff +-describe "http://localhost", -> ++describe "http://domain.abc", -> + it "sends /index.html", -> +- request = req "http://localhost" ++ request = req "http://domain.abc" + assert.same request\statusCode!, 200 +``` + +Run the tests. + +```console +$ docker exec -t $ct busted +● +1 success / 0 failures / 0 errors / 0 pending : 0.008246 seconds +``` + +Stop the test server. + +```console +$ docker exec -t $ct openresty -s stop +``` + +### Ensure the test container is offline + +```moonscript +describe "test environment", -> + it "can't connect to the internet", -> + assert.has_error (-> req "http://example.org"), + "Couldn't resolve host name" +``` + +## Test an HTTP redirect We want our server to redirect all `http` requests to `https`. +### Write the test + Our test: ```moonscript @@ -271,17 +337,7 @@ Expected: (number) 200 ``` -Make self-signed certs in Dockerfile: - -```Dockerfile -RUN openssl req -x509 -newkey rsa:4096 -nodes \ - -keyout /etc/ssl/private/domain.abc.pem \ - -out /etc/ssl/certs/domain.abc.pem \ - -sha256 -days 365 -subj '/CN=domain.abc' \ - -addext "subjectAltName=DNS:domain.abc" -``` - -Edit `default.conf`: +### Configure `nginx` ``` server { @@ -296,6 +352,18 @@ server { ssl_certificate_key /etc/ssl/private/domain.abc.pem; ``` +### Generate self-signed SSL/TLS certs for testing + +Make self-signed certs in Dockerfile: + +```Dockerfile +RUN openssl req -x509 -newkey rsa:4096 -nodes \ + -keyout /etc/ssl/private/domain.abc.pem \ + -out /etc/ssl/certs/domain.abc.pem \ + -sha256 -days 365 -subj '/CN=domain.abc' \ + -addext "subjectAltName=DNS:domain.abc" +``` + Rebuild the image: ```console @@ -318,7 +386,7 @@ Expected: (number) 301 ``` -Fix test: +It's our other test breaking, now. Fix spec: ```moonscript describe "https://domain.abc", -> @@ -334,9 +402,17 @@ $ make test 3 successes / 0 failures / 0 errors / 0 pending : 0.017065 seconds ``` -## Reverse proxy a subdomain to a unix socket +👍 -Add to `default.conf`: +## Test subdomain reverse proxy to a unix socket + +Let's say we have a running service that connects to a unix socket. We want to +proxy the requests through `nginx` so that our service can respond to `https` +requests but can leave handling SSL/TLS to `nginx`. + +### Configure `nginx` + +Our `nginx` config file might look something like this: ``` server { @@ -356,13 +432,15 @@ server { } ``` -Add subdomain to certs in Dockerfile: +### Add subdomain to SSL/TLS certs -``` +```Dockerfile -addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" ``` -Add a test socket server (copied and modified from [here](https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua)): +### Add a test socket server + +Copied and modified from [here](https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua)): ::: filename-for-code-block `spec/unixstreamsrvr.moon` @@ -383,7 +461,11 @@ while true print m ``` -Add a spec: +### Write the test + +::: filename-for-code-block +`spec/nginx_spec.moon` +::: ```moonscript describe "https://git.domain.abc", -> @@ -411,6 +493,10 @@ describe "https://git.domain.abc", -> Edit Makefile: +::: filename-for-code-block +`Makefile` +::: + --add-host=git.domain.abc=$(loopback) \ Rebuild image: @@ -427,11 +513,12 @@ $ make test 4 successes / 0 failures / 0 errors / 0 pending : 0.131619 seconds ``` - ## Conclusion +Using these tools, we can verify that our `nginx` configuration is working the +way we intend. -## Bonus!: Issues We Ran Into Just Trying To Make This Post +## Bonus!: Issues Ran Into Just Making This Post ### `$host$request_uri` diff --git a/pygments.css b/pygments.css index db6cb84..bc781fd 100644 --- a/pygments.css +++ b/pygments.css @@ -23,11 +23,11 @@ span.linenos.special { color: #50fa7b; background-color: #6272a4; padding-left: .highlight .py-cpf { color: #6272a4 } /* Comment.PreprocFile */ .highlight .py-c1 { color: #6272a4 } /* Comment.Single */ .highlight .py-cs { color: #6272a4 } /* Comment.Special */ -.highlight .py-gd { color: #8b080b } /* Generic.Deleted */ +.highlight .py-gd { color: #ff5555 } /* Generic.Deleted */ .highlight .py-ge { color: #f8f8f2; text-decoration: underline } /* Generic.Emph */ .highlight .py-gr { color: #f8f8f2 } /* Generic.Error */ .highlight .py-gh { color: #f8f8f2; font-weight: bold } /* Generic.Heading */ -.highlight .py-gi { color: #f8f8f2; font-weight: bold } /* Generic.Inserted */ +.highlight .py-gi { color: #50fa7b } /* Generic.Inserted */ .highlight .py-go { color: #f8f8f2 } /* Generic.Output */ .highlight .py-gp { color: #50fa7b } /* Generic.Prompt */ .highlight .py-gs { color: #f8f8f2 } /* Generic.Strong */ -- 2.39.5 From f9ef223cf12c34949dcdc7acca14c884859e9d71 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 30 Jun 2025 15:25:14 -0700 Subject: [PATCH 15/19] Edit post --- .../2025-06-22-test-nginx-conf-directives.md | 278 ++++++++++-------- 1 file changed, 163 insertions(+), 115 deletions(-) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-22-test-nginx-conf-directives.md index bfdae27..b89dc39 100644 --- a/posts/2025-06-22-test-nginx-conf-directives.md +++ b/posts/2025-06-22-test-nginx-conf-directives.md @@ -8,12 +8,12 @@ $index ## Introduction [`nginx`](https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#rewrite-uris-in-requests) -config file `nginx.conf` can contain any number of important directives -(redirects and rewrites, for example) that need to be verified for correctness. -We can write `specs` for directives and run them against a running test server -to ensure they are correct. +configuration can contain any number of important directives (redirects and +rewrites, for example) that need to be verified for correctness. We can write +tests for directives and run them against a test server to ensure they are +correct. -We'll use... +To do this, we'll use... - [MoonScript](https://moonscript.org) and (by extension) [Lua](https://www.lua.org/) programming languages @@ -42,7 +42,8 @@ Start a server on `localhost`: $ docker run --rm -it -p 80:80 openresty/openresty:bookworm-buildpack ``` -Visit `localhost` in browser. We should see the OpenResty splash page. +We can visit `localhost` in our browser and we should see the OpenResty splash +page. ![OpenResty default nginx index page](/images/openresty-default-index-page.png) @@ -61,8 +62,7 @@ $ docker run --rm -it -w /opt -v $PWD:/opt openresty/openresty:bookworm-buildpac cp /etc/nginx/conf.d/default.conf /opt/conf.d/ ``` -Then, we edit `default.conf` to change `root /usr/local/openresty/nginx/html;` -to `root /var/www;`: +Then, we update the root directive in `default.conf`: ::: filename-for-code-block `conf/conf.d/default.conf` @@ -103,9 +103,7 @@ $ docker run --rm -it -p 80:80 \ openresty/openresty:bookworm-buildpack ``` -## Test an HTTP request - -Then, in another console: +Then, in another console, this should output our index file. ```console $ curl -v localhost @@ -129,8 +127,11 @@ $ curl -v localhost ``` -If we want to write a test for that, we need some packages from LuaRocks. Let's -add a Dockerfile. +## Test an HTTP request + +If we want to write a test for that request, we need some packages from +LuaRocks. Let's add a Dockerfile to build an image with those packages +installed. ### Add a `Dockerfile` @@ -139,6 +140,7 @@ FROM openresty/openresty:bookworm-buildpack WORKDIR /opt/app +RUN luarocks install moonscript RUN luarocks install busted RUN luarocks install luajit-curl RUN luarocks install luasocket @@ -152,7 +154,7 @@ $ docker build -t test-nginx . ### Write the test -Let's first make a new directory for our 'specs'. +Let's first make a new directory where our tests will live. ```console $ mkdir spec @@ -183,7 +185,8 @@ describe "http://localhost", -> ### Run the test suite -Start the test server: +Start the test server. We're going to use `text-nginx`, the image we just +built. ```console $ ct=$(docker run --rm -d \ @@ -212,37 +215,30 @@ $ docker exec $ct openresty -s stop Ok, we now have a number of long `docker` commands, let's create a `Makefile` to make running them easier. +::: filename-for-code-block `Makefile` +::: ```Makefile image = test-nginx -loopback = 127.0.0.1 image-build: - docker build -t $(image) . + docker build -t $(image) . image-rm: - docker image rm $(image) + docker image rm $(image) test: - @ct=$(shell docker run --rm -d \ - -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ - -v $(PWD)/html:/var/www \ - -v $(PWD):/opt/app \ - --network no-internet \ - --add-host=domain.abc=$(loopback) \ - $(image)); \ - docker exec -t $$ct busted; \ - docker exec $$ct openresty -s stop + @ct=$(shell docker run --rm -d \ + -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ + -v $(PWD)/html:/var/www \ + -v $(PWD):/opt/app \ + $(image)); \ + docker exec -t $$ct busted; \ + docker exec $$ct openresty -s stop ``` -Now we can run tests by running `make test`. - -```console -$ make test -●● -2 successes / 0 failures / 0 errors / 0 pending : 0.008812 seconds -``` +Now we can run the test suite with the command `make test`. ## Configure the domain name @@ -252,23 +248,62 @@ container does not have access to the internet, otherwise we might unintentionally get a response from a domain's server on the internet rather than from our test server. +### Ensure the test container is offline + +We need to create a network that has no external access. + ```console $ docker network create --internal no-internet ``` -Now we can start the test server with our host: +Now we need to update our `Makefile` to add the test container to our +internal-only network: -```console -$ ct=$(docker run --rm -d \ --v $PWD/conf/conf.d:/etc/nginx/conf.d \ --v $PWD/html:/var/www \ --v $PWD:/opt/app \ ---network no-internet \ ---add-host=domain.abc=127.0.0.1 \ -test-nginx) +```diff + test: + @ct=$(shell docker run --rm -d \ + -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ + -v $(PWD)/html:/var/www \ + -v $(PWD):/opt/app \ ++ --network no-internet \ + $(image)); \ ``` -Update our test: +And now let's add a test in `spec/nginx_spec.moon` to make sure our test +environment is offline: + +```moonscript +describe "test environment", -> + it "can't connect to the internet", -> + assert.has_error (-> req "http://example.org"), + "Couldn't resolve host name" +``` + +Let's run our tests: + +```console +$ make test +●● +2 successes / 0 failures / 0 errors / 0 pending : 0.020207 seconds +``` + +### Replace `localhost` with a custom domain + +To use a custom domain name instead of `localhost`, we will need to use the +`--add-host` option for the `docker run` command. Again, we edit `Makefile`: + +```diff + test: + @ct=$(shell docker run --rm -d \ + -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ + -v $(PWD)/html:/var/www \ + -v $(PWD):/opt/app \ + --network no-internet \ ++ --add-host=domain.abc=127.0.0.1 \ + $(image)); \ +``` + +Let's update our test to use the custom domain name: ::: filename-for-code-block `spec/nginx_spec.moon` @@ -283,27 +318,12 @@ Update our test: assert.same request\statusCode!, 200 ``` -Run the tests. +Verify our tests still pass. ```console -$ docker exec -t $ct busted -● -1 success / 0 failures / 0 errors / 0 pending : 0.008246 seconds -``` - -Stop the test server. - -```console -$ docker exec -t $ct openresty -s stop -``` - -### Ensure the test container is offline - -```moonscript -describe "test environment", -> - it "can't connect to the internet", -> - assert.has_error (-> req "http://example.org"), - "Couldn't resolve host name" +$ make test +●● +2 successes / 0 failures / 0 errors / 0 pending : 0.0224 seconds ``` ## Test an HTTP redirect @@ -312,7 +332,7 @@ We want our server to redirect all `http` requests to `https`. ### Write the test -Our test: +Let's practice a bit of test-driven development and write our test first. ```moonscript describe "http://domain.abc", -> @@ -323,6 +343,8 @@ describe "http://domain.abc", -> assert.same request\header!.Location, "https://domain.abc/" ``` +We should now have one failing test. + ```console $ make test ●●◼ @@ -339,22 +361,31 @@ Expected: ### Configure `nginx` -``` -server { - listen 80; - return 301 https://$host$request_uri; -} +We're going to add the redirect directives, as well as a server name for our +domain and the directives for the SSL certificates we will generate. -server { - listen 443 ssl; - server_name domain.abc; - ssl_certificate /etc/ssl/certs/domain.abc.pem; - ssl_certificate_key /etc/ssl/private/domain.abc.pem; +```diff ++server { ++ listen 80; ++ return 301 https://$host$request_uri; ++} + + server { +- listen 80; ++ listen 443 ssl; ++ server_name domain.abc; ++ ssl_certificate /etc/ssl/certs/domain.abc.pem; ++ ssl_certificate_key /etc/ssl/private/domain.abc.pem; + + location / { + root /var/www; + index index.html index.htm; + } ``` ### Generate self-signed SSL/TLS certs for testing -Make self-signed certs in Dockerfile: +Add a command to our Dockerfile to generate self-signed certificates: ```Dockerfile RUN openssl req -x509 -newkey rsa:4096 -nodes \ @@ -370,28 +401,18 @@ Rebuild the image: $ make image-rm image-build ``` -Run tests: +We need to update our previous test to use HTTPS instead of HTTP. -```console -$ make test -●◼● -2 successes / 1 failure / 0 errors / 0 pending : 0.009618 seconds +::: filename-for-code-block +`spec/nginx_spec.moon` +::: -Failure → .../luajit/lib/luarocks/rocks-5.1/busted/2.2.0-1/bin/busted @ 3 -http://domain.abc sends /index.html -spec/nginx_spec.moon:17: Expected objects to be the same. -Passed in: -(number) 200 -Expected: -(number) 301 -``` - -It's our other test breaking, now. Fix spec: - -```moonscript -describe "https://domain.abc", -> - it "sends /index.html", -> - request = req "https://domain.abc" +```diff +-describe "http://domain.abc", -> ++describe "https://domain.abc", -> + it "sends /index.html", -> +- request = req "http://domain.abc" ++ request = req "https://domain.abc" ``` Run tests: @@ -402,9 +423,7 @@ $ make test 3 successes / 0 failures / 0 errors / 0 pending : 0.017065 seconds ``` -👍 - -## Test subdomain reverse proxy to a unix socket +## Test reverse proxy a subdomain request to a unix socket Let's say we have a running service that connects to a unix socket. We want to proxy the requests through `nginx` so that our service can respond to `https` @@ -412,9 +431,10 @@ requests but can leave handling SSL/TLS to `nginx`. ### Configure `nginx` -Our `nginx` config file might look something like this: +We'll add another server block to `conf/conf.d/default.conf` for our subdomain, +`git.domain.abc`, with the proxy directives: -``` +```nginx server { listen 443 ssl; server_name git.domain.abc; @@ -434,13 +454,46 @@ server { ### Add subdomain to SSL/TLS certs -```Dockerfile --addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" +Next, we need to add our subdomain to the generated SSL certs in the +`Dockerfile`: + +```diff + RUN openssl req -x509 -newkey rsa:4096 -nodes \ + -keyout /etc/ssl/private/domain.abc.pem \ + -out /etc/ssl/certs/domain.abc.pem \ + -sha256 -days 365 -subj '/CN=domain.abc' \ +- -addext "subjectAltName=DNS:domain.abc" ++ -addext "subjectAltName=DNS:domain.abc,DNS:git.domain.abc" ``` +### Add subdomain as a host + +Let's assign the loopback address to a variable and then add our subdomain as a +host in our `Makefile`: + +```diff ++loopback = 127.0.0.1 + + test: + @ct=$(shell docker run --rm -d \ + -v $(PWD)/conf/conf.d:/etc/nginx/conf.d \ + -v $(PWD)/html:/var/www \ + -v $(PWD):/opt/app \ + --network no-internet \ +- --add-host=domain.abc=127.0.0.1 \ ++ --add-host=domain.abc=$(loopback) \ ++ --add-host=git.domain.abc=$(loopback) \ + $(image)); \ +``` + + ### Add a test socket server -Copied and modified from [here](https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua)): +We need to start up a mock socket server for our test to ensure our request is +being proxied correctly. This is why we needed the LuaSocket library. + +Copied and modified from [here](https://github.com/lunarmodules/luasocket/blob/4844a48fbf76b0400fd7b7e4d15d244484019df1/test/unixstreamsrvr.lua), +this should suit our purposes: ::: filename-for-code-block `spec/unixstreamsrvr.moon` @@ -463,6 +516,8 @@ while true ### Write the test +And now we can add our test: + ::: filename-for-code-block `spec/nginx_spec.moon` ::: @@ -491,21 +546,13 @@ describe "https://git.domain.abc", -> assert.truthy reqheader\match "Host: git.domain.abc" ``` -Edit Makefile: - -::: filename-for-code-block -`Makefile` -::: - - --add-host=git.domain.abc=$(loopback) \ - -Rebuild image: +Because we modified the `Dockerfile`, we need to rebuild our image: ```console $ make image-rm image-build ``` -Run tests: +And if all went well, our test should pass. ```console $ make test @@ -515,8 +562,9 @@ $ make test ## Conclusion -Using these tools, we can verify that our `nginx` configuration is working the -way we intend. +These are just a few examples of how to test `nginx` directives. Using these +tools, we can verify that changes to our server configuration are working the +way we intended. ## Bonus!: Issues Ran Into Just Making This Post -- 2.39.5 From b165c2112e89502469b565c1c89cd7f8014d4046 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 30 Jun 2025 15:25:51 -0700 Subject: [PATCH 16/19] Update post date --- ...onf-directives.md => 2025-06-30-test-nginx-conf-directives.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename posts/{2025-06-22-test-nginx-conf-directives.md => 2025-06-30-test-nginx-conf-directives.md} (100%) diff --git a/posts/2025-06-22-test-nginx-conf-directives.md b/posts/2025-06-30-test-nginx-conf-directives.md similarity index 100% rename from posts/2025-06-22-test-nginx-conf-directives.md rename to posts/2025-06-30-test-nginx-conf-directives.md -- 2.39.5 From 3f494b037ddab901ebdc88f045659ab7e3a1c26b Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 30 Jun 2025 15:31:17 -0700 Subject: [PATCH 17/19] Update blurb --- posts/2025-06-30-test-nginx-conf-directives.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/posts/2025-06-30-test-nginx-conf-directives.md b/posts/2025-06-30-test-nginx-conf-directives.md index b89dc39..d947d26 100644 --- a/posts/2025-06-30-test-nginx-conf-directives.md +++ b/posts/2025-06-30-test-nginx-conf-directives.md @@ -1,7 +1,7 @@ { title: "Test nginx Configuration Directives" - blurb: "Write tests for `nginx.conf` directives and run them against a test - server." + blurb: "We use MoonScript and some Lua packages to write tests for the + directives in our `nginx` configuration files." } $index @@ -15,14 +15,12 @@ correct. To do this, we'll use... -- [MoonScript](https://moonscript.org) and (by extension) -[Lua](https://www.lua.org/) programming languages +- [MoonScript](https://moonscript.org) and (by extension) [Lua](https://www.lua.org/) programming languages - `nginx` we'll get from [OpenResty](https://openresty.org/en/), a web platform created by Chinese developer, [Yichun Zhang](https://agentzh.org/) - the [Busted testing framework](https://lunarmodules.github.io/busted/) - the Lua package manager, [LuaRocks](https://luarocks.org/) -- a fantastic little library, -[`luajit-curl`](https://bitbucket.org/senanetworksinc/luajit-curl/src/master/), +- a fantastic little library, [`luajit-curl`](https://bitbucket.org/senanetworksinc/luajit-curl/src/master/), from Japanese developer [SENA Networks, Inc](https://www.sena-networks.co.jp) - another great library, written by volunteers, [LuaSocket](https://github.com/lunarmodules/luasocket) - our favorite container manager, [Docker Engine](https://docs.docker.com/engine/) -- 2.39.5 From c800c8e7753fa1cd29d03d6701c9a4335faa408b Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 30 Jun 2025 15:38:56 -0700 Subject: [PATCH 18/19] Remove bonus content --- .../2025-06-30-test-nginx-conf-directives.md | 88 ++----------------- 1 file changed, 5 insertions(+), 83 deletions(-) diff --git a/posts/2025-06-30-test-nginx-conf-directives.md b/posts/2025-06-30-test-nginx-conf-directives.md index d947d26..2f02278 100644 --- a/posts/2025-06-30-test-nginx-conf-directives.md +++ b/posts/2025-06-30-test-nginx-conf-directives.md @@ -128,7 +128,7 @@ $ curl -v localhost ## Test an HTTP request If we want to write a test for that request, we need some packages from -LuaRocks. Let's add a Dockerfile to build an image with those packages +LuaRocks. Let's add a `Dockerfile` to build an image with those packages installed. ### Add a `Dockerfile` @@ -210,7 +210,7 @@ $ docker exec $ct openresty -s stop ## Create a `Makefile` -Ok, we now have a number of long `docker` commands, let's create a `Makefile` +We now have a number of long `docker` commands, let's create a `Makefile` to make running them easier. ::: filename-for-code-block @@ -383,7 +383,7 @@ domain and the directives for the SSL certificates we will generate. ### Generate self-signed SSL/TLS certs for testing -Add a command to our Dockerfile to generate self-signed certificates: +Add a command to our `Dockerfile` to generate self-signed certificates: ```Dockerfile RUN openssl req -x509 -newkey rsa:4096 -nodes \ @@ -421,9 +421,9 @@ $ make test 3 successes / 0 failures / 0 errors / 0 pending : 0.017065 seconds ``` -## Test reverse proxy a subdomain request to a unix socket +## Test reverse proxy a subdomain request to a Unix socket -Let's say we have a running service that connects to a unix socket. We want to +Let's say we have a running service that connects to a Unix socket. We want to proxy the requests through `nginx` so that our service can respond to `https` requests but can leave handling SSL/TLS to `nginx`. @@ -564,81 +564,3 @@ These are just a few examples of how to test `nginx` directives. Using these tools, we can verify that changes to our server configuration are working the way we intended. -## Bonus!: Issues Ran Into Just Making This Post - -### `$host$request_uri` - -::: filename-for-code-block -`renderers/markdown.moon` -::: - -```moonscript -dollar_temp = "0000sitegen_markdown00dollar0000" -``` - -So, when two cosmo selectors had no space between them, it was ambiguous -to which selector the numbers belonged. - -``` -0000sitegen_markdown00dollar0000.10000sitegen_markdown00dollar0000.2 -``` - -Solution was to change the first `0` to a letter `z`: - -``` -z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2 -``` - -Because `dollar_temp` is a private attribute, I had to copy every function -from the sitegen markdown renderer. Which makes my renderer a copy with -some additions. - -::: filename-for-code-block -`spec/renderers_spec.moon` -::: - -```moonscript -import escape_cosmo, unescape_cosmo from require "renderers.markdown" - -it "escapes and unescapes adjacent cosmo selectors", -> - str = "$one$two" - escaped = escape_cosmo str - assert.same escaped, - "z000sitegen_markdown00dollar0000.1z000sitegen_markdown00dollar0000.2" - assert.same str, (unescape_cosmo escape_cosmo str) -``` - -### `$$ct` - -``` -z000sitegen_markdown00dollar0000.1 -``` - -Because `.` is not a valid character for a variable name, when this string -is syntax-highlighted, it gets split, like this: - -``` -z000sitegen_markdown00dollar0000.1 -``` - -The string is then 'unescaped', but because the string got split by the -closing `` tag, it will no longer match the pattern and the -'unescape' fails. - -The solution was to change the `.` in the dollar temp pattern to `_`, which is -a valid character in a variable name. Update the `$one$two` spec escaped -string. - -::: filename-for-code-block -`spec/renderers_spec.moon` -::: - -```moonscript -it "escapes and unescapes double dollar signs", -> - out = flatten_html render [[ -```Makefile - $$name -```]] - - assert.same [[
$$name
]], out -``` -- 2.39.5 From 276a64dd2440da86e65a3cb7935c3f8431aab8c3 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 30 Jun 2025 15:42:11 -0700 Subject: [PATCH 19/19] Remove unused image --- html/images/openresty-splash-page.png | Bin 70330 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 html/images/openresty-splash-page.png diff --git a/html/images/openresty-splash-page.png b/html/images/openresty-splash-page.png deleted file mode 100644 index deb1443fba6a4d634cac0130d05b54b263f2a08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70330 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