diff --git a/src/components/LinksDropdown.tsx b/src/components/LinksDropdown.tsx index d6699a0a..4bda57ab 100644 --- a/src/components/LinksDropdown.tsx +++ b/src/components/LinksDropdown.tsx @@ -306,11 +306,7 @@ export function LinksDropdown(props: { children: React.ReactNode }) { {t("navigation.menu.desktop")} { - if ((window as any).__PSTREAM_OPEN_OFFLINE__) { - (window as any).__PSTREAM_OPEN_OFFLINE__(); - } - }} + onClick={() => window.desktopApi?.openOffline()} icon={Icons.DOWNLOAD} > Offline Downloads diff --git a/src/components/player/atoms/settings/Downloads.tsx b/src/components/player/atoms/settings/Downloads.tsx index 57f0834e..9b3fdc6d 100644 --- a/src/components/player/atoms/settings/Downloads.tsx +++ b/src/components/player/atoms/settings/Downloads.tsx @@ -90,25 +90,17 @@ export function DownloadView({ id }: { id: string }) { } } - window.postMessage( - { - name: "startDownload", - relayId: Math.random().toString(36).substring(7), - instanceId: "web-player", - body: { - url: downloadUrl, - title, - poster, - subtitleText, - duration, - type: sourceType, - }, - }, - "*", - ); + window.desktopApi?.startDownload({ + url: downloadUrl, + title, + poster, + subtitleText, + duration, + type: sourceType, + }); - if ((window as any).__PSTREAM_OPEN_OFFLINE__) { - (window as any).__PSTREAM_OPEN_OFFLINE__(); + if (window.desktopApi?.openOffline) { + window.desktopApi.openOffline(); } else { router.navigate("/"); } diff --git a/src/hooks/useIsDesktopApp.ts b/src/hooks/useIsDesktopApp.ts index 6245cf3d..c3b6a355 100644 --- a/src/hooks/useIsDesktopApp.ts +++ b/src/hooks/useIsDesktopApp.ts @@ -2,6 +2,17 @@ declare global { interface Window { __PSTREAM_DESKTOP__?: boolean; + desktopApi?: { + startDownload(data: { + url: string; + title: string; + poster?: string; + subtitleText?: string; + duration?: number; + type?: string; + }): void; + openOffline(): void; + }; } } diff --git a/vite.config.mts.timestamp-1771786934595-0731144de9972.mjs b/vite.config.mts.timestamp-1771786934595-0731144de9972.mjs deleted file mode 100644 index 6213e819..00000000 --- a/vite.config.mts.timestamp-1771786934595-0731144de9972.mjs +++ /dev/null @@ -1,218 +0,0 @@ -// vite.config.mts -import { defineConfig } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vitest@1.6.1_@types+node@20.19.23_jsdom@23.2.0_terser@5.46.0/node_modules/vitest/dist/config.js"; -import react from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/@vitejs+plugin-react@4.7.0_vite@5.4.21_@types+node@20.19.23_terser@5.46.0_/node_modules/@vitejs/plugin-react/dist/index.js"; -import loadVersion from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vite-plugin-package-version@1.1.0_vite@5.4.21_@types+node@20.19.23_terser@5.46.0_/node_modules/vite-plugin-package-version/dist/index.mjs"; -import { VitePWA } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vite-plugin-pwa@0.17.5_vite@5.4.21_@types+node@20.19.23_terser@5.46.0__workbox-build@7.3.0_@t_k25kbpptevhphsoend3zjsc7ne/node_modules/vite-plugin-pwa/dist/index.js"; -import checker from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vite-plugin-checker@0.6.4_eslint@8.57.1_optionator@0.9.4_typescript@5.9.3_vite@5.4.21_@types+_itnddrexsefb5o2agbq2462fiy/node_modules/vite-plugin-checker/dist/esm/main.js"; -import path2 from "path"; -import million from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/million@2.6.4/node_modules/million/dist/packages/compiler.mjs"; - -// plugins/handlebars.ts -import { globSync } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/glob@10.4.5/node_modules/glob/dist/esm/index.js"; -import { viteStaticCopy } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vite-plugin-static-copy@3.1.4_vite@5.4.21_@types+node@20.19.23_terser@5.46.0_/node_modules/vite-plugin-static-copy/dist/index.js"; -import Handlebars from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/handlebars@4.7.8/node_modules/handlebars/lib/index.js"; -import path from "path"; -var handlebars = (options = {}) => { - const files = globSync("src/assets/**/**.hbs"); - function render(content) { - const template = Handlebars.compile(content); - return template(options?.vars ?? {}); - } - return [ - { - name: "hbs-templating", - enforce: "pre", - transformIndexHtml: { - order: "pre", - handler(html) { - return render(html); - } - } - }, - viteStaticCopy({ - silent: true, - targets: files.map((file) => ({ - src: file, - dest: "", - rename: path.basename(file).slice(0, -4), - // remove .hbs file extension - transform: { - encoding: "utf8", - handler(content) { - return render(content); - } - } - })) - }) - ]; -}; - -// vite.config.mts -import { loadEnv, splitVendorChunkPlugin } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.23_terser@5.46.0/node_modules/vite/dist/node/index.js"; -import { visualizer } from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/rollup-plugin-visualizer@5.14.0_rollup@4.43.0/node_modules/rollup-plugin-visualizer/dist/plugin/index.js"; -import tailwind from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/tailwindcss@3.4.18_yaml@2.8.0/node_modules/tailwindcss/lib/index.js"; -import rtl from "file:///Users/magnus/Documents/repos/p-stream%20combined/p-stream/node_modules/.pnpm/postcss-rtlcss@4.0.9_postcss@8.5.6/node_modules/postcss-rtlcss/esm/index.js"; -var __vite_injected_original_dirname = "/Users/magnus/Documents/repos/p-stream combined/p-stream"; -var captioningPackages = [ - "dompurify", - "htmlparser2", - "subsrt-ts", - "parse5", - "entities", - "fuse" -]; -var vite_config_default = defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd()); - return { - base: env.VITE_BASE_URL || "/", - plugins: [ - million.vite({ auto: true, mute: true }), - handlebars({ - vars: { - opensearchEnabled: env.VITE_OPENSEARCH_ENABLED === "true", - routeDomain: env.VITE_APP_DOMAIN + (env.VITE_NORMAL_ROUTER !== "true" ? "/#" : ""), - domain: env.VITE_APP_DOMAIN, - env - } - }), - react({ - babel: { - presets: [ - "@babel/preset-typescript", - [ - "@babel/preset-env", - { - modules: false, - useBuiltIns: "entry", - corejs: { - version: "3.34" - } - } - ] - ] - } - }), - VitePWA({ - disable: env.VITE_PWA_ENABLED !== "true", - registerType: "autoUpdate", - workbox: { - maximumFileSizeToCacheInBytes: 4e6, - // 4mb - globIgnores: ["!assets/**/*"] - }, - includeAssets: [ - "favicon.ico", - "apple-touch-icon.png", - "safari-pinned-tab.svg" - ], - manifest: { - name: "P-Stream", - short_name: "P-Stream", - description: "Watch your favorite shows and movies for free with no ads ever! (\u3063'\u30EE'c)", - theme_color: "#000000", - background_color: "#000000", - display: "standalone", - start_url: "/", - icons: [ - { - src: "android-chrome-192x192.png", - sizes: "192x192", - type: "image/png", - purpose: "any" - }, - { - src: "android-chrome-512x512.png", - sizes: "512x512", - type: "image/png", - purpose: "any" - }, - { - src: "android-chrome-192x192.png", - sizes: "192x192", - type: "image/png", - purpose: "maskable" - }, - { - src: "android-chrome-512x512.png", - sizes: "512x512", - type: "image/png", - purpose: "maskable" - } - ] - } - }), - loadVersion(), - checker({ - overlay: { - position: "tr" - }, - typescript: true, - // check typescript build errors in dev server - eslint: { - // check lint errors in dev server - lintCommand: "eslint --ext .tsx,.ts src", - dev: { - logLevel: ["error"] - } - } - }), - splitVendorChunkPlugin(), - visualizer() - ], - build: { - sourcemap: mode !== "production", - rollupOptions: { - output: { - manualChunks(id) { - if (id.includes("@sozialhelden+ietf-language-tags") || id.includes("country-language")) { - return "language-db"; - } - if (id.includes("hls.js")) { - return "hls"; - } - if (id.includes("node-forge") || id.includes("crypto-js")) { - return "auth"; - } - if (id.includes("locales") && !id.includes("en.json")) { - return "locales"; - } - if (id.includes("react-dom")) { - return "react-dom"; - } - if (id.includes("Icon.tsx")) { - return "Icons"; - } - const isCaptioningPackage = captioningPackages.some( - (packageName) => id.includes(packageName) - ); - if (isCaptioningPackage) { - return "caption-parsing"; - } - } - } - } - }, - css: { - postcss: { - plugins: [tailwind(), rtl()] - } - }, - resolve: { - alias: { - "@": path2.resolve(__vite_injected_original_dirname, "./src"), - "@themes": path2.resolve(__vite_injected_original_dirname, "./themes"), - "@sozialhelden/ietf-language-tags": path2.resolve( - __vite_injected_original_dirname, - "./node_modules/@sozialhelden/ietf-language-tags/dist/cjs" - ) - } - }, - test: { - environment: "jsdom" - } - }; -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcubXRzIiwgInBsdWdpbnMvaGFuZGxlYmFycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9tYWdudXMvRG9jdW1lbnRzL3JlcG9zL3Atc3RyZWFtIGNvbWJpbmVkL3Atc3RyZWFtXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvbWFnbnVzL0RvY3VtZW50cy9yZXBvcy9wLXN0cmVhbSBjb21iaW5lZC9wLXN0cmVhbS92aXRlLmNvbmZpZy5tdHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL21hZ251cy9Eb2N1bWVudHMvcmVwb3MvcC1zdHJlYW0lMjBjb21iaW5lZC9wLXN0cmVhbS92aXRlLmNvbmZpZy5tdHNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZXN0L2NvbmZpZ1wiO1xuaW1wb3J0IHJlYWN0IGZyb20gXCJAdml0ZWpzL3BsdWdpbi1yZWFjdFwiO1xuaW1wb3J0IGxvYWRWZXJzaW9uIGZyb20gXCJ2aXRlLXBsdWdpbi1wYWNrYWdlLXZlcnNpb25cIjtcbmltcG9ydCB7IFZpdGVQV0EgfSBmcm9tIFwidml0ZS1wbHVnaW4tcHdhXCI7XG5pbXBvcnQgY2hlY2tlciBmcm9tIFwidml0ZS1wbHVnaW4tY2hlY2tlclwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBtaWxsaW9uIGZyb20gXCJtaWxsaW9uL2NvbXBpbGVyXCI7XG5pbXBvcnQgeyBoYW5kbGViYXJzIH0gZnJvbSBcIi4vcGx1Z2lucy9oYW5kbGViYXJzXCI7XG5pbXBvcnQgeyBQbHVnaW5PcHRpb24sIGxvYWRFbnYsIHNwbGl0VmVuZG9yQ2h1bmtQbHVnaW4gfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgdmlzdWFsaXplciB9IGZyb20gXCJyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXJcIjtcblxuaW1wb3J0IHRhaWx3aW5kIGZyb20gXCJ0YWlsd2luZGNzc1wiO1xuaW1wb3J0IHJ0bCBmcm9tIFwicG9zdGNzcy1ydGxjc3NcIjtcblxuY29uc3QgY2FwdGlvbmluZ1BhY2thZ2VzID0gW1xuICBcImRvbXB1cmlmeVwiLFxuICBcImh0bWxwYXJzZXIyXCIsXG4gIFwic3Vic3J0LXRzXCIsXG4gIFwicGFyc2U1XCIsXG4gIFwiZW50aXRpZXNcIixcbiAgXCJmdXNlXCIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoKHsgbW9kZSB9KSA9PiB7XG4gIGNvbnN0IGVudiA9IGxvYWRFbnYobW9kZSwgcHJvY2Vzcy5jd2QoKSk7XG4gIHJldHVybiB7XG4gICAgYmFzZTogZW52LlZJVEVfQkFTRV9VUkwgfHwgXCIvXCIsXG4gICAgcGx1Z2luczogW1xuICAgICAgbWlsbGlvbi52aXRlKHsgYXV0bzogdHJ1ZSwgbXV0ZTogdHJ1ZSB9KSxcbiAgICAgIGhhbmRsZWJhcnMoe1xuICAgICAgICB2YXJzOiB7XG4gICAgICAgICAgb3BlbnNlYXJjaEVuYWJsZWQ6IGVudi5WSVRFX09QRU5TRUFSQ0hfRU5BQkxFRCA9PT0gXCJ0cnVlXCIsXG4gICAgICAgICAgcm91dGVEb21haW46XG4gICAgICAgICAgICBlbnYuVklURV9BUFBfRE9NQUlOICtcbiAgICAgICAgICAgIChlbnYuVklURV9OT1JNQUxfUk9VVEVSICE9PSBcInRydWVcIiA/IFwiLyNcIiA6IFwiXCIpLFxuICAgICAgICAgIGRvbWFpbjogZW52LlZJVEVfQVBQX0RPTUFJTixcbiAgICAgICAgICBlbnYsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHJlYWN0KHtcbiAgICAgICAgYmFiZWw6IHtcbiAgICAgICAgICBwcmVzZXRzOiBbXG4gICAgICAgICAgICBcIkBiYWJlbC9wcmVzZXQtdHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIkBiYWJlbC9wcmVzZXQtZW52XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB1c2VCdWlsdEluczogXCJlbnRyeVwiLFxuICAgICAgICAgICAgICAgIGNvcmVqczoge1xuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXCIzLjM0XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgVml0ZVBXQSh7XG4gICAgICAgIGRpc2FibGU6IGVudi5WSVRFX1BXQV9FTkFCTEVEICE9PSBcInRydWVcIixcbiAgICAgICAgcmVnaXN0ZXJUeXBlOiBcImF1dG9VcGRhdGVcIixcbiAgICAgICAgd29ya2JveDoge1xuICAgICAgICAgIG1heGltdW1GaWxlU2l6ZVRvQ2FjaGVJbkJ5dGVzOiA0MDAwMDAwLCAvLyA0bWJcbiAgICAgICAgICBnbG9iSWdub3JlczogW1wiIWFzc2V0cy8qKi8qXCJdLFxuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlQXNzZXRzOiBbXG4gICAgICAgICAgXCJmYXZpY29uLmljb1wiLFxuICAgICAgICAgIFwiYXBwbGUtdG91Y2gtaWNvbi5wbmdcIixcbiAgICAgICAgICBcInNhZmFyaS1waW5uZWQtdGFiLnN2Z1wiLFxuICAgICAgICBdLFxuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIG5hbWU6IFwiUC1TdHJlYW1cIixcbiAgICAgICAgICBzaG9ydF9uYW1lOiBcIlAtU3RyZWFtXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIldhdGNoIHlvdXIgZmF2b3JpdGUgc2hvd3MgYW5kIG1vdmllcyBmb3IgZnJlZSB3aXRoIG5vIGFkcyBldmVyISAoXHUzMDYzJ1x1MzBFRSdjKVwiLFxuICAgICAgICAgIHRoZW1lX2NvbG9yOiBcIiMwMDAwMDBcIixcbiAgICAgICAgICBiYWNrZ3JvdW5kX2NvbG9yOiBcIiMwMDAwMDBcIixcbiAgICAgICAgICBkaXNwbGF5OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICBzdGFydF91cmw6IFwiL1wiLFxuICAgICAgICAgIGljb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNyYzogXCJhbmRyb2lkLWNocm9tZS0xOTJ4MTkyLnBuZ1wiLFxuICAgICAgICAgICAgICBzaXplczogXCIxOTJ4MTkyXCIsXG4gICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgICAgICAgIHB1cnBvc2U6IFwiYW55XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzcmM6IFwiYW5kcm9pZC1jaHJvbWUtNTEyeDUxMi5wbmdcIixcbiAgICAgICAgICAgICAgc2l6ZXM6IFwiNTEyeDUxMlwiLFxuICAgICAgICAgICAgICB0eXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgICAgICAgICBwdXJwb3NlOiBcImFueVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3JjOiBcImFuZHJvaWQtY2hyb21lLTE5MngxOTIucG5nXCIsXG4gICAgICAgICAgICAgIHNpemVzOiBcIjE5MngxOTJcIixcbiAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICAgICAgcHVycG9zZTogXCJtYXNrYWJsZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3JjOiBcImFuZHJvaWQtY2hyb21lLTUxMng1MTIucG5nXCIsXG4gICAgICAgICAgICAgIHNpemVzOiBcIjUxMng1MTJcIixcbiAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICAgICAgcHVycG9zZTogXCJtYXNrYWJsZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBsb2FkVmVyc2lvbigpLFxuICAgICAgY2hlY2tlcih7XG4gICAgICAgIG92ZXJsYXk6IHtcbiAgICAgICAgICBwb3NpdGlvbjogXCJ0clwiLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlc2NyaXB0OiB0cnVlLCAvLyBjaGVjayB0eXBlc2NyaXB0IGJ1aWxkIGVycm9ycyBpbiBkZXYgc2VydmVyXG4gICAgICAgIGVzbGludDoge1xuICAgICAgICAgIC8vIGNoZWNrIGxpbnQgZXJyb3JzIGluIGRldiBzZXJ2ZXJcbiAgICAgICAgICBsaW50Q29tbWFuZDogXCJlc2xpbnQgLS1leHQgLnRzeCwudHMgc3JjXCIsXG4gICAgICAgICAgZGV2OiB7XG4gICAgICAgICAgICBsb2dMZXZlbDogW1wiZXJyb3JcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgc3BsaXRWZW5kb3JDaHVua1BsdWdpbigpLFxuICAgICAgdmlzdWFsaXplcigpIGFzIFBsdWdpbk9wdGlvbixcbiAgICBdLFxuXG4gICAgYnVpbGQ6IHtcbiAgICAgIHNvdXJjZW1hcDogbW9kZSAhPT0gXCJwcm9kdWN0aW9uXCIsXG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIG1hbnVhbENodW5rcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlkLmluY2x1ZGVzKFwiQHNvemlhbGhlbGRlbitpZXRmLWxhbmd1YWdlLXRhZ3NcIikgfHxcbiAgICAgICAgICAgICAgaWQuaW5jbHVkZXMoXCJjb3VudHJ5LWxhbmd1YWdlXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwibGFuZ3VhZ2UtZGJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcImhscy5qc1wiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJobHNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcIm5vZGUtZm9yZ2VcIikgfHwgaWQuaW5jbHVkZXMoXCJjcnlwdG8tanNcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiYXV0aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwibG9jYWxlc1wiKSAmJiAhaWQuaW5jbHVkZXMoXCJlbi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcImxvY2FsZXNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcInJlYWN0LWRvbVwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJyZWFjdC1kb21cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcIkljb24udHN4XCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIkljb25zXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0NhcHRpb25pbmdQYWNrYWdlID0gY2FwdGlvbmluZ1BhY2thZ2VzLnNvbWUoKHBhY2thZ2VOYW1lKSA9PlxuICAgICAgICAgICAgICBpZC5pbmNsdWRlcyhwYWNrYWdlTmFtZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzQ2FwdGlvbmluZ1BhY2thZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiY2FwdGlvbi1wYXJzaW5nXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjc3M6IHtcbiAgICAgIHBvc3Rjc3M6IHtcbiAgICAgICAgcGx1Z2luczogW3RhaWx3aW5kKCksIHJ0bCgpXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIFwiQFwiOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4vc3JjXCIpLFxuICAgICAgICBcIkB0aGVtZXNcIjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCIuL3RoZW1lc1wiKSxcbiAgICAgICAgXCJAc296aWFsaGVsZGVuL2lldGYtbGFuZ3VhZ2UtdGFnc1wiOiBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICAgIFwiLi9ub2RlX21vZHVsZXMvQHNvemlhbGhlbGRlbi9pZXRmLWxhbmd1YWdlLXRhZ3MvZGlzdC9janNcIixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHRlc3Q6IHtcbiAgICAgIGVudmlyb25tZW50OiBcImpzZG9tXCIsXG4gICAgfSxcbiAgfTtcbn0pO1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvbWFnbnVzL0RvY3VtZW50cy9yZXBvcy9wLXN0cmVhbSBjb21iaW5lZC9wLXN0cmVhbS9wbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvbWFnbnVzL0RvY3VtZW50cy9yZXBvcy9wLXN0cmVhbSBjb21iaW5lZC9wLXN0cmVhbS9wbHVnaW5zL2hhbmRsZWJhcnMudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL21hZ251cy9Eb2N1bWVudHMvcmVwb3MvcC1zdHJlYW0lMjBjb21iaW5lZC9wLXN0cmVhbS9wbHVnaW5zL2hhbmRsZWJhcnMudHNcIjtpbXBvcnQgeyBnbG9iU3luYyB9IGZyb20gXCJnbG9iXCI7XG5pbXBvcnQgeyB2aXRlU3RhdGljQ29weSB9IGZyb20gXCJ2aXRlLXBsdWdpbi1zdGF0aWMtY29weVwiO1xuaW1wb3J0IHsgUGx1Z2luT3B0aW9uIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCBIYW5kbGViYXJzIGZyb20gXCJoYW5kbGViYXJzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlYmFycyA9IChcbiAgb3B0aW9uczogeyB2YXJzPzogUmVjb3JkPHN0cmluZywgYW55PiB9ID0ge30sXG4pOiBQbHVnaW5PcHRpb25bXSA9PiB7XG4gIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMoXCJzcmMvYXNzZXRzLyoqLyoqLmhic1wiKTtcblxuICBmdW5jdGlvbiByZW5kZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShjb250ZW50KTtcbiAgICByZXR1cm4gdGVtcGxhdGUob3B0aW9ucz8udmFycyA/PyB7fSk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiaGJzLXRlbXBsYXRpbmdcIixcbiAgICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgICB0cmFuc2Zvcm1JbmRleEh0bWw6IHtcbiAgICAgICAgb3JkZXI6IFwicHJlXCIsXG4gICAgICAgIGhhbmRsZXIoaHRtbCkge1xuICAgICAgICAgIHJldHVybiByZW5kZXIoaHRtbCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdml0ZVN0YXRpY0NvcHkoe1xuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgdGFyZ2V0czogZmlsZXMubWFwKChmaWxlKSA9PiAoe1xuICAgICAgICBzcmM6IGZpbGUsXG4gICAgICAgIGRlc3Q6IFwiXCIsXG4gICAgICAgIHJlbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlKS5zbGljZSgwLCAtNCksIC8vIHJlbW92ZSAuaGJzIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICBoYW5kbGVyKGNvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcihjb250ZW50KTtcbiAgICAg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