diff --git a/.eslintignore b/.eslintignore index 7b8f65bfe..125357c5f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -15,4 +15,5 @@ tsconfig.tsbuildinfo *.css ./deploy* *.tar.gz -*.xml \ No newline at end of file +*.xml +public/* \ No newline at end of file diff --git a/config/config.json b/config/config.json index dd421dc29..22a00ad4d 100755 --- a/config/config.json +++ b/config/config.json @@ -48,7 +48,7 @@ "ICON_CMD": "https://assets.coderplanets.com/icons/cmd", "DEFAULT_ICON": "https://assets.coderplanets.com/icons/cmd/cheatsheet.svg", "DEFAULT_USER_AVATAR": "https://assets.coderplanets.com/icons/cmd/alien_user3.svg", - "GRAPHQL_ENDPOINT": "http://localhost:4001/graphiql", + "GRAPHQL_ENDPOINT": "https://api.coderplanets.com/graphiql", "SITE_URL": "https://coderplanets.com", "SITE_URL_SHORT": "https://coderplanets.com", "GITHUB": "https://github.com/coderplanets", @@ -59,7 +59,7 @@ "//--- contact configs ---//": "", "EMAIL_SUPPORT": "coderplanets@outlook.com", "// GRAPHQL_ENDPOINT": "https://api.coderplanets.com/graphiql", - "BUILD_VERSION": "v2.0.98", + "BUILD_VERSION": "v2.0.99", "// 1000 * 60 * 10 = 10 mins": "", "SSR_CACHE_TIME": 60000 } diff --git a/deploy/production/web.tar.gz b/deploy/production/web.tar.gz index 477d998ff..efd5886c1 100755 Binary files a/deploy/production/web.tar.gz and b/deploy/production/web.tar.gz differ diff --git a/next.config.js b/next.config.js index a05b66d2b..3c3ab34f8 100755 --- a/next.config.js +++ b/next.config.js @@ -5,27 +5,22 @@ const withPlugins = require('next-compose-plugins') const withSourceMaps = require('@zeit/next-source-maps')() const withPWA = require('next-pwa') -// const withOffline = require('next-offline') const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }) -// const offlineConfig = require('./config/next_offline') // next-plugins end -const nextConfig = {} +// if move pwa config to witPlugins, it will not work +const nextConfig = withPWA({ + productionBrowserSourceMaps: false, + pwa: { + dest: 'public', + disable: process.env.NODE_ENV !== 'production', + register: true, + // scope: '/cp', + sw: 'sw.js', + }, +}) -module.exports = withPlugins( - // [withBundleAnalyzer, withSourceMaps, [withOffline, offlineConfig]], - [ - [ - withPWA, - { - dest: 'public', - }, - ], - withBundleAnalyzer, - withSourceMaps, - ], - nextConfig, -) +module.exports = withPlugins([withBundleAnalyzer, withSourceMaps], nextConfig) diff --git a/package-lock.json b/package-lock.json index 0fb24bf7f..c33e05b2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "dependencies": { "@babel/core": "^7.13.14", "@groupher/react-editor": "^1.1.30", + "@next-boost/hybrid-disk-cache": "^0.3.0", + "@next-boost/next-boost": "^0.15.1", "@next/bundle-analyzer": "^9.4.4", "@sentry/browser": "5.17.0", "@sentry/node": "5.17.0", @@ -3195,6 +3197,62 @@ "version": "1.0.3", "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" }, + "node_modules/@next-boost/hybrid-disk-cache": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@next-boost/hybrid-disk-cache/-/hybrid-disk-cache-0.3.0.tgz", + "integrity": "sha512-vswIzvNJXvAR8IYH0T9O32qkfJ4CbidJblsEtxthoeZUJwyxNtvNzLun7AOv4q67TToL6yvc4nJcUStB8e7A8w==", + "dependencies": { + "better-sqlite3": "^7.1.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/@next-boost/hybrid-disk-cache/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@next-boost/hybrid-disk-cache/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@next-boost/hybrid-disk-cache/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@next-boost/next-boost": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@next-boost/next-boost/-/next-boost-0.15.1.tgz", + "integrity": "sha512-BVzhi6MKiDGR8q0Lg81nWtyrh+qCLBFCj4L0E4n1ZNnRs52GOcLhbADUSuojVwbgcN2mtYwOJP5WrDrqdr0cwA==", + "dependencies": { + "http-graceful-shutdown": "^3.1.5", + "multee": "^0.2.3" + }, + "bin": { + "next-boost": "dist/next/server.js" + }, + "peerDependencies": { + "next": "^12.0.0" + } + }, "node_modules/@next/bundle-analyzer": { "version": "9.5.5", "integrity": "sha512-HDYa5oFtBlZXG/N1wsheOaj2XeOFEi0HzwPiyIP82TxjoDoB6HKDYRIV3JHIUCeGFjkA66jSh8r1EAHNOuU51A==", @@ -6154,6 +6212,17 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/better-sqlite3": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.5.tgz", + "integrity": "sha512-mybC3dgrtJeHkIRGP36tST7wjBlIMgTRAXhhO4bMpPZ17EG23FZxZeFcwKWy6o8mV1SKQFnQNyeAZlQpGrgheQ==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.0.0", + "tar": "^6.1.11" + } + }, "node_modules/bezier-easing": { "version": "2.1.0", "integrity": "sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY=" @@ -6188,11 +6257,33 @@ "node_modules/bindings": { "version": "1.5.0", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blob-util": { "version": "2.0.2", "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", @@ -9687,11 +9778,33 @@ "node": ">=0.10" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "0.7.0", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" @@ -9969,6 +10082,17 @@ "node": ">=4" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", @@ -11536,6 +11660,14 @@ "node": ">=0.10.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", @@ -11931,8 +12063,7 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/filelist": { "version": "1.0.2", @@ -12590,6 +12721,11 @@ "node": ">=0.10.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "7.0.1", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", @@ -12602,6 +12738,17 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", @@ -13046,6 +13193,11 @@ "ini": "^1.3.2" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "node_modules/glightbox": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glightbox/-/glightbox-3.1.0.tgz", @@ -13607,6 +13759,17 @@ "version": "2.0.3", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "node_modules/http-graceful-shutdown": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.5.tgz", + "integrity": "sha512-DTydrvfHuqSw6cPFgYJEcex5BUsKxvXsbgkuCwlijaHebYcC6iEcPFgkJwucqhyu5pARGDoIPYE1yG06sUotfQ==", + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", @@ -13886,8 +14049,7 @@ }, "node_modules/ini": { "version": "1.3.8", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/inline-style-prefixer": { "version": "6.0.0", @@ -17148,6 +17310,17 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", @@ -17190,6 +17363,39 @@ "node": ">= 4" } }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/mississippi": { "version": "2.0.0", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", @@ -17248,6 +17454,11 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mobius1-selectr": { "version": "2.4.13", "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" @@ -17375,6 +17586,14 @@ "version": "2.0.0", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/multee": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/multee/-/multee-0.2.4.tgz", + "integrity": "sha512-9d0awj2iYQTdzHPCjpl/2CQNT3YZDimLU2FVa6Wf4yHqUqHg1F7R0hU9SmVZQxkLsPLGS5F7PltZA5MqRSfpOg==", + "dependencies": { + "uuid": "^8.3.2" + } + }, "node_modules/multimatch": { "version": "3.0.0", "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", @@ -17515,6 +17734,11 @@ "node": ">=0.10.0" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/natural-compare": { "version": "1.4.0", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" @@ -18582,6 +18806,47 @@ "lower-case": "^1.1.1" } }, + "node_modules/node-abi": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz", + "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/node-fetch": { "version": "2.6.1", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", @@ -20121,6 +20386,32 @@ "version": "4.1.0", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, + "node_modules/prebuild-install": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.0.tgz", + "integrity": "sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==", + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", @@ -20631,6 +20922,28 @@ "node": ">= 0.6" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "17.0.2", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", @@ -22302,6 +22615,49 @@ "version": "3.0.3", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-html-tokenizer": { "version": "0.1.1", "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" @@ -23467,6 +23823,85 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -24084,7 +24519,6 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -24567,7 +25001,6 @@ "node_modules/uuid": { "version": "8.3.2", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -28290,6 +28723,50 @@ "version": "1.0.3", "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" }, + "@next-boost/hybrid-disk-cache": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@next-boost/hybrid-disk-cache/-/hybrid-disk-cache-0.3.0.tgz", + "integrity": "sha512-vswIzvNJXvAR8IYH0T9O32qkfJ4CbidJblsEtxthoeZUJwyxNtvNzLun7AOv4q67TToL6yvc4nJcUStB8e7A8w==", + "requires": { + "better-sqlite3": "^7.1.1", + "fs-extra": "^10.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } + } + }, + "@next-boost/next-boost": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@next-boost/next-boost/-/next-boost-0.15.1.tgz", + "integrity": "sha512-BVzhi6MKiDGR8q0Lg81nWtyrh+qCLBFCj4L0E4n1ZNnRs52GOcLhbADUSuojVwbgcN2mtYwOJP5WrDrqdr0cwA==", + "requires": { + "http-graceful-shutdown": "^3.1.5", + "multee": "^0.2.3" + } + }, "@next/bundle-analyzer": { "version": "9.5.5", "integrity": "sha512-HDYa5oFtBlZXG/N1wsheOaj2XeOFEi0HzwPiyIP82TxjoDoB6HKDYRIV3JHIUCeGFjkA66jSh8r1EAHNOuU51A==", @@ -30607,6 +31084,16 @@ "tweetnacl": "^0.14.3" } }, + "better-sqlite3": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.5.tgz", + "integrity": "sha512-mybC3dgrtJeHkIRGP36tST7wjBlIMgTRAXhhO4bMpPZ17EG23FZxZeFcwKWy6o8mV1SKQFnQNyeAZlQpGrgheQ==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.0.0", + "tar": "^6.1.11" + } + }, "bezier-easing": { "version": "2.1.0", "integrity": "sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY=" @@ -30632,11 +31119,32 @@ "bindings": { "version": "1.5.0", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, "requires": { "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob-util": { "version": "2.0.2", "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", @@ -33358,11 +33866,24 @@ "version": "0.2.0", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, "dedent": { "version": "0.7.0", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.4", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" @@ -33575,6 +34096,11 @@ "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "3.1.0", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", @@ -34767,6 +35293,11 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expand-tilde": { "version": "2.0.2", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", @@ -35097,8 +35628,7 @@ }, "file-uri-to-path": { "version": "1.0.0", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "filelist": { "version": "1.0.2", @@ -35619,6 +36149,11 @@ "null-check": "^1.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "7.0.1", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", @@ -35628,6 +36163,14 @@ "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", @@ -35976,6 +36519,11 @@ "ini": "^1.3.2" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "glightbox": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glightbox/-/glightbox-3.1.0.tgz", @@ -36409,6 +36957,14 @@ } } }, + "http-graceful-shutdown": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.5.tgz", + "integrity": "sha512-DTydrvfHuqSw6cPFgYJEcex5BUsKxvXsbgkuCwlijaHebYcC6iEcPFgkJwucqhyu5pARGDoIPYE1yG06sUotfQ==", + "requires": { + "debug": "^4.3.1" + } + }, "http-proxy-agent": { "version": "4.0.1", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", @@ -36617,8 +37173,7 @@ }, "ini": { "version": "1.3.8", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inline-style-prefixer": { "version": "6.0.0", @@ -39043,6 +39598,11 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, "min-indent": { "version": "1.0.1", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", @@ -39076,6 +39636,37 @@ "is-plain-obj": "^1.1.0" } }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "mississippi": { "version": "2.0.0", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", @@ -39126,6 +39717,11 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "mobius1-selectr": { "version": "2.4.13", "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" @@ -39193,6 +39789,14 @@ "version": "2.0.0", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multee": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/multee/-/multee-0.2.4.tgz", + "integrity": "sha512-9d0awj2iYQTdzHPCjpl/2CQNT3YZDimLU2FVa6Wf4yHqUqHg1F7R0hU9SmVZQxkLsPLGS5F7PltZA5MqRSfpOg==", + "requires": { + "uuid": "^8.3.2" + } + }, "multimatch": { "version": "3.0.0", "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", @@ -39306,6 +39910,11 @@ } } }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "natural-compare": { "version": "1.4.0", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" @@ -40147,6 +40756,37 @@ "lower-case": "^1.1.1" } }, + "node-abi": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz", + "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==", + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "node-fetch": { "version": "2.6.1", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" @@ -41343,6 +41983,26 @@ "version": "4.1.0", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, + "prebuild-install": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.0.tgz", + "integrity": "sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" @@ -41744,6 +42404,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, "react": { "version": "17.0.2", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", @@ -43015,6 +43693,21 @@ "version": "3.0.3", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-html-tokenizer": { "version": "0.1.1", "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" @@ -43923,6 +44616,71 @@ "version": "1.1.3", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -44400,7 +45158,6 @@ "tunnel-agent": { "version": "0.6.0", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -44747,8 +45504,7 @@ }, "uuid": { "version": "8.3.2", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", diff --git a/package.json b/package.json index 6ef4ac195..eadc84eca 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,9 @@ "dev": "cross-env NODE_ENV=dev node server.js", "prod": "cross-env NODE_ENV=production run-p server", "local": "cross-env NODE_ENV=local node server", + "nextdev": "cross-env NODE_ENV=dev next dev", + "nextstart": "next-boost", + "nextstart2": "cross-env NODE_ENV=production next start", "ci": "cross-env NODE_ENV=ci node server", "server": "npm run clean && node server.js", "build": "next build", @@ -16,7 +19,8 @@ "size.check": "bundlewatch --config size-limit.config.json", "serve": "cross-env NODE_ENV=production next start -p ${SERVE_PORT}", "serve.dev": "cross-env NODE_ENV=dev SERVE_PORT=${SERVE_PORT} node server", - "serve.prod": "cross-env NODE_ENV=production SERVE_PORT=${SERVE_PORT} node server", + "serve.prod.old": "cross-env NODE_ENV=production SERVE_PORT=${SERVE_PORT} node server", + "serve.prod": "cross-env NODE_ENV=production next-boost -p ${SERVE_PORT}", "dist": "next build && next export -o \"build\"", "start": "NODE_ENV=production node server.js", "clean": "shjs ./utils/scripts/clean.js", @@ -42,6 +46,8 @@ "dependencies": { "@babel/core": "^7.13.14", "@groupher/react-editor": "^1.1.30", + "@next-boost/hybrid-disk-cache": "^0.3.0", + "@next-boost/next-boost": "^0.15.1", "@next/bundle-analyzer": "^9.4.4", "@sentry/browser": "5.17.0", "@sentry/node": "5.17.0", diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 000000000..ef75fff68 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,2322 @@ +if (!self.define) { + let s, + c = {} + const e = (e, i) => ( + (e = new URL(e + '.js', i).href), + c[e] || + new Promise((c) => { + if ('document' in self) { + const s = document.createElement('script') + ;(s.src = e), (s.onload = c), document.head.appendChild(s) + } else (s = e), importScripts(e), c() + }).then(() => { + let s = c[e] + if (!s) throw new Error(`Module ${e} didn’t register its module`) + return s + }) + ) + self.define = (i, n) => { + const a = + s || + ('document' in self ? document.currentScript.src : '') || + location.href + if (c[a]) return + let t = {} + const l = (s) => e(s, a), + o = { module: { uri: a }, exports: t, require: l } + c[a] = Promise.all(i.map((s) => o[s] || l(s))).then((s) => (n(...s), t)) + } +} +define(['./workbox-a7787ddd'], function (s) { + 'use strict' + importScripts(), + self.skipWaiting(), + s.clientsClaim(), + s.precacheAndRoute( + [ + { + url: '/_next/static/chunks/1033-dc1b539f926662fd.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1033-dc1b539f926662fd.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1036-897d43d159fd9b9c.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1036-897d43d159fd9b9c.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1114.24d7a261b9cba3d1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1114.24d7a261b9cba3d1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1187.330ea57bc7cfe628.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1187.330ea57bc7cfe628.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1308.7f25ec3876b24f79.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1308.7f25ec3876b24f79.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1338.3e521f7b2b8605f5.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1338.3e521f7b2b8605f5.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1483.0b4a0d9b479b0b49.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1483.0b4a0d9b479b0b49.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1496-223172df7f352456.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1496-223172df7f352456.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1550.a87c146b74b1344e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1550.a87c146b74b1344e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1563.7b7ec83b00effa03.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1563.7b7ec83b00effa03.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/17-72e32ec7a9c9bbf1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/17-72e32ec7a9c9bbf1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1704.f5cc76fa86bce497.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1704.f5cc76fa86bce497.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1783.bcf06af93db68081.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1783.bcf06af93db68081.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1914.6a92b9f9472c85af.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/1914.6a92b9f9472c85af.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/217.eb69dae0828ec787.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/217.eb69dae0828ec787.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2225.a2e2bac61047049a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2225.a2e2bac61047049a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2265.8b128e14ce38ad76.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2265.8b128e14ce38ad76.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2309.f317edcd5a762bcc.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2309.f317edcd5a762bcc.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2380-22647488defcbcdc.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2380-22647488defcbcdc.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/240-3b2cb9820094d3c2.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/240-3b2cb9820094d3c2.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2415.9b601e35731bf917.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2415.9b601e35731bf917.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2435.b3e3b0347fa84f58.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2435.b3e3b0347fa84f58.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2467.5c719b97bde88637.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2467.5c719b97bde88637.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2555.50891edf74e3a845.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2555.50891edf74e3a845.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2562.4c4ca59d23e54817.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2562.4c4ca59d23e54817.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2679-b8078f8929e08b3d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2679-b8078f8929e08b3d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2705.63c9477d1495b9ff.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2705.63c9477d1495b9ff.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2823.405fb06c5f50a71a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2823.405fb06c5f50a71a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2872.7a49327a03617070.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2872.7a49327a03617070.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2933.37eb95d2f3bbed28.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/2933.37eb95d2f3bbed28.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/299.3baad4d044f6571f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/299.3baad4d044f6571f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/303bb2b0.7cbe7be7a6462f1a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/303bb2b0.7cbe7be7a6462f1a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3159.460423fa14e863e0.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3159.460423fa14e863e0.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3178-88f3cc4ae13fe005.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3178-88f3cc4ae13fe005.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3282.e305b8ba5d1ade37.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3282.e305b8ba5d1ade37.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3365.7908e30687f069be.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3365.7908e30687f069be.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3415-4ca60958406bc056.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3415-4ca60958406bc056.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3531.8fefdac701d2bd91.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3531.8fefdac701d2bd91.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3548.17da4b5fbd23891a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3548.17da4b5fbd23891a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/362.e4e6d53660aff266.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/362.e4e6d53660aff266.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3663-1d285ca9cb5883a1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3663-1d285ca9cb5883a1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3824-0bae6d320d70610f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3824-0bae6d320d70610f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3897-ca28d134ff66ba94.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3897-ca28d134ff66ba94.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3924.b62204d654f76de9.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3924.b62204d654f76de9.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3935-7b3c1fa4e27243e1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3935-7b3c1fa4e27243e1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3958.fbfd9ce2d56a90df.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3958.fbfd9ce2d56a90df.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3981.0fc7fb65e07d5e91.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/3981.0fc7fb65e07d5e91.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/445.c79bcc9bec9ec56e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/445.c79bcc9bec9ec56e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4461-fe40709661f31898.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4461-fe40709661f31898.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4470.3c9dc1d8603c717c.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4470.3c9dc1d8603c717c.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4483.63bf2ced5a5c89c1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4483.63bf2ced5a5c89c1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4486-f14199c193b5a5a3.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4486-f14199c193b5a5a3.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4517-5e7961494ee42971.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4517-5e7961494ee42971.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/470-ff9a077ad4f4b5b9.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/470-ff9a077ad4f4b5b9.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4961.af86047fe1ae854d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4961.af86047fe1ae854d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4c4ba9aa-cd085826f29c5c37.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4c4ba9aa-cd085826f29c5c37.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4efdadb3.ace932300e0c9963.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/4efdadb3.ace932300e0c9963.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5024-d19b1b1396fd1b46.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5024-d19b1b1396fd1b46.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5032-e49bce4db5bf444b.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5032-e49bce4db5bf444b.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5206.594a490e5b4e8e59.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5206.594a490e5b4e8e59.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/522-82948a5d28ffaa76.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/522-82948a5d28ffaa76.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5307.68db0eafdccc72f6.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5307.68db0eafdccc72f6.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5436.d678f5b79f21f13b.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5436.d678f5b79f21f13b.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5440.51ee62faad8fd537.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5440.51ee62faad8fd537.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/551.8187d26b301ca287.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/551.8187d26b301ca287.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5568.8b6c41adc63fb887.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5568.8b6c41adc63fb887.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5600.5aa64f628342aa93.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5600.5aa64f628342aa93.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5642-bfe8e4fa0c8cac2f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5642-bfe8e4fa0c8cac2f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5734-09a25f677746e5c3.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5734-09a25f677746e5c3.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5808-8378cb38fd572740.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5808-8378cb38fd572740.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5839.74f92656227ae788.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5839.74f92656227ae788.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5845.84796b87ac2aa056.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5845.84796b87ac2aa056.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5891-06c1cbb667e0cef9.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5891-06c1cbb667e0cef9.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5898.7b0d693300c52231.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5898.7b0d693300c52231.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5912.75f8f0d911ca3e0e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/5912.75f8f0d911ca3e0e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6122.b9a68564dfe4961b.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6122.b9a68564dfe4961b.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6135.b98cd5d800a57d22.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6135.b98cd5d800a57d22.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6155.4efabe6dcfa0a43c.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6155.4efabe6dcfa0a43c.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6164.fa8a2ea45144faca.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6164.fa8a2ea45144faca.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6182.05a19be5feeaa4d1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6182.05a19be5feeaa4d1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6215.6c1972e49cf37dbd.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6215.6c1972e49cf37dbd.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6226-3786d3c01f9da72a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6226-3786d3c01f9da72a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6329-860c3898694751ee.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6329-860c3898694751ee.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/632cba62-ad69bed0a4b35062.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/632cba62-ad69bed0a4b35062.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6640-098c018fdcaf0c27.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6640-098c018fdcaf0c27.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6697.5e7343d9f0c7916f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6697.5e7343d9f0c7916f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6864.7527d3991c20d979.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6864.7527d3991c20d979.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6898.6ed9c6db1707e410.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6898.6ed9c6db1707e410.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6925.07e575fd3c59f240.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6925.07e575fd3c59f240.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/69364278-f61b0d9425e1bf0e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/69364278-f61b0d9425e1bf0e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/697-09e6733e2bc53700.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/697-09e6733e2bc53700.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6999.5475f66e0c765fb7.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/6999.5475f66e0c765fb7.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7066.ee5ac458473a5258.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7066.ee5ac458473a5258.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7073.1de2c13d2130bb62.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7073.1de2c13d2130bb62.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7266.dad2e0a11dab8ed3.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7266.dad2e0a11dab8ed3.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7441-4c132af1a8a6e202.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7441-4c132af1a8a6e202.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7474.57f8b8b0bae99556.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7474.57f8b8b0bae99556.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7497.0d35355db805190a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7497.0d35355db805190a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7689-ec6a91113c3ec50d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7689-ec6a91113c3ec50d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7863.dba773eed3a7a1fb.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7863.dba773eed3a7a1fb.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7936-53e2bc62b4781078.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/7936-53e2bc62b4781078.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8203-17775f40f0a7bbe5.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8203-17775f40f0a7bbe5.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8246-dd5df68eb4164d43.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8246-dd5df68eb4164d43.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8446.d594c31c7dafe7bc.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8446.d594c31c7dafe7bc.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8673.73e07022c15af553.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8673.73e07022c15af553.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8691.ff8538373e827399.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8691.ff8538373e827399.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8832.19d316f46f064b55.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8832.19d316f46f064b55.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8846.8635d177830b6e67.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/8846.8635d177830b6e67.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9221.986323eb2fc3cd13.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9221.986323eb2fc3cd13.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9352.933be5f9b1b19819.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9352.933be5f9b1b19819.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9361-89f2f5b9adfd1870.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9361-89f2f5b9adfd1870.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9379-2f9f8041f6d22849.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9379-2f9f8041f6d22849.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9406.c5d5bf3a5a78f59c.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9406.c5d5bf3a5a78f59c.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9421.b93099e8d791c726.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9421.b93099e8d791c726.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9454.12cacb7f1c9972ff.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9454.12cacb7f1c9972ff.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9476.a5f23656a1d77543.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9476.a5f23656a1d77543.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9501-9b1113677ae8a3cd.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9501-9b1113677ae8a3cd.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9512-49785760c3d84cf6.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9512-49785760c3d84cf6.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9575.6f351b2baca9d09f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9575.6f351b2baca9d09f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9633-627d91c5b4aa8b6d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9633-627d91c5b4aa8b6d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9635.ebaa35723fb3414e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9635.ebaa35723fb3414e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9651.c50399052fc5579a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9651.c50399052fc5579a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9734-ebd2d6a72248903c.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9734-ebd2d6a72248903c.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/981-082a3a4eda472f89.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/981-082a3a4eda472f89.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9841.3e661c8e8e6bc7d5.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9841.3e661c8e8e6bc7d5.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9931.b460a4b8f566dd0d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/9931.b460a4b8f566dd0d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/commons-15b46957d7862dd1.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/commons-15b46957d7862dd1.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/e7de538c.5bf40d57c671b14b.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/e7de538c.5bf40d57c671b14b.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/e82996df-fa04a266adb84a81.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/e82996df-fa04a266adb84a81.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/framework-5575b00731a3df2f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/framework-5575b00731a3df2f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/main-ca95c100022268cc.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/main-ca95c100022268cc.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/%5Bcommunity%5D-c84ae5a8fe49b7b9.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/%5Bcommunity%5D-c84ae5a8fe49b7b9.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/%5Bcommunity%5D/%5Bthread%5D-f5d1defa062c78a8.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/%5Bcommunity%5D/%5Bthread%5D-f5d1defa062c78a8.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/_app-90b68d1b21af42cc.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/_app-90b68d1b21af42cc.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/_error-39d310b7def2c960.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/_error-39d310b7def2c960.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/apply/community-f998720d482f91f8.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/apply/community-f998720d482f91f8.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/blog/%5Bid%5D-f763cfc8ff698ed9.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/blog/%5Bid%5D-f763cfc8ff698ed9.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/cool-guide-f01f7be25239df21.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/cool-guide-f01f7be25239df21.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/explore-8f946d6a1a4cf580.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/explore-8f946d6a1a4cf580.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/friends-c46cb51bfcbbf789.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/friends-c46cb51bfcbbf789.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/have-a-drink-d29b774329825762.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/have-a-drink-d29b774329825762.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/help-center-07d82f9f067e3bc0.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/help-center-07d82f9f067e3bc0.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/index-c295364974b80d7b.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/index-c295364974b80d7b.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/job/%5Bid%5D-4d88e476e0d76207.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/job/%5Bid%5D-4d88e476e0d76207.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/meetups-7695f7e6d35c7602.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/meetups-7695f7e6d35c7602.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/membership-27d9495d80cb04ca.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/membership-27d9495d80cb04ca.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/oauth-58fffbda3c17fb39.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/oauth-58fffbda3c17fb39.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/oops-bf3df6969738eb0a.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/oops-bf3df6969738eb0a.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/plaza-f3577316cca1123d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/plaza-f3577316cca1123d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/post/%5Bid%5D-92fb34c342426041.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/post/%5Bid%5D-92fb34c342426041.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/blog-3ff60f8df631787f.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/blog-3ff60f8df631787f.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/job-ae0b282540ec9e47.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/job-ae0b282540ec9e47.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/post-1cf0fc56771c7849.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/post-1cf0fc56771c7849.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/radar-dcdb71f2c7f450d0.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/radar-dcdb71f2c7f450d0.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/works-357f78751d2298bb.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/publish/works-357f78751d2298bb.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/radar/%5Bid%5D-530a0fc0089c0f09.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/radar/%5Bid%5D-530a0fc0089c0f09.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/recipes-1982f593e605dd96.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/recipes-1982f593e605dd96.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/sponsor-2a4a47a159bddc86.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/sponsor-2a4a47a159bddc86.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/subscribe-78372b3c797ed0f6.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/subscribe-78372b3c797ed0f6.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/support-us-3c307c68b9b2852d.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/support-us-3c307c68b9b2852d.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/trending-8ae0851eb5c589b7.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/trending-8ae0851eb5c589b7.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/job/%5Bid%5D-a020e26e7be99c89.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/job/%5Bid%5D-a020e26e7be99c89.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/post/%5Bid%5D-cdb91a69d5a3af45.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/post/%5Bid%5D-cdb91a69d5a3af45.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/radar/%5Bid%5D-dfd259964d09c3a8.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/radar/%5Bid%5D-dfd259964d09c3a8.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/rss-0480eb5991240953.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/rss-0480eb5991240953.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/works/%5Bid%5D-bdc49e79be1db8f2.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/update/works/%5Bid%5D-bdc49e79be1db8f2.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/user/%5Blogin%5D-b7e8b4943b76f935.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/user/%5Blogin%5D-b7e8b4943b76f935.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/works/%5Bid%5D-094429abbe7001b8.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/pages/works/%5Bid%5D-094429abbe7001b8.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/polyfills-a40ef1678bae11e696dba45124eadd70.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/webpack-f847da185c27b44e.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/chunks/webpack-f847da185c27b44e.js.map', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/vd80ljfoAHXGnCpTcOQlB/_buildManifest.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/vd80ljfoAHXGnCpTcOQlB/_middlewareManifest.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { + url: '/_next/static/vd80ljfoAHXGnCpTcOQlB/_ssgManifest.js', + revision: 'vd80ljfoAHXGnCpTcOQlB', + }, + { url: '/favicon.ico', revision: '6c829833bba5b3f978aa32d3238e5446' }, + { + url: '/icons/static/article/action-record.svg', + revision: '0061bcebaaea1b000faa2ef4522a4a75', + }, + { + url: '/icons/static/article/author_upvoted.svg', + revision: 'ce67b7732968c075cbb15098ce7db24b', + }, + { + url: '/icons/static/article/cc-by.svg', + revision: 'b313acbeb491b79a333612a418cb4e39', + }, + { + url: '/icons/static/article/cc-nc.svg', + revision: '568210cddfcde33480b8fef61a330eff', + }, + { + url: '/icons/static/article/cc-nd.svg', + revision: '35a014b0a81af4c36d3e045a1fe6435e', + }, + { + url: '/icons/static/article/cc-raw.svg', + revision: '3f6df74c6d4fecde72cb37fcc82b8162', + }, + { + url: '/icons/static/article/cc.svg', + revision: '104e8188c29afd52e1a312ce1586ab4c', + }, + { + url: '/icons/static/article/clipboard.svg', + revision: '40c40b6b9c1440b6616135aca0011701', + }, + { + url: '/icons/static/article/collect-bookmark.svg', + revision: '9fdddf2b89f9e9905cbbb28a6e2439bd', + }, + { + url: '/icons/static/article/collect-modeline.svg', + revision: 'b6479f4d14abcc2472822601c0ca2370', + }, + { + url: '/icons/static/article/collect-solid-modeline.svg', + revision: '3291f21fff37e3f4016ea5fe1bc72313', + }, + { + url: '/icons/static/article/collect-solid.svg', + revision: 'e65e7253b6408710bd78520c0ce4d1f9', + }, + { + url: '/icons/static/article/collect.svg', + revision: 'c00ad4b9b978dd6bbad12e28b2f52bdc', + }, + { + url: '/icons/static/article/comment-modeline.svg', + revision: '775a5b6fee08408142719e396c0ff57e', + }, + { + url: '/icons/static/article/comment-reply-mode.svg', + revision: 'ef1be73a9a7ecc6330ad68099fdfcbd7', + }, + { + url: '/icons/static/article/comment-timeline-mode.svg', + revision: '4bf411ade13fbad7d424e5c19ab2ba30', + }, + { + url: '/icons/static/article/comment.svg', + revision: 'f644926b59d6d792ad53ff47a0e59824', + }, + { + url: '/icons/static/article/copyright-approve.svg', + revision: '9830b69c2b814ebf1c7cec0342805835', + }, + { + url: '/icons/static/article/copyright-forbid.svg', + revision: 'b4956dc24649f4b5482e0d8495da407a', + }, + { + url: '/icons/static/article/copyright-printer.svg', + revision: '23f7fece204fb0d94d400bd4fa482f9b', + }, + { + url: '/icons/static/article/copyright.svg', + revision: 'd0143a7db1927bb496f0d63d879e6bab', + }, + { + url: '/icons/static/article/export.svg', + revision: 'f7591732b05f2f06fd8044838b6e32f7', + }, + { + url: '/icons/static/article/heart-solid.svg', + revision: '963c62d2102eb7f740bb2aeeb5c66b31', + }, + { + url: '/icons/static/article/heart.svg', + revision: '75eb8fb10a966b5ff56b25511dd3e4d4', + }, + { + url: '/icons/static/article/import.svg', + revision: '3688281b829c70f00ada712075b3eac9', + }, + { + url: '/icons/static/article/notify-off.svg', + revision: '49f8dca5cf7ce68fecb8f8562436b1dd', + }, + { + url: '/icons/static/article/notify-on.svg', + revision: '26bb0ae09bac4eb6fa68ee2f0430d60e', + }, + { + url: '/icons/static/article/outline.svg', + revision: '2fa3d93b70d158f136d97d42bc856701', + }, + { + url: '/icons/static/article/reference-action.svg', + revision: 'ff8857931affc8da2201904853405f5d', + }, + { + url: '/icons/static/article/reference.svg', + revision: 'a95939879b55c2af36e55d9a8fbf7d95', + }, + { + url: '/icons/static/article/reply.svg', + revision: '825b54c41bd7001ce6a0124249ce4def', + }, + { + url: '/icons/static/article/report-solid.svg', + revision: '04317ddd1ec361f04a5e6e315d84b711', + }, + { + url: '/icons/static/article/report.svg', + revision: '8da570574cbde7dca64545d117361c47', + }, + { + url: '/icons/static/article/share-solid.svg', + revision: '544b7e9d7d5c94036073cfda8d53ab6c', + }, + { + url: '/icons/static/article/share.svg', + revision: '6d5d655826eb60d808b99b3da7fa71ba', + }, + { + url: '/icons/static/article/tag.svg', + revision: 'f09ef335fbe73799fa285cd9d69d291e', + }, + { + url: '/icons/static/article/unpin.svg', + revision: '050eeae22a3f05430f00b72c54f70482', + }, + { + url: '/icons/static/article/viewed.svg', + revision: '5efabfdd5c77e67fd71fc71e88235611', + }, + { + url: '/icons/static/article/wing.svg', + revision: 'e4405aa6a7494f916363a54a1261407c', + }, + { + url: '/icons/static/discover.svg', + revision: 'e6c6bec3deb11ae28d97639e828dfb8c', + }, + { + url: '/icons/static/edit/publish-pen.svg', + revision: 'c66b3dad5752a976ce406268fd0a22c6', + }, + { + url: '/icons/static/edit/publish-rocket.svg', + revision: '5382872caf7178041f658b30365e73b3', + }, + { + url: '/icons/static/edit/publish-typewriter-solid.svg', + revision: '2df54f08481892cf828229435389b78b', + }, + { + url: '/icons/static/edit/publish-typewriter.svg', + revision: '5408823feef35de8da886f7ed3066c52', + }, + { + url: '/icons/static/edit/publish-write.svg', + revision: 'ffea982e3356a22bb45031ba2442b91e', + }, + { + url: '/icons/static/emotion/alien-fill.svg', + revision: '8ddd72e4c8efe55e3c29fa0ef814a791', + }, + { + url: '/icons/static/emotion/beer.png', + revision: 'b3b2e67cefc6d8070fd35585cdbb02c7', + }, + { + url: '/icons/static/emotion/biceps.png', + revision: '2717083cb41fc015d966ea081aae9f21', + }, + { + url: '/icons/static/emotion/confused.png', + revision: '08efcd920b925b49ce8be2c025743d9a', + }, + { + url: '/icons/static/emotion/downvote.png', + revision: '0c277657a48ac0a51d7e9e7f7bb4e1ef', + }, + { + url: '/icons/static/emotion/emotion.svg', + revision: 'b6b2fe70e205cc84c4a16fd1b96a392b', + }, + { + url: '/icons/static/emotion/heart.png', + revision: 'd881b7fa7626554bba4553db9c472a6c', + }, + { + url: '/icons/static/emotion/pao.png', + revision: '8353855e71f6947bfa80e773e948cf6b', + }, + { + url: '/icons/static/emotion/pill.png', + revision: '931bf25bc5710a093a6ffb2d90e15bd1', + }, + { + url: '/icons/static/emotion/popcorn.png', + revision: '2da5a48f41b051c07ffb44cb4babccf5', + }, + { + url: '/icons/static/emotion/tada.png', + revision: 'bdb5d644803232537c5955e517bdf8d1', + }, + { + url: '/icons/static/filter.svg', + revision: 'be12b41b19b2a1a6b9dbb8af031f6516', + }, + { + url: '/icons/static/hash-solid.svg', + revision: '3186885f0a95417df4515e994dd8495c', + }, + { + url: '/icons/static/help.svg', + revision: '9e42d2d4e1887bd372fa61446ef0c22c', + }, + { + url: '/icons/static/magic-stick.svg', + revision: 'e6646841fc27781bcb7afa2359d3317e', + }, + { + url: '/icons/static/menu/Q-A.svg', + revision: 'b546afd7df1086f7927c822a39293454', + }, + { + url: '/icons/static/menu/chart.svg', + revision: 'a2d3646747741db4f98a038a49e1fc25', + }, + { + url: '/icons/static/menu/ear.svg', + revision: 'a1c55a34ba30089a40d767cf579d4c98', + }, + { + url: '/icons/static/menu/feedback.svg', + revision: 'e7e4f05917724b47c67fd970f6b70684', + }, + { + url: '/icons/static/menu/github.svg', + revision: 'c3cb6a0411d1278a6da2ffd46a37cbf1', + }, + { + url: '/icons/static/menu/hot.svg', + revision: 'de972ccc9acc1d14e2f4eec1f37c8225', + }, + { + url: '/icons/static/menu/makers.svg', + revision: 'b839ff4b30993c9f22e8e4da2a6a7979', + }, + { + url: '/icons/static/menu/shop.svg', + revision: '52bd52db70daba15e976c5265b05949d', + }, + { + url: '/icons/static/menu/snippets.svg', + revision: '983910973da10e20b698937bee8659c0', + }, + { + url: '/icons/static/menu/sponsor.svg', + revision: '11cd4a305ac40d681561a4fda7e057b5', + }, + { + url: '/icons/static/menu/subscribe.svg', + revision: '043b1f181fd271d6f1a4c29ed55c4437', + }, + { + url: '/icons/static/menu/trending.svg', + revision: '18e30183dd67e5d2fc9a73a1acd72c95', + }, + { + url: '/icons/static/menu/vip.svg', + revision: 'bdc7b84399677c441a88c23316061d7a', + }, + { + url: '/icons/static/pulse.svg', + revision: 'e538cb726692d80736e71cc3826cf0b1', + }, + { + url: '/icons/static/radio-checked.svg', + revision: '9ee129c83efe212d249aec35702d7baa', + }, + { + url: '/icons/static/route/cool-guide.svg', + revision: '2fb0e324aa6cd8c63e26645a383941ac', + }, + { + url: '/icons/static/route/cup.svg', + revision: 'b4bdd436ec65f2db2d41f1775f479d78', + }, + { + url: '/icons/static/route/job.svg', + revision: '03949eb12a0f1b65cc6e1d0567babdb0', + }, + { + url: '/icons/static/route/job_cn.svg', + revision: '3d1caca6ea6328f94226f686f22f38c1', + }, + { + url: '/icons/static/route/light.svg', + revision: '641ecb0dc31182afff0b710c7e94fd6e', + }, + { + url: '/icons/static/route/meetup.svg', + revision: 'ebcee7b486ac7565d6d477bac61e2a60', + }, + { + url: '/icons/static/search.svg', + revision: '01e1a7f7eae140a562fdfae97f84eb7f', + }, + { + url: '/icons/static/shape/about.svg', + revision: '83dc0acb6bed4e64688ae4c77a020cfe', + }, + { + url: '/icons/static/shape/activity.svg', + revision: '003862360f7af9329d243588ec32ce9f', + }, + { + url: '/icons/static/shape/add-square.svg', + revision: '4cab4e3edb8eb1d89eb5d6b7681789e8', + }, + { + url: '/icons/static/shape/add.svg', + revision: '90a91a799449f6cc15ce9bdd64f757ad', + }, + { + url: '/icons/static/shape/air-balloon.svg', + revision: '8df316fd9ffa6bc7fc2c26b0f31c2dfd', + }, + { + url: '/icons/static/shape/android.svg', + revision: 'fcc156e5f127848a3efcf86ac4c24a66', + }, + { + url: '/icons/static/shape/apple.svg', + revision: '119daf4b6a59f8352f3da9cf0d98b802', + }, + { + url: '/icons/static/shape/arrow-circle.svg', + revision: '9947650131b1cc9c1d6b104bbb04b317', + }, + { + url: '/icons/static/shape/arrow-simple.svg', + revision: '0e93d9cbbf0d0eb679f5ea5f7d0707ba', + }, + { + url: '/icons/static/shape/arrow-solid.svg', + revision: 'e93ca59e804dafd71387ff1ccd5bbb48', + }, + { + url: '/icons/static/shape/arrow.svg', + revision: '14c7e2dbc17f48f58361729d0ba90704', + }, + { + url: '/icons/static/shape/candy.svg', + revision: 'd33f3558519d4727e194d1e902bf8ba7', + }, + { + url: '/icons/static/shape/checked.svg', + revision: '1980041ef90ddfdfc198331f93ca779d', + }, + { + url: '/icons/static/shape/close-circle.svg', + revision: '6ca0a1d2ab80d19cdaf8d0d7af247ccc', + }, + { + url: '/icons/static/shape/close.svg', + revision: '37e344400b4fc30332fdecb8ada2faf5', + }, + { + url: '/icons/static/shape/crown.svg', + revision: '8ebb82d1c19295fc27d6194b2d40959e', + }, + { + url: '/icons/static/shape/curly-arrow.svg', + revision: '1b509c114a51291f0b626ebc68b52969', + }, + { + url: '/icons/static/shape/delete-solid.svg', + revision: '5781616495a4fb3ab240242418558aea', + }, + { + url: '/icons/static/shape/delete.svg', + revision: '102ea5efe5db79caaec25426e3b2693f', + }, + { + url: '/icons/static/shape/double-arrow.svg', + revision: '05d0a081e20ecb0476bd94712d16fe55', + }, + { + url: '/icons/static/shape/ear.svg', + revision: '03dc348eec8b0390ddaaaa54373a17b2', + }, + { + url: '/icons/static/shape/expand-all.svg', + revision: '47d2f09cd3bd17fb705efd8b191f2020', + }, + { + url: '/icons/static/shape/feedback.svg', + revision: 'e7e4f05917724b47c67fd970f6b70684', + }, + { + url: '/icons/static/shape/fold-all.svg', + revision: '889756027df1291e25278b035f89c955', + }, + { + url: '/icons/static/shape/girl-mark.svg', + revision: 'deb9ce2d90c202cc2cecb3b35de907c2', + }, + { + url: '/icons/static/shape/grow-up.svg', + revision: 'dba80deb4e1a5764e3db8010d7ad49ad', + }, + { + url: '/icons/static/shape/handshake.svg', + revision: 'a4d945223f235649cce03eaa0500e990', + }, + { + url: '/icons/static/shape/home.svg', + revision: 'd3f7b7b78f0ddb2892318d0284ff25d7', + }, + { + url: '/icons/static/shape/image.svg', + revision: '8ed0760627704c450492354bdea91e51', + }, + { + url: '/icons/static/shape/link-hint.svg', + revision: 'ae3e480617386d5117108967a98431cb', + }, + { + url: '/icons/static/shape/link-outside.svg', + revision: 'c244d201a922c0c8d723b5fa5a4299a1', + }, + { + url: '/icons/static/shape/link.svg', + revision: '50f9a22dfc9b9187f30cf14b3f11715c', + }, + { + url: '/icons/static/shape/locate-solid.svg', + revision: '4d0a5ca6b4c811b54e420c468dc67acb', + }, + { + url: '/icons/static/shape/locate.svg', + revision: '37eb2555f6d4de262117b07d390678cf', + }, + { + url: '/icons/static/shape/lock.svg', + revision: '88febf14c531b7508b97f328099665a5', + }, + { + url: '/icons/static/shape/menu-closed.svg', + revision: '576c9ad0302b0de71afb0a4eaa2b8ee3', + }, + { + url: '/icons/static/shape/menu-opened.svg', + revision: '9ce4cf9615fb80e60f5c9265b51ff695', + }, + { + url: '/icons/static/shape/more-3.svg', + revision: '626b6d567993585aa2e5034603dd01c5', + }, + { + url: '/icons/static/shape/more-box.svg', + revision: '8e1fc1567edfa31074b3c240b05af318', + }, + { + url: '/icons/static/shape/more-l.svg', + revision: 'eb263be2d73fbe2841e0fb80e0ea38ee', + }, + { + url: '/icons/static/shape/more.svg', + revision: '245f34418adec1581c5db3f8223f442f', + }, + { + url: '/icons/static/shape/navi-back.svg', + revision: 'f7735265330186d7df8c532031beebfe', + }, + { + url: '/icons/static/shape/next-article-solid.svg', + revision: '5458b89c14eeffb0eab1707d4a33ece5', + }, + { + url: '/icons/static/shape/next-article.svg', + revision: 'e25a3ff85d3af5834fc17f8fa4f92a10', + }, + { + url: '/icons/static/shape/planet.svg', + revision: '6421ee5470917d7189e27f957c543996', + }, + { + url: '/icons/static/shape/plus.svg', + revision: '4dc296e3fd14ec6166c9f95fe1db0960', + }, + { + url: '/icons/static/shape/previous-article-solid.svg', + revision: 'cf85b3e182bbef9c89b4f530ca419719', + }, + { + url: '/icons/static/shape/previous-article.svg', + revision: '939533d288d2ea63b33ab3160fea261e', + }, + { + url: '/icons/static/shape/question.svg', + revision: 'e8e204dc7c7525257d321eaab6166507', + }, + { + url: '/icons/static/shape/quote.svg', + revision: '737545bd27e91243985978f3e0f8b331', + }, + { + url: '/icons/static/shape/reset.svg', + revision: 'd47568d1d092bf423f854f4c60f19c31', + }, + { + url: '/icons/static/shape/setting.svg', + revision: 'ba4a2277d4cf655b2be0c80b5974f409', + }, + { + url: '/icons/static/shape/settings.svg', + revision: 'a838ac169451582fc0fbc5961e23920b', + }, + { + url: '/icons/static/shape/star.svg', + revision: '4e8ad3ba1985012effb0d72574f1db85', + }, + { + url: '/icons/static/shape/t.svg', + revision: 'baf8257cd1c1aae44783fcfc32dc4faa', + }, + { + url: '/icons/static/shape/tail.svg', + revision: '11ba168e7402d94e5bede5b28b0041e8', + }, + { + url: '/icons/static/shape/upvote-ship.svg', + revision: 'c36f001d22b9115a7c13b713508d292f', + }, + { + url: '/icons/static/shape/video.svg', + revision: '012a17726cb1f34bb06ae803ea45d09e', + }, + { + url: '/icons/static/shape/vote-up-solid.svg', + revision: '39c00aaa29cebcbe036a920cb82c6b14', + }, + { + url: '/icons/static/shape/vote-up.svg', + revision: 'b7ffefb246fdf5193372329dfc30196e', + }, + { + url: '/icons/static/shape/warning.svg', + revision: 'b44ce1763b979b6c239b8ddedb480ac9', + }, + { + url: '/icons/static/sidebar-menu.svg', + revision: '355dec45f9629e1ed6b95a75cb94a659', + }, + { + url: '/icons/static/social/QQ-share.png', + revision: '59a67f20167d81a223f62bf2e14e15b0', + }, + { + url: '/icons/static/social/douban-share.png', + revision: '1b1498eb5dc5e8ee7c151453d3cebc59', + }, + { + url: '/icons/static/social/douban.svg', + revision: 'de212dedd707ff0b7ca20fe99ef6c7fe', + }, + { + url: '/icons/static/social/dribble.svg', + revision: 'c53459401aad2474907896e86eaf71ad', + }, + { + url: '/icons/static/social/embed-share.svg', + revision: '543275f6315330c6df5306300a5d3c5e', + }, + { + url: '/icons/static/social/facebook-share.png', + revision: '4edebe50e0322d9c9a18ae9545ca6eaf', + }, + { + url: '/icons/static/social/facebook.svg', + revision: '7e4af5e40622193cc6a3c32d39bffcfc', + }, + { + url: '/icons/static/social/github.svg', + revision: 'c434405c78e6225788c827e1dadee553', + }, + { + url: '/icons/static/social/global.svg', + revision: '62fa645b1d9e31d1a9b3396f7b718a55', + }, + { + url: '/icons/static/social/huaban.svg', + revision: '3c3a0da4f543e98f058618a48f971e24', + }, + { + url: '/icons/static/social/instagram.svg', + revision: 'aece0673a21466fcf6e4a57de1b716a5', + }, + { + url: '/icons/static/social/mail-share.svg', + revision: 'c0b35742f9d781f6a7495f039f189341', + }, + { + url: '/icons/static/social/pinterest.svg', + revision: 'eea97e769792c88d36f6b516f8ea533f', + }, + { + url: '/icons/static/social/qq.svg', + revision: '2d1e48ee9028ed880563eb20ca8eb8eb', + }, + { + url: '/icons/static/social/reddit-share.png', + revision: 'f062fad2fbb0e11e82eb988d2b0647d1', + }, + { + url: '/icons/static/social/telegram-share.png', + revision: '14b57710e67ea540031cdb9bb3779ff0', + }, + { + url: '/icons/static/social/twitter-share.png', + revision: 'a4dfaf020789cbf745fa5c916e3a107e', + }, + { + url: '/icons/static/social/twitter.svg', + revision: 'f69f02db84fc54afc8d81252868064a3', + }, + { + url: '/icons/static/social/wechat-share.png', + revision: 'ed8153ce8ecaf423e3a3a0574b07447c', + }, + { + url: '/icons/static/social/wechat-solid.svg', + revision: 'd2c81117fab15eacfac0ce774604a78d', + }, + { + url: '/icons/static/social/wechat.svg', + revision: '43800ee53bcd256cc35e557a61120a58', + }, + { + url: '/icons/static/social/weibo-share.png', + revision: 'a1afa755e41c873dd9cdcb6f634f24a2', + }, + { + url: '/icons/static/social/weibo.svg', + revision: '8e6c08c4858d7ec830b0a3bba60f33ab', + }, + { + url: '/icons/static/social/weichat.svg', + revision: 'c88a34ee98d0dc6ba6f94e4712c91b77', + }, + { + url: '/icons/static/social/zhihu-share.jpeg', + revision: '821c8ec15e665dafbc17ad549d62727c', + }, + { + url: '/icons/static/social/zhihu.svg', + revision: '13ee0b45c8e3f2f2ea1b96243671dae3', + }, + { + url: '/icons/static/subscribe/email-box.svg', + revision: '2acfa4446f5946591cbdb0c6a8be9f6e', + }, + { + url: '/icons/static/subscribe/email-envelope.svg', + revision: '6c184ace64bda3a6c47133fa2f5431b8', + }, + { + url: '/icons/static/subscribe/email-solid.svg', + revision: '58a06b45de32344c09b3d4a692684f51', + }, + { + url: '/icons/static/user/account-circle.svg', + revision: '4c3eec2ae947b3e704e401f70940be30', + }, + { + url: '/icons/static/user/account-solid.svg', + revision: '9da3b27ba50b233afdc38b17a4ec9e57', + }, + { + url: '/locales/en/community.json', + revision: 'fcef9fd2384c8df138834d65c85bae81', + }, + { + url: '/locales/en/general.json', + revision: 'c390ea6b0b40bdb31d82c7a7df1b72bd', + }, + { + url: '/locales/zh/community.json', + revision: 'a1e064e2eb5628ee9b577fb0b9095dd7', + }, + { + url: '/locales/zh/general.json', + revision: 'fdbd431ab9ea8081a57c21f7ba366ac6', + }, + { url: '/manifest.json', revision: '65d23d030fde6701c68a7ce16e4f4d9b' }, + { + url: '/pwa/icon-192x192.png', + revision: '447307e81adae9ce540e494017f6bf0d', + }, + { + url: '/pwa/icon-256x256.png', + revision: 'f72dee92c556f06f2b346387b0a7167b', + }, + { + url: '/pwa/icon-384x384.png', + revision: '0732fd99eb097789a1ec71bfe74fcc72', + }, + { + url: '/pwa/icon-512x512.png', + revision: '3a46f658d8bb2b9d25560ff81bffebc8', + }, + { url: '/robots.txt', revision: 'a5de38b53b1c44d347ea64eae556d549' }, + { url: '/sitemap.xml', revision: '4e19eb32cee1f2359899f74e2f7f08d5' }, + ], + { ignoreURLParametersMatching: [] }, + ), + s.cleanupOutdatedCaches(), + s.registerRoute( + '/', + new s.NetworkFirst({ + cacheName: 'start-url', + plugins: [ + { + cacheWillUpdate: async ({ + request: s, + response: c, + event: e, + state: i, + }) => + c && 'opaqueredirect' === c.type + ? new Response(c.body, { + status: 200, + statusText: 'OK', + headers: c.headers, + }) + : c, + }, + ], + }), + 'GET', + ), + s.registerRoute( + /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i, + new s.CacheFirst({ + cacheName: 'google-fonts-webfonts', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 31536e3 }), + ], + }), + 'GET', + ), + s.registerRoute( + /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i, + new s.StaleWhileRevalidate({ + cacheName: 'google-fonts-stylesheets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, + new s.StaleWhileRevalidate({ + cacheName: 'static-font-assets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, + new s.StaleWhileRevalidate({ + cacheName: 'static-image-assets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\/_next\/image\?url=.+$/i, + new s.StaleWhileRevalidate({ + cacheName: 'next-image', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:mp3|wav|ogg)$/i, + new s.CacheFirst({ + cacheName: 'static-audio-assets', + plugins: [ + new s.RangeRequestsPlugin(), + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:mp4)$/i, + new s.CacheFirst({ + cacheName: 'static-video-assets', + plugins: [ + new s.RangeRequestsPlugin(), + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:js)$/i, + new s.StaleWhileRevalidate({ + cacheName: 'static-js-assets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:css|less)$/i, + new s.StaleWhileRevalidate({ + cacheName: 'static-style-assets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\/_next\/data\/.+\/.+\.json$/i, + new s.StaleWhileRevalidate({ + cacheName: 'next-data', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + /\.(?:json|xml|csv)$/i, + new s.NetworkFirst({ + cacheName: 'static-data-assets', + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + ({ url: s }) => { + if (!(self.origin === s.origin)) return !1 + const c = s.pathname + return !c.startsWith('/api/auth/') && !!c.startsWith('/api/') + }, + new s.NetworkFirst({ + cacheName: 'apis', + networkTimeoutSeconds: 10, + plugins: [ + new s.ExpirationPlugin({ maxEntries: 16, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + ({ url: s }) => { + if (!(self.origin === s.origin)) return !1 + return !s.pathname.startsWith('/api/') + }, + new s.NetworkFirst({ + cacheName: 'others', + networkTimeoutSeconds: 10, + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 }), + ], + }), + 'GET', + ), + s.registerRoute( + ({ url: s }) => !(self.origin === s.origin), + new s.NetworkFirst({ + cacheName: 'cross-origin', + networkTimeoutSeconds: 10, + plugins: [ + new s.ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 3600 }), + ], + }), + 'GET', + ) +}) +//# sourceMappingURL=sw.js.map diff --git a/public/sw.js.map b/public/sw.js.map new file mode 100644 index 000000000..98ad80d85 --- /dev/null +++ b/public/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sources":["../../../../../private/tmp/e90b67629bdd758445ce920bcaa907b3/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {StaleWhileRevalidate as workbox_strategies_StaleWhileRevalidate} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-strategies/StaleWhileRevalidate.mjs';\nimport {RangeRequestsPlugin as workbox_range_requests_RangeRequestsPlugin} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-range-requests/RangeRequestsPlugin.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Users/xieyiming/code/coderplanets/coderplanets_web/node_modules/next-pwa/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/_next/static/chunks/1033-dc1b539f926662fd.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1033-dc1b539f926662fd.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1036-897d43d159fd9b9c.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1036-897d43d159fd9b9c.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1114.24d7a261b9cba3d1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1114.24d7a261b9cba3d1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1187.330ea57bc7cfe628.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1187.330ea57bc7cfe628.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1308.7f25ec3876b24f79.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1308.7f25ec3876b24f79.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1338.3e521f7b2b8605f5.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1338.3e521f7b2b8605f5.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1483.0b4a0d9b479b0b49.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1483.0b4a0d9b479b0b49.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1496-223172df7f352456.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1496-223172df7f352456.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1550.a87c146b74b1344e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1550.a87c146b74b1344e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1563.7b7ec83b00effa03.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1563.7b7ec83b00effa03.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/17-72e32ec7a9c9bbf1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/17-72e32ec7a9c9bbf1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1704.f5cc76fa86bce497.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1704.f5cc76fa86bce497.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1783.bcf06af93db68081.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1783.bcf06af93db68081.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1914.6a92b9f9472c85af.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/1914.6a92b9f9472c85af.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/217.eb69dae0828ec787.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/217.eb69dae0828ec787.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2225.a2e2bac61047049a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2225.a2e2bac61047049a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2265.8b128e14ce38ad76.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2265.8b128e14ce38ad76.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2309.f317edcd5a762bcc.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2309.f317edcd5a762bcc.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2380-22647488defcbcdc.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2380-22647488defcbcdc.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/240-3b2cb9820094d3c2.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/240-3b2cb9820094d3c2.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2415.9b601e35731bf917.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2415.9b601e35731bf917.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2435.b3e3b0347fa84f58.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2435.b3e3b0347fa84f58.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2467.5c719b97bde88637.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2467.5c719b97bde88637.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2555.50891edf74e3a845.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2555.50891edf74e3a845.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2562.4c4ca59d23e54817.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2562.4c4ca59d23e54817.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2679-b8078f8929e08b3d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2679-b8078f8929e08b3d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2705.63c9477d1495b9ff.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2705.63c9477d1495b9ff.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2823.405fb06c5f50a71a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2823.405fb06c5f50a71a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2872.7a49327a03617070.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2872.7a49327a03617070.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2933.37eb95d2f3bbed28.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/2933.37eb95d2f3bbed28.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/299.3baad4d044f6571f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/299.3baad4d044f6571f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/303bb2b0.7cbe7be7a6462f1a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/303bb2b0.7cbe7be7a6462f1a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3159.460423fa14e863e0.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3159.460423fa14e863e0.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3178-88f3cc4ae13fe005.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3178-88f3cc4ae13fe005.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3282.e305b8ba5d1ade37.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3282.e305b8ba5d1ade37.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3365.7908e30687f069be.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3365.7908e30687f069be.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3415-4ca60958406bc056.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3415-4ca60958406bc056.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3531.8fefdac701d2bd91.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3531.8fefdac701d2bd91.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3548.17da4b5fbd23891a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3548.17da4b5fbd23891a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/362.e4e6d53660aff266.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/362.e4e6d53660aff266.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3663-1d285ca9cb5883a1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3663-1d285ca9cb5883a1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3824-0bae6d320d70610f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3824-0bae6d320d70610f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3897-ca28d134ff66ba94.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3897-ca28d134ff66ba94.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3924.b62204d654f76de9.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3924.b62204d654f76de9.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3935-7b3c1fa4e27243e1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3935-7b3c1fa4e27243e1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3958.fbfd9ce2d56a90df.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3958.fbfd9ce2d56a90df.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3981.0fc7fb65e07d5e91.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/3981.0fc7fb65e07d5e91.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/445.c79bcc9bec9ec56e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/445.c79bcc9bec9ec56e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4461-fe40709661f31898.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4461-fe40709661f31898.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4470.3c9dc1d8603c717c.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4470.3c9dc1d8603c717c.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4483.63bf2ced5a5c89c1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4483.63bf2ced5a5c89c1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4486-f14199c193b5a5a3.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4486-f14199c193b5a5a3.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4517-5e7961494ee42971.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4517-5e7961494ee42971.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/470-ff9a077ad4f4b5b9.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/470-ff9a077ad4f4b5b9.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.af86047fe1ae854d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.af86047fe1ae854d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4c4ba9aa-cd085826f29c5c37.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4c4ba9aa-cd085826f29c5c37.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4efdadb3.ace932300e0c9963.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/4efdadb3.ace932300e0c9963.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5024-d19b1b1396fd1b46.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5024-d19b1b1396fd1b46.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5032-e49bce4db5bf444b.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5032-e49bce4db5bf444b.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5206.594a490e5b4e8e59.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5206.594a490e5b4e8e59.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/522-82948a5d28ffaa76.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/522-82948a5d28ffaa76.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5307.68db0eafdccc72f6.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5307.68db0eafdccc72f6.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5436.d678f5b79f21f13b.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5436.d678f5b79f21f13b.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5440.51ee62faad8fd537.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5440.51ee62faad8fd537.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/551.8187d26b301ca287.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/551.8187d26b301ca287.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5568.8b6c41adc63fb887.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5568.8b6c41adc63fb887.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5600.5aa64f628342aa93.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5600.5aa64f628342aa93.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5642-bfe8e4fa0c8cac2f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5642-bfe8e4fa0c8cac2f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5734-09a25f677746e5c3.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5734-09a25f677746e5c3.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5808-8378cb38fd572740.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5808-8378cb38fd572740.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5839.74f92656227ae788.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5839.74f92656227ae788.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5845.84796b87ac2aa056.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5845.84796b87ac2aa056.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5891-06c1cbb667e0cef9.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5891-06c1cbb667e0cef9.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5898.7b0d693300c52231.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5898.7b0d693300c52231.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5912.75f8f0d911ca3e0e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/5912.75f8f0d911ca3e0e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6122.b9a68564dfe4961b.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6122.b9a68564dfe4961b.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6135.b98cd5d800a57d22.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6135.b98cd5d800a57d22.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6155.4efabe6dcfa0a43c.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6155.4efabe6dcfa0a43c.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6164.fa8a2ea45144faca.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6164.fa8a2ea45144faca.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6182.05a19be5feeaa4d1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6182.05a19be5feeaa4d1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6215.6c1972e49cf37dbd.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6215.6c1972e49cf37dbd.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6226-3786d3c01f9da72a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6226-3786d3c01f9da72a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6329-860c3898694751ee.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6329-860c3898694751ee.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/632cba62-ad69bed0a4b35062.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/632cba62-ad69bed0a4b35062.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6640-098c018fdcaf0c27.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6640-098c018fdcaf0c27.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6697.5e7343d9f0c7916f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6697.5e7343d9f0c7916f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6864.7527d3991c20d979.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6864.7527d3991c20d979.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6898.6ed9c6db1707e410.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6898.6ed9c6db1707e410.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6925.07e575fd3c59f240.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6925.07e575fd3c59f240.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/69364278-f61b0d9425e1bf0e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/69364278-f61b0d9425e1bf0e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/697-09e6733e2bc53700.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/697-09e6733e2bc53700.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6999.5475f66e0c765fb7.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/6999.5475f66e0c765fb7.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7066.ee5ac458473a5258.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7066.ee5ac458473a5258.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7073.1de2c13d2130bb62.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7073.1de2c13d2130bb62.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7266.dad2e0a11dab8ed3.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7266.dad2e0a11dab8ed3.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7441-4c132af1a8a6e202.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7441-4c132af1a8a6e202.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7474.57f8b8b0bae99556.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7474.57f8b8b0bae99556.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7497.0d35355db805190a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7497.0d35355db805190a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7689-ec6a91113c3ec50d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7689-ec6a91113c3ec50d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7863.dba773eed3a7a1fb.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7863.dba773eed3a7a1fb.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7936-53e2bc62b4781078.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/7936-53e2bc62b4781078.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8203-17775f40f0a7bbe5.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8203-17775f40f0a7bbe5.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8246-dd5df68eb4164d43.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8246-dd5df68eb4164d43.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8446.d594c31c7dafe7bc.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8446.d594c31c7dafe7bc.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8673.73e07022c15af553.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8673.73e07022c15af553.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8691.ff8538373e827399.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8691.ff8538373e827399.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8832.19d316f46f064b55.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8832.19d316f46f064b55.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8846.8635d177830b6e67.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/8846.8635d177830b6e67.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9221.986323eb2fc3cd13.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9221.986323eb2fc3cd13.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9352.933be5f9b1b19819.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9352.933be5f9b1b19819.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9361-89f2f5b9adfd1870.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9361-89f2f5b9adfd1870.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9379-2f9f8041f6d22849.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9379-2f9f8041f6d22849.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9406.c5d5bf3a5a78f59c.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9406.c5d5bf3a5a78f59c.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9421.b93099e8d791c726.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9421.b93099e8d791c726.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9454.12cacb7f1c9972ff.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9454.12cacb7f1c9972ff.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9476.a5f23656a1d77543.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9476.a5f23656a1d77543.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9501-9b1113677ae8a3cd.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9501-9b1113677ae8a3cd.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9512-49785760c3d84cf6.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9512-49785760c3d84cf6.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9575.6f351b2baca9d09f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9575.6f351b2baca9d09f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9633-627d91c5b4aa8b6d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9633-627d91c5b4aa8b6d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9635.ebaa35723fb3414e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9635.ebaa35723fb3414e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9651.c50399052fc5579a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9651.c50399052fc5579a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9734-ebd2d6a72248903c.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9734-ebd2d6a72248903c.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/981-082a3a4eda472f89.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/981-082a3a4eda472f89.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9841.3e661c8e8e6bc7d5.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9841.3e661c8e8e6bc7d5.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9931.b460a4b8f566dd0d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/9931.b460a4b8f566dd0d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/commons-15b46957d7862dd1.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/commons-15b46957d7862dd1.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/e7de538c.5bf40d57c671b14b.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/e7de538c.5bf40d57c671b14b.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/e82996df-fa04a266adb84a81.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/e82996df-fa04a266adb84a81.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-5575b00731a3df2f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-5575b00731a3df2f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/main-ca95c100022268cc.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/main-ca95c100022268cc.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/%5Bcommunity%5D-c84ae5a8fe49b7b9.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/%5Bcommunity%5D-c84ae5a8fe49b7b9.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/%5Bcommunity%5D/%5Bthread%5D-f5d1defa062c78a8.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/%5Bcommunity%5D/%5Bthread%5D-f5d1defa062c78a8.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-90b68d1b21af42cc.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-90b68d1b21af42cc.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-39d310b7def2c960.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-39d310b7def2c960.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/apply/community-f998720d482f91f8.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/apply/community-f998720d482f91f8.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/blog/%5Bid%5D-f763cfc8ff698ed9.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/blog/%5Bid%5D-f763cfc8ff698ed9.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/cool-guide-f01f7be25239df21.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/cool-guide-f01f7be25239df21.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/explore-8f946d6a1a4cf580.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/explore-8f946d6a1a4cf580.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/friends-c46cb51bfcbbf789.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/friends-c46cb51bfcbbf789.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/have-a-drink-d29b774329825762.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/have-a-drink-d29b774329825762.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/help-center-07d82f9f067e3bc0.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/help-center-07d82f9f067e3bc0.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-c295364974b80d7b.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-c295364974b80d7b.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/job/%5Bid%5D-4d88e476e0d76207.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/job/%5Bid%5D-4d88e476e0d76207.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/meetups-7695f7e6d35c7602.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/meetups-7695f7e6d35c7602.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/membership-27d9495d80cb04ca.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/membership-27d9495d80cb04ca.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/oauth-58fffbda3c17fb39.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/oauth-58fffbda3c17fb39.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/oops-bf3df6969738eb0a.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/oops-bf3df6969738eb0a.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/plaza-f3577316cca1123d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/plaza-f3577316cca1123d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/post/%5Bid%5D-92fb34c342426041.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/post/%5Bid%5D-92fb34c342426041.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/blog-3ff60f8df631787f.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/blog-3ff60f8df631787f.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/job-ae0b282540ec9e47.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/job-ae0b282540ec9e47.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/post-1cf0fc56771c7849.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/post-1cf0fc56771c7849.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/radar-dcdb71f2c7f450d0.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/radar-dcdb71f2c7f450d0.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/works-357f78751d2298bb.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/publish/works-357f78751d2298bb.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/radar/%5Bid%5D-530a0fc0089c0f09.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/radar/%5Bid%5D-530a0fc0089c0f09.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/recipes-1982f593e605dd96.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/recipes-1982f593e605dd96.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sponsor-2a4a47a159bddc86.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sponsor-2a4a47a159bddc86.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/subscribe-78372b3c797ed0f6.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/subscribe-78372b3c797ed0f6.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/support-us-3c307c68b9b2852d.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/support-us-3c307c68b9b2852d.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/trending-8ae0851eb5c589b7.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/trending-8ae0851eb5c589b7.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/job/%5Bid%5D-a020e26e7be99c89.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/job/%5Bid%5D-a020e26e7be99c89.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/post/%5Bid%5D-cdb91a69d5a3af45.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/post/%5Bid%5D-cdb91a69d5a3af45.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/radar/%5Bid%5D-dfd259964d09c3a8.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/radar/%5Bid%5D-dfd259964d09c3a8.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/rss-0480eb5991240953.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/rss-0480eb5991240953.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/works/%5Bid%5D-bdc49e79be1db8f2.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/update/works/%5Bid%5D-bdc49e79be1db8f2.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/%5Blogin%5D-b7e8b4943b76f935.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/%5Blogin%5D-b7e8b4943b76f935.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/works/%5Bid%5D-094429abbe7001b8.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/works/%5Bid%5D-094429abbe7001b8.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-a40ef1678bae11e696dba45124eadd70.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-f847da185c27b44e.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-f847da185c27b44e.js.map\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/vd80ljfoAHXGnCpTcOQlB/_buildManifest.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/vd80ljfoAHXGnCpTcOQlB/_middlewareManifest.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/_next/static/vd80ljfoAHXGnCpTcOQlB/_ssgManifest.js\",\n \"revision\": \"vd80ljfoAHXGnCpTcOQlB\"\n },\n {\n \"url\": \"/favicon.ico\",\n \"revision\": \"6c829833bba5b3f978aa32d3238e5446\"\n },\n {\n \"url\": \"/icons/static/article/action-record.svg\",\n \"revision\": \"0061bcebaaea1b000faa2ef4522a4a75\"\n },\n {\n \"url\": \"/icons/static/article/author_upvoted.svg\",\n \"revision\": \"ce67b7732968c075cbb15098ce7db24b\"\n },\n {\n \"url\": \"/icons/static/article/cc-by.svg\",\n \"revision\": \"b313acbeb491b79a333612a418cb4e39\"\n },\n {\n \"url\": \"/icons/static/article/cc-nc.svg\",\n \"revision\": \"568210cddfcde33480b8fef61a330eff\"\n },\n {\n \"url\": \"/icons/static/article/cc-nd.svg\",\n \"revision\": \"35a014b0a81af4c36d3e045a1fe6435e\"\n },\n {\n \"url\": \"/icons/static/article/cc-raw.svg\",\n \"revision\": \"3f6df74c6d4fecde72cb37fcc82b8162\"\n },\n {\n \"url\": \"/icons/static/article/cc.svg\",\n \"revision\": \"104e8188c29afd52e1a312ce1586ab4c\"\n },\n {\n \"url\": \"/icons/static/article/clipboard.svg\",\n \"revision\": \"40c40b6b9c1440b6616135aca0011701\"\n },\n {\n \"url\": \"/icons/static/article/collect-bookmark.svg\",\n \"revision\": \"9fdddf2b89f9e9905cbbb28a6e2439bd\"\n },\n {\n \"url\": \"/icons/static/article/collect-modeline.svg\",\n \"revision\": \"b6479f4d14abcc2472822601c0ca2370\"\n },\n {\n \"url\": \"/icons/static/article/collect-solid-modeline.svg\",\n \"revision\": \"3291f21fff37e3f4016ea5fe1bc72313\"\n },\n {\n \"url\": \"/icons/static/article/collect-solid.svg\",\n \"revision\": \"e65e7253b6408710bd78520c0ce4d1f9\"\n },\n {\n \"url\": \"/icons/static/article/collect.svg\",\n \"revision\": \"c00ad4b9b978dd6bbad12e28b2f52bdc\"\n },\n {\n \"url\": \"/icons/static/article/comment-modeline.svg\",\n \"revision\": \"775a5b6fee08408142719e396c0ff57e\"\n },\n {\n \"url\": \"/icons/static/article/comment-reply-mode.svg\",\n \"revision\": \"ef1be73a9a7ecc6330ad68099fdfcbd7\"\n },\n {\n \"url\": \"/icons/static/article/comment-timeline-mode.svg\",\n \"revision\": \"4bf411ade13fbad7d424e5c19ab2ba30\"\n },\n {\n \"url\": \"/icons/static/article/comment.svg\",\n \"revision\": \"f644926b59d6d792ad53ff47a0e59824\"\n },\n {\n \"url\": \"/icons/static/article/copyright-approve.svg\",\n \"revision\": \"9830b69c2b814ebf1c7cec0342805835\"\n },\n {\n \"url\": \"/icons/static/article/copyright-forbid.svg\",\n \"revision\": \"b4956dc24649f4b5482e0d8495da407a\"\n },\n {\n \"url\": \"/icons/static/article/copyright-printer.svg\",\n \"revision\": \"23f7fece204fb0d94d400bd4fa482f9b\"\n },\n {\n \"url\": \"/icons/static/article/copyright.svg\",\n \"revision\": \"d0143a7db1927bb496f0d63d879e6bab\"\n },\n {\n \"url\": \"/icons/static/article/export.svg\",\n \"revision\": \"f7591732b05f2f06fd8044838b6e32f7\"\n },\n {\n \"url\": \"/icons/static/article/heart-solid.svg\",\n \"revision\": \"963c62d2102eb7f740bb2aeeb5c66b31\"\n },\n {\n \"url\": \"/icons/static/article/heart.svg\",\n \"revision\": \"75eb8fb10a966b5ff56b25511dd3e4d4\"\n },\n {\n \"url\": \"/icons/static/article/import.svg\",\n \"revision\": \"3688281b829c70f00ada712075b3eac9\"\n },\n {\n \"url\": \"/icons/static/article/notify-off.svg\",\n \"revision\": \"49f8dca5cf7ce68fecb8f8562436b1dd\"\n },\n {\n \"url\": \"/icons/static/article/notify-on.svg\",\n \"revision\": \"26bb0ae09bac4eb6fa68ee2f0430d60e\"\n },\n {\n \"url\": \"/icons/static/article/outline.svg\",\n \"revision\": \"2fa3d93b70d158f136d97d42bc856701\"\n },\n {\n \"url\": \"/icons/static/article/reference-action.svg\",\n \"revision\": \"ff8857931affc8da2201904853405f5d\"\n },\n {\n \"url\": \"/icons/static/article/reference.svg\",\n \"revision\": \"a95939879b55c2af36e55d9a8fbf7d95\"\n },\n {\n \"url\": \"/icons/static/article/reply.svg\",\n \"revision\": \"825b54c41bd7001ce6a0124249ce4def\"\n },\n {\n \"url\": \"/icons/static/article/report-solid.svg\",\n \"revision\": \"04317ddd1ec361f04a5e6e315d84b711\"\n },\n {\n \"url\": \"/icons/static/article/report.svg\",\n \"revision\": \"8da570574cbde7dca64545d117361c47\"\n },\n {\n \"url\": \"/icons/static/article/share-solid.svg\",\n \"revision\": \"544b7e9d7d5c94036073cfda8d53ab6c\"\n },\n {\n \"url\": \"/icons/static/article/share.svg\",\n \"revision\": \"6d5d655826eb60d808b99b3da7fa71ba\"\n },\n {\n \"url\": \"/icons/static/article/tag.svg\",\n \"revision\": \"f09ef335fbe73799fa285cd9d69d291e\"\n },\n {\n \"url\": \"/icons/static/article/unpin.svg\",\n \"revision\": \"050eeae22a3f05430f00b72c54f70482\"\n },\n {\n \"url\": \"/icons/static/article/viewed.svg\",\n \"revision\": \"5efabfdd5c77e67fd71fc71e88235611\"\n },\n {\n \"url\": \"/icons/static/article/wing.svg\",\n \"revision\": \"e4405aa6a7494f916363a54a1261407c\"\n },\n {\n \"url\": \"/icons/static/discover.svg\",\n \"revision\": \"e6c6bec3deb11ae28d97639e828dfb8c\"\n },\n {\n \"url\": \"/icons/static/edit/publish-pen.svg\",\n \"revision\": \"c66b3dad5752a976ce406268fd0a22c6\"\n },\n {\n \"url\": \"/icons/static/edit/publish-rocket.svg\",\n \"revision\": \"5382872caf7178041f658b30365e73b3\"\n },\n {\n \"url\": \"/icons/static/edit/publish-typewriter-solid.svg\",\n \"revision\": \"2df54f08481892cf828229435389b78b\"\n },\n {\n \"url\": \"/icons/static/edit/publish-typewriter.svg\",\n \"revision\": \"5408823feef35de8da886f7ed3066c52\"\n },\n {\n \"url\": \"/icons/static/edit/publish-write.svg\",\n \"revision\": \"ffea982e3356a22bb45031ba2442b91e\"\n },\n {\n \"url\": \"/icons/static/emotion/alien-fill.svg\",\n \"revision\": \"8ddd72e4c8efe55e3c29fa0ef814a791\"\n },\n {\n \"url\": \"/icons/static/emotion/beer.png\",\n \"revision\": \"b3b2e67cefc6d8070fd35585cdbb02c7\"\n },\n {\n \"url\": \"/icons/static/emotion/biceps.png\",\n \"revision\": \"2717083cb41fc015d966ea081aae9f21\"\n },\n {\n \"url\": \"/icons/static/emotion/confused.png\",\n \"revision\": \"08efcd920b925b49ce8be2c025743d9a\"\n },\n {\n \"url\": \"/icons/static/emotion/downvote.png\",\n \"revision\": \"0c277657a48ac0a51d7e9e7f7bb4e1ef\"\n },\n {\n \"url\": \"/icons/static/emotion/emotion.svg\",\n \"revision\": \"b6b2fe70e205cc84c4a16fd1b96a392b\"\n },\n {\n \"url\": \"/icons/static/emotion/heart.png\",\n \"revision\": \"d881b7fa7626554bba4553db9c472a6c\"\n },\n {\n \"url\": \"/icons/static/emotion/pao.png\",\n \"revision\": \"8353855e71f6947bfa80e773e948cf6b\"\n },\n {\n \"url\": \"/icons/static/emotion/pill.png\",\n \"revision\": \"931bf25bc5710a093a6ffb2d90e15bd1\"\n },\n {\n \"url\": \"/icons/static/emotion/popcorn.png\",\n \"revision\": \"2da5a48f41b051c07ffb44cb4babccf5\"\n },\n {\n \"url\": \"/icons/static/emotion/tada.png\",\n \"revision\": \"bdb5d644803232537c5955e517bdf8d1\"\n },\n {\n \"url\": \"/icons/static/filter.svg\",\n \"revision\": \"be12b41b19b2a1a6b9dbb8af031f6516\"\n },\n {\n \"url\": \"/icons/static/hash-solid.svg\",\n \"revision\": \"3186885f0a95417df4515e994dd8495c\"\n },\n {\n \"url\": \"/icons/static/help.svg\",\n \"revision\": \"9e42d2d4e1887bd372fa61446ef0c22c\"\n },\n {\n \"url\": \"/icons/static/magic-stick.svg\",\n \"revision\": \"e6646841fc27781bcb7afa2359d3317e\"\n },\n {\n \"url\": \"/icons/static/menu/Q-A.svg\",\n \"revision\": \"b546afd7df1086f7927c822a39293454\"\n },\n {\n \"url\": \"/icons/static/menu/chart.svg\",\n \"revision\": \"a2d3646747741db4f98a038a49e1fc25\"\n },\n {\n \"url\": \"/icons/static/menu/ear.svg\",\n \"revision\": \"a1c55a34ba30089a40d767cf579d4c98\"\n },\n {\n \"url\": \"/icons/static/menu/feedback.svg\",\n \"revision\": \"e7e4f05917724b47c67fd970f6b70684\"\n },\n {\n \"url\": \"/icons/static/menu/github.svg\",\n \"revision\": \"c3cb6a0411d1278a6da2ffd46a37cbf1\"\n },\n {\n \"url\": \"/icons/static/menu/hot.svg\",\n \"revision\": \"de972ccc9acc1d14e2f4eec1f37c8225\"\n },\n {\n \"url\": \"/icons/static/menu/makers.svg\",\n \"revision\": \"b839ff4b30993c9f22e8e4da2a6a7979\"\n },\n {\n \"url\": \"/icons/static/menu/shop.svg\",\n \"revision\": \"52bd52db70daba15e976c5265b05949d\"\n },\n {\n \"url\": \"/icons/static/menu/snippets.svg\",\n \"revision\": \"983910973da10e20b698937bee8659c0\"\n },\n {\n \"url\": \"/icons/static/menu/sponsor.svg\",\n \"revision\": \"11cd4a305ac40d681561a4fda7e057b5\"\n },\n {\n \"url\": \"/icons/static/menu/subscribe.svg\",\n \"revision\": \"043b1f181fd271d6f1a4c29ed55c4437\"\n },\n {\n \"url\": \"/icons/static/menu/trending.svg\",\n \"revision\": \"18e30183dd67e5d2fc9a73a1acd72c95\"\n },\n {\n \"url\": \"/icons/static/menu/vip.svg\",\n \"revision\": \"bdc7b84399677c441a88c23316061d7a\"\n },\n {\n \"url\": \"/icons/static/pulse.svg\",\n \"revision\": \"e538cb726692d80736e71cc3826cf0b1\"\n },\n {\n \"url\": \"/icons/static/radio-checked.svg\",\n \"revision\": \"9ee129c83efe212d249aec35702d7baa\"\n },\n {\n \"url\": \"/icons/static/route/cool-guide.svg\",\n \"revision\": \"2fb0e324aa6cd8c63e26645a383941ac\"\n },\n {\n \"url\": \"/icons/static/route/cup.svg\",\n \"revision\": \"b4bdd436ec65f2db2d41f1775f479d78\"\n },\n {\n \"url\": \"/icons/static/route/job.svg\",\n \"revision\": \"03949eb12a0f1b65cc6e1d0567babdb0\"\n },\n {\n \"url\": \"/icons/static/route/job_cn.svg\",\n \"revision\": \"3d1caca6ea6328f94226f686f22f38c1\"\n },\n {\n \"url\": \"/icons/static/route/light.svg\",\n \"revision\": \"641ecb0dc31182afff0b710c7e94fd6e\"\n },\n {\n \"url\": \"/icons/static/route/meetup.svg\",\n \"revision\": \"ebcee7b486ac7565d6d477bac61e2a60\"\n },\n {\n \"url\": \"/icons/static/search.svg\",\n \"revision\": \"01e1a7f7eae140a562fdfae97f84eb7f\"\n },\n {\n \"url\": \"/icons/static/shape/about.svg\",\n \"revision\": \"83dc0acb6bed4e64688ae4c77a020cfe\"\n },\n {\n \"url\": \"/icons/static/shape/activity.svg\",\n \"revision\": \"003862360f7af9329d243588ec32ce9f\"\n },\n {\n \"url\": \"/icons/static/shape/add-square.svg\",\n \"revision\": \"4cab4e3edb8eb1d89eb5d6b7681789e8\"\n },\n {\n \"url\": \"/icons/static/shape/add.svg\",\n \"revision\": \"90a91a799449f6cc15ce9bdd64f757ad\"\n },\n {\n \"url\": \"/icons/static/shape/air-balloon.svg\",\n \"revision\": \"8df316fd9ffa6bc7fc2c26b0f31c2dfd\"\n },\n {\n \"url\": \"/icons/static/shape/android.svg\",\n \"revision\": \"fcc156e5f127848a3efcf86ac4c24a66\"\n },\n {\n \"url\": \"/icons/static/shape/apple.svg\",\n \"revision\": \"119daf4b6a59f8352f3da9cf0d98b802\"\n },\n {\n \"url\": \"/icons/static/shape/arrow-circle.svg\",\n \"revision\": \"9947650131b1cc9c1d6b104bbb04b317\"\n },\n {\n \"url\": \"/icons/static/shape/arrow-simple.svg\",\n \"revision\": \"0e93d9cbbf0d0eb679f5ea5f7d0707ba\"\n },\n {\n \"url\": \"/icons/static/shape/arrow-solid.svg\",\n \"revision\": \"e93ca59e804dafd71387ff1ccd5bbb48\"\n },\n {\n \"url\": \"/icons/static/shape/arrow.svg\",\n \"revision\": \"14c7e2dbc17f48f58361729d0ba90704\"\n },\n {\n \"url\": \"/icons/static/shape/candy.svg\",\n \"revision\": \"d33f3558519d4727e194d1e902bf8ba7\"\n },\n {\n \"url\": \"/icons/static/shape/checked.svg\",\n \"revision\": \"1980041ef90ddfdfc198331f93ca779d\"\n },\n {\n \"url\": \"/icons/static/shape/close-circle.svg\",\n \"revision\": \"6ca0a1d2ab80d19cdaf8d0d7af247ccc\"\n },\n {\n \"url\": \"/icons/static/shape/close.svg\",\n \"revision\": \"37e344400b4fc30332fdecb8ada2faf5\"\n },\n {\n \"url\": \"/icons/static/shape/crown.svg\",\n \"revision\": \"8ebb82d1c19295fc27d6194b2d40959e\"\n },\n {\n \"url\": \"/icons/static/shape/curly-arrow.svg\",\n \"revision\": \"1b509c114a51291f0b626ebc68b52969\"\n },\n {\n \"url\": \"/icons/static/shape/delete-solid.svg\",\n \"revision\": \"5781616495a4fb3ab240242418558aea\"\n },\n {\n \"url\": \"/icons/static/shape/delete.svg\",\n \"revision\": \"102ea5efe5db79caaec25426e3b2693f\"\n },\n {\n \"url\": \"/icons/static/shape/double-arrow.svg\",\n \"revision\": \"05d0a081e20ecb0476bd94712d16fe55\"\n },\n {\n \"url\": \"/icons/static/shape/ear.svg\",\n \"revision\": \"03dc348eec8b0390ddaaaa54373a17b2\"\n },\n {\n \"url\": \"/icons/static/shape/expand-all.svg\",\n \"revision\": \"47d2f09cd3bd17fb705efd8b191f2020\"\n },\n {\n \"url\": \"/icons/static/shape/feedback.svg\",\n \"revision\": \"e7e4f05917724b47c67fd970f6b70684\"\n },\n {\n \"url\": \"/icons/static/shape/fold-all.svg\",\n \"revision\": \"889756027df1291e25278b035f89c955\"\n },\n {\n \"url\": \"/icons/static/shape/girl-mark.svg\",\n \"revision\": \"deb9ce2d90c202cc2cecb3b35de907c2\"\n },\n {\n \"url\": \"/icons/static/shape/grow-up.svg\",\n \"revision\": \"dba80deb4e1a5764e3db8010d7ad49ad\"\n },\n {\n \"url\": \"/icons/static/shape/handshake.svg\",\n \"revision\": \"a4d945223f235649cce03eaa0500e990\"\n },\n {\n \"url\": \"/icons/static/shape/home.svg\",\n \"revision\": \"d3f7b7b78f0ddb2892318d0284ff25d7\"\n },\n {\n \"url\": \"/icons/static/shape/image.svg\",\n \"revision\": \"8ed0760627704c450492354bdea91e51\"\n },\n {\n \"url\": \"/icons/static/shape/link-hint.svg\",\n \"revision\": \"ae3e480617386d5117108967a98431cb\"\n },\n {\n \"url\": \"/icons/static/shape/link-outside.svg\",\n \"revision\": \"c244d201a922c0c8d723b5fa5a4299a1\"\n },\n {\n \"url\": \"/icons/static/shape/link.svg\",\n \"revision\": \"50f9a22dfc9b9187f30cf14b3f11715c\"\n },\n {\n \"url\": \"/icons/static/shape/locate-solid.svg\",\n \"revision\": \"4d0a5ca6b4c811b54e420c468dc67acb\"\n },\n {\n \"url\": \"/icons/static/shape/locate.svg\",\n \"revision\": \"37eb2555f6d4de262117b07d390678cf\"\n },\n {\n \"url\": \"/icons/static/shape/lock.svg\",\n \"revision\": \"88febf14c531b7508b97f328099665a5\"\n },\n {\n \"url\": \"/icons/static/shape/menu-closed.svg\",\n \"revision\": \"576c9ad0302b0de71afb0a4eaa2b8ee3\"\n },\n {\n \"url\": \"/icons/static/shape/menu-opened.svg\",\n \"revision\": \"9ce4cf9615fb80e60f5c9265b51ff695\"\n },\n {\n \"url\": \"/icons/static/shape/more-3.svg\",\n \"revision\": \"626b6d567993585aa2e5034603dd01c5\"\n },\n {\n \"url\": \"/icons/static/shape/more-box.svg\",\n \"revision\": \"8e1fc1567edfa31074b3c240b05af318\"\n },\n {\n \"url\": \"/icons/static/shape/more-l.svg\",\n \"revision\": \"eb263be2d73fbe2841e0fb80e0ea38ee\"\n },\n {\n \"url\": \"/icons/static/shape/more.svg\",\n \"revision\": \"245f34418adec1581c5db3f8223f442f\"\n },\n {\n \"url\": \"/icons/static/shape/navi-back.svg\",\n \"revision\": \"f7735265330186d7df8c532031beebfe\"\n },\n {\n \"url\": \"/icons/static/shape/next-article-solid.svg\",\n \"revision\": \"5458b89c14eeffb0eab1707d4a33ece5\"\n },\n {\n \"url\": \"/icons/static/shape/next-article.svg\",\n \"revision\": \"e25a3ff85d3af5834fc17f8fa4f92a10\"\n },\n {\n \"url\": \"/icons/static/shape/planet.svg\",\n \"revision\": \"6421ee5470917d7189e27f957c543996\"\n },\n {\n \"url\": \"/icons/static/shape/plus.svg\",\n \"revision\": \"4dc296e3fd14ec6166c9f95fe1db0960\"\n },\n {\n \"url\": \"/icons/static/shape/previous-article-solid.svg\",\n \"revision\": \"cf85b3e182bbef9c89b4f530ca419719\"\n },\n {\n \"url\": \"/icons/static/shape/previous-article.svg\",\n \"revision\": \"939533d288d2ea63b33ab3160fea261e\"\n },\n {\n \"url\": \"/icons/static/shape/question.svg\",\n \"revision\": \"e8e204dc7c7525257d321eaab6166507\"\n },\n {\n \"url\": \"/icons/static/shape/quote.svg\",\n \"revision\": \"737545bd27e91243985978f3e0f8b331\"\n },\n {\n \"url\": \"/icons/static/shape/reset.svg\",\n \"revision\": \"d47568d1d092bf423f854f4c60f19c31\"\n },\n {\n \"url\": \"/icons/static/shape/setting.svg\",\n \"revision\": \"ba4a2277d4cf655b2be0c80b5974f409\"\n },\n {\n \"url\": \"/icons/static/shape/settings.svg\",\n \"revision\": \"a838ac169451582fc0fbc5961e23920b\"\n },\n {\n \"url\": \"/icons/static/shape/star.svg\",\n \"revision\": \"4e8ad3ba1985012effb0d72574f1db85\"\n },\n {\n \"url\": \"/icons/static/shape/t.svg\",\n \"revision\": \"baf8257cd1c1aae44783fcfc32dc4faa\"\n },\n {\n \"url\": \"/icons/static/shape/tail.svg\",\n \"revision\": \"11ba168e7402d94e5bede5b28b0041e8\"\n },\n {\n \"url\": \"/icons/static/shape/upvote-ship.svg\",\n \"revision\": \"c36f001d22b9115a7c13b713508d292f\"\n },\n {\n \"url\": \"/icons/static/shape/video.svg\",\n \"revision\": \"012a17726cb1f34bb06ae803ea45d09e\"\n },\n {\n \"url\": \"/icons/static/shape/vote-up-solid.svg\",\n \"revision\": \"39c00aaa29cebcbe036a920cb82c6b14\"\n },\n {\n \"url\": \"/icons/static/shape/vote-up.svg\",\n \"revision\": \"b7ffefb246fdf5193372329dfc30196e\"\n },\n {\n \"url\": \"/icons/static/shape/warning.svg\",\n \"revision\": \"b44ce1763b979b6c239b8ddedb480ac9\"\n },\n {\n \"url\": \"/icons/static/sidebar-menu.svg\",\n \"revision\": \"355dec45f9629e1ed6b95a75cb94a659\"\n },\n {\n \"url\": \"/icons/static/social/QQ-share.png\",\n \"revision\": \"59a67f20167d81a223f62bf2e14e15b0\"\n },\n {\n \"url\": \"/icons/static/social/douban-share.png\",\n \"revision\": \"1b1498eb5dc5e8ee7c151453d3cebc59\"\n },\n {\n \"url\": \"/icons/static/social/douban.svg\",\n \"revision\": \"de212dedd707ff0b7ca20fe99ef6c7fe\"\n },\n {\n \"url\": \"/icons/static/social/dribble.svg\",\n \"revision\": \"c53459401aad2474907896e86eaf71ad\"\n },\n {\n \"url\": \"/icons/static/social/embed-share.svg\",\n \"revision\": \"543275f6315330c6df5306300a5d3c5e\"\n },\n {\n \"url\": \"/icons/static/social/facebook-share.png\",\n \"revision\": \"4edebe50e0322d9c9a18ae9545ca6eaf\"\n },\n {\n \"url\": \"/icons/static/social/facebook.svg\",\n \"revision\": \"7e4af5e40622193cc6a3c32d39bffcfc\"\n },\n {\n \"url\": \"/icons/static/social/github.svg\",\n \"revision\": \"c434405c78e6225788c827e1dadee553\"\n },\n {\n \"url\": \"/icons/static/social/global.svg\",\n \"revision\": \"62fa645b1d9e31d1a9b3396f7b718a55\"\n },\n {\n \"url\": \"/icons/static/social/huaban.svg\",\n \"revision\": \"3c3a0da4f543e98f058618a48f971e24\"\n },\n {\n \"url\": \"/icons/static/social/instagram.svg\",\n \"revision\": \"aece0673a21466fcf6e4a57de1b716a5\"\n },\n {\n \"url\": \"/icons/static/social/mail-share.svg\",\n \"revision\": \"c0b35742f9d781f6a7495f039f189341\"\n },\n {\n \"url\": \"/icons/static/social/pinterest.svg\",\n \"revision\": \"eea97e769792c88d36f6b516f8ea533f\"\n },\n {\n \"url\": \"/icons/static/social/qq.svg\",\n \"revision\": \"2d1e48ee9028ed880563eb20ca8eb8eb\"\n },\n {\n \"url\": \"/icons/static/social/reddit-share.png\",\n \"revision\": \"f062fad2fbb0e11e82eb988d2b0647d1\"\n },\n {\n \"url\": \"/icons/static/social/telegram-share.png\",\n \"revision\": \"14b57710e67ea540031cdb9bb3779ff0\"\n },\n {\n \"url\": \"/icons/static/social/twitter-share.png\",\n \"revision\": \"a4dfaf020789cbf745fa5c916e3a107e\"\n },\n {\n \"url\": \"/icons/static/social/twitter.svg\",\n \"revision\": \"f69f02db84fc54afc8d81252868064a3\"\n },\n {\n \"url\": \"/icons/static/social/wechat-share.png\",\n \"revision\": \"ed8153ce8ecaf423e3a3a0574b07447c\"\n },\n {\n \"url\": \"/icons/static/social/wechat-solid.svg\",\n \"revision\": \"d2c81117fab15eacfac0ce774604a78d\"\n },\n {\n \"url\": \"/icons/static/social/wechat.svg\",\n \"revision\": \"43800ee53bcd256cc35e557a61120a58\"\n },\n {\n \"url\": \"/icons/static/social/weibo-share.png\",\n \"revision\": \"a1afa755e41c873dd9cdcb6f634f24a2\"\n },\n {\n \"url\": \"/icons/static/social/weibo.svg\",\n \"revision\": \"8e6c08c4858d7ec830b0a3bba60f33ab\"\n },\n {\n \"url\": \"/icons/static/social/weichat.svg\",\n \"revision\": \"c88a34ee98d0dc6ba6f94e4712c91b77\"\n },\n {\n \"url\": \"/icons/static/social/zhihu-share.jpeg\",\n \"revision\": \"821c8ec15e665dafbc17ad549d62727c\"\n },\n {\n \"url\": \"/icons/static/social/zhihu.svg\",\n \"revision\": \"13ee0b45c8e3f2f2ea1b96243671dae3\"\n },\n {\n \"url\": \"/icons/static/subscribe/email-box.svg\",\n \"revision\": \"2acfa4446f5946591cbdb0c6a8be9f6e\"\n },\n {\n \"url\": \"/icons/static/subscribe/email-envelope.svg\",\n \"revision\": \"6c184ace64bda3a6c47133fa2f5431b8\"\n },\n {\n \"url\": \"/icons/static/subscribe/email-solid.svg\",\n \"revision\": \"58a06b45de32344c09b3d4a692684f51\"\n },\n {\n \"url\": \"/icons/static/user/account-circle.svg\",\n \"revision\": \"4c3eec2ae947b3e704e401f70940be30\"\n },\n {\n \"url\": \"/icons/static/user/account-solid.svg\",\n \"revision\": \"9da3b27ba50b233afdc38b17a4ec9e57\"\n },\n {\n \"url\": \"/locales/en/community.json\",\n \"revision\": \"fcef9fd2384c8df138834d65c85bae81\"\n },\n {\n \"url\": \"/locales/en/general.json\",\n \"revision\": \"c390ea6b0b40bdb31d82c7a7df1b72bd\"\n },\n {\n \"url\": \"/locales/zh/community.json\",\n \"revision\": \"a1e064e2eb5628ee9b577fb0b9095dd7\"\n },\n {\n \"url\": \"/locales/zh/general.json\",\n \"revision\": \"fdbd431ab9ea8081a57c21f7ba366ac6\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"65d23d030fde6701c68a7ce16e4f4d9b\"\n },\n {\n \"url\": \"/pwa/icon-192x192.png\",\n \"revision\": \"447307e81adae9ce540e494017f6bf0d\"\n },\n {\n \"url\": \"/pwa/icon-256x256.png\",\n \"revision\": \"f72dee92c556f06f2b346387b0a7167b\"\n },\n {\n \"url\": \"/pwa/icon-384x384.png\",\n \"revision\": \"0732fd99eb097789a1ec71bfe74fcc72\"\n },\n {\n \"url\": \"/pwa/icon-512x512.png\",\n \"revision\": \"3a46f658d8bb2b9d25560ff81bffebc8\"\n },\n {\n \"url\": \"/robots.txt\",\n \"revision\": \"a5de38b53b1c44d347ea64eae556d549\"\n },\n {\n \"url\": \"/sitemap.xml\",\n \"revision\": \"4e19eb32cee1f2359899f74e2f7f08d5\"\n }\n], {\n \"ignoreURLParametersMatching\": []\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({request, response, event, state}) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, {status: 200, statusText: 'OK', headers: response.headers}); } return response; } }] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:gstatic)\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-webfonts\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 31536000 })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:googleapis)\\.com\\/.*/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"google-fonts-stylesheets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-font-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-image-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/image\\?url=.+$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-image\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp3|wav|ogg)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-audio-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp4)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-video-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:js)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-js-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|less)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-style-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/data\\/.+\\/.+\\.json$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-data\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:json|xml|csv)$/i, new workbox_strategies_NetworkFirst({ \"cacheName\":\"static-data-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({url}) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without impact other environment\n // Above route is default for next-auth, you may need to change it if your OAuth workflow has a different callback route\n // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809\n if (pathname.startsWith('/api/auth/')) return false\n if (pathname.startsWith('/api/')) return true\n return false\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"apis\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 16, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({url}) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n if (pathname.startsWith('/api/')) return false\n return true\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"others\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({url}) => {\n const isSameOrigin = self.origin === url.origin\n return !isSameOrigin\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"cross-origin\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 3600 })] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","async","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_CacheFirst","workbox_expiration_ExpirationPlugin","maxEntries","maxAgeSeconds","workbox_strategies_StaleWhileRevalidate","workbox_range_requests_RangeRequestsPlugin","url","origin","pathname","startsWith"],"mappings":"0nBAqBAA,gBAUAC,KAAKC,kDAU+B,CAClC,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,uDACK,yBAEd,KACS,2DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,wDACK,yBAEd,KACS,4DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,8DACK,yBAEd,KACS,kEACK,yBAEd,KACS,yDACK,yBAEd,KACS,6DACK,yBAEd,KACS,0EACK,yBAEd,KACS,8EACK,yBAEd,KACS,uFACK,yBAEd,KACS,2FACK,yBAEd,KACS,+DACK,yBAEd,KACS,mEACK,yBAEd,KACS,iEACK,yBAEd,KACS,qEACK,yBAEd,KACS,0EACK,yBAEd,KACS,8EACK,yBAEd,KACS,wEACK,yBAEd,KACS,4EACK,yBAEd,KACS,qEACK,yBAEd,KACS,yEACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,uEACK,yBAEd,KACS,2EACK,yBAEd,KACS,sEACK,yBAEd,KACS,0EACK,yBAEd,KACS,gEACK,yBAEd,KACS,oEACK,yBAEd,KACS,uEACK,yBAEd,KACS,2EACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,qEACK,yBAEd,KACS,yEACK,yBAEd,KACS,gEACK,yBAEd,KACS,oEACK,yBAEd,KACS,+DACK,yBAEd,KACS,mEACK,yBAEd,KACS,gEACK,yBAEd,KACS,oEACK,yBAEd,KACS,wEACK,yBAEd,KACS,4EACK,yBAEd,KACS,uEACK,yBAEd,KACS,2EACK,yBAEd,KACS,sEACK,yBAEd,KACS,0EACK,yBAEd,KACS,uEACK,yBAEd,KACS,2EACK,yBAEd,KACS,wEACK,yBAEd,KACS,4EACK,yBAEd,KACS,wEACK,yBAEd,KACS,4EACK,yBAEd,KACS,yEACK,yBAEd,KACS,6EACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,oEACK,yBAEd,KACS,wEACK,yBAEd,KACS,qEACK,yBAEd,KACS,yEACK,yBAEd,KACS,mEACK,yBAEd,KACS,uEACK,yBAEd,KACS,8EACK,yBAEd,KACS,kFACK,yBAEd,KACS,+EACK,yBAEd,KACS,mFACK,yBAEd,KACS,gFACK,yBAEd,KACS,oFACK,yBAEd,KACS,qEACK,yBAEd,KACS,yEACK,yBAEd,KACS,gFACK,yBAEd,KACS,oFACK,yBAEd,KACS,2EACK,yBAEd,KACS,+EACK,yBAEd,KACS,yEACK,yBAEd,KACS,6EACK,yBAEd,KACS,8EACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,iEACK,yBAEd,KACS,sEACK,yBAEd,KACS,+DACK,yBAEd,KACS,wBACK,oCAEd,KACS,mDACK,oCAEd,KACS,oDACK,oCAEd,KACS,2CACK,oCAEd,KACS,2CACK,oCAEd,KACS,2CACK,oCAEd,KACS,4CACK,oCAEd,KACS,wCACK,oCAEd,KACS,+CACK,oCAEd,KACS,sDACK,oCAEd,KACS,sDACK,oCAEd,KACS,4DACK,oCAEd,KACS,mDACK,oCAEd,KACS,6CACK,oCAEd,KACS,sDACK,oCAEd,KACS,wDACK,oCAEd,KACS,2DACK,oCAEd,KACS,6CACK,oCAEd,KACS,uDACK,oCAEd,KACS,sDACK,oCAEd,KACS,uDACK,oCAEd,KACS,+CACK,oCAEd,KACS,4CACK,oCAEd,KACS,iDACK,oCAEd,KACS,2CACK,oCAEd,KACS,4CACK,oCAEd,KACS,gDACK,oCAEd,KACS,+CACK,oCAEd,KACS,6CACK,oCAEd,KACS,sDACK,oCAEd,KACS,+CACK,oCAEd,KACS,2CACK,oCAEd,KACS,kDACK,oCAEd,KACS,4CACK,oCAEd,KACS,iDACK,oCAEd,KACS,2CACK,oCAEd,KACS,yCACK,oCAEd,KACS,2CACK,oCAEd,KACS,4CACK,oCAEd,KACS,0CACK,oCAEd,KACS,sCACK,oCAEd,KACS,8CACK,oCAEd,KACS,iDACK,oCAEd,KACS,2DACK,oCAEd,KACS,qDACK,oCAEd,KACS,gDACK,oCAEd,KACS,gDACK,oCAEd,KACS,0CACK,oCAEd,KACS,4CACK,oCAEd,KACS,8CACK,oCAEd,KACS,8CACK,oCAEd,KACS,6CACK,oCAEd,KACS,2CACK,oCAEd,KACS,yCACK,oCAEd,KACS,0CACK,oCAEd,KACS,6CACK,oCAEd,KACS,0CACK,oCAEd,KACS,oCACK,oCAEd,KACS,wCACK,oCAEd,KACS,kCACK,oCAEd,KACS,yCACK,oCAEd,KACS,sCACK,oCAEd,KACS,wCACK,oCAEd,KACS,sCACK,oCAEd,KACS,2CACK,oCAEd,KACS,yCACK,oCAEd,KACS,sCACK,oCAEd,KACS,yCACK,oCAEd,KACS,uCACK,oCAEd,KACS,2CACK,oCAEd,KACS,0CACK,oCAEd,KACS,4CACK,oCAEd,KACS,2CACK,oCAEd,KACS,sCACK,oCAEd,KACS,mCACK,oCAEd,KACS,2CACK,oCAEd,KACS,8CACK,oCAEd,KACS,uCACK,oCAEd,KACS,uCACK,oCAEd,KACS,0CACK,oCAEd,KACS,yCACK,oCAEd,KACS,0CACK,oCAEd,KACS,oCACK,oCAEd,KACS,yCACK,oCAEd,KACS,4CACK,oCAEd,KACS,8CACK,oCAEd,KACS,uCACK,oCAEd,KACS,+CACK,oCAEd,KACS,2CACK,oCAEd,KACS,yCACK,oCAEd,KACS,gDACK,oCAEd,KACS,gDACK,oCAEd,KACS,+CACK,oCAEd,KACS,yCACK,oCAEd,KACS,yCACK,oCAEd,KACS,2CACK,oCAEd,KACS,gDACK,oCAEd,KACS,yCACK,oCAEd,KACS,yCACK,oCAEd,KACS,+CACK,oCAEd,KACS,gDACK,oCAEd,KACS,0CACK,oCAEd,KACS,gDACK,oCAEd,KACS,uCACK,oCAEd,KACS,8CACK,oCAEd,KACS,4CACK,oCAEd,KACS,4CACK,oCAEd,KACS,6CACK,oCAEd,KACS,2CACK,oCAEd,KACS,6CACK,oCAEd,KACS,wCACK,oCAEd,KACS,yCACK,oCAEd,KACS,6CACK,oCAEd,KACS,gDACK,oCAEd,KACS,wCACK,oCAEd,KACS,gDACK,oCAEd,KACS,0CACK,oCAEd,KACS,wCACK,oCAEd,KACS,+CACK,oCAEd,KACS,+CACK,oCAEd,KACS,0CACK,oCAEd,KACS,4CACK,oCAEd,KACS,0CACK,oCAEd,KACS,wCACK,oCAEd,KACS,6CACK,oCAEd,KACS,sDACK,oCAEd,KACS,gDACK,oCAEd,KACS,0CACK,oCAEd,KACS,wCACK,oCAEd,KACS,0DACK,oCAEd,KACS,oDACK,oCAEd,KACS,4CACK,oCAEd,KACS,yCACK,oCAEd,KACS,yCACK,oCAEd,KACS,2CACK,oCAEd,KACS,4CACK,oCAEd,KACS,wCACK,oCAEd,KACS,qCACK,oCAEd,KACS,wCACK,oCAEd,KACS,+CACK,oCAEd,KACS,yCACK,oCAEd,KACS,iDACK,oCAEd,KACS,2CACK,oCAEd,KACS,2CACK,oCAEd,KACS,0CACK,oCAEd,KACS,6CACK,oCAEd,KACS,iDACK,oCAEd,KACS,2CACK,oCAEd,KACS,4CACK,oCAEd,KACS,gDACK,oCAEd,K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"} \ No newline at end of file diff --git a/public/workbox-a7787ddd.js b/public/workbox-a7787ddd.js new file mode 100644 index 000000000..af19a0320 --- /dev/null +++ b/public/workbox-a7787ddd.js @@ -0,0 +1,1294 @@ +define(['exports'], function (t) { + 'use strict' + try { + self['workbox:core:6.4.1'] && _() + } catch (t) {} + const e = (t, ...e) => { + let s = t + return e.length > 0 && (s += ` :: ${JSON.stringify(e)}`), s + } + class s extends Error { + constructor(t, s) { + super(e(t, s)), (this.name = t), (this.details = s) + } + } + try { + self['workbox:routing:6.4.1'] && _() + } catch (t) {} + const n = (t) => (t && 'object' == typeof t ? t : { handle: t }) + class r { + constructor(t, e, s = 'GET') { + ;(this.handler = n(e)), (this.match = t), (this.method = s) + } + setCatchHandler(t) { + this.catchHandler = n(t) + } + } + class i extends r { + constructor(t, e, s) { + super( + ({ url: e }) => { + const s = t.exec(e.href) + if (s && (e.origin === location.origin || 0 === s.index)) + return s.slice(1) + }, + e, + s, + ) + } + } + class a { + constructor() { + ;(this.t = new Map()), (this.i = new Map()) + } + get routes() { + return this.t + } + addFetchListener() { + self.addEventListener('fetch', (t) => { + const { request: e } = t, + s = this.handleRequest({ request: e, event: t }) + s && t.respondWith(s) + }) + } + addCacheListener() { + self.addEventListener('message', (t) => { + if (t.data && 'CACHE_URLS' === t.data.type) { + const { payload: e } = t.data, + s = Promise.all( + e.urlsToCache.map((e) => { + 'string' == typeof e && (e = [e]) + const s = new Request(...e) + return this.handleRequest({ request: s, event: t }) + }), + ) + t.waitUntil(s), + t.ports && t.ports[0] && s.then(() => t.ports[0].postMessage(!0)) + } + }) + } + handleRequest({ request: t, event: e }) { + const s = new URL(t.url, location.href) + if (!s.protocol.startsWith('http')) return + const n = s.origin === location.origin, + { params: r, route: i } = this.findMatchingRoute({ + event: e, + request: t, + sameOrigin: n, + url: s, + }) + let a = i && i.handler + const o = t.method + if ((!a && this.i.has(o) && (a = this.i.get(o)), !a)) return + let c + try { + c = a.handle({ url: s, request: t, event: e, params: r }) + } catch (t) { + c = Promise.reject(t) + } + const h = i && i.catchHandler + return ( + c instanceof Promise && + (this.o || h) && + (c = c.catch(async (n) => { + if (h) + try { + return await h.handle({ + url: s, + request: t, + event: e, + params: r, + }) + } catch (t) { + t instanceof Error && (n = t) + } + if (this.o) return this.o.handle({ url: s, request: t, event: e }) + throw n + })), + c + ) + } + findMatchingRoute({ url: t, sameOrigin: e, request: s, event: n }) { + const r = this.t.get(s.method) || [] + for (const i of r) { + let r + const a = i.match({ url: t, sameOrigin: e, request: s, event: n }) + if (a) + return ( + (r = a), + ((Array.isArray(r) && 0 === r.length) || + (a.constructor === Object && 0 === Object.keys(a).length) || + 'boolean' == typeof a) && + (r = void 0), + { route: i, params: r } + ) + } + return {} + } + setDefaultHandler(t, e = 'GET') { + this.i.set(e, n(t)) + } + setCatchHandler(t) { + this.o = n(t) + } + registerRoute(t) { + this.t.has(t.method) || this.t.set(t.method, []), + this.t.get(t.method).push(t) + } + unregisterRoute(t) { + if (!this.t.has(t.method)) + throw new s('unregister-route-but-not-found-with-method', { + method: t.method, + }) + const e = this.t.get(t.method).indexOf(t) + if (!(e > -1)) throw new s('unregister-route-route-not-registered') + this.t.get(t.method).splice(e, 1) + } + } + let o + const c = () => ( + o || ((o = new a()), o.addFetchListener(), o.addCacheListener()), o + ) + function h(t, e, n) { + let a + if ('string' == typeof t) { + const s = new URL(t, location.href) + a = new r(({ url: t }) => t.href === s.href, e, n) + } else if (t instanceof RegExp) a = new i(t, e, n) + else if ('function' == typeof t) a = new r(t, e, n) + else { + if (!(t instanceof r)) + throw new s('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture', + }) + a = t + } + return c().registerRoute(a), a + } + try { + self['workbox:strategies:6.4.1'] && _() + } catch (t) {} + const u = { + cacheWillUpdate: async ({ response: t }) => + 200 === t.status || 0 === t.status ? t : null, + }, + l = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: 'undefined' != typeof registration ? registration.scope : '', + }, + f = (t) => + [l.prefix, t, l.suffix].filter((t) => t && t.length > 0).join('-'), + w = (t) => t || f(l.precache), + d = (t) => t || f(l.runtime) + function p(t, e) { + const s = new URL(t) + for (const t of e) s.searchParams.delete(t) + return s.href + } + class y { + constructor() { + this.promise = new Promise((t, e) => { + ;(this.resolve = t), (this.reject = e) + }) + } + } + const g = new Set() + function m(t) { + return 'string' == typeof t ? new Request(t) : t + } + class R { + constructor(t, e) { + ;(this.h = {}), + Object.assign(this, e), + (this.event = e.event), + (this.u = t), + (this.l = new y()), + (this.p = []), + (this.g = [...t.plugins]), + (this.m = new Map()) + for (const t of this.g) this.m.set(t, {}) + this.event.waitUntil(this.l.promise) + } + async fetch(t) { + const { event: e } = this + let n = m(t) + if ( + 'navigate' === n.mode && + e instanceof FetchEvent && + e.preloadResponse + ) { + const t = await e.preloadResponse + if (t) return t + } + const r = this.hasCallback('fetchDidFail') ? n.clone() : null + try { + for (const t of this.iterateCallbacks('requestWillFetch')) + n = await t({ request: n.clone(), event: e }) + } catch (t) { + if (t instanceof Error) + throw new s('plugin-error-request-will-fetch', { + thrownErrorMessage: t.message, + }) + } + const i = n.clone() + try { + let t + t = await fetch(n, 'navigate' === n.mode ? void 0 : this.u.fetchOptions) + for (const s of this.iterateCallbacks('fetchDidSucceed')) + t = await s({ event: e, request: i, response: t }) + return t + } catch (t) { + throw ( + (r && + (await this.runCallbacks('fetchDidFail', { + error: t, + event: e, + originalRequest: r.clone(), + request: i.clone(), + })), + t) + ) + } + } + async fetchAndCachePut(t) { + const e = await this.fetch(t), + s = e.clone() + return this.waitUntil(this.cachePut(t, s)), e + } + async cacheMatch(t) { + const e = m(t) + let s + const { cacheName: n, matchOptions: r } = this.u, + i = await this.getCacheKey(e, 'read'), + a = Object.assign(Object.assign({}, r), { cacheName: n }) + s = await caches.match(i, a) + for (const t of this.iterateCallbacks('cachedResponseWillBeUsed')) + s = + (await t({ + cacheName: n, + matchOptions: r, + cachedResponse: s, + request: i, + event: this.event, + })) || void 0 + return s + } + async cachePut(t, e) { + const n = m(t) + var r + await ((r = 0), new Promise((t) => setTimeout(t, r))) + const i = await this.getCacheKey(n, 'write') + if (!e) + throw new s('cache-put-with-no-response', { + url: + ((a = i.url), + new URL(String(a), location.href).href.replace( + new RegExp(`^${location.origin}`), + '', + )), + }) + var a + const o = await this.R(e) + if (!o) return !1 + const { cacheName: c, matchOptions: h } = this.u, + u = await self.caches.open(c), + l = this.hasCallback('cacheDidUpdate'), + f = l + ? await (async function (t, e, s, n) { + const r = p(e.url, s) + if (e.url === r) return t.match(e, n) + const i = Object.assign(Object.assign({}, n), { + ignoreSearch: !0, + }), + a = await t.keys(e, i) + for (const e of a) if (r === p(e.url, s)) return t.match(e, n) + })(u, i.clone(), ['__WB_REVISION__'], h) + : null + try { + await u.put(i, l ? o.clone() : o) + } catch (t) { + if (t instanceof Error) + throw ( + ('QuotaExceededError' === t.name && + (await (async function () { + for (const t of g) await t() + })()), + t) + ) + } + for (const t of this.iterateCallbacks('cacheDidUpdate')) + await t({ + cacheName: c, + oldResponse: f, + newResponse: o.clone(), + request: i, + event: this.event, + }) + return !0 + } + async getCacheKey(t, e) { + const s = `${t.url} | ${e}` + if (!this.h[s]) { + let n = t + for (const t of this.iterateCallbacks('cacheKeyWillBeUsed')) + n = m( + await t({ + mode: e, + request: n, + event: this.event, + params: this.params, + }), + ) + this.h[s] = n + } + return this.h[s] + } + hasCallback(t) { + for (const e of this.u.plugins) if (t in e) return !0 + return !1 + } + async runCallbacks(t, e) { + for (const s of this.iterateCallbacks(t)) await s(e) + } + *iterateCallbacks(t) { + for (const e of this.u.plugins) + if ('function' == typeof e[t]) { + const s = this.m.get(e), + n = (n) => { + const r = Object.assign(Object.assign({}, n), { state: s }) + return e[t](r) + } + yield n + } + } + waitUntil(t) { + return this.p.push(t), t + } + async doneWaiting() { + let t + for (; (t = this.p.shift()); ) await t + } + destroy() { + this.l.resolve(null) + } + async R(t) { + let e = t, + s = !1 + for (const t of this.iterateCallbacks('cacheWillUpdate')) + if ( + ((e = + (await t({ + request: this.request, + response: e, + event: this.event, + })) || void 0), + (s = !0), + !e) + ) + break + return s || (e && 200 !== e.status && (e = void 0)), e + } + } + class v { + constructor(t = {}) { + ;(this.cacheName = d(t.cacheName)), + (this.plugins = t.plugins || []), + (this.fetchOptions = t.fetchOptions), + (this.matchOptions = t.matchOptions) + } + handle(t) { + const [e] = this.handleAll(t) + return e + } + handleAll(t) { + t instanceof FetchEvent && (t = { event: t, request: t.request }) + const e = t.event, + s = 'string' == typeof t.request ? new Request(t.request) : t.request, + n = 'params' in t ? t.params : void 0, + r = new R(this, { event: e, request: s, params: n }), + i = this.v(r, s, e) + return [i, this.q(i, r, s, e)] + } + async v(t, e, n) { + let r + await t.runCallbacks('handlerWillStart', { event: n, request: e }) + try { + if (((r = await this.D(e, t)), !r || 'error' === r.type)) + throw new s('no-response', { url: e.url }) + } catch (s) { + if (s instanceof Error) + for (const i of t.iterateCallbacks('handlerDidError')) + if (((r = await i({ error: s, event: n, request: e })), r)) break + if (!r) throw s + } + for (const s of t.iterateCallbacks('handlerWillRespond')) + r = await s({ event: n, request: e, response: r }) + return r + } + async q(t, e, s, n) { + let r, i + try { + r = await t + } catch (i) {} + try { + await e.runCallbacks('handlerDidRespond', { + event: n, + request: s, + response: r, + }), + await e.doneWaiting() + } catch (t) { + t instanceof Error && (i = t) + } + if ( + (await e.runCallbacks('handlerDidComplete', { + event: n, + request: s, + response: r, + error: i, + }), + e.destroy(), + i) + ) + throw i + } + } + function b(t) { + t.then(() => {}) + } + function q() { + return ( + (q = + Object.assign || + function (t) { + for (var e = 1; e < arguments.length; e++) { + var s = arguments[e] + for (var n in s) + Object.prototype.hasOwnProperty.call(s, n) && (t[n] = s[n]) + } + return t + }), + q.apply(this, arguments) + ) + } + let D, U + const x = new WeakMap(), + L = new WeakMap(), + I = new WeakMap(), + C = new WeakMap(), + E = new WeakMap() + let N = { + get(t, e, s) { + if (t instanceof IDBTransaction) { + if ('done' === e) return L.get(t) + if ('objectStoreNames' === e) return t.objectStoreNames || I.get(t) + if ('store' === e) + return s.objectStoreNames[1] + ? void 0 + : s.objectStore(s.objectStoreNames[0]) + } + return k(t[e]) + }, + set: (t, e, s) => ((t[e] = s), !0), + has: (t, e) => + (t instanceof IDBTransaction && ('done' === e || 'store' === e)) || + e in t, + } + function O(t) { + return t !== IDBDatabase.prototype.transaction || + 'objectStoreNames' in IDBTransaction.prototype + ? ( + U || + (U = [ + IDBCursor.prototype.advance, + IDBCursor.prototype.continue, + IDBCursor.prototype.continuePrimaryKey, + ]) + ).includes(t) + ? function (...e) { + return t.apply(B(this), e), k(x.get(this)) + } + : function (...e) { + return k(t.apply(B(this), e)) + } + : function (e, ...s) { + const n = t.call(B(this), e, ...s) + return I.set(n, e.sort ? e.sort() : [e]), k(n) + } + } + function T(t) { + return 'function' == typeof t + ? O(t) + : (t instanceof IDBTransaction && + (function (t) { + if (L.has(t)) return + const e = new Promise((e, s) => { + const n = () => { + t.removeEventListener('complete', r), + t.removeEventListener('error', i), + t.removeEventListener('abort', i) + }, + r = () => { + e(), n() + }, + i = () => { + s(t.error || new DOMException('AbortError', 'AbortError')), + n() + } + t.addEventListener('complete', r), + t.addEventListener('error', i), + t.addEventListener('abort', i) + }) + L.set(t, e) + })(t), + (e = t), + ( + D || + (D = [ + IDBDatabase, + IDBObjectStore, + IDBIndex, + IDBCursor, + IDBTransaction, + ]) + ).some((t) => e instanceof t) + ? new Proxy(t, N) + : t) + var e + } + function k(t) { + if (t instanceof IDBRequest) + return (function (t) { + const e = new Promise((e, s) => { + const n = () => { + t.removeEventListener('success', r), + t.removeEventListener('error', i) + }, + r = () => { + e(k(t.result)), n() + }, + i = () => { + s(t.error), n() + } + t.addEventListener('success', r), t.addEventListener('error', i) + }) + return ( + e + .then((e) => { + e instanceof IDBCursor && x.set(e, t) + }) + .catch(() => {}), + E.set(e, t), + e + ) + })(t) + if (C.has(t)) return C.get(t) + const e = T(t) + return e !== t && (C.set(t, e), E.set(e, t)), e + } + const B = (t) => E.get(t) + const P = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'], + M = ['put', 'add', 'delete', 'clear'], + W = new Map() + function j(t, e) { + if (!(t instanceof IDBDatabase) || e in t || 'string' != typeof e) return + if (W.get(e)) return W.get(e) + const s = e.replace(/FromIndex$/, ''), + n = e !== s, + r = M.includes(s) + if ( + !(s in (n ? IDBIndex : IDBObjectStore).prototype) || + (!r && !P.includes(s)) + ) + return + const i = async function (t, ...e) { + const i = this.transaction(t, r ? 'readwrite' : 'readonly') + let a = i.store + return ( + n && (a = a.index(e.shift())), + (await Promise.all([a[s](...e), r && i.done]))[0] + ) + } + return W.set(e, i), i + } + N = ((t) => + q({}, t, { + get: (e, s, n) => j(e, s) || t.get(e, s, n), + has: (e, s) => !!j(e, s) || t.has(e, s), + }))(N) + try { + self['workbox:expiration:6.4.1'] && _() + } catch (t) {} + const S = 'cache-entries', + K = (t) => { + const e = new URL(t, location.href) + return (e.hash = ''), e.href + } + class A { + constructor(t) { + ;(this.U = null), (this._ = t) + } + L(t) { + const e = t.createObjectStore(S, { keyPath: 'id' }) + e.createIndex('cacheName', 'cacheName', { unique: !1 }), + e.createIndex('timestamp', 'timestamp', { unique: !1 }) + } + I(t) { + this.L(t), + this._ && + (function (t, { blocked: e } = {}) { + const s = indexedDB.deleteDatabase(t) + e && s.addEventListener('blocked', () => e()), k(s).then(() => {}) + })(this._) + } + async setTimestamp(t, e) { + const s = { + url: (t = K(t)), + timestamp: e, + cacheName: this._, + id: this.C(t), + }, + n = (await this.getDb()).transaction(S, 'readwrite', { + durability: 'relaxed', + }) + await n.store.put(s), await n.done + } + async getTimestamp(t) { + const e = await this.getDb(), + s = await e.get(S, this.C(t)) + return null == s ? void 0 : s.timestamp + } + async expireEntries(t, e) { + const s = await this.getDb() + let n = await s + .transaction(S) + .store.index('timestamp') + .openCursor(null, 'prev') + const r = [] + let i = 0 + for (; n; ) { + const s = n.value + s.cacheName === this._ && + ((t && s.timestamp < t) || (e && i >= e) ? r.push(n.value) : i++), + (n = await n.continue()) + } + const a = [] + for (const t of r) await s.delete(S, t.id), a.push(t.url) + return a + } + C(t) { + return this._ + '|' + K(t) + } + async getDb() { + return ( + this.U || + (this.U = await (function ( + t, + e, + { blocked: s, upgrade: n, blocking: r, terminated: i } = {}, + ) { + const a = indexedDB.open(t, e), + o = k(a) + return ( + n && + a.addEventListener('upgradeneeded', (t) => { + n(k(a.result), t.oldVersion, t.newVersion, k(a.transaction)) + }), + s && a.addEventListener('blocked', () => s()), + o + .then((t) => { + i && t.addEventListener('close', () => i()), + r && t.addEventListener('versionchange', () => r()) + }) + .catch(() => {}), + o + ) + })('workbox-expiration', 1, { upgrade: this.I.bind(this) })), + this.U + ) + } + } + class F { + constructor(t, e = {}) { + ;(this.N = !1), + (this.O = !1), + (this.T = e.maxEntries), + (this.k = e.maxAgeSeconds), + (this.B = e.matchOptions), + (this._ = t), + (this.P = new A(t)) + } + async expireEntries() { + if (this.N) return void (this.O = !0) + this.N = !0 + const t = this.k ? Date.now() - 1e3 * this.k : 0, + e = await this.P.expireEntries(t, this.T), + s = await self.caches.open(this._) + for (const t of e) await s.delete(t, this.B) + ;(this.N = !1), this.O && ((this.O = !1), b(this.expireEntries())) + } + async updateTimestamp(t) { + await this.P.setTimestamp(t, Date.now()) + } + async isURLExpired(t) { + if (this.k) { + const e = await this.P.getTimestamp(t), + s = Date.now() - 1e3 * this.k + return void 0 === e || e < s + } + return !1 + } + async delete() { + ;(this.O = !1), await this.P.expireEntries(1 / 0) + } + } + try { + self['workbox:range-requests:6.4.1'] && _() + } catch (t) {} + async function H(t, e) { + try { + if (206 === e.status) return e + const n = t.headers.get('range') + if (!n) throw new s('no-range-header') + const r = (function (t) { + const e = t.trim().toLowerCase() + if (!e.startsWith('bytes=')) + throw new s('unit-must-be-bytes', { normalizedRangeHeader: e }) + if (e.includes(',')) + throw new s('single-range-only', { normalizedRangeHeader: e }) + const n = /(\d*)-(\d*)/.exec(e) + if (!n || (!n[1] && !n[2])) + throw new s('invalid-range-values', { normalizedRangeHeader: e }) + return { + start: '' === n[1] ? void 0 : Number(n[1]), + end: '' === n[2] ? void 0 : Number(n[2]), + } + })(n), + i = await e.blob(), + a = (function (t, e, n) { + const r = t.size + if ((n && n > r) || (e && e < 0)) + throw new s('range-not-satisfiable', { size: r, end: n, start: e }) + let i, a + return ( + void 0 !== e && void 0 !== n + ? ((i = e), (a = n + 1)) + : void 0 !== e && void 0 === n + ? ((i = e), (a = r)) + : void 0 !== n && void 0 === e && ((i = r - n), (a = r)), + { start: i, end: a } + ) + })(i, r.start, r.end), + o = i.slice(a.start, a.end), + c = o.size, + h = new Response(o, { + status: 206, + statusText: 'Partial Content', + headers: e.headers, + }) + return ( + h.headers.set('Content-Length', String(c)), + h.headers.set( + 'Content-Range', + `bytes ${a.start}-${a.end - 1}/${i.size}`, + ), + h + ) + } catch (t) { + return new Response('', { + status: 416, + statusText: 'Range Not Satisfiable', + }) + } + } + function $(t, e) { + const s = e() + return t.waitUntil(s), s + } + try { + self['workbox:precaching:6.4.1'] && _() + } catch (t) {} + function z(t) { + if (!t) throw new s('add-to-cache-list-unexpected-type', { entry: t }) + if ('string' == typeof t) { + const e = new URL(t, location.href) + return { cacheKey: e.href, url: e.href } + } + const { revision: e, url: n } = t + if (!n) throw new s('add-to-cache-list-unexpected-type', { entry: t }) + if (!e) { + const t = new URL(n, location.href) + return { cacheKey: t.href, url: t.href } + } + const r = new URL(n, location.href), + i = new URL(n, location.href) + return ( + r.searchParams.set('__WB_REVISION__', e), + { cacheKey: r.href, url: i.href } + ) + } + class G { + constructor() { + ;(this.updatedURLs = []), + (this.notUpdatedURLs = []), + (this.handlerWillStart = async ({ request: t, state: e }) => { + e && (e.originalRequest = t) + }), + (this.cachedResponseWillBeUsed = async ({ + event: t, + state: e, + cachedResponse: s, + }) => { + if ( + 'install' === t.type && + e && + e.originalRequest && + e.originalRequest instanceof Request + ) { + const t = e.originalRequest.url + s ? this.notUpdatedURLs.push(t) : this.updatedURLs.push(t) + } + return s + }) + } + } + class V { + constructor({ precacheController: t }) { + ;(this.cacheKeyWillBeUsed = async ({ request: t, params: e }) => { + const s = + (null == e ? void 0 : e.cacheKey) || this.M.getCacheKeyForURL(t.url) + return s ? new Request(s, { headers: t.headers }) : t + }), + (this.M = t) + } + } + let J, Q + async function X(t, e) { + let n = null + if (t.url) { + n = new URL(t.url).origin + } + if (n !== self.location.origin) + throw new s('cross-origin-copy-response', { origin: n }) + const r = t.clone(), + i = { + headers: new Headers(r.headers), + status: r.status, + statusText: r.statusText, + }, + a = e ? e(i) : i, + o = (function () { + if (void 0 === J) { + const t = new Response('') + if ('body' in t) + try { + new Response(t.body), (J = !0) + } catch (t) { + J = !1 + } + J = !1 + } + return J + })() + ? r.body + : await r.blob() + return new Response(o, a) + } + class Y extends v { + constructor(t = {}) { + ;(t.cacheName = w(t.cacheName)), + super(t), + (this.W = !1 !== t.fallbackToNetwork), + this.plugins.push(Y.copyRedirectedCacheableResponsesPlugin) + } + async D(t, e) { + const s = await e.cacheMatch(t) + return ( + s || + (e.event && 'install' === e.event.type + ? await this.j(t, e) + : await this.S(t, e)) + ) + } + async S(t, e) { + let n + const r = e.params || {} + if (!this.W) + throw new s('missing-precache-entry', { + cacheName: this.cacheName, + url: t.url, + }) + { + const s = r.integrity, + i = t.integrity, + a = !i || i === s + ;(n = await e.fetch(new Request(t, { integrity: i || s }))), + s && a && (this.K(), await e.cachePut(t, n.clone())) + } + return n + } + async j(t, e) { + this.K() + const n = await e.fetch(t) + if (!(await e.cachePut(t, n.clone()))) + throw new s('bad-precaching-response', { url: t.url, status: n.status }) + return n + } + K() { + let t = null, + e = 0 + for (const [s, n] of this.plugins.entries()) + n !== Y.copyRedirectedCacheableResponsesPlugin && + (n === Y.defaultPrecacheCacheabilityPlugin && (t = s), + n.cacheWillUpdate && e++) + 0 === e + ? this.plugins.push(Y.defaultPrecacheCacheabilityPlugin) + : e > 1 && null !== t && this.plugins.splice(t, 1) + } + } + ;(Y.defaultPrecacheCacheabilityPlugin = { + cacheWillUpdate: async ({ response: t }) => + !t || t.status >= 400 ? null : t, + }), + (Y.copyRedirectedCacheableResponsesPlugin = { + cacheWillUpdate: async ({ response: t }) => + t.redirected ? await X(t) : t, + }) + class Z { + constructor({ + cacheName: t, + plugins: e = [], + fallbackToNetwork: s = !0, + } = {}) { + ;(this.A = new Map()), + (this.F = new Map()), + (this.H = new Map()), + (this.u = new Y({ + cacheName: w(t), + plugins: [...e, new V({ precacheController: this })], + fallbackToNetwork: s, + })), + (this.install = this.install.bind(this)), + (this.activate = this.activate.bind(this)) + } + get strategy() { + return this.u + } + precache(t) { + this.addToCacheList(t), + this.$ || + (self.addEventListener('install', this.install), + self.addEventListener('activate', this.activate), + (this.$ = !0)) + } + addToCacheList(t) { + const e = [] + for (const n of t) { + 'string' == typeof n + ? e.push(n) + : n && void 0 === n.revision && e.push(n.url) + const { cacheKey: t, url: r } = z(n), + i = 'string' != typeof n && n.revision ? 'reload' : 'default' + if (this.A.has(r) && this.A.get(r) !== t) + throw new s('add-to-cache-list-conflicting-entries', { + firstEntry: this.A.get(r), + secondEntry: t, + }) + if ('string' != typeof n && n.integrity) { + if (this.H.has(t) && this.H.get(t) !== n.integrity) + throw new s('add-to-cache-list-conflicting-integrities', { url: r }) + this.H.set(t, n.integrity) + } + if ((this.A.set(r, t), this.F.set(r, i), e.length > 0)) { + const t = `Workbox is precaching URLs without revision info: ${e.join( + ', ', + )}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache` + console.warn(t) + } + } + } + install(t) { + return $(t, async () => { + const e = new G() + this.strategy.plugins.push(e) + for (const [e, s] of this.A) { + const n = this.H.get(s), + r = this.F.get(e), + i = new Request(e, { + integrity: n, + cache: r, + credentials: 'same-origin', + }) + await Promise.all( + this.strategy.handleAll({ + params: { cacheKey: s }, + request: i, + event: t, + }), + ) + } + const { updatedURLs: s, notUpdatedURLs: n } = e + return { updatedURLs: s, notUpdatedURLs: n } + }) + } + activate(t) { + return $(t, async () => { + const t = await self.caches.open(this.strategy.cacheName), + e = await t.keys(), + s = new Set(this.A.values()), + n = [] + for (const r of e) s.has(r.url) || (await t.delete(r), n.push(r.url)) + return { deletedURLs: n } + }) + } + getURLsToCacheKeys() { + return this.A + } + getCachedURLs() { + return [...this.A.keys()] + } + getCacheKeyForURL(t) { + const e = new URL(t, location.href) + return this.A.get(e.href) + } + getIntegrityForCacheKey(t) { + return this.H.get(t) + } + async matchPrecache(t) { + const e = t instanceof Request ? t.url : t, + s = this.getCacheKeyForURL(e) + if (s) { + return (await self.caches.open(this.strategy.cacheName)).match(s) + } + } + createHandlerBoundToURL(t) { + const e = this.getCacheKeyForURL(t) + if (!e) throw new s('non-precached-url', { url: t }) + return (s) => ( + (s.request = new Request(t)), + (s.params = Object.assign({ cacheKey: e }, s.params)), + this.strategy.handle(s) + ) + } + } + const tt = () => (Q || (Q = new Z()), Q) + class et extends r { + constructor(t, e) { + super(({ request: s }) => { + const n = t.getURLsToCacheKeys() + for (const r of (function* ( + t, + { + ignoreURLParametersMatching: e = [/^utm_/, /^fbclid$/], + directoryIndex: s = 'index.html', + cleanURLs: n = !0, + urlManipulation: r, + } = {}, + ) { + const i = new URL(t, location.href) + ;(i.hash = ''), yield i.href + const a = (function (t, e = []) { + for (const s of [...t.searchParams.keys()]) + e.some((t) => t.test(s)) && t.searchParams.delete(s) + return t + })(i, e) + if ((yield a.href, s && a.pathname.endsWith('/'))) { + const t = new URL(a.href) + ;(t.pathname += s), yield t.href + } + if (n) { + const t = new URL(a.href) + ;(t.pathname += '.html'), yield t.href + } + if (r) { + const t = r({ url: i }) + for (const e of t) yield e.href + } + })(s.url, e)) { + const e = n.get(r) + if (e) { + return { cacheKey: e, integrity: t.getIntegrityForCacheKey(e) } + } + } + }, t.strategy) + } + } + ;(t.CacheFirst = class extends v { + async D(t, e) { + let n, + r = await e.cacheMatch(t) + if (!r) + try { + r = await e.fetchAndCachePut(t) + } catch (t) { + t instanceof Error && (n = t) + } + if (!r) throw new s('no-response', { url: t.url, error: n }) + return r + } + }), + (t.ExpirationPlugin = class { + constructor(t = {}) { + ;(this.cachedResponseWillBeUsed = async ({ + event: t, + request: e, + cacheName: s, + cachedResponse: n, + }) => { + if (!n) return null + const r = this.G(n), + i = this.V(s) + b(i.expireEntries()) + const a = i.updateTimestamp(e.url) + if (t) + try { + t.waitUntil(a) + } catch (t) {} + return r ? n : null + }), + (this.cacheDidUpdate = async ({ cacheName: t, request: e }) => { + const s = this.V(t) + await s.updateTimestamp(e.url), await s.expireEntries() + }), + (this.J = t), + (this.k = t.maxAgeSeconds), + (this.X = new Map()), + t.purgeOnQuotaError && + (function (t) { + g.add(t) + })(() => this.deleteCacheAndMetadata()) + } + V(t) { + if (t === d()) throw new s('expire-custom-caches-only') + let e = this.X.get(t) + return e || ((e = new F(t, this.J)), this.X.set(t, e)), e + } + G(t) { + if (!this.k) return !0 + const e = this.Y(t) + if (null === e) return !0 + return e >= Date.now() - 1e3 * this.k + } + Y(t) { + if (!t.headers.has('date')) return null + const e = t.headers.get('date'), + s = new Date(e).getTime() + return isNaN(s) ? null : s + } + async deleteCacheAndMetadata() { + for (const [t, e] of this.X) + await self.caches.delete(t), await e.delete() + this.X = new Map() + } + }), + (t.NetworkFirst = class extends v { + constructor(t = {}) { + super(t), + this.plugins.some((t) => 'cacheWillUpdate' in t) || + this.plugins.unshift(u), + (this.Z = t.networkTimeoutSeconds || 0) + } + async D(t, e) { + const n = [], + r = [] + let i + if (this.Z) { + const { id: s, promise: a } = this.tt({ + request: t, + logs: n, + handler: e, + }) + ;(i = s), r.push(a) + } + const a = this.et({ timeoutId: i, request: t, logs: n, handler: e }) + r.push(a) + const o = await e.waitUntil( + (async () => (await e.waitUntil(Promise.race(r))) || (await a))(), + ) + if (!o) throw new s('no-response', { url: t.url }) + return o + } + tt({ request: t, logs: e, handler: s }) { + let n + return { + promise: new Promise((e) => { + n = setTimeout(async () => { + e(await s.cacheMatch(t)) + }, 1e3 * this.Z) + }), + id: n, + } + } + async et({ timeoutId: t, request: e, logs: s, handler: n }) { + let r, i + try { + i = await n.fetchAndCachePut(e) + } catch (t) { + t instanceof Error && (r = t) + } + return t && clearTimeout(t), (!r && i) || (i = await n.cacheMatch(e)), i + } + }), + (t.RangeRequestsPlugin = class { + constructor() { + this.cachedResponseWillBeUsed = async ({ + request: t, + cachedResponse: e, + }) => (e && t.headers.has('range') ? await H(t, e) : e) + } + }), + (t.StaleWhileRevalidate = class extends v { + constructor(t = {}) { + super(t), + this.plugins.some((t) => 'cacheWillUpdate' in t) || + this.plugins.unshift(u) + } + async D(t, e) { + const n = e.fetchAndCachePut(t).catch(() => {}) + let r, + i = await e.cacheMatch(t) + if (i); + else + try { + i = await n + } catch (t) { + t instanceof Error && (r = t) + } + if (!i) throw new s('no-response', { url: t.url, error: r }) + return i + } + }), + (t.cleanupOutdatedCaches = function () { + self.addEventListener('activate', (t) => { + const e = w() + t.waitUntil( + (async (t, e = '-precache-') => { + const s = (await self.caches.keys()).filter( + (s) => + s.includes(e) && s.includes(self.registration.scope) && s !== t, + ) + return await Promise.all(s.map((t) => self.caches.delete(t))), s + })(e).then((t) => {}), + ) + }) + }), + (t.clientsClaim = function () { + self.addEventListener('activate', () => self.clients.claim()) + }), + (t.precacheAndRoute = function (t, e) { + !(function (t) { + tt().precache(t) + })(t), + (function (t) { + const e = tt() + h(new et(e, t)) + })(e) + }), + (t.registerRoute = h) +}) +//# sourceMappingURL=workbox-a7787ddd.js.map diff --git a/public/workbox-a7787ddd.js.map b/public/workbox-a7787ddd.js.map new file mode 100644 index 000000000..411aa899f --- /dev/null +++ b/public/workbox-a7787ddd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-a7787ddd.js","sources":["node_modules/next-pwa/node_modules/workbox-core/_version.js","node_modules/next-pwa/node_modules/workbox-core/_private/logger.js","node_modules/next-pwa/node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/next-pwa/node_modules/workbox-core/_private/WorkboxError.js","node_modules/next-pwa/node_modules/workbox-routing/_version.js","node_modules/next-pwa/node_modules/workbox-routing/utils/constants.js","node_modules/next-pwa/node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/next-pwa/node_modules/workbox-routing/Route.js","node_modules/next-pwa/node_modules/workbox-routing/RegExpRoute.js","node_modules/next-pwa/node_modules/workbox-routing/Router.js","node_modules/next-pwa/node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/next-pwa/node_modules/workbox-routing/registerRoute.js","node_modules/next-pwa/node_modules/workbox-strategies/_version.js","node_modules/next-pwa/node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/next-pwa/node_modules/workbox-core/_private/cacheNames.js","node_modules/next-pwa/node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/next-pwa/node_modules/workbox-core/_private/Deferred.js","node_modules/next-pwa/node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/next-pwa/node_modules/workbox-strategies/StrategyHandler.js","node_modules/next-pwa/node_modules/workbox-core/_private/timeout.js","node_modules/next-pwa/node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/next-pwa/node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/next-pwa/node_modules/workbox-strategies/Strategy.js","node_modules/next-pwa/node_modules/workbox-core/_private/dontWaitFor.js","node_modules/idb/build/esm/wrap-idb-value.js","node_modules/idb/build/esm/index.js","node_modules/next-pwa/node_modules/workbox-expiration/_version.js","node_modules/next-pwa/node_modules/workbox-expiration/models/CacheTimestampsModel.js","node_modules/next-pwa/node_modules/workbox-expiration/CacheExpiration.js","node_modules/next-pwa/node_modules/workbox-range-requests/_version.js","node_modules/next-pwa/node_modules/workbox-range-requests/createPartialResponse.js","node_modules/next-pwa/node_modules/workbox-range-requests/utils/parseRangeHeader.js","node_modules/next-pwa/node_modules/workbox-range-requests/utils/calculateEffectiveBoundaries.js","node_modules/next-pwa/node_modules/workbox-core/_private/waitUntil.js","node_modules/next-pwa/node_modules/workbox-precaching/_version.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/createCacheKey.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js","node_modules/next-pwa/node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js","node_modules/next-pwa/node_modules/workbox-core/copyResponse.js","node_modules/next-pwa/node_modules/workbox-precaching/PrecacheStrategy.js","node_modules/next-pwa/node_modules/workbox-precaching/PrecacheController.js","node_modules/next-pwa/node_modules/workbox-precaching/PrecacheRoute.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/generateURLVariations.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js","node_modules/next-pwa/node_modules/workbox-strategies/CacheFirst.js","node_modules/next-pwa/node_modules/workbox-expiration/ExpirationPlugin.js","node_modules/next-pwa/node_modules/workbox-core/registerQuotaErrorCallback.js","node_modules/next-pwa/node_modules/workbox-strategies/NetworkFirst.js","node_modules/next-pwa/node_modules/workbox-range-requests/RangeRequestsPlugin.js","node_modules/next-pwa/node_modules/workbox-strategies/StaleWhileRevalidate.js","node_modules/next-pwa/node_modules/workbox-precaching/cleanupOutdatedCaches.js","node_modules/next-pwa/node_modules/workbox-precaching/utils/deleteOutdatedCaches.js","node_modules/next-pwa/node_modules/workbox-core/clientsClaim.js","node_modules/next-pwa/node_modules/workbox-precaching/precacheAndRoute.js","node_modules/next-pwa/node_modules/workbox-precaching/precache.js","node_modules/next-pwa/node_modules/workbox-precaching/addRoute.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production'\n ? null\n : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in self)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null, // No colored prefix on groupEnd\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n // eslint-disable-next-line @typescript-eslint/ban-types\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n })());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = process.env.NODE_ENV === 'production' ? fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof module:workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {module:workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {module:workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link module:workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof module:workbox-routing\n * @extends module:workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * [handler's]{@link module:workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if (url.origin !== location.origin && result.index !== 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` +\n `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link module:workbox-routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof module:workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n // event.data is type 'any'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (event.data && event.data.type === 'CACHE_URLS') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n void requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event, }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([`Found a route to handle this request:`, route]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`,\n params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise &&\n (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n if (catchErr instanceof Error) {\n err = catchErr;\n }\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event, }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n // route.match returns type any, not possible to change right now.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do.\n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params = matchResult;\n if (Array.isArray(params) && params.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if (matchResult.constructor === Object && // eslint-disable-line\n Object.keys(matchResult).length === 0) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Route } from './Route.js';\nimport { RegExpRoute } from './RegExpRoute.js';\nimport { getOrCreateDefaultRouter } from './utils/getOrCreateDefaultRouter.js';\nimport './_version.js';\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call [registerRoute()]{@link module:workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|module:workbox-routing.Route~matchCallback|module:workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {module:workbox-routing~handlerCallback} [handler] A callback\n * function that returns a Promise resulting in a Response. This parameter\n * is required if `capture` is not a `Route` object.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {module:workbox-routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @memberof module:workbox-routing\n */\nfunction registerRoute(capture, handler, method) {\n let route;\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location.href);\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http')\n ? captureUrl.pathname\n : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (new RegExp(`${wildcards}`).exec(valueToCheck)) {\n logger.debug(`The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n const matchCallback = ({ url }) => {\n if (process.env.NODE_ENV !== 'production') {\n if (url.pathname === captureUrl.pathname &&\n url.origin !== captureUrl.origin) {\n logger.debug(`${capture} only partially matches the cross-origin URL ` +\n `${url.toString()}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n return url.href === captureUrl.href;\n };\n // If `capture` is a string then `handler` and `method` must be present.\n route = new Route(matchCallback, handler, method);\n }\n else if (capture instanceof RegExp) {\n // If `capture` is a `RegExp` then `handler` and `method` must be present.\n route = new RegExpRoute(capture, handler, method);\n }\n else if (typeof capture === 'function') {\n // If `capture` is a function then `handler` and `method` must be present.\n route = new Route(capture, handler, method);\n }\n else if (capture instanceof Route) {\n route = capture;\n }\n else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n return route;\n}\nexport { registerRoute };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\n// Can't change Function type right now.\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return typeof input === 'string' ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * [handle()]{@link module:workbox-strategies.Strategy~handle} or\n * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof module:workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {module:workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * [match callback]{@link module:workbox-routing~matchCallback},\n * (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * [match callback]{@link module:workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = (await event.preloadResponse);\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail')\n ? request.clone()\n : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n if (err instanceof Error) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownErrorMessage: err.message,\n });\n }\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error: error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n void this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse =\n (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n // See https://github.com/GoogleChrome/workbox/issues/2818\n const vary = response.headers.get('Vary');\n if (vary) {\n logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` +\n `has a 'Vary: ${vary}' header. ` +\n `Consider setting the {ignoreVary: true} option on your strategy ` +\n `to ensure cache matching and deletion works as expected.`);\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback\n ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions)\n : null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache);\n }\n catch (error) {\n if (error instanceof Error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n const key = `${request.url} | ${mode}`;\n if (!this._cacheKeys[key]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n // params has a type any can't change right now.\n params: this.params, // eslint-disable-line\n }));\n }\n this._cacheKeys[key] = effectiveRequest;\n }\n return this._cacheKeys[key];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = Object.assign(Object.assign({}, param), { state });\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while ((promise = this._extendLifetimePromises.shift())) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve(null);\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache =\n (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof module:workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof module:workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * [route]{@link module:workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of [response, done] promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string'\n ? new Request(options.request)\n : options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n if (error instanceof Error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\n }\n }\n if (!response) {\n throw error;\n }\n else if (process.env.NODE_ENV !== 'production') {\n logger.log(`While responding to '${getFriendlyURL(request.url)}', ` +\n `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` +\n `a handlerDidError plugin.`);\n }\n }\n for (const callback of handler.iterateCallbacks('handlerWillRespond')) {\n response = await callback({ event, request, response });\n }\n return response;\n }\n async _awaitComplete(responseDone, handler, request, event) {\n let response;\n let error;\n try {\n response = await responseDone;\n }\n catch (error) {\n // Ignore errors, as response errors should be caught via the `response`\n // promise above. The `done` promise will only throw for errors in\n // promises passed to `handler.waitUntil()`.\n }\n try {\n await handler.runCallbacks('handlerDidRespond', {\n event,\n request,\n response,\n });\n await handler.doneWaiting();\n }\n catch (waitUntilError) {\n if (waitUntilError instanceof Error) {\n error = waitUntilError;\n }\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error: error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {module:workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof module:workbox-strategies.Strategy\n */\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A helper function that prevents a promise from being flagged as unused.\n *\n * @private\n **/\nexport function dontWaitFor(promise) {\n // Effective no-op.\n void promise.then(() => { });\n}\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:expiration:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { openDB, deleteDB } from 'idb';\nimport '../_version.js';\nconst DB_NAME = 'workbox-expiration';\nconst CACHE_OBJECT_STORE = 'cache-entries';\nconst normalizeURL = (unNormalizedUrl) => {\n const url = new URL(unNormalizedUrl, location.href);\n url.hash = '';\n return url.href;\n};\n/**\n * Returns the timestamp model.\n *\n * @private\n */\nclass CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n this._db = null;\n this._cacheName = cacheName;\n }\n /**\n * Performs an upgrade of indexedDB.\n *\n * @param {IDBPDatabase} db\n *\n * @private\n */\n _upgradeDb(db) {\n // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we\n // have to use the `id` keyPath here and create our own values (a\n // concatenation of `url + cacheName`) instead of simply using\n // `keyPath: ['url', 'cacheName']`, which is supported in other browsers.\n const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { keyPath: 'id' });\n // TODO(philipwalton): once we don't have to support EdgeHTML, we can\n // create a single index with the keyPath `['cacheName', 'timestamp']`\n // instead of doing both these indexes.\n objStore.createIndex('cacheName', 'cacheName', { unique: false });\n objStore.createIndex('timestamp', 'timestamp', { unique: false });\n }\n /**\n * Performs an upgrade of indexedDB and deletes deprecated DBs.\n *\n * @param {IDBPDatabase} db\n *\n * @private\n */\n _upgradeDbAndDeleteOldDbs(db) {\n this._upgradeDb(db);\n if (this._cacheName) {\n void deleteDB(this._cacheName);\n }\n }\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n async setTimestamp(url, timestamp) {\n url = normalizeURL(url);\n const entry = {\n url,\n timestamp,\n cacheName: this._cacheName,\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n id: this._getId(url),\n };\n const db = await this.getDb();\n const tx = db.transaction(CACHE_OBJECT_STORE, 'readwrite', {\n durability: 'relaxed',\n });\n await tx.store.put(entry);\n await tx.done;\n }\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number | undefined}\n *\n * @private\n */\n async getTimestamp(url) {\n const db = await this.getDb();\n const entry = await db.get(CACHE_OBJECT_STORE, this._getId(url));\n return entry === null || entry === void 0 ? void 0 : entry.timestamp;\n }\n /**\n * Iterates through all the entries in the object store (from newest to\n * oldest) and removes entries once either `maxCount` is reached or the\n * entry's timestamp is less than `minTimestamp`.\n *\n * @param {number} minTimestamp\n * @param {number} maxCount\n * @return {Array}\n *\n * @private\n */\n async expireEntries(minTimestamp, maxCount) {\n const db = await this.getDb();\n let cursor = await db\n .transaction(CACHE_OBJECT_STORE)\n .store.index('timestamp')\n .openCursor(null, 'prev');\n const entriesToDelete = [];\n let entriesNotDeletedCount = 0;\n while (cursor) {\n const result = cursor.value;\n // TODO(philipwalton): once we can use a multi-key index, we\n // won't have to check `cacheName` here.\n if (result.cacheName === this._cacheName) {\n // Delete an entry if it's older than the max age or\n // if we already have the max number allowed.\n if ((minTimestamp && result.timestamp < minTimestamp) ||\n (maxCount && entriesNotDeletedCount >= maxCount)) {\n // TODO(philipwalton): we should be able to delete the\n // entry right here, but doing so causes an iteration\n // bug in Safari stable (fixed in TP). Instead we can\n // store the keys of the entries to delete, and then\n // delete the separate transactions.\n // https://github.com/GoogleChrome/workbox/issues/1978\n // cursor.delete();\n // We only need to return the URL, not the whole entry.\n entriesToDelete.push(cursor.value);\n }\n else {\n entriesNotDeletedCount++;\n }\n }\n cursor = await cursor.continue();\n }\n // TODO(philipwalton): once the Safari bug in the following issue is fixed,\n // we should be able to remove this loop and do the entry deletion in the\n // cursor loop above:\n // https://github.com/GoogleChrome/workbox/issues/1978\n const urlsDeleted = [];\n for (const entry of entriesToDelete) {\n await db.delete(CACHE_OBJECT_STORE, entry.id);\n urlsDeleted.push(entry.url);\n }\n return urlsDeleted;\n }\n /**\n * Takes a URL and returns an ID that will be unique in the object store.\n *\n * @param {string} url\n * @return {string}\n *\n * @private\n */\n _getId(url) {\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n return this._cacheName + '|' + normalizeURL(url);\n }\n /**\n * Returns an open connection to the database.\n *\n * @private\n */\n async getDb() {\n if (!this._db) {\n this._db = await openDB(DB_NAME, 1, {\n upgrade: this._upgradeDbAndDeleteOldDbs.bind(this),\n });\n }\n return this._db;\n }\n}\nexport { CacheTimestampsModel };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheTimestampsModel } from './models/CacheTimestampsModel.js';\nimport './_version.js';\n/**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof module:workbox-expiration\n */\nclass CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n */\n constructor(cacheName, config = {}) {\n this._isRunning = false;\n this._rerunRequested = false;\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName',\n });\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._matchOptions = config.matchOptions;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n /**\n * Expires entries for the given cache and given criteria.\n */\n async expireEntries() {\n if (this._isRunning) {\n this._rerunRequested = true;\n return;\n }\n this._isRunning = true;\n const minTimestamp = this._maxAgeSeconds\n ? Date.now() - this._maxAgeSeconds * 1000\n : 0;\n const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);\n // Delete URLs from the cache\n const cache = await self.caches.open(this._cacheName);\n for (const url of urlsExpired) {\n await cache.delete(url, this._matchOptions);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (urlsExpired.length > 0) {\n logger.groupCollapsed(`Expired ${urlsExpired.length} ` +\n `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` +\n `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` +\n `'${this._cacheName}' cache.`);\n logger.log(`Expired the following ${urlsExpired.length === 1 ? 'URL' : 'URLs'}:`);\n urlsExpired.forEach((url) => logger.log(` ${url}`));\n logger.groupEnd();\n }\n else {\n logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n this._isRunning = false;\n if (this._rerunRequested) {\n this._rerunRequested = false;\n dontWaitFor(this.expireEntries());\n }\n }\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n async updateTimestamp(url) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(url, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url',\n });\n }\n await this._timestampModel.setTimestamp(url, Date.now());\n }\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n async isURLExpired(url) {\n if (!this._maxAgeSeconds) {\n if (process.env.NODE_ENV !== 'production') {\n throw new WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds',\n });\n }\n return false;\n }\n else {\n const timestamp = await this._timestampModel.getTimestamp(url);\n const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000;\n return timestamp !== undefined ? timestamp < expireOlderThan : true;\n }\n }\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n async delete() {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n this._rerunRequested = false;\n await this._timestampModel.expireEntries(Infinity); // Expires all.\n }\n}\nexport { CacheExpiration };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:range-requests:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { calculateEffectiveBoundaries } from './utils/calculateEffectiveBoundaries.js';\nimport { parseRangeHeader } from './utils/parseRangeHeader.js';\nimport './_version.js';\n/**\n * Given a `Request` and `Response` objects as input, this will return a\n * promise for a new `Response`.\n *\n * If the original `Response` already contains partial content (i.e. it has\n * a status of 206), then this assumes it already fulfills the `Range:`\n * requirements, and will return it as-is.\n *\n * @param {Request} request A request, which should contain a Range:\n * header.\n * @param {Response} originalResponse A response.\n * @return {Promise} Either a `206 Partial Content` response, with\n * the response body set to the slice of content specified by the request's\n * `Range:` header, or a `416 Range Not Satisfiable` response if the\n * conditions of the `Range:` header can't be met.\n *\n * @memberof module:workbox-range-requests\n */\nasync function createPartialResponse(request, originalResponse) {\n try {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'request',\n });\n assert.isInstance(originalResponse, Response, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'originalResponse',\n });\n }\n if (originalResponse.status === 206) {\n // If we already have a 206, then just pass it through as-is;\n // see https://github.com/GoogleChrome/workbox/issues/1720\n return originalResponse;\n }\n const rangeHeader = request.headers.get('range');\n if (!rangeHeader) {\n throw new WorkboxError('no-range-header');\n }\n const boundaries = parseRangeHeader(rangeHeader);\n const originalBlob = await originalResponse.blob();\n const effectiveBoundaries = calculateEffectiveBoundaries(originalBlob, boundaries.start, boundaries.end);\n const slicedBlob = originalBlob.slice(effectiveBoundaries.start, effectiveBoundaries.end);\n const slicedBlobSize = slicedBlob.size;\n const slicedResponse = new Response(slicedBlob, {\n // Status code 206 is for a Partial Content response.\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206\n status: 206,\n statusText: 'Partial Content',\n headers: originalResponse.headers,\n });\n slicedResponse.headers.set('Content-Length', String(slicedBlobSize));\n slicedResponse.headers.set('Content-Range', `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` +\n `${originalBlob.size}`);\n return slicedResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to construct a partial response; returning a ` +\n `416 Range Not Satisfiable response instead.`);\n logger.groupCollapsed(`View details here.`);\n logger.log(error);\n logger.log(request);\n logger.log(originalResponse);\n logger.groupEnd();\n }\n return new Response('', {\n status: 416,\n statusText: 'Range Not Satisfiable',\n });\n }\n}\nexport { createPartialResponse };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {string} rangeHeader A Range: header value.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the parsed value of the Range: header. If either the `start` or `end` are\n * omitted, then `null` will be returned.\n *\n * @private\n */\nfunction parseRangeHeader(rangeHeader) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(rangeHeader, 'string', {\n moduleName: 'workbox-range-requests',\n funcName: 'parseRangeHeader',\n paramName: 'rangeHeader',\n });\n }\n const normalizedRangeHeader = rangeHeader.trim().toLowerCase();\n if (!normalizedRangeHeader.startsWith('bytes=')) {\n throw new WorkboxError('unit-must-be-bytes', { normalizedRangeHeader });\n }\n // Specifying multiple ranges separate by commas is valid syntax, but this\n // library only attempts to handle a single, contiguous sequence of bytes.\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax\n if (normalizedRangeHeader.includes(',')) {\n throw new WorkboxError('single-range-only', { normalizedRangeHeader });\n }\n const rangeParts = /(\\d*)-(\\d*)/.exec(normalizedRangeHeader);\n // We need either at least one of the start or end values.\n if (!rangeParts || !(rangeParts[1] || rangeParts[2])) {\n throw new WorkboxError('invalid-range-values', { normalizedRangeHeader });\n }\n return {\n start: rangeParts[1] === '' ? undefined : Number(rangeParts[1]),\n end: rangeParts[2] === '' ? undefined : Number(rangeParts[2]),\n };\n}\nexport { parseRangeHeader };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {Blob} blob A source blob.\n * @param {number} [start] The offset to use as the start of the\n * slice.\n * @param {number} [end] The offset to use as the end of the slice.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the effective boundaries to use given the size of the blob.\n *\n * @private\n */\nfunction calculateEffectiveBoundaries(blob, start, end) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(blob, Blob, {\n moduleName: 'workbox-range-requests',\n funcName: 'calculateEffectiveBoundaries',\n paramName: 'blob',\n });\n }\n const blobSize = blob.size;\n if ((end && end > blobSize) || (start && start < 0)) {\n throw new WorkboxError('range-not-satisfiable', {\n size: blobSize,\n end,\n start,\n });\n }\n let effectiveStart;\n let effectiveEnd;\n if (start !== undefined && end !== undefined) {\n effectiveStart = start;\n // Range values are inclusive, so add 1 to the value.\n effectiveEnd = end + 1;\n }\n else if (start !== undefined && end === undefined) {\n effectiveStart = start;\n effectiveEnd = blobSize;\n }\n else if (end !== undefined && start === undefined) {\n effectiveStart = blobSize - end;\n effectiveEnd = blobSize;\n }\n return {\n start: effectiveStart,\n end: effectiveEnd,\n };\n}\nexport { calculateEffectiveBoundaries };\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A utility method that makes it easier to use `event.waitUntil` with\n * async functions and return the result.\n *\n * @param {ExtendableEvent} event\n * @param {Function} asyncFn\n * @return {Function}\n * @private\n */\nfunction waitUntil(event, asyncFn) {\n const returnPromise = asyncFn();\n event.waitUntil(returnPromise);\n return returnPromise;\n}\nexport { waitUntil };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:precaching:6.4.1'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport '../_version.js';\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object|string} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n const { revision, url } = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const cacheKeyURL = new URL(url, location.href);\n const originalURL = new URL(url, location.href);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to determine the\n * of assets that were updated (or not updated) during the install event.\n *\n * @private\n */\nclass PrecacheInstallReportPlugin {\n constructor() {\n this.updatedURLs = [];\n this.notUpdatedURLs = [];\n this.handlerWillStart = async ({ request, state, }) => {\n // TODO: `state` should never be undefined...\n if (state) {\n state.originalRequest = request;\n }\n };\n this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse, }) => {\n if (event.type === 'install') {\n if (state &&\n state.originalRequest &&\n state.originalRequest instanceof Request) {\n // TODO: `state` should never be undefined...\n const url = state.originalRequest.url;\n if (cachedResponse) {\n this.notUpdatedURLs.push(url);\n }\n else {\n this.updatedURLs.push(url);\n }\n }\n }\n return cachedResponse;\n };\n }\n}\nexport { PrecacheInstallReportPlugin };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to translate URLs into\n * the corresponding cache key, based on the current revision info.\n *\n * @private\n */\nclass PrecacheCacheKeyPlugin {\n constructor({ precacheController }) {\n this.cacheKeyWillBeUsed = async ({ request, params, }) => {\n // Params is type any, can't change right now.\n /* eslint-disable */\n const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) ||\n this._precacheController.getCacheKeyForURL(request.url);\n /* eslint-enable */\n return cacheKey\n ? new Request(cacheKey, { headers: request.headers })\n : request;\n };\n this._precacheController = precacheController;\n }\n}\nexport { PrecacheCacheKeyPlugin };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nlet supportStatus;\n/**\n * A utility function that determines whether the current browser supports\n * constructing a new `Response` from a `response.body` stream.\n *\n * @return {boolean} `true`, if the current browser can successfully\n * construct a `Response` from a `response.body` stream, `false` otherwise.\n *\n * @private\n */\nfunction canConstructResponseFromBodyStream() {\n if (supportStatus === undefined) {\n const testResponse = new Response('');\n if ('body' in testResponse) {\n try {\n new Response(testResponse.body);\n supportStatus = true;\n }\n catch (error) {\n supportStatus = false;\n }\n }\n supportStatus = false;\n }\n return supportStatus;\n}\nexport { canConstructResponseFromBodyStream };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { PrecacheController } from '../PrecacheController.js';\nimport '../_version.js';\nlet precacheController;\n/**\n * @return {PrecacheController}\n * @private\n */\nexport const getOrCreatePrecacheController = () => {\n if (!precacheController) {\n precacheController = new PrecacheController();\n }\n return precacheController;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { canConstructResponseFromBodyStream } from './_private/canConstructResponseFromBodyStream.js';\nimport { WorkboxError } from './_private/WorkboxError.js';\nimport './_version.js';\n/**\n * Allows developers to copy a response and modify its `headers`, `status`,\n * or `statusText` values (the values settable via a\n * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax}\n * object in the constructor).\n * To modify these values, pass a function as the second argument. That\n * function will be invoked with a single object with the response properties\n * `{headers, status, statusText}`. The return value of this function will\n * be used as the `ResponseInit` for the new `Response`. To change the values\n * either modify the passed parameter(s) and return it, or return a totally\n * new object.\n *\n * This method is intentionally limited to same-origin responses, regardless of\n * whether CORS was used or not.\n *\n * @param {Response} response\n * @param {Function} modifier\n * @memberof module:workbox-core\n */\nasync function copyResponse(response, modifier) {\n let origin = null;\n // If response.url isn't set, assume it's cross-origin and keep origin null.\n if (response.url) {\n const responseURL = new URL(response.url);\n origin = responseURL.origin;\n }\n if (origin !== self.location.origin) {\n throw new WorkboxError('cross-origin-copy-response', { origin });\n }\n const clonedResponse = response.clone();\n // Create a fresh `ResponseInit` object by cloning the headers.\n const responseInit = {\n headers: new Headers(clonedResponse.headers),\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n };\n // Apply any user modifications.\n const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;\n // Create the new response from the body stream and `ResponseInit`\n // modifications. Note: not all browsers support the Response.body stream,\n // so fall back to reading the entire body into memory as a blob.\n const body = canConstructResponseFromBodyStream()\n ? clonedResponse.body\n : await clonedResponse.blob();\n return new Response(body, modifiedResponseInit);\n}\nexport { copyResponse };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { copyResponse } from 'workbox-core/copyResponse.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from 'workbox-strategies/Strategy.js';\nimport './_version.js';\n/**\n * A [Strategy]{@link module:workbox-strategies.Strategy} implementation\n * specifically designed to work with\n * [PrecacheController]{@link module:workbox-precaching.PrecacheController}\n * to both cache and fetch precached assets.\n *\n * Note: an instance of this class is created automatically when creating a\n * `PrecacheController`; it's generally not necessary to create this yourself.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-precaching\n */\nclass PrecacheStrategy extends Strategy {\n /**\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor(options = {}) {\n options.cacheName = cacheNames.getPrecacheName(options.cacheName);\n super(options);\n this._fallbackToNetwork =\n options.fallbackToNetwork === false ? false : true;\n // Redirected responses cannot be used to satisfy a navigation request, so\n // any redirected response must be \"copied\" rather than cloned, so the new\n // response doesn't contain the `redirected` flag. See:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1\n this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin);\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const response = await handler.cacheMatch(request);\n if (response) {\n return response;\n }\n // If this is an `install` event for an entry that isn't already cached,\n // then populate the cache.\n if (handler.event && handler.event.type === 'install') {\n return await this._handleInstall(request, handler);\n }\n // Getting here means something went wrong. An entry that should have been\n // precached wasn't found in the cache.\n return await this._handleFetch(request, handler);\n }\n async _handleFetch(request, handler) {\n let response;\n const params = (handler.params || {});\n // Fall back to the network if we're configured to do so.\n if (this._fallbackToNetwork) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`The precached response for ` +\n `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` +\n `found. Falling back to the network.`);\n }\n const integrityInManifest = params.integrity;\n const integrityInRequest = request.integrity;\n const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest;\n response = await handler.fetch(new Request(request, {\n integrity: integrityInRequest || integrityInManifest,\n }));\n // It's only \"safe\" to repair the cache if we're using SRI to guarantee\n // that the response matches the precache manifest's expectations,\n // and there's either a) no integrity property in the incoming request\n // or b) there is an integrity, and it matches the precache manifest.\n // See https://github.com/GoogleChrome/workbox/issues/2858\n if (integrityInManifest && noIntegrityConflict) {\n this._useDefaultCacheabilityPluginIfNeeded();\n const wasCached = await handler.cachePut(request, response.clone());\n if (process.env.NODE_ENV !== 'production') {\n if (wasCached) {\n logger.log(`A response for ${getFriendlyURL(request.url)} ` +\n `was used to \"repair\" the precache.`);\n }\n }\n }\n }\n else {\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new WorkboxError('missing-precache-entry', {\n cacheName: this.cacheName,\n url: request.url,\n });\n }\n if (process.env.NODE_ENV !== 'production') {\n const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read'));\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url));\n logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`);\n logger.groupCollapsed(`View request details here.`);\n logger.log(request);\n logger.groupEnd();\n logger.groupCollapsed(`View response details here.`);\n logger.log(response);\n logger.groupEnd();\n logger.groupEnd();\n }\n return response;\n }\n async _handleInstall(request, handler) {\n this._useDefaultCacheabilityPluginIfNeeded();\n const response = await handler.fetch(request);\n // Make sure we defer cachePut() until after we know the response\n // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737\n const wasCached = await handler.cachePut(request, response.clone());\n if (!wasCached) {\n // Throwing here will lead to the `install` handler failing, which\n // we want to do if *any* of the responses aren't safe to cache.\n throw new WorkboxError('bad-precaching-response', {\n url: request.url,\n status: response.status,\n });\n }\n return response;\n }\n /**\n * This method is complex, as there a number of things to account for:\n *\n * The `plugins` array can be set at construction, and/or it might be added to\n * to at any time before the strategy is used.\n *\n * At the time the strategy is used (i.e. during an `install` event), there\n * needs to be at least one plugin that implements `cacheWillUpdate` in the\n * array, other than `copyRedirectedCacheableResponsesPlugin`.\n *\n * - If this method is called and there are no suitable `cacheWillUpdate`\n * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.\n *\n * - If this method is called and there is exactly one `cacheWillUpdate`, then\n * we don't have to do anything (this might be a previously added\n * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).\n *\n * - If this method is called and there is more than one `cacheWillUpdate`,\n * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,\n * we need to remove it. (This situation is unlikely, but it could happen if\n * the strategy is used multiple times, the first without a `cacheWillUpdate`,\n * and then later on after manually adding a custom `cacheWillUpdate`.)\n *\n * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.\n *\n * @private\n */\n _useDefaultCacheabilityPluginIfNeeded() {\n let defaultPluginIndex = null;\n let cacheWillUpdatePluginCount = 0;\n for (const [index, plugin] of this.plugins.entries()) {\n // Ignore the copy redirected plugin when determining what to do.\n if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) {\n continue;\n }\n // Save the default plugin's index, in case it needs to be removed.\n if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) {\n defaultPluginIndex = index;\n }\n if (plugin.cacheWillUpdate) {\n cacheWillUpdatePluginCount++;\n }\n }\n if (cacheWillUpdatePluginCount === 0) {\n this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin);\n }\n else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) {\n // Only remove the default plugin; multiple custom plugins are allowed.\n this.plugins.splice(defaultPluginIndex, 1);\n }\n // Nothing needs to be done if cacheWillUpdatePluginCount is 1\n }\n}\nPrecacheStrategy.defaultPrecacheCacheabilityPlugin = {\n async cacheWillUpdate({ response }) {\n if (!response || response.status >= 400) {\n return null;\n }\n return response;\n },\n};\nPrecacheStrategy.copyRedirectedCacheableResponsesPlugin = {\n async cacheWillUpdate({ response }) {\n return response.redirected ? await copyResponse(response) : response;\n },\n};\nexport { PrecacheStrategy };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { waitUntil } from 'workbox-core/_private/waitUntil.js';\nimport { createCacheKey } from './utils/createCacheKey.js';\nimport { PrecacheInstallReportPlugin } from './utils/PrecacheInstallReportPlugin.js';\nimport { PrecacheCacheKeyPlugin } from './utils/PrecacheCacheKeyPlugin.js';\nimport { printCleanupDetails } from './utils/printCleanupDetails.js';\nimport { printInstallDetails } from './utils/printInstallDetails.js';\nimport { PrecacheStrategy } from './PrecacheStrategy.js';\nimport './_version.js';\n/**\n * Performs efficient precaching of assets.\n *\n * @memberof module:workbox-precaching\n */\nclass PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] The cache to use for precaching.\n * @param {string} [options.plugins] Plugins to use when precaching as well\n * as responding to fetch events for precached assets.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor({ cacheName, plugins = [], fallbackToNetwork = true, } = {}) {\n this._urlsToCacheKeys = new Map();\n this._urlsToCacheModes = new Map();\n this._cacheKeysToIntegrities = new Map();\n this._strategy = new PrecacheStrategy({\n cacheName: cacheNames.getPrecacheName(cacheName),\n plugins: [\n ...plugins,\n new PrecacheCacheKeyPlugin({ precacheController: this }),\n ],\n fallbackToNetwork,\n });\n // Bind the install and activate methods to the instance.\n this.install = this.install.bind(this);\n this.activate = this.activate.bind(this);\n }\n /**\n * @type {module:workbox-precaching.PrecacheStrategy} The strategy created by this controller and\n * used to cache assets and respond to fetch events.\n */\n get strategy() {\n return this._strategy;\n }\n /**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n */\n precache(entries) {\n this.addToCacheList(entries);\n if (!this._installAndActiveListenersAdded) {\n self.addEventListener('install', this.install);\n self.addEventListener('activate', this.activate);\n this._installAndActiveListenersAdded = true;\n }\n }\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {Array} entries\n * Array of entries to precache.\n */\n addToCacheList(entries) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries',\n });\n }\n const urlsToWarnAbout = [];\n for (const entry of entries) {\n // See https://github.com/GoogleChrome/workbox/issues/2259\n if (typeof entry === 'string') {\n urlsToWarnAbout.push(entry);\n }\n else if (entry && entry.revision === undefined) {\n urlsToWarnAbout.push(entry.url);\n }\n const { cacheKey, url } = createCacheKey(entry);\n const cacheMode = typeof entry !== 'string' && entry.revision ? 'reload' : 'default';\n if (this._urlsToCacheKeys.has(url) &&\n this._urlsToCacheKeys.get(url) !== cacheKey) {\n throw new WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: this._urlsToCacheKeys.get(url),\n secondEntry: cacheKey,\n });\n }\n if (typeof entry !== 'string' && entry.integrity) {\n if (this._cacheKeysToIntegrities.has(cacheKey) &&\n this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {\n throw new WorkboxError('add-to-cache-list-conflicting-integrities', {\n url,\n });\n }\n this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);\n }\n this._urlsToCacheKeys.set(url, cacheKey);\n this._urlsToCacheModes.set(url, cacheMode);\n if (urlsToWarnAbout.length > 0) {\n const warningMessage = `Workbox is precaching URLs without revision ` +\n `info: ${urlsToWarnAbout.join(', ')}\\nThis is generally NOT safe. ` +\n `Learn more at https://bit.ly/wb-precache`;\n if (process.env.NODE_ENV === 'production') {\n // Use console directly to display this warning without bloating\n // bundle sizes by pulling in all of the logger codebase in prod.\n console.warn(warningMessage);\n }\n else {\n logger.warn(warningMessage);\n }\n }\n }\n }\n /**\n * Precaches new and updated assets. Call this method from the service worker\n * install event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n install(event) {\n // waitUntil returns Promise\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return waitUntil(event, async () => {\n const installReportPlugin = new PrecacheInstallReportPlugin();\n this.strategy.plugins.push(installReportPlugin);\n // Cache entries one at a time.\n // See https://github.com/GoogleChrome/workbox/issues/2528\n for (const [url, cacheKey] of this._urlsToCacheKeys) {\n const integrity = this._cacheKeysToIntegrities.get(cacheKey);\n const cacheMode = this._urlsToCacheModes.get(url);\n const request = new Request(url, {\n integrity,\n cache: cacheMode,\n credentials: 'same-origin',\n });\n await Promise.all(this.strategy.handleAll({\n params: { cacheKey },\n request,\n event,\n }));\n }\n const { updatedURLs, notUpdatedURLs } = installReportPlugin;\n if (process.env.NODE_ENV !== 'production') {\n printInstallDetails(updatedURLs, notUpdatedURLs);\n }\n return { updatedURLs, notUpdatedURLs };\n });\n }\n /**\n * Deletes assets that are no longer present in the current precache manifest.\n * Call this method from the service worker activate event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n activate(event) {\n // waitUntil returns Promise\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return waitUntil(event, async () => {\n const cache = await self.caches.open(this.strategy.cacheName);\n const currentlyCachedRequests = await cache.keys();\n const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());\n const deletedURLs = [];\n for (const request of currentlyCachedRequests) {\n if (!expectedCacheKeys.has(request.url)) {\n await cache.delete(request);\n deletedURLs.push(request.url);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n printCleanupDetails(deletedURLs);\n }\n return { deletedURLs };\n });\n }\n /**\n * Returns a mapping of a precached URL to the corresponding cache key, taking\n * into account the revision information for the URL.\n *\n * @return {Map} A URL to cache key mapping.\n */\n getURLsToCacheKeys() {\n return this._urlsToCacheKeys;\n }\n /**\n * Returns a list of all the URLs that have been precached by the current\n * service worker.\n *\n * @return {Array} The precached URLs.\n */\n getCachedURLs() {\n return [...this._urlsToCacheKeys.keys()];\n }\n /**\n * Returns the cache key used for storing a given URL. If that URL is\n * unversioned, like `/index.html', then the cache key will be the original\n * URL with a search parameter appended to it.\n *\n * @param {string} url A URL whose cache key you want to look up.\n * @return {string} The versioned URL that corresponds to a cache key\n * for the original URL, or undefined if that URL isn't precached.\n */\n getCacheKeyForURL(url) {\n const urlObject = new URL(url, location.href);\n return this._urlsToCacheKeys.get(urlObject.href);\n }\n /**\n * @param {string} url A cache key whose SRI you want to look up.\n * @return {string} The subresource integrity associated with the cache key,\n * or undefined if it's not set.\n */\n getIntegrityForCacheKey(cacheKey) {\n return this._cacheKeysToIntegrities.get(cacheKey);\n }\n /**\n * This acts as a drop-in replacement for\n * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)\n * with the following differences:\n *\n * - It knows what the name of the precache is, and only checks in that cache.\n * - It allows you to pass in an \"original\" URL without versioning parameters,\n * and it will automatically look up the correct cache key for the currently\n * active revision of that URL.\n *\n * E.g., `matchPrecache('index.html')` will find the correct precached\n * response for the currently active service worker, even if the actual cache\n * key is `'/index.html?__WB_REVISION__=1234abcd'`.\n *\n * @param {string|Request} request The key (without revisioning parameters)\n * to look up in the precache.\n * @return {Promise}\n */\n async matchPrecache(request) {\n const url = request instanceof Request ? request.url : request;\n const cacheKey = this.getCacheKeyForURL(url);\n if (cacheKey) {\n const cache = await self.caches.open(this.strategy.cacheName);\n return cache.match(cacheKey);\n }\n return undefined;\n }\n /**\n * Returns a function that looks up `url` in the precache (taking into\n * account revision information), and returns the corresponding `Response`.\n *\n * @param {string} url The precached URL which will be used to lookup the\n * `Response`.\n * @return {module:workbox-routing~handlerCallback}\n */\n createHandlerBoundToURL(url) {\n const cacheKey = this.getCacheKeyForURL(url);\n if (!cacheKey) {\n throw new WorkboxError('non-precached-url', { url });\n }\n return (options) => {\n options.request = new Request(url);\n options.params = Object.assign({ cacheKey }, options.params);\n return this.strategy.handle(options);\n };\n }\n}\nexport { PrecacheController };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { Route } from 'workbox-routing/Route.js';\nimport { generateURLVariations } from './utils/generateURLVariations.js';\nimport './_version.js';\n/**\n * A subclass of [Route]{@link module:workbox-routing.Route} that takes a\n * [PrecacheController]{@link module:workbox-precaching.PrecacheController}\n * instance and uses it to match incoming requests and handle fetching\n * responses from the precache.\n *\n * @memberof module:workbox-precaching\n * @extends module:workbox-routing.Route\n */\nclass PrecacheRoute extends Route {\n /**\n * @param {PrecacheController} precacheController A `PrecacheController`\n * instance used to both match requests and respond to fetch events.\n * @param {Object} [options] Options to control how requests are matched\n * against the list of precached URLs.\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {module:workbox-precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URLs that should be checked for precache matches.\n */\n constructor(precacheController, options) {\n const match = ({ request, }) => {\n const urlsToCacheKeys = precacheController.getURLsToCacheKeys();\n for (const possibleURL of generateURLVariations(request.url, options)) {\n const cacheKey = urlsToCacheKeys.get(possibleURL);\n if (cacheKey) {\n const integrity = precacheController.getIntegrityForCacheKey(cacheKey);\n return { cacheKey, integrity };\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url));\n }\n return;\n };\n super(match, precacheController.strategy);\n }\n}\nexport { PrecacheRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { removeIgnoredSearchParams } from './removeIgnoredSearchParams.js';\nimport '../_version.js';\n/**\n * Generator function that yields possible variations on the original URL to\n * check, one at a time.\n *\n * @param {string} url\n * @param {Object} options\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function* generateURLVariations(url, { ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], directoryIndex = 'index.html', cleanURLs = true, urlManipulation, } = {}) {\n const urlObject = new URL(url, location.href);\n urlObject.hash = '';\n yield urlObject.href;\n const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);\n yield urlWithoutIgnoredParams.href;\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryURL = new URL(urlWithoutIgnoredParams.href);\n directoryURL.pathname += directoryIndex;\n yield directoryURL.href;\n }\n if (cleanURLs) {\n const cleanURL = new URL(urlWithoutIgnoredParams.href);\n cleanURL.pathname += '.html';\n yield cleanURL.href;\n }\n if (urlManipulation) {\n const additionalURLs = urlManipulation({ url: urlObject });\n for (const urlToAttempt of additionalURLs) {\n yield urlToAttempt.href;\n }\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Removes any URL search parameters that should be ignored.\n *\n * @param {URL} urlObject The original URL.\n * @param {Array} ignoreURLParametersMatching RegExps to test against\n * each search parameter name. Matches mean that the search parameter should be\n * ignored.\n * @return {URL} The URL with any ignored search parameters removed.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {\n // Convert the iterable into an array at the start of the loop to make sure\n // deletion doesn't mess up iteration.\n for (const paramName of [...urlObject.searchParams.keys()]) {\n if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {\n urlObject.searchParams.delete(paramName);\n }\n }\n return urlObject;\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network}\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass CacheFirst extends Strategy {\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n let response = await handler.cacheMatch(request);\n let error = undefined;\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this.cacheName}' cache. ` +\n `Will respond with a network request.`);\n }\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (err) {\n if (err instanceof Error) {\n error = err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this.cacheName}' cache.`);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { CacheFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { registerQuotaErrorCallback } from 'workbox-core/registerQuotaErrorCallback.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheExpiration } from './CacheExpiration.js';\nimport './_version.js';\n/**\n * This plugin can be used in a `workbox-strategy` to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * It can only be used with `workbox-strategy` instances that have a\n * [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies).\n * In other words, it can't be used to expire entries in strategy that uses the\n * default runtime cache name.\n *\n * Whenever a cached response is used or updated, this plugin will look\n * at the associated cache and remove any old or extra responses.\n *\n * When using `maxAgeSeconds`, responses may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached response has been used. If the response has a \"Date\" header, then\n * a light weight expiration check is performed and the response will not be\n * used immediately.\n *\n * When using `maxEntries`, the entry least-recently requested will be removed\n * from the cache first.\n *\n * @memberof module:workbox-expiration\n */\nclass ExpirationPlugin {\n /**\n * @param {ExpirationPluginOptions} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse, }) => {\n if (!cachedResponse) {\n return null;\n }\n const isFresh = this._isResponseDateFresh(cachedResponse);\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n dontWaitFor(cacheExpiration.expireEntries());\n // Update the metadata for the request URL to the current timestamp,\n // but don't `await` it as we don't want to block the response.\n const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);\n if (event) {\n try {\n event.waitUntil(updateTimestampDone);\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n // The event may not be a fetch event; only log the URL if it is.\n if ('request' in event) {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache entry for ` +\n `'${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n }\n return isFresh ? cachedResponse : null;\n };\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n this.cacheDidUpdate = async ({ cacheName, request, }) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n const cacheExpiration = this._getCacheExpiration(cacheName);\n await cacheExpiration.updateTimestamp(request.url);\n await cacheExpiration.expireEntries();\n };\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n if (config.purgeOnQuotaError) {\n registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames.getRuntimeName()) {\n throw new WorkboxError('expire-custom-caches-only');\n }\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;\n }\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number|null}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n return headerTime;\n }\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on your behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n async deleteCacheAndMetadata() {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of this._cacheExpirations) {\n await self.caches.delete(cacheName);\n await cacheExpiration.delete();\n }\n // Reset this._cacheExpirations to its initial state.\n this._cacheExpirations = new Map();\n }\n}\nexport { ExpirationPlugin };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from './_private/logger.js';\nimport { assert } from './_private/assert.js';\nimport { quotaErrorCallbacks } from './models/quotaErrorCallbacks.js';\nimport './_version.js';\n/**\n * Adds a function to the set of quotaErrorCallbacks that will be executed if\n * there's a quota error.\n *\n * @param {Function} callback\n * @memberof module:workbox-core\n */\n// Can't change Function type\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction registerQuotaErrorCallback(callback) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback',\n });\n }\n quotaErrorCallbacks.add(callback);\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered a callback to respond to quota errors.', callback);\n }\n}\nexport { registerQuotaErrorCallback };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({\n timeoutId,\n request,\n logs,\n handler,\n });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return ((await handler.waitUntil(Promise.race(promises))) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n (await networkPromise));\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler, }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler, }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n if (fetchError instanceof Error) {\n error = fetchError;\n }\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { createPartialResponse } from './createPartialResponse.js';\nimport './_version.js';\n/**\n * The range request plugin makes it easy for a request with a 'Range' header to\n * be fulfilled by a cached response.\n *\n * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback\n * and returning the appropriate subset of the cached response body.\n *\n * @memberof module:workbox-range-requests\n */\nclass RangeRequestsPlugin {\n constructor() {\n /**\n * @param {Object} options\n * @param {Request} options.request The original request, which may or may not\n * contain a Range: header.\n * @param {Response} options.cachedResponse The complete cached response.\n * @return {Promise} If request contains a 'Range' header, then a\n * new response with status 206 whose body is a subset of `cachedResponse` is\n * returned. Otherwise, `cachedResponse` is returned as-is.\n *\n * @private\n */\n this.cachedResponseWillBeUsed = async ({ request, cachedResponse, }) => {\n // Only return a sliced response if there's something valid in the cache,\n // and there's a Range: header in the request.\n if (cachedResponse && request.headers.has('range')) {\n return await createPartialResponse(request, cachedResponse);\n }\n // If there was no Range: header, or if cachedResponse wasn't valid, just\n // pass it through as-is.\n return cachedResponse;\n };\n }\n}\nexport { RangeRequestsPlugin };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate}\n * request strategy.\n *\n * Resources are requested from both the cache and the network in parallel.\n * The strategy will respond with the cached version if available, otherwise\n * wait for the network response. The cache is updated with the network response\n * with each successful request.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass StaleWhileRevalidate extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'request',\n });\n }\n const fetchAndCachePromise = handler.fetchAndCachePut(request).catch(() => {\n // Swallow this error because a 'no-response' error will be thrown in\n // main handler return flow. This will be in the `waitUntil()` flow.\n });\n let response = await handler.cacheMatch(request);\n let error;\n if (response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this.cacheName}'` +\n ` cache. Will update with the network response in the background.`);\n }\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this.cacheName}' cache. ` +\n `Will wait for the network response.`);\n }\n try {\n // NOTE(philipwalton): Really annoying that we have to type cast here.\n // https://github.com/microsoft/TypeScript/issues/20006\n response = (await fetchAndCachePromise);\n }\n catch (err) {\n if (err instanceof Error) {\n error = err;\n }\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { StaleWhileRevalidate };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { deleteOutdatedCaches } from './utils/deleteOutdatedCaches.js';\nimport './_version.js';\n/**\n * Adds an `activate` event listener which will clean up incompatible\n * precaches that were created by older versions of Workbox.\n *\n * @memberof module:workbox-precaching\n */\nfunction cleanupOutdatedCaches() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('activate', ((event) => {\n const cacheName = cacheNames.getPrecacheName();\n event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {\n if (process.env.NODE_ENV !== 'production') {\n if (cachesDeleted.length > 0) {\n logger.log(`The following out-of-date precaches were cleaned up ` +\n `automatically:`, cachesDeleted);\n }\n }\n }));\n }));\n}\nexport { cleanupOutdatedCaches };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst SUBSTRING_TO_FIND = '-precache-';\n/**\n * Cleans up incompatible precaches that were created by older versions of\n * Workbox, by a service worker registered under the current scope.\n *\n * This is meant to be called as part of the `activate` event.\n *\n * This should be safe to use as long as you don't include `substringToFind`\n * (defaulting to `-precache-`) in your non-precache cache names.\n *\n * @param {string} currentPrecacheName The cache name currently in use for\n * precaching. This cache won't be deleted.\n * @param {string} [substringToFind='-precache-'] Cache names which include this\n * substring will be deleted (excluding `currentPrecacheName`).\n * @return {Array} A list of all the cache names that were deleted.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nconst deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => {\n const cacheNames = await self.caches.keys();\n const cacheNamesToDelete = cacheNames.filter((cacheName) => {\n return (cacheName.includes(substringToFind) &&\n cacheName.includes(self.registration.scope) &&\n cacheName !== currentPrecacheName);\n });\n await Promise.all(cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)));\n return cacheNamesToDelete;\n};\nexport { deleteOutdatedCaches };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof module:workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { addRoute } from './addRoute.js';\nimport { precache } from './precache.js';\nimport './_version.js';\n/**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * [precache()]{@link module:workbox-precaching.precache} and\n * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} [options] See\n * [PrecacheRoute options]{@link module:workbox-precaching.PrecacheRoute}.\n *\n * @memberof module:workbox-precaching\n */\nfunction precacheAndRoute(entries, options) {\n precache(entries);\n addRoute(options);\n}\nexport { precacheAndRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport './_version.js';\n/**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you.\n * It only precaches files. To respond to a network request you call\n * [addRoute()]{@link module:workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n *\n * @memberof module:workbox-precaching\n */\nfunction precache(entries) {\n const precacheController = getOrCreatePrecacheController();\n precacheController.precache(entries);\n}\nexport { precache };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { registerRoute } from 'workbox-routing/registerRoute.js';\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport { PrecacheRoute } from './PrecacheRoute.js';\nimport './_version.js';\n/**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} [options] See\n * [PrecacheRoute options]{@link module:workbox-precaching.PrecacheRoute}.\n *\n * @memberof module:workbox-precaching\n */\nfunction addRoute(options) {\n const precacheController = getOrCreatePrecacheController();\n const precacheRoute = new PrecacheRoute(precacheController, options);\n registerRoute(precacheRoute);\n}\nexport { addRoute };\n"],"names":["self","_","e","messageGenerator","code","args","msg","length","JSON","stringify","WorkboxError","Error","constructor","errorCode","details","name","normalizeHandler","handler","handle","Route","match","method","setCatchHandler","catchHandler","RegExpRoute","regExp","url","result","exec","href","origin","location","index","slice","Router","_routes","Map","_defaultHandlerMap","routes","this","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","type","payload","requestPromises","Promise","all","urlsToCache","map","entry","Request","waitUntil","ports","then","postMessage","URL","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","has","get","err","reject","_catchHandler","catch","async","catchErr","matchResult","Array","isArray","Object","keys","undefined","setDefaultHandler","set","registerRoute","push","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","RegExp","moduleName","funcName","paramName","cacheOkAndOpaquePlugin","cacheWillUpdate","response","status","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","cacheName","filter","value","join","cacheNames","userCacheName","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","delete","Deferred","promise","resolve","quotaErrorCallbacks","Set","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","assign","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","thrownErrorMessage","message","pluginFilteredRequest","fetchResponse","fetch","fetchOptions","callback","error","runCallbacks","responseClone","cachePut","key","cachedResponse","matchOptions","effectiveRequest","getCacheKey","multiMatchOptions","caches","ms","setTimeout","String","replace","responseToCache","_ensureResponseSafeToCache","cache","open","hasCacheUpdateCallback","oldResponse","strippedRequestURL","keysOptions","ignoreSearch","cacheKeys","cacheKey","cacheMatchIgnoreParams","put","executeQuotaErrorCallbacks","newResponse","state","statefulCallback","statefulParam","shift","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","_awaitComplete","_handle","doneWaiting","waitUntilError","dontWaitFor","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","WeakMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","target","prop","receiver","IDBTransaction","objectStoreNames","objectStore","wrap","wrapFunction","func","IDBDatabase","prototype","transaction","IDBCursor","advance","continue","continuePrimaryKey","includes","apply","unwrap","storeNames","tx","call","sort","transformCachableValue","done","unlisten","removeEventListener","complete","DOMException","cacheDonePromiseForTransaction","object","IDBObjectStore","IDBIndex","some","c","Proxy","IDBRequest","success","promisifyRequest","newValue","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","storeName","store","oldTraps","CACHE_OBJECT_STORE","normalizeURL","unNormalizedUrl","hash","CacheTimestampsModel","_db","_cacheName","_upgradeDb","db","objStore","createObjectStore","keyPath","createIndex","unique","_upgradeDbAndDeleteOldDbs","blocked","indexedDB","deleteDatabase","deleteDB","timestamp","id","_getId","getDb","durability","minTimestamp","maxCount","cursor","openCursor","entriesToDelete","entriesNotDeletedCount","urlsDeleted","version","upgrade","blocking","terminated","openPromise","oldVersion","newVersion","openDB","bind","CacheExpiration","config","_isRunning","_rerunRequested","_maxEntries","maxEntries","_maxAgeSeconds","maxAgeSeconds","_matchOptions","_timestampModel","Date","now","urlsExpired","expireEntries","setTimestamp","getTimestamp","expireOlderThan","Infinity","createPartialResponse","originalResponse","rangeHeader","headers","boundaries","normalizedRangeHeader","trim","toLowerCase","rangeParts","start","Number","end","parseRangeHeader","originalBlob","blob","effectiveBoundaries","blobSize","size","effectiveStart","effectiveEnd","calculateEffectiveBoundaries","slicedBlob","slicedBlobSize","slicedResponse","Response","statusText","asyncFn","returnPromise","createCacheKey","urlObject","revision","cacheKeyURL","originalURL","PrecacheInstallReportPlugin","updatedURLs","notUpdatedURLs","handlerWillStart","cachedResponseWillBeUsed","PrecacheCacheKeyPlugin","precacheController","cacheKeyWillBeUsed","_precacheController","getCacheKeyForURL","supportStatus","copyResponse","modifier","clonedResponse","responseInit","Headers","modifiedResponseInit","body","testResponse","canConstructResponseFromBodyStream","PrecacheStrategy","_fallbackToNetwork","fallbackToNetwork","copyRedirectedCacheableResponsesPlugin","cacheMatch","_handleInstall","_handleFetch","integrityInManifest","integrity","integrityInRequest","noIntegrityConflict","_useDefaultCacheabilityPluginIfNeeded","defaultPluginIndex","cacheWillUpdatePluginCount","entries","defaultPrecacheCacheabilityPlugin","redirected","PrecacheController","_urlsToCacheKeys","_urlsToCacheModes","_cacheKeysToIntegrities","install","activate","addToCacheList","_installAndActiveListenersAdded","urlsToWarnAbout","cacheMode","firstEntry","secondEntry","warningMessage","console","warn","installReportPlugin","credentials","currentlyCachedRequests","expectedCacheKeys","values","deletedURLs","getURLsToCacheKeys","getCachedURLs","getIntegrityForCacheKey","createHandlerBoundToURL","getOrCreatePrecacheController","PrecacheRoute","urlsToCacheKeys","possibleURL","ignoreURLParametersMatching","directoryIndex","cleanURLs","urlManipulation","urlWithoutIgnoredParams","test","removeIgnoredSearchParams","pathname","endsWith","directoryURL","cleanURL","additionalURLs","urlToAttempt","generateURLVariations","fetchAndCachePut","isFresh","_isResponseDateFresh","cacheExpiration","_getCacheExpiration","updateTimestampDone","updateTimestamp","cacheDidUpdate","_config","_cacheExpirations","purgeOnQuotaError","add","registerQuotaErrorCallback","deleteCacheAndMetadata","dateHeaderTimestamp","_getDateHeaderTimestamp","dateHeader","headerTime","getTime","isNaN","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","fetchError","clearTimeout","fetchAndCachePromise","currentPrecacheName","substringToFind","cacheNamesToDelete","deleteOutdatedCaches","cachesDeleted","clients","claim","addRoute"],"mappings":"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"} \ No newline at end of file diff --git a/src/pages/[community].tsx b/src/pages/[community]/[thread].tsx similarity index 91% rename from src/pages/[community].tsx rename to src/pages/[community]/[thread].tsx index e464c26d7..ac5791c90 100644 --- a/src/pages/[community].tsx +++ b/src/pages/[community]/[thread].tsx @@ -17,7 +17,6 @@ import { ssrRescue, communitySEO, singular, - ssrGetParam, } from '@/utils' import GlobalLayout from '@/containers/layout/GlobalLayout' @@ -26,12 +25,12 @@ import CommunityContent from '@/containers/content/CommunityContent' import { P } from '@/schemas' const loader = async (context, opt = {}) => { - // const { params } = context.req + const { query } = context const { gqClient, userHasLogin } = ssrFetchPrepare(context, opt) // 线上环境会直接跳过 index 到这里,有待排查。。 - const community = ssrGetParam(context, 'community') || HCN - const thread = singular(ssrGetParam(context, 'thread') || THREAD.POST) + const community = query.community || HCN + const thread = singular(query.thread || THREAD.POST) // query data const sessionState = gqClient.request(P.sessionState) @@ -68,14 +67,15 @@ const loader = async (context, opt = {}) => { } export const getServerSideProps: GetServerSideProps = async (context) => { - const { res } = context + const { res, query } = context res.setHeader( 'Cache-Control', 'public, s-maxage=10, stale-while-revalidate=59', ) - const thread = singular(ssrGetParam(context, 'thread') || THREAD.POST) + const thread = singular((query.thread as string) || THREAD.POST) + console.log('page community, thread(radar): ', thread) let resp try { diff --git a/src/pages/[community]/index.tsx b/src/pages/[community]/index.tsx new file mode 100644 index 000000000..5481593a8 --- /dev/null +++ b/src/pages/[community]/index.tsx @@ -0,0 +1,138 @@ +import { Provider } from 'mobx-react' +import { GetServerSideProps } from 'next' +import { merge, toLower } from 'ramda' + +import { PAGE_SIZE } from '@/config' +import { HCN, THREAD, METRIC } from '@/constant' +import { useStore } from '@/stores/init' + +import { + isArticleThread, + ssrBaseStates, + ssrFetchPrepare, + ssrError, + ssrPagedArticleSchema, + ssrPagedArticlesFilter, + ssrParseArticleThread, + ssrRescue, + communitySEO, + singular, +} from '@/utils' + +import GlobalLayout from '@/containers/layout/GlobalLayout' +import CommunityContent from '@/containers/content/CommunityContent' + +import { P } from '@/schemas' + +const loader = async (context, opt = {}) => { + const { query } = context + const { gqClient, userHasLogin } = ssrFetchPrepare(context, opt) + + // 线上环境会直接跳过 index 到这里,有待排查。。 + const community = query.community || HCN + const thread = singular(query.thread || THREAD.POST) + + // query data + const sessionState = gqClient.request(P.sessionState) + const curCommunity = gqClient.request(P.community, { + raw: community, + userHasLogin, + }) + + const pagedArticleTags = gqClient.request(P.pagedArticleTags, { + filter: { communityRaw: community, thread: singular(thread, 'upperCase') }, + }) + + const filter = ssrPagedArticlesFilter(context, userHasLogin) + + const pagedArticles = isArticleThread(thread) + ? gqClient.request(ssrPagedArticleSchema(thread), filter) + : {} + + const subscribedCommunities = gqClient.request(P.subscribedCommunities, { + filter: { + page: 1, + size: PAGE_SIZE.M, + }, + }) + + return { + filter, + ...(await pagedArticleTags), + ...(await sessionState), + ...(await curCommunity), + ...(await pagedArticles), + ...(await subscribedCommunities), + } +} + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { res, query } = context + + res.setHeader( + 'Cache-Control', + 'public, s-maxage=10, stale-while-revalidate=59', + ) + + const thread = singular((query.thread as string) || THREAD.POST) + console.log('page community, thread: ', thread) + + let resp + try { + resp = await loader(context) + } catch (e) { + console.log('#### error from server: ', e) + if (ssrRescue.hasLoginError(e.response?.errors)) { + // token 过期了,重新用匿名方式请求一次 + await loader(context, { tokenExpired: true }) + } else { + return ssrError(context, 'fetch', 500) + } + } + + const { filter, community, pagedArticleTags } = resp + // console.log('iii got resp: ', resp) + const articleThread = ssrParseArticleThread(resp, thread, filter) + + const initProps = merge( + { + ...ssrBaseStates(resp), + route: { + communityPath: community.raw, + mainPath: community.raw === HCN ? '' : community.raw, + subPath: thread === THREAD.POST ? '' : thread, + thread, + }, + tagsBar: { + tags: pagedArticleTags.entries, + }, + viewing: { + community, + activeThread: toLower(thread), + }, + }, + articleThread, + ) + + return { props: { errorCode: null, ...initProps } } +} + +const CommunityPage = (props) => { + const store = useStore(props) + + const { viewing } = store + const { community, activeThread } = viewing + + return ( + + + + + + ) +} + +export default CommunityPage diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 2318f4cda..dd6834079 100755 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -26,13 +26,14 @@ import CommunityContent from '@/containers/content/CommunityContent' import { P } from '@/schemas' const loader = async (context, opt = {}) => { - // const { params } = context.req + const { query } = context + const { gqClient, userHasLogin } = ssrFetchPrepare(context, opt) - let community = ssrGetParam(context, 'community') || HCN + let community = query.community || HCN // 生产环境,从其他页面返回时后有这种情况,需要单独判断 if (community === 'index') community = 'home' - const thread = singular(ssrGetParam(context, 'thread') || THREAD.POST) + const thread = singular(query.thread || THREAD.POST) // const thread = params.thread ? singular(params.thread) : THREAD.POST // query data @@ -74,14 +75,17 @@ const loader = async (context, opt = {}) => { } export const getServerSideProps: GetServerSideProps = async (context) => { - const { res } = context + const { res, query } = context res.setHeader( 'Cache-Control', 'public, s-maxage=10, stale-while-revalidate=59', ) - const thread = singular(ssrGetParam(context, 'thread') || THREAD.POST) + const thread = singular((query.thread as string) || THREAD.POST) + + console.log('page index, thread: ', thread) + let resp try { resp = await loader(context)