robopark 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -105
- package/bin/robopark.js +9 -2
- package/conversation/elevenlabs_agent.py +1617 -1617
- package/conversation/supervisor_store.py +189 -189
- package/dist/{kernel/config-schema.js → config-schema.js} +1 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/robopark/add-robot.js +1 -0
- package/dist/robopark/add-robot.js.map +1 -0
- package/dist/robopark/agent-ctl.js +1 -0
- package/dist/robopark/agent-ctl.js.map +1 -0
- package/dist/robopark/auto-start.js +51 -73
- package/dist/robopark/auto-start.js.map +1 -0
- package/dist/robopark/conversation.js +1 -0
- package/dist/robopark/conversation.js.map +1 -0
- package/dist/robopark/discovery.js +1 -0
- package/dist/robopark/discovery.js.map +1 -0
- package/dist/robopark/doctor.js +1 -0
- package/dist/robopark/doctor.js.map +1 -0
- package/dist/robopark/enroll.js +1 -0
- package/dist/robopark/enroll.js.map +1 -0
- package/dist/robopark/llm-set.js +1 -0
- package/dist/robopark/llm-set.js.map +1 -0
- package/dist/robopark/motor-control.js +1 -0
- package/dist/robopark/motor-control.js.map +1 -0
- package/dist/robopark/preview-agent-launcher.js +1 -0
- package/dist/robopark/preview-agent-launcher.js.map +1 -0
- package/dist/robopark/probe.js +16 -15
- package/dist/robopark/probe.js.map +1 -0
- package/dist/robopark/profile.js +1 -0
- package/dist/robopark/profile.js.map +1 -0
- package/dist/robopark/python-env.js +1 -7
- package/dist/robopark/python-env.js.map +1 -0
- package/dist/robopark/robot-runtime.js +1 -0
- package/dist/robopark/robot-runtime.js.map +1 -0
- package/dist/robopark/scan.js +1 -0
- package/dist/robopark/scan.js.map +1 -0
- package/dist/robopark/screen-control.js +1 -0
- package/dist/robopark/screen-control.js.map +1 -0
- package/dist/robopark/secrets.js +1 -0
- package/dist/robopark/secrets.js.map +1 -0
- package/dist/robopark/serve.js +6 -8
- package/dist/robopark/serve.js.map +1 -0
- package/dist/robopark/server-add.js +1 -0
- package/dist/robopark/server-add.js.map +1 -0
- package/dist/robopark/setup-livekit.js +53 -52
- package/dist/robopark/setup-livekit.js.map +1 -0
- package/dist/robopark/setup.js +1 -0
- package/dist/robopark/setup.js.map +1 -0
- package/dist/robopark/stop-all.js +1 -0
- package/dist/robopark/stop-all.js.map +1 -0
- package/dist/robopark/verify.js +1 -0
- package/dist/robopark/verify.js.map +1 -0
- package/dist/robopark/vision-agent-launcher.js +1 -0
- package/dist/robopark/vision-agent-launcher.js.map +1 -0
- package/dist/robopark/vision-control.js +1 -0
- package/dist/robopark/vision-control.js.map +1 -0
- package/dist/robopark-cli.js +7 -125
- package/dist/robopark-cli.js.map +1 -0
- package/package.json +16 -56
- package/pi-client/_install_steps.sh +29 -29
- package/pi-client/client.py +76 -76
- package/pi-client/install.sh +40 -40
- package/pi-client/join_convo.sh +54 -54
- package/pi-client/livekit_bridge.py +24 -24
- package/pi-client/motor_bridge.py +10 -10
- package/scheduler/__pycache__/main.cpython-312.pyc +0 -0
- package/scheduler/main.py +196 -17
- package/scheduler/media_lock.py +57 -57
- package/scheduler/preview_agent.py +1122 -1122
- package/scheduler/production_config.json +73 -113
- package/scheduler/scripts/install-robot-supervisor-linux.sh +33 -33
- package/{ui/standalone/public → scheduler/static}/voice-join.html +101 -13
- package/screen/screen_runtime.py +75 -75
- package/vision/app_pi_clean.py +297 -297
- package/vision/audio_server_pi.py +24 -24
- package/vision/install.sh +34 -34
- package/vision/motor_server.py +275 -275
- package/vision/requirements_camera.txt +6 -6
- package/vision/requirements_motor.txt +4 -4
- package/vision/requirements_pi_unified.txt +2 -2
- package/vision/requirements_vision_agent.txt +19 -19
- package/vision/run.sh +244 -244
- package/vision/services/services.sh +12 -12
- package/dist/kernel/types.js +0 -7
- package/dist/robopark/access.js +0 -99
- package/dist/robopark/control-center-html.js +0 -9191
- package/dist/robopark/control-server.js +0 -148
- package/dist/robopark/deployment-commands.js +0 -47
- package/dist/robopark/frontend-service.js +0 -80
- package/dist/robopark/standalone.js +0 -584
- package/dist/robopark/voice-join-html.js +0 -57
- package/scripts/windows-shim-fix.cjs +0 -58
- package/static/robopark/barracuda.png +0 -0
- package/static/robopark/bmw.png +0 -0
- package/static/robopark/jaguar.png +0 -0
- package/static/robopark/magnus.jpg +0 -0
- package/static/robopark/panda.png +0 -0
- package/static/robopark/tesla.png +0 -0
- package/static/robopark/titan.jpg +0 -0
- package/static/robopark/volt.png +0 -0
- package/static/vendor/elevenlabs-client.LICENSE +0 -21
- package/static/vendor/elevenlabs-client.iife.js +0 -24200
- package/ui/ROBOVOICE_BUILD.json +0 -9
- package/ui/standalone/.next/BUILD_ID +0 -1
- package/ui/standalone/.next/app-build-manifest.json +0 -391
- package/ui/standalone/.next/app-path-routes-manifest.json +0 -55
- package/ui/standalone/.next/build-manifest.json +0 -33
- package/ui/standalone/.next/package.json +0 -1
- package/ui/standalone/.next/prerender-manifest.json +0 -41
- package/ui/standalone/.next/react-loadable-manifest.json +0 -14
- package/ui/standalone/.next/required-server-files.json +0 -362
- package/ui/standalone/.next/routes-manifest.json +0 -246
- package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route.js +0 -1
- package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/(app)/opengraph-image-xg4ifa/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/(app)/page.js +0 -2
- package/ui/standalone/.next/server/app/(app)/page.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/(app)/page_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/(app)/voice/page.js +0 -12
- package/ui/standalone/.next/server/app/(app)/voice/page.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/(app)/voice/page_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/_not-found/page.js +0 -12
- package/ui/standalone/.next/server/app/_not-found/page.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/connection-details/route.js +0 -1
- package/ui/standalone/.next/server/app/api/connection-details/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/connection-details/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/device-character/route.js +0 -1
- package/ui/standalone/.next/server/app/api/device-character/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/device-character/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/download-piper-model/route.js +0 -1
- package/ui/standalone/.next/server/app/api/download-piper-model/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/download-piper-model/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/model-status/route.js +0 -1
- package/ui/standalone/.next/server/app/api/model-status/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/model-status/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/models/route.js +0 -1
- package/ui/standalone/.next/server/app/api/models/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/models/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/prewarm/route.js +0 -1
- package/ui/standalone/.next/server/app/api/prewarm/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/prewarm/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/prompt/route.js +0 -1
- package/ui/standalone/.next/server/app/api/prompt/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/prompt/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/reload-tools/route.js +0 -1
- package/ui/standalone/.next/server/app/api/reload-tools/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/reload-tools/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/camera-token/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/camera-token/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/camera-token/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/character-ai/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/character-ai/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/character-ai/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/device-access/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/device-access/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/device-access/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/devices/[deviceId]/control/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/live-rooms/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/live-rooms/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/live-rooms/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/monitor-token/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/monitor-token/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/monitor-token/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/operations/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/[robotId]/voice-engine/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/robots/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/metrics/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/[serverId]/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/servers/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/[sessionId]/end/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/sessions/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/[sessionId]/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robopark/transcripts/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route.js +0 -1
- package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/settings/route.js +0 -1
- package/ui/standalone/.next/server/app/api/settings/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/complete/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/complete/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/complete/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/status/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/status/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/status/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-groq/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-groq/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-groq/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-hass/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-hass/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-hass/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-n8n/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-n8n/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-n8n/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-ollama/route.js +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-ollama/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/setup/test-ollama/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/test-tts/route.js +0 -1
- package/ui/standalone/.next/server/app/api/test-tts/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/test-tts/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/turn-credentials/route.js +0 -1
- package/ui/standalone/.next/server/app/api/turn-credentials/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/turn-credentials/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/voices/route.js +0 -1
- package/ui/standalone/.next/server/app/api/voices/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/voices/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/wake/route.js +0 -1
- package/ui/standalone/.next/server/app/api/wake/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/wake/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/models/route.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/models/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/models/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/status/route.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/status/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/status/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/upload/route.js +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/upload/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/api/wake-word/upload/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/favicon.ico/route.js +0 -1
- package/ui/standalone/.next/server/app/favicon.ico/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/favicon.ico.body +0 -0
- package/ui/standalone/.next/server/app/favicon.ico.meta +0 -1
- package/ui/standalone/.next/server/app/fed/[...path]/route.js +0 -4
- package/ui/standalone/.next/server/app/fed/[...path]/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/fed/[...path]/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route.js +0 -1
- package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/robopark/[...path]/route.js +0 -1
- package/ui/standalone/.next/server/app/robopark/[...path]/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/robopark/[...path]/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js +0 -1
- package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/robopark/api/[...path]/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route.js +0 -1
- package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/robopark/page.js +0 -2
- package/ui/standalone/.next/server/app/robopark/page.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/robopark/page_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/tailnet/route.js +0 -1
- package/ui/standalone/.next/server/app/tailnet/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/tailnet/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route.js +0 -1
- package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/vendor/livekit-client.umd.js/route_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app/voice-tester/page.js +0 -2
- package/ui/standalone/.next/server/app/voice-tester/page.js.nft.json +0 -1
- package/ui/standalone/.next/server/app/voice-tester/page_client-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/app-paths-manifest.json +0 -55
- package/ui/standalone/.next/server/chunks/1428.js +0 -1
- package/ui/standalone/.next/server/chunks/1692.js +0 -1
- package/ui/standalone/.next/server/chunks/37.js +0 -1
- package/ui/standalone/.next/server/chunks/4876.js +0 -1
- package/ui/standalone/.next/server/chunks/5232.js +0 -9
- package/ui/standalone/.next/server/chunks/5455.js +0 -11
- package/ui/standalone/.next/server/chunks/5611.js +0 -6
- package/ui/standalone/.next/server/chunks/5873.js +0 -22
- package/ui/standalone/.next/server/chunks/6018.js +0 -1
- package/ui/standalone/.next/server/chunks/8755.js +0 -1
- package/ui/standalone/.next/server/chunks/9077.js +0 -11
- package/ui/standalone/.next/server/functions-config-manifest.json +0 -9
- package/ui/standalone/.next/server/middleware-build-manifest.js +0 -1
- package/ui/standalone/.next/server/middleware-manifest.json +0 -6
- package/ui/standalone/.next/server/middleware-react-loadable-manifest.js +0 -1
- package/ui/standalone/.next/server/next-font-manifest.js +0 -1
- package/ui/standalone/.next/server/next-font-manifest.json +0 -1
- package/ui/standalone/.next/server/pages/500.html +0 -1
- package/ui/standalone/.next/server/pages/_app.js +0 -1
- package/ui/standalone/.next/server/pages/_app.js.nft.json +0 -1
- package/ui/standalone/.next/server/pages/_document.js +0 -1
- package/ui/standalone/.next/server/pages/_document.js.nft.json +0 -1
- package/ui/standalone/.next/server/pages/_error.js +0 -19
- package/ui/standalone/.next/server/pages/_error.js.nft.json +0 -1
- package/ui/standalone/.next/server/pages-manifest.json +0 -5
- package/ui/standalone/.next/server/server-reference-manifest.js +0 -1
- package/ui/standalone/.next/server/server-reference-manifest.json +0 -1
- package/ui/standalone/.next/server/webpack-runtime.js +0 -1
- package/ui/standalone/.next/static/T3eGaQUuZNb6rhEStcouc/_buildManifest.js +0 -1
- package/ui/standalone/.next/static/T3eGaQUuZNb6rhEStcouc/_ssgManifest.js +0 -1
- package/ui/standalone/.next/static/chunks/1255-404bb8de49c90395.js +0 -1
- package/ui/standalone/.next/static/chunks/144d3bae-bd5d150c0cab972e.js +0 -1
- package/ui/standalone/.next/static/chunks/1646.9123ee47220ed70b.js +0 -1
- package/ui/standalone/.next/static/chunks/2333-43c39acb531f7d4e.js +0 -3
- package/ui/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +0 -1
- package/ui/standalone/.next/static/chunks/5139.c5e46d26064a85db.js +0 -1
- package/ui/standalone/.next/static/chunks/76e8f37e-2ae0e3fe7b44d874.js +0 -1
- package/ui/standalone/.next/static/chunks/9880-53262785284464cc.js +0 -1
- package/ui/standalone/.next/static/chunks/adfb71a7-625c1b5ebd039b6a.js +0 -1
- package/ui/standalone/.next/static/chunks/app/(app)/layout-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/(app)/opengraph-image-xg4ifa/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/(app)/page-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/(app)/voice/page-72d72d9a70d9c1d4.js +0 -1
- package/ui/standalone/.next/static/chunks/app/_not-found/page-cfd7daa82d71540c.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/connection-details/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/device-character/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/download-piper-model/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/model-status/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/models/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/prewarm/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/prompt/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/reload-tools/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/camera-token/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/character-ai/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/device-access/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/devices/[deviceId]/control/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/live-rooms/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/monitor-token/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/robots/[robotId]/operations/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/robots/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/servers/[serverId]/metrics/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/servers/[serverId]/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/servers/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/sessions/[sessionId]/end/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/sessions/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/transcripts/[sessionId]/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robopark/transcripts/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/robovoice/robots/[robotId]/media-health/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/settings/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/complete/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/status/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/test-groq/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/test-hass/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/test-n8n/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/setup/test-ollama/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/test-tts/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/turn-credentials/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/voices/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/wake/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/wake-word/models/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/wake-word/status/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/api/wake-word/upload/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/fed/[...path]/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/fed/media/robots/[robotId]/video_feed/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/layout-fcce963da1d8220f.js +0 -1
- package/ui/standalone/.next/static/chunks/app/robopark/[...path]/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/robopark/api/[...path]/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/robopark/api/robots/[robotId]/stream/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/robopark/page-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/tailnet/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/vendor/livekit-client.umd.js/route-5f312b128a0caf75.js +0 -1
- package/ui/standalone/.next/static/chunks/app/voice-tester/page-ae699e048e0eb834.js +0 -1
- package/ui/standalone/.next/static/chunks/framework-e60c938074ff7136.js +0 -1
- package/ui/standalone/.next/static/chunks/main-9e24e8708ff075fc.js +0 -1
- package/ui/standalone/.next/static/chunks/main-app-a1f59168303c7f84.js +0 -1
- package/ui/standalone/.next/static/chunks/pages/_app-131c90850aef965b.js +0 -1
- package/ui/standalone/.next/static/chunks/pages/_error-e4ba546eb376bdf4.js +0 -1
- package/ui/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/ui/standalone/.next/static/chunks/webpack-5252e5254da079b5.js +0 -1
- package/ui/standalone/.next/static/css/3f478a573f9be82e.css +0 -1
- package/ui/standalone/.next/static/css/51560c4af1d5a21f.css +0 -1
- package/ui/standalone/.next/static/media/27fe93087559d480-s.p.otf +0 -0
- package/ui/standalone/.next/static/media/4d3869dd8a56345a-s.p.otf +0 -0
- package/ui/standalone/.next/static/media/63f3bb9ce29e22d5-s.p.otf +0 -0
- package/ui/standalone/.next/static/media/79e1c5d0f2fe9f68-s.p.otf +0 -0
- package/ui/standalone/.next/static/media/8bf7b2ceda89477b-s.p.woff2 +0 -0
- package/ui/standalone/.next/static/media/98baa4a7809fbf72-s.woff2 +0 -0
- package/ui/standalone/.next/static/media/f7650dfaa438c37c-s.woff2 +0 -0
- package/ui/standalone/package.json +0 -57
- package/ui/standalone/public/caal-logo.svg +0 -3
- package/ui/standalone/public/commit-mono-400-regular.woff +0 -0
- package/ui/standalone/public/cwl-logo-round.png +0 -0
- package/ui/standalone/public/everett-light.woff +0 -0
- package/ui/standalone/public/hey_cal.ppn +0 -0
- package/ui/standalone/public/install-robot-kiosk.sh +0 -242
- package/ui/standalone/public/lk-logo-dark.svg +0 -18
- package/ui/standalone/public/lk-logo.svg +0 -18
- package/ui/standalone/public/lk-wordmark.svg +0 -12
- package/ui/standalone/public/opengraph-image-bg.png +0 -0
- package/ui/standalone/public/porcupine_params.pv +0 -0
- package/ui/standalone/public/robopark-control.html +0 -9200
- package/ui/standalone/public/static/robopark/barracuda.png +0 -0
- package/ui/standalone/public/static/robopark/bmw.png +0 -0
- package/ui/standalone/public/static/robopark/jaguar.png +0 -0
- package/ui/standalone/public/static/robopark/magnus.jpg +0 -0
- package/ui/standalone/public/static/robopark/panda.png +0 -0
- package/ui/standalone/public/static/robopark/tesla.png +0 -0
- package/ui/standalone/public/static/robopark/titan.jpg +0 -0
- package/ui/standalone/public/static/robopark/volt.png +0 -0
- package/ui/standalone/public/tailnet/index.html +0 -8995
- package/ui/standalone/public/transcript-analytics.html +0 -72
- package/ui/standalone/public/vendor/livekit-client.umd.js +0 -2
- package/ui/standalone/server.js +0 -38
- /package/{ui/standalone/public → scheduler/static}/vendor/elevenlabs-client.iife.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[392],{4128:(A,I,g)=>{function C(A,I,g,C,i,B,c){try{var l=A[B](c),o=l.value}catch(A){g(A);return}l.done?I(o):Promise.resolve(o).then(C,i)}function i(A){return function(){var I=this,g=arguments;return new Promise(function(i,B){var c=A.apply(I,g);function l(A){C(c,i,B,l,o,"next",A)}function o(A){C(c,i,B,l,o,"throw",A)}l(void 0)})}}g.d(I,{n8:()=>O});var B,c={exports:{}},l={exports:{}};l.exports,function(A){function I(g){return A.exports=I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},A.exports.__esModule=!0,A.exports.default=A.exports,I(g)}A.exports=I,A.exports.__esModule=!0,A.exports.default=A.exports}(l);var o=l.exports;c.exports,function(A){var I=o.default;function g(){A.exports=g=function(){return C},A.exports.__esModule=!0,A.exports.default=A.exports;var C={},i=Object.prototype,B=i.hasOwnProperty,c=Object.defineProperty||function(A,I,g){A[I]=g.value},l="function"==typeof Symbol?Symbol:{},o=l.iterator||"@@iterator",e=l.asyncIterator||"@@asyncIterator",d=l.toStringTag||"@@toStringTag";function t(A,I,g){return Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}),A[I]}try{t({},"")}catch(A){t=function(A,I,g){return A[I]=g}}function Z(A,I,g,C){var i,B,l,o,e=Object.create((I&&I.prototype instanceof G?I:G).prototype);return c(e,"_invoke",{value:(i=A,B=g,l=new W(C||[]),o="suspendedStart",function(A,I){if("executing"===o)throw Error("Generator is already running");if("completed"===o){if("throw"===A)throw I;return J()}for(l.method=A,l.arg=I;;){var g=l.delegate;if(g){var C=function A(I,g){var C=g.method,i=I.iterator[C];if(void 0===i)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=void 0,A(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=TypeError("The iterator does not provide a '"+C+"' method")),b;var B=n(i,I.iterator,g.arg);if("throw"===B.type)return g.method="throw",g.arg=B.arg,g.delegate=null,b;var c=B.arg;return c?c.done?(g[I.resultName]=c.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=void 0),g.delegate=null,b):c:(g.method="throw",g.arg=TypeError("iterator result is not an object"),g.delegate=null,b)}(g,l);if(C){if(C===b)continue;return C}}if("next"===l.method)l.sent=l._sent=l.arg;else if("throw"===l.method){if("suspendedStart"===o)throw o="completed",l.arg;l.dispatchException(l.arg)}else"return"===l.method&&l.abrupt("return",l.arg);o="executing";var c=n(i,B,l);if("normal"===c.type){if(o=l.done?"completed":"suspendedYield",c.arg===b)continue;return{value:c.arg,done:l.done}}"throw"===c.type&&(o="completed",l.method="throw",l.arg=c.arg)}})}),e}function n(A,I,g){try{return{type:"normal",arg:A.call(I,g)}}catch(A){return{type:"throw",arg:A}}}C.wrap=Z;var b={};function G(){}function m(){}function a(){}var s={};t(s,o,function(){return this});var Q=Object.getPrototypeOf,u=Q&&Q(Q(R([])));u&&u!==i&&B.call(u,o)&&(s=u);var r=a.prototype=G.prototype=Object.create(s);function y(A){["next","throw","return"].forEach(function(I){t(A,I,function(A){return this._invoke(I,A)})})}function h(A,g){var C;c(this,"_invoke",{value:function(i,c){function l(){return new g(function(C,l){!function C(i,c,l,o){var e=n(A[i],A,c);if("throw"!==e.type){var d=e.arg,t=d.value;return t&&"object"==I(t)&&B.call(t,"__await")?g.resolve(t.__await).then(function(A){C("next",A,l,o)},function(A){C("throw",A,l,o)}):g.resolve(t).then(function(A){d.value=A,l(d)},function(A){return C("throw",A,l,o)})}o(e.arg)}(i,c,C,l)})}return C=C?C.then(l,l):l()}})}function X(A){var I={tryLoc:A[0]};1 in A&&(I.catchLoc=A[1]),2 in A&&(I.finallyLoc=A[2],I.afterLoc=A[3]),this.tryEntries.push(I)}function V(A){var I=A.completion||{};I.type="normal",delete I.arg,A.completion=I}function W(A){this.tryEntries=[{tryLoc:"root"}],A.forEach(X,this),this.reset(!0)}function R(A){if(A){var I=A[o];if(I)return I.call(A);if("function"==typeof A.next)return A;if(!isNaN(A.length)){var g=-1,C=function I(){for(;++g<A.length;)if(B.call(A,g))return I.value=A[g],I.done=!1,I;return I.value=void 0,I.done=!0,I};return C.next=C}}return{next:J}}function J(){return{value:void 0,done:!0}}return m.prototype=a,c(r,"constructor",{value:a,configurable:!0}),c(a,"constructor",{value:m,configurable:!0}),m.displayName=t(a,d,"GeneratorFunction"),C.isGeneratorFunction=function(A){var I="function"==typeof A&&A.constructor;return!!I&&(I===m||"GeneratorFunction"===(I.displayName||I.name))},C.mark=function(A){return Object.setPrototypeOf?Object.setPrototypeOf(A,a):(A.__proto__=a,t(A,d,"GeneratorFunction")),A.prototype=Object.create(r),A},C.awrap=function(A){return{__await:A}},y(h.prototype),t(h.prototype,e,function(){return this}),C.AsyncIterator=h,C.async=function(A,I,g,i,B){void 0===B&&(B=Promise);var c=new h(Z(A,I,g,i),B);return C.isGeneratorFunction(I)?c:c.next().then(function(A){return A.done?A.value:c.next()})},y(r),t(r,d,"Generator"),t(r,o,function(){return this}),t(r,"toString",function(){return"[object Generator]"}),C.keys=function(A){var I=Object(A),g=[];for(var C in I)g.push(C);return g.reverse(),function A(){for(;g.length;){var C=g.pop();if(C in I)return A.value=C,A.done=!1,A}return A.done=!0,A}},C.values=R,W.prototype={constructor:W,reset:function(A){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(V),!A)for(var I in this)"t"===I.charAt(0)&&B.call(this,I)&&!isNaN(+I.slice(1))&&(this[I]=void 0)},stop:function(){this.done=!0;var A=this.tryEntries[0].completion;if("throw"===A.type)throw A.arg;return this.rval},dispatchException:function(A){if(this.done)throw A;var I=this;function g(g,C){return c.type="throw",c.arg=A,I.next=g,C&&(I.method="next",I.arg=void 0),!!C}for(var C=this.tryEntries.length-1;C>=0;--C){var i=this.tryEntries[C],c=i.completion;if("root"===i.tryLoc)return g("end");if(i.tryLoc<=this.prev){var l=B.call(i,"catchLoc"),o=B.call(i,"finallyLoc");if(l&&o){if(this.prev<i.catchLoc)return g(i.catchLoc,!0);if(this.prev<i.finallyLoc)return g(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return g(i.catchLoc,!0)}else{if(!o)throw Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return g(i.finallyLoc)}}}},abrupt:function(A,I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc<=this.prev&&B.call(C,"finallyLoc")&&this.prev<C.finallyLoc){var i=C;break}}i&&("break"===A||"continue"===A)&&i.tryLoc<=I&&I<=i.finallyLoc&&(i=null);var c=i?i.completion:{};return c.type=A,c.arg=I,i?(this.method="next",this.next=i.finallyLoc,b):this.complete(c)},complete:function(A,I){if("throw"===A.type)throw A.arg;return"break"===A.type||"continue"===A.type?this.next=A.arg:"return"===A.type?(this.rval=this.arg=A.arg,this.method="return",this.next="end"):"normal"===A.type&&I&&(this.next=I),b},finish:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.finallyLoc===A)return this.complete(g.completion,g.afterLoc),V(g),b}},catch:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.tryLoc===A){var C=g.completion;if("throw"===C.type){var i=C.arg;V(g)}return i}}throw Error("illegal catch attempt")},delegateYield:function(A,I,g){return this.delegate={iterator:R(A),resultName:I,nextLoc:g},"next"===this.method&&(this.arg=void 0),b}},C}A.exports=g,A.exports.__esModule=!0,A.exports.default=A.exports}(c);var e=(0,c.exports)();try{regeneratorRuntime=e}catch(A){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}var d=function(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}(e);function t(A){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A})(A)}function Z(A){var I=function(A,I){if("object"!==t(A)||null===A)return A;var g=A[Symbol.toPrimitive];if(void 0!==g){var C=g.call(A,I||"default");if("object"!==t(C))return C;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===I?String:Number)(A)}(A,"string");return"symbol"===t(I)?I:String(I)}function n(A,I,g){return(I=Z(I))in A?Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}):A[I]=g,A}function b(A,I){for(var g=0;g<I.length;g++){var C=I[g];C.enumerable=C.enumerable||!1,C.configurable=!0,"value"in C&&(C.writable=!0),Object.defineProperty(A,Z(C.key),C)}}function G(A,I,g){return I&&b(A.prototype,I),g&&b(A,g),Object.defineProperty(A,"prototype",{writable:!1}),A}function m(A,I){if(!(A instanceof I))throw TypeError("Cannot call a class as a function")}function a(A,I){return(a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(A,I){return A.__proto__=I,A})(A,I)}function s(A){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(A){return A.__proto__||Object.getPrototypeOf(A)})(A)}function Q(A,I,g){return(Q=!function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(A){return!1}}()?function(A,I,g){var C=[null];C.push.apply(C,I);var i=new(Function.bind.apply(A,C));return g&&a(i,g.prototype),i}:Reflect.construct.bind()).apply(null,arguments)}function u(A){var I="function"==typeof Map?new Map:void 0;return(u=function(A){if(null===A||-1===Function.toString.call(A).indexOf("[native code]"))return A;if("function"!=typeof A)throw TypeError("Super expression must either be null or a function");if(void 0!==I){if(I.has(A))return I.get(A);I.set(A,g)}function g(){return Q(A,arguments,s(this).constructor)}return g.prototype=Object.create(A.prototype,{constructor:{value:g,enumerable:!1,writable:!0,configurable:!0}}),a(g,A)})(A)}"undefined"!=typeof window&&(window.AudioContext=window.AudioContext||window.webkitAudioContext,("function"!=typeof AudioWorkletNode||!("audioWorklet"in AudioContext.prototype))&&AudioContext&&(AudioContext.prototype.audioWorklet={addModule:function(){var A=i(d.mark(function A(I,g){return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return A.abrupt("return");case 1:case"end":return A.stop()}},A)}));return function(I,g){return A.apply(this,arguments)}}()},window.AudioWorkletNode=function(A,I,g){var C=g&&g.processorOptions,i=C.numberOfChannels,B=void 0===i?1:i,c=C.frameLength,l=A.createScriptProcessor(void 0===c?512:c,B,B);return l.port||(l.port={}),l.onaudioprocess=function(A){if(l.port&&l.port.onmessage){for(var I=[],g=0;g<A.inputBuffer.numberOfChannels;g++)I.push(A.inputBuffer.getChannelData(g));l.port.onmessage({data:{buffer:I}})}},l.port.close=function(){},l}));let r=Error("request for lock canceled");class y{constructor(A,I=r){this._value=A,this._cancelError=I,this._weightedQueues=[],this._weightedWaiters=[]}acquire(A=1){if(A<=0)throw Error(`invalid weight ${A}: must be positive`);return new Promise((I,g)=>{this._weightedQueues[A-1]||(this._weightedQueues[A-1]=[]),this._weightedQueues[A-1].push({resolve:I,reject:g}),this._dispatch()})}runExclusive(A,I=1){var g,C,i,B;return g=this,C=void 0,i=void 0,B=function*(){let[g,C]=yield this.acquire(I);try{return yield A(g)}finally{C()}},new(i||(i=Promise))(function(A,I){function c(A){try{o(B.next(A))}catch(A){I(A)}}function l(A){try{o(B.throw(A))}catch(A){I(A)}}function o(I){var g;I.done?A(I.value):((g=I.value)instanceof i?g:new i(function(A){A(g)})).then(c,l)}o((B=B.apply(g,C||[])).next())})}waitForUnlock(A=1){if(A<=0)throw Error(`invalid weight ${A}: must be positive`);return new Promise(I=>{this._weightedWaiters[A-1]||(this._weightedWaiters[A-1]=[]),this._weightedWaiters[A-1].push(I),this._dispatch()})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(A){this._value=A,this._dispatch()}release(A=1){if(A<=0)throw Error(`invalid weight ${A}: must be positive`);this._value+=A,this._dispatch()}cancel(){this._weightedQueues.forEach(A=>A.forEach(A=>A.reject(this._cancelError))),this._weightedQueues=[]}_dispatch(){var A;for(let I=this._value;I>0;I--){let g=null==(A=this._weightedQueues[I-1])?void 0:A.shift();if(!g)continue;let C=this._value,i=I;this._value-=I,I=this._value+1,g.resolve([C,this._newReleaser(i)])}this._drainUnlockWaiters()}_newReleaser(A){let I=!1;return()=>{I||(I=!0,this.release(A))}}_drainUnlockWaiters(){for(let A=this._value;A>0;A--)this._weightedWaiters[A-1]&&(this._weightedWaiters[A-1].forEach(A=>A()),this._weightedWaiters[A-1]=[])}}class h{constructor(A){this._semaphore=new y(1,A)}acquire(){var A,I,g,C;return A=this,I=void 0,g=void 0,C=function*(){let[,A]=yield this._semaphore.acquire();return A},new(g||(g=Promise))(function(i,B){function c(A){try{o(C.next(A))}catch(A){B(A)}}function l(A){try{o(C.throw(A))}catch(A){B(A)}}function o(A){var I;A.done?i(A.value):((I=A.value)instanceof g?I:new g(function(A){A(I)})).then(c,l)}o((C=C.apply(A,I||[])).next())})}runExclusive(A){return this._semaphore.runExclusive(()=>A())}isLocked(){return this._semaphore.isLocked()}waitForUnlock(){return this._semaphore.waitForUnlock()}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}}function X(A,I,g,C,i,B,c){try{var l=A[B](c),o=l.value}catch(A){g(A);return}l.done?I(o):Promise.resolve(o).then(C,i)}function V(A){var I={exports:{}};return A(I,I.exports),I.exports}var W=V(function(A){function I(g){return A.exports=I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},A.exports.__esModule=!0,A.exports.default=A.exports,I(g)}A.exports=I,A.exports.__esModule=!0,A.exports.default=A.exports}),R=V(function(A){var I=W.default;function g(){A.exports=g=function(){return C},A.exports.__esModule=!0,A.exports.default=A.exports;var C={},i=Object.prototype,B=i.hasOwnProperty,c=Object.defineProperty||function(A,I,g){A[I]=g.value},l="function"==typeof Symbol?Symbol:{},o=l.iterator||"@@iterator",e=l.asyncIterator||"@@asyncIterator",d=l.toStringTag||"@@toStringTag";function t(A,I,g){return Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}),A[I]}try{t({},"")}catch(A){t=function(A,I,g){return A[I]=g}}function Z(A,I,g,C){var i,B,l,o,e=Object.create((I&&I.prototype instanceof G?I:G).prototype);return c(e,"_invoke",{value:(i=A,B=g,l=new W(C||[]),o="suspendedStart",function(A,I){if("executing"===o)throw Error("Generator is already running");if("completed"===o){if("throw"===A)throw I;return J()}for(l.method=A,l.arg=I;;){var g=l.delegate;if(g){var C=function A(I,g){var C=g.method,i=I.iterator[C];if(void 0===i)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=void 0,A(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=TypeError("The iterator does not provide a '"+C+"' method")),b;var B=n(i,I.iterator,g.arg);if("throw"===B.type)return g.method="throw",g.arg=B.arg,g.delegate=null,b;var c=B.arg;return c?c.done?(g[I.resultName]=c.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=void 0),g.delegate=null,b):c:(g.method="throw",g.arg=TypeError("iterator result is not an object"),g.delegate=null,b)}(g,l);if(C){if(C===b)continue;return C}}if("next"===l.method)l.sent=l._sent=l.arg;else if("throw"===l.method){if("suspendedStart"===o)throw o="completed",l.arg;l.dispatchException(l.arg)}else"return"===l.method&&l.abrupt("return",l.arg);o="executing";var c=n(i,B,l);if("normal"===c.type){if(o=l.done?"completed":"suspendedYield",c.arg===b)continue;return{value:c.arg,done:l.done}}"throw"===c.type&&(o="completed",l.method="throw",l.arg=c.arg)}})}),e}function n(A,I,g){try{return{type:"normal",arg:A.call(I,g)}}catch(A){return{type:"throw",arg:A}}}C.wrap=Z;var b={};function G(){}function m(){}function a(){}var s={};t(s,o,function(){return this});var Q=Object.getPrototypeOf,u=Q&&Q(Q(R([])));u&&u!==i&&B.call(u,o)&&(s=u);var r=a.prototype=G.prototype=Object.create(s);function y(A){["next","throw","return"].forEach(function(I){t(A,I,function(A){return this._invoke(I,A)})})}function h(A,g){var C;c(this,"_invoke",{value:function(i,c){function l(){return new g(function(C,l){!function C(i,c,l,o){var e=n(A[i],A,c);if("throw"!==e.type){var d=e.arg,t=d.value;return t&&"object"==I(t)&&B.call(t,"__await")?g.resolve(t.__await).then(function(A){C("next",A,l,o)},function(A){C("throw",A,l,o)}):g.resolve(t).then(function(A){d.value=A,l(d)},function(A){return C("throw",A,l,o)})}o(e.arg)}(i,c,C,l)})}return C=C?C.then(l,l):l()}})}function X(A){var I={tryLoc:A[0]};1 in A&&(I.catchLoc=A[1]),2 in A&&(I.finallyLoc=A[2],I.afterLoc=A[3]),this.tryEntries.push(I)}function V(A){var I=A.completion||{};I.type="normal",delete I.arg,A.completion=I}function W(A){this.tryEntries=[{tryLoc:"root"}],A.forEach(X,this),this.reset(!0)}function R(A){if(A){var I=A[o];if(I)return I.call(A);if("function"==typeof A.next)return A;if(!isNaN(A.length)){var g=-1,C=function I(){for(;++g<A.length;)if(B.call(A,g))return I.value=A[g],I.done=!1,I;return I.value=void 0,I.done=!0,I};return C.next=C}}return{next:J}}function J(){return{value:void 0,done:!0}}return m.prototype=a,c(r,"constructor",{value:a,configurable:!0}),c(a,"constructor",{value:m,configurable:!0}),m.displayName=t(a,d,"GeneratorFunction"),C.isGeneratorFunction=function(A){var I="function"==typeof A&&A.constructor;return!!I&&(I===m||"GeneratorFunction"===(I.displayName||I.name))},C.mark=function(A){return Object.setPrototypeOf?Object.setPrototypeOf(A,a):(A.__proto__=a,t(A,d,"GeneratorFunction")),A.prototype=Object.create(r),A},C.awrap=function(A){return{__await:A}},y(h.prototype),t(h.prototype,e,function(){return this}),C.AsyncIterator=h,C.async=function(A,I,g,i,B){void 0===B&&(B=Promise);var c=new h(Z(A,I,g,i),B);return C.isGeneratorFunction(I)?c:c.next().then(function(A){return A.done?A.value:c.next()})},y(r),t(r,d,"Generator"),t(r,o,function(){return this}),t(r,"toString",function(){return"[object Generator]"}),C.keys=function(A){var I=Object(A),g=[];for(var C in I)g.push(C);return g.reverse(),function A(){for(;g.length;){var C=g.pop();if(C in I)return A.value=C,A.done=!1,A}return A.done=!0,A}},C.values=R,W.prototype={constructor:W,reset:function(A){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(V),!A)for(var I in this)"t"===I.charAt(0)&&B.call(this,I)&&!isNaN(+I.slice(1))&&(this[I]=void 0)},stop:function(){this.done=!0;var A=this.tryEntries[0].completion;if("throw"===A.type)throw A.arg;return this.rval},dispatchException:function(A){if(this.done)throw A;var I=this;function g(g,C){return c.type="throw",c.arg=A,I.next=g,C&&(I.method="next",I.arg=void 0),!!C}for(var C=this.tryEntries.length-1;C>=0;--C){var i=this.tryEntries[C],c=i.completion;if("root"===i.tryLoc)return g("end");if(i.tryLoc<=this.prev){var l=B.call(i,"catchLoc"),o=B.call(i,"finallyLoc");if(l&&o){if(this.prev<i.catchLoc)return g(i.catchLoc,!0);if(this.prev<i.finallyLoc)return g(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return g(i.catchLoc,!0)}else{if(!o)throw Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return g(i.finallyLoc)}}}},abrupt:function(A,I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc<=this.prev&&B.call(C,"finallyLoc")&&this.prev<C.finallyLoc){var i=C;break}}i&&("break"===A||"continue"===A)&&i.tryLoc<=I&&I<=i.finallyLoc&&(i=null);var c=i?i.completion:{};return c.type=A,c.arg=I,i?(this.method="next",this.next=i.finallyLoc,b):this.complete(c)},complete:function(A,I){if("throw"===A.type)throw A.arg;return"break"===A.type||"continue"===A.type?this.next=A.arg:"return"===A.type?(this.rval=this.arg=A.arg,this.method="return",this.next="end"):"normal"===A.type&&I&&(this.next=I),b},finish:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.finallyLoc===A)return this.complete(g.completion,g.afterLoc),V(g),b}},catch:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.tryLoc===A){var C=g.completion;if("throw"===C.type){var i=C.arg;V(g)}return i}}throw Error("illegal catch attempt")},delegateYield:function(A,I,g){return this.delegate={iterator:R(A),resultName:I,nextLoc:g},"next"===this.method&&(this.arg=void 0),b}},C}A.exports=g,A.exports.__esModule=!0,A.exports.default=A.exports})();try{regeneratorRuntime=R}catch(A){"object"==typeof globalThis?globalThis.regeneratorRuntime=R:Function("r","regeneratorRuntime = r")(R)}function J(A){return(J="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A})(A)}function w(A){var I=function(A,I){if("object"!==J(A)||null===A)return A;var g=A[Symbol.toPrimitive];if(void 0!==g){var C=g.call(A,I||"default");if("object"!==J(C))return C;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===I?String:Number)(A)}(A,"string");return"symbol"===J(I)?I:String(I)}function H(A,I,g){return(I=w(I))in A?Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}):A[I]=g,A}function E(A,I){if(!(A instanceof I))throw TypeError("Cannot call a class as a function")}function p(A,I){for(var g=0;g<I.length;g++){var C=I[g];C.enumerable=C.enumerable||!1,C.configurable=!0,"value"in C&&(C.writable=!0),Object.defineProperty(A,w(C.key),C)}}function Y(A,I,g){return I&&p(A.prototype,I),g&&p(A,g),Object.defineProperty(A,"prototype",{writable:!1}),A}function N(A){if(void 0===A)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return A}function S(A,I){return(S=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(A,I){return A.__proto__=I,A})(A,I)}function k(A){return(k=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(A){return A.__proto__||Object.getPrototypeOf(A)})(A)}function F(A,I){var g=Object.keys(A);if(Object.getOwnPropertySymbols){var C=Object.getOwnPropertySymbols(A);I&&(C=C.filter(function(I){return Object.getOwnPropertyDescriptor(A,I).enumerable})),g.push.apply(g,C)}return g}var K=function(){function A(){E(this,A),H(this,"_path",void 0),H(this,"_meta",void 0)}return Y(A,[{key:"meta",get:function(){if(void 0!==this._meta)return function(A){for(var I=1;I<arguments.length;I++){var g=null!=arguments[I]?arguments[I]:{};I%2?F(Object(g),!0).forEach(function(I){H(A,I,g[I])}):Object.getOwnPropertyDescriptors?Object.defineProperties(A,Object.getOwnPropertyDescriptors(g)):F(Object(g)).forEach(function(I){Object.defineProperty(A,I,Object.getOwnPropertyDescriptor(g,I))})}return A}({version:0},this._meta)}}],[{key:"getPtr",value:function(I){return A._filePtrs.get(I)}},{key:"setPtr",value:function(I,g){A._filePtrs.set(I,g)}},{key:"removePtr",value:function(I){A._filePtrs.delete(I)}}]),A}();H(K,"_filePtrs",new Map);var f=function(A){if("function"!=typeof A&&null!==A)throw TypeError("Super expression must either be null or a function");B.prototype=Object.create(A&&A.prototype,{constructor:{value:B,writable:!0,configurable:!0}}),Object.defineProperty(B,"prototype",{writable:!1}),A&&S(B,A);var I,g,C,i=(I=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(A){return!1}}(),function(){var A,g=k(B);A=I?Reflect.construct(g,arguments,k(this).constructor):g.apply(this,arguments);if(A&&("object"===J(A)||"function"==typeof A))return A;if(void 0!==A)throw TypeError("Derived constructors may only return object or undefined");return N(this)});function B(A,I,g,C){var c;return E(this,B),H(N(c=i.call(this)),"_pos",0),H(N(c),"_mode",void 0),c._path=A,c._meta=I,c._mode=C,c}return Y(B,[{key:"close",value:function(){}},{key:"read",value:function(A,I){if(!this.exists())throw Error("'".concat(this._path,"' doesn't exist."));if(this._isEOF){var g=Error("EOF");throw g.name="EndOfFile",g}var C=Math.min(A*I,this._file.length-this._pos),i=C-C%A,B=new Uint8Array(i);return B.set(this._file.slice(this._pos,this._pos+i),0),this._pos+=i,B}},{key:"write",value:function(A){var I=new Uint8Array(this._pos+A.length);void 0!==this._file?(I.set(this._file.slice(0,this._pos)),I.set(A,this._pos)):I.set(A),this._file=I,this._pos+=A.length}},{key:"seek",value:function(A,I){if(!this.exists()&&"readonly"===this._mode)throw Error("'".concat(this._path,"' doesn't exist."));if(A<0){var g,C=Error("EOF");throw C.name="EndOfFile",C}if(0===I)g=Math.min(A,this._file.length);else if(1===I)g=Math.min(this._pos+A,this._file.length);else if(2===I)g=Math.min(this._file.length+A,this._file.length);else throw Error("Invalid operation: ".concat(I,"."));this._pos=g}},{key:"tell",value:function(){return this.exists()?this._pos:-1}},{key:"remove",value:(g=R.mark(function A(){return R.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:B._memFiles.delete(this._path),this._file=void 0,this._pos=0;case 3:case"end":return A.stop()}},A,this)}),C=function(){var A=this,I=arguments;return new Promise(function(C,i){var B=g.apply(A,I);function c(A){X(B,C,i,c,l,"next",A)}function l(A){X(B,C,i,c,l,"throw",A)}c(void 0)})},function(){return C.apply(this,arguments)})},{key:"exists",value:function(){return void 0!==this._file}},{key:"_isEOF",get:function(){return this._pos>=this._file.length}},{key:"_file",get:function(){return B._memFiles.get(this._path)},set:function(A){B._memFiles.set(this._path,A)}}],[{key:"open",value:function(A,I){var g=B._memFiles.get(A),C=I.includes("r")?"readonly":"readwrite";if(void 0===g&&"readonly"===C){var i=Error("'".concat(A,"' doesn't exist."));throw i.name="FileNotExists",i}var c=new B(A,void 0,void 0,C);return I.includes("a")&&c.seek(0,2),c}}]),B}(K);function v(A,I){for(var g=I;0!==A[g];)g++;return new TextDecoder("utf-8").decode(A.subarray(I,g))}function D(A){for(var I=atob(A),g=new Uint8Array(I.length),C=0;C<I.length;C++)g[C]=I.charCodeAt(C);return g}function U(A,I,g){var C;return function(i){var B,c,l,o;return new Worker(C=C||(B=void 0===I?null:I,l=(c=function(A,I){var g=atob(A);if(I){for(var C=new Uint8Array(g.length),i=0,B=g.length;i<B;++i)C[i]=g.charCodeAt(i);return String.fromCharCode.apply(null,new Uint16Array(C.buffer))}return g}(A,void 0!==g&&g)).indexOf("\n",10)+1,o=new Blob([c.substring(l)+(B?"//# sourceMappingURL="+B:"")],{type:"application/javascript"}),URL.createObjectURL(o)),i)}}H(f,"_memFiles",new Map);var L=U("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvciQxKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcCQxKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdHlwZW9mJDIob2JqKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiBfdHlwZW9mJDIgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgICB9IDogZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gb2JqICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9LCBfdHlwZW9mJDIob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZSQxKGlucHV0LCBoaW50KSB7CiAgICBpZiAoX3R5cGVvZiQyKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCAiZGVmYXVsdCIpOwogICAgICBpZiAoX3R5cGVvZiQyKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkkMShhcmcpIHsKICAgIHZhciBrZXkgPSBfdG9QcmltaXRpdmUkMShhcmcsICJzdHJpbmciKTsKICAgIHJldHVybiBfdHlwZW9mJDIoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDEodGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5JDEoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsICJwcm90b3R5cGUiLCB7CiAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgfSk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkkMShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5JDEoa2V5KTsKICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHsKICAJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMiA9IHtleHBvcnRzOiB7fX07CgogIHZhciBfdHlwZW9mJDEgPSB7ZXhwb3J0czoge319OwoKICBfdHlwZW9mJDEuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogIAkgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgCSAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAJICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsgCiAgfSAoX3R5cGVvZiQxKSk7CgogIHZhciBfdHlwZW9mRXhwb3J0cyA9IF90eXBlb2YkMS5leHBvcnRzOwoKICByZWdlbmVyYXRvclJ1bnRpbWUkMi5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAl2YXIgX3R5cGVvZiA9IF90eXBlb2ZFeHBvcnRzWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBleHBvcnRzOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIGV4cG9ydHMgPSB7fSwKICAJICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIGhhc093biA9IE9wLmhhc093blByb3BlcnR5LAogIAkgICAgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZnVuY3Rpb24gKG9iaiwga2V5LCBkZXNjKSB7CiAgCSAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTsKICAJICAgIH0sCiAgCSAgICAkU3ltYm9sID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiLAogIAkgICAgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCAiQEBhc3luY0l0ZXJhdG9yIiwKICAJICAgIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCAiQEB0b1N0cmluZ1RhZyI7CiAgCSAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogIAkgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogIAkgICAgICB2YWx1ZTogdmFsdWUsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCBvYmpba2V5XTsKICAJICB9CiAgCSAgdHJ5IHsKICAJICAgIGRlZmluZSh7fSwgIiIpOwogIAkgIH0gY2F0Y2ggKGVycikgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogIAkgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsKICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsKICAJICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLAogIAkgICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksCiAgCSAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7CiAgCSAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZ2VuZXJhdG9yLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkKICAJICAgIH0pLCBnZW5lcmF0b3I7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgewogIAkgICAgdHJ5IHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAibm9ybWFsIiwKICAJICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCiAgCSAgICAgIH07CiAgCSAgICB9IGNhdGNoIChlcnIpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogZXJyCiAgCSAgICAgIH07CiAgCSAgICB9CiAgCSAgfQogIAkgIGV4cG9ydHMud3JhcCA9IHdyYXA7CiAgCSAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsKICAJICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAJICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9CiAgCSAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgCSAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSk7CiAgCSAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLAogIAkgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7CiAgCSAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpOwogIAkgIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICAJICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7CiAgCSAgICBbIm5leHQiLCAidGhyb3ciLCAicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7CiAgCSAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOwogIAkgICAgICB9KTsKICAJICAgIH0pOwogIAkgIH0KICAJICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHsKICAJICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgCSAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOwogIAkgICAgICBpZiAoInRocm93IiAhPT0gcmVjb3JkLnR5cGUpIHsKICAJICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywKICAJICAgICAgICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogIAkgICAgICAgIHJldHVybiB2YWx1ZSAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKHZhbHVlKSAmJiBoYXNPd24uY2FsbCh2YWx1ZSwgIl9fYXdhaXQiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKICAJICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogIAkgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsKICAJICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpOwogIAkgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgCSAgICB9CiAgCSAgICB2YXIgcHJldmlvdXNQcm9taXNlOwogIAkgICAgZGVmaW5lUHJvcGVydHkodGhpcywgIl9pbnZva2UiLCB7CiAgCSAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShtZXRob2QsIGFyZykgewogIAkgICAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgewogIAkgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgCSAgICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICAgIH0pOwogIAkgICAgICAgIH0KICAJICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CiAgCSAgICAgIH0KICAJICAgIH0pOwogIAkgIH0KICAJICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsKICAJICAgIHZhciBzdGF0ZSA9ICJzdXNwZW5kZWRTdGFydCI7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7CiAgCSAgICAgIGlmICgiZXhlY3V0aW5nIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAoImNvbXBsZXRlZCIgPT09IHN0YXRlKSB7CiAgCSAgICAgICAgaWYgKCJ0aHJvdyIgPT09IG1ldGhvZCkgdGhyb3cgYXJnOwogIAkgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7CiAgCSAgICAgIH0KICAJICAgICAgZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7OykgewogIAkgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgCSAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsKICAJICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkgewogIAkgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogIAkgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IGNvbnRleHQubWV0aG9kKSBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gY29udGV4dC5tZXRob2QpIHsKICAJICAgICAgICAgIGlmICgic3VzcGVuZGVkU3RhcnQiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5hcmc7CiAgCSAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KCJyZXR1cm4iLCBjb250ZXh0LmFyZyk7CiAgCSAgICAgICAgc3RhdGUgPSAiZXhlY3V0aW5nIjsKICAJICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CiAgCSAgICAgICAgaWYgKCJub3JtYWwiID09PSByZWNvcmQudHlwZSkgewogIAkgICAgICAgICAgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gImNvbXBsZXRlZCIgOiAic3VzcGVuZGVkWWllbGQiLCByZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAJICAgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9ICJjb21wbGV0ZWQiLCBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKICAJICAgIHZhciBtZXRob2ROYW1lID0gY29udGV4dC5tZXRob2QsCiAgCSAgICAgIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZE5hbWVdOwogIAkgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsICJ0aHJvdyIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdICYmIChjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksICJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbWV0aG9kTmFtZSAmJiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBtZXRob2ROYW1lICsgIicgbWV0aG9kIikpLCBDb250aW51ZVNlbnRpbmVsOwogIAkgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsKICAJICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgcmV0dXJuIGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbDsKICAJICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKICAJICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCAicmV0dXJuIiAhPT0gY29udGV4dC5tZXRob2QgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsKICAJICAgIHZhciBlbnRyeSA9IHsKICAJICAgICAgdHJ5TG9jOiBsb2NzWzBdCiAgCSAgICB9OwogIAkgICAgMSBpbiBsb2NzICYmIChlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV0pLCAyIGluIGxvY3MgJiYgKGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdLCBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHsKICAJICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIiwgZGVsZXRlIHJlY29yZC5hcmcsIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHsKICAJICAgIHRoaXMudHJ5RW50cmllcyA9IFt7CiAgCSAgICAgIHRyeUxvYzogInJvb3QiCiAgCSAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CiAgCSAgICBpZiAoaXRlcmFibGUpIHsKICAJICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdOwogIAkgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAJICAgICAgaWYgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGl0ZXJhYmxlLm5leHQpIHJldHVybiBpdGVyYWJsZTsKICAJICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7CiAgCSAgICAgICAgdmFyIGkgPSAtMSwKICAJICAgICAgICAgIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkgewogIAkgICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgCSAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHJldHVybiB7CiAgCSAgICAgIG5leHQ6IGRvbmVSZXN1bHQKICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7CiAgCSAgICByZXR1cm4gewogIAkgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogIAkgICAgICBkb25lOiAhMAogIAkgICAgfTsKICAJICB9CiAgCSAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgImNvbnN0cnVjdG9yIiwgewogIAkgICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLAogIAkgICAgY29uZmlndXJhYmxlOiAhMAogIAkgIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgewogIAkgICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLAogIAkgICAgY29uZmlndXJhYmxlOiAhMAogIAkgIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgCSAgICB2YXIgY3RvciA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFjdG9yICYmIChjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTsKICAJICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApLCBnZW5GdW47CiAgCSAgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHsKICAJICAgIHJldHVybiB7CiAgCSAgICAgIF9fYXdhaXQ6IGFyZwogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkgewogIAkgICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsKICAJICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTsKICAJICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgCSAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKSwgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvciIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KSwgZGVmaW5lKEdwLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHsKICAJICAgIHZhciBvYmplY3QgPSBPYmplY3QodmFsKSwKICAJICAgICAga2V5cyA9IFtdOwogIAkgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7CiAgCSAgICByZXR1cm4ga2V5cy5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAJICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgcmV0dXJuIG5leHQudmFsdWUgPSBrZXksIG5leHQuZG9uZSA9ICExLCBuZXh0OwogIAkgICAgICB9CiAgCSAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgIH07CiAgCSAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0gewogIAkgICAgY29uc3RydWN0b3I6IENvbnRleHQsCiAgCSAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoc2tpcFRlbXBSZXNldCkgewogIAkgICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSAidCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpOwogIAkgICAgfSwKICAJICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7CiAgCSAgICAgIHRoaXMuZG9uZSA9ICEwOwogIAkgICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogIAkgICAgICBpZiAoInRocm93IiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZzsKICAJICAgICAgcmV0dXJuIHRoaXMucnZhbDsKICAJICAgIH0sCiAgCSAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjsKICAJICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwogIAkgICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHsKICAJICAgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSAidGhyb3ciLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7CiAgCSAgICAgIH0KICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSwKICAJICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKCJlbmQiKTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgewogIAkgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgewogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogIAkgICAgICAgICAgfSBlbHNlIHsKICAJICAgICAgICAgICAgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfQogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgfSwKICAJICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykgewogIAkgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgCSAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogIAkgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmIGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBmaW5hbGx5RW50cnkgJiYgKCJicmVhayIgPT09IHR5cGUgfHwgImNvbnRpbnVlIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTsKICAJICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsKICAJICAgICAgcmV0dXJuICJicmVhayIgPT09IHJlY29yZC50eXBlIHx8ICJjb250aW51ZSIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6ICJyZXR1cm4iID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gInJldHVybiIsIHRoaXMubmV4dCA9ICJlbmQiKSA6ICJub3JtYWwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsOwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsKICAJICAgICAgfQogIAkgICAgfSwKICAJICAgICJjYXRjaCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAJICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogIAkgICAgICAgICAgaWYgKCJ0aHJvdyIgPT09IHJlY29yZC50eXBlKSB7CiAgCSAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogIAkgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiB0aHJvd247CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgCSAgICB9LAogIAkgICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKICAJICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLAogIAkgICAgICAgIG5leHRMb2M6IG5leHRMb2MKICAJICAgICAgfSwgIm5leHQiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB1bmRlZmluZWQpLCBDb250aW51ZVNlbnRpbmVsOwogIAkgICAgfQogIAkgIH0sIGV4cG9ydHM7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHJlZ2VuZXJhdG9yUnVudGltZSQyLmV4cG9ydHM7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lJDEgPSByZWdlbmVyYXRvclJ1bnRpbWVFeHBvcnRzKCk7CiAgdmFyIHJlZ2VuZXJhdG9yJDEgPSBydW50aW1lJDE7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWUkMTsKICB9IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkgewogICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAib2JqZWN0IikgewogICAgICBnbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWUkMTsKICAgIH0gZWxzZSB7CiAgICAgIEZ1bmN0aW9uKCJyIiwgInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShydW50aW1lJDEpOwogICAgfQogIH0KCiAgdmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVnZW5lcmF0b3IkMSk7CgogIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICB9CiAgICAgICAgX25leHQodW5kZWZpbmVkKTsKICAgICAgfSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4pIHsKICAgIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07CiAgCXJldHVybiBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7CiAgfQoKICB2YXIgX3R5cGVvZl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmICJzeW1ib2wiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgcmV0dXJuIG9iaiAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOwogICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yob2JqKTsKICB9CiAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIH0pOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lJDEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CiAgdmFyIF90eXBlb2YgPSBfdHlwZW9mXzFbImRlZmF1bHQiXTsKICBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogICAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAgICAgcmV0dXJuIGV4cG9ydHM7CiAgICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogICAgdmFyIGV4cG9ydHMgPSB7fSwKICAgICAgT3AgPSBPYmplY3QucHJvdG90eXBlLAogICAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwKICAgICAgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZnVuY3Rpb24gKG9iaiwga2V5LCBkZXNjKSB7CiAgICAgICAgb2JqW2tleV0gPSBkZXNjLnZhbHVlOwogICAgICB9LAogICAgICAkU3ltYm9sID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciIsCiAgICAgIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCAiQEB0b1N0cmluZ1RhZyI7CiAgICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICB3cml0YWJsZTogITAKICAgICAgfSksIG9ialtrZXldOwogICAgfQogICAgdHJ5IHsKICAgICAgZGVmaW5lKHt9LCAiIik7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkgewogICAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwKICAgICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksCiAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgIl9pbnZva2UiLCB7CiAgICAgICAgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkKICAgICAgfSksIGdlbmVyYXRvcjsKICAgIH0KICAgIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgewogICAgICB0cnkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAibm9ybWFsIiwKICAgICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZykKICAgICAgICB9OwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogInRocm93IiwKICAgICAgICAgIGFyZzogZXJyCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgZXhwb3J0cy53cmFwID0gd3JhcDsKICAgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CiAgICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fQogICAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogICAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQogICAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsCiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpOwogICAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpOwogICAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgewogICAgICBbIm5leHQiLCAidGhyb3ciLCAicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7CiAgICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHsKICAgICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAgICAgICBpZiAoInRocm93IiAhPT0gcmVjb3JkLnR5cGUpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnLAogICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKHZhbHVlKSAmJiBoYXNPd24uY2FsbCh2YWx1ZSwgIl9fYXdhaXQiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgIGludm9rZSgidGhyb3ciLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkgewogICAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICByZXR1cm4gaW52b2tlKCJ0aHJvdyIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTsKICAgICAgfQogICAgICB2YXIgcHJldmlvdXNQcm9taXNlOwogICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX2ludm9rZSIsIHsKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsKICAgICAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsKICAgICAgdmFyIHN0YXRlID0gInN1c3BlbmRlZFN0YXJ0IjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgewogICAgICAgIGlmICgiZXhlY3V0aW5nIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogICAgICAgIGlmICgiY29tcGxldGVkIiA9PT0gc3RhdGUpIHsKICAgICAgICAgIGlmICgidGhyb3ciID09PSBtZXRob2QpIHRocm93IGFyZzsKICAgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsKICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7CiAgICAgICAgICBpZiAoZGVsZWdhdGUpIHsKICAgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkgewogICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIm5leHQiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKCJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB7CiAgICAgICAgICAgIGlmICgic3VzcGVuZGVkU3RhcnQiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5hcmc7CiAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpOwogICAgICAgICAgfSBlbHNlICJyZXR1cm4iID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOwogICAgICAgICAgc3RhdGUgPSAiZXhlY3V0aW5nIjsKICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsKICAgICAgICAgIGlmICgibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gImNvbXBsZXRlZCIgOiAic3VzcGVuZGVkWWllbGQiLCByZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmUKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgICJ0aHJvdyIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9ICJjb21wbGV0ZWQiLCBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZyk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgewogICAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLAogICAgICAgIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZE5hbWVdOwogICAgICBpZiAodW5kZWZpbmVkID09PSBtZXRob2QpIHJldHVybiBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgInRocm93IiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvclsicmV0dXJuIl0gJiYgKGNvbnRleHQubWV0aG9kID0gInJldHVybiIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkLCBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSwgInRocm93IiA9PT0gY29udGV4dC5tZXRob2QpIHx8ICJyZXR1cm4iICE9PSBtZXRob2ROYW1lICYmIChjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIiArIG1ldGhvZE5hbWUgKyAiJyBtZXRob2QiKSksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CiAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgcmV0dXJuIGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbDsKICAgICAgdmFyIGluZm8gPSByZWNvcmQuYXJnOwogICAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgInJldHVybiIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7CiAgICB9CiAgICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykgewogICAgICB2YXIgZW50cnkgPSB7CiAgICAgICAgdHJ5TG9jOiBsb2NzWzBdCiAgICAgIH07CiAgICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkgewogICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIiwgZGVsZXRlIHJlY29yZC5hcmcsIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7CiAgICB9CiAgICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgICAgIHRoaXMudHJ5RW50cmllcyA9IFt7CiAgICAgICAgdHJ5TG9jOiAicm9vdCIKICAgICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgICB9CiAgICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHsKICAgICAgaWYgKGl0ZXJhYmxlKSB7CiAgICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdOwogICAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpOwogICAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7CiAgICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7CiAgICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB1bmRlZmluZWQsIG5leHQuZG9uZSA9ICEwLCBuZXh0OwogICAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbmV4dDogZG9uZVJlc3VsdAogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6ICEwCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZVByb3BlcnR5KEdwLCAiY29uc3RydWN0b3IiLCB7CiAgICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwKICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgfSksIGRlZmluZVByb3BlcnR5KEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCAiY29uc3RydWN0b3IiLCB7CiAgICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIiksIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIChnZW5GdW4pIHsKICAgICAgdmFyIGN0b3IgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogICAgICByZXR1cm4gISFjdG9yICYmIChjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTsKICAgIH0sIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uIChnZW5GdW4pIHsKICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOwogICAgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBfX2F3YWl0OiBhcmcKICAgICAgfTsKICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkgewogICAgICB2b2lkIDAgPT09IFByb21pc2VJbXBsICYmIChQcm9taXNlSW1wbCA9IFByb21pc2UpOwogICAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7CiAgICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7CiAgICAgIH0pOwogICAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKSwgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvciIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSksIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgICB9KSwgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKHZhbCkgewogICAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksCiAgICAgICAga2V5cyA9IFtdOwogICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBrZXlzLnB1c2goa2V5KTsKICAgICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHsKICAgICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpOwogICAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHQuZG9uZSA9ICEwLCBuZXh0OwogICAgICB9OwogICAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCwKICAgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKICAgICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSAidCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpOwogICAgICB9LAogICAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgIHRoaXMuZG9uZSA9ICEwOwogICAgICAgIHZhciByb290UmVjb3JkID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgICAgICAgaWYgKCJ0aHJvdyIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7CiAgICAgICAgcmV0dXJuIHRoaXMucnZhbDsKICAgICAgfSwKICAgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgewogICAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjsKICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgICAgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSAidGhyb3ciLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSwKICAgICAgICAgICAgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAgICAgICAgIGlmICgicm9vdCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgewogICAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgImNhdGNoTG9jIiksCiAgICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwogICAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgewogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7CiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykgewogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmIGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseUVudHJ5ICYmICgiYnJlYWsiID09PSB0eXBlIHx8ICJjb250aW51ZSIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7CiAgICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307CiAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gdHlwZSwgcmVjb3JkLmFyZyA9IGFyZywgZmluYWxseUVudHJ5ID8gKHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7CiAgICAgIH0sCiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7CiAgICAgICAgaWYgKCJ0aHJvdyIgPT09IHJlY29yZC50eXBlKSB0aHJvdyByZWNvcmQuYXJnOwogICAgICAgIHJldHVybiAiYnJlYWsiID09PSByZWNvcmQudHlwZSB8fCAiY29udGludWUiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiAicmV0dXJuIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDsKICAgICAgfSwKICAgICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goZmluYWxseUxvYykgewogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSByZXR1cm4gdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkoZW50cnkpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICAgIH0KICAgICAgfSwKICAgICAgImNhdGNoIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykgewogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykgewogICAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAgICAgICAgICAgaWYgKCJ0aHJvdyIgPT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7CiAgICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRocm93bjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgewogICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlID0gewogICAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksCiAgICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLAogICAgICAgICAgbmV4dExvYzogbmV4dExvYwogICAgICAgIH0sICJuZXh0IiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsKICAgICAgfQogICAgfSwgZXhwb3J0czsKICB9CiAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIH0pOwoKICAvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLgoKICB2YXIgcnVudGltZSA9IHJlZ2VuZXJhdG9yUnVudGltZSQxKCk7CiAgdmFyIHJlZ2VuZXJhdG9yID0gcnVudGltZTsKCiAgLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9wYWNrYWdlcy9ydW50aW1lL3J1bnRpbWUuanMjTDczNj0KICB0cnkgewogICAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKICB9IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkgewogICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAib2JqZWN0IikgewogICAgICBnbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2Yob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmIChfdHlwZW9mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgewogICAgICByZXR1cm4gY2FsbDsKICAgIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsKICAgIH07CiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOwogIH0KCiAgZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9CiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfcGF0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21ldGEiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RmlsZSwgW3sKICAgICAga2V5OiAibWV0YSIsCiAgICAgIGdldDoKICAgICAgLyoqDQogICAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5fbWV0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCQxKHsKICAgICAgICAgIHZlcnNpb246IDAKICAgICAgICB9LCB0aGlzLl9tZXRhKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZGaWxlLCAiX2ZpbGVQdHJzIiwgbmV3IE1hcCgpKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KICBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQdkZpbGVNZW0pOwogICAgZnVuY3Rpb24gUHZGaWxlTWVtKHBhdGgsIG1ldGEsIGRiLCBtb2RlKSB7CiAgICAgIHZhciBfdGhpczsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB2RmlsZU1lbSk7CiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wb3MiLCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX21vZGUiLCB2b2lkIDApOwogICAgICBfdGhpcy5fcGF0aCA9IHBhdGg7CiAgICAgIF90aGlzLl9tZXRhID0gbWV0YTsKICAgICAgX3RoaXMuX21vZGUgPSBtb2RlOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlTWVtLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVhZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKHNpemUsIGNvdW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzRU9GKSB7CiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgIGVyci5uYW1lID0gIkVuZE9mRmlsZSI7CiAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgfQogICAgICAgIHZhciB0b0NvcHkgPSBNYXRoLm1pbihzaXplICogY291bnQsIHRoaXMuX2ZpbGUubGVuZ3RoIC0gdGhpcy5fcG9zKTsKICAgICAgICB2YXIgdG90YWxFbGVtcyA9IHRvQ29weSAtIHRvQ29weSAlIHNpemU7CiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsRWxlbXMpOwogICAgICAgIGJ1ZmZlci5zZXQodGhpcy5fZmlsZS5zbGljZSh0aGlzLl9wb3MsIHRoaXMuX3BvcyArIHRvdGFsRWxlbXMpLCAwKTsKICAgICAgICB0aGlzLl9wb3MgKz0gdG90YWxFbGVtczsKICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIndyaXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGNvbnRlbnQpIHsKICAgICAgICB2YXIgbmV3RmlsZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3BvcyArIGNvbnRlbnQubGVuZ3RoKTsKICAgICAgICBpZiAodGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBuZXdGaWxlLnNldCh0aGlzLl9maWxlLnNsaWNlKDAsIHRoaXMuX3BvcykpOwogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCwgdGhpcy5fcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ZpbGUgPSBuZXdGaWxlOwogICAgICAgIHRoaXMuX3BvcyArPSBjb250ZW50Lmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWVrIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkgJiYgdGhpcy5fbW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInIi5jb25jYXQodGhpcy5fcGF0aCwgIicgZG9lc24ndCBleGlzdC4iKSk7CiAgICAgICAgfQogICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgIGVyci5uYW1lID0gIkVuZE9mRmlsZSI7CiAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgfQogICAgICAgIHZhciBuZXdPZmZzZXQ7CiAgICAgICAgaWYgKHdoZW5jZSA9PT0gMCkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDEpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX3BvcyArIG9mZnNldCwgdGhpcy5fZmlsZS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAyKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbih0aGlzLl9maWxlLmxlbmd0aCArIG9mZnNldCwgdGhpcy5fZmlsZS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgb3BlcmF0aW9uOiAiLmNvbmNhdCh3aGVuY2UsICIuIikpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wb3MgPSBuZXdPZmZzZXQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAidGVsbCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWxsKCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcG9zOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZW1vdmUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgUHZGaWxlTWVtLl9tZW1GaWxlc1siZGVsZXRlIl0odGhpcy5fcGF0aCk7CiAgICAgICAgICAgICAgICB0aGlzLl9maWxlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5fcG9zID0gMDsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlOwogICAgICB9KCkKICAgIH0sIHsKICAgICAga2V5OiAiZXhpc3RzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4aXN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9pc0VPRiIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9wb3MgPj0gdGhpcy5fZmlsZS5sZW5ndGg7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2ZpbGUiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gUHZGaWxlTWVtLl9tZW1GaWxlcy5nZXQodGhpcy5fcGF0aCk7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGNvbnRlbnQpIHsKICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzLnNldCh0aGlzLl9wYXRoLCBjb250ZW50KTsKICAgICAgfQogICAgfV0sIFt7CiAgICAgIGtleTogIm9wZW4iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihwYXRoLCBtb2RlKSB7CiAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uX21lbUZpbGVzLmdldChwYXRoKTsKICAgICAgICB2YXIgZGJNb2RlID0gbW9kZS5pbmNsdWRlcygncicpID8gInJlYWRvbmx5IiA6ICJyZWFkd3JpdGUiOwogICAgICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQgJiYgZGJNb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIiciLmNvbmNhdChwYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICAgIGVycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbGVNZW0gPSBuZXcgUHZGaWxlTWVtKHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkYk1vZGUpOwogICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgIGZpbGVNZW0uc2VlaygwLCAyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbGVNZW07CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBQdkZpbGVNZW07CiAgfShQdkZpbGUpOwogIF9kZWZpbmVQcm9wZXJ0eShQdkZpbGVNZW0sICJfbWVtRmlsZXMiLCBuZXcgTWFwKCkpOwogIC8qKg0KICAgKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHBocmFzZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZw0KICAgKg0KICAgKiBAcGFyYW0gYXJyYXlCdWZmZXIgaW5wdXQgYXJyYXkgYnVmZmVyDQogICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGhyYXNlIGlzIHN0b3JlZA0KICAgKiBAcmV0dXJuIHJldHJpZXZlZCBzdHJpbmcNCiAgICovCiAgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgoYXJyYXlCdWZmZXIsIGluZGV4U3RhcnQpIHsKICAgIHZhciBpbmRleEVuZCA9IGluZGV4U3RhcnQ7CiAgICB3aGlsZSAoYXJyYXlCdWZmZXJbaW5kZXhFbmRdICE9PSAwKSB7CiAgICAgIGluZGV4RW5kKys7CiAgICB9CiAgICB2YXIgdXRmOGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04Jyk7CiAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKGFycmF5QnVmZmVyLnN1YmFycmF5KGluZGV4U3RhcnQsIGluZGV4RW5kKSk7CiAgfQogIC8qKg0KICAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFuZCBzdG9yZWQgaXQgaW4gYSBVaW50OEFycmF5IGFycmF5DQogICAqDQogICAqIEBwYXJhbSBiYXNlNjRTdHJpbmcgaW5wdXQgYmFzZTY0IHN0cmluZw0KICAgKiBAcmV0dXJuIGRlY29kZWQgYXJyYXkNCiAgICovCiAgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykgewogICAgdmFyIGJhc2U2NFN0cmluZ0RlY29kZWQgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShiYXNlNjRTdHJpbmdEZWNvZGVkLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0cmluZ0RlY29kZWQubGVuZ3RoOyBpKyspIHsKICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiYXNlNjRTdHJpbmdEZWNvZGVkLmNoYXJDb2RlQXQoaSk7CiAgICB9CiAgICByZXR1cm4gYmluYXJ5QXJyYXk7CiAgfQoKICAvKg0KICAgICAgQ29weXJpZ2h0IDIwMjEgUGljb3ZvaWNlIEluYy4NCgogICAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24NCiAgICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAwLCBhcnJvdy1ib2R5LXN0eWxlOiAwLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6IDAsIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXM6IDAgKi8KICB2YXIgd2FzaVNuYXBzaG90UHJldmlldzFFbXVsYXRvciA9IHsKICAgIGFyZ3NfZ2V0OiBmdW5jdGlvbiBhcmdzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBhcmdzX3NpemVzX2dldDogZnVuY3Rpb24gYXJnc19zaXplc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZW52aXJvbl9nZXQ6IGZ1bmN0aW9uIGVudmlyb25fZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fc2l6ZXNfZ2V0OiBmdW5jdGlvbiBlbnZpcm9uX3NpemVzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja19yZXNfZ2V0OiBmdW5jdGlvbiBjbG9ja19yZXNfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGNsb2NrX3RpbWVfZ2V0OiBmdW5jdGlvbiBjbG9ja190aW1lX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9hZHZpc2U6IGZ1bmN0aW9uIGZkX2FkdmlzZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9hbGxvY2F0ZTogZnVuY3Rpb24gZmRfYWxsb2NhdGUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfY2xvc2U6IGZ1bmN0aW9uIGZkX2Nsb3NlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2RhdGFzeW5jOiBmdW5jdGlvbiBmZF9kYXRhc3luYyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfZ2V0OiBmdW5jdGlvbiBmZF9mZHN0YXRfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfZmxhZ3M6IGZ1bmN0aW9uIGZkX2Zkc3RhdF9zZXRfZmxhZ3MoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X3NldF9yaWdodHM6IGZ1bmN0aW9uIGZkX2Zkc3RhdF9zZXRfcmlnaHRzKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X2dldDogZnVuY3Rpb24gZmRfZmlsZXN0YXRfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X3NldF9zaXplOiBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfc2l6ZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfdGltZXM6IGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF90aW1lcyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVhZDogZnVuY3Rpb24gZmRfcHJlYWQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlc3RhdF9nZXQ6IGZ1bmN0aW9uIGZkX3ByZXN0YXRfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZGlyX25hbWU6IGZ1bmN0aW9uIGZkX3ByZXN0YXRfZGlyX25hbWUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHdyaXRlOiBmdW5jdGlvbiBmZF9wd3JpdGUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZDogZnVuY3Rpb24gZmRfcmVhZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZWFkZGlyOiBmdW5jdGlvbiBmZF9yZWFkZGlyKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlbnVtYmVyOiBmdW5jdGlvbiBmZF9yZW51bWJlcihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zZWVrOiBmdW5jdGlvbiBmZF9zZWVrKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3N5bmM6IGZ1bmN0aW9uIGZkX3N5bmMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfdGVsbDogZnVuY3Rpb24gZmRfdGVsbChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF93cml0ZTogZnVuY3Rpb24gZmRfd3JpdGUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9jcmVhdGVfZGlyZWN0b3J5OiBmdW5jdGlvbiBwYXRoX2NyZWF0ZV9kaXJlY3RvcnkoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9maWxlc3RhdF9nZXQ6IGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzOiBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X3NldF90aW1lcyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2xpbms6IGZ1bmN0aW9uIHBhdGhfbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX29wZW46IGZ1bmN0aW9uIHBhdGhfb3BlbihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlYWRsaW5rOiBmdW5jdGlvbiBwYXRoX3JlYWRsaW5rKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeTogZnVuY3Rpb24gcGF0aF9yZW1vdmVfZGlyZWN0b3J5KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVuYW1lOiBmdW5jdGlvbiBwYXRoX3JlbmFtZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3N5bWxpbms6IGZ1bmN0aW9uIHBhdGhfc3ltbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3VubGlua19maWxlOiBmdW5jdGlvbiBwYXRoX3VubGlua19maWxlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBvbGxfb25lb2ZmOiBmdW5jdGlvbiBwb2xsX29uZW9mZihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwcm9jX2V4aXQ6IGZ1bmN0aW9uIHByb2NfZXhpdChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwcm9jX3JhaXNlOiBmdW5jdGlvbiBwcm9jX3JhaXNlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNjaGVkX3lpZWxkOiBmdW5jdGlvbiBzY2hlZF95aWVsZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICByYW5kb21fZ2V0OiBmdW5jdGlvbiByYW5kb21fZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfcmVjdjogZnVuY3Rpb24gc29ja19yZWN2KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2VuZDogZnVuY3Rpb24gc29ja19zZW5kKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2h1dGRvd246IGZ1bmN0aW9uIHNvY2tfc2h1dGRvd24oaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfTsKCiAgdmFyIFBWX1NUQVRVU19TVUNDRVNTID0gMTAwMDA7CiAgdmFyIFJlc2FtcGxlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBSZXNhbXBsZXIoaGFuZGxlV2FzbSkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBSZXNhbXBsZXIpOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb0lucHV0U2FtcGxlUmF0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZSZXNhbXBsZXJDb252ZXJ0TnVtU2FtcGxlc1RvT3V0cHV0U2FtcGxlUmF0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZSZXNhbXBsZXJEZWxldGUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2UmVzYW1wbGVyUHJvY2VzcyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZSZXNhbXBsZXJSZXNldCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfY0FsaWduZWRBbGxvYyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfaW5wdXRCdWZmZXJBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9vYmplY3RBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9vdXRwdXRCdWZmZXJBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl93YXNtTWVtb3J5Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9mcmFtZUxlbmd0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfaW5wdXRCdWZmZXJMZW5ndGgiLCB2b2lkIDApOwogICAgICBSZXNhbXBsZXIuX3ZlcnNpb24gPSBoYW5kbGVXYXNtLnZlcnNpb247CiAgICAgIHRoaXMuX3B2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb0lucHV0U2FtcGxlUmF0ZSA9IGhhbmRsZVdhc20ucHZSZXNhbXBsZXJDb252ZXJ0TnVtU2FtcGxlc1RvSW5wdXRTYW1wbGVSYXRlOwogICAgICB0aGlzLl9wdlJlc2FtcGxlckNvbnZlcnROdW1TYW1wbGVzVG9PdXRwdXRTYW1wbGVSYXRlID0gaGFuZGxlV2FzbS5wdlJlc2FtcGxlckNvbnZlcnROdW1TYW1wbGVzVG9PdXRwdXRTYW1wbGVSYXRlOwogICAgICB0aGlzLl9wdlJlc2FtcGxlclJlc2V0ID0gaGFuZGxlV2FzbS5wdlJlc2FtcGxlclJlc2V0OwogICAgICB0aGlzLl9wdlJlc2FtcGxlclByb2Nlc3MgPSBoYW5kbGVXYXNtLnB2UmVzYW1wbGVyUHJvY2VzczsKICAgICAgdGhpcy5fcHZSZXNhbXBsZXJEZWxldGUgPSBoYW5kbGVXYXNtLnB2UmVzYW1wbGVyRGVsZXRlOwogICAgICB0aGlzLl9jQWxpZ25lZEFsbG9jID0gaGFuZGxlV2FzbS5jQWxpZ25lZEFsbG9jOwogICAgICB0aGlzLl93YXNtTWVtb3J5ID0gaGFuZGxlV2FzbS5tZW1vcnk7CiAgICAgIHRoaXMuX2lucHV0QnVmZmVyQWRkcmVzcyA9IGhhbmRsZVdhc20uaW5wdXRCdWZmZXJBZGRyZXNzOwogICAgICB0aGlzLl9vYmplY3RBZGRyZXNzID0gaGFuZGxlV2FzbS5vYmplY3RBZGRyZXNzOwogICAgICB0aGlzLl9vdXRwdXRCdWZmZXJBZGRyZXNzID0gaGFuZGxlV2FzbS5vdXRwdXRCdWZmZXJBZGRyZXNzOwogICAgICB0aGlzLl9mcmFtZUxlbmd0aCA9IGhhbmRsZVdhc20uZnJhbWVMZW5ndGg7CiAgICAgIHRoaXMuX2lucHV0QnVmZmVyTGVuZ3RoID0gaGFuZGxlV2FzbS5pbnB1dEZyYW1lTGVuZ3RoOwogICAgfQogICAgX2NyZWF0ZUNsYXNzJDEoUmVzYW1wbGVyLCBbewogICAgICBrZXk6ICJwcm9jZXNzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXRGcmFtZSwgb3V0cHV0QnVmZmVyKSB7CiAgICAgICAgaWYgKGlucHV0RnJhbWUubGVuZ3RoID4gdGhpcy5faW5wdXRCdWZmZXJMZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5wdXRGcmFtZSBsZW5ndGggJyIuY29uY2F0KGlucHV0RnJhbWUubGVuZ3RoLCAiJyBtdXN0IGJlIHNtYWxsZXIgdGhhbiAiKS5jb25jYXQodGhpcy5faW5wdXRCdWZmZXJMZW5ndGgsICIuIikpOwogICAgICAgIH0KICAgICAgICB2YXIgaW5wdXRCdWZmZXIgPSBuZXcgSW50MTZBcnJheShpbnB1dEZyYW1lLmxlbmd0aCk7CiAgICAgICAgaWYgKGlucHV0RnJhbWUuY29uc3RydWN0b3IgPT09IEZsb2F0MzJBcnJheSkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dEZyYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lW2ldIDwgMCkgewogICAgICAgICAgICAgIGlucHV0QnVmZmVyW2ldID0gMHg4MDAwICogaW5wdXRGcmFtZVtpXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpbnB1dEJ1ZmZlcltpXSA9IDB4N2ZmZiAqIGlucHV0RnJhbWVbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlucHV0RnJhbWUuY29uc3RydWN0b3IgPT09IEludDE2QXJyYXkpIHsKICAgICAgICAgIGlucHV0QnVmZmVyID0gaW5wdXRGcmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0RnJhbWUgdHlwZTogIi5jb25jYXQoX3R5cGVvZiQyKGlucHV0RnJhbWUpLCAiLiBFeHBlY3RlZCBGbG9hdDMyQXJyYXkgb3IgSW50MTZBcnJheS4iKSk7CiAgICAgICAgfQogICAgICAgIHZhciBtZW1vcnlCdWZmZXIgPSBuZXcgSW50MTZBcnJheSh0aGlzLl93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgbWVtb3J5QnVmZmVyLnNldChpbnB1dEJ1ZmZlciwgdGhpcy5faW5wdXRCdWZmZXJBZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgdmFyIHByb2Nlc3NlZFNhbXBsZXMgPSB0aGlzLl9wdlJlc2FtcGxlclByb2Nlc3ModGhpcy5fb2JqZWN0QWRkcmVzcywgdGhpcy5faW5wdXRCdWZmZXJBZGRyZXNzLCBpbnB1dEZyYW1lLmxlbmd0aCwgdGhpcy5fb3V0cHV0QnVmZmVyQWRkcmVzcyk7CiAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9jZXNzZWRTYW1wbGVzOyBfaSsrKSB7CiAgICAgICAgICBvdXRwdXRCdWZmZXJbX2ldID0gbWVtb3J5QnVmZmVyVmlldy5nZXRJbnQxNih0aGlzLl9vdXRwdXRCdWZmZXJBZGRyZXNzICsgX2kgKiBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZFNhbXBsZXM7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgdGhpcy5fcHZSZXNhbXBsZXJSZXNldCh0aGlzLl9vYmplY3RBZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWxlYXNlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7CiAgICAgICAgdGhpcy5fcHZSZXNhbXBsZXJEZWxldGUodGhpcy5fb2JqZWN0QWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaW5wdXRCdWZmZXJMZW5ndGgiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRCdWZmZXJMZW5ndGg7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZnJhbWVMZW5ndGgiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVMZW5ndGg7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAidmVyc2lvbiIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBSZXNhbXBsZXIuX3ZlcnNpb247CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0TnVtUmVxdWlyZWRJbnB1dFNhbXBsZXMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtUmVxdWlyZWRJbnB1dFNhbXBsZXMobnVtU2FtcGxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3B2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb0lucHV0U2FtcGxlUmF0ZSh0aGlzLl9vYmplY3RBZGRyZXNzLCBudW1TYW1wbGUpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldE51bVJlcXVpcmVkT3V0cHV0U2FtcGxlcyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROdW1SZXF1aXJlZE91dHB1dFNhbXBsZXMobnVtU2FtcGxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3B2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb091dHB1dFNhbXBsZVJhdGUodGhpcy5fb2JqZWN0QWRkcmVzcywgbnVtU2FtcGxlKTsKICAgICAgfQogICAgfV0sIFt7CiAgICAgIGtleTogInNldFdhc20iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2FzbSh3YXNtKSB7CiAgICAgICAgaWYgKHRoaXMuX3dhc20gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fd2FzbSA9IHdhc207CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNyZWF0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9jcmVhdGUgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaW5wdXRGcmVxdWVuY3ksIG91dHB1dEZyZXF1ZW5jeSwgb3JkZXIsIGZyYW1lTGVuZ3RoKSB7CiAgICAgICAgICB2YXIgd2FzbU91dHB1dDsKICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBSZXNhbXBsZXIuaW5pdFdhc20oaW5wdXRGcmVxdWVuY3ksIG91dHB1dEZyZXF1ZW5jeSwgb3JkZXIsIGZyYW1lTGVuZ3RoKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICB3YXNtT3V0cHV0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIG5ldyBSZXNhbXBsZXIod2FzbU91dHB1dCkpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeCwgX3gyLCBfeDMsIF94NCkgewogICAgICAgICAgcmV0dXJuIF9jcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogImluaXRXYXNtIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXRXYXNtID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMihpbnB1dEZyZXF1ZW5jeSwgb3V0cHV0RnJlcXVlbmN5LCBvcmRlciwgZnJhbWVMZW5ndGgpIHsKICAgICAgICAgIHZhciBtZW1vcnksIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwdkNvbnNvbGVMb2dXYXNtLCBwdkFzc2VydFdhc20sIGltcG9ydE9iamVjdCwgd2FzbUNvZGVBcnJheSwgX3lpZWxkJFdlYkFzc2VtYmx5JGluLCBpbnN0YW5jZSwgY0FsaWduZWRBbGxvYywgcHZSZXNhbXBsZXJJbml0LCBwdlJlc2FtcGxlckNvbnZlcnROdW1TYW1wbGVzVG9JbnB1dFNhbXBsZVJhdGUsIHB2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb091dHB1dFNhbXBsZVJhdGUsIHB2UmVzYW1wbGVyVmVyc2lvbiwgb2JqZWN0QWRkcmVzc0FkZHJlc3MsIHN0YXR1cywgdmVyc2lvbkFkZHJlc3MsIHZlcnNpb24sIG1lbW9yeUJ1ZmZlclZpZXcsIG9iamVjdEFkZHJlc3MsIGlucHV0RnJhbWVMZW5ndGgsIGlucHV0QnVmZmVyQWRkcmVzcywgb3V0cHV0QnVmZmVyQWRkcmVzcywgcHZSZXNhbXBsZXJSZXNldCwgcHZSZXNhbXBsZXJQcm9jZXNzLCBwdlJlc2FtcGxlckRlbGV0ZTsKICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgLy8gQSBXZWJBc3NlbWJseSBwYWdlIGhhcyBhIGNvbnN0YW50IHNpemUgb2YgNjRLaUIuIC0+IDRNaUIgfj0gNjQgcGFnZXMKICAgICAgICAgICAgICAgIC8vIG1pbmltdW0gbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5pdDogMiBwYWdlcwogICAgICAgICAgICAgICAgbWVtb3J5ID0gbmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7CiAgICAgICAgICAgICAgICAgIGluaXRpYWw6IDY0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICBwdkNvbnNvbGVMb2dXYXNtID0gZnVuY3Rpb24gcHZDb25zb2xlTG9nV2FzbShpbmRleCkgewogICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaW5kZXgpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBwdkFzc2VydFdhc20gPSBmdW5jdGlvbiBwdkFzc2VydFdhc20oZXhwciwgbGluZSwgZmlsZU5hbWVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleHByID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGZpbGVOYW1lQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgIi5jb25jYXQobGluZSwgIiBpbiBcIiIpLmNvbmNhdChmaWxlTmFtZSwgIlwiIikpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaW1wb3J0T2JqZWN0ID0gewogICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgICAgIHdhc2lfc25hcHNob3RfcHJldmlldzE6IHdhc2lTbmFwc2hvdFByZXZpZXcxRW11bGF0b3IsCiAgICAgICAgICAgICAgICAgIGVudjogewogICAgICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2UKICAgICAgICAgICAgICAgICAgICBwdl9jb25zb2xlX2xvZ193YXNtOiBwdkNvbnNvbGVMb2dXYXNtLAogICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2UKICAgICAgICAgICAgICAgICAgICBwdl9hc3NlcnRfd2FzbTogcHZBc3NlcnRXYXNtCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB3YXNtQ29kZUFycmF5ID0gYmFzZTY0VG9VaW50OEFycmF5KHRoaXMuX3dhc20pOwogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4OwogICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21Db2RlQXJyYXksIGltcG9ydE9iamVjdCk7CiAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgX3lpZWxkJFdlYkFzc2VtYmx5JGluID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IF95aWVsZCRXZWJBc3NlbWJseSRpbi5pbnN0YW5jZTsKICAgICAgICAgICAgICAgIGNBbGlnbmVkQWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgICAgICBwdlJlc2FtcGxlckluaXQgPSBpbnN0YW5jZS5leHBvcnRzLnB2X3Jlc2FtcGxlcl9pbml0OwogICAgICAgICAgICAgICAgcHZSZXNhbXBsZXJDb252ZXJ0TnVtU2FtcGxlc1RvSW5wdXRTYW1wbGVSYXRlID0gaW5zdGFuY2UuZXhwb3J0cy5wdl9yZXNhbXBsZXJfY29udmVydF9udW1fc2FtcGxlc190b19pbnB1dF9zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIHB2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb091dHB1dFNhbXBsZVJhdGUgPSBpbnN0YW5jZS5leHBvcnRzLnB2X3Jlc2FtcGxlcl9jb252ZXJ0X251bV9zYW1wbGVzX3RvX291dHB1dF9zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIHB2UmVzYW1wbGVyVmVyc2lvbiA9IGluc3RhbmNlLmV4cG9ydHMucHZfcmVzYW1wbGVyX3ZlcnNpb247CiAgICAgICAgICAgICAgICBvYmplY3RBZGRyZXNzQWRkcmVzcyA9IGNBbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3RBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgc3RhdHVzID0gcHZSZXNhbXBsZXJJbml0KGlucHV0RnJlcXVlbmN5LCBvdXRwdXRGcmVxdWVuY3ksIG9yZGVyLCBvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB2ZXJzaW9uQWRkcmVzcyA9IHB2UmVzYW1wbGVyVmVyc2lvbigpOwogICAgICAgICAgICAgICAgdmVyc2lvbiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCB2ZXJzaW9uQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicHZfcmVzYW1wbGVyX2luaXQgZmFpbGVkIHdpdGggc3RhdHVzICIuY29uY2F0KHN0YXR1cykpOwogICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJWaWV3ID0gbmV3IERhdGFWaWV3KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzcyA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0SW50MzIob2JqZWN0QWRkcmVzc0FkZHJlc3MsIHRydWUpOwogICAgICAgICAgICAgICAgaW5wdXRGcmFtZUxlbmd0aCA9IHB2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb0lucHV0U2FtcGxlUmF0ZShvYmplY3RBZGRyZXNzLCBmcmFtZUxlbmd0aCkgKyAxOwogICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJBZGRyZXNzID0gY0FsaWduZWRBbGxvYyhJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBpbnB1dEZyYW1lTGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICBpZiAoIShpbnB1dEJ1ZmZlckFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckFkZHJlc3MgPSBjQWxpZ25lZEFsbG9jKEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGZyYW1lTGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICBpZiAoIShvdXRwdXRCdWZmZXJBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDMyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICBwdlJlc2FtcGxlclJlc2V0ID0gaW5zdGFuY2UuZXhwb3J0cy5wdl9yZXNhbXBsZXJfcmVzZXQ7CiAgICAgICAgICAgICAgICBwdlJlc2FtcGxlclByb2Nlc3MgPSBpbnN0YW5jZS5leHBvcnRzLnB2X3Jlc2FtcGxlcl9wcm9jZXNzOwogICAgICAgICAgICAgICAgcHZSZXNhbXBsZXJEZWxldGUgPSBpbnN0YW5jZS5leHBvcnRzLnB2X3Jlc2FtcGxlcl9kZWxldGU7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgICAgICBjQWxpZ25lZEFsbG9jOiBjQWxpZ25lZEFsbG9jLAogICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyQWRkcmVzczogaW5wdXRCdWZmZXJBZGRyZXNzLAogICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lTGVuZ3RoOiBpbnB1dEZyYW1lTGVuZ3RoLAogICAgICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzczogb2JqZWN0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyQWRkcmVzczogb3V0cHV0QnVmZmVyQWRkcmVzcywKICAgICAgICAgICAgICAgICAgcHZSZXNhbXBsZXJDb252ZXJ0TnVtU2FtcGxlc1RvSW5wdXRTYW1wbGVSYXRlOiBwdlJlc2FtcGxlckNvbnZlcnROdW1TYW1wbGVzVG9JbnB1dFNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgIHB2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb091dHB1dFNhbXBsZVJhdGU6IHB2UmVzYW1wbGVyQ29udmVydE51bVNhbXBsZXNUb091dHB1dFNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgIHB2UmVzYW1wbGVyRGVsZXRlOiBwdlJlc2FtcGxlckRlbGV0ZSwKICAgICAgICAgICAgICAgICAgcHZSZXNhbXBsZXJJbml0OiBwdlJlc2FtcGxlckluaXQsCiAgICAgICAgICAgICAgICAgIHB2UmVzYW1wbGVyUHJvY2VzczogcHZSZXNhbXBsZXJQcm9jZXNzLAogICAgICAgICAgICAgICAgICBwdlJlc2FtcGxlclJlc2V0OiBwdlJlc2FtcGxlclJlc2V0LAogICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBpbml0V2FzbShfeDUsIF94NiwgX3g3LCBfeDgpIHsKICAgICAgICAgIHJldHVybiBfaW5pdFdhc20uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluaXRXYXNtOwogICAgICB9KCkKICAgIH1dKTsKICAgIHJldHVybiBSZXNhbXBsZXI7CiAgfSgpOwogIF9kZWZpbmVQcm9wZXJ0eSQxKFJlc2FtcGxlciwgIl93YXNtIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShSZXNhbXBsZXIsICJfdmVyc2lvbiIsIHZvaWQgMCk7CgogIHZhciBhY2N1bXVsYXRvciA9IG51bGw7CiAgdmFyIHJlc2FtcGxlciA9IG51bGw7CiAgdmFyIEJ1ZmZlckFjY3VtdWxhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEJ1ZmZlckFjY3VtdWxhdG9yKGZyYW1lTGVuZ3RoLCBpbnB1dEJ1ZmZlckxlbmd0aCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBCdWZmZXJBY2N1bXVsYXRvcik7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfZnJhbWVMZW5ndGgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2lucHV0QnVmZmVyTGVuZ3RoIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9idWZmZXIiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2NvcGllZCIsIHZvaWQgMCk7CiAgICAgIHRoaXMuX2ZyYW1lTGVuZ3RoID0gZnJhbWVMZW5ndGg7CiAgICAgIHRoaXMuX2lucHV0QnVmZmVyTGVuZ3RoID0gaW5wdXRCdWZmZXJMZW5ndGg7CiAgICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBJbnQxNkFycmF5KGZyYW1lTGVuZ3RoKTsKICAgICAgdGhpcy5fY29waWVkID0gMDsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyQxKEJ1ZmZlckFjY3VtdWxhdG9yLCBbewogICAgICBrZXk6ICJwcm9jZXNzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3MoZnJhbWVzKSB7CiAgICAgICAgdmFyIHJlbWFpbmluZyA9IGZyYW1lcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKICAgICAgICAgIHZhciBfcmVzYW1wbGVyJHByb2Nlc3MsIF9yZXNhbXBsZXI7CiAgICAgICAgICB2YXIgdG9Qcm9jZXNzID0gTWF0aC5taW4ocmVtYWluaW5nLCB0aGlzLl9pbnB1dEJ1ZmZlckxlbmd0aCk7CiAgICAgICAgICB2YXIgb3V0cHV0QnVmZmVyID0gbmV3IEludDE2QXJyYXkodGhpcy5fZnJhbWVMZW5ndGgpOwogICAgICAgICAgdmFyIHByb2Nlc3NlZFNhbXBsZXMgPSAoX3Jlc2FtcGxlciRwcm9jZXNzID0gKF9yZXNhbXBsZXIgPSByZXNhbXBsZXIpID09PSBudWxsIHx8IF9yZXNhbXBsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXNhbXBsZXIucHJvY2VzcyhmcmFtZXMuc2xpY2UoMCwgdG9Qcm9jZXNzKSwgb3V0cHV0QnVmZmVyKSkgIT09IG51bGwgJiYgX3Jlc2FtcGxlciRwcm9jZXNzICE9PSB2b2lkIDAgPyBfcmVzYW1wbGVyJHByb2Nlc3MgOiAwOwogICAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHByb2Nlc3NlZFNhbXBsZXMsIHRoaXMuX2ZyYW1lTGVuZ3RoIC0gdGhpcy5fY29waWVkKTsKICAgICAgICAgIHRoaXMuX2J1ZmZlci5zZXQob3V0cHV0QnVmZmVyLnNsaWNlKDAsIHRvQ29weSksIHRoaXMuX2NvcGllZCk7CiAgICAgICAgICBpZiAodG9Db3B5IDwgcHJvY2Vzc2VkU2FtcGxlcykgewogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIHJlc3VsdDogdGhpcy5fYnVmZmVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9jb3BpZWQgPSAwOwogICAgICAgICAgICB0aGlzLl9idWZmZXIgPSBuZXcgSW50MTZBcnJheSh0aGlzLl9mcmFtZUxlbmd0aCk7CiAgICAgICAgICAgIHRoaXMuX2J1ZmZlci5zZXQob3V0cHV0QnVmZmVyLnNsaWNlKHRvQ29weSwgcHJvY2Vzc2VkU2FtcGxlcyksIDApOwogICAgICAgICAgICB0aGlzLl9jb3BpZWQgPSBwcm9jZXNzZWRTYW1wbGVzIC0gdG9Db3B5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fY29waWVkICs9IHRvQ29weTsKICAgICAgICAgIH0KICAgICAgICAgIGZyYW1lcyA9IGZyYW1lcy5zbGljZSh0b1Byb2Nlc3MsIGZyYW1lcy5sZW5ndGgpOwogICAgICAgICAgcmVtYWluaW5nIC09IHRvUHJvY2VzczsKICAgICAgICB9CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBCdWZmZXJBY2N1bXVsYXRvcjsKICB9KCk7CiAgb25tZXNzYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGV2ZW50KSB7CiAgICAgIHZhciBfYWNjdW11bGF0b3IsIGlucHV0RnJhbWU7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dC50MCA9IGV2ZW50LmRhdGEuY29tbWFuZDsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IF9jb250ZXh0LnQwID09PSAnaW5pdCcgPyAzIDogX2NvbnRleHQudDAgPT09ICdwcm9jZXNzJyA/IDE5IDogX2NvbnRleHQudDAgPT09ICdyZXNldCcgPyAzMiA6IF9jb250ZXh0LnQwID09PSAncmVsZWFzZScgPyAzOCA6IF9jb250ZXh0LnQwID09PSAnbnVtUmVxdWlyZWRJbnB1dFNhbXBsZXMnID8gNDYgOiA1MTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGlmICghKHJlc2FtcGxlciAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXNhbXBsZXIgYWxyZWFkeSBpbml0aWFsaXplZCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKICAgICAgICAgICAgUmVzYW1wbGVyLnNldFdhc20oZXZlbnQuZGF0YS53YXNtKTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwOwogICAgICAgICAgICByZXR1cm4gUmVzYW1wbGVyLmNyZWF0ZShldmVudC5kYXRhLmlucHV0U2FtcGxlUmF0ZSwgZXZlbnQuZGF0YS5vdXRwdXRTYW1wbGVSYXRlLCBldmVudC5kYXRhLmZpbHRlck9yZGVyLCBldmVudC5kYXRhLmZyYW1lTGVuZ3RoKTsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIHJlc2FtcGxlciA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gbmV3IEJ1ZmZlckFjY3VtdWxhdG9yKHJlc2FtcGxlci5mcmFtZUxlbmd0aCwgcmVzYW1wbGVyLmlucHV0QnVmZmVyTGVuZ3RoKTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJywKICAgICAgICAgICAgICB2ZXJzaW9uOiByZXNhbXBsZXIudmVyc2lvbgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNTsKICAgICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dFsiY2F0Y2giXSg2KTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50MS5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgiYnJlYWsiLCA1Myk7CiAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICBpZiAoIShyZXNhbXBsZXIgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ1Jlc2FtcGxlciBub3QgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMjsKICAgICAgICAgICAgaW5wdXRGcmFtZSA9IGV2ZW50LmRhdGEuaW5wdXRGcmFtZTsKICAgICAgICAgICAgKF9hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yKSA9PT0gbnVsbCB8fCBfYWNjdW11bGF0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hY2N1bXVsYXRvci5wcm9jZXNzKGlucHV0RnJhbWUpOwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI3OwogICAgICAgICAgICBfY29udGV4dC50MiA9IF9jb250ZXh0WyJjYXRjaCJdKDIyKTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50Mi5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoImJyZWFrIiwgNTMpOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgaWYgKCEocmVzYW1wbGVyID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXNhbXBsZXIgbm90IGluaXRpYWxpemVkJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICByZXNhbXBsZXIucmVzZXQoKTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgiYnJlYWsiLCA1Myk7CiAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICBpZiAoIShyZXNhbXBsZXIgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ1Jlc2FtcGxlciBub3QgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgIHJlc2FtcGxlci5yZWxlYXNlKCk7CiAgICAgICAgICAgIHJlc2FtcGxlciA9IG51bGw7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gbnVsbDsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgiYnJlYWsiLCA1Myk7CiAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICBpZiAoIShyZXNhbXBsZXIgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ1Jlc2FtcGxlciBub3QgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgICAgcmVzdWx0OiByZXNhbXBsZXIuZ2V0TnVtUmVxdWlyZWRJbnB1dFNhbXBsZXMoZXZlbnQuZGF0YS5udW1TYW1wbGUpCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJicmVhayIsIDUzKTsKICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgY29uc29sZS53YXJuKCJVbmhhbmRsZWQgbWVzc2FnZSBpbiByZXNhbXBsZXJfd29ya2VyLnRzOiAiLmNvbmNhdChldmVudC5kYXRhLmNvbW1hbmQpKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgiYnJlYWsiLCA1Myk7CiAgICAgICAgICBjYXNlIDUzOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMTVdLCBbMjIsIDI3XV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIG9ubWVzc2FnZShfeCkgewogICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7Cgp9KSgpOwoK",null,!1),x=function(){var A;function I(A,g){m(this,I),n(this,"_worker",void 0),n(this,"_version",void 0),this._worker=A,this._version=g}return G(I,[{key:"process",value:function(A){this._worker.postMessage({command:"process",inputFrame:A},[A.buffer])}},{key:"reset",value:function(){var A=this,I=new Promise(function(I,g){A._worker.onmessage=function(A){switch(A.data.command){case"ok":I();break;case"failed":case"error":g(A.data.message);break;default:g("Unrecognized command: ".concat(A.data.command))}}});return this._worker.postMessage({command:"reset"}),I}},{key:"release",value:function(){var A=this,I=new Promise(function(I,g){A._worker.onmessage=function(A){switch(A.data.command){case"ok":I();break;case"failed":case"error":g(A.data.message);break;default:g("Unrecognized command: ".concat(A.data.command))}}});return this._worker.postMessage({command:"release"}),I}},{key:"terminate",value:function(){this._worker.terminate()}},{key:"getNumRequiredInputSamples",value:function(A){var I=this,g=new Promise(function(A,g){I._worker.onmessage=function(I){switch(I.data.command){case"ok":A(I.data.result);break;case"failed":case"error":g(I.data.message);break;default:g("Unrecognized command: ".concat(I.data.command))}}});return this._worker.postMessage({command:"numRequiredInputSamples",numSample:A}),g}}],[{key:"setWasm",value:function(A){void 0===this._wasm&&(this._wasm=A)}},{key:"create",value:(A=i(d.mark(function A(g,C,i,B,c){var l,o,e=this;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return l=new L,o=new Promise(function(A,g){e.worker=l,l.onmessage=function(C){switch(C.data.command){case"ok":l.onmessage=function(A){switch(A.data.command){case"ok":c(A.data.result);break;case"failed":case"error":console.error(A.data.message);break;default:console.error("Unrecognized command: ".concat(C.data.command))}},A(new I(l,C.data.version));break;case"failed":case"error":g(C.data.message);break;default:g("Unrecognized command: ".concat(C.data.command))}}}),l.postMessage({command:"init",wasm:this._wasm,inputSampleRate:g,outputSampleRate:C,filterOrder:i,frameLength:B}),A.abrupt("return",o);case 4:case"end":return A.stop()}},A,this)})),function(I,g,C,i,B){return A.apply(this,arguments)})}]),I}();n(x,"_wasm",void 0),!function(A){A[A.STARTED=0]="STARTED",A[A.STOPPED=1]="STOPPED"}(B||(B={}));var M=function(){function A(){m(this,A),n(this,"_buffers",[])}return G(A,[{key:"onmessage",value:function(A){"process"===A.data.command&&this._buffers.push(A.data.inputFrame)}},{key:"onend",value:function(){return new Blob(this._buffers)}}]),A}();function z(A,I){var g="undefined"!=typeof Symbol&&A[Symbol.iterator]||A["@@iterator"];if(!g){if(Array.isArray(A)||(g=function(A,I){if(A){if("string"==typeof A)return j(A,void 0);var g=Object.prototype.toString.call(A).slice(8,-1);if("Object"===g&&A.constructor&&(g=A.constructor.name),"Map"===g||"Set"===g)return Array.from(A);if("Arguments"===g||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g))return j(A,I)}}(A))||I&&A&&"number"==typeof A.length){g&&(A=g);var C=0,i=function(){};return{s:i,n:function(){return C>=A.length?{done:!0}:{done:!1,value:A[C++]}},e:function(A){throw A},f:i}}throw TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var B,c=!0,l=!1;return{s:function(){g=g.call(A)},n:function(){var A=g.next();return c=A.done,A},e:function(A){l=!0,B=A},f:function(){try{c||null==g.return||g.return()}finally{if(l)throw B}}}}function j(A,I){(null==I||I>A.length)&&(I=A.length);for(var g=0,C=Array(I);g<I;g++)C[g]=A[g];return C}var T=function(A){if("function"!=typeof A&&null!==A)throw TypeError("Super expression must either be null or a function");C.prototype=Object.create(A&&A.prototype,{constructor:{value:C,writable:!0,configurable:!0}}),Object.defineProperty(C,"prototype",{writable:!1}),A&&a(C,A);var I,g=(I=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(A){return!1}}(),function(){var A,g=s(C);A=I?Reflect.construct(g,arguments,s(this).constructor):g.apply(this,arguments);if(A&&("object"===t(A)||"function"==typeof A))return A;if(void 0!==A)throw TypeError("Derived constructors may only return object or undefined");if(void 0===this)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return this});function C(A,I){var i;return m(this,C),(i=g.call(this,I)).name=A,i}return G(C)}(u(Error)),O=function(){var A,I,g,C,c,l;function o(){m(this,o),n(this,"_mutex",new h),n(this,"_audioContext",null),n(this,"_microphoneStream",null),n(this,"_recorderNode",null),n(this,"_resamplerWorker",null),n(this,"_engines",void 0),n(this,"_options",{}),n(this,"_state",void 0),this._engines=new Set,this._options={},this._state=B.STOPPED}return G(o,[{key:"start",value:function(){var A=this;return new Promise(function(I,g){A._mutex.runExclusive(i(d.mark(function I(){var g,C,i,c,l;return d.wrap(function(I){for(;;)switch(I.prev=I.next){case 0:if(I.prev=0,!(null===A._audioContext||A._state===B.STOPPED||A.isReleased)){I.next=15;break}return I.next=4,A.setupRecorder(A._options);case 4:C=(g=I.sent).audioContext,i=g.microphoneStream,c=g.recorderNode,l=g.resamplerWorker,A._audioContext=C,A._microphoneStream=i,A._recorderNode=c,A._resamplerWorker=l,c.port.onmessage=function(A){l.process(A.data.buffer[0])},A._state=B.STARTED;case 15:if(!(null!==A._audioContext&&A.isSuspended)){I.next=18;break}return I.next=18,A._audioContext.resume();case 18:case 33:I.next=36;break;case 20:if(I.prev=20,I.t0=I.catch(0),!(I.t0&&I.t0.name)){I.next=35;break}if("SecurityError"!==I.t0.name&&"NotAllowedError"!==I.t0.name){I.next=27;break}throw new T("PermissionError","Failed to record audio: microphone permissions denied.");case 27:if("NotFoundError"!==I.t0.name&&"OverconstrainedError"!==I.t0.name){I.next=31;break}throw new T("DeviceMissingError","Failed to record audio: audio recording device was not found.");case 31:if("NotReadableError"!==I.t0.name){I.next=33;break}throw new T("DeviceReadError","Failed to record audio: audio recording device is not working correctly.");case 35:throw I.t0;case 36:case"end":return I.stop()}},I,null,[[0,20]])}))).then(function(){I()}).catch(function(A){g(A)})})}},{key:"stop",value:function(){var A=this;return new Promise(function(I,g){A._mutex.runExclusive(i(d.mark(function I(){var g,C,i;return d.wrap(function(I){for(;;)switch(I.prev=I.next){case 0:null!==A._audioContext&&A._state!==B.STOPPED&&(null==(g=A._resamplerWorker)||g.terminate(),null==(C=A._recorderNode)||C.port.close(),null==(i=A._microphoneStream)||i.getAudioTracks().forEach(function(A){A.stop()}),A._state=B.STOPPED);case 1:case"end":return I.stop()}},I)}))).then(function(){I()}).catch(function(A){g(A)})})}},{key:"isSuspended",get:function(){var A;return(null==(A=this._audioContext)?void 0:A.state)==="suspended"}},{key:"isReleased",get:function(){var A;return(null==(A=this._audioContext)?void 0:A.state)==="closed"}},{key:"recorderCallback",value:function(A){var I,g=z(this._engines);try{for(g.s();!(I=g.n()).done;){var C=I.value;C.worker&&C.worker.postMessage?C.worker.postMessage({command:"process",inputFrame:A}):C.postMessage?C.postMessage({command:"process",inputFrame:A}):C.onmessage&&C.onmessage({data:{command:"process",inputFrame:A}})}}catch(A){g.e(A)}finally{g.f()}}},{key:"getAudioContext",value:(A=i(d.mark(function A(){var I;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:if(!(null===this._audioContext||this.isReleased)){A.next=10;break}if(this._audioContext=new AudioContext,!this._options.customRecorderProcessorURL){A.next=7;break}return A.next=5,this._audioContext.audioWorklet.addModule(this._options.customRecorderProcessorURL);case 5:A.next=10;break;case 7:return I=URL.createObjectURL(new Blob([D("LyoKICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLgoKICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSIKICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4KCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbgogIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiovCgpjbGFzcyBSZWNvcmRlclByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoKTsKCiAgICBjb25zdCB7IG51bWJlck9mQ2hhbm5lbHMgPSAxIH0gPSBvcHRpb25zPy5wcm9jZXNzb3JPcHRpb25zOwoKICAgIHRoaXMuX251bWJlck9mQ2hhbm5lbHMgPSBudW1iZXJPZkNoYW5uZWxzOwogIH0KCiAgcHJvY2VzcyhpbnB1dHMsIG91dHB1dHMsIHBhcmFtZXRlcnMpIHsKICAgIGxldCBpbnB1dCA9IGlucHV0c1swXTsgLy8gZ2V0IGZpcnN0IGlucHV0CiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgIGJ1ZmZlcjogaW5wdXQuc2xpY2UoMCwgdGhpcy5fbnVtYmVyT2ZDaGFubmVscykKICAgIH0pOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpyZWdpc3RlclByb2Nlc3NvcigncmVjb3JkZXItcHJvY2Vzc29yJywgUmVjb3JkZXJQcm9jZXNzb3IpOwo=").buffer],{type:"application/javascript"})),A.next=10,this._audioContext.audioWorklet.addModule(I);case 10:return A.abrupt("return",this._audioContext);case 11:case"end":return A.stop()}},A,this)})),function(){return A.apply(this,arguments)})},{key:"setupRecorder",value:(I=i(d.mark(function A(I){var g,C,i,B,c,l,o,e,t,Z,n,b,G,m;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:if(void 0!==navigator.mediaDevices){A.next=2;break}throw new T("DeviceDisabledError","Audio recording is not allowed or disabled.");case 2:return C=void 0===(g=I.outputSampleRate)?16e3:g,B=void 0===(i=I.frameLength)?512:i,l=void 0===(c=I.deviceId)?null:c,e=void 0===(o=I.filterOrder)?50:o,t=1,A.next=6,this.getAudioContext();case 6:return Z=A.sent,A.next=9,navigator.mediaDevices.getUserMedia({audio:{deviceId:l?{exact:l}:void 0}});case 9:return n=A.sent,b=Z.createMediaStreamSource(n),A.next=13,x.create(b.context.sampleRate,C,e,B,this.recorderCallback.bind(this));case 13:return G=A.sent,m=new window.AudioWorkletNode(Z,"recorder-processor",{processorOptions:{frameLength:B,numberOfChannels:t}}),b.connect(m),m.connect(Z.destination),A.abrupt("return",{audioContext:Z,microphoneStream:n,recorderNode:m,resamplerWorker:G});case 18:case"end":return A.stop()}},A,this)})),function(A){return I.apply(this,arguments)})}],[{key:"instance",value:function(){return this._instance||(this._instance=new o),this._instance}},{key:"audioDump",value:(g=i(d.mark(function A(){var I,g,C=this,i=arguments;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return I=i.length>0&&void 0!==i[0]?i[0]:3e3,g=new M,A.next=4,this.subscribe(g);case 4:return A.abrupt("return",new Promise(function(A){C.audioDumpEngine=g,setTimeout(function(){C.unsubscribe(g),A(g.onend())},I)}));case 5:case"end":return A.stop()}},A,this)})),function(){return g.apply(this,arguments)})},{key:"subscribe",value:(C=i(d.mark(function A(I){var g,C,i;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:g=z(Array.isArray(I)?I:[I]),A.prev=1,g.s();case 3:if((C=g.n()).done){A.next=26;break}if(i=C.value){A.next=7;break}throw new T("InvalidEngine","Null or undefined engine.");case 7:if(!i.worker){A.next=15;break}if(!(i.worker.postMessage&&"function"==typeof i.worker.postMessage)){A.next=12;break}this.instance()._engines.add(i),A.next=13;break;case 12:case 23:throw new T("InvalidEngine","Engine must have a 'onmessage' handler.");case 13:A.next=24;break;case 15:if(!(i.postMessage&&"function"==typeof i.postMessage)){A.next=19;break}this.instance()._engines.add(i),A.next=24;break;case 19:if(!(i.onmessage&&"function"==typeof i.onmessage)){A.next=23;break}this.instance()._engines.add(i),A.next=24;break;case 24:A.next=3;break;case 26:A.next=31;break;case 28:A.prev=28,A.t0=A.catch(1),g.e(A.t0);case 31:return A.prev=31,g.f(),A.finish(31);case 34:if(!(this.instance()._engines.size>0&&this.instance()._state!==B.STARTED)){A.next=37;break}return A.next=37,this.instance().start();case 37:case"end":return A.stop()}},A,this,[[1,28,31,34]])})),function(A){return C.apply(this,arguments)})},{key:"unsubscribe",value:(c=i(d.mark(function A(I){var g,C,i;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:g=z(Array.isArray(I)?I:[I]);try{for(g.s();!(C=g.n()).done;)i=C.value,this.instance()._engines.delete(i)}catch(A){g.e(A)}finally{g.f()}if(0!==this.instance()._engines.size||this.instance()._state===B.STOPPED){A.next=5;break}return A.next=5,this.instance().stop();case 5:case"end":return A.stop()}},A,this)})),function(A){return c.apply(this,arguments)})},{key:"reset",value:(l=i(d.mark(function A(){return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return this.instance()._engines.clear(),A.next=3,this.instance().stop();case 3:case"end":return A.stop()}},A,this)})),function(){return l.apply(this,arguments)})},{key:"setOptions",value:function(A){var I=this,g=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.instance()._options=A,g&&this.instance().stop().then(i(d.mark(function A(){return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,I.instance().start();case 2:case"end":return A.stop()}},A)})))}},{key:"audioContext",get:function(){return this.instance()._audioContext}},{key:"isRecording",get:function(){return this.instance()._state===B.STARTED}}]),o}();n(O,"_instance",void 0),U("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsKICAgIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOwogICAgcmV0dXJuIGFycjI7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsKICAgIGlmICghbykgcmV0dXJuOwogICAgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7CiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7CiAgICBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsKICAgIGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7CiAgICBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOwogIH0KCiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgdmFyIElOVF8xNl9NQVggPSAzMjc2NzsKICB2YXIgRVBTSUxPTiA9IDFlLTk7CiAgdmFyIHByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKGZyYW1lcykgewogICAgdmFyIHN1bSA9IF90b0NvbnN1bWFibGVBcnJheShmcmFtZXMpLnJlZHVjZShmdW5jdGlvbiAoYWNjdW11bGF0b3IsIGZyYW1lKSB7CiAgICAgIHJldHVybiBhY2N1bXVsYXRvciArIE1hdGgucG93KGZyYW1lLCAyKTsKICAgIH0sIDApOwogICAgdmFyIHJtcyA9IHN1bSAvIGZyYW1lcy5sZW5ndGggLyBJTlRfMTZfTUFYIC8gSU5UXzE2X01BWDsKICAgIHJldHVybiAxMCAqIE1hdGgubG9nMTAoTWF0aC5tYXgocm1zLCBFUFNJTE9OKSk7CiAgfTsKICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoZSkgewogICAgc3dpdGNoIChlLmRhdGEuY29tbWFuZCkgewogICAgICBjYXNlICdwcm9jZXNzJzoKICAgICAgICBwb3N0TWVzc2FnZShwcm9jZXNzKGUuZGF0YS5pbnB1dEZyYW1lKSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfTsKCn0pKCk7Cgo=",null,!1);var P="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B0kNACAAIACTIQQMAQsCQAJAAkACQCAAIAFBCGoQoICAgABBA3EOAwABAgMLIAErAwgQnICAgAAhBAwDCyABKwMImhCdgICAACEEDAILIAErAwgQnICAgACMIQQMAQsgASsDCBCdgICAACEECyABQRBqJICAgIAAIAQLygMCA38BfCOAgICAAEEQayIBJICAgIAAAkACQCAAvCICQf////8HcSIDQdqfpPoDSw0AIANBgICAzANJDQEgALsQnYCAgAAhAAwBCwJAIANB0aftgwRLDQAgALshBAJAIANB45fbgARLDQACQCACQX9KDQAgBEQYLURU+yH5P6AQnICAgACMIQAMAwsgBEQYLURU+yH5v6AQnICAgAAhAAwCC0QYLURU+yEJwEQYLURU+yEJQCACQX9KGyAEoJoQnYCAgAAhAAwBCwJAIANB1eOIhwRLDQACQCADQd/bv4UESw0AIAC7IQQCQCACQX9KDQAgBETSITN/fNkSQKAQnICAgAAhAAwDCyAERNIhM3982RLAoBCcgICAAIwhAAwCC0QYLURU+yEZQEQYLURU+yEZwCACQQBIGyAAu6AQnYCAgAAhAAwBCwJAIANBgICA/AdJDQAgACAAkyEADAELAkACQAJAAkAgACABQQhqEKCAgIAAQQNxDgMAAQIDCyABKwMIEJ2AgIAAIQAMAwsgASsDCBCcgICAACEADAILIAErAwiaEJ2AgIAAIQAMAQsgASsDCBCcgICAAIwhAAsgAUEQaiSAgICAACAAC4cKAQR/AkAgACABRg0AAkAgASAAIAJqIgNrQQAgAkEBdGtLDQAgACABIAIQmICAgAAaDAELIAEgAHNBA3EhBAJAAkACQCAAIAFPDQACQCAERQ0AIAIhBCAAIQMMAwsCQCAAQQNxDQAgAiEEIAAhAwwCCyACRQ0DIAAgAS0AADoAACACQX9qIQQCQCAAQQFqIgNBA3ENACABQQFqIQEMAgsgBEUNAyAAIAEtAAE6AAEgAkF+aiEEAkAgAEECaiIDQQNxDQAgAUECaiEBDAILIARFDQMgACABLQACOgACIAJBfWohBAJAIABBA2oiA0EDcQ0AIAFBA2ohAQwCCyAERQ0DIAAgAS0AAzoAAyAAQQRqIQMgAUEEaiEBIAJBfGohBAwBCwJAIAQNAAJAIANBA3FFDQAgAkUNBCAAIAJB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",q={args_get:function(A){return 0},args_sizes_get:function(A){return 0},environ_get:function(A){return 0},environ_sizes_get:function(A){return 0},clock_res_get:function(A){return 0},clock_time_get:function(A){return 0},fd_advise:function(A){return 0},fd_allocate:function(A){return 0},fd_close:function(A){return 0},fd_datasync:function(A){return 0},fd_fdstat_get:function(A){return 0},fd_fdstat_set_flags:function(A){return 0},fd_fdstat_set_rights:function(A){return 0},fd_filestat_get:function(A){return 0},fd_filestat_set_size:function(A){return 0},fd_filestat_set_times:function(A){return 0},fd_pread:function(A){return 0},fd_prestat_get:function(A){return 0},fd_prestat_dir_name:function(A){return 0},fd_pwrite:function(A){return 0},fd_read:function(A){return 0},fd_readdir:function(A){return 0},fd_renumber:function(A){return 0},fd_seek:function(A){return 0},fd_sync:function(A){return 0},fd_tell:function(A){return 0},fd_write:function(A){return 0},path_create_directory:function(A){return 0},path_filestat_get:function(A){return 0},path_filestat_set_times:function(A){return 0},path_link:function(A){return 0},path_open:function(A){return 0},path_readlink:function(A){return 0},path_remove_directory:function(A){return 0},path_rename:function(A){return 0},path_symlink:function(A){return 0},path_unlink_file:function(A){return 0},poll_oneoff:function(A){return 0},proc_exit:function(A){return 0},proc_raise:function(A){return 0},sched_yield:function(A){return 0},random_get:function(A){return 0},sock_recv:function(A){return 0},sock_send:function(A){return 0},sock_shutdown:function(A){return 0}},_=function(){var A,I;function g(A){m(this,g),n(this,"_pvResamplerConvertNumSamplesToInputSampleRate",void 0),n(this,"_pvResamplerConvertNumSamplesToOutputSampleRate",void 0),n(this,"_pvResamplerDelete",void 0),n(this,"_pvResamplerProcess",void 0),n(this,"_pvResamplerReset",void 0),n(this,"_cAlignedAlloc",void 0),n(this,"_inputBufferAddress",void 0),n(this,"_objectAddress",void 0),n(this,"_outputBufferAddress",void 0),n(this,"_wasmMemory",void 0),n(this,"_frameLength",void 0),n(this,"_inputBufferLength",void 0),g._version=A.version,this._pvResamplerConvertNumSamplesToInputSampleRate=A.pvResamplerConvertNumSamplesToInputSampleRate,this._pvResamplerConvertNumSamplesToOutputSampleRate=A.pvResamplerConvertNumSamplesToOutputSampleRate,this._pvResamplerReset=A.pvResamplerReset,this._pvResamplerProcess=A.pvResamplerProcess,this._pvResamplerDelete=A.pvResamplerDelete,this._cAlignedAlloc=A.cAlignedAlloc,this._wasmMemory=A.memory,this._inputBufferAddress=A.inputBufferAddress,this._objectAddress=A.objectAddress,this._outputBufferAddress=A.outputBufferAddress,this._frameLength=A.frameLength,this._inputBufferLength=A.inputFrameLength}return G(g,[{key:"process",value:function(A,I){if(A.length>this._inputBufferLength)throw Error("InputFrame length '".concat(A.length,"' must be smaller than ").concat(this._inputBufferLength,"."));var g=new Int16Array(A.length);if(A.constructor===Float32Array)for(var C=0;C<A.length;C++)A[C]<0?g[C]=32768*A[C]:g[C]=32767*A[C];else if(A.constructor===Int16Array)g=A;else throw Error("Invalid inputFrame type: ".concat(t(A),". Expected Float32Array or Int16Array."));new Int16Array(this._wasmMemory.buffer).set(g,this._inputBufferAddress/Int16Array.BYTES_PER_ELEMENT);for(var i=this._pvResamplerProcess(this._objectAddress,this._inputBufferAddress,A.length,this._outputBufferAddress),B=new DataView(this._wasmMemory.buffer),c=0;c<i;c++)I[c]=B.getInt16(this._outputBufferAddress+c*Int16Array.BYTES_PER_ELEMENT,!0);return i}},{key:"reset",value:function(){this._pvResamplerReset(this._objectAddress)}},{key:"release",value:function(){this._pvResamplerDelete(this._objectAddress)}},{key:"inputBufferLength",get:function(){return this._inputBufferLength}},{key:"frameLength",get:function(){return this._frameLength}},{key:"version",get:function(){return g._version}},{key:"getNumRequiredInputSamples",value:function(A){return this._pvResamplerConvertNumSamplesToInputSampleRate(this._objectAddress,A)}},{key:"getNumRequiredOutputSamples",value:function(A){return this._pvResamplerConvertNumSamplesToOutputSampleRate(this._objectAddress,A)}}],[{key:"setWasm",value:function(A){void 0===this._wasm&&(this._wasm=A)}},{key:"create",value:(A=i(d.mark(function A(I,C,i,B){var c;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,g.initWasm(I,C,i,B);case 2:return c=A.sent,A.abrupt("return",new g(c));case 4:case"end":return A.stop()}},A)})),function(I,g,C,i){return A.apply(this,arguments)})},{key:"initWasm",value:(I=i(d.mark(function A(I,g,C,i){var B,c,l,o,e,t,Z,n,b,G,m,a,s,Q,u,r,y,h,X,V,W;return d.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return c=new Uint8Array((B=new WebAssembly.Memory({initial:64})).buffer),l={wasi_snapshot_preview1:q,env:{memory:B,pv_console_log_wasm:function(A){console.log(v(c,A))},pv_assert_wasm:function(A,I,g){if(0===A){var C=v(c,g);throw Error("assertion failed at line ".concat(I,' in "').concat(C,'"'))}}}},o=D(this._wasm),A.next=8,WebAssembly.instantiate(o,l);case 8:if(t=(e=A.sent.instance).exports.aligned_alloc,Z=e.exports.pv_resampler_init,n=e.exports.pv_resampler_convert_num_samples_to_input_sample_rate,b=e.exports.pv_resampler_convert_num_samples_to_output_sample_rate,G=e.exports.pv_resampler_version,0!==(m=t(Int32Array.BYTES_PER_ELEMENT,Int32Array.BYTES_PER_ELEMENT))){A.next=18;break}throw Error("malloc failed: Cannot allocate memory");case 18:if(a=Z(I,g,C,m),s=G(),Q=v(c,s),1e4===a){A.next=23;break}throw Error("pv_resampler_init failed with status ".concat(a));case 23:if(u=new DataView(B.buffer).getInt32(m,!0),r=n(u,i)+1,0!==(y=t(Int16Array.BYTES_PER_ELEMENT,r*Int16Array.BYTES_PER_ELEMENT))){A.next=29;break}throw Error("malloc failed: Cannot allocate memory");case 29:if(0!==(h=t(Int16Array.BYTES_PER_ELEMENT,i*Int16Array.BYTES_PER_ELEMENT))){A.next=32;break}throw Error("malloc failed: Cannot allocate memory");case 32:return X=e.exports.pv_resampler_reset,V=e.exports.pv_resampler_process,W=e.exports.pv_resampler_delete,A.abrupt("return",{cAlignedAlloc:t,frameLength:i,inputBufferAddress:y,inputFrameLength:r,memory:B,objectAddress:u,outputBufferAddress:h,pvResamplerConvertNumSamplesToInputSampleRate:n,pvResamplerConvertNumSamplesToOutputSampleRate:b,pvResamplerDelete:W,pvResamplerInit:Z,pvResamplerProcess:V,pvResamplerReset:X,version:Q});case 36:case"end":return A.stop()}},A,this)})),function(A,g,C,i){return I.apply(this,arguments)})}]),g}();n(_,"_wasm",void 0),n(_,"_version",void 0),_.setWasm(P),x.setWasm(P)}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[231,552,592,763,1426,1449,1508,1711,1842,1916,2236,2367,2394,2439,2966,3414,3489,3516,3803,3862,3918,4220,4444,4944,5153,5177,5206,5264,5657,5732,6182,6714,6848,6947,7074,7142,7204,7251,7390,7492,7569,7982,8334,8574,8742,8995,9415,9557,9682,9739],{4441:()=>{}},_=>{_.O(0,[8441,1255,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
|
package/ui/standalone/.next/static/chunks/app/(app)/opengraph-image-xg4ifa/route-5f312b128a0caf75.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[231,552,592,763,1426,1449,1508,1711,1842,1916,2236,2367,2394,2439,2966,3414,3489,3516,3803,3862,3918,4220,4444,4944,5153,5177,5206,5264,5657,5732,6182,6714,6848,6947,7074,7142,7204,7251,7390,7492,7569,7982,8334,8574,8742,8995,9415,9557,9682,9739],{4441:()=>{}},_=>{_.O(0,[8441,1255,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[231,552,592,763,1426,1449,1508,1711,1842,1916,2236,2367,2394,2439,2966,3414,3489,3516,3803,3862,3918,4220,4444,4944,5153,5177,5206,5264,5657,5732,6182,6714,6848,6947,7074,7142,7204,7251,7390,7492,7569,7982,8334,8574,8742,8995,9415,9557,9682,9739],{4441:()=>{}},_=>{_.O(0,[8441,1255,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
|