diff --git a/package.json b/package.json
index 351ad33..901a984 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,8 @@
   "license": "ISC",
   "dependencies": {
     "@aws-sdk/client-s3": "^3.540.0",
+    "@tryghost/errors": "^1.3.6",
+    "@tryghost/tpl": "^0.1.33",
     "ghost-storage-base": "^1.0.0"
   },
   "devDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 627ebb2..c69afd6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,12 @@ importers:
       '@aws-sdk/client-s3':
         specifier: ^3.540.0
         version: 3.721.0
+      '@tryghost/errors':
+        specifier: ^1.3.6
+        version: 1.3.6
+      '@tryghost/tpl':
+        specifier: ^0.1.33
+        version: 0.1.33
       ghost-storage-base:
         specifier: ^1.0.0
         version: 1.0.0
@@ -540,6 +546,542 @@ packages:
     resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==}
     engines: {node: '>=16.0.0'}
 
+  '@stdlib/array-float32@0.2.2':
+    resolution: {integrity: sha512-pTcy1FNQrrJLL1LMxJjuVpcKJaibbGCFFTe41iCSXpSOC8SuTBuNohrO6K9+xR301Ruxxn4yrzjJJ6Fa3nQJ2g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-float64@0.2.2':
+    resolution: {integrity: sha512-ZmV5wcacGrhT0maw9dfLXNv4N3ZwFUV3D7ItFfZFGFnKIJbubrWzwtaYnxzIXigrDc8g3F6FVHRpsQLMxq0/lA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-int16@0.2.2':
+    resolution: {integrity: sha512-kHxyQ1INGtga38Grr/5MnDVAuJgnerh+MsJQcpT5jxxnc9QAnVc7O6DRv8i/hfOOxUOH15C/MeoBs+zim4CnLQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-int32@0.2.2':
+    resolution: {integrity: sha512-+jFqht43oPJ8YnlyCZ7cSf9Z8xenIIsJDgLZ9zW+gh8o13SSfF+ukm0AGAdnKnKGR3zPBLnSso7JXyDe2r134g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-int8@0.2.2':
+    resolution: {integrity: sha512-UW3KlKt7Lww1XML5Gzj+YYHRXD8+RIUrnlPcTwYH9O8j+/m5vyvGYlBIJD2MDO1fgUl2skgmpNkK9ULfsBlIRA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-uint16@0.2.2':
+    resolution: {integrity: sha512-z5c/Izw43HkKfb1pTgEUMAS8GFvhtHkkHZSjX3XJN+17P0VjknxjlSvPiCBGqaDX9jXtlWH3mn1LSyDKtJQoeA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-uint32@0.2.2':
+    resolution: {integrity: sha512-3T894I9C2MqZJJmRCYFTuJp4Qw9RAt+GzYnVPyIXoK1h3TepUXe9VIVx50cUFIibdXycgu0IFGASeAb3YMyupw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-uint8@0.2.2':
+    resolution: {integrity: sha512-Ip9MUC8+10U9x0crMKWkpvfoUBBhWzc6k5SI4lxx38neFVmiJ3f+5MBADEagjpoKSBs71vlY2drnEZe+Gs2Ytg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/array-uint8c@0.2.2':
+    resolution: {integrity: sha512-uBEJ1yKLZjwgmCV7iSNLkr/SGCxL7qVwnb+f4avVSBxlIv/k29oIO/sibgkHbZMBlBSw39dWQzIKD0UQJWDVDQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-float32array-support@0.2.2':
+    resolution: {integrity: sha512-pi2akQl8mVki43fF1GNQVLYW0bHIPp2HuRNThX9GjB3OFQTpvrV8/3zPSh4lOxQa5gRiabgf0+Rgeu3AOhEw9A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-float64array-support@0.2.2':
+    resolution: {integrity: sha512-8L3GuKY1o0dJARCOsW9MXcugXapaMTpSG6dGxyNuUVEvFfY5UOzcj9/JIDal5FjqSgqVOGL5qZl2qtRwub34VA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-int16array-support@0.2.2':
+    resolution: {integrity: sha512-rIrJ2371vd4kg5sHb/bz0xX1dlwyElT6kivnFPtZUXMaMS1breSUIpwPkUPXdr1AbmQdeJYv0c/YBtKB0PCo2g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-int32array-support@0.2.2':
+    resolution: {integrity: sha512-3o/6PuZ+z6+cimb9L1f0d4LGP2GJO4EUVlD6oz8I6vKz35438coM5CduXOMVWvdzm4Rku4ty5mi1Gz0U53pC4Q==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-int8array-support@0.2.2':
+    resolution: {integrity: sha512-QUasYxAqQdgqDglQTwV9dZSwMXvLzLpVC4FcN+kia/+nX1HGjYUBq95fBj0vigW+SC2OiuepJkNiB/PlhA08+g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-node-buffer-support@0.2.2':
+    resolution: {integrity: sha512-9ReyJGYe9BEZXbUxeRBima0nYy6GwFLVBj7eQ+UUzfG8w7LYYUCpWk954yDpd0v/u+XZQvp1M8EQC2gJLd/i0g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-own-property@0.2.2':
+    resolution: {integrity: sha512-m5rV4Z2/iNkwx2vRsNheM6sQZMzc8rQQOo90LieICXovXZy8wA5jNld4kRKjMNcRt/TjrNP7i2Rhh8hruRDlHg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-symbol-support@0.2.2':
+    resolution: {integrity: sha512-vCsGGmDZz5dikGgdF26rIL0y0nHvH7qaVf89HLLTybceuZijAqFSJEqcB3Gpl5uaeueLNAWExHi2EkoUVqKHGg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-tostringtag-support@0.2.2':
+    resolution: {integrity: sha512-bSHGqku11VH0swPEzO4Y2Dr+lTYEtjSWjamwqCTC8udOiOIOHKoxuU4uaMGKJjVfXG1L+XefLHqzuO5azxdRaA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-uint16array-support@0.2.2':
+    resolution: {integrity: sha512-aL188V7rOkkEH4wYjfpB+1waDO4ULxo5ppGEK6X0kG4YiXYBL2Zyum53bjEQvo0Nkn6ixe18dNzqqWWytBmDeg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-uint32array-support@0.2.2':
+    resolution: {integrity: sha512-+UHKP3mZOACkJ9CQjeKNfbXHm5HGQB862V5nV5q3UQlHPzhslnXKyG1SwAxTx+0g88C/2vlDLeqG8H4TH2UTFA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-uint8array-support@0.2.2':
+    resolution: {integrity: sha512-VfzrB0BMik9MvPyKcMDJL3waq4nM30RZUrr2EuuQ/RbUpromRWSDbzGTlRq5SfjtJrHDxILPV3rytDCc03dgWA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-has-uint8clampedarray-support@0.2.2':
+    resolution: {integrity: sha512-/zT8Piv1UUFUpelBo0LuTE4V9BOEW7DTwfGlPvez93lk72XtaIYhTHkj+Z9YBGfAMV2PbL6eteqFffMVzUgnXg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-arguments@0.2.2':
+    resolution: {integrity: sha512-SejXrHpneNcn0nDot2K49XoTzPQQUvCFQj+2vc4UtJdtFFzB5r1fYgvtL7RqkhVglD7zNJG1acJYa7PiZCpZog==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-array@0.2.2':
+    resolution: {integrity: sha512-aJyTX2U3JqAGCATgaAX9ygvDHc97GCIKkIhiZm/AZaLoFHPtMA1atQ4bKcefEC8Um9eefryxTHfFPfSr9CoNQQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-boolean@0.2.2':
+    resolution: {integrity: sha512-3KFLRTYZpX6u95baZ6PubBvjehJs2xBU6+zrenR0jx8KToUYCnJPxqqj7JXRhSD+cOURmcjj9rocVaG9Nz18Pg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-buffer@0.2.2':
+    resolution: {integrity: sha512-4/WMFTEcDYlVbRhxY8Wlqag4S70QCnn6WmQ4wmfiLW92kqQHsLvTNvdt/qqh/SDyDV31R/cpd3QPsVN534dNEA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-collection@0.2.2':
+    resolution: {integrity: sha512-tbh6ySMqzTkHjFzcNkwtfnJgt65qWeu+0Wv3N0D9QEd3gnJfWq4mJJS3DyJ5n91VoB7RXppB/giDxDUCw/Y+KQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-enumerable-property@0.2.2':
+    resolution: {integrity: sha512-An5QM9Zb3bjKZp5XVdsHTv6/8pJMJvnweHDdLPQhEtLve3YIM4Xo0CQ3TlvKgTr6Lz2UO/+yx8rrDdN5i9Dp5Q==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-error@0.2.2':
+    resolution: {integrity: sha512-HKw/vTJvXG8OvDSWSRA5nCKAgKxvzG7xack0xjCUTw1Xh3q8mMmQtCTjwkRtFyvSFDd0DeacMc/Ur5sU5bzOgg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-float32array@0.2.2':
+    resolution: {integrity: sha512-hxEKz/Y4m1NYuOaiQKoqQA1HeAYwNXFqSk3FJ4hC71DuGNit2tuxucVyck3mcWLpLmqo0+Qlojgwo5P9/C/9MQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-float64array@0.2.2':
+    resolution: {integrity: sha512-3R1wLi6u/IHXsXMtaLnvN9BSpqAJ8tWhwjOOr6kadDqCWsU7Odc7xKLeAXAInAxwnV8VDpO4ifym4A3wehazPQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-function@0.2.2':
+    resolution: {integrity: sha512-whY69DUYWljCJ79Cvygp7VzWGOtGTsh3SQhzNuGt+ut6EsOW+8nwiRkyBXYKf/MOF+NRn15pxg8cJEoeRgsPcA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-int16array@0.2.2':
+    resolution: {integrity: sha512-HQ9yyX1di07pWreBk6njw9x1sipJKSP4SCSkidLfUHKxaooxeUprAFONfMiEMdNBbn7f3awfs23h1bpN/Z6Vmg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-int32array@0.2.2':
+    resolution: {integrity: sha512-YomgTwoJD/ci8K9mWNCyqSDtkYfHNplMYw+B9rmcxrjX//1LVZkrzgwWEc6dC3RlY0Ou+uDHJpKeKL9G2fj4GQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-int8array@0.2.2':
+    resolution: {integrity: sha512-Y1QP3uIZ+CG+rFrD6nOO/N/8O1rRbXgG+iVo5aj8xNRUtfg1iYekUspfNKqxeZUJ95Ocv705m7/vsGlvI1MugQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-integer@0.2.2':
+    resolution: {integrity: sha512-2d4CioQmnPcNDvNfC3Q6+xAJLwYYcSUamnxP0bSBJ1oAazWaVArdXNUAUxufek2Uaq6TVIM2gNSMyivIKIJd2w==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-nan@0.2.2':
+    resolution: {integrity: sha512-Wh7KPIVfi6UVBRuPgkjVnoJP6mVtDNg+Y4m3Hko86TSf78KqFXfyZy/m6hnlYBWZRkNJDKo1J/7A/zpPwcEUVg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-nonnegative-integer@0.2.2':
+    resolution: {integrity: sha512-4t2FoZQeZ5nMYHYSeTVlgAp/HLEMYqe9qMcJgbvj63KTrGCDsuIpTE0S+UTxAc6Oc3Ftgb0ygjBFJQ0mxwN0Ow==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-number@0.2.2':
+    resolution: {integrity: sha512-sWpJ59GqGbmlcdYSUV/OYkmQW8k47w10+E0K0zPu1x1VKzhjgA5ZB2sJcpgI8Vt3ckRLjdhuc62ZHJkrJujG7A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-object-like@0.2.2':
+    resolution: {integrity: sha512-MjQBpHdEebbJwLlxh/BKNH8IEHqY0YlcCMRKOQU0UOlILSJg0vG+GL4fDDqtx9FSXxcTqC+w3keHx8kAKvQhzg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-object@0.2.2':
+    resolution: {integrity: sha512-sNnphJuHyMDHHHaonlx6vaCKMe4sHOn0ag5Ck4iW3kJtM2OZB2J4h8qFcwKzlMk7fgFu7vYNGCZtpm1dYbbUfQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-plain-object@0.2.2':
+    resolution: {integrity: sha512-o4AFWgBsSNzZAOOfIrxoDFYTqnLuGiaHDFwIeZGUHdpQeav2Fll+sGeaqOcekF7yKawoswnwWdJqTsjapb4Yzw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-regexp@0.2.2':
+    resolution: {integrity: sha512-2JtiUtRJxPaVXL7dkWoV3n5jouI65DwYDXsDXg3xo23TXlTNGgU/HhKO4FWC1Yqju7YMZi0hcZSW6E9v8ISqeQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-string@0.2.2':
+    resolution: {integrity: sha512-SOkFg4Hq443hkadM4tzcwTHWvTyKP9ULOZ8MSnnqmU0nBX1zLVFLFGY8jnF6Cary0dL0V7QQBCfuxqKFM6u2PQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-uint16array@0.2.2':
+    resolution: {integrity: sha512-w3+HeTiXGLJGw5nCqr0WbvgArNMEj7ulED1Yd19xXbmmk2W1ZUB+g9hJDOQTiKsTU4AVyH4/As+aA8eDVmWtmg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-uint32array@0.2.2':
+    resolution: {integrity: sha512-3F4nIHg1Qp0mMIsImWUC8DwQ3qBK5vdIJTjS2LufLbFBhHNmv5kK1yJiIXQDTLkENU0STZe05TByo01ZNLOmDQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-uint8array@0.2.2':
+    resolution: {integrity: sha512-51WnDip6H2RrN0CbqWmfqySAjam8IZ0VjlfUDc3PtcgrZGrKKjVgyHAsT/L3ZDydwF+aB94uvYJu5QyrCPNaZw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-is-uint8clampedarray@0.2.2':
+    resolution: {integrity: sha512-MjHhOxjOXesqUNgoDGOiO9vib1HV3uCNoYQfiEDWAv30pVAty70wEcwDQ7cdQs1ZGfGC/355ob8AR2Z8lY4ryw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/assert-tools-array-function@0.2.2':
+    resolution: {integrity: sha512-FYeT7X9x0C8Nh+MN6IJUDz+7i7yB6mio2/SDlrvyepjyPSU/cfHfwW0GEOnQhxZ+keLZC/YqDD930WjRODwMdA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/boolean-ctor@0.2.2':
+    resolution: {integrity: sha512-qIkHzmfxDvGzQ3XI9R7sZG97QSaWG5TvWVlrvcysOGT1cs6HtQgnf4D//SRzZ52VLm8oICP+6OKtd8Hpm6G7Ww==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/buffer-ctor@0.2.2':
+    resolution: {integrity: sha512-Q/FkXxyZUzCA1fwOl7sa8ZYg6e60fTksCYr01nJv8fvmr9l9Ju6MKmm20n833yE7KA5jDDtZW9lB1V7552fLMA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/buffer-from-buffer@0.2.2':
+    resolution: {integrity: sha512-EU/Mju7j3Hw/z6xxlZ14h6ZEyhiarR4nXhDQwycJ4NcFb7Oi+KaeNvX5rRQgf/k04cpcq8VkQiM1xOMrKPCvqA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/complex-float32-ctor@0.0.2':
+    resolution: {integrity: sha512-QsTLynhTRmDT0mSkfdHj0FSqQSxh2nKx+vvrH3Y0/Cd/r0WoHFZwyibndDxshfkf9B7nist8QKyvV82I3IZciA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/complex-float32-reim@0.1.2':
+    resolution: {integrity: sha512-24H+t1xwQF6vhOoMZdDA3TFB4M+jb5Swm/FwNaepovlzVIG2NlthUZs6mZg1T3oegqesIRQRwhpn4jIPjuGiTw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/complex-float64-ctor@0.0.3':
+    resolution: {integrity: sha512-oixCtBif+Uab2rKtgedwQTbQTEC+wVSu4JQH935eJ8Jo0eL6vXUHHlVrkLgYKlCDLvq5px1QQn42Czg/ixh6Gw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/complex-float64-reim@0.1.2':
+    resolution: {integrity: sha512-q6RnfgbUunApAYuGmkft1oOM3x3xVMVJwNRlRgfIXwKDb8pYt+S/CeIwi3Su5SF6ay3AqA1s+ze7m21osXAJyw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-array-max-typed-array-length@0.2.2':
+    resolution: {integrity: sha512-uAoBItVIfuzR4zKK1F57Znrn2frKL0U9gqJkg30BXuno3YlUvbhIfVP3VsUmGJCmi9ztgYLqX10yqb0KvlM2Ig==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-float64-ninf@0.2.2':
+    resolution: {integrity: sha512-Iu+wZs/vgudAKVg9FEcRY3FadkmvsWuq/wJ3jIHjhaP5xcnoF3XJUO4IneEndybHwehfJL65NShnDsJcg1gicw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-float64-pinf@0.2.2':
+    resolution: {integrity: sha512-UcwnWaSkUMD8QyKADwkXPlY7yOosCPZpE2EDXf/+WOzuWi5vpsec+JaasD5ggAN8Rv8OTVmexTFs1uZfrHgqVQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int16-max@0.2.2':
+    resolution: {integrity: sha512-w7XnWFxYXRyAnbKOxur3981FeaSlhKvHlhETwH5ZhtOQerk3Jn/iJFdtbN8CD0he1Kml4DWhnoKB7P9PcOaTIw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int16-min@0.2.2':
+    resolution: {integrity: sha512-zn15vCgNoyD97z7mNQMChEneyc6xQudVGj1BOv5vZl827vHAs+KV6xeCI7VGY8Lpd6V22piDoGG3Mvj/43u9vQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int32-max@0.3.0':
+    resolution: {integrity: sha512-jYN84QfG/yP2RYw98OR6UYehFFs0PsGAihV6pYU0ey+WF9IOXgSjRP56KMoZ7ctHwl4wsnj9I+qB2tGuEXr+pQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int32-min@0.2.2':
+    resolution: {integrity: sha512-4QMOTpo5QykiWp52Wtugu1WK1wV/Bi2Hjj9L97dfZ3BPB1Oa9ykiUZvTsq3GBNCMu2YHPv1ugbV91C3p3bw+Aw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int8-max@0.2.2':
+    resolution: {integrity: sha512-zp1L61S/ycOmkILmvuXEKvtXrEJ0QUAwP65sNAWMJOtdT0mhGMfGpXKvCK84TC3+jP5Wk4LU13cgO2bf/pmGTw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-int8-min@0.2.2':
+    resolution: {integrity: sha512-nxPloZUqbGuyuOPC0U3xQOn9YdyRq2g9uc1dzcw6k0XBhql9mlz9kCbdC74HeMm4K9Dyyb7IlAZLCezdv60s6g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-uint16-max@0.2.2':
+    resolution: {integrity: sha512-qaFXbxgFnAkt73P5Ch7ODb0TsOTg0LEBM52hw6qt7+gTMZUdS0zBAiy5J2eEkTxA9rD9X3nIyUtLf2C7jafNdw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-uint32-max@0.2.2':
+    resolution: {integrity: sha512-2G44HQgIKDrh3tJUkmvtz+eM+uwDvOMF+2I3sONcTHacANb+zP7la4LDYiTp+HFkPJyfh/kPapXBiHpissAb1A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/constants-uint8-max@0.2.2':
+    resolution: {integrity: sha512-ZTBQq3fqS/Y4ll6cPY5SKaS266EfmKP9PW3YLJaTELmYIzVo9w2RFtfCqN05G3olTQ6Le9MUEE/C6VFgZNElDQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/error-tools-fmtprodmsg@0.2.2':
+    resolution: {integrity: sha512-2IliQfTes4WV5odPidZFGD5eYDswZrPXob7oOu95Q69ERqImo8WzSwnG2EDbHPyOyYCewuMfM5Ha6Ggf+u944Q==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/fs-exists@0.2.2':
+    resolution: {integrity: sha512-uGLqc7izCIam2aTyv0miyktl4l8awgRkCS39eIEvvvnKIaTBF6pxfac7FtFHeEQKE3XhtKsOmdQ/yJjUMChLuA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/fs-resolve-parent-path@0.2.2':
+    resolution: {integrity: sha512-ZG78ouZc+pdPLtU+sSpYTvbKTiLUgn6NTtlVFYmcmkYRFn+fGOOakwVuhYMcYG6ti10cLD6WzB/YujxIt8f+nA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/math-base-assert-is-integer@0.2.5':
+    resolution: {integrity: sha512-Zi8N66GbWtSCR3OUsRdBknjNlX+aBN8w6CaVEP5+Jy/a7MgMYzevS52TNS5sm8jqzKBlFhZlPLex+Zl2GlPvSA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/math-base-assert-is-nan@0.2.2':
+    resolution: {integrity: sha512-QVS8rpWdkR9YmHqiYLDVLsCiM+dASt/2feuTl4T/GSdou3Y/PS/4j/tuDvCDoHDNfDkULUW+FCVjKYpbyoeqBQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/math-base-napi-unary@0.2.3':
+    resolution: {integrity: sha512-BCyJmpq2S8EFo2yMt1z+v1EL7nn8RHcM6jn7fa8n3BTP679K0MSlawIh3A0CFogfrTdjPM4G44VO1ddsdLExcg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/math-base-special-floor@0.2.3':
+    resolution: {integrity: sha512-zTkxVRawtWwJ4NmAT/1e+ZsIoBj1JqUquGOpiNVGNIKtyLOeCONZlZSbN7zuxPkshvmcSjpQ/VLKR8Tw/37E9A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/number-ctor@0.2.2':
+    resolution: {integrity: sha512-98pL4f1uiXVIw9uRV6t4xecMFUYRRTUoctsqDDV8MSRtKEYDzqkWCNz/auupJFJ135L1ejzkejh73fASsgcwKQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/number-float64-base-to-float32@0.2.2':
+    resolution: {integrity: sha512-T5snDkVNZY6pomrSW/qLWQfZ9JHgqCFLi8jaaarfNj2o+5NMUuvvRifLUIacTm8/uC96xB0j3+wKTh1zbIV5ig==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/object-ctor@0.2.1':
+    resolution: {integrity: sha512-HEIBBpfdQS9Nh5mmIqMk9fzedx6E0tayJrVa2FD7No86rVuq/Ikxq1QP7qNXm+i6z9iNUUS/lZq7BmJESWO/Zg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/process-cwd@0.2.2':
+    resolution: {integrity: sha512-8Q/nA/ud5d5PEzzG6ZtKzcOw+RMLm5CWR8Wd+zVO5vcPj+JD7IV7M2lBhbzfUzr63Torrf/vEhT3cob8vUHV/A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/regexp-extended-length-path@0.2.2':
+    resolution: {integrity: sha512-z3jqauEsaxpsQU3rj1A1QnOgu17pyW5kt+Az8QkoTk7wqNE8HhPikI6k4o7XBHV689rSFWZCl4c4W+7JAiNObQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/regexp-function-name@0.2.2':
+    resolution: {integrity: sha512-0z/KRsgHJJ3UQkmBeLH+Nin0hXIeA+Fw1T+mnG2V5CHnTA6FKlpxJxWrvwLEsRX7mR/DNtDp06zGyzMFE/4kig==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/regexp-regexp@0.2.2':
+    resolution: {integrity: sha512-LlWqVH7wou4rJ2vovmn8ZZf4Z5/sMYxGQkmUcURvdCDMSL4pt91uPMi9I2hLECcIYXLiKUD87VSR56Y5luaafg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-base-format-interpolate@0.2.2':
+    resolution: {integrity: sha512-i9nU9rAB2+o/RR66TS9iQ8x+YzeUDL1SGiAo6GY3hP6Umz5Dx9Qp/v8T69gWVsb4a1YSclz5+YeCWaFgwvPjKA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-base-format-tokenize@0.2.2':
+    resolution: {integrity: sha512-kXq2015i+LJjqth5dN+hYnvJXBSzRm8w0ABWB5tYAsIuQTpQK+mSo2muM8JBEFEnqUHAwpUsu2qNTK/9o8lsJg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-base-lowercase@0.4.0':
+    resolution: {integrity: sha512-IH35Z5e4T+S3b3SfYY39mUhrD2qvJVp4VS7Rn3+jgj4+C3syocuAPsJ8C4OQXWGfblX/N9ymizbpFBCiVvMW8w==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-base-replace@0.2.2':
+    resolution: {integrity: sha512-Y4jZwRV4Uertw7AlA/lwaYl1HjTefSriN5+ztRcQQyDYmoVN3gzoVKLJ123HPiggZ89vROfC+sk/6AKvly+0CA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-format@0.2.2':
+    resolution: {integrity: sha512-GUa50uxgMAtoItsxTbMmwkyhIwrCxCrsjzk3nAbLnt/1Kt1EWOWMwsALqZdD6K4V/xSJ4ns6PZur3W6w+vKk9g==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/string-replace@0.2.2':
+    resolution: {integrity: sha512-czNS5IU7sBuHjac45Y3VWUTsUoi82yc8JsMZrOMcjgSrEuDrVmA6sNJg7HC1DuSpdPjm/v9uUk102s1gIfk3Nw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/symbol-ctor@0.2.2':
+    resolution: {integrity: sha512-XsmiTfHnTb9jSPf2SoK3O0wrNOXMxqzukvDvtzVur1XBKfim9+seaAS4akmV1H3+AroAXQWVtde885e1B6jz1w==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-constructor-name@0.2.2':
+    resolution: {integrity: sha512-TBtO3MKDAf05ij5ajmyBCbpKKt0Lfahn5tu18gqds4PkFltgcw5tVZfSHY5DZ2HySJQ2GMMYjPW2Kbg6yPCSVg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-convert-path@0.2.2':
+    resolution: {integrity: sha512-8nNuAgt23Np9NssjShUrPK42c6gRTweGuoQw+yTpTfBR9VQv8WFyt048n8gRGUlAHizrdMNpEY9VAb7IBzpVYw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-copy@0.2.2':
+    resolution: {integrity: sha512-DM8O5tgOHHyhaERDJKa/ThDhIewDyo5SxoFJnmxSriAlJsV9uAmzF8rm7vY969TPRACb+Uxj2GXUoYlmUcHTmA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-define-nonenumerable-read-only-property@0.2.2':
+    resolution: {integrity: sha512-V3mpAesJemLYDKG376CsmoczWPE/4LKsp8xBvUxCt5CLNAx3J/1W39iZQyA5q6nY1RStGinGn1/dYZwa8ig0Uw==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-define-property@0.2.4':
+    resolution: {integrity: sha512-XlMdz7xwuw/sqXc9LbsV8XunCzZXjbZPC+OAdf4t4PBw4ZRwGzlTI6WED+f4PYR5Tp9F1cHgLPyMYCIBfA2zRg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-escape-regexp-string@0.2.2':
+    resolution: {integrity: sha512-areCibzgpmvm6pGKBg+mXkSDJW4NxtS5jcAT7RtunGMdAYhA/I5whISMPaeJkIT2XhjjFkjKBaIs5pF6aPr4fQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-get-prototype-of@0.2.2':
+    resolution: {integrity: sha512-eDb1BAvt7GW/jduBkfuQrUsA9p09mV8RW20g0DWPaxci6ORYg/UB0tdbAA23aZz2QUoxdYY5s/UJxlq/GHwoKQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-global@0.2.2':
+    resolution: {integrity: sha512-A4E8VFHn+1bpfJ4PA8H2b62CMQpjv2A+H3QDEBrouLFWne0wrx0TNq8vH6VYHxx9ZRxhgWQjfHiSAxtUJobrbQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-index-of@0.2.2':
+    resolution: {integrity: sha512-yVnjPk3Arzf3no+Ju5ys4ZVG4aKHA8xV4g53Ni+FO8c0AStKq9F8O+E/aFxluCKqLz6jGLaLea7996e0Hcw9mQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-keys@0.2.2':
+    resolution: {integrity: sha512-mvmvhpewElNalx5YotZ/jI57CiYHc9y6N8SGxJiOUs04NkWMkW8rnXRvJEi0rPj2BOIJReEGZ1WaZpdL68DUcQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-library-manifest@0.2.2':
+    resolution: {integrity: sha512-YqzVLuBsB4wTqzdUtRArAjBJoT3x61iop2jFChXexhl6ejV3vDpHcukEEkqIOcJKut+1cG5TLJdexgHNt1C0NA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-native-class@0.2.2':
+    resolution: {integrity: sha512-cSn/FozbEpfR/FlJAoceQtZ8yUJFhZ8RFkbEsxW/7+H4o09yln3lBS0HSfUJISYNtpTNN/2/Fup88vmvwspvwA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-noop@0.2.2':
+    resolution: {integrity: sha512-QlHCBCExrFlNFFqDBOvxPeHkvAuMBHsbQYWRjSG2FD6QumEDn9EqBAcJZNr+xYdkw/6SVRJ0ySTyroReg5vcAA==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-property-descriptor@0.2.2':
+    resolution: {integrity: sha512-iq0jFOOX5OmaOC1uyO8POjWPPA6GxbFFcDzH4QsyhKWN2P5ZDvnKMRfH6TuMmaLEA5vSzeNwGfcBPQMRBRphUg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-property-names@0.2.2':
+    resolution: {integrity: sha512-LlHK467gOxvD6T5yzSy/DnDPzeG00Qj1lrowapAOP7HbGMPvs3RI8Re32IqUke5OE698jXW3tL0VDu6yLi2e1A==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-regexp-from-string@0.2.2':
+    resolution: {integrity: sha512-xvyX44wYAn7DUSTwfIdzohFFo2J+kkzZf1I3cQZr09k8364/1x2Ro7bhPVXX/fEUJ1LbbPF3PAcGa44cvN8Nzg==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@stdlib/utils-type-of@0.2.2':
+    resolution: {integrity: sha512-RLGFxPNgY9AtVVrFGdKO6Y3pOd/Ov2WA4O2/czZN/AbgYzbPdoF0KkfvHRIney6k+TtvoyYB8YqZXJ4G88f9BQ==}
+    engines: {node: '>=0.10.0', npm: '>2.7.0'}
+    os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows]
+
+  '@tryghost/errors@1.3.6':
+    resolution: {integrity: sha512-qxl6wF5tlhr646Earjmfcz3km6d+B0tzUmocyVu3tY8StI4pH8mLgzHDtkiTAls9ABPichBxZQe6a8PDcVJbFw==}
+
+  '@tryghost/tpl@0.1.33':
+    resolution: {integrity: sha512-wkwLw0SvX3Ex+yQP/wl7w4m1PYOddP/jLEcW5xGUEGaYSuPgpHrHPmu9lvxWmK++q/SPiVHqVSV97FFaIb2oNQ==}
+
   '@types/body-parser@1.19.5':
     resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
 
@@ -579,6 +1121,14 @@ packages:
   bowser@2.11.0:
     resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
 
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
   esbuild@0.20.2:
     resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
     engines: {node: '>=12'}
@@ -588,20 +1138,55 @@ packages:
     resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
     hasBin: true
 
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
   ghost-storage-base@1.0.0:
     resolution: {integrity: sha512-qIW6pny/wWKjrbRmXVNis9i7856AMR5/NZmnLTrKbA0KIEnA9K/fhkj7ISnSyTYfBv17sFsC23eJfvj6dDgZrQ==}
 
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  is-core-module@2.16.1:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+    engines: {node: '>= 0.4'}
+
+  lodash._reinterpolate@3.0.0:
+    resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==}
+
+  lodash.template@4.5.0:
+    resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==}
+
+  lodash.templatesettings@4.2.0:
+    resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==}
+
   moment@2.27.0:
     resolution: {integrity: sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==}
 
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
   prettier@3.4.2:
     resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
     engines: {node: '>=14'}
     hasBin: true
 
+  resolve@1.22.10:
+    resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+    engines: {node: '>= 0.4'}
+    hasBin: true
+
   strnum@1.0.5:
     resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
 
+  supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
@@ -1526,6 +2111,562 @@ snapshots:
       '@smithy/types': 3.7.2
       tslib: 2.8.1
 
+  '@stdlib/array-float32@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-float32array-support': 0.2.2
+
+  '@stdlib/array-float64@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-float64array-support': 0.2.2
+
+  '@stdlib/array-int16@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-int16array-support': 0.2.2
+
+  '@stdlib/array-int32@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-int32array-support': 0.2.2
+
+  '@stdlib/array-int8@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-int8array-support': 0.2.2
+
+  '@stdlib/array-uint16@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-uint16array-support': 0.2.2
+
+  '@stdlib/array-uint32@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-uint32array-support': 0.2.2
+
+  '@stdlib/array-uint8@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-uint8array-support': 0.2.2
+
+  '@stdlib/array-uint8c@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-uint8clampedarray-support': 0.2.2
+
+  '@stdlib/assert-has-float32array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-float32array': 0.2.2
+      '@stdlib/constants-float64-pinf': 0.2.2
+
+  '@stdlib/assert-has-float64array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-float64array': 0.2.2
+
+  '@stdlib/assert-has-int16array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-int16array': 0.2.2
+      '@stdlib/constants-int16-max': 0.2.2
+      '@stdlib/constants-int16-min': 0.2.2
+
+  '@stdlib/assert-has-int32array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-int32array': 0.2.2
+      '@stdlib/constants-int32-max': 0.3.0
+      '@stdlib/constants-int32-min': 0.2.2
+
+  '@stdlib/assert-has-int8array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-int8array': 0.2.2
+      '@stdlib/constants-int8-max': 0.2.2
+      '@stdlib/constants-int8-min': 0.2.2
+
+  '@stdlib/assert-has-node-buffer-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-buffer': 0.2.2
+
+  '@stdlib/assert-has-own-property@0.2.2': {}
+
+  '@stdlib/assert-has-symbol-support@0.2.2': {}
+
+  '@stdlib/assert-has-tostringtag-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-symbol-support': 0.2.2
+
+  '@stdlib/assert-has-uint16array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-uint16array': 0.2.2
+      '@stdlib/constants-uint16-max': 0.2.2
+
+  '@stdlib/assert-has-uint32array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-uint32array': 0.2.2
+      '@stdlib/constants-uint32-max': 0.2.2
+
+  '@stdlib/assert-has-uint8array-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-uint8array': 0.2.2
+      '@stdlib/constants-uint8-max': 0.2.2
+
+  '@stdlib/assert-has-uint8clampedarray-support@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-uint8clampedarray': 0.2.2
+
+  '@stdlib/assert-is-arguments@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-is-array': 0.2.2
+      '@stdlib/assert-is-enumerable-property': 0.2.2
+      '@stdlib/constants-uint32-max': 0.2.2
+      '@stdlib/math-base-assert-is-integer': 0.2.5
+      '@stdlib/utils-native-class': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-boolean@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-tostringtag-support': 0.2.2
+      '@stdlib/boolean-ctor': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-buffer@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-object-like': 0.2.2
+
+  '@stdlib/assert-is-collection@0.2.2':
+    dependencies:
+      '@stdlib/constants-array-max-typed-array-length': 0.2.2
+      '@stdlib/math-base-assert-is-integer': 0.2.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-enumerable-property@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-integer': 0.2.2
+      '@stdlib/assert-is-nan': 0.2.2
+      '@stdlib/assert-is-string': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-error@0.2.2':
+    dependencies:
+      '@stdlib/utils-get-prototype-of': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-float32array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-float64array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-function@0.2.2':
+    dependencies:
+      '@stdlib/utils-type-of': 0.2.2
+
+  '@stdlib/assert-is-int16array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-int32array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-int8array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-integer@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-number': 0.2.2
+      '@stdlib/constants-float64-ninf': 0.2.2
+      '@stdlib/constants-float64-pinf': 0.2.2
+      '@stdlib/math-base-assert-is-integer': 0.2.5
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-nan@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-number': 0.2.2
+      '@stdlib/math-base-assert-is-nan': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-nonnegative-integer@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-integer': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/assert-is-number@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-tostringtag-support': 0.2.2
+      '@stdlib/number-ctor': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-object-like@0.2.2':
+    dependencies:
+      '@stdlib/assert-tools-array-function': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/assert-is-object@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-array': 0.2.2
+
+  '@stdlib/assert-is-plain-object@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-is-function': 0.2.2
+      '@stdlib/assert-is-object': 0.2.2
+      '@stdlib/utils-get-prototype-of': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-regexp@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-tostringtag-support': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-string@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-tostringtag-support': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-uint16array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-uint32array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-uint8array@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-is-uint8clampedarray@0.2.2':
+    dependencies:
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/assert-tools-array-function@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-array': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/boolean-ctor@0.2.2': {}
+
+  '@stdlib/buffer-ctor@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-node-buffer-support': 0.2.2
+
+  '@stdlib/buffer-from-buffer@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-buffer': 0.2.2
+      '@stdlib/assert-is-function': 0.2.2
+      '@stdlib/buffer-ctor': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/complex-float32-ctor@0.0.2':
+    dependencies:
+      '@stdlib/assert-is-number': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/number-float64-base-to-float32': 0.2.2
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+      '@stdlib/utils-define-property': 0.2.4
+
+  '@stdlib/complex-float32-reim@0.1.2':
+    dependencies:
+      '@stdlib/array-float32': 0.2.2
+      '@stdlib/complex-float32-ctor': 0.0.2
+
+  '@stdlib/complex-float64-ctor@0.0.3':
+    dependencies:
+      '@stdlib/assert-is-number': 0.2.2
+      '@stdlib/complex-float32-ctor': 0.0.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+      '@stdlib/utils-define-property': 0.2.4
+
+  '@stdlib/complex-float64-reim@0.1.2':
+    dependencies:
+      '@stdlib/array-float64': 0.2.2
+      '@stdlib/complex-float64-ctor': 0.0.3
+
+  '@stdlib/constants-array-max-typed-array-length@0.2.2': {}
+
+  '@stdlib/constants-float64-ninf@0.2.2':
+    dependencies:
+      '@stdlib/number-ctor': 0.2.2
+
+  '@stdlib/constants-float64-pinf@0.2.2': {}
+
+  '@stdlib/constants-int16-max@0.2.2': {}
+
+  '@stdlib/constants-int16-min@0.2.2': {}
+
+  '@stdlib/constants-int32-max@0.3.0': {}
+
+  '@stdlib/constants-int32-min@0.2.2': {}
+
+  '@stdlib/constants-int8-max@0.2.2': {}
+
+  '@stdlib/constants-int8-min@0.2.2': {}
+
+  '@stdlib/constants-uint16-max@0.2.2': {}
+
+  '@stdlib/constants-uint32-max@0.2.2': {}
+
+  '@stdlib/constants-uint8-max@0.2.2': {}
+
+  '@stdlib/error-tools-fmtprodmsg@0.2.2': {}
+
+  '@stdlib/fs-exists@0.2.2':
+    dependencies:
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/fs-resolve-parent-path@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-is-function': 0.2.2
+      '@stdlib/assert-is-plain-object': 0.2.2
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/fs-exists': 0.2.2
+      '@stdlib/process-cwd': 0.2.2
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/math-base-assert-is-integer@0.2.5':
+    dependencies:
+      '@stdlib/math-base-special-floor': 0.2.3
+      '@stdlib/utils-library-manifest': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/math-base-assert-is-nan@0.2.2':
+    dependencies:
+      '@stdlib/utils-library-manifest': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/math-base-napi-unary@0.2.3':
+    dependencies:
+      '@stdlib/complex-float32-ctor': 0.0.2
+      '@stdlib/complex-float32-reim': 0.1.2
+      '@stdlib/complex-float64-ctor': 0.0.3
+      '@stdlib/complex-float64-reim': 0.1.2
+      '@stdlib/utils-library-manifest': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/math-base-special-floor@0.2.3':
+    dependencies:
+      '@stdlib/math-base-napi-unary': 0.2.3
+      '@stdlib/utils-library-manifest': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/number-ctor@0.2.2': {}
+
+  '@stdlib/number-float64-base-to-float32@0.2.2':
+    dependencies:
+      '@stdlib/array-float32': 0.2.2
+
+  '@stdlib/object-ctor@0.2.1': {}
+
+  '@stdlib/process-cwd@0.2.2': {}
+
+  '@stdlib/regexp-extended-length-path@0.2.2':
+    dependencies:
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/regexp-function-name@0.2.2':
+    dependencies:
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/regexp-regexp@0.2.2':
+    dependencies:
+      '@stdlib/utils-define-nonenumerable-read-only-property': 0.2.2
+
+  '@stdlib/string-base-format-interpolate@0.2.2': {}
+
+  '@stdlib/string-base-format-tokenize@0.2.2': {}
+
+  '@stdlib/string-base-lowercase@0.4.0': {}
+
+  '@stdlib/string-base-replace@0.2.2': {}
+
+  '@stdlib/string-format@0.2.2':
+    dependencies:
+      '@stdlib/string-base-format-interpolate': 0.2.2
+      '@stdlib/string-base-format-tokenize': 0.2.2
+
+  '@stdlib/string-replace@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-function': 0.2.2
+      '@stdlib/assert-is-regexp': 0.2.2
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-base-replace': 0.2.2
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/utils-escape-regexp-string': 0.2.2
+
+  '@stdlib/symbol-ctor@0.2.2': {}
+
+  '@stdlib/utils-constructor-name@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-buffer': 0.2.2
+      '@stdlib/regexp-function-name': 0.2.2
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/utils-convert-path@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/regexp-extended-length-path': 0.2.2
+      '@stdlib/string-base-lowercase': 0.4.0
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/string-replace': 0.2.2
+
+  '@stdlib/utils-copy@0.2.2':
+    dependencies:
+      '@stdlib/array-float32': 0.2.2
+      '@stdlib/array-float64': 0.2.2
+      '@stdlib/array-int16': 0.2.2
+      '@stdlib/array-int32': 0.2.2
+      '@stdlib/array-int8': 0.2.2
+      '@stdlib/array-uint16': 0.2.2
+      '@stdlib/array-uint32': 0.2.2
+      '@stdlib/array-uint8': 0.2.2
+      '@stdlib/array-uint8c': 0.2.2
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-is-array': 0.2.2
+      '@stdlib/assert-is-buffer': 0.2.2
+      '@stdlib/assert-is-error': 0.2.2
+      '@stdlib/assert-is-nonnegative-integer': 0.2.2
+      '@stdlib/buffer-from-buffer': 0.2.2
+      '@stdlib/constants-float64-pinf': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+      '@stdlib/utils-define-property': 0.2.4
+      '@stdlib/utils-get-prototype-of': 0.2.2
+      '@stdlib/utils-index-of': 0.2.2
+      '@stdlib/utils-keys': 0.2.2
+      '@stdlib/utils-property-descriptor': 0.2.2
+      '@stdlib/utils-property-names': 0.2.2
+      '@stdlib/utils-regexp-from-string': 0.2.2
+      '@stdlib/utils-type-of': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/utils-define-nonenumerable-read-only-property@0.2.2':
+    dependencies:
+      '@stdlib/utils-define-property': 0.2.4
+
+  '@stdlib/utils-define-property@0.2.4':
+    dependencies:
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/utils-escape-regexp-string@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/utils-get-prototype-of@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-function': 0.2.2
+      '@stdlib/object-ctor': 0.2.1
+      '@stdlib/utils-native-class': 0.2.2
+
+  '@stdlib/utils-global@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-boolean': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/utils-index-of@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-collection': 0.2.2
+      '@stdlib/assert-is-integer': 0.2.2
+      '@stdlib/assert-is-nan': 0.2.2
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/string-format': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/utils-keys@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-is-arguments': 0.2.2
+      '@stdlib/assert-is-enumerable-property': 0.2.2
+      '@stdlib/assert-is-object-like': 0.2.2
+      '@stdlib/utils-index-of': 0.2.2
+      '@stdlib/utils-noop': 0.2.2
+      '@stdlib/utils-type-of': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/utils-library-manifest@0.2.2':
+    dependencies:
+      '@stdlib/fs-resolve-parent-path': 0.2.2
+      '@stdlib/utils-convert-path': 0.2.2
+      debug: 2.6.9
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/utils-native-class@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+      '@stdlib/assert-has-tostringtag-support': 0.2.2
+      '@stdlib/symbol-ctor': 0.2.2
+
+  '@stdlib/utils-noop@0.2.2': {}
+
+  '@stdlib/utils-property-descriptor@0.2.2':
+    dependencies:
+      '@stdlib/assert-has-own-property': 0.2.2
+
+  '@stdlib/utils-property-names@0.2.2':
+    dependencies:
+      '@stdlib/object-ctor': 0.2.1
+      '@stdlib/utils-keys': 0.2.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@stdlib/utils-regexp-from-string@0.2.2':
+    dependencies:
+      '@stdlib/assert-is-string': 0.2.2
+      '@stdlib/error-tools-fmtprodmsg': 0.2.2
+      '@stdlib/regexp-regexp': 0.2.2
+      '@stdlib/string-format': 0.2.2
+
+  '@stdlib/utils-type-of@0.2.2':
+    dependencies:
+      '@stdlib/utils-constructor-name': 0.2.2
+      '@stdlib/utils-global': 0.2.2
+
+  '@tryghost/errors@1.3.6':
+    dependencies:
+      '@stdlib/utils-copy': 0.2.2
+      uuid: 9.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@tryghost/tpl@0.1.33':
+    dependencies:
+      lodash.template: 4.5.0
+
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
@@ -1578,6 +2719,10 @@ snapshots:
 
   bowser@2.11.0: {}
 
+  debug@2.6.9:
+    dependencies:
+      ms: 2.0.0
+
   esbuild@0.20.2:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.20.2
@@ -1608,16 +2753,49 @@ snapshots:
     dependencies:
       strnum: 1.0.5
 
+  function-bind@1.1.2: {}
+
   ghost-storage-base@1.0.0:
     dependencies:
       moment: 2.27.0
 
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  is-core-module@2.16.1:
+    dependencies:
+      hasown: 2.0.2
+
+  lodash._reinterpolate@3.0.0: {}
+
+  lodash.template@4.5.0:
+    dependencies:
+      lodash._reinterpolate: 3.0.0
+      lodash.templatesettings: 4.2.0
+
+  lodash.templatesettings@4.2.0:
+    dependencies:
+      lodash._reinterpolate: 3.0.0
+
   moment@2.27.0: {}
 
+  ms@2.0.0: {}
+
+  path-parse@1.0.7: {}
+
   prettier@3.4.2: {}
 
+  resolve@1.22.10:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
   strnum@1.0.5: {}
 
+  supports-preserve-symlinks-flag@1.0.0: {}
+
   tslib@2.8.1: {}
 
   typescript@5.7.2: {}
diff --git a/src/index.ts b/src/index.ts
index b4a0fae..85f88bd 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,6 +5,8 @@ import {
   S3,
 } from '@aws-sdk/client-s3'
 import StorageBase, { type ReadOptions, type Image } from 'ghost-storage-base'
+import errors from '@tryghost/errors'
+import tpl from '@tryghost/tpl'
 import { join } from 'path'
 import { createReadStream } from 'fs'
 import type { Readable } from 'stream'
@@ -197,16 +199,20 @@ class S3Storage extends StorageBase {
         stream.pipe(res)
       } catch (err) {
         if (err.name === 'NoSuchKey') {
-          res.status(404).send('Image not found');
+          return next(
+            new errors.NotFoundError({
+              message: tpl('File not found'),
+              code: 'STATIC_FILE_NOT_FOUND',
+              property: err.path,
+            })
+          )
         } else {
-          res.status(500);
-          next(err);
+          next(new errors.InternalServerError({ err: err }))
         }
       }
     }
   }
 
-
   async read(options: ReadOptions = { path: '' }) {
     let path = (options.path || '').replace(/\/$|\\$/, '')