From 6c41002e5bc62997a29fc12fedca1ab47e26f0b4 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Tue, 22 Oct 2024 16:46:07 -0400 Subject: [PATCH] Screen sharing release (#935) * Introducing screen sharing and enabling file transpilation --------- Co-authored-by: Andy Wang --- Documentation-DR.md | 15 +- Documentation.md | 143 +- package-lock.json | 9022 +++-- package.json | 4 + release/connect-streams-dr-min.js | 2 +- release/connect-streams-dr.js | 2 +- release/connect-streams-min.js | 2 +- release/connect-streams.js | 36331 +++++---------------- src/agent-app/agent-app.js | 2 + src/api.js | 109 +- src/client.js | 9 +- src/core.js | 2 +- src/event.js | 6 +- src/index.d.ts | 104 +- test/unit/agent-app.spec.js | 28 +- webpack/common.js | 20 +- webpack/connect-streams-dr-min.config.js | 29 +- webpack/connect-streams-dr.config.js | 32 +- webpack/connect-streams-min.config.js | 31 +- webpack/connect-streams.config.js | 27 +- 20 files changed, 14768 insertions(+), 31152 deletions(-) diff --git a/Documentation-DR.md b/Documentation-DR.md index 9619bba5..eec504fa 100644 --- a/Documentation-DR.md +++ b/Documentation-DR.md @@ -139,6 +139,8 @@ Initializing the Streams API is the first step to verify that you have everythin disableRingtone: false, // optional, defaults to false ringtoneUrl: "[your-ringtone-filepath].mp3", // optional, defaults to CCP’s default ringtone if a falsy value is set allowFramedVideoCall: true, // optional, default to false + allowFramedScreenSharing: true, // optional, default to false + allowFramedScreenSharingPopUp: true, // optional, default to false allowEarlyGum: true // optional, default to true }, pageOptions: { //optional @@ -183,18 +185,19 @@ Integrates with Connect by loading the pre-built CCPs located at `ccpUrl` and `s * `allowFramedSoftphone`: Normally, the softphone microphone and speaker components are not allowed to be hosted in an iframe. This is because the softphone must be hosted in a single window or tab. The window hosting the softphone session must not be closed during the course of a softphone call or the call will be disconnected. If `allowFramedSoftphone` is `true`, the softphone components will be allowed to be hosted in this window or tab. * `disableRingtone`: This option allows you to completely disable the built-in ringtone audio that is played when a call is incoming. * `ringtoneUrl`: If the ringtone is not disabled, this allows for overriding the ringtone with any browser-supported audio file accessible by the user. - * `allowFramedVideoCall`: Currently video call can only be in one single window or tab.. If `true`, CCP will handle - video calling experience in this window or tab and agents would be able to see and turn on their video if they - have video permission set in the security profile. If `false` or not provided, CCP will only provide voice calling. + * `allowFramedVideoCall`: Currently video call can only be in one single window or tab. If `true`, CCP will handle video calling experience in this window or tab and agents would be able to see and turn on their video if they have video permission set in the security profile. If `false` or not provided, CCP will only provide voice calling. + * `allowFramedScreenSharing`: Currently it is recommended to enable screen share button on only one CCP in one single window or tab. If `true`, the Contact Control Panel will display the screen share button on that window or tab. + * `allowFramedScreenSharingPopUp`: If `true`, clicking the screen sharing button in the embedded CCP will launch the screen sharing app in a new window. If `false` or not provided, clicking the button will not launch the screen sharing app. * `allowEarlyGum`: If `true` or not provided, CCP will capture the agent’s browser microphone media stream before the contact arrives to reduce the call setup latency. If `false`, CCP will only capture agent media stream after the contact arrives. * `pageOptions`: This object is optional and allows you to configure which configuration sections are displayed in the settings tab. * `enableAudioDeviceSettings`: If `true`, the settings tab will display a section for configuring audio input and output devices for the agent's local machine. If `false`, or if `pageOptions` is not provided, the agent will not be able to change audio device settings from the settings tab. * `enableVideoDeviceSettings`: If `true`, the settings tab will display a section for configuring video input devices for the agent's local machine. If `false`, or if `pageOptions` is not provided, the agent will not be able to change video device settings from the settings tab. * `enablePhoneTypeSettings`: If `true`, or if `pageOptions` is not provided, the settings tab will display a section for configuring the agent's phone type and deskphone number. If `false`, the agent will not be able to change the phone type or deskphone number from the settings tab. * `shouldAddNamespaceToLogs`: prepends `[CCP]` to all logs logged by the CCP. Important note: there are a few logs made by the CCP before the namespace is prepended. -* `ccpAckTimeout`: A timeout in ms that indicates how long streams will wait for the iframed CCP to respond to its `SYNCHRONIZE` event emissions. These happen continuously from the first time `initCCP` is called. They should only appear when there is a problem that requires a refresh or a re-login. -* `ccpSynTimeout`: A timeout in ms that indicates how long streams will wait to send a new `SYNCHRONIZE` event to the iframed CCP. These happens continuously from the first time `initCCP` is called. -* `ccpLoadTimeout`: A timeout in ms that indicates how long streams will wait for the initial `ACKNOWLEDGE` event from the shared worker while the CCP is still standing itself up. +* `ccpAckTimeout`: A timeout in ms that tells CCP how long it should wait for an `ACKNOWLEDGE` message from the shared worker after CCP has sent a `SYNCHRONIZE` message to the shared worker. This is important because an `ACKNOWLEDGE` message is only sent back to CCP if the shared worker is initialized and a shared worker is only initialized if the agent is logged in. Moreover, this check happens continuously. +* `ccpSynTimeout`: A timeout in ms that tells CCP how long to wait before sending another `SYNCHRONIZE` message to the shared worker, which should trigger the shared worker to send back an `ACKNOWLEDGE` if initialized. This event essentially checks if the shared worker was initialized aka agent is logged in. This check happens continuously as well. +* `ccpLoadTimeout`: A timeout in ms that tells CCP how long to wait before sending the very first `SYNCHRONIZE` message. The user experience here is that on the first CCP initialization, the login flow is delayed by this timeout. + * As an example, if this timeout was set to 10 seconds, then the login pop-up will not open up until 10 seconds has pass. #### A few things to note: diff --git a/Documentation.md b/Documentation.md index 5ae9e98e..427b6db1 100644 --- a/Documentation.md +++ b/Documentation.md @@ -226,6 +226,8 @@ everything set up correctly and that you are able to listen for events. ringtoneUrl: '[your-ringtone-filepath].mp3', // optional, defaults to CCP’s default ringtone if a falsy value is set disableEchoCancellation: false, // optional, defaults to false allowFramedVideoCall: true, // optional, default to false + allowFramedScreenSharing: true, // optional, default to false + allowFramedScreenSharingPopUp: true, // optional, default to false VDIPlatform: null, // optional, provide with 'CITRIX' if using Citrix VDI, or use enum VDIPlatformType allowEarlyGum: true, //optional, default to true }, @@ -296,10 +298,10 @@ and made available to your JS client code. * `disableEchoCancellation`: This option is only applicable in Chrome and allows you to initialize a custom or embedded CCP with echo cancellation disabled. Setting this to `true` will disable **ALL** audio processing done by Chrome including Auto Gain Control. - Please see this link https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/improve-call-quality-on-agent-workstations-in-amazon-connect-contact-centers.html for possible alternative options in approving auto quality. - - `allowFramedVideoCall`: Currently video call can only be in one single window or tab.. If `true`, CCP will handle - video calling experience in this window or tab and agents would be able to see and turn - on their video if they have video permission set in the security profile. If `false` or not provided, CCP will only provide voice calling. - - `VDIPlatform`: This option is only applicable for virtual desktop interface integrations. If set, it will configure CCP to optimize softphone audio configuration for the VDI. Options can be provided by using enum `VDIPlatformType`. If `allowFramedSoftphone` is `false` and `VDIPlatform` is going to be set, please make sure you are passing this parameter into `connect.core.initSoftphoneManager()`. For example, `connect.core.initSoftphoneManager({ VDIPlatform: "CITRIX" })` + - `allowFramedVideoCall`: Currently video call can only be in one single window or tab. If `true`, CCP will handle video calling experience in this window or tab and agents would be able to see and turn on their video if they have video permission set in the security profile. If `false` or not provided, CCP will only provide voice calling. + - `allowFramedScreenSharing`: Currently it is recommended to enable screen share button on only one CCP in one single window or tab. If `true`, the Contact Control Panel will display the screen share button on that window or tab. + - `allowFramedScreenSharingPopUp`: If `true`, clicking the screen sharing button in the embedded CCP will launch the screen sharing app in a new window. If `false` or not provided, clicking the button will not launch the screen sharing app. + - `VDIPlatform`: This option is only applicable for virtual desktop interface integrations. If set, it will configure CCP to optimize softphone audio configuration for the VDI. Options can be provided by using enum `VDIPlatformType`. If `allowFramedSoftphone` is `false` and `VDIPlatform` is going to be set, please make sure you are passing this parameter into `connect.core.initSoftphoneManager()`. For example, `connect.core.initSoftphoneManager({ VDIPlatform: "CITRIX" })` - `allowEarlyGum`: If `true` or not provided, CCP will capture the agent’s browser microphone media stream before the contact arrives to reduce the call setup latency. If `false`, CCP will only capture agent media stream after the contact arrives. - `pageOptions`: This object is optional and allows you to configure which configuration sections are displayed in the settings tab. - `enableAudioDeviceSettings`: If `true`, the settings tab will display a section for configuring audio input and output devices for the agent's local @@ -945,6 +947,36 @@ agent.onLocalMediaStreamCreated(() => { }); ``` +### `agent.setCameraDevice()` + +```js +agent.setCameraDevice(deviceId); +``` + +The `agent.setCameraDevice()` API is used to broadcast a change in the camera device (input device for camera) state. However, it does not actually switch the camera device. Instead, it triggers the [`agent.onCameraDeviceChanged()`](#agentoncameradevicechanged) callback to notify listeners of the updated camera device state. + +To handle the camera functionality, you would need to use either the [Amazon Chime SDK JS](https://github.com/aws/amazon-chime-sdk-js) or the [Amazon Chime SDK Component Library React](https://github.com/aws/amazon-chime-sdk-component-library-react). Specifically, you can use the following APIs: + +* [Amazon Chime SDK JS - audioVideo.startVideoInput](https://aws.github.io/amazon-chime-sdk-js/classes/defaultaudiovideofacade.html#startvideoinput) +* [Amazon Chime SDK Component Library React - useVideoInputs](https://aws.github.io/amazon-chime-sdk-component-library-react/?path=/docs/sdk-hooks-usevideoinputs--page) + +After you have selected a new device using the Chime SDK, you can use `agent.setCameraDevice(deviceId)` to notify the state update, and then use the [`agent.onCameraDeviceChanged()`](#agentoncameradevicechanged) callback to handle the state update. + +### `agent.setBackgroundBlur()` + +```js +agent.setBackgroundBlur(isBackgroundBlurEnabled); +``` + +The `agent.setBackgroundBlur()` API is used to broadcast a change in the Background Blur state. However, it does not actually enable or disable the blur effect. Instead, it triggers the [`agent.onBackgroundBlurChanged()`](#agentonbackgroundblurchanged) callback to notify listeners of the updated blur state. + +To handle the Background Blur functionality, you would need to use either the [Amazon Chime SDK JS](https://github.com/aws/amazon-chime-sdk-js) or the [Amazon Chime SDK Component Library React](https://github.com/aws/amazon-chime-sdk-component-library-react). Specifically, you can refer to the following resources: + +* [Amazon Chime SDK JS - Adding background filters to your application](https://aws.github.io/amazon-chime-sdk-js/modules/backgroundfilter_videofx_processor.html#adding-background-filters-to-your-application) +* [Amazon Chime SDK Component Library React - BackgroundBlurProvider](https://aws.github.io/amazon-chime-sdk-component-library-react/?path=/docs/sdk-providers-backgroundblurprovider--page) + +After you have changed the actual Background Blur state using the Chime SDK, you can use `agent.setBackgroundBlur(isBackgroundBlurEnabled)` to notify the state update, and then use the [`agent.onBackgroundBlurChanged()`](#agentonbackgroundblurchanged) callback to handle the state update. + ### `agent.setRingerDevice()` ```js agent.setRingerDevice(deviceId); @@ -999,7 +1031,8 @@ Subscribe a method to be called when the agent changes the camera device (input ```js agent.onBackgroundBlurChanged(function(obj) { /* ... */ }); ``` -Subscribe a method to be called when the agent enables or disables background blur for the camera device (input device for call video). + +Subscribe a method to be called when the agent enables or disables Background Blur for the camera device (input device for call video). ## Contact API The Contact API provides event subscription methods and action methods which can be called on behalf of a specific @@ -1221,6 +1254,76 @@ Gets a map of the attributes associated with the contact. Each value in the map Please note that this api method will return null when the current user is monitoring the contact, rather than being an active participant in the contact. +### `contact.startScreenSharing(skipSessionInitiation)` + +```js +try { + await contact.startScreenSharing(); +} catch (err) { + /* ... */ +} +``` + +Initiates the screen sharing session for the contact. + +The method first verifies that the contact is a web calling contact (contact subtype must be `connect:WebRTC`) and that the contact is in a connected state (`this.isConnected()` is `true`). If either condition is not met, an error is thrown. + +Once these conditions are satisfied, the `StartScreenSharing` API in Amazon Connect Service is called to initiate the screen sharing session. + +If screen sharing session initiation succeeds, `contact.onScreenSharingStarted` event is fired. +If screen sharing session initiation fails, the `contact.onScreenSharingError` event is fired. + +* `skipSessionInitiation`: A boolean that, if set to `true`, skips the screen sharing session initiation process, and directly trigger the `onScreenSharingStarted` event. Defaults to `false`. + +### `contact.stopScreenSharing` + +```js +try { + await contact.stopScreenSharing(); +} catch (err) { + /* ... */ +} +``` + +Stops the ongoing screen sharing session for the contact. + +The method first verifies that the contact is a web calling contact (contact subtype must be `connect:WebRTC`) and that the contact is in a connected state (`this.isConnected()` is `true`). If either condition is not met, an error is thrown. + +Once these conditions are satisfied, it fires `contact.onScreenSharingStopped` event. + +### `contact.onScreenSharingStarted` + +```js +contact.onScreenSharingStarted(function () { + /* ... */ +}); +``` + +Subscribe a method to be invoked when screen sharing session is started for the contact. +This event is triggered when the screen sharing session is successfully initiated for WebRTC contacts. + +### `contact.onScreenSharingStopped` + +```js +contact.onScreenSharingStopped(function () { + /* ... */ +}); +``` + +Subscribe a method to be invoked when screen sharing session is stopped for the contact. +This event is triggered when the screen sharing session is terminated for WebRTC contacts. + +### `contact.onScreenSharingError` + +```js +contact.onScreenSharingError(function (error) { + /* ... */ +}); +``` + +Subscribe a method to be invoked when screen sharing session initiation fails for the contact. +This event is triggered when `contact.startScreenSharing` call fails. + ### `contact.getSegmentAttributes()` ```js @@ -1258,6 +1361,16 @@ if (contact.hasVideoRTCCapabilities()) { Determine whether this contact has video capabilities. +### `contact.hasScreenShareCapability()` + +```js +if (contact.hasScreenShareCapability()) { + /* ... */ +} +``` + +Determine whether this contact has screen share capability. + ### `contact.canAgentSendVideo()` ```js @@ -1278,6 +1391,26 @@ if (contact.canAgentReceiveVideo()) { Determine whether the agent in this contact can receive video. +### `contact.canAgentSendScreenShare()` + +```js +if (contact.canAgentSendScreenShare()) { + /* ... */ +} +``` + +Determine whether the agent in this contact can send screen share. + +### `contact.canCustomerSendScreenShare()` + +```js +if (contact.canCustomerSendScreenShare()) { + /* ... */ +} +``` + +Determine whether the customer in this contact can send screen share. + ### `contact.isInbound()` ```js if (contact.isInbound()) { /* ... */ } diff --git a/package-lock.json b/package-lock.json index 276f794b..319b653b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "2.14.6", "license": "Apache-2.0", "devDependencies": { + "@babel/preset-env": "^7.21.4", + "@babel/preset-typescript": "^7.21.4", + "babel": "^6.23.0", + "babel-loader": "^9.1.2", "chai": "^4.3.7", "jshint": "^2.13.6", "mocha": "^10.2.0", @@ -40,22 +44,23 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.3", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -91,31 +96,74 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.3", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -124,118 +172,201 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.21.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, "engines": { "node": ">=6.9.0" } @@ -255,14 +386,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -270,9 +402,9 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -282,9 +414,9 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -296,42 +428,42 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -340,2602 +472,3128 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.4", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", - "dev": true - }, - "node_modules/@babel/template": { - "version": "7.21.9", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/types": "^7.25.8" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.22.4", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/types": { - "version": "7.22.4", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, - "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, - "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "type-detect": "4.0.8" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.3", - "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, - "license": "(Unlicense OR Apache-2.0)" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/eslint": { - "version": "8.40.0", - "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, - "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "0.0.51", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/node": { - "version": "20.2.5", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, - "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@xtuc/long": "4.2.2" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, - "license": "MIT", "dependencies": { - "envinfo": "^7.7.3" + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "8.8.2", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, - "license": "MIT", "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "acorn": "^8" + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "regenerator-transform": "^0.15.2" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, - "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.25.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, - "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", "dev": true, - "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, - "license": "MIT", "dependencies": { - "default-require-extensions": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/archy": { - "version": "1.0.0", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-equal": { - "version": "1.0.0", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asn1": { - "version": "0.2.6", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, - "license": "MIT", "dependencies": { - "safer-buffer": "~2.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": ">=0.8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "license": "MIT" + "node_modules/@babel/preset-env": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.8", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aws4": { - "version": "1.12.0", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dev": true, - "license": "MIT" + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "tweetnacl": "^0.14.3" + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@babel/types": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "fill-range": "^7.0.1" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.21.7", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "sprintf-js": "~1.0.2" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001494", - "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", - "dev": true - }, - "node_modules/caseless": { - "version": "0.12.0", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/chai": { - "version": "4.3.7", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/chalk": { - "version": "4.1.2", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, - "node_modules/check-error": { - "version": "1.0.2", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=6.0.0" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.0" + "node": ">=6.0.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/cli": { - "version": "1.0.1", - "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "license": "MIT", "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "engines": { - "node": ">=0.2.5" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "type-detect": "4.0.8" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } }, - "node_modules/colorette": { - "version": "2.0.20", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true, - "license": "MIT" + "license": "(Unlicense OR Apache-2.0)" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@types/eslint": { + "version": "8.40.0", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/commander": { - "version": "2.20.3", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true, "license": "MIT" }, - "node_modules/commondir": { - "version": "1.0.1", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/@types/json-schema": { + "version": "7.0.12", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/@types/node": { + "version": "20.2.5", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", "dev": true, "license": "MIT" }, - "node_modules/console-browserify": { - "version": "1.1.0", - "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, + "license": "MIT", "dependencies": { - "date-now": "^0.1.4" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true, "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true, "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/cssom": { - "version": "0.3.8", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true, "license": "MIT" }, - "node_modules/cssstyle": { - "version": "1.4.0", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "license": "MIT", "dependencies": { - "cssom": "0.3.x" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/data-urls": { - "version": "1.1.0", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, - "node_modules/date-now": { - "version": "0.1.4", - "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/decamelize": { - "version": "4.0.0", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "license": "MIT", "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "license": "MIT", "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" } }, - "node_modules/diff": { - "version": "5.0.0", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "license": "MIT", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true, "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "license": "BSD-3-Clause" }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "license": "Apache-2.0" }, - "node_modules/domelementtype": { - "version": "1.3.1", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "node_modules/abab": { + "version": "2.0.6", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-3-Clause" }, - "node_modules/domexception": { - "version": "1.0.1", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "node_modules/acorn": { + "version": "8.8.2", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "license": "MIT", - "dependencies": { - "webidl-conversions": "^4.0.2" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/domhandler": { - "version": "2.3.0", - "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "node_modules/acorn-globals": { + "version": "4.3.4", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, + "license": "MIT", "dependencies": { - "domelementtype": "1" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" } }, - "node_modules/domutils": { - "version": "1.5.1", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.419", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/acorn-walk": { + "version": "6.2.0", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true, "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.14.1", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/entities": { - "version": "1.0.0", - "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "node_modules/ajv": { + "version": "6.12.6", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "BSD-like" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/envinfo": { - "version": "7.8.1", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "dependencies": { + "ajv": "^8.0.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT" + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/es6-error": { - "version": "4.1.1", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } }, - "node_modules/escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/ansi-colors": { + "version": "4.1.1", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/anymatch": { + "version": "3.1.3", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/append-transform": { + "version": "2.0.0", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/archy": { + "version": "1.0.0", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "Python-2.0" }, - "node_modules/estraverse": { - "version": "4.3.0", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/array-equal": { + "version": "1.0.0", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/asn1": { + "version": "0.2.6", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/events": { - "version": "3.3.0", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/assert-plus": { + "version": "1.0.0", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=0.8" } }, - "node_modules/exit": { - "version": "0.1.2", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/assertion-error": { + "version": "1.1.0", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "node_modules/extend": { - "version": "3.0.2", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "node_modules/async-limiter": { + "version": "1.0.1", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "license": "MIT" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/asynckit": { + "version": "0.4.0", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": "*" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/aws4": { + "version": "1.12.0", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true, "license": "MIT" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/babel": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", + "integrity": "sha512-ZDcCaI8Vlct8PJ3DvmyqUz+5X2Ylz3ZuuItBe/74yXosk2dwyVo/aN7MCJ8HJzhnnJ+6yP4o+lDgG9MBe91DLA==", + "deprecated": "In 6.x, the babel package has been deprecated in favor of babel-cli. Check https://opencollective.com/babel to support the Babel maintainers", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" + "bin": { + "babel": "lib/cli.js", + "babel-external-helpers": "lib/cli.js", + "babel-node": "lib/cli.js" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, - "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/find-up": { - "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, - "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/form-data": { - "version": "2.3.3", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">= 0.12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs.realpath": { + "node_modules/babel-loader/node_modules/json-schema-traverse": { "version": "1.0.0", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "p-locate": "^6.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "license": "ISC", + "dependencies": { + "p-limit": "^4.0.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "license": "MIT", "engines": { - "node": "*" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, - "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/glob": { - "version": "7.2.3", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, - "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, - "engines": { - "node": "*" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/globals": { - "version": "11.12.0", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/har-schema": { - "version": "2.0.0", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/binary-extensions": { + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/has": { - "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/braces": { + "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/hasha": { - "version": "5.2.2", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause" }, - "node_modules/he": { - "version": "1.2.0", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } + "license": "ISC" }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "whatwg-encoding": "^1.0.1" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/buffer-from": { + "version": "1.1.2", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "3.8.3", - "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "node_modules/caching-transform": { + "version": "4.0.0", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/camelcase": { + "version": "6.3.0", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chai": { + "version": "4.3.7", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/import-local": { - "version": "3.1.0", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/chalk": { + "version": "4.1.2", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">=8" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/check-error": { + "version": "1.0.2", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/inflight": { - "version": "1.0.6", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/chokidar": { + "version": "3.5.3", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=6.0" + } }, - "node_modules/interpret": { + "node_modules/clean-stack": { "version": "2.2.0", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/cli": { + "version": "1.0.1", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "exit": "0.1.2", + "glob": "^7.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.2.5" } }, - "node_modules/is-core-module": { - "version": "2.12.1", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "node_modules/cliui": { + "version": "7.0.4", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/color-convert": { + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/color-name": { + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/commander": { + "version": "2.20.3", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } + "license": "MIT" }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, - "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "browserslist": "^4.23.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/core-util-is": { + "version": "1.0.3", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "node_modules/cssom": { + "version": "0.3.8", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true, "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/cssstyle": { + "version": "1.4.0", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "cssom": "0.3.x" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/dashdash": { + "version": "1.14.1", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/isarray": { - "version": "0.0.1", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "node_modules/data-urls": { + "version": "1.1.0", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } }, - "node_modules/isexe": { - "version": "2.0.0", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } }, - "node_modules/isobject": { - "version": "3.0.1", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/date-now": { + "version": "0.1.4", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/isstream": { - "version": "0.1.2", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "license": "MIT" }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/decamelize": { + "version": "4.0.0", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "node_modules/deep-eql": { + "version": "4.1.3", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "append-transform": "^2.0.0" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "node_modules/deep-is": { + "version": "0.1.4", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "node_modules/default-require-extensions": { + "version": "3.0.1", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" + "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/diff": { + "version": "5.0.0", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/dom-serializer": { + "version": "0.2.2", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "node_modules/domelementtype": { + "version": "1.3.1", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "1.0.1", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" + "webidl-conversions": "^4.0.2" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/domhandler": { + "version": "2.3.0", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" + "domelementtype": "1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/domutils": { + "version": "1.5.1", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, - "license": "MIT" + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "node_modules/electron-to-chromium": { + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, - "node_modules/jsdom": { - "version": "11.12.0", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "once": "^1.4.0" } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "node_modules/enhanced-resolve": { + "version": "5.14.1", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=10.13.0" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/entities": { + "version": "1.0.0", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true, + "license": "BSD-like" + }, + "node_modules/envinfo": { + "version": "7.8.1", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true, "license": "MIT", "bin": { - "jsesc": "bin/jsesc" + "envinfo": "dist/cli.js" }, "engines": { "node": ">=4" } }, - "node_modules/jshint": { - "version": "2.13.6", - "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" - }, - "bin": { - "jshint": "bin/jshint" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/es-module-lexer": { + "version": "0.9.3", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/es6-error": { + "version": "4.1.1", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "ISC" + "engines": { + "node": ">=6" + } }, - "node_modules/json5": { - "version": "2.2.3", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/escodegen": { + "version": "1.14.3", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=0.6.0" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true, - "license": "MIT" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/left-pad": { - "version": "1.3.0", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "deprecated": "use String.prototype.padStart()", + "node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "WTFPL" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/levn": { - "version": "0.3.0", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=4.0" } }, - "node_modules/loader-runner": { + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { "version": "4.3.0", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=6.11.5" + "node": ">=4.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/esutils": { + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.x" } }, - "node_modules/lodash": { - "version": "4.17.21", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/exit": { + "version": "0.1.2", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "node_modules/extsprintf": { + "version": "1.3.0", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.9.1" } }, - "node_modules/loupe": { - "version": "2.3.6", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "node_modules/fill-range": { + "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "license": "MIT", "dependencies": { - "get-func-name": "^2.0.0" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/flat": { + "version": "5.0.2", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/foreground-child": { + "version": "2.0.0", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "mime-db": "1.52.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">= 0.6" + "node": ">=8.0.0" } }, - "node_modules/minimatch": { - "version": "3.0.8", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/forever-agent": { + "version": "0.6.1", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "Apache-2.0", "engines": { "node": "*" } }, - "node_modules/mocha": { - "version": "10.2.0", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/form-data": { + "version": "2.3.3", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">= 0.12" } }, - "node_modules/mocha-jsdom": { + "node_modules/fromentries": { + "version": "1.3.2", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { "version": "2.0.0", - "integrity": "sha512-+3D++FPXHXEesbBD7Q/r4dkc3XzVFMPLJVIECaQ685dj9qKQYzliqX8IXyIUbUL4x1QfgD9h8Zao8cn03NKKEA==", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "license": "MIT", "dependencies": { - "jsdom": "^11.11.0" - }, - "peerDependencies": { - "mocha": "*" + "assert-plus": "^1.0.0" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -2946,7 +3604,25 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "node_modules/glob-parent": { + "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, @@ -2958,32 +3634,74 @@ "node": "*" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/globals": { + "version": "11.12.0", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/has": { + "version": "1.0.3", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.1.1", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/has-flag": { + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, "engines": { "node": ">=8" }, @@ -2991,322 +3709,239 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ms": { - "version": "2.1.3", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/he": { + "version": "1.2.0", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT" + "license": "MIT", + "bin": { + "he": "bin/he" + } }, - "node_modules/nanoid": { - "version": "3.3.3", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "whatwg-encoding": "^1.0.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/html-escaper": { + "version": "2.0.2", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, - "node_modules/nise": { - "version": "5.1.4", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "node_modules/htmlparser2": { + "version": "3.8.3", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/http-signature": { + "version": "1.2.0", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.2.0", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-preload": { - "version": "0.2.1", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "node_modules/import-local": { + "version": "3.1.0", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-releases": { - "version": "2.0.12", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.5", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" + "node": ">=0.8.19" } }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/indent-string": { + "version": "4.0.0", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/nyc/node_modules/decamelize": { - "version": "1.2.0", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "2.2.0", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/is-core-module": { + "version": "2.12.1", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "has": "^1.0.3" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/is-extglob": { + "version": "2.1.1", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/is-glob": { + "version": "4.0.3", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/once": { - "version": "1.4.0", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "license": "MIT" }, - "node_modules/optionator": { - "version": "0.8.3", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { "node": ">=10" }, @@ -3314,1621 +3949,3492 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/is-windows": { + "version": "1.0.2", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-map": { - "version": "3.0.0", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "node_modules/isarray": { + "version": "0.0.1", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/isexe": { + "version": "2.0.0", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "ISC" }, - "node_modules/package-hash": { - "version": "4.0.0", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "node_modules/isobject": { + "version": "3.0.1", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "4.0.0", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "node_modules/isstream": { + "version": "0.1.2", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true, "license": "MIT" }, - "node_modules/path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "isarray": "0.0.1" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/pathval": { - "version": "1.1.1", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", - "engines": { - "node": "*" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=8" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/istanbul-reports": { + "version": "3.1.5", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "p-locate": "^4.1.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/jest-worker": { + "version": "27.5.1", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.13.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/pn": { - "version": "1.1.0", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "node_modules/jsbn": { + "version": "0.1.1", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, "license": "MIT" }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/jsdom": { + "version": "11.12.0", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, - "engines": { - "node": ">= 0.8.0" + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" } }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "node_modules/jsdom/node_modules/acorn": { + "version": "5.7.4", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true, "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/psl": { - "version": "1.9.0", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "license": "MIT" + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/pump": { - "version": "3.0.0", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/jshint": { + "version": "2.13.6", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", "dev": true, "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" } }, - "node_modules/punycode": { - "version": "2.3.0", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/qs": { - "version": "6.5.3", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/json-schema": { + "version": "0.4.0", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } + "license": "(AFL-2.1 OR BSD-3-Clause)" }, - "node_modules/randombytes": { - "version": "2.1.0", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } + "license": "MIT" }, - "node_modules/readable-stream": { - "version": "1.1.14", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } + "license": "ISC" }, - "node_modules/readdirp": { - "version": "3.6.0", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=6" } }, - "node_modules/rechoir": { - "version": "0.7.1", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "node_modules/jsprim": { + "version": "1.4.2", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.9.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">= 0.10" + "node": ">=0.6.0" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "node_modules/just-extend": { + "version": "4.2.1", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/request": { - "version": "2.88.2", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/kind-of": { + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/left-pad": { + "version": "1.3.0", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()", "dev": true, - "license": "ISC", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } + "license": "WTFPL" }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/levn": { + "version": "0.3.0", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">= 0.8.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/loader-runner": { + "version": "4.3.0", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.11.5" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.2", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "node_modules/locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "p-locate": "^5.0.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/lodash": { + "version": "4.17.21", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/lodash.get": { + "version": "4.4.2", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true, "license": "MIT" }, - "node_modules/sax": { - "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "node_modules/lodash.sortby": { + "version": "4.7.0", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/schema-utils": { - "version": "3.1.2", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "node_modules/log-symbols": { + "version": "4.1.0", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/loupe": { + "version": "2.3.6", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.0" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "randombytes": "^2.1.0" + "yallist": "^3.0.2" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "semver": "^6.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { + "node_modules/merge-stream": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/mime-db": { + "version": "1.52.0", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sinon": { - "version": "12.0.1", - "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "node_modules/mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" + "mime-db": "1.52.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "engines": { + "node": ">= 0.6" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/minimatch": { + "version": "3.0.8", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/mocha": { + "version": "10.2.0", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/mocha-jsdom": { + "version": "2.0.0", + "integrity": "sha512-+3D++FPXHXEesbBD7Q/r4dkc3XzVFMPLJVIECaQ685dj9qKQYzliqX8IXyIUbUL4x1QfgD9h8Zao8cn03NKKEA==", "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "jsdom": "^11.11.0" + }, + "peerDependencies": { + "mocha": "*" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.17.0", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "license": "ISC", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "1.0.4", - "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", - "dev": true, - "license": "MIT", - "bin": { - "strip-json-comments": "cli.js" }, - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/ms": { + "version": "2.1.3", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } + "license": "MIT" }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/nanoid": { + "version": "3.3.3", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/neo-async": { + "version": "2.6.2", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/nise": { + "version": "5.1.4", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/terser": { - "version": "5.17.7", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "type-detect": "4.0.8" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.8", - "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.2.0", + "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "randombytes": "^2.1.0" + "type-detect": "4.0.8" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/node-preload": { + "version": "0.2.1", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "process-on-spawn": "^1.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/normalize-path": { + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=0.10.0" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/nwsapi": { + "version": "2.2.5", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "dev": true + }, + "node_modules/nyc": { + "version": "15.1.0", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, "engines": { - "node": ">=0.8" + "node": ">=8.9" } }, - "node_modules/tr46": { - "version": "1.0.1", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.3.2", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { "node": ">=8" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "is-typedarray": "^1.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typescript": { - "version": "5.0.4", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=8" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } + "license": "ISC" }, - "node_modules/uuid": { - "version": "3.4.0", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/verror": { - "version": "1.10.0", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", + "license": "ISC", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "node_modules/oauth-sign": { + "version": "0.9.0", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": "*" + } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "node_modules/once": { + "version": "1.4.0", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "browser-process-hrtime": "^1.0.0" + "wrappy": "1" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/optionator": { + "version": "0.8.3", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.8.0" } }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/webpack": { - "version": "5.74.0", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "node_modules/p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "p-limit": "^3.0.2" }, - "bin": { - "webpack": "bin/webpack.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "bin": { - "webpack-cli": "bin/cli.js" + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=6" }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "engines": { + "node": ">=8" + } + }, + "node_modules/pn": { + "version": "1.1.0", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", + "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.2", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "3.1.2", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sinon": { + "version": "12.0.1", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true, + "license": "MIT", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.17.7", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.8", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.3.2", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.74.0", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-plugin-replace": { + "version": "1.2.0", + "integrity": "sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "6.5.0", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wildcard": { + "version": "2.0.1", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "5.2.3", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/y18n": { + "version": "5.0.8", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "dev": true + }, + "@babel/core": { + "version": "7.22.1", + "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.22.0", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helpers": "^7.22.0", + "@babel/parser": "^7.22.0", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "requires": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "requires": { + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "dev": true, + "requires": { + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "dev": true, + "requires": { + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + } + }, + "@babel/helpers": { + "version": "7.22.3", + "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", + "dev": true, + "requires": { + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.3" + } + }, + "@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.25.8" + } + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "@babel/plugin-transform-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "requires": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" } }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/webpack-plugin-replace": { - "version": "1.2.0", - "integrity": "sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w==", + "@babel/plugin-transform-block-scoping": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "@babel/plugin-transform-class-static-block": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "@babel/plugin-transform-classes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "globals": "^11.1.0" + } }, - "node_modules/whatwg-url": { - "version": "6.5.0", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "@babel/plugin-transform-computed-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" } }, - "node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "@babel/plugin-transform-destructuring": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/which-module": { - "version": "2.0.1", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "@babel/plugin-transform-dotall-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/wildcard": { - "version": "2.0.1", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "@babel/plugin-transform-dynamic-import": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, - "license": "Apache-2.0" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "@babel/plugin-transform-export-namespace-from": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "@babel/plugin-transform-for-of": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, - "node_modules/ws": { - "version": "5.2.3", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "@babel/plugin-transform-function-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" + "requires": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "@babel/plugin-transform-json-strings": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, - "license": "Apache-2.0" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/y18n": { - "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/yallist": { - "version": "3.1.1", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "node_modules/yargs": { - "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "@babel/plugin-transform-modules-amd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/code-frame": { - "version": "7.21.4", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/compat-data": { - "version": "7.22.3", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", - "dev": true + "@babel/plugin-transform-new-target": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "@babel/core": { - "version": "7.22.1", - "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/generator": { - "version": "7.22.3", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "@babel/plugin-transform-private-property-in-object": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, "requires": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-compilation-targets": { - "version": "7.22.1", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "@babel/plugin-transform-property-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.1", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", - "dev": true + "@babel/plugin-transform-regenerator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "regenerator-transform": "^0.15.2" + } }, - "@babel/helper-function-name": { - "version": "7.21.0", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "@babel/plugin-transform-reserved-words": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, "requires": { - "@babel/types": "^7.21.4" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, - "@babel/helper-module-transforms": { - "version": "7.22.1", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-simple-access": { - "version": "7.21.5", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/helper-string-parser": { - "version": "7.21.5", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "dev": true + "@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" + } }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "@babel/plugin-transform-unicode-escapes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + } }, - "@babel/helpers": { - "version": "7.22.3", - "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, "requires": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/highlight": { - "version": "7.18.6", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/parser": { - "version": "7.22.4", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", - "dev": true + "@babel/preset-env": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.8", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + } + }, + "@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } }, "@babel/template": { - "version": "7.21.9", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/traverse": { - "version": "7.22.4", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "dev": true, "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", - "debug": "^4.1.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.22.4", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" } }, @@ -5012,13 +7518,14 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -5027,8 +7534,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { @@ -5046,19 +7554,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@sinonjs/commons": { @@ -5343,6 +7845,35 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ajv-keywords": { "version": "3.5.2", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", @@ -5437,6 +7968,161 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, + "babel": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", + "integrity": "sha512-ZDcCaI8Vlct8PJ3DvmyqUz+5X2Ylz3ZuuItBe/74yXosk2dwyVo/aN7MCJ8HJzhnnJ+6yP4o+lDgG9MBe91DLA==", + "dev": true + }, + "babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + } + }, "balanced-match": { "version": "1.0.2", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", @@ -5483,14 +8169,15 @@ "dev": true }, "browserslist": { - "version": "4.21.7", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" } }, "buffer-from": { @@ -5515,8 +8202,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001494", - "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true }, "caseless": { @@ -5647,6 +8335,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "commondir": { "version": "1.0.1", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", @@ -5670,6 +8364,15 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dev": true, + "requires": { + "browserslist": "^4.23.3" + } + }, "core-util-is": { "version": "1.0.3", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", @@ -5845,8 +8548,9 @@ } }, "electron-to-chromium": { - "version": "1.4.419", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==", + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", "dev": true }, "emoji-regex": { @@ -5892,8 +8596,9 @@ "dev": true }, "escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -5987,6 +8692,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", @@ -6452,6 +9163,7 @@ }, "js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, @@ -6509,8 +9221,9 @@ } }, "jsesc": { - "version": "2.5.2", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "jshint": { @@ -6605,6 +9318,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "lodash.flattendeep": { "version": "4.4.0", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", @@ -6827,8 +9546,9 @@ } }, "node-releases": { - "version": "2.0.12", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -7082,8 +9802,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -7211,6 +9932,65 @@ "resolve": "^1.9.0" } }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "regjsparser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", + "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "dev": true, + "requires": { + "jsesc": "~3.0.2" + } + }, "release-zalgo": { "version": "1.0.0", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", @@ -7269,6 +10049,12 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", @@ -7331,8 +10117,9 @@ } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "serialize-javascript": { @@ -7623,13 +10410,42 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, "update-browserslist-db": { - "version": "1.0.11", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { diff --git a/package.json b/package.json index 44c1a5ac..6e002cff 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,10 @@ }, "homepage": "https://github.com/amazon-connect/amazon-connect-streams#readme", "devDependencies": { + "@babel/preset-env": "^7.21.4", + "@babel/preset-typescript": "^7.21.4", + "babel": "^6.23.0", + "babel-loader": "^9.1.2", "chai": "^4.3.7", "jshint": "^2.13.6", "mocha": "^10.2.0", diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 9f3a6092..6471b799 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49e0NDUDoiY2NwIixHVUlERVM6ImN1c3RvbXZpZXdzIn07dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfSxvPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTt0cnl7cmV0dXJuIGUuZ2V0Q29udGFjdElkKCl9Y2F0Y2h7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0N1c3RvbVZpZXdzXTogSW52YWxpZCBDb250YWN0IFByb3ZpZGVkOiAiLGUpfX07dC5hZ2VudEFwcC5pbml0QXBwPWZ1bmN0aW9uKGUsaSxzLGEpe2E9YXx8e307dmFyIGMsdT1zLmVuZHNXaXRoKCIvIil8fC9bPyZdP1tePT8mXSs9W149PyZdKy9nLnRlc3Qocyk/czpzKyIvIixsPWEub25Mb2FkP2Eub25Mb2FkOm51bGwscD17ZW5kcG9pbnQ6dSxzdHlsZTphLnN0eWxlLG9uTG9hZDpsfTtpZihlPT09bi5DQ1BfRFIpYz1uLkNDUDtlbHNlIGlmKGU9PT1uLkdVSURFUyYmYS5jdXN0b21WaWV3c1BhcmFtcyl7Y29uc3R7aWZyYW1lU3VmZml4OmV9PWEuY3VzdG9tVmlld3NQYXJhbXM7aWYoYz1lP2Ake24uR1VJREVTfSR7ZX1gOmAke24uR1VJREVTfWAsdm9pZCAwIT09dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5nZXQoYykpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBDdXN0b20gdmlld3MgYXBwbGljYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgcHJvdmlkZSBhIGRpZmZlcmVudCBpZnJhbWVTdWZmaXggZm9yIHRoZSBjdXN0b20gdmlld3MgYXBwbGljYXRpb24uIil9ZWxzZSBjPWU7dmFyIGQ9InN0cmluZyI9PXR5cGVvZiBpP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpOmk7dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5yZWdpc3RlcihjLHAsZCksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChjLChmdW5jdGlvbihpKXt2YXIgcz1pLmVuZHBvaW50LHU9aS5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZSBuLkNDUDpyZXR1cm4gYS5jY3BQYXJhbXM9YS5jY3BQYXJhbXM/YS5jY3BQYXJhbXM6e30sYS5zdHlsZSYmKGEuY2NwUGFyYW1zLnN0eWxlPWEuc3R5bGUpLGZ1bmN0aW9uKGUsbixvKXt2YXIgaT17Y2NwVXJsOmUsY2NwTG9hZFRpbWVvdXQ6MWU0LGxvZ2luUG9wdXA6ITAsbG9naW5Vcmw6cihlKSsiL2xvZ2luIixzb2Z0cGhvbmU6e2FsbG93RnJhbWVkU29mdHBob25lOiEwLGRpc2FibGVSaW5ndG9uZTohMSxhbGxvd0ZyYW1lZFZpZGVvQ2FsbDohMH19LHM9dC5tZXJnZShpLG8uY2NwUGFyYW1zKTt0LmNvcmUuaW5pdENDUChuLHMpfShzLHUsYSk7Y2FzZSBuLkdVSURFUzpyZXR1cm4gdm9pZCAwIT09YS5jdXN0b21WaWV3c1BhcmFtcz8odC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSksZnVuY3Rpb24oZSxyLGkpe2NvbnN0e2NvbnRhY3Q6cyxkaXNhYmxlQXV0b0Rlc3Ryb3k6YSxpZnJhbWVTdWZmaXg6Yyx0ZXJtaW5hdGVDdXN0b21WaWV3T3B0aW9uczp1PXt9fT1pLmN1c3RvbVZpZXdzUGFyYW1zO2xldCBsLHAse2NvbnRhY3RGbG93SWQ6ZH09aS5jdXN0b21WaWV3c1BhcmFtczt2b2lkIDAhPT1zJiYobD1vKHMpLGwmJiEwIT09YSYmInN0cmluZyIhPXR5cGVvZiBzJiZzLm9uRGVzdHJveSgobj0+e3QuY29yZS50ZXJtaW5hdGVDdXN0b21WaWV3KGUsYyx7dGltZW91dDp1LnRpbWVvdXR8fDVlMyxoaWRlSWZyYW1lOnZvaWQgMD09PXUuaGlkZUlmcmFtZXx8dS5oaWRlSWZyYW1lLHJlc29sdmVJZnJhbWU6dm9pZCAwPT09dS5yZXNvbHZlSWZyYW1lfHx1LnJlc29sdmVJZnJhbWV9KX0pKSxkfHxjb25zb2xlLndhcm4oIltDdXN0b21WaWV3c106IE5lZWQgdG8gcHJvdmlkZSBhIGNvbnRhY3RGbG93SWQgd2hlbiBkZWZpbmluZyBjb250YWN0IHBhcmFtZXRlciBmb3IgaW5pdGFsaXppbmcgY3VzdG9tdmlld3MgYXBwbGljYXRpb24iKSkscD1jP2Ake24uR1VJREVTfSR7Y31gOmAke24uR1VJREVTfWA7Y29uc3QgaD1gaWZyYW1lW2lkPScke3B9J11gLGY9cj8ucXVlcnlTZWxlY3RvcihoKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCk7aWYoIWYpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBObyBpZnJhbWUgZm91bmQgZm9yIHRoZSBhcHA6ICIscCk7e2NvbnN0IHQ9QVdTLnV0aWwudXVpZC52NCgpO2w/Zi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmN1cnJlbnRDb250YWN0SWQ9JHtsfSZhZ2VudEFwcFRhYklkPSR7dH0tdGFiYDpkJiYoZi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmFnZW50QXBwVGFiSWQ9JHt0fS10YWJgKX19KHMsdSxhKSk6dC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSk7ZGVmYXVsdDpyZXR1cm4gdC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIGk9cihzKSsiL2xvZ291dCIsdC5mZXRjaChpLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9aSwhMX0pKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1hLmN1c3RvbVZpZXdzUGFyYW1zPyhvPWMsdm9pZCB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmRlbGV0ZShvKSk6bnVsbDtkZWZhdWx0OnJldHVybiBudWxsfXZhciBvLGl9fX0pKX0sdC5hZ2VudEFwcC5zdG9wQXBwPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnN0b3AoZSl9fSgpfSw1MDA6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dDt2YXIgbixyPSJjY3AiO2UuY29ubmVjdC5hZ2VudEFwcC5BcHBSZWdpc3RyeT0obj17fSx7cmVnaXN0ZXI6ZnVuY3Rpb24oZSx0LHIpe25bZV09e2NvbnRhaW5lckRPTTpyLGVuZHBvaW50OnQuZW5kcG9pbnQsc3R5bGU6dC5zdHlsZSxpbnN0YW5jZTp2b2lkIDAsb25Mb2FkOnQub25Mb2FkfX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXtpZihuW2VdKXt2YXIgbz1uW2VdLmNvbnRhaW5lckRPTSxpPW5bZV0uZW5kcG9pbnQscz1uW2VdLnN0eWxlLGE9bltlXS5vbkxvYWQ7aWYoZSE9PXIpe3ZhciBjPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz10LG8uc3R5bGU9bnx8IndpZHRoOiAxMDAlOyBoZWlnaHQ6MTAwJTsiLG8uaWQ9ZSxvWyJhcmlhLWxhYmVsIl09ZSxvLm9ubG9hZD1yLG8uYWxsb3c9ImNsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUiLG8uc2V0QXR0cmlidXRlKCJzYW5kYm94IiwiYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1zY3JpcHRzIiksb30oZSxpLHMsYSk7by5hcHBlbmRDaGlsZChjKX1yZXR1cm4gbltlXS5pbnN0YW5jZT10KG5bZV0pLG5bZV0uaW5zdGFuY2UuaW5pdCgpfX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSxkZWxldGU6ZnVuY3Rpb24oZSl7ZGVsZXRlIG5bZV19LHN0b3A6ZnVuY3Rpb24oZSl7aWYobltlXSl7dmFyIHQscj1uW2VdLG89ci5jb250YWluZXJET00ucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoZS5pbmNsdWRlcygiY3VzdG9tdmlld3MiKSl7Y29uc3QgdD1gaWZyYW1lW2lkPScke2V9J11gO289ci5jb250YWluZXJET00ucXVlcnlTZWxlY3Rvcih0KX1yZXR1cm4gci5jb250YWluZXJET00ucmVtb3ZlQ2hpbGQobyksci5pbnN0YW5jZSYmKHQ9ci5pbnN0YW5jZS5kZXN0cm95KCksZGVsZXRlIHIuaW5zdGFuY2UpLHR9fX0pfSgpfSw5NjU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LkFnZW50U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0Iiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJvZmZsaW5lIl0pLHQuQWdlbnRTdGF0dXNUeXBlPXQuQWdlbnRTdGF0ZVR5cGUsdC5BZ2VudEF2YWlsU3RhdGVzPXQubWFrZUVudW0oWyJJbml0IiwiQnVzeSIsIkFmdGVyQ2FsbFdvcmsiLCJDYWxsaW5nQ3VzdG9tZXIiLCJEaWFsaW5nIiwiSm9pbmluZyIsIlBlbmRpbmdBdmFpbGFibGUiLCJQZW5kaW5nQnVzeSJdKSx0LkFnZW50RXJyb3JTdGF0ZXM9dC5tYWtlRW51bShbIkVycm9yIiwiQWdlbnRIdW5nVXAiLCJCYWRBZGRyZXNzQWdlbnQiLCJCYWRBZGRyZXNzQ3VzdG9tZXIiLCJEZWZhdWx0IiwiRmFpbGVkQ29ubmVjdEFnZW50IiwiRmFpbGVkQ29ubmVjdEN1c3RvbWVyIiwiSW52YWxpZExvY2FsZSIsIkxpbmVFbmdhZ2VkQWdlbnQiLCJMaW5lRW5nYWdlZEN1c3RvbWVyIiwiTWlzc2VkQ2FsbEFnZW50IiwiTWlzc2VkQ2FsbEN1c3RvbWVyIiwiTXVsdGlwbGVDY3BXaW5kb3dzIiwiUmVhbHRpbWVDb21tdW5pY2F0aW9uRXJyb3IiXSksdC5FbmRwb2ludFR5cGU9dC5tYWtlRW51bShbInBob25lX251bWJlciIsImFnZW50IiwicXVldWUiXSksdC5BZGRyZXNzVHlwZT10LkVuZHBvaW50VHlwZSx0LkNvbm5lY3Rpb25UeXBlPXQubWFrZUVudW0oWyJhZ2VudCIsImluYm91bmQiLCJvdXRib3VuZCIsIm1vbml0b3JpbmciXSksdC5Db25uZWN0aW9uU3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsImhvbGQiLCJkaXNjb25uZWN0ZWQiLCJzaWxlbnRfbW9uaXRvciIsImJhcmdlIl0pLHQuQ29ubmVjdGlvblN0YXR1c1R5cGU9dC5Db25uZWN0aW9uU3RhdGVUeXBlLHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNPTk5FQ1RJT05fQ09OTkVDVEVEX1NUQVRFUz10LnNldChbdC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuU0lMRU5UX01PTklUT1IsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkJBUkdFXSksdC5Db250YWN0U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImVycm9yIiwiZW5kZWQiLCJyZWplY3RlZCIsInBhdXNlZCJdKSx0LkNvbnRhY3RTdGF0dXNUeXBlPXQuQ29udGFjdFN0YXRlVHlwZSx0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz10Lm1ha2VFbnVtKFsicGF1c2VkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSx0LkNvbnRhY3RUeXBlPXQubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siXSksdC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZD10Lm1ha2VFbnVtKFsiaW5ib3VuZCIsIm91dGJvdW5kIiwidHJhbnNmZXIiLCJxdWV1ZV90cmFuc2ZlciIsImNhbGxiYWNrIiwiYXBpIiwiZGlzY29ubmVjdCIsIndlYnJ0Y19hcGkiXSksdC5Nb25pdG9yaW5nTW9kZT10Lm1ha2VFbnVtKFsiU0lMRU5UX01PTklUT1IiLCJCQVJHRSJdKSx0Lk1vbml0b3JpbmdFcnJvclR5cGVzPXQubWFrZUVudW0oWyJpbnZhbGlkX3RhcmdldF9zdGF0ZSJdKSx0LkNoYW5uZWxUeXBlPXQubWFrZUVudW0oWyJWT0lDRSIsIkNIQVQiLCJUQVNLIl0pLHQuTWVkaWFUeXBlPXQubWFrZUVudW0oWyJzb2Z0cGhvbmUiLCJjaGF0IiwidGFzayJdKSx0LlNvZnRwaG9uZUNhbGxUeXBlPXQubWFrZUVudW0oWyJhdWRpb192aWRlbyIsInZpZGVvX29ubHkiLCJhdWRpb19vbmx5Iiwibm9uZSJdKSx0LlNvZnRwaG9uZUVycm9yVHlwZXM9dC5tYWtlRW51bShbInVuc3VwcG9ydGVkX2Jyb3dzZXIiLCJtaWNyb3Bob25lX25vdF9zaGFyZWQiLCJzaWduYWxsaW5nX2hhbmRzaGFrZV9mYWlsdXJlIiwic2lnbmFsbGluZ19jb25uZWN0aW9uX2ZhaWx1cmUiLCJpY2VfY29sbGVjdGlvbl90aW1lb3V0IiwidXNlcl9idXN5X2Vycm9yIiwid2VicnRjX2Vycm9yIiwicmVhbHRpbWVfY29tbXVuaWNhdGlvbl9lcnJvciIsInZkaV9zdHJhdGVneV9ub3Rfc3VwcG9ydGVkIiwidmRpX3JlZGlyX25vdF9zdXBwb3J0ZWQiLCJvdGhlciJdKSx0LkNsaWNrVHlwZT10Lm1ha2VFbnVtKFsiQWNjZXB0IiwiUmVqZWN0IiwiSGFuZ3VwIl0pLHQuVm9pY2VJZEVycm9yVHlwZXM9dC5tYWtlRW51bShbIm5vX3NwZWFrZXJfaWRfZm91bmQiLCJzcGVha2VyX2lkX25vdF9lbnJvbGxlZCIsImdldF9zcGVha2VyX2lkX2ZhaWxlZCIsImdldF9zcGVha2VyX3N0YXR1c19mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfZmFpbGVkIiwib3B0X291dF9zcGVha2VyX2luX2xjbXNfZmFpbGVkIiwiZGVsZXRlX3NwZWFrZXJfZmFpbGVkIiwic3RhcnRfc2Vzc2lvbl9mYWlsZWQiLCJldmFsdWF0ZV9zcGVha2VyX2ZhaWxlZCIsInNlc3Npb25fbm90X2V4aXN0cyIsImRlc2NyaWJlX3Nlc3Npb25fZmFpbGVkIiwiZW5yb2xsX3NwZWFrZXJfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfaW5fbGNtc19mYWlsZWQiLCJub3Rfc3VwcG9ydGVkX29uX2NvbmZlcmVuY2VfY2FsbHMiLCJlbnJvbGxfc3BlYWtlcl90aW1lb3V0IiwiZXZhbHVhdGVfc3BlYWtlcl90aW1lb3V0IiwiZ2V0X2RvbWFpbl9pZF9mYWlsZWQiLCJub19kb21haW5faWRfZm91bmQiXSksdC5DVElFeGNlcHRpb25zPXQubWFrZUVudW0oWyJBY2Nlc3NEZW5pZWRFeGNlcHRpb24iLCJJbnZhbGlkU3RhdGVFeGNlcHRpb24iLCJCYWRFbmRwb2ludEV4Y2VwdGlvbiIsIkludmFsaWRBZ2VudEFSTkV4Y2VwdGlvbiIsIkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwiSW52YWxpZENvbnRhY3RUeXBlRXhjZXB0aW9uIiwiUGFnaW5hdGlvbkV4Y2VwdGlvbiIsIlJlZnJlc2hUb2tlbkV4cGlyZWRFeGNlcHRpb24iLCJTZW5kRGF0YUZhaWxlZEV4Y2VwdGlvbiIsIlVuYXV0aG9yaXplZEV4Y2VwdGlvbiIsIlF1b3RhRXhjZWVkZWRFeGNlcHRpb24iXSksdC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzPXQubWFrZUVudW0oWyJPTkdPSU5HIiwiRU5ERUQiLCJQRU5ESU5HX0NPTkZJR1VSQVRJT04iXSksdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQUNDRVBUIiwiUkVKRUNUIiwiTk9UX0VOT1VHSF9TUEVFQ0giLCJTUEVBS0VSX05PVF9FTlJPTExFRCIsIlNQRUFLRVJfT1BURURfT1VUIiwiU1BFQUtFUl9JRF9OT1RfUFJPVklERUQiLCJTUEVBS0VSX0VYUElSRUQiXSksdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJISUdIX1JJU0siLCJMT1dfUklTSyJdKSx0LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQXV0aGVudGljYXRlZCIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbmNvbmNsdXNpdmUiLCJOb3RFbnJvbGxlZCIsIk9wdGVkT3V0IiwiTm90RW5hYmxlZCIsIkVycm9yIl0pLHQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJIaWdoUmlzayIsIkxvd1Jpc2siLCJJbmNvbmNsdXNpdmUiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5WaWRlb0NhcGFiaWxpdHk9dC5tYWtlRW51bShbIlNFTkQiXSksdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXM9dC5tYWtlRW51bShbIk5PVF9FTk9VR0hfU1BFRUNIIiwiSU5fUFJPR1JFU1MiLCJDT01QTEVURUQiLCJGQUlMRUQiXSksdC5Wb2ljZUlkU3BlYWtlclN0YXR1cz10Lm1ha2VFbnVtKFsiT1BURURfT1VUIiwiRU5ST0xMRUQiLCJQRU5ESU5HIl0pLHQuVm9pY2VJZENvbnN0YW50cz17RVZBTFVBVEVfU0VTU0lPTl9ERUxBWToxZTQsRVZBTFVBVElPTl9NQVhfUE9MTF9USU1FUzoyNCxFVkFMVUFUSU9OX1BPTExJTkdfSU5URVJWQUw6NWUzLEVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVM6MTIwLEVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTDo1ZTMsU1RBUlRfU0VTU0lPTl9ERUxBWTo4ZTN9LHQuQWdlbnRQZXJtaXNzaW9ucz17T1VUQk9VTkRfQ0FMTDoib3V0Ym91bmRDYWxsIixWT0lDRV9JRDoidm9pY2VJZCJ9O3ZhciBuPWZ1bmN0aW9uKCl7aWYoIXQuYWdlbnQuaW5pdGlhbGl6ZWQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGFnZW50IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIil9O24ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpfSxuLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9LG4ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUkVGUkVTSCxlKX0sbi5wcm90b3R5cGUub25Sb3V0YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUk9VVEFCTEUsZSl9LG4ucHJvdG90eXBlLm9uTm90Um91dGFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSxlKX0sbi5wcm90b3R5cGUub25PZmZsaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5PRkZMSU5FLGUpfSxuLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FUlJPUixlKX0sbi5wcm90b3R5cGUub25Tb2Z0cGhvbmVFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGUpfSxuLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpfSxuLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25HYWluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCxlKX0sbi5wcm90b3R5cGUub25BZnRlckNhbGxXb3JrPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5BQ1csZSl9LG4ucHJvdG90eXBlLm9uU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlNUQVRFX0NIQU5HRSxlKX0sbi5wcm90b3R5cGUub25NdXRlVG9nZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxlKX0sbi5wcm90b3R5cGUub25Mb2NhbE1lZGlhU3RyZWFtQ3JlYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZSl9LG4ucHJvdG90eXBlLm9uU3BlYWtlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25NaWNyb3Bob25lRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5NSUNST1BIT05FX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vblJpbmdlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vbkNhbWVyYURldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ0FNRVJBX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vbkJhY2tncm91bmRCbHVyQ2hhbmdlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5CQUNLR1JPVU5EX0JMVVJfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUubXV0ZT1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEUsZGF0YTp7bXV0ZTohMH19KX0sbi5wcm90b3R5cGUudW5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiExfX0pfSxuLnByb3RvdHlwZS5zZXRTcGVha2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfU1BFQUtFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0TWljcm9waG9uZURldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX01JQ1JPUEhPTkVfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldFJpbmdlckRldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1JJTkdFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0Q2FtZXJhRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DQU1FUkFfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0QmFja2dyb3VuZEJsdXI9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLkJBQ0tHUk9VTkRfQkxVUl9DSEFOR0VELGRhdGE6e2lzQmFja2dyb3VuZEJsdXJFbmFibGVkOmV9fSl9LG4ucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5zdGF0ZX0sbi5wcm90b3R5cGUuZ2V0TmV4dFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5uZXh0U3RhdGV9LG4ucHJvdG90eXBlLmdldEF2YWlsYWJpbGl0eVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5hZ2VudEF2YWlsYWJpbGl0eVN0YXRlfSxuLnByb3RvdHlwZS5nZXRTdGF0dXM9bi5wcm90b3R5cGUuZ2V0U3RhdGUsbi5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5zdGF0ZS5zdGFydFRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0sbi5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249bi5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixuLnByb3RvdHlwZS5nZXRQZXJtaXNzaW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5wZXJtaXNzaW9uc30sbi5wcm90b3R5cGUuZ2V0Q29udGFjdHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LmNvbnRhY3RzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2NyZWF0ZUNvbnRhY3RBUEkoZSl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hZXx8dC5nZXRUeXBlKCk9PT1lfSkpfSxuLnByb3RvdHlwZS5nZXRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25maWd1cmF0aW9ufSxuLnByb3RvdHlwZS5nZXRBZ2VudFN0YXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5hZ2VudFN0YXRlc30sbi5wcm90b3R5cGUuZ2V0Um91dGluZ1Byb2ZpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucm91dGluZ1Byb2ZpbGV9LG4ucHJvdG90eXBlLmdldENoYW5uZWxDb25jdXJyZW5jeT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuY2hhbm5lbENvbmN1cnJlbmN5TWFwO3JldHVybiBufHwobj1PYmplY3Qua2V5cyh0LkNoYW5uZWxUeXBlKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIlRBU0siIT09biYmKGVbdC5DaGFubmVsVHlwZVtuXV09MSksZX0pLHt9KSksZT9uW2VdfHwwOm59LG4ucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkubmFtZX0sbi5wcm90b3R5cGUuZ2V0QWdlbnRBUk49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuYWdlbnRBUk59LG4ucHJvdG90eXBlLmdldEV4dGVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5leHRlbnNpb259LG4ucHJvdG90eXBlLmdldERpYWxhYmxlQ291bnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmRpYWxhYmxlQ291bnRyaWVzfSxuLnByb3RvdHlwZS5pc1NvZnRwaG9uZUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lRW5hYmxlZH0sbi5wcm90b3R5cGUuc2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtlJiZlLmFnZW50UHJlZmVyZW5jZXMmJmUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSYmIWUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUmJihlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlPWUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSksZSYmZS5hZ2VudFByZWZlcmVuY2VzJiYhdC5pc1ZhbGlkTG9jYWxlKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUpP24mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuQWdlbnRFcnJvclN0YXRlcy5JTlZBTElEX0xPQ0FMRSk6ci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfQUdFTlRfQ09ORklHVVJBVElPTix7Y29uZmlndXJhdGlvbjp0LmFzc2VydE5vdE51bGwoZSwiY29uZmlndXJhdGlvbiIpfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04pLG4uc3VjY2VzcyYmbi5zdWNjZXNzKGUpfSxmYWlsdXJlOm4mJm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlBVVF9BR0VOVF9TVEFURSx7c3RhdGU6dC5hc3NlcnROb3ROdWxsKGUsInN0YXRlIiksZW5xdWV1ZU5leHRTdGF0ZTpyJiYhIXIuZW5xdWV1ZU5leHRTdGF0ZX0sbil9LG4ucHJvdG90eXBlLm9uRW5xdWV1ZWROZXh0U3RhdGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxlKX0sbi5wcm90b3R5cGUuc2V0U3RhdHVzPW4ucHJvdG90eXBlLnNldFN0YXRlLG4ucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkO3ZhciBpPXtlbmRwb2ludDp0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxxdWV1ZUFSTjpuJiYobi5xdWV1ZUFSTnx8bi5xdWV1ZUlkKXx8dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlQVJOfTtuJiZuLnJlbGF0ZWRDb250YWN0SWQmJm51bGwhPT1uLnJlbGF0ZWRDb250YWN0SWQmJihpLnJlbGF0ZWRDb250YWN0SWQ9bi5yZWxhdGVkQ29udGFjdElkLG4ucHJldmlvdXNDb250YWN0SWQmJmRlbGV0ZSBpLnByZXZpb3VzQ29udGFjdElkKSxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9PVVRCT1VORF9DT05UQUNULGksbiYme3N1Y2Nlc3M6bi5zdWNjZXNzLGZhaWx1cmU6bi5mYWlsdXJlfSl9LG4ucHJvdG90eXBlLmdldEFsbFF1ZXVlQVJOcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5xdWV1ZUFSTn0pKX0sbi5wcm90b3R5cGUuZ2V0RW5kcG9pbnRzPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpO3QuYXNzZXJ0Tm90TnVsbChuLCJjYWxsYmFja3MiKSx0LmFzc2VydE5vdE51bGwobi5zdWNjZXNzLCJjYWxsYmFja3Muc3VjY2VzcyIpO3ZhciBzPXJ8fHt9O3MuZW5kcG9pbnRzPXMuZW5kcG9pbnRzfHxbXSxzLm1heFJlc3VsdHM9cy5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0LmlzQXJyYXkoZSl8fChlPVtlXSksaS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfRU5EUE9JTlRTLHtxdWV1ZUFSTnM6ZSxuZXh0VG9rZW46cy5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpzLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHIpe2lmKHIubmV4dFRva2VuKW8uZ2V0RW5kcG9pbnRzKGUsbix7bmV4dFRva2VuOnIubmV4dFRva2VuLG1heFJlc3VsdHM6cy5tYXhSZXN1bHRzLGVuZHBvaW50czpzLmVuZHBvaW50cy5jb25jYXQoci5lbmRwb2ludHMpfSk7ZWxzZXtzLmVuZHBvaW50cz1zLmVuZHBvaW50cy5jb25jYXQoci5lbmRwb2ludHMpO3ZhciBpPXMuZW5kcG9pbnRzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkVuZHBvaW50KGUpfSkpO24uc3VjY2Vzcyh7ZW5kcG9pbnRzOmksYWRkcmVzc2VzOml9KX19LGZhaWx1cmU6bi5mYWlsdXJlfSl9LG4ucHJvdG90eXBlLmdldEFkZHJlc3Nlcz1uLnByb3RvdHlwZS5nZXRFbmRwb2ludHMsbi5wcm90b3R5cGUuX2dldFJlc291cmNlSWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEFsbFF1ZXVlQVJOcygpO2ZvcihsZXQgdCBvZiBlKXtjb25zdCBlPXQubWF0Y2goL1wvYWdlbnRcLyhbXi9dKykvKTtpZihlKXJldHVybiBlWzFdfXJldHVybiBuZXcgRXJyb3IoIkFnZW50LnByb3RvdHlwZS5fZ2V0UmVzb3VyY2VJZDogcXVldWVBcm5zIGRpZCBub3QgY29udGFpbiBhZ2VudFJlc291cmNlSWQ6ICIsZSl9LG4ucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQWdlbnRTbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfTt2YXIgcj1mdW5jdGlvbihlKXt0LkFnZW50LmNhbGwodGhpcyksdGhpcy5hZ2VudERhdGE9ZX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWdlbnREYXRhfSxyLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpfTt2YXIgbz1mdW5jdGlvbihlKXt0aGlzLmNvbnRhY3RJZD1lfTtvLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmdldENvbnRhY3RJZCgpKX0sby5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5DSEFUP25ldyB0LkNoYXRDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKTp0aGlzLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuVEFTSz9uZXcgdC5UYXNrQ29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCk6bmV3IHQuVm9pY2VDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKX0sby5wcm90b3R5cGUuZ2V0RXZlbnROYW1lPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShlLHRoaXMuZ2V0Q29udGFjdElkKCkpfSxvLnByb3RvdHlwZS5vblJlZnJlc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCksZSl9LG8ucHJvdG90eXBlLm9uSW5jb21pbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3Rpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVElORyksZSl9LG8ucHJvdG90eXBlLm9uUGVuZGluZz1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKSxlKX0sby5wcm90b3R5cGUub25BY2NlcHRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCksZSl9LG8ucHJvdG90eXBlLm9uTWlzc2VkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLk1JU1NFRCksZSl9LG8ucHJvdG90eXBlLm9uRW5kZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRU5ERUQpLGUpfSxvLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVEKSxlKX0sby5wcm90b3R5cGUub25BQ1c9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNXKSxlKX0sby5wcm90b3R5cGUub25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKSxlKX0sby5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5FUlJPUiksZSl9LG8ucHJvdG90eXBlLmdldENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYWxDb250YWN0SWR9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb250YWN0SWQ9by5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQsby5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RHVyYXRpb259LG8ucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zdGF0ZX0sby5wcm90b3R5cGUuZ2V0U3RhdHVzPW8ucHJvdG90eXBlLmdldFN0YXRlLG8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxvLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1vLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG8ucHJvdG90eXBlLmdldFF1ZXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWV1ZX0sby5wcm90b3R5cGUuZ2V0UXVldWVUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlVGltZXN0YW1wfSxvLnByb3RvdHlwZS5nZXRDb25uZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25uZWN0aW9ucy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBlLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCl9KSl9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzSW5pdGlhbENvbm5lY3Rpb24oKX0pKXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWN0aXZlSW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIG51bGwhPWUmJmUuaXNBY3RpdmUoKT9lOm51bGx9LG8ucHJvdG90eXBlLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5pc0luaXRpYWxDb25uZWN0aW9uKCkmJmUuZ2V0VHlwZSgpIT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVH0pKX0sby5wcm90b3R5cGUuZ2V0U2luZ2xlQWN0aXZlVGhpcmRQYXJ0eUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSlbMF18fG51bGx9LG8ucHJvdG90eXBlLmdldEFnZW50Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXt2YXIgbj1lLmdldFR5cGUoKTtyZXR1cm4gbj09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fG49PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9KSl9LG8ucHJvdG90eXBlLmdldEFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGU9PmUuaXNBY3RpdmUoKSkpfSxvLnByb3RvdHlwZS5oYXNUd29BY3RpdmVQYXJ0aWNpcGFudHM9ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXRoaXMuZ2V0QWN0aXZlQ29ubmVjdGlvbnMoKS5sZW5ndGh9LG8ucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm5hbWV9LG8ucHJvdG90eXBlLmdldENvbnRhY3RNZXRhZGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdE1ldGFkYXRhfSxvLnByb3RvdHlwZS5nZXREZXNjcmlwdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZGVzY3JpcHRpb259LG8ucHJvdG90eXBlLmdldFJlZmVyZW5jZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnJlZmVyZW5jZXN9LG8ucHJvdG90eXBlLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmF0dHJpYnV0ZXN9LG8ucHJvdG90eXBlLmdldENvbnRhY3RGZWF0dXJlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdEZlYXR1cmVzfSxvLnByb3RvdHlwZS5nZXRDaGFubmVsQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2hhbm5lbENvbnRleHR9LG8ucHJvdG90eXBlLmdldFNlZ21lbnRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zZWdtZW50QXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdFN1YnR5cGU9ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0U2VnbWVudEF0dHJpYnV0ZXMoKTtyZXR1cm4gZSYmZVsiY29ubmVjdDpTdWJ0eXBlIl0/ZVsiY29ubmVjdDpTdWJ0eXBlIl0uVmFsdWVTdHJpbmc6bnVsbH0sby5wcm90b3R5cGUuaXNTb2Z0cGhvbmVDYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpfSkpfSxvLnByb3RvdHlwZS5oYXNWaWRlb1JUQ0NhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiBudWxsIT10LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jYW5TZW5kVmlkZW8mJmUuY2FuU2VuZFZpZGVvKCl9KSl9LG8ucHJvdG90eXBlLmNhbkFnZW50U2VuZFZpZGVvPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmdldEFnZW50Q29ubmVjdGlvbigpO3JldHVybiBlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuY2FuQWdlbnRSZWNlaXZlVmlkZW89ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtpZihlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKSlyZXR1cm4hMDtjb25zdCB0PXRoaXMuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zKCk7cmV0dXJuIHQmJnQubGVuZ3RoPjAmJnRoaXMuY2FuQWdlbnRTZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuX2lzSW5ib3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhdGlvbk1ldGhvZCE9PXQuQ29udGFjdEluaXRpYXRpb25NZXRob2QuT1VUQk9VTkR9LG8ucHJvdG90eXBlLmlzSW5ib3VuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gZS5nZXRNZWRpYVR5cGUoKT09PXQuTWVkaWFUeXBlLlRBU0s/dGhpcy5faXNJbmJvdW5kKCk6ISFlJiZlLmdldFR5cGUoKT09PXQuQ29ubmVjdGlvblR5cGUuSU5CT1VORH0sby5wcm90b3R5cGUuaXNDb25uZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRH0sby5wcm90b3R5cGUuYWNjZXB0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKSxyPXRoaXMsbz10aGlzLmdldENvbnRhY3RJZCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLkFDQ0VQVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5BQ0NFUFRfQ09OVEFDVCx7Y29udGFjdElkOm99LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPXQuY29yZS5nZXRVcHN0cmVhbSgpO2kuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGRhdGE6bmV3IHQuQ29udGFjdChvKX0pLGkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELHIuZ2V0Q29udGFjdElkKCkpLGRhdGE6bmV3IHQuQ29udGFjdChvKX0pO3ZhciBzPW5ldyB0LkNvbnRhY3Qobyk7dC5pc0ZpcmVmb3hCcm93c2VyKCkmJnMuaXNTb2Z0cGhvbmVDYWxsKCkmJnQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50KCksZSYmZS5zdWNjZXNzJiZlLnN1Y2Nlc3Mobil9LGZhaWx1cmU6ZnVuY3Rpb24obixyKXt0LmdldExvZygpLmVycm9yKCJBY2NlcHQgQ29udGFjdCBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdCh7ZGF0YTpyfSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJDb250YWN0QWNjZXB0RmFpbHVyZSIsZGF0YTp7Y291bnQ6MX19KSxlJiZlLmZhaWx1cmUmJmUuZmFpbHVyZSh0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IpfX0pfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5nZXRMb2coKS53YXJuKCJjb250YWN0LmRlc3Ryb3koKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfSxvLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLlJFSkVDVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jb21wbGV0ZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09NUExFVEVfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5ub3RpZnlJc3N1ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLk5PVElGWV9DT05UQUNUX0lTU1VFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxpc3N1ZUNvZGU6ZSxkZXNjcmlwdGlvbjpufSxyKX0sby5wcm90b3R5cGUuYWRkQ29ubmVjdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPW5ldyB0LkVuZHBvaW50KGUpO2RlbGV0ZSBvLmVuZHBvaW50SWQsci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfQURESVRJT05BTF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxlbmRwb2ludDpvfSxuKX0sby5wcm90b3R5cGUudG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9bnVsbCxvPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0pKTtpZihudWxsIT1vKXI9by5nZXRDb25uZWN0aW9uSWQoKTtlbHNle3ZhciBpPXRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSk7aS5sZW5ndGg+MCYmKHI9aVswXS5nZXRDb25uZWN0aW9uSWQoKSl9bi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5UT0dHTEVfQUNUSVZFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6cn0sZSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVNZXRyaWNzPWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczpufSxyKSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cyh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc3RhdHM6bn0pfSxvLnByb3RvdHlwZS5zZW5kU29mdHBob25lUmVwb3J0PWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6bn0scil9LG8ucHJvdG90eXBlLmNvbmZlcmVuY2VDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09ORkVSRU5DRV9DT05ORUNUSU9OUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxvLnByb3RvdHlwZS5pc011bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGFjdEZlYXR1cmVzKCk7cmV0dXJuISghZXx8IWUubXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkKX0sby5wcm90b3R5cGUudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGU9ZnVuY3Rpb24oZSxuKXtlJiZPYmplY3QudmFsdWVzKHQuTW9uaXRvcmluZ01vZGUpLmluY2x1ZGVzKGUudG9VcHBlckNhc2UoKSk/dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSx0YXJnZXRNb25pdG9yTW9kZTplLnRvVXBwZXJDYXNlKCl9LG4pOih0LmdldExvZygpLmVycm9yKGBJbnZhbGlkIHRhcmdldCBzdGF0ZSB3YXMgcHJvdmlkZWQ6ICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuTW9uaXRvcmluZ0Vycm9yVHlwZXMuSU5WQUxJRF9UQVJHRVRfU1RBVEUpKX0sby5wcm90b3R5cGUuaXNVbmRlclN1cGVydmlzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZT0+ZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UKSk7cmV0dXJuIHZvaWQgMCE9PShlJiZlLmZpbmQoKGU9PmUuaXNCYXJnZSgpJiZlLmlzQWN0aXZlKCkpKSl9LG8ucHJvdG90eXBlLnNpbGVudE1vbml0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGUodC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUixlKX0sby5wcm90b3R5cGUuYmFyZ2VJbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFLGUpfSxvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUEFVU0VfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlJFU1VNRV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9O3ZhciBpPWZ1bmN0aW9uKGUpe3QuQ29udGFjdC5jYWxsKHRoaXMsZS5jb250YWN0SWQpLHRoaXMuY29udGFjdERhdGE9ZX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdERhdGF9LGkucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QoZSl9O3ZhciBzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jb250YWN0SWQ9ZSx0aGlzLmNvbm5lY3Rpb25JZD10LHRoaXMuX2luaXRNZWRpYUNvbnRyb2xsZXIoKX07cy5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29ubmVjdGlvbkRhdGEodGhpcy5nZXRDb250YWN0SWQoKSx0aGlzLmdldENvbm5lY3Rpb25JZCgpKX0scy5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxzLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uSWR9LHMucHJvdG90eXBlLmdldEVuZHBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkVuZHBvaW50KHRoaXMuX2dldERhdGEoKS5lbmRwb2ludCl9LHMucHJvdG90eXBlLmdldEFkZHJlc3M9cy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQscy5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxzLnByb3RvdHlwZS5nZXRTdGF0dXM9cy5wcm90b3R5cGUuZ2V0U3RhdGUscy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LHMucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPXMucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24scy5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0scy5wcm90b3R5cGUuaXNJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbH0scy5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb250YWlucyh0LkNPTk5FQ1RJT05fQUNUSVZFX1NUQVRFUyx0aGlzLmdldFN0YXR1cygpLnR5cGUpfSxzLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElOR30scy5wcm90b3R5cGUuaXNPbkhvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTER9LHMucHJvdG90eXBlLmdldFNvZnRwaG9uZU1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxzLnByb3RvdHlwZS5nZXRNb25pdG9ySW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvcmluZ0luZm99LHMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuSEFOR1VQLGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSx0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuREVTVFJPWV9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnNlbmREaWdpdHM9ZnVuY3Rpb24oZSxuKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9ESUdJVFMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpLGRpZ2l0czplfSxuKX0scy5wcm90b3R5cGUuaG9sZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuSE9MRF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVTVU1FX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX0scy5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt0aGlzLmdldE1lZGlhSW5mbygpJiZ0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9O3ZhciBhPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O2EucHJvdG90eXBlLmdldFNwZWFrZXJJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtjb25zdCBpPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksYXdzQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkdFVF9DT05UQUNULGkse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5jb250YWN0RGF0YS5jdXN0b21lcklkKXt2YXIgbj17c3BlYWtlcklkOmUuY29udGFjdERhdGEuY3VzdG9tZXJJZH07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VySWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9ZWxzZXt2YXIgaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk5PX1NQRUFLRVJfSURfRk9VTkQsIk5vIHNwZWFrZXJJZCBhc3NvdGlhdGVkIHdpdGggdGhpcyBjYWxsIik7byhpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiR2V0IFNwZWFrZXJJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9JRF9GQUlMRUQsIkdldCBTcGVha2VySWQgZmFpbGVkIixlKTtvKG4pfX0pfSkpfSxhLnByb3RvdHlwZS5nZXRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHM9e1NwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoaS5zcGVha2VySWQsInNwZWFrZXJJZCIpLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJTdGF0dXMgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG49SlNPTi5wYXJzZShlKTtzd2l0Y2gobi5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0OnZhciBpPW47aS50eXBlPWkudHlwZT9pLnR5cGU6dC5Wb2ljZUlkRXJyb3JUeXBlcy5TUEVBS0VSX0lEX05PVF9FTlJPTExFRCx0LmdldExvZygpLmluZm8oIlNwZWFrZXIgaXMgbm90IGVucm9sbGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihpKTticmVhaztkZWZhdWx0OnQuZ2V0TG9nKCkuZXJyb3IoImdldFNwZWFrZXJTdGF0dXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX1NQRUFLRVJfU1RBVFVTX0ZBSUxFRCwiR2V0IFNwZWFrZXJTdGF0dXMgZmFpbGVkIixlKTtvKHMpfX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuX29wdE91dFNwZWFrZXJJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e1NwZWFrZXJPcHRlZE91dDohMCxnZW5lcmF0ZWRTcGVha2VySWQ6bn19O3QuZ2V0TG9nKCkuaW5mbygiX29wdE91dFNwZWFrZXJJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlckluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9JTl9MQ01TX0ZBSUxFRCwib3B0T3V0U3BlYWtlckluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLm9wdE91dFNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24ocyl7dmFyIGE9aS5zcGVha2VySWQ7Y29uc3QgYz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChhLCJzcGVha2VySWQiKSxEb21haW5JZDpzfTt0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5PUFRfT1VUX1NQRUFLRVIsYyx7c3VjY2VzczpmdW5jdGlvbihuKXtlLl9vcHRPdXRTcGVha2VySW5MY21zKGEsbi5nZW5lcmF0ZWRTcGVha2VySWQpLmNhdGNoKChmdW5jdGlvbigpe30pKSx0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigib3B0T3V0U3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5PUFRfT1VUX1NQRUFLRVJfRkFJTEVELCJvcHRPdXRTcGVha2VyIGZhaWxlZC4iLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlbGV0ZVNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZWxldGVTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVMRVRFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZGVsZXRlU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERUxFVEVfU1BFQUtFUl9GQUlMRUQsImRlbGV0ZVNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3RhcnRTZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihpKXtjb25zdCBzPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksY3VzdG9tZXJBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksY2xpZW50VG9rZW46QVdTLnV0aWwudXVpZC52NCgpLGRvbWFpbklkOml9O3QuZ2V0TG9nKCkuaW5mbygic3RhcnRTZXNzaW9uIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuU1RBUlRfVk9JQ0VfSURfU0VTU0lPTixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2lmKGUuc2Vzc2lvbklkKXIoZSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCwgbm8gc2Vzc2lvbiBpZCByZXR1cm5lZCIpLndpdGhPYmplY3Qoe2RhdGE6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwiTm8gc2Vzc2lvbiBpZCByZXR1cm5lZCBmcm9tIHN0YXJ0IHNlc3Npb24gYXBpIik7byhuKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcj1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSxpPTA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe2Z1bmN0aW9uIGMoKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3QgdT17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdCh1KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FVkFMVUFURV9TRVNTSU9OLHUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoKytpPHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTKWlmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLlBFTkRJTkdfQ09ORklHVVJBVElPTilzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCk7ZWxzZXtpZihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0fHwoZS5BdXRoZW50aWNhdGlvblJlc3VsdD17fSxlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0fHwoZS5GcmF1ZERldGVjdGlvblJlc3VsdD17fSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSwhbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZihlLlN0cmVhbWluZ1N0YXR1cz09PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRCYmKG4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpLG4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFKSksbi5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmUoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZShlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZighbi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNBdXRoRW5hYmxlZChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFDQ0VQVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlJFSkVDVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9BVVRIRU5USUNBVEVEO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX09QVEVEX09VVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk9QVEVEX09VVDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uU1BFQUtFUl9OT1RfRU5ST0xMRUQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5ST0xMRUQ7YnJlYWs7ZGVmYXVsdDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZEVuYWJsZWQoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpc3dpdGNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pe2Nhc2UgdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s7YnJlYWs7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkxPV19SSVNLOmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s7YnJlYWs7ZGVmYXVsdDplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCl9ZWxzZXt0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX1RJTUVPVVQsImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iik7YShyKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX0ZBSUxFRCwiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1hKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXthKGUpfSkpfWU/bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRFX1NFU1NJT05fREVMQVkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzeW5jU3BlYWtlcklkIGZhaWxlZCB3aGVuIHNlc3Npb24gc3RhcnROZXc9dHJ1ZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFNlc3Npb24gZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSk6bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtjKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz1mYWxzZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5kZXNjcmliZVNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5jb3JlLmdldENsaWVudCgpLHI9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U2Vzc2lvbk5hbWVPcklkOnIuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZXNjcmliZVNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7byhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZXNjcmliZVNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuREVTQ1JJQkVfU0VTU0lPTl9GQUlMRUQsImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiLGUpO2kobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2koZSl9KSl9KSl9LGEucHJvdG90eXBlLmNoZWNrRW5yb2xsbWVudFN0YXR1cz1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImNoZWNrRW5yb2xsbWVudFN0YXR1cyBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXRoaXMscj0wLG89ITE7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBhKCl7aWYoKytyPHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX01BWF9QT0xMX1RJTUVTKW4uZGVzY3JpYmVTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24ocil7c3dpdGNoKHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKXtjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRDppKHIpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuSU5fUFJPR1JFU1M6b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChlKHIpLG89ITApLHNldFRpbWVvdXQoYSx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMKTticmVhaztjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLk5PVF9FTk9VR0hfU1BFRUNIOnIuU2Vzc2lvbi5TdHJlYW1pbmdTdGF0dXMhPT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuRU5ERUQ/c2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpOnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXthKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUsdCl7cyhlKX0pKX0pLHQuVm9pY2VJZENvbnN0YW50cy5TVEFSVF9TRVNTSU9OX0RFTEFZKTticmVhaztkZWZhdWx0OnZhciBjPXIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZT9yLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLk1lc3NhZ2U6ImVucm9sbFNwZWFrZXIgZmFpbGVkLiBVbmtub3duIGVucm9sbG1lbnQgc3RhdHVzIGhhcyBiZWVuIHJlY2VpdmVkIjt0LmdldExvZygpLmVycm9yKGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHU9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsYyxyLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLlN0YXR1cyk7cyh1KX19KSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBjPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfVElNRU9VVCwiZW5yb2xsU3BlYWtlciB0aW1lb3V0Iik7cyhjKX19KCl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXI9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcztyZXR1cm4gbi5jaGVja0NvbmZlcmVuY2VDYWxsKCksbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtuLmdldFNwZWFrZXJTdGF0dXMoKS50aGVuKChmdW5jdGlvbihpKXtpLlNwZWFrZXImJmkuU3BlYWtlci5TdGF0dXM9PXQuVm9pY2VJZFNwZWFrZXJTdGF0dXMuT1BURURfT1VUP24uZGVsZXRlU3BlYWtlcigpLnRoZW4oKGZ1bmN0aW9uKCl7bi5lbnJvbGxTcGVha2VySGVscGVyKHIsbyxlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKTpuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5lbnJvbGxTcGVha2VySGVscGVyPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpLHM9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO28uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihhKXtjb25zdCBjPXtTZXNzaW9uTmFtZU9ySWQ6cy5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXJIZWxwZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FTlJPTExfQllfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKGkpe2kuU3RhdHVzPT09dC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEPyh0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUoaSkpOm8uY2hlY2tFbnJvbGxtZW50U3RhdHVzKHIpLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShuKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCwiZW5yb2xsU3BlYWtlciBmYWlsZWQiLGUpO24ocil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9LGEucHJvdG90eXBlLl91cGRhdGVTcGVha2VySWRJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e2dlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfdXBkYXRlU3BlYWtlcklkSW5MY21zIGNhbGxlZCIpLndpdGhPYmplY3QoYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuVVBEQVRFX1ZPSUNFX0lEX0RBVEEsYSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfSU5fTENNU19GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7bi5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpvLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLFNwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksRG9tYWluSWQ6YX07dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbz1yJiZyLlNlc3Npb24mJnIuU2Vzc2lvbi5HZW5lcmF0ZWRTcGVha2VySWQ7bi5fdXBkYXRlU3BlYWtlcklkSW5MY21zKGUsbykudGhlbigoZnVuY3Rpb24oKXtpKHIpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuO3N3aXRjaChKU09OLnBhcnNlKGUpLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNFU1NJT05fTk9UX0VYSVNUUywidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7YnJlYWs7ZGVmYXVsdDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfRkFJTEVELCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXMobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KSl9LGEucHJvdG90eXBlLnN5bmNTcGVha2VySWQ9ZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oInN5bmNTcGVha2VySWQgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKHIpe2UudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKHIuc3BlYWtlcklkKS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5nZXREb21haW5JZD1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpZigobmV3IHQuQWdlbnQpLmdldFBlcm1pc3Npb25zKCkuaW5jbHVkZXModC5BZ2VudFBlcm1pc3Npb25zLlZPSUNFX0lEKSlpZih0LmNvcmUudm9pY2VJZERvbWFpbklkKWUodC5jb3JlLnZvaWNlSWREb21haW5JZCk7ZWxzZXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCk7Y29uc3Qgbz17SW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksSW50ZWdyYXRpb25UeXBlOiJWT0lDRV9JRCJ9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgY2FsbGVkIikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5MSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUyxvLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3RyeXt2YXIgbztpZihyLkludGVncmF0aW9uQXNzb2NpYXRpb25TdW1tYXJ5TGlzdC5sZW5ndGg+PTEmJihvPXIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0WzBdLkludGVncmF0aW9uQXJuLnJlcGxhY2UoL14uKmRvbWFpblwvL2ksIiIpKSwhbyl7dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZDogbm8gZG9tYWluSWQgZm91bmQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fRE9NQUlOX0lEX0ZPVU5EKTtyZXR1cm4gdm9pZCBuKGkpfXQuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELGRhdGE6e2RvbWFpbklkOm99fSksZShvKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJnZXREb21haW5JZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpLG4oaSl9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpO24ocil9fSl9ZWxzZSBuKG5ldyBFcnJvcigiQWdlbnQgZG9lc24ndCBoYXZlIHRoZSBwZXJtaXNzaW9uIGZvciBWb2ljZSBJRCIpKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tDb25mZXJlbmNlQ2FsbD1mdW5jdGlvbigpe2lmKHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKS5jb25uZWN0aW9ucy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLGUuc3RhdGUudHlwZSl9KSkubGVuZ3RoPjIpdGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcigiVm9pY2VJZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb25mZXJlbmNlIGNhbGxzIil9LGEucHJvdG90eXBlLmlzQXV0aEVuYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5BQkxFRH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfSxhLnByb3RvdHlwZS5pc0ZyYXVkRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRX07dmFyIGM9ZnVuY3Rpb24oZSx0KXt0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvcj1uZXcgYShlKSxzLmNhbGwodGhpcyxlLHQpfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxjLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuU09GVFBIT05FfSxjLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlcklkKCl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmdldFNwZWFrZXJTdGF0dXMoKX0sYy5wcm90b3R5cGUub3B0T3V0Vm9pY2VJZFNwZWFrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3Iub3B0T3V0U3BlYWtlcigpfSxjLnByb3RvdHlwZS5kZWxldGVWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5kZWxldGVTcGVha2VyKCl9LGMucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcldpdGhWb2ljZUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5ldmFsdWF0ZVNwZWFrZXIoZSl9LGMucHJvdG90eXBlLmVucm9sbFNwZWFrZXJJblZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmVucm9sbFNwZWFrZXIoZSl9LGMucHJvdG90eXBlLnVwZGF0ZVZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZChlKX0sYy5wcm90b3R5cGUuZ2V0UXVpY2tDb25uZWN0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVpY2tDb25uZWN0TmFtZX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sYy5wcm90b3R5cGUuaXNCYXJnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1vbml0b3JTdGF0dXMoKT09PXQuTW9uaXRvcmluZ01vZGUuQkFSR0V9LGMucHJvdG90eXBlLmlzQmFyZ2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5CQVJHRSl9LGMucHJvdG90eXBlLmlzU2lsZW50TW9uaXRvckVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SKX0sYy5wcm90b3R5cGUuZ2V0TW9uaXRvckNhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvckNhcGFiaWxpdGllc30sYy5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c30sYy5wcm90b3R5cGUuaXNNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tdXRlfSxjLnByb3RvdHlwZS5pc0ZvcmNlZE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmZvcmNlZE11dGV9LGMucHJvdG90eXBlLm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTVVURV9QQVJUSUNJUEFOVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxjLnByb3RvdHlwZS51bm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVU5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLmNhblNlbmRWaWRlbz1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5WaWRlbz09PXQuVmlkZW9DYXBhYmlsaXR5LlNFTkR9LGMucHJvdG90eXBlLmdldENhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRWaWRlb0Nvbm5lY3Rpb25JbmZvPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj17dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfUlRDLGNvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZH07cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZS53ZWJSVENUcmFuc3BvcnQpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldFZpZGVvQ29ubmVjdGlvbkluZm8gZmFpbGVkIikpfX0pfSkpfTt2YXIgdT1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbztpZihlKXt2YXIgbj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkscj17Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6bi5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGdldENvbm5lY3Rpb25Ub2tlbjp0LmhpdGNoKHRoaXMsdGhpcy5nZXRDb25uZWN0aW9uVG9rZW4pfTtpZihlLmNvbm5lY3Rpb25EYXRhKXRyeXtyLnBhcnRpY2lwYW50VG9rZW49SlNPTi5wYXJzZShlLmNvbm5lY3Rpb25EYXRhKS5Db25uZWN0aW9uQXV0aGVudGljYXRpb25Ub2tlbn1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKHQuTG9nQ29tcG9uZW50LkNIQVQsIkNvbm5lY3Rpb24gZGF0YSBpcyBpbnZhbGlkIikud2l0aE9iamVjdChlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wYXJ0aWNpcGFudFRva2VuPW51bGx9cmV0dXJuIHIucGFydGljaXBhbnRUb2tlbj1yLnBhcnRpY2lwYW50VG9rZW58fG51bGwsci5vcmlnaW5hbEluZm89dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm8scn1yZXR1cm4gbnVsbH0sdS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldENsaWVudCgpLG49KHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5DSEFUX1RPS0VOLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsY29udGFjdElkOnRoaXMuY29udGFjdElkfSk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0Q29ubmVjdGlvblRva2VuIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKSl9fSl9KSl9LHUucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5DSEFUfSx1LnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LHUucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNBZ2VudENvbm5lY3Rpb25UeXBlKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0sdS5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSx1LnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSx1LnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sdS5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c307dmFyIGw9ZnVuY3Rpb24oZSx0KXtzLmNhbGwodGhpcyxlLHQpfTsobC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWwsbC5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlRBU0t9LGwucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm57Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZH19LGwucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX07dmFyIHA9ZnVuY3Rpb24oZSl7dC5Db25uZWN0aW9uLmNhbGwodGhpcyxlLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCksdGhpcy5jb25uZWN0aW9uRGF0YT1lfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAscC5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uRGF0YX0scC5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt9O3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuZW5kcG9pbnRBUk49dC5lbmRwb2ludElkfHx0LmVuZHBvaW50QVJOfHxudWxsLHRoaXMuZW5kcG9pbnRJZD10aGlzLmVuZHBvaW50QVJOLHRoaXMudHlwZT10LnR5cGV8fG51bGwsdGhpcy5uYW1lPXQubmFtZXx8bnVsbCx0aGlzLnBob25lTnVtYmVyPXQucGhvbmVOdW1iZXJ8fG51bGwsdGhpcy5hZ2VudExvZ2luPXQuYWdlbnRMb2dpbnx8bnVsbCx0aGlzLnF1ZXVlPXQucXVldWV8fG51bGx9O2QucHJvdG90eXBlLnN0cmlwUGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waG9uZU51bWJlcj90aGlzLnBob25lTnVtYmVyLnJlcGxhY2UoL3NpcDooW15AXSopQC4qLywiJDEiKToiIn0sZC5ieVBob25lTnVtYmVyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBkKHt0eXBlOnQuRW5kcG9pbnRUeXBlLlBIT05FX05VTUJFUixwaG9uZU51bWJlcjplLG5hbWU6bnx8bnVsbH0pfTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dGhpcy5lcnJvclR5cGU9ZSx0aGlzLmVycm9yTWVzc2FnZT10LHRoaXMuZW5kUG9pbnRVcmw9bn07aC5wcm90b3R5cGUuZ2V0RXJyb3JUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JUeXBlfSxoLnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2V9LGgucHJvdG90eXBlLmdldEVuZFBvaW50VXJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kUG9pbnRVcmx9LHQuYWdlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuSU5JVCxlKTtyZXR1cm4gdC5hZ2VudC5pbml0aWFsaXplZCYmZShuZXcgdC5BZ2VudCksbn0sdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuSU5JVCxlKX0sdC5vbldlYnNvY2tldEluaXRGYWlsdXJlPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsZSk7cmV0dXJuIHQud2ViU29ja2V0SW5pdEZhaWxlZCYmZSgpLG59LHQuaWZNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIsbyl7aWYodC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmFzc2VydE5vdE51bGwobiwiQSB0cnVlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQuIiksIXQuY29yZS5tYXN0ZXJDbGllbnQpcmV0dXJuIHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQociYmcigpKTt0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSLHt0b3BpYzplLHNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZTpvfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlLmlzTWFzdGVyP24oKTpyJiZyKCl9fSl9LHQuYmVjb21lTWFzdGVyPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuY29yZS5tYXN0ZXJDbGllbnQ/dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVIse3RvcGljOmV9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7biYmbigpfX0pOih0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSksciYmcigpKX0sdC5BZ2VudD1uLHQuQWdlbnRTbmFwc2hvdD1yLHQuQ29udGFjdD1vLHQuQ29udGFjdFNuYXBzaG90PWksdC5Db25uZWN0aW9uPWMsdC5CYXNlQ29ubmVjdGlvbj1zLHQuVm9pY2VDb25uZWN0aW9uPWMsdC5DaGF0Q29ubmVjdGlvbj11LHQuVGFza0Nvbm5lY3Rpb249bCx0LkNvbm5lY3Rpb25TbmFwc2hvdD1wLHQuRW5kcG9pbnQ9ZCx0LkFkZHJlc3M9ZCx0LlNvZnRwaG9uZUVycm9yPWgsdC5Wb2ljZUlkPWEsdC5RdWlja1Jlc3BvbnNlcz1jbGFzc3tzdGF0aWMgaXNFbmFibGVkPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmlzQ1JNKCk/dC5jb3JlLmdldENsaWVudCgpOnQuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtlLmNhbGwodC5BcGlQcm94eUNsaWVudE1ldGhvZHMuUVJfSU5URUdSQVRJT05fRVhJU1RTLG51bGwse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJRdWljayBSZXNwb25zZXMgaXNFbmFibGVkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgZmFpbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9fSl9KSl9O3N0YXRpYyBzZWFyY2hRdWlja1Jlc3BvbnNlcz1mdW5jdGlvbihlKXtjb25zdCBuPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCkscj1lPy5jb250YWN0SWQ/bmV3IG8oZS5jb250YWN0SWQpLmdldEF0dHJpYnV0ZXMoKTp2b2lkIDA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe24uY2FsbCh0LkFwaVByb3h5Q2xpZW50TWV0aG9kcy5RUl9TRUFSQ0hfUVVJQ0tfUkVTUE9OU0VTLHsuLi5lLGF0dHJpYnV0ZXM6cn0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBmYWlsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX19KX0pKX19fSgpfSw4Mjc6KGUsdCxuKT0+e3ZhciByOyFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKHMsYSl7aWYoIW5bc10pe2lmKCF0W3NdKXtpZihpKXJldHVybiBpKHMsITApO3ZhciBjPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3MrIiciKTt0aHJvdyBjLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGN9dmFyIHU9bltzXT17ZXhwb3J0czp7fX07dFtzXVswXS5jYWxsKHUuZXhwb3J0cywoZnVuY3Rpb24oZSl7cmV0dXJuIG8odFtzXVsxXVtlXXx8ZSl9KSx1LHUuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltzXS5leHBvcnRzfWZvcih2YXIgaT12b2lkIDAscz0wO3M8ci5sZW5ndGg7cysrKW8ocltzXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE0LTA2LTMwIixlbmRwb2ludFByZWZpeDoiY29nbml0by1pZGVudGl0eSIsanNvblZlcnNpb246IjEuMSIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uIENvZ25pdG8gSWRlbnRpdHkiLHNlcnZpY2VJZDoiQ29nbml0byBJZGVudGl0eSIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHRhcmdldFByZWZpeDoiQVdTQ29nbml0b0lkZW50aXR5U2VydmljZSIsdWlkOiJjb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAifSxvcGVyYXRpb25zOntDcmVhdGVJZGVudGl0eVBvb2w6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sTmFtZSIsIkFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllcyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbE5hbWU6e30sQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzOnt0eXBlOiJib29sZWFuIn0sQWxsb3dDbGFzc2ljRmxvdzp7dHlwZToiYm9vbGVhbiJ9LFN1cHBvcnRlZExvZ2luUHJvdmlkZXJzOntzaGFwZToiUzUifSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sT3BlbklkQ29ubmVjdFByb3ZpZGVyQVJOczp7c2hhcGU6IlM5In0sQ29nbml0b0lkZW50aXR5UHJvdmlkZXJzOntzaGFwZToiU2IifSxTYW1sUHJvdmlkZXJBUk5zOntzaGFwZToiU2cifSxJZGVudGl0eVBvb2xUYWdzOntzaGFwZToiU2gifX19LG91dHB1dDp7c2hhcGU6IlNrIn19LERlbGV0ZUlkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZHNUb0RlbGV0ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWRzVG9EZWxldGU6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VW5wcm9jZXNzZWRJZGVudGl0eUlkczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRXJyb3JDb2RlOnt9fX19fX19LERlbGV0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX19LERlc2NyaWJlSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTdiJ9fSxEZXNjcmliZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sR2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxDdXN0b21Sb2xlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sQ3JlZGVudGlhbHM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0S2V5Ont9LFNlc3Npb25Ub2tlbjp7fSxFeHBpcmF0aW9uOnt0eXBlOiJ0aW1lc3RhbXAifX19fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0FjY291bnRJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LFJvbGVzOntzaGFwZToiUzFjIn0sUm9sZU1hcHBpbmdzOntzaGFwZToiUzFlIn19fX0sR2V0T3BlbklkVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxUb2tlbjp7fX19LGF1dGh0eXBlOiJub25lIn0sR2V0T3BlbklkVG9rZW5Gb3JEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIkxvZ2lucyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9LFRva2VuRHVyYXRpb246e3R5cGU6ImxvbmcifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX19LEdldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sTGlzdElkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJNYXhSZXN1bHRzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fSxIaWRlRGlzYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0aWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTdiJ9fSxOZXh0VG9rZW46e319fX0sTGlzdElkZW50aXR5UG9vbHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTWF4UmVzdWx0cyJdLG1lbWJlcnM6e01heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifSxOZXh0VG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UG9vbE5hbWU6e319fX0sTmV4dFRva2VuOnt9fX19LExpc3RUYWdzRm9yUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iXSxtZW1iZXJzOntSZXNvdXJjZUFybjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntUYWdzOntzaGFwZToiU2gifX19fSxMb29rdXBEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyTGlzdDp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxOZXh0VG9rZW46e319fX0sTWVyZ2VEZXZlbG9wZXJJZGVudGl0aWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlNvdXJjZVVzZXJJZGVudGlmaWVyIiwiRGVzdGluYXRpb25Vc2VySWRlbnRpZmllciIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7U291cmNlVXNlcklkZW50aWZpZXI6e30sRGVzdGluYXRpb25Vc2VySWRlbnRpZmllcjp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sSWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19fSxTZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIlJvbGVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxTZXRQcmluY2lwYWxUYWdBdHRyaWJ1dGVNYXA6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVByb3ZpZGVyTmFtZSJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX19LFRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFncyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVbmxpbmtEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIiwiSWRlbnRpdHlQb29sSWQiLCJEZXZlbG9wZXJQcm92aWRlck5hbWUiLCJEZXZlbG9wZXJVc2VySWRlbnRpZmllciJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sSWRlbnRpdHlQb29sSWQ6e30sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyOnt9fX19LFVubGlua0lkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJMb2dpbnMiLCJMb2dpbnNUb1JlbW92ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sTG9naW5zVG9SZW1vdmU6e3NoYXBlOiJTdyJ9fX0sYXV0aHR5cGU6Im5vbmUifSxVbnRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFnS2V5cyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3NoYXBlOiJTayJ9LG91dHB1dDp7c2hhcGU6IlNrIn19fSxzaGFwZXM6e1M1Ont0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sUzk6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sU2I6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlck5hbWU6e30sQ2xpZW50SWQ6e30sU2VydmVyU2lkZVRva2VuQ2hlY2s6e3R5cGU6ImJvb2xlYW4ifX19fSxTZzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTaDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFNrOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sU3Y6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTdyJ9LENyZWF0aW9uRGF0ZTp7dHlwZToidGltZXN0YW1wIn0sTGFzdE1vZGlmaWVkRGF0ZTp7dHlwZToidGltZXN0YW1wIn19fSxTdzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTMTA6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiVHlwZSJdLG1lbWJlcnM6e1R5cGU6e30sQW1iaWd1b3VzUm9sZVJlc29sdXRpb246e30sUnVsZXNDb25maWd1cmF0aW9uOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUnVsZXMiXSxtZW1iZXJzOntSdWxlczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQ2xhaW0iLCJNYXRjaFR5cGUiLCJWYWx1ZSIsIlJvbGVBUk4iXSxtZW1iZXJzOntDbGFpbTp7fSxNYXRjaFR5cGU6e30sVmFsdWU6e30sUm9sZUFSTjp7fX19fX19fX19LFMxczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319fX19LHt9XSwyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOntMaXN0SWRlbnRpdHlQb29sczp7aW5wdXRfdG9rZW46Ik5leHRUb2tlbiIsbGltaXRfa2V5OiJNYXhSZXN1bHRzIixvdXRwdXRfdG9rZW46Ik5leHRUb2tlbiIscmVzdWx0X2tleToiSWRlbnRpdHlQb29scyJ9fX19LHt9XSwzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE3LTAyLTE1IixlbmRwb2ludFByZWZpeDoiY29ubmVjdCIsanNvblZlcnNpb246IjEuMCIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VBYmJyZXZpYXRpb246IkNvbm5lY3QiLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uQ29ubmVjdENUSVNlcnZpY2UiLHNpZ25hdHVyZVZlcnNpb246IiIsdGFyZ2V0UHJlZml4OiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsdWlkOiJjb25uZWN0LTIwMTctMDItMTUifSxvcGVyYXRpb25zOntBY2NlcHRDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ2xlYXJDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29tcGxldGVDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29uZmVyZW5jZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVPdXRib3VuZENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxlbmRwb2ludDp7c2hhcGU6IlNlIn0scXVldWVBUk46e30scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlVGFza0NvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiZW5kcG9pbnQiLCJuYW1lIl0sbWVtYmVyczp7ZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9LHByZXZpb3VzQ29udGFjdElkOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saWRlbXBvdGVuY3lUb2tlbjp7fSxzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjb250YWN0SWQ6e319fX0sQ3JlYXRlVHJhbnNwb3J0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInRyYW5zcG9ydFR5cGUiLCJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e3RyYW5zcG9ydFR5cGU6e30scGFydGljaXBhbnRJZDp7fSxjb250YWN0SWQ6e30sc29mdHBob25lQ2xpZW50SWQ6e30sYXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3dlYlNvY2tldFRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVybCIsInRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzIl0sbWVtYmVyczp7dXJsOnt9LHRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzOnt0eXBlOiJsb25nIn0sZXhwaXJ5Ont9fX0sY2hhdFRva2VuVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGFydGljaXBhbnRUb2tlbiIsImV4cGlyeSJdLG1lbWJlcnM6e3BhcnRpY2lwYW50VG9rZW46e30sZXhwaXJ5Ont9fX0sc29mdHBob25lVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic29mdHBob25lTWVkaWFDb25uZWN0aW9ucyJdLG1lbWJlcnM6e3NvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVzZXJuYW1lIiwiY3JlZGVudGlhbCIsInVybHMiXSxtZW1iZXJzOnt1c2VybmFtZTp7fSxjcmVkZW50aWFsOnt9LHVybHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fX19fSxhZ2VudERpc2NvdmVyeVRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInByZXNpZ25lZFVybCJdLG1lbWJlcnM6e3ByZXNpZ25lZFVybDp7fX19LHdlYlJUQ1RyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm1lZXRpbmciLCJhdHRlbmRlZSJdLG1lbWJlcnM6e21lZXRpbmc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bWVldGluZ0lkOnt9LG1lZGlhUmVnaW9uOnt9LG1lZGlhUGxhY2VtZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvSG9zdFVybDp7fSxhdWRpb0ZhbGxiYWNrVXJsOnt9LHNpZ25hbGluZ1VybDp7fSx0dXJuQ29udHJvbFVybDp7fSxldmVudEluZ2VzdGlvblVybDp7fX19LG1lZXRpbmdGZWF0dXJlczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthdWRpbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlY2hvUmVkdWN0aW9uOnt9fX19fX19LGF0dGVuZGVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGVuZGVlSWQ6e30sam9pblRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH19fX19fX19LERlc3Ryb3lDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LEdldEFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOntjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fX0sR2V0QWdlbnRQZXJtaXNzaW9uczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGVybWlzc2lvbnMiXSxtZW1iZXJzOntwZXJtaXNzaW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0QWdlbnRTbmFwc2hvdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sdGltZW91dDp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic25hcHNob3QiLCJuZXh0VG9rZW4iXSxtZW1iZXJzOntzbmFwc2hvdDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInN0YXRlIiwiY29udGFjdHMiLCJzbmFwc2hvdFRpbWVzdGFtcCJdLG1lbWJlcnM6e3N0YXRlOntzaGFwZToiUzI5In0sbmV4dFN0YXRlOntzaGFwZToiUzI5In0sYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZTp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzdGF0ZTp7fSx0aW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sY29udGFjdHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInR5cGUiLCJzdGF0ZSIsImNvbm5lY3Rpb25zIiwiYXR0cmlidXRlcyJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSxpbml0aWFsQ29udGFjdElkOnt9LHR5cGU6e30sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0scXVldWU6e3NoYXBlOiJTayJ9LHF1ZXVlVGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxjb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29ubmVjdGlvbklkIiwic3RhdGUiLCJ0eXBlIiwiaW5pdGlhbCJdLG1lbWJlcnM6e2Nvbm5lY3Rpb25JZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn0sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sdHlwZTp7fSxpbml0aWFsOnt0eXBlOiJib29sZWFuIn0sc29mdHBob25lTWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxUeXBlOnt9LGF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxtZWRpYUxlZ0NvbnRleHRUb2tlbjp7fSxjYWxsQ29udGV4dFRva2VuOnt9LGNhbGxDb25maWdKc29uOnt9fX0sY2hhdE1lZGlhSW5mbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjaGF0QXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LGNvbm5lY3Rpb25EYXRhOnt9LGN1c3RvbWVyTmFtZTp7fX19LG1vbml0b3JpbmdJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50TmFtZTp7fX19LGpvaW5UaW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbXV0ZTp7dHlwZToiYm9vbGVhbiJ9LGZvcmNlZE11dGU6e3R5cGU6ImJvb2xlYW4ifSxxdWlja0Nvbm5lY3ROYW1lOnt9LG1vbml0b3JDYXBhYmlsaXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbW9uaXRvclN0YXR1czp7fSxjYXBhYmlsaXRpZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmlkZW86e319fX19fSxhdHRyaWJ1dGVzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm5hbWUiXSxtZW1iZXJzOntuYW1lOnt9LHZhbHVlOnt9fX19LGNvbnRhY3REdXJhdGlvbjp7fSxuYW1lOnt9LGRlc2NyaXB0aW9uOnt9LHJlZmVyZW5jZXM6e3NoYXBlOiJTciJ9LGluaXRpYXRpb25NZXRob2Q6e30sY29udGFjdEZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGFjaG1lbnRzRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG1lc3NhZ2luZ01hcmtkb3duRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG11bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ0VuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzY3JlZW5SZWNvcmRpbmdTdGF0ZTp7fSxzY3JlZW5SZWNvcmRpbmdDb25maWc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7c2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9fX19fSxjaGFubmVsQ29udGV4dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0sdGFza1RlbXBsYXRlSWQ6e30sdGFza1RlbXBsYXRlVmVyc2lvbjp7dHlwZToiaW50ZWdlciJ9fX0sc2VnbWVudEF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1ZhbHVlU3RyaW5nOnt9fX19fX19LHNuYXBzaG90VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFN0YXRlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGVzIl0sbWVtYmVyczp7c3RhdGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTMjkifX0sbmV4dFRva2VuOnt9fX19LEdldERpYWxhYmxlQ291bnRyeUNvZGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb3VudHJ5Q29kZXMiXSxtZW1iZXJzOntjb3VudHJ5Q29kZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9fX19LEdldEVuZHBvaW50czp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInF1ZXVlQVJOcyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxxdWV1ZUFSTnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlbmRwb2ludHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlNlIn19LG5leHRUb2tlbjp7fX19fSxHZXROZXdBdXRoVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyZWZyZXNoVG9rZW4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scmVmcmVzaFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25ld0F1dGhUb2tlbjp7fSxleHBpcmF0aW9uRGF0ZVRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9fX19LEdldFJvdXRpbmdQcm9maWxlUXVldWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicm91dGluZ1Byb2ZpbGVBUk4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scm91dGluZ1Byb2ZpbGVBUk46e30sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInF1ZXVlcyJdLG1lbWJlcnM6e3F1ZXVlczp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2sifX0sbmV4dFRva2VuOnt9fX19LEhvbGRDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE11dGVQYXJ0aWNpcGFudDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxOb3RpZnlDb250YWN0SXNzdWU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGlzc3VlQ29kZTp7fSxkZXNjcmlwdGlvbjp7fSxjbGllbnRMb2dzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQYXVzZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQdXRBZ2VudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwic3RhdGUiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sc3RhdGU6e3NoYXBlOiJTMjkifSxlbnF1ZXVlTmV4dFN0YXRlOnt0eXBlOiJib29sZWFuIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlamVjdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxSZXN1bWVDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kQ2xpZW50TG9nczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImxvZ0V2ZW50cyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxsb2dFdmVudHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbXBvbmVudDp7fSxtZXNzYWdlOnt9fX19fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kRGlnaXRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIiwiZGlnaXRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e30sZGlnaXRzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbE1ldHJpY3M6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjY3BWZXJzaW9uOnt9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJyZXBvcnQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30scmVwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxTdGFydFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LGNhbGxFbmRUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOntzaGFwZToiUzRmIn0sZ3VtVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGluaXRpYWxpemF0aW9uVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saGFuZHNoYWtlVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHByZVRhbGtUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sdGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxjbGVhbnVwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0saGFuZHNoYWtlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bU90aGVyRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bVRpbWVvdXRGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sY3JlYXRlT2ZmZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSx1c2VyQnVzeUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxpbnZhbGlkUmVtb3RlU0RQRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LG5vUmVtb3RlSWNlQ2FuZGlkYXRlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29uZmlndXJhdGlvbjp7c2hhcGU6IlMxcSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVcGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiLCJ0YXJnZXRNb25pdG9yTW9kZSJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSx0YXJnZXRNb25pdG9yTW9kZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX19LHNoYXBlczp7UzI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnRBUk46e30sYXV0aFRva2VuOnt9fX0sU2U6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIl0sbWVtYmVyczp7ZW5kcG9pbnRBUk46e30sdHlwZTp7fSxuYW1lOnt9LHBob25lTnVtYmVyOnt9LGFnZW50TG9naW46e30scXVldWU6e3NoYXBlOiJTayJ9fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7cXVldWVBUk46e30sbmFtZTp7fX19LFNyOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInZhbHVlIiwidHlwZSJdLG1lbWJlcnM6e3ZhbHVlOnt9LHR5cGU6e319fX0sUzFxOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSIsInNvZnRwaG9uZUVuYWJsZWQiLCJzb2Z0cGhvbmVBdXRvQWNjZXB0IiwiZXh0ZW5zaW9uIiwicm91dGluZ1Byb2ZpbGUiXSxtZW1iZXJzOntuYW1lOnt9LHVzZXJuYW1lOnt9LHNvZnRwaG9uZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sZXh0ZW5zaW9uOnt9LHJvdXRpbmdQcm9maWxlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25hbWU6e30scm91dGluZ1Byb2ZpbGVBUk46e30sZGVmYXVsdE91dGJvdW5kUXVldWU6e3NoYXBlOiJTayJ9LGNoYW5uZWxDb25jdXJyZW5jeU1hcDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6ImxvbmcifX19fSxhZ2VudFByZWZlcmVuY2VzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sYWdlbnRBUk46e319fSxTMjk6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwibmFtZSJdLG1lbWJlcnM6e2FnZW50U3RhdGVBUk46e30sdHlwZTp7fSxuYW1lOnt9LHN0YXJ0VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LFM0Zjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sc29mdHBob25lU3RyZWFtVHlwZTp7fSxwYWNrZXRDb3VudDp7dHlwZToibG9uZyJ9LHBhY2tldHNMb3N0Ont0eXBlOiJsb25nIn0sYXVkaW9MZXZlbDp7dHlwZToiZG91YmxlIn0saml0dGVyQnVmZmVyTWlsbGlzOnt0eXBlOiJsb25nIn0scm91bmRUcmlwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9fX19fX19LHt9XSw0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXthY206e25hbWU6IkFDTSIsY29yczohMH0sYXBpZ2F0ZXdheTp7bmFtZToiQVBJR2F0ZXdheSIsY29yczohMH0sYXBwbGljYXRpb25hdXRvc2NhbGluZzp7cHJlZml4OiJhcHBsaWNhdGlvbi1hdXRvc2NhbGluZyIsbmFtZToiQXBwbGljYXRpb25BdXRvU2NhbGluZyIsY29yczohMH0sYXBwc3RyZWFtOntuYW1lOiJBcHBTdHJlYW0ifSxhdXRvc2NhbGluZzp7bmFtZToiQXV0b1NjYWxpbmciLGNvcnM6ITB9LGJhdGNoOntuYW1lOiJCYXRjaCJ9LGJ1ZGdldHM6e25hbWU6IkJ1ZGdldHMifSxjbG91ZGRpcmVjdG9yeTp7bmFtZToiQ2xvdWREaXJlY3RvcnkiLHZlcnNpb25zOlsiMjAxNi0wNS0xMCoiXX0sY2xvdWRmb3JtYXRpb246e25hbWU6IkNsb3VkRm9ybWF0aW9uIixjb3JzOiEwfSxjbG91ZGZyb250OntuYW1lOiJDbG91ZEZyb250Iix2ZXJzaW9uczpbIjIwMTMtMDUtMTIqIiwiMjAxMy0xMS0xMSoiLCIyMDE0LTA1LTMxKiIsIjIwMTQtMTAtMjEqIiwiMjAxNC0xMS0wNioiLCIyMDE1LTA0LTE3KiIsIjIwMTUtMDctMjcqIiwiMjAxNS0wOS0xNyoiLCIyMDE2LTAxLTEzKiIsIjIwMTYtMDEtMjgqIiwiMjAxNi0wOC0wMSoiLCIyMDE2LTA4LTIwKiIsIjIwMTYtMDktMDcqIiwiMjAxNi0wOS0yOSoiLCIyMDE2LTExLTI1KiIsIjIwMTctMDMtMjUqIiwiMjAxNy0xMC0zMCoiLCIyMDE4LTA2LTE4KiIsIjIwMTgtMTEtMDUqIiwiMjAxOS0wMy0yNioiXSxjb3JzOiEwfSxjbG91ZGhzbTp7bmFtZToiQ2xvdWRIU00iLGNvcnM6ITB9LGNsb3Vkc2VhcmNoOntuYW1lOiJDbG91ZFNlYXJjaCJ9LGNsb3Vkc2VhcmNoZG9tYWluOntuYW1lOiJDbG91ZFNlYXJjaERvbWFpbiJ9LGNsb3VkdHJhaWw6e25hbWU6IkNsb3VkVHJhaWwiLGNvcnM6ITB9LGNsb3Vkd2F0Y2g6e3ByZWZpeDoibW9uaXRvcmluZyIsbmFtZToiQ2xvdWRXYXRjaCIsY29yczohMH0sY2xvdWR3YXRjaGV2ZW50czp7cHJlZml4OiJldmVudHMiLG5hbWU6IkNsb3VkV2F0Y2hFdmVudHMiLHZlcnNpb25zOlsiMjAxNC0wMi0wMyoiXSxjb3JzOiEwfSxjbG91ZHdhdGNobG9nczp7cHJlZml4OiJsb2dzIixuYW1lOiJDbG91ZFdhdGNoTG9ncyIsY29yczohMH0sY29kZWJ1aWxkOntuYW1lOiJDb2RlQnVpbGQiLGNvcnM6ITB9LGNvZGVjb21taXQ6e25hbWU6IkNvZGVDb21taXQiLGNvcnM6ITB9LGNvZGVkZXBsb3k6e25hbWU6IkNvZGVEZXBsb3kiLGNvcnM6ITB9LGNvZGVwaXBlbGluZTp7bmFtZToiQ29kZVBpcGVsaW5lIixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHk6e3ByZWZpeDoiY29nbml0by1pZGVudGl0eSIsbmFtZToiQ29nbml0b0lkZW50aXR5Iixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHlzZXJ2aWNlcHJvdmlkZXI6e3ByZWZpeDoiY29nbml0by1pZHAiLG5hbWU6IkNvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlciIsY29yczohMH0sY29nbml0b3N5bmM6e3ByZWZpeDoiY29nbml0by1zeW5jIixuYW1lOiJDb2duaXRvU3luYyIsY29yczohMH0sY29uZmlnc2VydmljZTp7cHJlZml4OiJjb25maWciLG5hbWU6IkNvbmZpZ1NlcnZpY2UiLGNvcnM6ITB9LGN1cjp7bmFtZToiQ1VSIixjb3JzOiEwfSxkYXRhcGlwZWxpbmU6e25hbWU6IkRhdGFQaXBlbGluZSJ9LGRldmljZWZhcm06e25hbWU6IkRldmljZUZhcm0iLGNvcnM6ITB9LGRpcmVjdGNvbm5lY3Q6e25hbWU6IkRpcmVjdENvbm5lY3QiLGNvcnM6ITB9LGRpcmVjdG9yeXNlcnZpY2U6e3ByZWZpeDoiZHMiLG5hbWU6IkRpcmVjdG9yeVNlcnZpY2UifSxkaXNjb3Zlcnk6e25hbWU6IkRpc2NvdmVyeSJ9LGRtczp7bmFtZToiRE1TIn0sZHluYW1vZGI6e25hbWU6IkR5bmFtb0RCIixjb3JzOiEwfSxkeW5hbW9kYnN0cmVhbXM6e3ByZWZpeDoic3RyZWFtcy5keW5hbW9kYiIsbmFtZToiRHluYW1vREJTdHJlYW1zIixjb3JzOiEwfSxlYzI6e25hbWU6IkVDMiIsdmVyc2lvbnM6WyIyMDEzLTA2LTE1KiIsIjIwMTMtMTAtMTUqIiwiMjAxNC0wMi0wMSoiLCIyMDE0LTA1LTAxKiIsIjIwMTQtMDYtMTUqIiwiMjAxNC0wOS0wMSoiLCIyMDE0LTEwLTAxKiIsIjIwMTUtMDMtMDEqIiwiMjAxNS0wNC0xNSoiLCIyMDE1LTEwLTAxKiIsIjIwMTYtMDQtMDEqIiwiMjAxNi0wOS0xNSoiXSxjb3JzOiEwfSxlY3I6e25hbWU6IkVDUiIsY29yczohMH0sZWNzOntuYW1lOiJFQ1MiLGNvcnM6ITB9LGVmczp7cHJlZml4OiJlbGFzdGljZmlsZXN5c3RlbSIsbmFtZToiRUZTIixjb3JzOiEwfSxlbGFzdGljYWNoZTp7bmFtZToiRWxhc3RpQ2FjaGUiLHZlcnNpb25zOlsiMjAxMi0xMS0xNSoiLCIyMDE0LTAzLTI0KiIsIjIwMTQtMDctMTUqIiwiMjAxNC0wOS0zMCoiXSxjb3JzOiEwfSxlbGFzdGljYmVhbnN0YWxrOntuYW1lOiJFbGFzdGljQmVhbnN0YWxrIixjb3JzOiEwfSxlbGI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmciLG5hbWU6IkVMQiIsY29yczohMH0sZWxidjI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiIsbmFtZToiRUxCdjIiLGNvcnM6ITB9LGVtcjp7cHJlZml4OiJlbGFzdGljbWFwcmVkdWNlIixuYW1lOiJFTVIiLGNvcnM6ITB9LGVzOntuYW1lOiJFUyJ9LGVsYXN0aWN0cmFuc2NvZGVyOntuYW1lOiJFbGFzdGljVHJhbnNjb2RlciIsY29yczohMH0sZmlyZWhvc2U6e25hbWU6IkZpcmVob3NlIixjb3JzOiEwfSxnYW1lbGlmdDp7bmFtZToiR2FtZUxpZnQiLGNvcnM6ITB9LGdsYWNpZXI6e25hbWU6IkdsYWNpZXIifSxoZWFsdGg6e25hbWU6IkhlYWx0aCJ9LGlhbTp7bmFtZToiSUFNIixjb3JzOiEwfSxpbXBvcnRleHBvcnQ6e25hbWU6IkltcG9ydEV4cG9ydCJ9LGluc3BlY3Rvcjp7bmFtZToiSW5zcGVjdG9yIix2ZXJzaW9uczpbIjIwMTUtMDgtMTgqIl0sY29yczohMH0saW90OntuYW1lOiJJb3QiLGNvcnM6ITB9LGlvdGRhdGE6e3ByZWZpeDoiaW90LWRhdGEiLG5hbWU6IklvdERhdGEiLGNvcnM6ITB9LGtpbmVzaXM6e25hbWU6IktpbmVzaXMiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3M6e25hbWU6IktpbmVzaXNBbmFseXRpY3MifSxrbXM6e25hbWU6IktNUyIsY29yczohMH0sbGFtYmRhOntuYW1lOiJMYW1iZGEiLGNvcnM6ITB9LGxleHJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5sZXgiLG5hbWU6IkxleFJ1bnRpbWUiLGNvcnM6ITB9LGxpZ2h0c2FpbDp7bmFtZToiTGlnaHRzYWlsIn0sbWFjaGluZWxlYXJuaW5nOntuYW1lOiJNYWNoaW5lTGVhcm5pbmciLGNvcnM6ITB9LG1hcmtldHBsYWNlY29tbWVyY2VhbmFseXRpY3M6e25hbWU6Ik1hcmtldHBsYWNlQ29tbWVyY2VBbmFseXRpY3MiLGNvcnM6ITB9LG1hcmtldHBsYWNlbWV0ZXJpbmc6e3ByZWZpeDoibWV0ZXJpbmdtYXJrZXRwbGFjZSIsbmFtZToiTWFya2V0cGxhY2VNZXRlcmluZyJ9LG10dXJrOntwcmVmaXg6Im10dXJrLXJlcXVlc3RlciIsbmFtZToiTVR1cmsiLGNvcnM6ITB9LG1vYmlsZWFuYWx5dGljczp7bmFtZToiTW9iaWxlQW5hbHl0aWNzIixjb3JzOiEwfSxvcHN3b3Jrczp7bmFtZToiT3BzV29ya3MiLGNvcnM6ITB9LG9wc3dvcmtzY206e25hbWU6Ik9wc1dvcmtzQ00ifSxvcmdhbml6YXRpb25zOntuYW1lOiJPcmdhbml6YXRpb25zIn0scGlucG9pbnQ6e25hbWU6IlBpbnBvaW50In0scG9sbHk6e25hbWU6IlBvbGx5Iixjb3JzOiEwfSxyZHM6e25hbWU6IlJEUyIsdmVyc2lvbnM6WyIyMDE0LTA5LTAxKiJdLGNvcnM6ITB9LHJlZHNoaWZ0OntuYW1lOiJSZWRzaGlmdCIsY29yczohMH0scmVrb2duaXRpb246e25hbWU6IlJla29nbml0aW9uIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGk6e25hbWU6IlJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSSJ9LHJvdXRlNTM6e25hbWU6IlJvdXRlNTMiLGNvcnM6ITB9LHJvdXRlNTNkb21haW5zOntuYW1lOiJSb3V0ZTUzRG9tYWlucyIsY29yczohMH0sczM6e25hbWU6IlMzIixkdWFsc3RhY2tBdmFpbGFibGU6ITAsY29yczohMH0sczNjb250cm9sOntuYW1lOiJTM0NvbnRyb2wiLGR1YWxzdGFja0F2YWlsYWJsZTohMCx4bWxOb0RlZmF1bHRMaXN0czohMH0sc2VydmljZWNhdGFsb2c6e25hbWU6IlNlcnZpY2VDYXRhbG9nIixjb3JzOiEwfSxzZXM6e3ByZWZpeDoiZW1haWwiLG5hbWU6IlNFUyIsY29yczohMH0sc2hpZWxkOntuYW1lOiJTaGllbGQifSxzaW1wbGVkYjp7cHJlZml4OiJzZGIiLG5hbWU6IlNpbXBsZURCIn0sc21zOntuYW1lOiJTTVMifSxzbm93YmFsbDp7bmFtZToiU25vd2JhbGwifSxzbnM6e25hbWU6IlNOUyIsY29yczohMH0sc3FzOntuYW1lOiJTUVMiLGNvcnM6ITB9LHNzbTp7bmFtZToiU1NNIixjb3JzOiEwfSxzdG9yYWdlZ2F0ZXdheTp7bmFtZToiU3RvcmFnZUdhdGV3YXkiLGNvcnM6ITB9LHN0ZXBmdW5jdGlvbnM6e3ByZWZpeDoic3RhdGVzIixuYW1lOiJTdGVwRnVuY3Rpb25zIn0sc3RzOntuYW1lOiJTVFMiLGNvcnM6ITB9LHN1cHBvcnQ6e25hbWU6IlN1cHBvcnQifSxzd2Y6e25hbWU6IlNXRiJ9LHhyYXk6e25hbWU6IlhSYXkiLGNvcnM6ITB9LHdhZjp7bmFtZToiV0FGIixjb3JzOiEwfSx3YWZyZWdpb25hbDp7cHJlZml4OiJ3YWYtcmVnaW9uYWwiLG5hbWU6IldBRlJlZ2lvbmFsIn0sd29ya2RvY3M6e25hbWU6IldvcmtEb2NzIixjb3JzOiEwfSx3b3Jrc3BhY2VzOntuYW1lOiJXb3JrU3BhY2VzIn0sY29kZXN0YXI6e25hbWU6IkNvZGVTdGFyIn0sbGV4bW9kZWxidWlsZGluZ3NlcnZpY2U6e3ByZWZpeDoibGV4LW1vZGVscyIsbmFtZToiTGV4TW9kZWxCdWlsZGluZ1NlcnZpY2UiLGNvcnM6ITB9LG1hcmtldHBsYWNlZW50aXRsZW1lbnRzZXJ2aWNlOntwcmVmaXg6ImVudGl0bGVtZW50Lm1hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZUVudGl0bGVtZW50U2VydmljZSJ9LGF0aGVuYTp7bmFtZToiQXRoZW5hIixjb3JzOiEwfSxncmVlbmdyYXNzOntuYW1lOiJHcmVlbmdyYXNzIn0sZGF4OntuYW1lOiJEQVgifSxtaWdyYXRpb25odWI6e3ByZWZpeDoiQVdTTWlncmF0aW9uSHViIixuYW1lOiJNaWdyYXRpb25IdWIifSxjbG91ZGhzbXYyOntuYW1lOiJDbG91ZEhTTVYyIixjb3JzOiEwfSxnbHVlOntuYW1lOiJHbHVlIn0sbW9iaWxlOntuYW1lOiJNb2JpbGUifSxwcmljaW5nOntuYW1lOiJQcmljaW5nIixjb3JzOiEwfSxjb3N0ZXhwbG9yZXI6e3ByZWZpeDoiY2UiLG5hbWU6IkNvc3RFeHBsb3JlciIsY29yczohMH0sbWVkaWFjb252ZXJ0OntuYW1lOiJNZWRpYUNvbnZlcnQifSxtZWRpYWxpdmU6e25hbWU6Ik1lZGlhTGl2ZSJ9LG1lZGlhcGFja2FnZTp7bmFtZToiTWVkaWFQYWNrYWdlIn0sbWVkaWFzdG9yZTp7bmFtZToiTWVkaWFTdG9yZSJ9LG1lZGlhc3RvcmVkYXRhOntwcmVmaXg6Im1lZGlhc3RvcmUtZGF0YSIsbmFtZToiTWVkaWFTdG9yZURhdGEiLGNvcnM6ITB9LGFwcHN5bmM6e25hbWU6IkFwcFN5bmMifSxndWFyZGR1dHk6e25hbWU6Ikd1YXJkRHV0eSJ9LG1xOntuYW1lOiJNUSJ9LGNvbXByZWhlbmQ6e25hbWU6IkNvbXByZWhlbmQiLGNvcnM6ITB9LGlvdGpvYnNkYXRhcGxhbmU6e3ByZWZpeDoiaW90LWpvYnMtZGF0YSIsbmFtZToiSW9USm9ic0RhdGFQbGFuZSJ9LGtpbmVzaXN2aWRlb2FyY2hpdmVkbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1hcmNoaXZlZC1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvQXJjaGl2ZWRNZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvTWVkaWEiLGNvcnM6ITB9LGtpbmVzaXN2aWRlbzp7bmFtZToiS2luZXNpc1ZpZGVvIixjb3JzOiEwfSxzYWdlbWFrZXJydW50aW1lOntwcmVmaXg6InJ1bnRpbWUuc2FnZW1ha2VyIixuYW1lOiJTYWdlTWFrZXJSdW50aW1lIn0sc2FnZW1ha2VyOntuYW1lOiJTYWdlTWFrZXIifSx0cmFuc2xhdGU6e25hbWU6IlRyYW5zbGF0ZSIsY29yczohMH0scmVzb3VyY2Vncm91cHM6e3ByZWZpeDoicmVzb3VyY2UtZ3JvdXBzIixuYW1lOiJSZXNvdXJjZUdyb3VwcyIsY29yczohMH0sYWxleGFmb3JidXNpbmVzczp7bmFtZToiQWxleGFGb3JCdXNpbmVzcyJ9LGNsb3VkOTp7bmFtZToiQ2xvdWQ5In0sc2VydmVybGVzc2FwcGxpY2F0aW9ucmVwb3NpdG9yeTp7cHJlZml4OiJzZXJ2ZXJsZXNzcmVwbyIsbmFtZToiU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeSJ9LHNlcnZpY2VkaXNjb3Zlcnk6e25hbWU6IlNlcnZpY2VEaXNjb3ZlcnkifSx3b3JrbWFpbDp7bmFtZToiV29ya01haWwifSxhdXRvc2NhbGluZ3BsYW5zOntwcmVmaXg6ImF1dG9zY2FsaW5nLXBsYW5zIixuYW1lOiJBdXRvU2NhbGluZ1BsYW5zIn0sdHJhbnNjcmliZXNlcnZpY2U6e3ByZWZpeDoidHJhbnNjcmliZSIsbmFtZToiVHJhbnNjcmliZVNlcnZpY2UifSxjb25uZWN0OntuYW1lOiJDb25uZWN0Iixjb3JzOiEwfSxhY21wY2E6e3ByZWZpeDoiYWNtLXBjYSIsbmFtZToiQUNNUENBIn0sZm1zOntuYW1lOiJGTVMifSxzZWNyZXRzbWFuYWdlcjp7bmFtZToiU2VjcmV0c01hbmFnZXIiLGNvcnM6ITB9LGlvdGFuYWx5dGljczp7bmFtZToiSW9UQW5hbHl0aWNzIixjb3JzOiEwfSxpb3QxY2xpY2tkZXZpY2Vzc2VydmljZTp7cHJlZml4OiJpb3QxY2xpY2stZGV2aWNlcyIsbmFtZToiSW9UMUNsaWNrRGV2aWNlc1NlcnZpY2UifSxpb3QxY2xpY2twcm9qZWN0czp7cHJlZml4OiJpb3QxY2xpY2stcHJvamVjdHMiLG5hbWU6IklvVDFDbGlja1Byb2plY3RzIn0scGk6e25hbWU6IlBJIn0sbmVwdHVuZTp7bmFtZToiTmVwdHVuZSJ9LG1lZGlhdGFpbG9yOntuYW1lOiJNZWRpYVRhaWxvciJ9LGVrczp7bmFtZToiRUtTIn0sbWFjaWU6e25hbWU6Ik1hY2llIn0sZGxtOntuYW1lOiJETE0ifSxzaWduZXI6e25hbWU6IlNpZ25lciJ9LGNoaW1lOntuYW1lOiJDaGltZSJ9LHBpbnBvaW50ZW1haWw6e3ByZWZpeDoicGlucG9pbnQtZW1haWwiLG5hbWU6IlBpbnBvaW50RW1haWwifSxyYW06e25hbWU6IlJBTSJ9LHJvdXRlNTNyZXNvbHZlcjp7bmFtZToiUm91dGU1M1Jlc29sdmVyIn0scGlucG9pbnRzbXN2b2ljZTp7cHJlZml4OiJzbXMtdm9pY2UiLG5hbWU6IlBpbnBvaW50U01TVm9pY2UifSxxdWlja3NpZ2h0OntuYW1lOiJRdWlja1NpZ2h0In0scmRzZGF0YXNlcnZpY2U6e3ByZWZpeDoicmRzLWRhdGEiLG5hbWU6IlJEU0RhdGFTZXJ2aWNlIn0sYW1wbGlmeTp7bmFtZToiQW1wbGlmeSJ9LGRhdGFzeW5jOntuYW1lOiJEYXRhU3luYyJ9LHJvYm9tYWtlcjp7bmFtZToiUm9ib01ha2VyIn0sdHJhbnNmZXI6e25hbWU6IlRyYW5zZmVyIn0sZ2xvYmFsYWNjZWxlcmF0b3I6e25hbWU6Ikdsb2JhbEFjY2VsZXJhdG9yIn0sY29tcHJlaGVuZG1lZGljYWw6e25hbWU6IkNvbXByZWhlbmRNZWRpY2FsIixjb3JzOiEwfSxraW5lc2lzYW5hbHl0aWNzdjI6e25hbWU6IktpbmVzaXNBbmFseXRpY3NWMiJ9LG1lZGlhY29ubmVjdDp7bmFtZToiTWVkaWFDb25uZWN0In0sZnN4OntuYW1lOiJGU3gifSxzZWN1cml0eWh1Yjp7bmFtZToiU2VjdXJpdHlIdWIifSxhcHBtZXNoOntuYW1lOiJBcHBNZXNoIix2ZXJzaW9uczpbIjIwMTgtMTAtMDEqIl19LGxpY2Vuc2VtYW5hZ2VyOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlciIsbmFtZToiTGljZW5zZU1hbmFnZXIifSxrYWZrYTp7bmFtZToiS2Fma2EifSxhcGlnYXRld2F5bWFuYWdlbWVudGFwaTp7bmFtZToiQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkifSxhcGlnYXRld2F5djI6e25hbWU6IkFwaUdhdGV3YXlWMiJ9LGRvY2RiOntuYW1lOiJEb2NEQiJ9LGJhY2t1cDp7bmFtZToiQmFja3VwIn0sd29ya2xpbms6e25hbWU6IldvcmtMaW5rIn0sdGV4dHJhY3Q6e25hbWU6IlRleHRyYWN0In0sbWFuYWdlZGJsb2NrY2hhaW46e25hbWU6Ik1hbmFnZWRCbG9ja2NoYWluIn0sbWVkaWFwYWNrYWdldm9kOntwcmVmaXg6Im1lZGlhcGFja2FnZS12b2QiLG5hbWU6Ik1lZGlhUGFja2FnZVZvZCJ9LGdyb3VuZHN0YXRpb246e25hbWU6Ikdyb3VuZFN0YXRpb24ifSxpb3R0aGluZ3NncmFwaDp7bmFtZToiSW9UVGhpbmdzR3JhcGgifSxpb3RldmVudHM6e25hbWU6IklvVEV2ZW50cyJ9LGlvdGV2ZW50c2RhdGE6e3ByZWZpeDoiaW90ZXZlbnRzLWRhdGEiLG5hbWU6IklvVEV2ZW50c0RhdGEifSxwZXJzb25hbGl6ZTp7bmFtZToiUGVyc29uYWxpemUiLGNvcnM6ITB9LHBlcnNvbmFsaXplZXZlbnRzOntwcmVmaXg6InBlcnNvbmFsaXplLWV2ZW50cyIsbmFtZToiUGVyc29uYWxpemVFdmVudHMiLGNvcnM6ITB9LHBlcnNvbmFsaXplcnVudGltZTp7cHJlZml4OiJwZXJzb25hbGl6ZS1ydW50aW1lIixuYW1lOiJQZXJzb25hbGl6ZVJ1bnRpbWUiLGNvcnM6ITB9LGFwcGxpY2F0aW9uaW5zaWdodHM6e3ByZWZpeDoiYXBwbGljYXRpb24taW5zaWdodHMiLG5hbWU6IkFwcGxpY2F0aW9uSW5zaWdodHMifSxzZXJ2aWNlcXVvdGFzOntwcmVmaXg6InNlcnZpY2UtcXVvdGFzIixuYW1lOiJTZXJ2aWNlUXVvdGFzIn0sZWMyaW5zdGFuY2Vjb25uZWN0OntwcmVmaXg6ImVjMi1pbnN0YW5jZS1jb25uZWN0IixuYW1lOiJFQzJJbnN0YW5jZUNvbm5lY3QifSxldmVudGJyaWRnZTp7bmFtZToiRXZlbnRCcmlkZ2UifSxsYWtlZm9ybWF0aW9uOntuYW1lOiJMYWtlRm9ybWF0aW9uIn0sZm9yZWNhc3RzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0IixuYW1lOiJGb3JlY2FzdFNlcnZpY2UiLGNvcnM6ITB9LGZvcmVjYXN0cXVlcnlzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0cXVlcnkiLG5hbWU6IkZvcmVjYXN0UXVlcnlTZXJ2aWNlIixjb3JzOiEwfSxxbGRiOntuYW1lOiJRTERCIn0scWxkYnNlc3Npb246e3ByZWZpeDoicWxkYi1zZXNzaW9uIixuYW1lOiJRTERCU2Vzc2lvbiJ9LHdvcmttYWlsbWVzc2FnZWZsb3c6e25hbWU6IldvcmtNYWlsTWVzc2FnZUZsb3cifSxjb2Rlc3Rhcm5vdGlmaWNhdGlvbnM6e3ByZWZpeDoiY29kZXN0YXItbm90aWZpY2F0aW9ucyIsbmFtZToiQ29kZVN0YXJOb3RpZmljYXRpb25zIn0sc2F2aW5nc3BsYW5zOntuYW1lOiJTYXZpbmdzUGxhbnMifSxzc286e25hbWU6IlNTTyJ9LHNzb29pZGM6e3ByZWZpeDoic3NvLW9pZGMiLG5hbWU6IlNTT09JREMifSxtYXJrZXRwbGFjZWNhdGFsb2c6e3ByZWZpeDoibWFya2V0cGxhY2UtY2F0YWxvZyIsbmFtZToiTWFya2V0cGxhY2VDYXRhbG9nIixjb3JzOiEwfSxkYXRhZXhjaGFuZ2U6e25hbWU6IkRhdGFFeGNoYW5nZSJ9LHNlc3YyOntuYW1lOiJTRVNWMiJ9LG1pZ3JhdGlvbmh1YmNvbmZpZzp7cHJlZml4OiJtaWdyYXRpb25odWItY29uZmlnIixuYW1lOiJNaWdyYXRpb25IdWJDb25maWcifSxjb25uZWN0cGFydGljaXBhbnQ6e25hbWU6IkNvbm5lY3RQYXJ0aWNpcGFudCJ9LGFwcGNvbmZpZzp7bmFtZToiQXBwQ29uZmlnIn0saW90c2VjdXJldHVubmVsaW5nOntuYW1lOiJJb1RTZWN1cmVUdW5uZWxpbmcifSx3YWZ2Mjp7bmFtZToiV0FGVjIifSxlbGFzdGljaW5mZXJlbmNlOntwcmVmaXg6ImVsYXN0aWMtaW5mZXJlbmNlIixuYW1lOiJFbGFzdGljSW5mZXJlbmNlIn0saW1hZ2VidWlsZGVyOntuYW1lOiJJbWFnZWJ1aWxkZXIifSxzY2hlbWFzOntuYW1lOiJTY2hlbWFzIn0sYWNjZXNzYW5hbHl6ZXI6e25hbWU6IkFjY2Vzc0FuYWx5emVyIn0sY29kZWd1cnVyZXZpZXdlcjp7cHJlZml4OiJjb2RlZ3VydS1yZXZpZXdlciIsbmFtZToiQ29kZUd1cnVSZXZpZXdlciJ9LGNvZGVndXJ1cHJvZmlsZXI6e25hbWU6IkNvZGVHdXJ1UHJvZmlsZXIifSxjb21wdXRlb3B0aW1pemVyOntwcmVmaXg6ImNvbXB1dGUtb3B0aW1pemVyIixuYW1lOiJDb21wdXRlT3B0aW1pemVyIn0sZnJhdWRkZXRlY3Rvcjp7bmFtZToiRnJhdWREZXRlY3RvciJ9LGtlbmRyYTp7bmFtZToiS2VuZHJhIn0sbmV0d29ya21hbmFnZXI6e25hbWU6Ik5ldHdvcmtNYW5hZ2VyIn0sb3V0cG9zdHM6e25hbWU6Ik91dHBvc3RzIn0sYXVnbWVudGVkYWlydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1hMmktcnVudGltZSIsbmFtZToiQXVnbWVudGVkQUlSdW50aW1lIn0sZWJzOntuYW1lOiJFQlMifSxraW5lc2lzdmlkZW9zaWduYWxpbmdjaGFubmVsczp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXNpZ25hbGluZyIsbmFtZToiS2luZXNpc1ZpZGVvU2lnbmFsaW5nQ2hhbm5lbHMiLGNvcnM6ITB9LGRldGVjdGl2ZTp7bmFtZToiRGV0ZWN0aXZlIn0sY29kZXN0YXJjb25uZWN0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1jb25uZWN0aW9ucyIsbmFtZToiQ29kZVN0YXJjb25uZWN0aW9ucyJ9LHN5bnRoZXRpY3M6e25hbWU6IlN5bnRoZXRpY3MifSxpb3RzaXRld2lzZTp7bmFtZToiSW9UU2l0ZVdpc2UifSxtYWNpZTI6e25hbWU6Ik1hY2llMiJ9LGNvZGVhcnRpZmFjdDp7bmFtZToiQ29kZUFydGlmYWN0In0saG9uZXljb2RlOntuYW1lOiJIb25leWNvZGUifSxpdnM6e25hbWU6IklWUyJ9LGJyYWtldDp7bmFtZToiQnJha2V0In0saWRlbnRpdHlzdG9yZTp7bmFtZToiSWRlbnRpdHlTdG9yZSJ9LGFwcGZsb3c6e25hbWU6IkFwcGZsb3cifSxyZWRzaGlmdGRhdGE6e3ByZWZpeDoicmVkc2hpZnQtZGF0YSIsbmFtZToiUmVkc2hpZnREYXRhIn0sc3NvYWRtaW46e3ByZWZpeDoic3NvLWFkbWluIixuYW1lOiJTU09BZG1pbiJ9LHRpbWVzdHJlYW1xdWVyeTp7cHJlZml4OiJ0aW1lc3RyZWFtLXF1ZXJ5IixuYW1lOiJUaW1lc3RyZWFtUXVlcnkifSx0aW1lc3RyZWFtd3JpdGU6e3ByZWZpeDoidGltZXN0cmVhbS13cml0ZSIsbmFtZToiVGltZXN0cmVhbVdyaXRlIn0sczNvdXRwb3N0czp7bmFtZToiUzNPdXRwb3N0cyJ9LGRhdGFicmV3OntuYW1lOiJEYXRhQnJldyJ9LHNlcnZpY2VjYXRhbG9nYXBwcmVnaXN0cnk6e3ByZWZpeDoic2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiLG5hbWU6IlNlcnZpY2VDYXRhbG9nQXBwUmVnaXN0cnkifSxuZXR3b3JrZmlyZXdhbGw6e3ByZWZpeDoibmV0d29yay1maXJld2FsbCIsbmFtZToiTmV0d29ya0ZpcmV3YWxsIn0sbXdhYTp7bmFtZToiTVdBQSJ9LGFtcGxpZnliYWNrZW5kOntuYW1lOiJBbXBsaWZ5QmFja2VuZCJ9LGFwcGludGVncmF0aW9uczp7bmFtZToiQXBwSW50ZWdyYXRpb25zIn0sY29ubmVjdGNvbnRhY3RsZW5zOntwcmVmaXg6ImNvbm5lY3QtY29udGFjdC1sZW5zIixuYW1lOiJDb25uZWN0Q29udGFjdExlbnMifSxkZXZvcHNndXJ1OntwcmVmaXg6ImRldm9wcy1ndXJ1IixuYW1lOiJEZXZPcHNHdXJ1In0sZWNycHVibGljOntwcmVmaXg6ImVjci1wdWJsaWMiLG5hbWU6IkVDUlBVQkxJQyJ9LGxvb2tvdXR2aXNpb246e25hbWU6Ikxvb2tvdXRWaXNpb24ifSxzYWdlbWFrZXJmZWF0dXJlc3RvcmVydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1mZWF0dXJlc3RvcmUtcnVudGltZSIsbmFtZToiU2FnZU1ha2VyRmVhdHVyZVN0b3JlUnVudGltZSJ9LGN1c3RvbWVycHJvZmlsZXM6e3ByZWZpeDoiY3VzdG9tZXItcHJvZmlsZXMiLG5hbWU6IkN1c3RvbWVyUHJvZmlsZXMifSxhdWRpdG1hbmFnZXI6e25hbWU6IkF1ZGl0TWFuYWdlciJ9LGVtcmNvbnRhaW5lcnM6e3ByZWZpeDoiZW1yLWNvbnRhaW5lcnMiLG5hbWU6IkVNUmNvbnRhaW5lcnMifSxoZWFsdGhsYWtlOntuYW1lOiJIZWFsdGhMYWtlIn0sc2FnZW1ha2VyZWRnZTp7cHJlZml4OiJzYWdlbWFrZXItZWRnZSIsbmFtZToiU2FnZW1ha2VyRWRnZSJ9LGFtcDp7bmFtZToiQW1wIixjb3JzOiEwfSxncmVlbmdyYXNzdjI6e25hbWU6IkdyZWVuZ3Jhc3NWMiJ9LGlvdGRldmljZWFkdmlzb3I6e25hbWU6IklvdERldmljZUFkdmlzb3IifSxpb3RmbGVldGh1Yjp7bmFtZToiSW9URmxlZXRIdWIifSxpb3R3aXJlbGVzczp7bmFtZToiSW9UV2lyZWxlc3MifSxsb2NhdGlvbjp7bmFtZToiTG9jYXRpb24iLGNvcnM6ITB9LHdlbGxhcmNoaXRlY3RlZDp7bmFtZToiV2VsbEFyY2hpdGVjdGVkIn0sbGV4bW9kZWxzdjI6e3ByZWZpeDoibW9kZWxzLmxleC52MiIsbmFtZToiTGV4TW9kZWxzVjIifSxsZXhydW50aW1ldjI6e3ByZWZpeDoicnVudGltZS5sZXgudjIiLG5hbWU6IkxleFJ1bnRpbWVWMiIsY29yczohMH0sZmlzOntuYW1lOiJGaXMifSxsb29rb3V0bWV0cmljczp7bmFtZToiTG9va291dE1ldHJpY3MifSxtZ246e25hbWU6Ik1nbiJ9LGxvb2tvdXRlcXVpcG1lbnQ6e25hbWU6Ikxvb2tvdXRFcXVpcG1lbnQifSxuaW1ibGU6e25hbWU6Ik5pbWJsZSJ9LGZpbnNwYWNlOntuYW1lOiJGaW5zcGFjZSJ9LGZpbnNwYWNlZGF0YTp7cHJlZml4OiJmaW5zcGFjZS1kYXRhIixuYW1lOiJGaW5zcGFjZWRhdGEifSxzc21jb250YWN0czp7cHJlZml4OiJzc20tY29udGFjdHMiLG5hbWU6IlNTTUNvbnRhY3RzIn0sc3NtaW5jaWRlbnRzOntwcmVmaXg6InNzbS1pbmNpZGVudHMiLG5hbWU6IlNTTUluY2lkZW50cyJ9LGFwcGxpY2F0aW9uY29zdHByb2ZpbGVyOntuYW1lOiJBcHBsaWNhdGlvbkNvc3RQcm9maWxlciJ9LGFwcHJ1bm5lcjp7bmFtZToiQXBwUnVubmVyIn0scHJvdG9uOntuYW1lOiJQcm90b24ifSxyb3V0ZTUzcmVjb3ZlcnljbHVzdGVyOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktY2x1c3RlciIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q2x1c3RlciJ9LHJvdXRlNTNyZWNvdmVyeWNvbnRyb2xjb25maWc6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jb250cm9sLWNvbmZpZyIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q29udHJvbENvbmZpZyJ9LHJvdXRlNTNyZWNvdmVyeXJlYWRpbmVzczp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LXJlYWRpbmVzcyIsbmFtZToiUm91dGU1M1JlY292ZXJ5UmVhZGluZXNzIn0sY2hpbWVzZGtpZGVudGl0eTp7cHJlZml4OiJjaGltZS1zZGstaWRlbnRpdHkiLG5hbWU6IkNoaW1lU0RLSWRlbnRpdHkifSxjaGltZXNka21lc3NhZ2luZzp7cHJlZml4OiJjaGltZS1zZGstbWVzc2FnaW5nIixuYW1lOiJDaGltZVNES01lc3NhZ2luZyJ9LHNub3dkZXZpY2VtYW5hZ2VtZW50OntwcmVmaXg6InNub3ctZGV2aWNlLW1hbmFnZW1lbnQiLG5hbWU6IlNub3dEZXZpY2VNYW5hZ2VtZW50In0sbWVtb3J5ZGI6e25hbWU6Ik1lbW9yeURCIn0sb3BlbnNlYXJjaDp7bmFtZToiT3BlblNlYXJjaCJ9LGthZmthY29ubmVjdDp7bmFtZToiS2Fma2FDb25uZWN0In0sdm9pY2VpZDp7cHJlZml4OiJ2b2ljZS1pZCIsbmFtZToiVm9pY2VJRCJ9LHdpc2RvbTp7bmFtZToiV2lzZG9tIn0sYWNjb3VudDp7bmFtZToiQWNjb3VudCJ9LGNsb3VkY29udHJvbDp7bmFtZToiQ2xvdWRDb250cm9sIn0sZ3JhZmFuYTp7bmFtZToiR3JhZmFuYSJ9LHBhbm9yYW1hOntuYW1lOiJQYW5vcmFtYSJ9LGNoaW1lc2RrbWVldGluZ3M6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZXRpbmdzIixuYW1lOiJDaGltZVNES01lZXRpbmdzIn0scmVzaWxpZW5jZWh1Yjp7bmFtZToiUmVzaWxpZW5jZWh1YiJ9LG1pZ3JhdGlvbmh1YnN0cmF0ZWd5OntuYW1lOiJNaWdyYXRpb25IdWJTdHJhdGVneSJ9LGFwcGNvbmZpZ2RhdGE6e25hbWU6IkFwcENvbmZpZ0RhdGEifSxkcnM6e25hbWU6IkRycyJ9LG1pZ3JhdGlvbmh1YnJlZmFjdG9yc3BhY2VzOntwcmVmaXg6Im1pZ3JhdGlvbi1odWItcmVmYWN0b3Itc3BhY2VzIixuYW1lOiJNaWdyYXRpb25IdWJSZWZhY3RvclNwYWNlcyJ9LGV2aWRlbnRseTp7bmFtZToiRXZpZGVudGx5In0saW5zcGVjdG9yMjp7bmFtZToiSW5zcGVjdG9yMiJ9LHJiaW46e25hbWU6IlJiaW4ifSxydW06e25hbWU6IlJVTSJ9LGJhY2t1cGdhdGV3YXk6e3ByZWZpeDoiYmFja3VwLWdhdGV3YXkiLG5hbWU6IkJhY2t1cEdhdGV3YXkifSxpb3R0d2lubWFrZXI6e25hbWU6IklvVFR3aW5NYWtlciJ9LHdvcmtzcGFjZXN3ZWI6e3ByZWZpeDoid29ya3NwYWNlcy13ZWIiLG5hbWU6IldvcmtTcGFjZXNXZWIifSxhbXBsaWZ5dWlidWlsZGVyOntuYW1lOiJBbXBsaWZ5VUlCdWlsZGVyIn0sa2V5c3BhY2VzOntuYW1lOiJLZXlzcGFjZXMifSxiaWxsaW5nY29uZHVjdG9yOntuYW1lOiJCaWxsaW5nY29uZHVjdG9yIn0sZ2FtZXNwYXJrczp7bmFtZToiR2FtZVNwYXJrcyJ9LHBpbnBvaW50c21zdm9pY2V2Mjp7cHJlZml4OiJwaW5wb2ludC1zbXMtdm9pY2UtdjIiLG5hbWU6IlBpbnBvaW50U01TVm9pY2VWMiJ9LGl2c2NoYXQ6e25hbWU6Ikl2c2NoYXQifSxjaGltZXNka21lZGlhcGlwZWxpbmVzOntwcmVmaXg6ImNoaW1lLXNkay1tZWRpYS1waXBlbGluZXMiLG5hbWU6IkNoaW1lU0RLTWVkaWFQaXBlbGluZXMifSxlbXJzZXJ2ZXJsZXNzOntwcmVmaXg6ImVtci1zZXJ2ZXJsZXNzIixuYW1lOiJFTVJTZXJ2ZXJsZXNzIn0sbTI6e25hbWU6Ik0yIn0sY29ubmVjdGNhbXBhaWduczp7bmFtZToiQ29ubmVjdENhbXBhaWducyJ9LHJlZHNoaWZ0c2VydmVybGVzczp7cHJlZml4OiJyZWRzaGlmdC1zZXJ2ZXJsZXNzIixuYW1lOiJSZWRzaGlmdFNlcnZlcmxlc3MifSxyb2xlc2FueXdoZXJlOntuYW1lOiJSb2xlc0FueXdoZXJlIn0sbGljZW5zZW1hbmFnZXJ1c2Vyc3Vic2NyaXB0aW9uczp7cHJlZml4OiJsaWNlbnNlLW1hbmFnZXItdXNlci1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlclVzZXJTdWJzY3JpcHRpb25zIn0sYmFja3Vwc3RvcmFnZTp7bmFtZToiQmFja3VwU3RvcmFnZSJ9LHByaXZhdGVuZXR3b3Jrczp7bmFtZToiUHJpdmF0ZU5ldHdvcmtzIn0sc3VwcG9ydGFwcDp7cHJlZml4OiJzdXBwb3J0LWFwcCIsbmFtZToiU3VwcG9ydEFwcCJ9LGNvbnRyb2x0b3dlcjp7bmFtZToiQ29udHJvbFRvd2VyIn0saW90ZmxlZXR3aXNlOntuYW1lOiJJb1RGbGVldFdpc2UifSxtaWdyYXRpb25odWJvcmNoZXN0cmF0b3I6e25hbWU6Ik1pZ3JhdGlvbkh1Yk9yY2hlc3RyYXRvciJ9LGNvbm5lY3RjYXNlczp7bmFtZToiQ29ubmVjdENhc2VzIn0scmVzb3VyY2VleHBsb3JlcjI6e3ByZWZpeDoicmVzb3VyY2UtZXhwbG9yZXItMiIsbmFtZToiUmVzb3VyY2VFeHBsb3JlcjIifSxzY2hlZHVsZXI6e25hbWU6IlNjaGVkdWxlciJ9LGNoaW1lc2Rrdm9pY2U6e3ByZWZpeDoiY2hpbWUtc2RrLXZvaWNlIixuYW1lOiJDaGltZVNES1ZvaWNlIn0saW90cm9ib3J1bm5lcjp7cHJlZml4OiJpb3Qtcm9ib3J1bm5lciIsbmFtZToiSW9UUm9ib1J1bm5lciJ9LHNzbXNhcDp7cHJlZml4OiJzc20tc2FwIixuYW1lOiJTc21TYXAifSxvYW06e25hbWU6Ik9BTSJ9LGFyY3pvbmFsc2hpZnQ6e3ByZWZpeDoiYXJjLXpvbmFsLXNoaWZ0IixuYW1lOiJBUkNab25hbFNoaWZ0In0sb21pY3M6e25hbWU6Ik9taWNzIn0sb3BlbnNlYXJjaHNlcnZlcmxlc3M6e25hbWU6Ik9wZW5TZWFyY2hTZXJ2ZXJsZXNzIn0sc2VjdXJpdHlsYWtlOntuYW1lOiJTZWN1cml0eUxha2UifSxzaW1zcGFjZXdlYXZlcjp7bmFtZToiU2ltU3BhY2VXZWF2ZXIifSxkb2NkYmVsYXN0aWM6e3ByZWZpeDoiZG9jZGItZWxhc3RpYyIsbmFtZToiRG9jREJFbGFzdGljIn0sc2FnZW1ha2VyZ2Vvc3BhdGlhbDp7cHJlZml4OiJzYWdlbWFrZXItZ2Vvc3BhdGlhbCIsbmFtZToiU2FnZU1ha2VyR2Vvc3BhdGlhbCJ9LGNvZGVjYXRhbHlzdDp7bmFtZToiQ29kZUNhdGFseXN0In0scGlwZXM6e25hbWU6IlBpcGVzIn0sc2FnZW1ha2VybWV0cmljczp7cHJlZml4OiJzYWdlbWFrZXItbWV0cmljcyIsbmFtZToiU2FnZU1ha2VyTWV0cmljcyJ9LGtpbmVzaXN2aWRlb3dlYnJ0Y3N0b3JhZ2U6e3ByZWZpeDoia2luZXNpcy12aWRlby13ZWJydGMtc3RvcmFnZSIsbmFtZToiS2luZXNpc1ZpZGVvV2ViUlRDU3RvcmFnZSJ9LGxpY2Vuc2VtYW5hZ2VybGludXhzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci1saW51eC1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlckxpbnV4U3Vic2NyaXB0aW9ucyJ9LGtlbmRyYXJhbmtpbmc6e3ByZWZpeDoia2VuZHJhLXJhbmtpbmciLG5hbWU6IktlbmRyYVJhbmtpbmcifSxjbGVhbnJvb21zOntuYW1lOiJDbGVhblJvb21zIn0sY2xvdWR0cmFpbGRhdGE6e3ByZWZpeDoiY2xvdWR0cmFpbC1kYXRhIixuYW1lOiJDbG91ZFRyYWlsRGF0YSJ9LHRuYjp7bmFtZToiVG5iIn0saW50ZXJuZXRtb25pdG9yOntuYW1lOiJJbnRlcm5ldE1vbml0b3IifSxpdnNyZWFsdGltZTp7cHJlZml4OiJpdnMtcmVhbHRpbWUiLG5hbWU6IklWU1JlYWxUaW1lIn0sdnBjbGF0dGljZTp7cHJlZml4OiJ2cGMtbGF0dGljZSIsbmFtZToiVlBDTGF0dGljZSJ9LG9zaXM6e25hbWU6Ik9TSVMifSxtZWRpYXBhY2thZ2V2Mjp7bmFtZToiTWVkaWFQYWNrYWdlVjIifSxwYXltZW50Y3J5cHRvZ3JhcGh5OntwcmVmaXg6InBheW1lbnQtY3J5cHRvZ3JhcGh5IixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5In0scGF5bWVudGNyeXB0b2dyYXBoeWRhdGE6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHktZGF0YSIsbmFtZToiUGF5bWVudENyeXB0b2dyYXBoeURhdGEifSxjb2RlZ3VydXNlY3VyaXR5OntwcmVmaXg6ImNvZGVndXJ1LXNlY3VyaXR5IixuYW1lOiJDb2RlR3VydVNlY3VyaXR5In0sdmVyaWZpZWRwZXJtaXNzaW9uczp7bmFtZToiVmVyaWZpZWRQZXJtaXNzaW9ucyJ9LGFwcGZhYnJpYzp7bmFtZToiQXBwRmFicmljIn0sbWVkaWNhbGltYWdpbmc6e3ByZWZpeDoibWVkaWNhbC1pbWFnaW5nIixuYW1lOiJNZWRpY2FsSW1hZ2luZyJ9LGVudGl0eXJlc29sdXRpb246e25hbWU6IkVudGl0eVJlc29sdXRpb24ifSxtYW5hZ2VkYmxvY2tjaGFpbnF1ZXJ5OntwcmVmaXg6Im1hbmFnZWRibG9ja2NoYWluLXF1ZXJ5IixuYW1lOiJNYW5hZ2VkQmxvY2tjaGFpblF1ZXJ5In0sbmVwdHVuZWRhdGE6e25hbWU6Ik5lcHR1bmVkYXRhIn0scGNhY29ubmVjdG9yYWQ6e3ByZWZpeDoicGNhLWNvbm5lY3Rvci1hZCIsbmFtZToiUGNhQ29ubmVjdG9yQWQifX19LHt9XSw1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDExLTA2LTE1IixlbmRwb2ludFByZWZpeDoic3RzIixnbG9iYWxFbmRwb2ludDoic3RzLmFtYXpvbmF3cy5jb20iLHByb3RvY29sOiJxdWVyeSIsc2VydmljZUFiYnJldmlhdGlvbjoiQVdTIFNUUyIsc2VydmljZUZ1bGxOYW1lOiJBV1MgU2VjdXJpdHkgVG9rZW4gU2VydmljZSIsc2VydmljZUlkOiJTVFMiLHNpZ25hdHVyZVZlcnNpb246InY0Iix1aWQ6InN0cy0yMDExLTA2LTE1Iix4bWxOYW1lc3BhY2U6Imh0dHBzOi8vc3RzLmFtYXpvbmF3cy5jb20vZG9jLzIwMTEtMDYtMTUvIn0sb3BlcmF0aW9uczp7QXNzdW1lUm9sZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIl0sbWVtYmVyczp7Um9sZUFybjp7fSxSb2xlU2Vzc2lvbk5hbWU6e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9LFRyYW5zaXRpdmVUYWdLZXlzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LEV4dGVybmFsSWQ6e30sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fSxTb3VyY2VJZGVudGl0eTp7fSxQcm92aWRlZENvbnRleHRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7UHJvdmlkZXJBcm46e30sQ29udGV4dEFzc2VydGlvbjp7fX19fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sQXNzdW1lZFJvbGVVc2VyOntzaGFwZToiU3EifSxQYWNrZWRQb2xpY3lTaXplOnt0eXBlOiJpbnRlZ2VyIn0sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhTQU1MOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJQcmluY2lwYWxBcm4iLCJTQU1MQXNzZXJ0aW9uIl0sbWVtYmVyczp7Um9sZUFybjp7fSxQcmluY2lwYWxBcm46e30sU0FNTEFzc2VydGlvbjp7dHlwZToic3RyaW5nIixzZW5zaXRpdmU6ITB9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhTQU1MUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTdWJqZWN0Ont9LFN1YmplY3RUeXBlOnt9LElzc3Vlcjp7fSxBdWRpZW5jZTp7fSxOYW1lUXVhbGlmaWVyOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LEFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlJvbGVTZXNzaW9uTmFtZSIsIldlYklkZW50aXR5VG9rZW4iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxXZWJJZGVudGl0eVRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUHJvdmlkZXJJZDp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHlSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LFN1YmplY3RGcm9tV2ViSWRlbnRpdHlUb2tlbjp7fSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxQcm92aWRlcjp7fSxBdWRpZW5jZTp7fSxTb3VyY2VJZGVudGl0eTp7fX19fSxEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJFbmNvZGVkTWVzc2FnZSJdLG1lbWJlcnM6e0VuY29kZWRNZXNzYWdlOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntEZWNvZGVkTWVzc2FnZTp7fX19fSxHZXRBY2Nlc3NLZXlJbmZvOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFjY2Vzc0tleUlkIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldEFjY2Vzc0tleUluZm9SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjb3VudDp7fX19fSxHZXRDYWxsZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRDYWxsZXJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVc2VySWQ6e30sQWNjb3VudDp7fSxBcm46e319fX0sR2V0RmVkZXJhdGlvblRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIk5hbWUiXSxtZW1iZXJzOntOYW1lOnt9LFBvbGljeTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxUYWdzOntzaGFwZToiUzgifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0RmVkZXJhdGlvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxGZWRlcmF0ZWRVc2VyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiRmVkZXJhdGVkVXNlcklkIiwiQXJuIl0sbWVtYmVyczp7RmVkZXJhdGVkVXNlcklkOnt9LEFybjp7fX19LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifX19fSxHZXRTZXNzaW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0R1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFNlcmlhbE51bWJlcjp7fSxUb2tlbkNvZGU6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldFNlc3Npb25Ub2tlblJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn19fX19LHNoYXBlczp7UzQ6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthcm46e319fX0sUzg6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIktleSIsIlZhbHVlIl0sbWVtYmVyczp7S2V5Ont9LFZhbHVlOnt9fX19LFNsOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiLCJTZWNyZXRBY2Nlc3NLZXkiLCJTZXNzaW9uVG9rZW4iLCJFeHBpcmF0aW9uIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0QWNjZXNzS2V5Ont0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX0sU3E6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBc3N1bWVkUm9sZUlkIiwiQXJuIl0sbWVtYmVyczp7QXNzdW1lZFJvbGVJZDp7fSxBcm46e319fX19fSx7fV0sNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cGFnaW5hdGlvbjp7fX19LHt9XSw3OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuY29nbml0b2lkZW50aXR5PXt9LHIuQ29nbml0b0lkZW50aXR5PW8uZGVmaW5lU2VydmljZSgiY29nbml0b2lkZW50aXR5IixbIjIwMTQtMDYtMzAiXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGkuc2VydmljZXMuY29nbml0b2lkZW50aXR5LCIyMDE0LTA2LTMwIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5Db2duaXRvSWRlbnRpdHl9LHsiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iOjEsIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiI6MiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2fV0sODpbZnVuY3Rpb24oZSx0LG4pe2UoIi4uL2xpYi9ub2RlX2xvYWRlciIpO3ZhciByPWUoIi4uL2xpYi9jb3JlIiksbz1yLlNlcnZpY2UsaT1yLmFwaUxvYWRlcjtpLnNlcnZpY2VzLnN0cz17fSxyLlNUUz1vLmRlZmluZVNlcnZpY2UoInN0cyIsWyIyMDExLTA2LTE1Il0pLGUoIi4uL2xpYi9zZXJ2aWNlcy9zdHMiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5zdHMsIjIwMTEtMDYtMTUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIik7cmV0dXJuIHQucGFnaW5hdG9ycz1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5TVFN9LHsiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5taW4uanNvbiI6NSwiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5wYWdpbmF0b3JzLmpzb24iOjYsIi4uL2xpYi9jb3JlIjoxOSwiLi4vbGliL25vZGVfbG9hZGVyIjoxNiwiLi4vbGliL3NlcnZpY2VzL3N0cyI6NjN9XSw5OltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe2lmKCFyLnNlcnZpY2VzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZFNlcnZpY2U6IEZhaWxlZCB0byBsb2FkIGFwaSBmb3IgIitlKTtyZXR1cm4gci5zZXJ2aWNlc1tlXVt0XX1yLnNlcnZpY2VzPXt9LHQuZXhwb3J0cz1yfSx7fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIbWFjIiksbz1lKCIuL2Jyb3dzZXJNZDUiKSxpPWUoIi4vYnJvd3NlclNoYTEiKSxzPWUoIi4vYnJvd3NlclNoYTI1NiIpO3QuZXhwb3J0cz17Y3JlYXRlSGFzaDpmdW5jdGlvbihlKXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyBvO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHM7aWYoInNoYTEiPT09ZSlyZXR1cm4gbmV3IGk7dGhyb3cgbmV3IEVycm9yKCJIYXNoIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVIbWFjOmZ1bmN0aW9uKGUsdCl7aWYoIm1kNSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBuZXcgcihvLHQpO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHIocyx0KTtpZigic2hhMSI9PT1lKXJldHVybiBuZXcgcihpLHQpO3Rocm93IG5ldyBFcnJvcigiSE1BQyBhbGdvcml0aG0gIitlKyIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBTREsiKX0sY3JlYXRlU2lnbjpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiY3JlYXRlU2lnbiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGJyb3dzZXIiKX19fSx7Ii4vYnJvd3NlckhtYWMiOjEyLCIuL2Jyb3dzZXJNZDUiOjEzLCIuL2Jyb3dzZXJTaGExIjoxNCwiLi9icm93c2VyU2hhMjU2IjoxNX1dLDExOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcjsidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ2b2lkIDA9PT1BcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpPi0xfSk7dmFyIG89WyJbb2JqZWN0IEludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCJbb2JqZWN0IEludDE2QXJyYXldIiwiW29iamVjdCBVaW50MTZBcnJheV0iLCJbb2JqZWN0IEludDMyQXJyYXldIiwiW29iamVjdCBVaW50MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLCJbb2JqZWN0IERhdGFWaWV3XSJdO3QuZXhwb3J0cz17aXNFbXB0eURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlPzA9PT1lLmxlbmd0aDowPT09ZS5ieXRlTGVuZ3RofSxjb252ZXJ0VG9CdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT1uZXcgcihlLCJ1dGY4IikpLEFycmF5QnVmZmVyLmlzVmlldyhlKT9uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoL1VpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOm5ldyBVaW50OEFycmF5KGUpfX19LHsiYnVmZmVyLyI6ODZ9XSwxMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLmhhc2g9bmV3IGUsdGhpcy5vdXRlcj1uZXcgZTt2YXIgbj1mdW5jdGlvbihlLHQpe3ZhciBuPXIuY29udmVydFRvQnVmZmVyKHQpO2lmKG4uYnl0ZUxlbmd0aD5lLkJMT0NLX1NJWkUpe3ZhciBvPW5ldyBlO28udXBkYXRlKG4pLG49by5kaWdlc3QoKX12YXIgaT1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO3JldHVybiBpLnNldChuKSxpfShlLHQpLG89bmV3IFVpbnQ4QXJyYXkoZS5CTE9DS19TSVpFKTtvLnNldChuKTtmb3IodmFyIGk9MDtpPGUuQkxPQ0tfU0laRTtpKyspbltpXV49NTQsb1tpXV49OTI7Zm9yKHRoaXMuaGFzaC51cGRhdGUobiksdGhpcy5vdXRlci51cGRhdGUobyksaT0wO2k8bi5ieXRlTGVuZ3RoO2krKyluW2ldPTB9dC5leHBvcnRzPW8sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSl8fHRoaXMuZXJyb3IpcmV0dXJuIHRoaXM7dHJ5e3RoaXMuaGFzaC51cGRhdGUoci5jb252ZXJ0VG9CdWZmZXIoZSkpfWNhdGNoKGUpe3RoaXMuZXJyb3I9ZX1yZXR1cm4gdGhpc30sby5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkfHx0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmhhc2guZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KGUpfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExfV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxvPWUoImJ1ZmZlci8iKS5CdWZmZXIsaT02NDtmdW5jdGlvbiBzKCl7dGhpcy5zdGF0ZT1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSx0aGlzLmJ1ZmZlcj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKGkpKSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfWZ1bmN0aW9uIGEoZSx0LG4scixvLGkpe3JldHVybigodD0odCtlJjQyOTQ5NjcyOTUpKyhyK2kmNDI5NDk2NzI5NSkmNDI5NDk2NzI5NSk8PG98dD4+PjMyLW8pK24mNDI5NDk2NzI5NX1mdW5jdGlvbiBjKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmbnx+dCZyLGUsdCxvLGkscyl9ZnVuY3Rpb24gdShlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0JnJ8biZ+cixlLHQsbyxpLHMpfWZ1bmN0aW9uIGwoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodF5uXnIsZSx0LG8saSxzKX1mdW5jdGlvbiBwKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKG5eKHR8fnIpLGUsdCxvLGkscyl9dC5leHBvcnRzPXMscy5CTE9DS19TSVpFPWkscy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO3ZhciB0PXIuY29udmVydFRvQnVmZmVyKGUpLG49MCxvPXQuYnl0ZUxlbmd0aDtmb3IodGhpcy5ieXRlc0hhc2hlZCs9bztvPjA7KXRoaXMuYnVmZmVyLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssdFtuKytdKSxvLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LHMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcyxuPXQuYnVmZmVyLHI9dC5idWZmZXJMZW5ndGgscz04KnQuYnl0ZXNIYXNoZWQ7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksciVpPj01Nil7Zm9yKHZhciBhPXRoaXMuYnVmZmVyTGVuZ3RoO2E8aTthKyspbi5zZXRVaW50OChhLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKGE9dGhpcy5idWZmZXJMZW5ndGg7YTw1NjthKyspbi5zZXRVaW50OChhLDApO24uc2V0VWludDMyKDU2LHM+Pj4wLCEwKSxuLnNldFVpbnQzMig2MCxNYXRoLmZsb29yKHMvNDI5NDk2NzI5NiksITApLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGM9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxNikpO2ZvcihhPTA7YTw0O2ErKyljLnNldFVpbnQzMig0KmEsdGhpcy5zdGF0ZVthXSwhMCk7dmFyIHU9bmV3IG8oYy5idWZmZXIsYy5ieXRlT2Zmc2V0LGMuYnl0ZUxlbmd0aCk7cmV0dXJuIGU/dS50b1N0cmluZyhlKTp1fSxzLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGk9dFszXTtuPWMobixyLG8saSxlLmdldFVpbnQzMigwLCEwKSw3LDM2MTQwOTAzNjApLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDQsITApLDEyLDM5MDU0MDI3MTApLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDgsITApLDE3LDYwNjEwNTgxOSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMTIsITApLDIyLDMyNTA0NDE5NjYpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw3LDQxMTg1NDgzOTkpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDIwLCEwKSwxMiwxMjAwMDgwNDI2KSxvPWMobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTcsMjgyMTczNTk1NSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMjgsITApLDIyLDQyNDkyNjEzMTMpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw3LDE3NzAwMzU0MTYpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDM2LCEwKSwxMiwyMzM2NTUyODc5KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig0MCwhMCksMTcsNDI5NDkyNTIzMykscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNDQsITApLDIyLDIzMDQ1NjMxMzQpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDQ4LCEwKSw3LDE4MDQ2MDM2ODIpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDUyLCEwKSwxMiw0MjU0NjI2MTk1KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig1NiwhMCksMTcsMjc5Mjk2NTAwNiksbj11KG4scj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNjAsITApLDIyLDEyMzY1MzUzMjkpLG8saSxlLmdldFVpbnQzMig0LCEwKSw1LDQxMjkxNzA3ODYpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDI0LCEwKSw5LDMyMjU0NjU2NjQpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNCw2NDM3MTc3MTMpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDAsITApLDIwLDM5MjEwNjk5OTQpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw1LDM1OTM0MDg2MDUpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDQwLCEwKSw5LDM4MDE2MDgzKSxvPXUobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTQsMzYzNDQ4ODk2MSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMTYsITApLDIwLDM4ODk0Mjk0NDgpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw1LDU2ODQ0NjQzOCksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNTYsITApLDksMzI3NTE2MzYwNiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMTIsITApLDE0LDQxMDc2MDMzMzUpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDMyLCEwKSwyMCwxMTYzNTMxNTAxKSxuPXUobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNSwyODUwMjg1ODI5KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig4LCEwKSw5LDQyNDM1NjM1MTIpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNCwxNzM1MzI4NDczKSxuPWwobixyPXUocixvLGksbixlLmdldFVpbnQzMig0OCwhMCksMjAsMjM2ODM1OTU2MiksbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw0LDQyOTQ1ODg3MzgpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDMyLCEwKSwxMSwyMjcyMzkyODMzKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig0NCwhMCksMTYsMTgzOTAzMDU2Mikscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoNTYsITApLDIzLDQyNTk2NTc3NDApLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDQsITApLDQsMjc2Mzk3NTIzNiksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMTYsITApLDExLDEyNzI4OTMzNTMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNiw0MTM5NDY5NjY0KSxyPWwocixvLGksbixlLmdldFVpbnQzMig0MCwhMCksMjMsMzIwMDIzNjY1Niksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNTIsITApLDQsNjgxMjc5MTc0KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigwLCEwKSwxMSwzOTM2NDMwMDc0KSxvPWwobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTYsMzU3MjQ0NTMxNykscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoMjQsITApLDIzLDc2MDI5MTg5KSxuPWwobixyLG8saSxlLmdldFVpbnQzMigzNiwhMCksNCwzNjU0NjAyODA5KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMig0OCwhMCksMTEsMzg3MzE1MTQ2MSksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoNjAsITApLDE2LDUzMDc0MjUyMCksbj1wKG4scj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoOCwhMCksMjMsMzI5OTYyODY0NSksbyxpLGUuZ2V0VWludDMyKDAsITApLDYsNDA5NjMzNjQ1MiksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMjgsITApLDEwLDExMjY4OTE0MTUpLG89cChvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNSwyODc4NjEyMzkxKSxyPXAocixvLGksbixlLmdldFVpbnQzMigyMCwhMCksMjEsNDIzNzUzMzI0MSksbj1wKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDYsMTcwMDQ4NTU3MSksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMTIsITApLDEwLDIzOTk5ODA2OTApLG89cChvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNSw0MjkzOTE1NzczKSxyPXAocixvLGksbixlLmdldFVpbnQzMig0LCEwKSwyMSwyMjQwMDQ0NDk3KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigzMiwhMCksNiwxODczMzEzMzU5KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig2MCwhMCksMTAsNDI2NDM1NTU1Miksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoMjQsITApLDE1LDI3MzQ3Njg5MTYpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDUyLCEwKSwyMSwxMzA5MTUxNjQ5KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigxNiwhMCksNiw0MTQ5NDQ0MjI2KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig0NCwhMCksMTAsMzE3NDc1NjkxNyksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTUsNzE4Nzg3MjU5KSxyPXAocixvLGksbixlLmdldFVpbnQzMigzNiwhMCksMjEsMzk1MTQ4MTc0NSksdFswXT1uK3RbMF0mNDI5NDk2NzI5NSx0WzFdPXIrdFsxXSY0Mjk0OTY3Mjk1LHRbMl09byt0WzJdJjQyOTQ5NjcyOTUsdFszXT1pK3RbM10mNDI5NDk2NzI5NX19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKTtmdW5jdGlvbiBpKCl7dGhpcy5oMD0xNzMyNTg0MTkzLHRoaXMuaDE9NDAyMzIzMzQxNyx0aGlzLmgyPTI1NjIzODMxMDIsdGhpcy5oMz0yNzE3MzM4NzgsdGhpcy5oND0zMjg1Mzc3NTIwLHRoaXMuYmxvY2s9bmV3IFVpbnQzMkFycmF5KDgwKSx0aGlzLm9mZnNldD0wLHRoaXMuc2hpZnQ9MjQsdGhpcy50b3RhbExlbmd0aD0wfW5ldyBVaW50MzJBcnJheShbMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdKSxNYXRoLnBvdygyLDUzKSx0LmV4cG9ydHM9aSxpLkJMT0NLX1NJWkU9NjQsaS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGFuIGFscmVhZHkgZmluaXNoZWQgaGFzaC4iKTtpZihvLmlzRW1wdHlEYXRhKGUpKXJldHVybiB0aGlzO3ZhciB0PShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5sZW5ndGg7dGhpcy50b3RhbExlbmd0aCs9OCp0O2Zvcih2YXIgbj0wO248dDtuKyspdGhpcy53cml0ZShlW25dKTtyZXR1cm4gdGhpc30saS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5ibG9ja1t0aGlzLm9mZnNldF18PSgyNTUmZSk8PHRoaXMuc2hpZnQsdGhpcy5zaGlmdD90aGlzLnNoaWZ0LT04Oih0aGlzLm9mZnNldCsrLHRoaXMuc2hpZnQ9MjQpLDE2PT09dGhpcy5vZmZzZXQmJnRoaXMucHJvY2Vzc0Jsb2NrKCl9LGkucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXt0aGlzLndyaXRlKDEyOCksKHRoaXMub2Zmc2V0PjE0fHwxND09PXRoaXMub2Zmc2V0JiZ0aGlzLnNoaWZ0PDI0KSYmdGhpcy5wcm9jZXNzQmxvY2soKSx0aGlzLm9mZnNldD0xNCx0aGlzLnNoaWZ0PTI0LHRoaXMud3JpdGUoMCksdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+MHhmZmZmZmZmZmZmP3RoaXMudG90YWxMZW5ndGgvMTA5OTUxMTYyNzc3NjowKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+NDI5NDk2NzI5NT90aGlzLnRvdGFsTGVuZ3RoLzQyOTQ5NjcyOTY6MCk7Zm9yKHZhciB0PTI0O3Q+PTA7dC09OCl0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+PnQpO3ZhciBuPW5ldyByKDIwKSxvPW5ldyBEYXRhVmlldyhuLmJ1ZmZlcik7cmV0dXJuIG8uc2V0VWludDMyKDAsdGhpcy5oMCwhMSksby5zZXRVaW50MzIoNCx0aGlzLmgxLCExKSxvLnNldFVpbnQzMig4LHRoaXMuaDIsITEpLG8uc2V0VWludDMyKDEyLHRoaXMuaDMsITEpLG8uc2V0VWludDMyKDE2LHRoaXMuaDQsITEpLGU/bi50b1N0cmluZyhlKTpufSxpLnByb3RvdHlwZS5wcm9jZXNzQmxvY2s9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MTY7ZTw4MDtlKyspe3ZhciB0PXRoaXMuYmxvY2tbZS0zXV50aGlzLmJsb2NrW2UtOF1edGhpcy5ibG9ja1tlLTE0XV50aGlzLmJsb2NrW2UtMTZdO3RoaXMuYmxvY2tbZV09dDw8MXx0Pj4+MzF9dmFyIG4scixvPXRoaXMuaDAsaT10aGlzLmgxLHM9dGhpcy5oMixhPXRoaXMuaDMsYz10aGlzLmg0O2ZvcihlPTA7ZTw4MDtlKyspe2U8MjA/KG49YV5pJihzXmEpLHI9MTUxODUwMDI0OSk6ZTw0MD8obj1pXnNeYSxyPTE4NTk3NzUzOTMpOmU8NjA/KG49aSZzfGEmKGl8cykscj0yNDAwOTU5NzA4KToobj1pXnNeYSxyPTMzOTU0Njk3ODIpO3ZhciB1PShvPDw1fG8+Pj4yNykrbitjK3IrKDB8dGhpcy5ibG9ja1tlXSk7Yz1hLGE9cyxzPWk8PDMwfGk+Pj4yLGk9byxvPXV9Zm9yKHRoaXMuaDA9dGhpcy5oMCtvfDAsdGhpcy5oMT10aGlzLmgxK2l8MCx0aGlzLmgyPXRoaXMuaDIrc3wwLHRoaXMuaDM9dGhpcy5oMythfDAsdGhpcy5oND10aGlzLmg0K2N8MCx0aGlzLm9mZnNldD0wLGU9MDtlPDE2O2UrKyl0aGlzLmJsb2NrW2VdPTB9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTEsImJ1ZmZlci8iOjg2fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyLG89ZSgiLi9icm93c2VySGFzaFV0aWxzIiksaT02NCxzPW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSksYT1NYXRoLnBvdygyLDUzKS0xO2Z1bmN0aW9uIGMoKXt0aGlzLnN0YXRlPVsxNzc5MDMzNzAzLDMxNDQxMzQyNzcsMTAxMzkwNDI0MiwyNzczNDgwNzYyLDEzNTk4OTMxMTksMjYwMDgyMjkyNCw1Mjg3MzQ2MzUsMTU0MTQ1OTIyNV0sdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSg2NCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMX10LmV4cG9ydHM9YyxjLkJMT0NLX1NJWkU9aSxjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9MCxuPShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5ieXRlTGVuZ3RoO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPW4sOCp0aGlzLmJ5dGVzSGFzaGVkPmEpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0cyIpO2Zvcig7bj4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3QrK10sbi0tLHRoaXMuYnVmZmVyTGVuZ3RoPT09aSYmKHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTApO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PTgqdGhpcy5ieXRlc0hhc2hlZCxuPW5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCx0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSxvPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKG4uc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKywxMjgpLG8laT49NTYpe2Zvcih2YXIgcz10aGlzLmJ1ZmZlckxlbmd0aDtzPGk7cysrKW4uc2V0VWludDgocywwKTt0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wfWZvcihzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8NTY7cysrKW4uc2V0VWludDgocywwKTtuLnNldFVpbnQzMig1NixNYXRoLmZsb29yKHQvNDI5NDk2NzI5NiksITApLG4uc2V0VWludDMyKDYwLHQpLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGE9bmV3IHIoMzIpO2ZvcihzPTA7czw4O3MrKylhWzQqc109dGhpcy5zdGF0ZVtzXT4+PjI0JjI1NSxhWzQqcysxXT10aGlzLnN0YXRlW3NdPj4+MTYmMjU1LGFbNCpzKzJdPXRoaXMuc3RhdGVbc10+Pj44JjI1NSxhWzQqcyszXT10aGlzLnN0YXRlW3NdPj4+MCYyNTU7cmV0dXJuIGU/YS50b1N0cmluZyhlKTphfSxjLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyLHQ9dGhpcy5zdGF0ZSxuPXRbMF0scj10WzFdLG89dFsyXSxhPXRbM10sYz10WzRdLHU9dFs1XSxsPXRbNl0scD10WzddLGQ9MDtkPGk7ZCsrKXtpZihkPDE2KXRoaXMudGVtcFtkXT0oMjU1JmVbNCpkXSk8PDI0fCgyNTUmZVs0KmQrMV0pPDwxNnwoMjU1JmVbNCpkKzJdKTw8OHwyNTUmZVs0KmQrM107ZWxzZXt2YXIgaD10aGlzLnRlbXBbZC0yXSxmPShoPj4+MTd8aDw8MTUpXihoPj4+MTl8aDw8MTMpXmg+Pj4xMCxnPSgoaD10aGlzLnRlbXBbZC0xNV0pPj4+N3xoPDwyNSleKGg+Pj4xOHxoPDwxNCleaD4+PjM7dGhpcy50ZW1wW2RdPShmK3RoaXMudGVtcFtkLTddfDApKyhnK3RoaXMudGVtcFtkLTE2XXwwKX12YXIgbT0oKChjPj4+NnxjPDwyNileKGM+Pj4xMXxjPDwyMSleKGM+Pj4yNXxjPDw3KSkrKGMmdV5+YyZsKXwwKSsocCsoc1tkXSt0aGlzLnRlbXBbZF18MCl8MCl8MCx2PSgobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKSsobiZyXm4mb15yJm8pfDA7cD1sLGw9dSx1PWMsYz1hK218MCxhPW8sbz1yLHI9bixuPW0rdnwwfXRbMF0rPW4sdFsxXSs9cix0WzJdKz1vLHRbM10rPWEsdFs0XSs9Yyx0WzVdKz11LHRbNl0rPWwsdFs3XSs9cH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL3V0aWwiKTtuLmNyeXB0by5saWI9ZSgiLi9icm93c2VyQ3J5cHRvTGliIiksbi5CdWZmZXI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixuLnVybD1lKCJ1cmwvIiksbi5xdWVyeXN0cmluZz1lKCJxdWVyeXN0cmluZy8iKSxuLnJlYWxDbG9jaz1lKCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siKSxuLmVudmlyb25tZW50PSJqcyIsbi5jcmVhdGVFdmVudFN0cmVhbT1lKCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIikuY3JlYXRlRXZlbnRTdHJlYW0sbi5pc0Jyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbi5pc05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07dmFyIHI9ZSgiLi9jb3JlIik7aWYodC5leHBvcnRzPXIsZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLGUoIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jaGFpbmFibGVfdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiKSxyLlhNTC5QYXJzZXI9ZSgiLi94bWwvYnJvd3Nlcl9wYXJzZXIiKSxlKCIuL2h0dHAveGhyIiksdm9pZCAwPT09byl2YXIgbz17YnJvd3NlcjohMH19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vYnJvd3NlckNyeXB0b0xpYiI6MTAsIi4vY29yZSI6MTksIi4vY3JlZGVudGlhbHMiOjIwLCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiOjIxLCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiOjIyLCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iOjIzLCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiOjI0LCIuL2NyZWRlbnRpYWxzL3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjUsIi4vY3JlZGVudGlhbHMvd2ViX2lkZW50aXR5X2NyZWRlbnRpYWxzIjoyNiwiLi9ldmVudC1zdHJlYW0vYnVmZmVyZWQtY3JlYXRlLWV2ZW50LXN0cmVhbSI6MjgsIi4vaHR0cC94aHIiOjM2LCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siOjU0LCIuL3V0aWwiOjc0LCIuL3htbC9icm93c2VyX3BhcnNlciI6NzUsX3Byb2Nlc3M6OTEsImJ1ZmZlci8iOjg2LCJxdWVyeXN0cmluZy8iOjk4LCJ1cmwvIjoxMDB9XSwxNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89ZSgiLi9jb3JlIik7ZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLG8uQ29uZmlnPW8udXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5rZXlzLChmdW5jdGlvbih0LG4pe3RoaXMuc2V0KHQsZVt0XSxuKX0pKX0sZ2V0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzO2Z1bmN0aW9uIHIodCl7ZSh0LHQ/bnVsbDpuLmNyZWRlbnRpYWxzKX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG5ldyBvLnV0aWwuZXJyb3IodHx8bmV3IEVycm9yLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOmUsbmFtZToiQ3JlZGVudGlhbHNFcnJvciJ9KX1uLmNyZWRlbnRpYWxzPyJmdW5jdGlvbiI9PXR5cGVvZiBuLmNyZWRlbnRpYWxzLmdldD9uLmNyZWRlbnRpYWxzLmdldCgoZnVuY3Rpb24oZSl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSAiK24uY3JlZGVudGlhbHMuY29uc3RydWN0b3IubmFtZSxlKSkscihlKX0pKToodD1udWxsLG4uY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJm4uY3JlZGVudGlhbHMuc2VjcmV0QWNjZXNzS2V5fHwodD1pKCJNaXNzaW5nIGNyZWRlbnRpYWxzIikpLHIodCkpOm4uY3JlZGVudGlhbFByb3ZpZGVyP24uY3JlZGVudGlhbFByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi5jcmVkZW50aWFscz10LHIoZSl9KSk6cihpKCJObyBjcmVkZW50aWFscyB0byBsb2FkIikpfSxnZXRUb2tlbjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4udG9rZW4pfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IlRva2VuRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJUb2tlbkVycm9yIn0pfW4udG9rZW4/ImZ1bmN0aW9uIj09dHlwZW9mIG4udG9rZW4uZ2V0P24udG9rZW4uZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tICIrbi50b2tlbi5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi50b2tlbi50b2tlbnx8KHQ9aSgiTWlzc2luZyB0b2tlbiIpKSxyKHQpKTpuLnRva2VuUHJvdmlkZXI/bi50b2tlblByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgdG9rZW4gZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi50b2tlbj10LHIoZSl9KSk6cihpKCJObyB0b2tlbiB0byBsb2FkIikpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0PXR8fCExLGU9dGhpcy5leHRyYWN0Q3JlZGVudGlhbHMoZSksby51dGlsLmVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUsbil7KHR8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmtleXMsZSl8fG8uU2VydmljZS5oYXNTZXJ2aWNlKGUpKSYmdGhpcy5zZXQoZSxuKX0pKX0sbG9hZEZyb21QYXRoOmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXIoKTt2YXIgdD1KU09OLnBhcnNlKG8udXRpbC5yZWFkRmlsZVN5bmMoZSkpLG49bmV3IG8uRmlsZVN5c3RlbUNyZWRlbnRpYWxzKGUpLHI9bmV3IG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW47cmV0dXJuIHIucHJvdmlkZXJzLnVuc2hpZnQobiksci5yZXNvbHZlKChmdW5jdGlvbihlLG4pe2lmKGUpdGhyb3cgZTt0LmNyZWRlbnRpYWxzPW59KSksdGhpcy5jb25zdHJ1Y3Rvcih0KSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe28udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzW2VdfSkpLHRoaXMuc2V0KCJjcmVkZW50aWFscyIsdm9pZCAwKSx0aGlzLnNldCgiY3JlZGVudGlhbFByb3ZpZGVyIix2b2lkIDApfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQ/KHZvaWQgMD09PW4mJihuPXRoaXMua2V5c1tlXSksdGhpc1tlXT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyk6bik6Imh0dHBPcHRpb25zIj09PWUmJnRoaXNbZV0/dGhpc1tlXT1vLnV0aWwubWVyZ2UodGhpc1tlXSx0KTp0aGlzW2VdPXR9LGtleXM6e2NyZWRlbnRpYWxzOm51bGwsY3JlZGVudGlhbFByb3ZpZGVyOm51bGwscmVnaW9uOm51bGwsbG9nZ2VyOm51bGwsYXBpVmVyc2lvbnM6e30sYXBpVmVyc2lvbjpudWxsLGVuZHBvaW50OnZvaWQgMCxodHRwT3B0aW9uczp7dGltZW91dDoxMmU0fSxtYXhSZXRyaWVzOnZvaWQgMCxtYXhSZWRpcmVjdHM6MTAscGFyYW1WYWxpZGF0aW9uOiEwLHNzbEVuYWJsZWQ6ITAsczNGb3JjZVBhdGhTdHlsZTohMSxzM0J1Y2tldEVuZHBvaW50OiExLHMzRGlzYWJsZUJvZHlTaWduaW5nOiEwLHMzVXNFYXN0MVJlZ2lvbmFsRW5kcG9pbnQ6ImxlZ2FjeSIsczNVc2VBcm5SZWdpb246dm9pZCAwLGNvbXB1dGVDaGVja3N1bXM6ITAsY29udmVydFJlc3BvbnNlVHlwZXM6ITAsY29ycmVjdENsb2NrU2tldzohMSxjdXN0b21Vc2VyQWdlbnQ6bnVsbCxkeW5hbW9EYkNyYzMyOiEwLHN5c3RlbUNsb2NrT2Zmc2V0OjAsc2lnbmF0dXJlVmVyc2lvbjpudWxsLHNpZ25hdHVyZUNhY2hlOiEwLHJldHJ5RGVsYXlPcHRpb25zOnt9LHVzZUFjY2VsZXJhdGVFbmRwb2ludDohMSxjbGllbnRTaWRlTW9uaXRvcmluZzohMSxlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQ6dm9pZCAwLGVuZHBvaW50Q2FjaGVTaXplOjFlMyxob3N0UHJlZml4RW5hYmxlZDohMCxzdHNSZWdpb25hbEVuZHBvaW50czoibGVnYWN5Iix1c2VGaXBzRW5kcG9pbnQ6ITEsdXNlRHVhbHN0YWNrRW5kcG9pbnQ6ITEsdG9rZW46bnVsbH0sZXh0cmFjdENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmFjY2Vzc0tleUlkJiZlLnNlY3JldEFjY2Vzc0tleSYmKChlPW8udXRpbC5jb3B5KGUpKS5jcmVkZW50aWFscz1uZXcgby5DcmVkZW50aWFscyhlKSksZX0sc2V0UHJvbWlzZXNEZXBlbmRlbmN5OmZ1bmN0aW9uKGUpe3I9ZSxudWxsPT09ZSYmImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2UmJihyPVByb21pc2UpO3ZhciB0PVtvLlJlcXVlc3Qsby5DcmVkZW50aWFscyxvLkNyZWRlbnRpYWxQcm92aWRlckNoYWluXTtvLlMzJiYodC5wdXNoKG8uUzMpLG8uUzMuTWFuYWdlZFVwbG9hZCYmdC5wdXNoKG8uUzMuTWFuYWdlZFVwbG9hZCkpLG8udXRpbC5hZGRQcm9taXNlcyh0LHIpfSxnZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oKXtyZXR1cm4gcn19KSxvLmNvbmZpZz1uZXcgby5Db25maWd9LHsiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjN9XSwxODpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKTtmdW5jdGlvbiBvKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihbImxlZ2FjeSIsInJlZ2lvbmFsIl0uaW5kZXhPZihlLnRvTG93ZXJDYXNlKCkpPj0wKXJldHVybiBlLnRvTG93ZXJDYXNlKCk7dGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix0KX19dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGk7aWYoKGU9ZXx8e30pW3QuY2xpZW50Q29uZmlnXSYmKGk9byhlW3QuY2xpZW50Q29uZmlnXSx7Y29kZToiSW52YWxpZENvbmZpZ3VyYXRpb24iLG1lc3NhZ2U6J2ludmFsaWQgIicrdC5jbGllbnRDb25maWcrJyIgY29uZmlndXJhdGlvbi4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrZVt0LmNsaWVudENvbmZpZ10rJyIuJ30pKSlyZXR1cm4gaTtpZighci51dGlsLmlzTm9kZSgpKXJldHVybiBpO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmVudix0LmVudikmJihpPW8obi5lbnZbdC5lbnZdLHtjb2RlOiJJbnZhbGlkRW52aXJvbm1lbnRhbFZhcmlhYmxlIixtZXNzYWdlOiJpbnZhbGlkICIrdC5lbnYrJyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytuLmVudlt0LmVudl0rJyIuJ30pKSlyZXR1cm4gaTt2YXIgcz17fTt0cnl7cz1yLnV0aWwuZ2V0UHJvZmlsZXNGcm9tU2hhcmVkQ29uZmlnKHIudXRpbC5pbmlMb2FkZXIpW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfWNhdGNoKGUpe31yZXR1cm4gcyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsdC5zaGFyZWRDb25maWcpJiYoaT1vKHNbdC5zaGFyZWRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZToiaW52YWxpZCAiK3Quc2hhcmVkQ29uZmlnKycgcHJvZmlsZSBjb25maWcuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK3NbdC5zaGFyZWRDb25maWddKyciLid9KSksaX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksX3Byb2Nlc3M6OTF9XSwxOTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt1dGlsOmUoIi4vdXRpbCIpfTsoe30pLnRvU3RyaW5nKCksdC5leHBvcnRzPXIsci51dGlsLnVwZGF0ZShyLHtWRVJTSU9OOiIyLjE0NTUuMCIsU2lnbmVyczp7fSxQcm90b2NvbDp7SnNvbjplKCIuL3Byb3RvY29sL2pzb24iKSxRdWVyeTplKCIuL3Byb3RvY29sL3F1ZXJ5IiksUmVzdDplKCIuL3Byb3RvY29sL3Jlc3QiKSxSZXN0SnNvbjplKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpLFJlc3RYbWw6ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpfSxYTUw6e0J1aWxkZXI6ZSgiLi94bWwvYnVpbGRlciIpLFBhcnNlcjpudWxsfSxKU09OOntCdWlsZGVyOmUoIi4vanNvbi9idWlsZGVyIiksUGFyc2VyOmUoIi4vanNvbi9wYXJzZXIiKX0sTW9kZWw6e0FwaTplKCIuL21vZGVsL2FwaSIpLE9wZXJhdGlvbjplKCIuL21vZGVsL29wZXJhdGlvbiIpLFNoYXBlOmUoIi4vbW9kZWwvc2hhcGUiKSxQYWdpbmF0b3I6ZSgiLi9tb2RlbC9wYWdpbmF0b3IiKSxSZXNvdXJjZVdhaXRlcjplKCIuL21vZGVsL3Jlc291cmNlX3dhaXRlciIpfSxhcGlMb2FkZXI6ZSgiLi9hcGlfbG9hZGVyIiksRW5kcG9pbnRDYWNoZTplKCIuLi92ZW5kb3IvZW5kcG9pbnQtY2FjaGUiKS5FbmRwb2ludENhY2hlfSksZSgiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIiksZSgiLi9zZXJ2aWNlIiksZSgiLi9jb25maWciKSxlKCIuL2h0dHAiKSxlKCIuL2V2ZW50X2xpc3RlbmVycyIpLGUoIi4vcmVxdWVzdCIpLGUoIi4vcmVzcG9uc2UiKSxlKCIuL3Jlc291cmNlX3dhaXRlciIpLGUoIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciIpLGUoIi4vcGFyYW1fdmFsaWRhdG9yIiksZSgiLi9tYWludGVuYW5jZV9tb2RlX21lc3NhZ2UiKSxyLmV2ZW50cz1uZXcgci5TZXF1ZW50aWFsRXhlY3V0b3Isci51dGlsLm1lbW9pemVkUHJvcGVydHkociwiZW5kcG9pbnRDYWNoZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByLkVuZHBvaW50Q2FjaGUoci5jb25maWcuZW5kcG9pbnRDYWNoZVNpemUpfSksITApfSx7Ii4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSI6MTExLCIuL2FwaV9sb2FkZXIiOjksIi4vY29uZmlnIjoxNywiLi9ldmVudF9saXN0ZW5lcnMiOjM0LCIuL2h0dHAiOjM1LCIuL2pzb24vYnVpbGRlciI6MzcsIi4vanNvbi9wYXJzZXIiOjM4LCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSI6MzksIi4vbW9kZWwvYXBpIjo0MCwiLi9tb2RlbC9vcGVyYXRpb24iOjQyLCIuL21vZGVsL3BhZ2luYXRvciI6NDMsIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9tb2RlbC9zaGFwZSI6NDUsIi4vcGFyYW1fdmFsaWRhdG9yIjo0NiwiLi9wcm90b2NvbC9qc29uIjo0OCwiLi9wcm90b2NvbC9xdWVyeSI6NDksIi4vcHJvdG9jb2wvcmVzdCI6NTAsIi4vcHJvdG9jb2wvcmVzdF9qc29uIjo1MSwiLi9wcm90b2NvbC9yZXN0X3htbCI6NTIsIi4vcmVxdWVzdCI6NTgsIi4vcmVzb3VyY2Vfd2FpdGVyIjo1OSwiLi9yZXNwb25zZSI6NjAsIi4vc2VxdWVudGlhbF9leGVjdXRvciI6NjEsIi4vc2VydmljZSI6NjIsIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciI6NjYsIi4vdXRpbCI6NzQsIi4veG1sL2J1aWxkZXIiOjc2fV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLkNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2VjcmV0QWNjZXNzS2V5Il0pLHRoaXMuZXhwaXJlZD0hMSx0aGlzLmV4cGlyZVRpbWU9bnVsbCx0aGlzLnJlZnJlc2hDYWxsYmFja3M9W10sMT09PWFyZ3VtZW50cy5sZW5ndGgmJiJvYmplY3QiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF0uY3JlZGVudGlhbHN8fGFyZ3VtZW50c1swXTt0aGlzLmFjY2Vzc0tleUlkPWUuYWNjZXNzS2V5SWQsdGhpcy5zZWNyZXRBY2Nlc3NLZXk9ZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zZXNzaW9uVG9rZW49ZS5zZXNzaW9uVG9rZW59ZWxzZSB0aGlzLmFjY2Vzc0tleUlkPWFyZ3VtZW50c1swXSx0aGlzLnNlY3JldEFjY2Vzc0tleT1hcmd1bWVudHNbMV0sdGhpcy5zZXNzaW9uVG9rZW49YXJndW1lbnRzWzJdfSxleHBpcnlXaW5kb3c6MTUsbmVlZHNSZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpLmdldFRpbWUoKSx0PW5ldyBEYXRlKGUrMWUzKnRoaXMuZXhwaXJ5V2luZG93KTtyZXR1cm4hISh0aGlzLmV4cGlyZVRpbWUmJnQ+dGhpcy5leHBpcmVUaW1lKXx8dGhpcy5leHBpcmVkfHwhdGhpcy5hY2Nlc3NLZXlJZHx8IXRoaXMuc2VjcmV0QWNjZXNzS2V5fSxnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLm5lZWRzUmVmcmVzaCgpP3RoaXMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZXhwaXJlZD0hMSksZSYmZShuKX0pKTplJiZlKCl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5leHBpcmVkPSExLGUoKX0sY29hbGVzY2VSZWZyZXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczsxPT09bi5yZWZyZXNoQ2FsbGJhY2tzLnB1c2goZSkmJm4ubG9hZCgoZnVuY3Rpb24oZSl7ci51dGlsLmFycmF5RWFjaChuLnJlZnJlc2hDYWxsYmFja3MsKGZ1bmN0aW9uKG4pe3Q/bihlKTpyLnV0aWwuZGVmZXIoKGZ1bmN0aW9uKCl7bihlKX0pKX0pKSxuLnJlZnJlc2hDYWxsYmFja3MubGVuZ3RoPTB9KSl9LGxvYWQ6ZnVuY3Rpb24oZSl7ZSgpfX0pLHIuQ3JlZGVudGlhbHMuYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLmdldFByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgiZ2V0IixlKSx0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZWZyZXNoIixlKX0sci5DcmVkZW50aWFscy5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5nZXRQcm9taXNlLGRlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbHMpfSx7Ii4vY29yZSI6MTl9XSwyMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5DaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksZT1lfHx7fSx0aGlzLmVycm9yQ29kZT0iQ2hhaW5hYmxlVGVtcG9yYXJ5Q3JlZGVudGlhbHNQcm92aWRlckZhaWx1cmUiLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnRva2VuQ29kZUZuPW51bGw7dmFyIHQ9ci51dGlsLmNvcHkoZS5wYXJhbXMpfHx7fTtpZih0LlJvbGVBcm4mJih0LlJvbGVTZXNzaW9uTmFtZT10LlJvbGVTZXNzaW9uTmFtZXx8InRlbXBvcmFyeS1jcmVkZW50aWFscyIpLHQuU2VyaWFsTnVtYmVyKXtpZighZS50b2tlbkNvZGVGbnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9rZW5Db2RlRm4pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3IoInRva2VuQ29kZUZuIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHBhcmFtcy5TZXJpYWxOdW1iZXIgaXMgZ2l2ZW4iKSx7Y29kZTp0aGlzLmVycm9yQ29kZX0pO3RoaXMudG9rZW5Db2RlRm49ZS50b2tlbkNvZGVGbn12YXIgbj1yLnV0aWwubWVyZ2Uoe3BhcmFtczp0LGNyZWRlbnRpYWxzOmUubWFzdGVyQ3JlZGVudGlhbHN8fHIuY29uZmlnLmNyZWRlbnRpYWxzfSxlLnN0c0NvbmZpZ3x8e30pO3RoaXMuc2VydmljZT1uZXcgbyhuKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LnNlcnZpY2UuY29uZmlnLnBhcmFtcy5Sb2xlQXJuPyJhc3N1bWVSb2xlIjoiZ2V0U2Vzc2lvblRva2VuIjt0aGlzLmdldFRva2VuQ29kZSgoZnVuY3Rpb24ocixvKXt2YXIgaT17fTtyP2Uocik6KG8mJihpLlRva2VuQ29kZT1vKSx0LnNlcnZpY2Vbbl0oaSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKSl9KSl9LGdldFRva2VuQ29kZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMudG9rZW5Db2RlRm4/dGhpcy50b2tlbkNvZGVGbih0aGlzLnNlcnZpY2UuY29uZmlnLnBhcmFtcy5TZXJpYWxOdW1iZXIsKGZ1bmN0aW9uKG4sbyl7aWYobil7dmFyIGk9bjtyZXR1cm4gbiBpbnN0YW5jZW9mIEVycm9yJiYoaT1uLm1lc3NhZ2UpLHZvaWQgZShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJFcnJvciBmZXRjaGluZyBNRkEgdG9rZW46ICIraSkse2NvZGU6dC5lcnJvckNvZGV9KSl9ZShudWxsLG8pfSkpOmUobnVsbCl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL2NvZ25pdG9pZGVudGl0eSIpLGk9ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNvZ25pdG9JZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2xvY2FsU3RvcmFnZUtleTp7aWQ6ImF3cy5jb2duaXRvLmlkZW50aXR5LWlkLiIscHJvdmlkZXJzOiJhd3MuY29nbml0by5pZGVudGl0eS1wcm92aWRlcnMuIn0sY29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5kYXRhPW51bGwsdGhpcy5faWRlbnRpdHlJZD1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSksdGhpcy5sb2FkQ2FjaGVkSWQoKTt2YXIgbj10aGlzO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZGVudGl0eUlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZENhY2hlZElkKCksbi5faWRlbnRpdHlJZHx8bi5wYXJhbXMuSWRlbnRpdHlJZH0sc2V0OmZ1bmN0aW9uKGUpe24uX2lkZW50aXR5SWQ9ZX19KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5kYXRhPW51bGwsdC5faWRlbnRpdHlJZD1udWxsLHQuZ2V0SWQoKGZ1bmN0aW9uKG4pe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKTp0LnBhcmFtcy5Sb2xlQXJuP3QuZ2V0Q3JlZGVudGlhbHNGcm9tU1RTKGUpOnQuZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eShlKX0pKX0sY2xlYXJDYWNoZWRJZDpmdW5jdGlvbigpe3RoaXMuX2lkZW50aXR5SWQ9bnVsbCxkZWxldGUgdGhpcy5wYXJhbXMuSWRlbnRpdHlJZDt2YXIgZT10aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCx0PXRoaXMucGFyYW1zLkxvZ2luSWR8fCIiO2RlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkuaWQrZSt0XSxkZWxldGUgdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5LnByb3ZpZGVycytlK3RdfSxjbGVhcklkT25Ob3RBdXRob3JpemVkOmZ1bmN0aW9uKGUpeyJOb3RBdXRob3JpemVkRXhjZXB0aW9uIj09ZS5jb2RlJiZ0aGlzLmNsZWFyQ2FjaGVkSWQoKX0sZ2V0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigic3RyaW5nIj09dHlwZW9mIHQucGFyYW1zLklkZW50aXR5SWQpcmV0dXJuIGUobnVsbCx0LnBhcmFtcy5JZGVudGl0eUlkKTt0LmNvZ25pdG8uZ2V0SWQoKGZ1bmN0aW9uKG4scil7IW4mJnIuSWRlbnRpdHlJZD8odC5wYXJhbXMuSWRlbnRpdHlJZD1yLklkZW50aXR5SWQsZShudWxsLHIuSWRlbnRpdHlJZCkpOmUobil9KSl9LGxvYWRDcmVkZW50aWFsczpmdW5jdGlvbihlLHQpe2UmJnQmJih0LmV4cGlyZWQ9ITEsdC5hY2Nlc3NLZXlJZD1lLkNyZWRlbnRpYWxzLkFjY2Vzc0tleUlkLHQuc2VjcmV0QWNjZXNzS2V5PWUuQ3JlZGVudGlhbHMuU2VjcmV0S2V5LHQuc2Vzc2lvblRva2VuPWUuQ3JlZGVudGlhbHMuU2Vzc2lvblRva2VuLHQuZXhwaXJlVGltZT1lLkNyZWRlbnRpYWxzLkV4cGlyYXRpb24pfSxnZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7bj90LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobik6KHQuY2FjaGVJZChyKSx0LmRhdGE9cix0LmxvYWRDcmVkZW50aWFscyh0LmRhdGEsdCkpLGUobil9KSl9LGdldENyZWRlbnRpYWxzRnJvbVNUUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY29nbml0by5nZXRPcGVuSWRUb2tlbigoZnVuY3Rpb24obixyKXtuPyh0LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobiksZShuKSk6KHQuY2FjaGVJZChyKSx0LnBhcmFtcy5XZWJJZGVudGl0eVRva2VuPXIuVG9rZW4sdC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLnJlZnJlc2goKGZ1bmN0aW9uKG4pe258fCh0LmRhdGE9dC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLmRhdGEsdC5zdHMuY3JlZGVudGlhbHNGcm9tKHQuZGF0YSx0KSksZShuKX0pKSl9KSl9LGxvYWRDYWNoZWRJZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoci51dGlsLmlzQnJvd3NlcigpJiYhZS5wYXJhbXMuSWRlbnRpdHlJZCl7dmFyIHQ9ZS5nZXRTdG9yYWdlKCJpZCIpO2lmKHQmJmUucGFyYW1zLkxvZ2lucyl7dmFyIG49T2JqZWN0LmtleXMoZS5wYXJhbXMuTG9naW5zKTswIT09KGUuZ2V0U3RvcmFnZSgicHJvdmlkZXJzIil8fCIiKS5zcGxpdCgiLCIpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KSkubGVuZ3RoJiYoZS5wYXJhbXMuSWRlbnRpdHlJZD10KX1lbHNlIHQmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NsaWVudENvbmZpZztpZih0aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHM9dGhpcy53ZWJJZGVudGl0eUNyZWRlbnRpYWxzfHxuZXcgci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzKHRoaXMucGFyYW1zLGUpLCF0aGlzLmNvZ25pdG8pe3ZhciB0PXIudXRpbC5tZXJnZSh7fSxlKTt0LnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLmNvZ25pdG89bmV3IG8odCl9dGhpcy5zdHM9dGhpcy5zdHN8fG5ldyBpKGUpfSxjYWNoZUlkOmZ1bmN0aW9uKGUpe3RoaXMuX2lkZW50aXR5SWQ9ZS5JZGVudGl0eUlkLHRoaXMucGFyYW1zLklkZW50aXR5SWQ9dGhpcy5faWRlbnRpdHlJZCxyLnV0aWwuaXNCcm93c2VyKCkmJih0aGlzLnNldFN0b3JhZ2UoImlkIixlLklkZW50aXR5SWQpLHRoaXMucGFyYW1zLkxvZ2lucyYmdGhpcy5zZXRTdG9yYWdlKCJwcm92aWRlcnMiLE9iamVjdC5rZXlzKHRoaXMucGFyYW1zLkxvZ2lucykuam9pbigiLCIpKSl9LGdldFN0b3JhZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXX0sc2V0U3RvcmFnZTpmdW5jdGlvbihlLHQpe3RyeXt0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXlbZV0rdGhpcy5wYXJhbXMuSWRlbnRpdHlQb29sSWQrKHRoaXMucGFyYW1zLkxvZ2luSWR8fCIiKV09dH1jYXRjaChlKXt9fSxzdG9yYWdlOmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXIudXRpbC5pc0Jyb3dzZXIoKSYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2UmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZT93aW5kb3cubG9jYWxTdG9yYWdlOnt9O3JldHVybiBlWyJhd3MudGVzdC1zdG9yYWdlIl09ImZvb2JhciIsZGVsZXRlIGVbImF3cy50ZXN0LXN0b3JhZ2UiXSxlfWNhdGNoKGUpe3JldHVybnt9fX0oKX0pfSx7Ii4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5Ijo3LCIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucHJvdmlkZXJzPWV8fHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycy5zbGljZSgwKSx0aGlzLnJlc29sdmVDYWxsYmFja3M9W119LHJlc29sdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigwPT09dC5wcm92aWRlcnMubGVuZ3RoKXJldHVybiBlKG5ldyBFcnJvcigiTm8gcHJvdmlkZXJzIikpLHQ7aWYoMT09PXQucmVzb2x2ZUNhbGxiYWNrcy5wdXNoKGUpKXt2YXIgbj0wLG89dC5wcm92aWRlcnMuc2xpY2UoMCk7IWZ1bmN0aW9uIGUoaSxzKXtpZighaSYmc3x8bj09PW8ubGVuZ3RoKXJldHVybiByLnV0aWwuYXJyYXlFYWNoKHQucmVzb2x2ZUNhbGxiYWNrcywoZnVuY3Rpb24oZSl7ZShpLHMpfSkpLHZvaWQodC5yZXNvbHZlQ2FsbGJhY2tzLmxlbmd0aD0wKTt2YXIgYT1vW24rK107KHM9ImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5jYWxsKCk6YSkuZ2V0P3MuZ2V0KChmdW5jdGlvbih0KXtlKHQsdD9udWxsOnMpfSkpOmUobnVsbCxzKX0oKX1yZXR1cm4gdH19KSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlZmF1bHRQcm92aWRlcnM9W10sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgicmVzb2x2ZSIsZSl9LHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2V9LHIudXRpbC5hZGRQcm9taXNlcyhyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluKX0seyIuLi9jb3JlIjoxOX1dLDI0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLlNBTUxDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFNBTUwoKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt0aGlzLnNlcnZpY2U9dGhpcy5zZXJ2aWNlfHxuZXcgbyh7cGFyYW1zOnRoaXMucGFyYW1zfSl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuVGVtcG9yYXJ5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5sb2FkTWFzdGVyQ3JlZGVudGlhbHModCksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV8fHt9LHRoaXMucGFyYW1zLlJvbGVBcm4mJih0aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWU9dGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQubWFzdGVyQ3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbigpe3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHM9dC5tYXN0ZXJDcmVkZW50aWFscywodC5wYXJhbXMuUm9sZUFybj90LnNlcnZpY2UuYXNzdW1lUm9sZTp0LnNlcnZpY2UuZ2V0U2Vzc2lvblRva2VuKS5jYWxsKHQuc2VydmljZSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0pKX0sbG9hZE1hc3RlckNyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe2Zvcih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPWV8fHIuY29uZmlnLmNyZWRlbnRpYWxzO3RoaXMubWFzdGVyQ3JlZGVudGlhbHMubWFzdGVyQ3JlZGVudGlhbHM7KXRoaXMubWFzdGVyQ3JlZGVudGlhbHM9dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczsiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5tYXN0ZXJDcmVkZW50aWFscy5nZXQmJih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPW5ldyByLkNyZWRlbnRpYWxzKHRoaXMubWFzdGVyQ3JlZGVudGlhbHMpKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lLHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ3ZWItaWRlbnRpdHkiLHRoaXMuZGF0YT1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5KChmdW5jdGlvbihuLHIpe3QuZGF0YT1udWxsLG58fCh0LmRhdGE9cix0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCkpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5zZXJ2aWNlKXt2YXIgZT1yLnV0aWwubWVyZ2Uoe30sdGhpcy5fY2xpZW50Q29uZmlnKTtlLnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLnNlcnZpY2U9bmV3IG8oZSl9fX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI3OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi91dGlsIiksaT1bIkFXU19FTkFCTEVfRU5EUE9JTlRfRElTQ09WRVJZIiwiQVdTX0VORFBPSU5UX0RJU0NPVkVSWV9FTkFCTEVEIl07ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaXx8e30scj0obi5vcGVyYXRpb25zLHt9KTtyZXR1cm4gdC5jb25maWcucmVnaW9uJiYoci5yZWdpb249dC5jb25maWcucmVnaW9uKSxuLnNlcnZpY2VJZCYmKHIuc2VydmljZUlkPW4uc2VydmljZUlkKSx0LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKHIuYWNjZXNzS2V5SWQ9dC5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHJ9ZnVuY3Rpb24gYShlLHQsbil7biYmbnVsbCE9dCYmInN0cnVjdHVyZSI9PT1uLnR5cGUmJm4ucmVxdWlyZWQmJm4ucmVxdWlyZWQubGVuZ3RoPjAmJm8uYXJyYXlFYWNoKG4ucmVxdWlyZWQsKGZ1bmN0aW9uKHIpe3ZhciBvPW4ubWVtYmVyc1tyXTtpZighMD09PW8uZW5kcG9pbnREaXNjb3ZlcnlJZCl7dmFyIGk9by5pc0xvY2F0aW9uTmFtZT9vLm5hbWU6cjtlW2ldPVN0cmluZyh0W3JdKX1lbHNlIGEoZSx0W3JdLG8pfSkpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj17fTtyZXR1cm4gYShuLGUucGFyYW1zLHQpLG59ZnVuY3Rpb24gdShlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaSxpPW4ub3BlcmF0aW9ucz9uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCxhPWMoZSxpP2kuaW5wdXQ6dm9pZCAwKSx1PXMoZSk7T2JqZWN0LmtleXMoYSkubGVuZ3RoPjAmJih1PW8udXBkYXRlKHUsYSksaSYmKHUub3BlcmF0aW9uPWkubmFtZSkpO3ZhciBsPXIuZW5kcG9pbnRDYWNoZS5nZXQodSk7aWYoIWx8fDEhPT1sLmxlbmd0aHx8IiIhPT1sWzBdLkFkZHJlc3MpaWYobCYmbC5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGxbMF0uQWRkcmVzcyk7ZWxzZXt2YXIgcD10Lm1ha2VSZXF1ZXN0KG4uZW5kcG9pbnRPcGVyYXRpb24se09wZXJhdGlvbjppLm5hbWUsSWRlbnRpZmllcnM6YX0pO2QocCkscC5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxwLnJlbW92ZUxpc3RlbmVyKCJyZXRyeSIsci5FdmVudExpc3RlbmVycy5Db3JlLlJFVFJZX0NIRUNLKSxyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSkscC5zZW5kKChmdW5jdGlvbihlLHQpe3QmJnQuRW5kcG9pbnRzP3IuZW5kcG9pbnRDYWNoZS5wdXQodSx0LkVuZHBvaW50cyk6ZSYmci5lbmRwb2ludENhY2hlLnB1dCh1LFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczoxfV0pfSkpfX12YXIgbD17fTtmdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLGk9bi5hcGksYT1pLm9wZXJhdGlvbnM/aS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTp2b2lkIDAsdT1hP2EuaW5wdXQ6dm9pZCAwLHA9YyhlLHUpLGg9cyhlKTtPYmplY3Qua2V5cyhwKS5sZW5ndGg+MCYmKGg9by51cGRhdGUoaCxwKSxhJiYoaC5vcGVyYXRpb249YS5uYW1lKSk7dmFyIGY9ci5FbmRwb2ludENhY2hlLmdldEtleVN0cmluZyhoKSxnPXIuZW5kcG9pbnRDYWNoZS5nZXQoZik7aWYoZyYmMT09PWcubGVuZ3RoJiYiIj09PWdbMF0uQWRkcmVzcylyZXR1cm4gbFtmXXx8KGxbZl09W10pLHZvaWQgbFtmXS5wdXNoKHtyZXF1ZXN0OmUsY2FsbGJhY2s6dH0pO2lmKGcmJmcubGVuZ3RoPjApZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChnWzBdLkFkZHJlc3MpLHQoKTtlbHNle3ZhciBtPW4ubWFrZVJlcXVlc3QoaS5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmEubmFtZSxJZGVudGlmaWVyczpwfSk7bS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxkKG0pLHIuZW5kcG9pbnRDYWNoZS5wdXQoZixbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6NjB9XSksbS5zZW5kKChmdW5jdGlvbihuLGkpe2lmKG4pe2lmKGUucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGgpLGxbZl0pe3ZhciBzPWxbZl07by5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0LnJlc3BvbnNlLmVycm9yPW8uZXJyb3Iobix7cmV0cnlhYmxlOiExfSksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdfX1lbHNlIGkmJihyLmVuZHBvaW50Q2FjaGUucHV0KGYsaS5FbmRwb2ludHMpLGUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksbFtmXSkmJihzPWxbZl0sby5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGkuRW5kcG9pbnRzWzBdLkFkZHJlc3MpLGUuY2FsbGJhY2soKX0pKSxkZWxldGUgbFtmXSk7dCgpfSkpfX1mdW5jdGlvbiBkKGUpe3ZhciB0PWUuc2VydmljZS5hcGkuYXBpVmVyc2lvbjt0JiYhZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdJiYoZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdPXQpfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS5lcnJvcixuPWUuaHR0cFJlc3BvbnNlO2lmKHQmJigiSW52YWxpZEVuZHBvaW50RXhjZXB0aW9uIj09PXQuY29kZXx8NDIxPT09bi5zdGF0dXNDb2RlKSl7dmFyIGk9ZS5yZXF1ZXN0LGE9aS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSx1PWMoaSxhW2kub3BlcmF0aW9uXT9hW2kub3BlcmF0aW9uXS5pbnB1dDp2b2lkIDApLGw9cyhpKTtPYmplY3Qua2V5cyh1KS5sZW5ndGg+MCYmKGw9by51cGRhdGUobCx1KSxhW2kub3BlcmF0aW9uXSYmKGwub3BlcmF0aW9uPWFbaS5vcGVyYXRpb25dLm5hbWUpKSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGwpfX1mdW5jdGlvbiBmKGUpe3JldHVyblsiZmFsc2UiLCIwIl0uaW5kZXhPZihlKT49MH10LmV4cG9ydHM9e2Rpc2NvdmVyRW5kcG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgcz1lLnNlcnZpY2V8fHt9O2lmKGZ1bmN0aW9uKGUpe2lmKGUuX29yaWdpbmFsQ29uZmlnJiZlLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludCYmITA9PT1lLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkN1c3RvbSBlbmRwb2ludCBpcyBzdXBwbGllZDsgZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkIG11c3Qgbm90IGJlIHRydWUuIn0pO3ZhciB0PXIuY29uZmlnW2Uuc2VydmljZUlkZW50aWZpZXJdfHx7fTtyZXR1cm4gQm9vbGVhbihyLmNvbmZpZy5lbmRwb2ludHx8dC5lbmRwb2ludHx8ZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50KX0ocyl8fGUuaXNQcmVzaWduZWQoKSlyZXR1cm4gdCgpO3ZhciBhPShzLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9YT9hLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWQ6Ik5VTEwiLGw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlfHx7fTtpZih2b2lkIDAhPT10LmNvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpcmV0dXJuIHQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDtpZighby5pc0Jyb3dzZXIoKSl7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBhPWlbc107aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LGEpKXtpZigiIj09PW4uZW52W2FdfHx2b2lkIDA9PT1uLmVudlthXSl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAiK2ErIiBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYobi5lbnZbYV0pfX12YXIgYz17fTt0cnl7Yz1yLnV0aWwuaW5pTG9hZGVyP3IudXRpbC5pbmlMb2FkZXIubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W3IudXRpbC5zaGFyZWRDb25maWdGaWxlRW52XX0pOnt9fWNhdGNoKGUpe312YXIgdT1jW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSwiZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQiKSl7aWYodm9pZCAwPT09dS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiY29uZmlnIGZpbGUgZW50cnkgJ2VuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkJyBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYodS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl9fX0oZSksZD1zLmFwaS5oYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5O3N3aXRjaCgobHx8ZCkmJmUuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImVuZHBvaW50LWRpc2NvdmVyeSIpLGMpe2Nhc2UiT1BUSU9OQUwiOihsfHxkKSYmKHUoZSksZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpKSx0KCk7YnJlYWs7Y2FzZSJSRVFVSVJFRCI6aWYoITE9PT1sKXtlLnJlc3BvbnNlLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJFbmRwb2ludCBEaXNjb3ZlcnkgaXMgZGlzYWJsZWQgYnV0ICIrcy5hcGkuY2xhc3NOYW1lKyIuIitlLm9wZXJhdGlvbisiKCkgcmVxdWlyZXMgaXQuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb25zLiJ9KSx0KCk7YnJlYWt9ZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpLHAoZSx0KTticmVhaztkZWZhdWx0OnQoKX19LHJlcXVpcmVkRGlzY292ZXJFbmRwb2ludDpwLG9wdGlvbmFsRGlzY292ZXJFbmRwb2ludDp1LG1hcnNoYWxsQ3VzdG9tSWRlbnRpZmllcnM6YyxnZXRDYWNoZUtleTpzLGludmFsaWRhdGVDYWNoZWRFbmRwb2ludDpofX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi91dGlsIjo3NCxfcHJvY2Vzczo5MX1dLDI4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciIpLmV2ZW50TWVzc2FnZUNodW5rZXIsbz1lKCIuL3BhcnNlLWV2ZW50IikucGFyc2VFdmVudDt0LmV4cG9ydHM9e2NyZWF0ZUV2ZW50U3RyZWFtOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9cihlKSxzPVtdLGE9MDthPGkubGVuZ3RoO2ErKylzLnB1c2gobyh0LGlbYV0sbikpO3JldHVybiBzfX19LHsiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciI6MjksIi4vcGFyc2UtZXZlbnQiOjMxfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2V2ZW50TWVzc2FnZUNodW5rZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9ZS5yZWFkSW50MzJCRShuKSxvPWUuc2xpY2UobixyK24pO24rPXIsdC5wdXNoKG8pfXJldHVybiB0fX19LHt9XSwzMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7ZnVuY3Rpb24gaShlKXtpZig4IT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnQ2NCBidWZmZXJzIG11c3QgYmUgZXhhY3RseSA4IGJ5dGVzIik7ci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLHRoaXMuYnl0ZXM9ZX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdD0wO3Q8ODt0KyspZVt0XV49MjU1O2Zvcih0PTc7dD4tMSYmKGVbdF0rKywwPT09ZVt0XSk7dC0tKTt9aS5mcm9tTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKGU+MHg4MDAwMDAwMDAwMDAwMDAwfHxlPC0weDgwMDAwMDAwMDAwMDAwMDApdGhyb3cgbmV3IEVycm9yKGUrIiBpcyB0b28gbGFyZ2UgKG9yLCBpZiBuZWdhdGl2ZSwgdG9vIHNtYWxsKSB0byByZXByZXNlbnQgYXMgYW4gSW50NjQiKTtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoOCksbj03LHI9TWF0aC5hYnMoTWF0aC5yb3VuZChlKSk7bj4tMSYmcj4wO24tLSxyLz0yNTYpdFtuXT1yO3JldHVybiBlPDAmJnModCksbmV3IGkodCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ5dGVzLnNsaWNlKDApLHQ9MTI4JmVbMF07cmV0dXJuIHQmJnMoZSkscGFyc2VJbnQoZS50b1N0cmluZygiaGV4IiksMTYpKih0Py0xOjEpfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy52YWx1ZU9mKCkpfSx0LmV4cG9ydHM9e0ludDY0Oml9fSx7Ii4uL2NvcmUiOjE5fV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3BhcnNlLW1lc3NhZ2UiKS5wYXJzZU1lc3NhZ2U7dC5leHBvcnRzPXtwYXJzZUV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yKHQpLGk9by5oZWFkZXJzWyI6bWVzc2FnZS10eXBlIl07aWYoaSl7aWYoImVycm9yIj09PWkudmFsdWUpdGhyb3cgZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWFkZXJzWyI6ZXJyb3ItY29kZSJdLG49ZS5oZWFkZXJzWyI6ZXJyb3ItbWVzc2FnZSJdLHI9bmV3IEVycm9yKG4udmFsdWV8fG4pO3JldHVybiByLmNvZGU9ci5uYW1lPXQudmFsdWV8fHQscn0obyk7aWYoImV2ZW50IiE9PWkudmFsdWUpcmV0dXJufXZhciBzPW8uaGVhZGVyc1siOmV2ZW50LXR5cGUiXSxhPW4ubWVtYmVyc1tzLnZhbHVlXTtpZihhKXt2YXIgYz17fSx1PWEuZXZlbnRQYXlsb2FkTWVtYmVyTmFtZTtpZih1KXt2YXIgbD1hLm1lbWJlcnNbdV07ImJpbmFyeSI9PT1sLnR5cGU/Y1t1XT1vLmJvZHk6Y1t1XT1lLnBhcnNlKG8uYm9keS50b1N0cmluZygpLGwpfWZvcih2YXIgcD1hLmV2ZW50SGVhZGVyTWVtYmVyTmFtZXMsZD0wO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgaD1wW2RdO28uaGVhZGVyc1toXSYmKGNbaF09YS5tZW1iZXJzW2hdLnRvVHlwZShvLmhlYWRlcnNbaF0udmFsdWUpKX12YXIgZj17fTtyZXR1cm4gZltzLnZhbHVlXT1jLGZ9fX19LHsiLi9wYXJzZS1tZXNzYWdlIjozMn1dLDMyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9pbnQ2NCIpLkludDY0LG89ZSgiLi9zcGxpdC1tZXNzYWdlIikuc3BsaXRNZXNzYWdlLGk9ImJvb2xlYW4iLHM9ImJ5dGUiLGE9InNob3J0IixjPSJpbnRlZ2VyIix1PSJsb25nIixsPSJiaW5hcnkiLHA9InN0cmluZyIsZD0idGltZXN0YW1wIixoPSJ1dWlkIjtmdW5jdGlvbiBmKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDspe3ZhciBvPWUucmVhZFVJbnQ4KG4rKyksZj1lLnNsaWNlKG4sbitvKS50b1N0cmluZygpO3N3aXRjaChuKz1vLGUucmVhZFVJbnQ4KG4rKykpe2Nhc2UgMDp0W2ZdPXt0eXBlOmksdmFsdWU6ITB9O2JyZWFrO2Nhc2UgMTp0W2ZdPXt0eXBlOmksdmFsdWU6ITF9O2JyZWFrO2Nhc2UgMjp0W2ZdPXt0eXBlOnMsdmFsdWU6ZS5yZWFkSW50OChuKyspfTticmVhaztjYXNlIDM6dFtmXT17dHlwZTphLHZhbHVlOmUucmVhZEludDE2QkUobil9LG4rPTI7YnJlYWs7Y2FzZSA0OnRbZl09e3R5cGU6Yyx2YWx1ZTplLnJlYWRJbnQzMkJFKG4pfSxuKz00O2JyZWFrO2Nhc2UgNTp0W2ZdPXt0eXBlOnUsdmFsdWU6bmV3IHIoZS5zbGljZShuLG4rOCkpfSxuKz04O2JyZWFrO2Nhc2UgNjp2YXIgZz1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6bCx2YWx1ZTplLnNsaWNlKG4sbitnKX0sbis9ZzticmVhaztjYXNlIDc6dmFyIG09ZS5yZWFkVUludDE2QkUobik7bis9Mix0W2ZdPXt0eXBlOnAsdmFsdWU6ZS5zbGljZShuLG4rbSkudG9TdHJpbmcoKX0sbis9bTticmVhaztjYXNlIDg6dFtmXT17dHlwZTpkLHZhbHVlOm5ldyBEYXRlKG5ldyByKGUuc2xpY2UobixuKzgpKS52YWx1ZU9mKCkpfSxuKz04O2JyZWFrO2Nhc2UgOTp2YXIgdj1lLnNsaWNlKG4sbisxNikudG9TdHJpbmcoImhleCIpO24rPTE2LHRbZl09e3R5cGU6aCx2YWx1ZTp2LnN1YnN0cigwLDgpKyItIit2LnN1YnN0cig4LDQpKyItIit2LnN1YnN0cigxMiw0KSsiLSIrdi5zdWJzdHIoMTYsNCkrIi0iK3Yuc3Vic3RyKDIwKX07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBoZWFkZXIgdHlwZSB0YWciKX19cmV0dXJuIHR9dC5leHBvcnRzPXtwYXJzZU1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm57aGVhZGVyczpmKHQuaGVhZGVycyksYm9keTp0LmJvZHl9fX19LHsiLi9pbnQ2NCI6MzAsIi4vc3BsaXQtbWVzc2FnZSI6MzN9XSwzMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7dC5leHBvcnRzPXtzcGxpdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLGUubGVuZ3RoPDE2KXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgbWVzc2FnZSB0b28gc2hvcnQgdG8gYWNjb21tb2RhdGUgZXZlbnQgc3RyZWFtIG1lc3NhZ2Ugb3ZlcmhlYWQiKTtpZihlLmxlbmd0aCE9PWUucmVhZFVJbnQzMkJFKDApKXRocm93IG5ldyBFcnJvcigiUmVwb3J0ZWQgbWVzc2FnZSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGgiKTt2YXIgdD1lLnJlYWRVSW50MzJCRSg4KTtpZih0IT09ci5jcnlwdG8uY3JjMzIoZS5zbGljZSgwLDgpKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcmVsdWRlIGNoZWNrc3VtIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoIit0KyIpIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxjdWxhdGVkIENSQzMyIGNoZWNrc3VtLiIpO3ZhciBuPWUucmVhZFVJbnQzMkJFKGUubGVuZ3RoLTQpO2lmKG4hPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsZS5sZW5ndGgtNCkpKXRocm93IG5ldyBFcnJvcigiVGhlIG1lc3NhZ2UgY2hlY2tzdW0gZGlkIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgIituKTt2YXIgaT0xMitlLnJlYWRVSW50MzJCRSg0KTtyZXR1cm57aGVhZGVyczplLnNsaWNlKDEyLGkpLGJvZHk6ZS5zbGljZShpLGUubGVuZ3RoLTQpfX19fSx7Ii4uL2NvcmUiOjE5fV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxvPWUoIi4vZGlzY292ZXJfZW5kcG9pbnQiKS5kaXNjb3ZlckVuZHBvaW50O2Z1bmN0aW9uIGkoZSl7aWYoIWUuc2VydmljZS5hcGkub3BlcmF0aW9ucylyZXR1cm4iIjt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3JldHVybiB0P3QuYXV0aHR5cGU6IiJ9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2U7cmV0dXJuIHQuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjp0LmFwaS5zaWduYXR1cmVWZXJzaW9uP3QuYXBpLnNpZ25hdHVyZVZlcnNpb246aShlKX1uLkV2ZW50TGlzdGVuZXJzPXtDb3JlOnt9fSxuLkV2ZW50TGlzdGVuZXJzPXtDb3JlOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUscil7cigiVkFMSURBVEVfQ1JFREVOVElBTFMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUsdCl7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIWUuc2VydmljZS5jb25maWcuc2lnbmF0dXJlVmVyc2lvbilyZXR1cm4gdCgpOyJiZWFyZXIiIT09cyhlKT9lLnNlcnZpY2UuY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyKXtyJiYoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3Iocix7Y29kZToiQ3JlZGVudGlhbHNFcnJvciIsbWVzc2FnZToiTWlzc2luZyBjcmVkZW50aWFscyBpbiBjb25maWcsIGlmIHVzaW5nIEFXU19DT05GSUdfRklMRSwgc2V0IEFXU19TREtfTE9BRF9DT05GSUc9MSJ9KSksdCgpfSkpOmUuc2VydmljZS5jb25maWcuZ2V0VG9rZW4oKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJUb2tlbkVycm9yIn0pKSx0KCl9KSl9KSksZSgiVkFMSURBVEVfUkVHSU9OIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmlzR2xvYmFsRW5kcG9pbnQpe3ZhciB0PW5ldyBSZWdFeHAoL14oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSkkLyk7ZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24/dC50ZXN0KGUuc2VydmljZS5jb25maWcucmVnaW9uKXx8KGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6IkludmFsaWQgcmVnaW9uIGluIGNvbmZpZyJ9KSk6ZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiTWlzc2luZyByZWdpb24gaW4gY29uZmlnIn0pfX0pKSxlKCJCVUlMRF9JREVNUE9URU5DWV9UT0tFTlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj10LmlkZW1wb3RlbnRNZW1iZXJzO2lmKHIubGVuZ3RoKXtmb3IodmFyIG89bi51dGlsLmNvcHkoZS5wYXJhbXMpLGk9MCxzPXIubGVuZ3RoO2k8cztpKyspb1tyW2ldXXx8KG9bcltpXV09bi51dGlsLnV1aWQudjQoKSk7ZS5wYXJhbXM9b319fX0pKSxlKCJWQUxJREFURV9QQVJBTUVURVJTIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQscj1lLnNlcnZpY2UuY29uZmlnLnBhcmFtVmFsaWRhdGlvbjtuZXcgbi5QYXJhbVZhbGlkYXRvcihyKS52YWxpZGF0ZSh0LGUucGFyYW1zKX19KSksZSgiQ09NUFVURV9DSEVDS1NVTSIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYodCl7dmFyIHI9ZS5odHRwUmVxdWVzdC5ib2R5LG89ciYmKG4udXRpbC5CdWZmZXIuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2YgciksaT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnM7aWYodC5odHRwQ2hlY2tzdW1SZXF1aXJlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jb21wdXRlQ2hlY2tzdW1zJiZvJiYhaVsiQ29udGVudC1NRDUiXSl7dmFyIHM9bi51dGlsLmNyeXB0by5tZDUociwiYmFzZTY0Iik7aVsiQ29udGVudC1NRDUiXT1zfX19fSkpLHIoIkNPTVBVVEVfU0hBMjU2IiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUsdCl7aWYoZS5oYWx0SGFuZGxlcnNPbkVycm9yKCksZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgcj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89cj9yLmF1dGh0eXBlOiIiO2lmKCFlLnNlcnZpY2UuYXBpLnNpZ25hdHVyZVZlcnNpb24mJiFvJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7aWYoZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpPT09bi5TaWduZXJzLlY0KXt2YXIgaT1lLmh0dHBSZXF1ZXN0LmJvZHl8fCIiO2lmKG8uaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09IlVOU0lHTkVELVBBWUxPQUQiLHQoKTtuLnV0aWwuY29tcHV0ZVNoYTI1NihpLChmdW5jdGlvbihuLHIpe24/dChuKTooZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdPXIsdCgpKX0pKX1lbHNlIHQoKX19KSksZSgiU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1uLnV0aWwuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKTtpZih2b2lkIDA9PT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pdHJ5e3ZhciBvPW4udXRpbC5zdHJpbmcuYnl0ZUxlbmd0aChlLmh0dHBSZXF1ZXN0LmJvZHkpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXT1vfWNhdGNoKG4pe2lmKHImJnIuaXNTdHJlYW1pbmcpe2lmKHIucmVxdWlyZXNMZW5ndGgpdGhyb3cgbjtpZih0LmluZGV4T2YoInVuc2lnbmVkLWJvZHkiKT49MClyZXR1cm4gdm9pZChlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlRyYW5zZmVyLUVuY29kaW5nIl09ImNodW5rZWQiKTt0aHJvdyBufXRocm93IG59fSkpLGUoIlNFVF9IVFRQX0hPU1QiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0fSkpLGUoIlNFVF9UUkFDRV9JRCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXt2YXIgcj0iWC1BbXpuLVRyYWNlLUlkIjtpZihuLnV0aWwuaXNOb2RlKCkmJiFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMscikpe3ZhciBvPXQuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSxpPXQuZW52Ll9YX0FNWk5fVFJBQ0VfSUQ7InN0cmluZyI9PXR5cGVvZiBvJiZvLmxlbmd0aD4wJiYic3RyaW5nIj09dHlwZW9mIGkmJmkubGVuZ3RoPjAmJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbcl09aSl9fSkpLGUoIlJFU1RBUlQiLCJyZXN0YXJ0IiwoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlc3BvbnNlLmVycm9yO2UmJmUucmV0cnlhYmxlJiYodGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdCh0aGlzLnNlcnZpY2UuZW5kcG9pbnQsdGhpcy5zZXJ2aWNlLnJlZ2lvbiksdGhpcy5yZXNwb25zZS5yZXRyeUNvdW50PHRoaXMuc2VydmljZS5jb25maWcubWF4UmV0cmllcz90aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQrKzp0aGlzLnJlc3BvbnNlLmVycm9yPW51bGwpfSkpLHIoIkRJU0NPVkVSX0VORFBPSU5UIiwic2lnbiIsbywhMCkscigiU0lHTiIsInNpZ24iLChmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VydmljZSxyPXMoZSk7aWYoIXJ8fDA9PT1yLmxlbmd0aClyZXR1cm4gdCgpOyJiZWFyZXIiPT09cj9uLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlLnJlc3BvbnNlLmVycm9yPXIsdCgpO3RyeXtuZXcobi5nZXRTaWduZXJDbGFzcyhlKSkoZS5odHRwUmVxdWVzdCkuYWRkQXV0aG9yaXphdGlvbihvKX1jYXRjaCh0KXtlLnJlc3BvbnNlLmVycm9yPXR9dCgpfSkpOm4uY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e3ZhciBpPW4uZ2V0U2tld0NvcnJlY3RlZERhdGUoKSxzPW4uZ2V0U2lnbmVyQ2xhc3MoZSksYT0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9bmV3IHMoZS5odHRwUmVxdWVzdCxuLmdldFNpZ25pbmdOYW1lKGUpLHtzaWduYXR1cmVDYWNoZTpuLmNvbmZpZy5zaWduYXR1cmVDYWNoZSxvcGVyYXRpb246YSxzaWduYXR1cmVWZXJzaW9uOm4uYXBpLnNpZ25hdHVyZVZlcnNpb259KTtjLnNldFNlcnZpY2VDbGllbnRJZChuLl9jbGllbnRJZCksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuRGF0ZSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl0sYy5hZGRBdXRob3JpemF0aW9uKG8saSksZS5zaWduZWRBdD1pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSl9KSksZSgiVkFMSURBVEVfUkVTUE9OU0UiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlLnN1Y2Nlc3NmdWxSZXNwb25zZShlLHRoaXMpPyhlLmRhdGE9e30sZS5lcnJvcj1udWxsKTooZS5kYXRhPW51bGwsZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJVbmtub3duRXJyb3IiLG1lc3NhZ2U6IkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuIn0pKX0pKSxlKCJFUlJPUiIsImVycm9yIiwoZnVuY3Rpb24oZSx0KXtpZih0LnJlcXVlc3Quc2VydmljZS5hcGkuYXdzUXVlcnlDb21wYXRpYmxlKXt2YXIgbj10Lmh0dHBSZXNwb25zZS5oZWFkZXJzLHI9bj9uWyJ4LWFtem4tcXVlcnktZXJyb3IiXTp2b2lkIDA7ciYmci5pbmNsdWRlcygiOyIpJiYodC5lcnJvci5jb2RlPXIuc3BsaXQoIjsiKVswXSl9fSksITApLHIoIlNFTkQiLCJzZW5kIiwoZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKHIpe2UuaHR0cFJlc3BvbnNlLnN0cmVhbT1yO3ZhciBvPWUucmVxdWVzdC5odHRwUmVxdWVzdC5zdHJlYW0saT1lLnJlcXVlc3Quc2VydmljZSxzPWkuYXBpLGE9ZS5yZXF1ZXN0Lm9wZXJhdGlvbixjPXMub3BlcmF0aW9uc1thXXx8e307ci5vbigiaGVhZGVycyIsKGZ1bmN0aW9uKG8scyxhKXtpZihlLnJlcXVlc3QuZW1pdCgiaHR0cEhlYWRlcnMiLFtvLHMsZSxhXSksIWUuaHR0cFJlc3BvbnNlLnN0cmVhbWluZylpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKXtpZihjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm4gZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdm9pZCB0KCk7ci5vbigicmVhZGFibGUiLChmdW5jdGlvbigpe3ZhciB0PXIucmVhZCgpO251bGwhPT10JiZlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX1lbHNlIHIub24oImRhdGEiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX0pKSxyLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKCFvfHwhby5kaWRDYWxsYmFjayl7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbiYmYy5oYXNFdmVudE91dHB1dCYmaS5zdWNjZXNzZnVsUmVzcG9uc2UoZSkpcmV0dXJuO2UucmVxdWVzdC5lbWl0KCJodHRwRG9uZSIpLHQoKX19KSl9ZnVuY3Rpb24gbyhyKXtpZigiUmVxdWVzdEFib3J0ZWRFcnJvciIhPT1yLmNvZGUpe3ZhciBvPSJUaW1lb3V0RXJyb3IiPT09ci5jb2RlP3IuY29kZToiTmV0d29ya2luZ0Vycm9yIjtyPW4udXRpbC5lcnJvcihyLHtjb2RlOm8scmVnaW9uOmUucmVxdWVzdC5odHRwUmVxdWVzdC5yZWdpb24saG9zdG5hbWU6ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLHJldHJ5YWJsZTohMH0pfWUuZXJyb3I9cixlLnJlcXVlc3QuZW1pdCgiaHR0cEVycm9yIixbZS5lcnJvcixlXSwoZnVuY3Rpb24oKXt0KCl9KSl9ZnVuY3Rpb24gaSgpe3ZhciB0LGk9bi5IdHRwQ2xpZW50LmdldEluc3RhbmNlKCkscz1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuaHR0cE9wdGlvbnN8fHt9O3RyeXt2YXIgYT1pLmhhbmRsZVJlcXVlc3QoZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LHMscixvKTsodD1hKS5vbigic2VuZFByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBVcGxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpLHQub24oInJlY2VpdmVQcm9ncmVzcyIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpfWNhdGNoKGUpe28oZSl9fWUuaHR0cFJlc3BvbnNlLl9hYm9ydENhbGxiYWNrPXQsZS5lcnJvcj1udWxsLGUuZGF0YT1udWxsLChlLnJlcXVlc3Quc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLXRoaXMuc2lnbmVkQXQpLzFlMz49NjAwP3RoaXMuZW1pdCgic2lnbiIsW3RoaXNdLChmdW5jdGlvbihlKXtlP3QoZSk6aSgpfSkpOmkoKX0pKSxlKCJIVFRQX0hFQURFUlMiLCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKGUsdCxyLG8pe3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU9ZSxyLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlPW8sci5odHRwUmVzcG9uc2UuaGVhZGVycz10LHIuaHR0cFJlc3BvbnNlLmJvZHk9bi51dGlsLmJ1ZmZlci50b0J1ZmZlcigiIiksci5odHRwUmVzcG9uc2UuYnVmZmVycz1bXSxyLmh0dHBSZXNwb25zZS5udW1CeXRlcz0wO3ZhciBpPXQuZGF0ZXx8dC5EYXRlLHM9ci5yZXF1ZXN0LnNlcnZpY2U7aWYoaSl7dmFyIGE9RGF0ZS5wYXJzZShpKTtzLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiZzLmlzQ2xvY2tTa2V3ZWQoYSkmJnMuYXBwbHlDbG9ja09mZnNldChhKX19KSksZSgiSFRUUF9EQVRBIiwiaHR0cERhdGEiLChmdW5jdGlvbihlLHQpe2lmKGUpe2lmKG4udXRpbC5pc05vZGUoKSl7dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMrPWUubGVuZ3RoO3ZhciByPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0sbz17bG9hZGVkOnQuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLHRvdGFsOnJ9O3QucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW28sdF0pfXQuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMucHVzaChuLnV0aWwuYnVmZmVyLnRvQnVmZmVyKGUpKX19KSksZSgiSFRUUF9ET05FIiwiaHR0cERvbmUiLChmdW5jdGlvbihlKXtpZihlLmh0dHBSZXNwb25zZS5idWZmZXJzJiZlLmh0dHBSZXNwb25zZS5idWZmZXJzLmxlbmd0aD4wKXt2YXIgdD1uLnV0aWwuYnVmZmVyLmNvbmNhdChlLmh0dHBSZXNwb25zZS5idWZmZXJzKTtlLmh0dHBSZXNwb25zZS5ib2R5PXR9ZGVsZXRlIGUuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLGRlbGV0ZSBlLmh0dHBSZXNwb25zZS5idWZmZXJzfSkpLGUoIkZJTkFMSVpFX0VSUk9SIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYoZS5lcnJvci5zdGF0dXNDb2RlPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsdm9pZCAwPT09ZS5lcnJvci5yZXRyeWFibGUmJihlLmVycm9yLnJldHJ5YWJsZT10aGlzLnNlcnZpY2UucmV0cnlhYmxlRXJyb3IoZS5lcnJvcix0aGlzKSkpfSkpLGUoIklOVkFMSURBVEVfQ1JFREVOVElBTFMiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2lmKGUuZXJyb3Ipc3dpdGNoKGUuZXJyb3IuY29kZSl7Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJFeHBpcmVkVG9rZW5FeGNlcHRpb24iOmNhc2UiRXhwaXJlZFRva2VuIjplLmVycm9yLnJldHJ5YWJsZT0hMCxlLnJlcXVlc3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuZXhwaXJlZD0hMH19KSksZSgiRVhQSVJFRF9TSUdOQVRVUkUiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyb3I7dCYmInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJiJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiZ0LmNvZGUubWF0Y2goL1NpZ25hdHVyZS8pJiZ0Lm1lc3NhZ2UubWF0Y2goL2V4cGlyZWQvKSYmKGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJDTE9DS19TS0VXRUQiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJnRoaXMuc2VydmljZS5jbG9ja1NrZXdFcnJvcihlLmVycm9yKSYmdGhpcy5zZXJ2aWNlLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFRElSRUNUIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiZlLmVycm9yLnN0YXR1c0NvZGU+PTMwMCYmZS5lcnJvci5zdGF0dXNDb2RlPDQwMCYmZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiYmKHRoaXMuaHR0cFJlcXVlc3QuZW5kcG9pbnQ9bmV3IG4uRW5kcG9pbnQoZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiksdGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9dGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0LGUuZXJyb3IucmVkaXJlY3Q9ITAsZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiYoZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzP2UuZXJyb3IucmV0cnlEZWxheT0wOmUucmV0cnlDb3VudDxlLm1heFJldHJpZXMmJihlLmVycm9yLnJldHJ5RGVsYXk9dGhpcy5zZXJ2aWNlLnJldHJ5RGVsYXlzKGUucmV0cnlDb3VudCxlLmVycm9yKXx8MCkpfSkpLHIoIlJFU0VUX1JFVFJZX1NUQVRFIiwiYWZ0ZXJSZXRyeSIsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj0hMTtlLmVycm9yJiYobj1lLmVycm9yLnJldHJ5RGVsYXl8fDAsZS5lcnJvci5yZXRyeWFibGUmJmUucmV0cnlDb3VudDxlLm1heFJldHJpZXM/KGUucmV0cnlDb3VudCsrLHI9ITApOmUuZXJyb3IucmVkaXJlY3QmJmUucmVkaXJlY3RDb3VudDxlLm1heFJlZGlyZWN0cyYmKGUucmVkaXJlY3RDb3VudCsrLHI9ITApKSxyJiZuPj0wPyhlLmVycm9yPW51bGwsc2V0VGltZW91dCh0LG4pKTp0KCl9KSl9KSksQ29yZVBvc3Q6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiRVhUUkFDVF9SRVFVRVNUX0lEIiwiZXh0cmFjdERhdGEiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RXJyb3IiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFTk9URk9VTkRfRVJST1IiLCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXtpZigiTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZSYmZnVuY3Rpb24oZSl7cmV0dXJuIkVOT1RGT1VORCI9PT1lLmVycm5vfHwibnVtYmVyIj09dHlwZW9mIGUuZXJybm8mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lJiZbIkVBSV9OT05BTUUiLCJFQUlfTk9EQVRBIl0uaW5kZXhPZihuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lKGUuZXJybm8pPj0wKX0oZSkpe3ZhciB0PSJJbmFjY2Vzc2libGUgaG9zdDogYCIrZS5ob3N0bmFtZSsiJyBhdCBwb3J0IGAiK2UucG9ydCsiJy4gVGhpcyBzZXJ2aWNlIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBgIitlLnJlZ2lvbisiJyByZWdpb24uIjt0aGlzLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6IlVua25vd25FbmRwb2ludCIscmVnaW9uOmUucmVnaW9uLGhvc3RuYW1lOmUuaG9zdG5hbWUscmV0cnlhYmxlOiEwLG9yaWdpbmFsRXJyb3I6ZX0pfX0pKX0pKSxMb2dnZXI6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dCgiTE9HX1JFUVVFU1QiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3ZhciByPXQucmVxdWVzdCxvPXIuc2VydmljZS5jb25maWcubG9nZ2VyO2lmKG8pe3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGk9KHQucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLXIuc3RhcnRUaW1lLmdldFRpbWUoKSkvMWUzLGE9ISFvLmlzVFRZLGM9dC5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx1PXIucGFyYW1zO3Iuc2VydmljZS5hcGkub3BlcmF0aW9ucyYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXSYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXS5pbnB1dCYmKHU9cyhyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0LHIucGFyYW1zKSk7dmFyIGw9ZSgidXRpbCIpLmluc3BlY3QodSwhMCxudWxsKSxwPSIiO3JldHVybiBhJiYocCs9IhtbMzNtIikscCs9IltBV1MgIityLnNlcnZpY2Uuc2VydmljZUlkZW50aWZpZXIrIiAiK2MscCs9IiAiK2kudG9TdHJpbmcoKSsicyAiK3QucmV0cnlDb3VudCsiIHJldHJpZXNdIixhJiYocCs9IhtbMDsxbSIpLHArPSIgIituLnV0aWwuc3RyaW5nLmxvd2VyRmlyc3Qoci5vcGVyYXRpb24pLHArPSIoIitsKyIpIixhJiYocCs9IhtbMG0iKSxwfSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBvLmxvZz9vLmxvZyhpKToiZnVuY3Rpb24iPT10eXBlb2Ygby53cml0ZSYmby53cml0ZShpKyJcbiIpfWZ1bmN0aW9uIHMoZSx0KXtpZighdClyZXR1cm4gdDtpZihlLmlzU2Vuc2l0aXZlKXJldHVybiIqKipTZW5zaXRpdmVJbmZvcm1hdGlvbioqKiI7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnZhciByPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLm1lbWJlcnMsdCk/clt0XT1zKGUubWVtYmVyc1t0XSxuKTpyW3RdPW59KSkscjtjYXNlImxpc3QiOnZhciBvPVtdO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQsbil7by5wdXNoKHMoZS5tZW1iZXIsdCkpfSkpLG87Y2FzZSJtYXAiOnZhciBpPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe2lbdF09cyhlLnZhbHVlLG4pfSkpLGk7ZGVmYXVsdDpyZXR1cm4gdH19fSkpfSkpLEpzb246KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUmVzdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3QiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0SnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpLHQoIlVOU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsbi51bnNldENvbnRlbnRMZW5ndGgpfSkpLFJlc3RYbWw6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFF1ZXJ5OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcXVlcnkiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vZGlzY292ZXJfZW5kcG9pbnQiOjI3LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSxfcHJvY2Vzczo5MSx1dGlsOjg1fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuRW5kcG9pbnQ9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtpZihyLnV0aWwuaGlkZVByb3BlcnRpZXModGhpcyxbInNsYXNoZXMiLCJhdXRoIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5Il0pLG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGVuZHBvaW50OiAiK2UpO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gci51dGlsLmNvcHkoZSk7ZS5tYXRjaCgvXmh0dHAvKXx8KGU9KCh0JiZ2b2lkIDAhPT10LnNzbEVuYWJsZWQ/dC5zc2xFbmFibGVkOnIuY29uZmlnLnNzbEVuYWJsZWQpPyJodHRwcyI6Imh0dHAiKSsiOi8vIitlKSxyLnV0aWwudXBkYXRlKHRoaXMsci51dGlsLnVybFBhcnNlKGUpKSx0aGlzLnBvcnQ/dGhpcy5wb3J0PXBhcnNlSW50KHRoaXMucG9ydCwxMCk6dGhpcy5wb3J0PSJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODB9fSksci5IdHRwUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2U9bmV3IHIuRW5kcG9pbnQoZSksdGhpcy5tZXRob2Q9IlBPU1QiLHRoaXMucGF0aD1lLnBhdGh8fCIvIix0aGlzLmhlYWRlcnM9e30sdGhpcy5ib2R5PSIiLHRoaXMuZW5kcG9pbnQ9ZSx0aGlzLnJlZ2lvbj10LHRoaXMuX3VzZXJBZ2VudD0iIix0aGlzLnNldFVzZXJBZ2VudCgpfSxzZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXt0aGlzLl91c2VyQWdlbnQ9dGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT1yLnV0aWwudXNlckFnZW50KCl9LGdldFVzZXJBZ2VudEhlYWRlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4oci51dGlsLmlzQnJvd3NlcigpPyJYLUFtei0iOiIiKSsiVXNlci1BZ2VudCJ9LGFwcGVuZFRvVXNlckFnZW50OmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHRoaXMuX3VzZXJBZ2VudCs9IiAiK2UpLHRoaXMuaGVhZGVyc1t0aGlzLmdldFVzZXJBZ2VudEhlYWRlck5hbWUoKV09dGhpcy5fdXNlckFnZW50fSxnZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckFnZW50fSxwYXRobmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGguc3BsaXQoIj8iLDEpWzBdfSxzZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGguc3BsaXQoIj8iLDIpWzFdO3JldHVybiBlPyhlPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKGUpLHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKGUpKToiIn0sdXBkYXRlRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHIuRW5kcG9pbnQoZSk7dGhpcy5lbmRwb2ludD10LHRoaXMucGF0aD10LnBhdGh8fCIvIix0aGlzLmhlYWRlcnMuSG9zdCYmKHRoaXMuaGVhZGVycy5Ib3N0PXQuaG9zdCl9fSksci5IdHRwUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1c0NvZGU9dm9pZCAwLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuc3RyZWFtaW5nPSExLHRoaXMuc3RyZWFtPW51bGx9LGNyZWF0ZVVuYnVmZmVyZWRTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW1pbmc9ITAsdGhpcy5zdHJlYW19fSksci5IdHRwQ2xpZW50PW8oe30pLHIuSHR0cENsaWVudC5nZXRJbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLnNpbmdsZXRvbiYmKHRoaXMuc2luZ2xldG9uPW5ldyB0aGlzKSx0aGlzLnNpbmdsZXRvbn19LHsiLi9jb3JlIjoxOX1dLDM2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiZXZlbnRzIikuRXZlbnRFbWl0dGVyO2UoIi4uL2h0dHAiKSxyLlhIUkNsaWVudD1yLnV0aWwuaW5oZXJpdCh7aGFuZGxlUmVxdWVzdDpmdW5jdGlvbihlLHQsbixpKXt2YXIgcz10aGlzLGE9ZS5lbmRwb2ludCxjPW5ldyBvLHU9YS5wcm90b2NvbCsiLy8iK2EuaG9zdG5hbWU7ODAhPT1hLnBvcnQmJjQ0MyE9PWEucG9ydCYmKHUrPSI6IithLnBvcnQpLHUrPWUucGF0aDt2YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3QscD0hMTtlLnN0cmVhbT1sLGwuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uKCl7dHJ5e2lmKDA9PT1sLnN0YXR1cylyZXR1cm59Y2F0Y2goZSl7cmV0dXJufXRoaXMucmVhZHlTdGF0ZT49dGhpcy5IRUFERVJTX1JFQ0VJVkVEJiYhcCYmKGMuc3RhdHVzQ29kZT1sLnN0YXR1cyxjLmhlYWRlcnM9cy5wYXJzZUhlYWRlcnMobC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksYy5lbWl0KCJoZWFkZXJzIixjLnN0YXR1c0NvZGUsYy5oZWFkZXJzLGwuc3RhdHVzVGV4dCkscD0hMCksdGhpcy5yZWFkeVN0YXRlPT09dGhpcy5ET05FJiZzLmZpbmlzaFJlcXVlc3QobCxjKX0pLCExKSxsLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2MuZW1pdCgic2VuZFByb2dyZXNzIixlKX0pKSxsLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJyZWNlaXZlUHJvZ3Jlc3MiLGUpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJUaW1lb3V0Iikse2NvZGU6IlRpbWVvdXRFcnJvciJ9KSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJOZXR3b3JrIEZhaWx1cmUiKSx7Y29kZToiTmV0d29ya2luZ0Vycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIn0pKX0pLCExKSxuKGMpLGwub3BlbihlLm1ldGhvZCx1LCExIT09dC54aHJBc3luYyksci51dGlsLmVhY2goZS5oZWFkZXJzLChmdW5jdGlvbihlLHQpeyJDb250ZW50LUxlbmd0aCIhPT1lJiYiVXNlci1BZ2VudCIhPT1lJiYiSG9zdCIhPT1lJiZsLnNldFJlcXVlc3RIZWFkZXIoZSx0KX0pKSx0LnRpbWVvdXQmJiExIT09dC54aHJBc3luYyYmKGwudGltZW91dD10LnRpbWVvdXQpLHQueGhyV2l0aENyZWRlbnRpYWxzJiYobC53aXRoQ3JlZGVudGlhbHM9ITApO3RyeXtsLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIifWNhdGNoKGUpe310cnl7ZS5ib2R5P2wuc2VuZChlLmJvZHkpOmwuc2VuZCgpfWNhdGNoKHQpe2lmKCFlLmJvZHl8fCJvYmplY3QiIT10eXBlb2YgZS5ib2R5LmJ1ZmZlcil0aHJvdyB0O2wuc2VuZChlLmJvZHkuYnVmZmVyKX1yZXR1cm4gY30scGFyc2VIZWFkZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiByLnV0aWwuYXJyYXlFYWNoKGUuc3BsaXQoL1xyP1xuLyksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc3BsaXQoIjoiLDEpWzBdLHI9ZS5zdWJzdHJpbmcobi5sZW5ndGgrMik7bi5sZW5ndGg+MCYmKHRbbi50b0xvd2VyQ2FzZSgpXT1yKX0pKSx0fSxmaW5pc2hSZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoImFycmF5YnVmZmVyIj09PWUucmVzcG9uc2VUeXBlJiZlLnJlc3BvbnNlKXt2YXIgbz1lLnJlc3BvbnNlO249bmV3IHIudXRpbC5CdWZmZXIoby5ieXRlTGVuZ3RoKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkobykscz0wO3M8bi5sZW5ndGg7KytzKW5bc109aVtzXX10cnl7bnx8InN0cmluZyIhPXR5cGVvZiBlLnJlc3BvbnNlVGV4dHx8KG49bmV3IHIudXRpbC5CdWZmZXIoZS5yZXNwb25zZVRleHQpKX1jYXRjaChlKXt9biYmdC5lbWl0KCJkYXRhIixuKSx0LmVtaXQoImVuZCIpfX0pLHIuSHR0cENsaWVudC5wcm90b3R5cGU9ci5YSFJDbGllbnQucHJvdG90eXBlLHIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj0xfSx7Ii4uL2NvcmUiOjE5LCIuLi9odHRwIjozNSxldmVudHM6ODd9XSwzNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZudWxsIT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPXQubWVtYmVyc1tlXTtpZihvKXtpZigiYm9keSIhPT1vLmxvY2F0aW9uKXJldHVybjt2YXIgcz1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTplLGE9aShyLG8pO3ZvaWQgMCE9PWEmJihuW3NdPWEpfX0pKSxufShlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89aShyLHQudmFsdWUpO3ZvaWQgMCE9PW8mJihuW2VdPW8pfSkpLG59KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gci5hcnJheUVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9aShlLHQubWVtYmVyKTt2b2lkIDAhPT1yJiZuLnB1c2gocil9KSksbn0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvV2lyZUZvcm1hdChlKX0oZSx0KX19by5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaShlLHQpKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSwzODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZ2b2lkIDAhPT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e30sbz10Lm1lbWJlcnM7cmV0dXJuIHIuZWFjaChvLChmdW5jdGlvbih0LHIpe3ZhciBvPXIuaXNMb2NhdGlvbk5hbWU/ci5uYW1lOnQ7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykpe3ZhciBzPWkoZVtvXSxyKTt2b2lkIDAhPT1zJiYoblt0XT1zKX19KSksbn19KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7bltlXT12b2lkIDA9PT1vP251bGw6b30pKSxufX0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMD09PXI/bi5wdXNoKG51bGwpOm4ucHVzaChyKX0pKSxufX0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVHlwZShlKX0oZSx0KX19by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShKU09OLnBhcnNlKGUpLHQpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBuPVsiV2UgYXJlIGZvcm1hbGl6aW5nIG91ciBwbGFucyB0byBlbnRlciBBV1MgU0RLIGZvciBKYXZhU2NyaXB0ICh2MikgaW50byBtYWludGVuYW5jZSBtb2RlIGluIDIwMjMuXG4iLCJQbGVhc2UgbWlncmF0ZSB5b3VyIGNvZGUgdG8gdXNlIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYzKS4iLCJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgdGhlIG1pZ3JhdGlvbiBndWlkZSBhdCBodHRwczovL2EuY28vN1B6TUNjeSJdLmpvaW4oIlxuIik7dC5leHBvcnRzPXtzdXBwcmVzczohMX0sc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmV4cG9ydHMuc3VwcHJlc3N8fHZvaWQgMCE9PWUmJigib2JqZWN0Ij09dHlwZW9mIGUuZW52JiZ2b2lkIDAhPT1lLmVudi5BV1NfRVhFQ1VUSU9OX0VOViYmMD09PWUuZW52LkFXU19FWEVDVVRJT05fRU5WLmluZGV4T2YoIkFXU19MYW1iZGFfIil8fCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19TREtfSlNfU1VQUFJFU1NfTUFJTlRFTkFOQ0VfTU9ERV9NRVNTQUdFfHwiZnVuY3Rpb24iPT10eXBlb2YgZS5lbWl0V2FybmluZyYmZS5lbWl0V2FybmluZyhuLHt0eXBlOiJOT1RFIn0pKX0pLDApfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0se19wcm9jZXNzOjkxfV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvbGxlY3Rpb24iKSxvPWUoIi4vb3BlcmF0aW9uIiksaT1lKCIuL3NoYXBlIikscz1lKCIuL3BhZ2luYXRvciIpLGE9ZSgiLi9yZXNvdXJjZV93YWl0ZXIiKSxjPWUoIi4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiIpLHU9ZSgiLi4vdXRpbCIpLGw9dS5wcm9wZXJ0eSxwPXUubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2U9ZXx8e30sKHQ9dHx8e30pLmFwaT10aGlzLGUubWV0YWRhdGE9ZS5tZXRhZGF0YXx8e307dmFyIGQ9dC5zZXJ2aWNlSWRlbnRpZmllcjtkZWxldGUgdC5zZXJ2aWNlSWRlbnRpZmllcixsKHRoaXMsImlzQXBpIiwhMCwhMSksbCh0aGlzLCJhcGlWZXJzaW9uIixlLm1ldGFkYXRhLmFwaVZlcnNpb24pLGwodGhpcywiZW5kcG9pbnRQcmVmaXgiLGUubWV0YWRhdGEuZW5kcG9pbnRQcmVmaXgpLGwodGhpcywic2lnbmluZ05hbWUiLGUubWV0YWRhdGEuc2lnbmluZ05hbWUpLGwodGhpcywiZ2xvYmFsRW5kcG9pbnQiLGUubWV0YWRhdGEuZ2xvYmFsRW5kcG9pbnQpLGwodGhpcywic2lnbmF0dXJlVmVyc2lvbiIsZS5tZXRhZGF0YS5zaWduYXR1cmVWZXJzaW9uKSxsKHRoaXMsImpzb25WZXJzaW9uIixlLm1ldGFkYXRhLmpzb25WZXJzaW9uKSxsKHRoaXMsInRhcmdldFByZWZpeCIsZS5tZXRhZGF0YS50YXJnZXRQcmVmaXgpLGwodGhpcywicHJvdG9jb2wiLGUubWV0YWRhdGEucHJvdG9jb2wpLGwodGhpcywidGltZXN0YW1wRm9ybWF0IixlLm1ldGFkYXRhLnRpbWVzdGFtcEZvcm1hdCksbCh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUubWV0YWRhdGEueG1sTmFtZXNwYWNlKSxsKHRoaXMsImFiYnJldmlhdGlvbiIsZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9uKSxsKHRoaXMsImZ1bGxOYW1lIixlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZSksbCh0aGlzLCJzZXJ2aWNlSWQiLGUubWV0YWRhdGEuc2VydmljZUlkKSxkJiZjW2RdJiZsKHRoaXMsInhtbE5vRGVmYXVsdExpc3RzIixjW2RdLnhtbE5vRGVmYXVsdExpc3RzLCExKSxwKHRoaXMsImNsYXNzTmFtZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9ufHxlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZTtyZXR1cm4gdD8oIkVsYXN0aWNMb2FkQmFsYW5jaW5nIj09PSh0PXQucmVwbGFjZSgvXkFtYXpvbnxBV1Nccyp8XCguKnxccyt8XFcrL2csIiIpKSYmKHQ9IkVMQiIpLHQpOm51bGx9KSksbCh0aGlzLCJvcGVyYXRpb25zIixuZXcgcihlLm9wZXJhdGlvbnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IG8oZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCwoZnVuY3Rpb24oZSx0KXshMD09PXQuZW5kcG9pbnRvcGVyYXRpb24mJmwobiwiZW5kcG9pbnRPcGVyYXRpb24iLHUuc3RyaW5nLmxvd2VyRmlyc3QoZSkpLHQuZW5kcG9pbnRkaXNjb3ZlcnkmJiFuLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3ZlcnkmJmwobiwiaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSIsITA9PT10LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkKX0pKSksbCh0aGlzLCJzaGFwZXMiLG5ldyByKGUuc2hhcGVzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGkuY3JlYXRlKG4sdCl9KSkpLGwodGhpcywicGFnaW5hdG9ycyIsbmV3IHIoZS5wYWdpbmF0b3JzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBzKGUsbix0KX0pKSksbCh0aGlzLCJ3YWl0ZXJzIixuZXcgcihlLndhaXRlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IGEoZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCkpLHQuZG9jdW1lbnRhdGlvbiYmKGwodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxsKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGwodGhpcywiYXdzUXVlcnlDb21wYXRpYmxlIixlLm1ldGFkYXRhLmF3c1F1ZXJ5Q29tcGF0aWJsZSl9fSx7Ii4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiI6NCwiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDEsIi4vb3BlcmF0aW9uIjo0MiwiLi9wYWdpbmF0b3IiOjQzLCIuL3Jlc291cmNlX3dhaXRlciI6NDQsIi4vc2hhcGUiOjQ1fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIikubWVtb2l6ZWRQcm9wZXJ0eTtmdW5jdGlvbiBvKGUsdCxuLG8pe3IodGhpcyxvKGUpLChmdW5jdGlvbigpe3JldHVybiBuKGUsdCl9KSl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBzIGluIHI9cnx8U3RyaW5nLGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscykmJihvLmNhbGwodGhpcyxzLGVbc10sbixyKSxpJiZpKHMsZVtzXSkpfX0seyIuLi91dGlsIjo3NH1dLDQyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9zaGFwZSIpLG89ZSgiLi4vdXRpbCIpLGk9by5wcm9wZXJ0eSxzPW8ubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXM7bj1ufHx7fSxpKHRoaXMsIm5hbWUiLHQubmFtZXx8ZSksaSh0aGlzLCJhcGkiLG4uYXBpLCExKSx0Lmh0dHA9dC5odHRwfHx7fSxpKHRoaXMsImVuZHBvaW50Iix0LmVuZHBvaW50KSxpKHRoaXMsImh0dHBNZXRob2QiLHQuaHR0cC5tZXRob2R8fCJQT1NUIiksaSh0aGlzLCJodHRwUGF0aCIsdC5odHRwLnJlcXVlc3RVcml8fCIvIiksaSh0aGlzLCJhdXRodHlwZSIsdC5hdXRodHlwZXx8IiIpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZCIsdC5lbmRwb2ludGRpc2NvdmVyeT90LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkPyJSRVFVSVJFRCI6Ik9QVElPTkFMIjoiTlVMTCIpO3ZhciBhPXQuaHR0cENoZWNrc3VtUmVxdWlyZWR8fHQuaHR0cENoZWNrc3VtJiZ0Lmh0dHBDaGVja3N1bS5yZXF1ZXN0Q2hlY2tzdW1SZXF1aXJlZDtpKHRoaXMsImh0dHBDaGVja3N1bVJlcXVpcmVkIixhLCExKSxzKHRoaXMsImlucHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5pbnB1dD9yLmNyZWF0ZSh0LmlucHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJvdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiB0Lm91dHB1dD9yLmNyZWF0ZSh0Lm91dHB1dCxuKTpuZXcgci5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9LG4pfSkpLHModGhpcywiZXJyb3JzIiwoZnVuY3Rpb24oKXt2YXIgZT1bXTtpZighdC5lcnJvcnMpcmV0dXJuIG51bGw7Zm9yKHZhciBvPTA7bzx0LmVycm9ycy5sZW5ndGg7bysrKWUucHVzaChyLmNyZWF0ZSh0LmVycm9yc1tvXSxuKSk7cmV0dXJuIGV9KSkscyh0aGlzLCJwYWdpbmF0b3IiLChmdW5jdGlvbigpe3JldHVybiBuLmFwaS5wYWdpbmF0b3JzW2VdfSkpLG4uZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsdC5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLHQuZG9jdW1lbnRhdGlvblVybCkpLHModGhpcywiaWRlbXBvdGVudE1lbWJlcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdLHQ9by5pbnB1dCxuPXQubWVtYmVycztpZighdC5tZW1iZXJzKXJldHVybiBlO2Zvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJiEwPT09bltyXS5pc0lkZW1wb3RlbnQmJmUucHVzaChyKTtyZXR1cm4gZX0pKSxzKHRoaXMsImhhc0V2ZW50T3V0cHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZW1iZXJzLG49ZS5wYXlsb2FkO2lmKCFlLm1lbWJlcnMpcmV0dXJuITE7aWYobilyZXR1cm4gdFtuXS5pc0V2ZW50U3RyZWFtO2Zvcih2YXIgciBpbiB0KWlmKCF0Lmhhc093blByb3BlcnR5KHIpJiYhMD09PXRbcl0uaXNFdmVudFN0cmVhbSlyZXR1cm4hMDtyZXR1cm4hMX0oby5vdXRwdXQpfSkpfX0seyIuLi91dGlsIjo3NCwiLi9zaGFwZSI6NDV9XSw0MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyKHRoaXMsImlucHV0VG9rZW4iLHQuaW5wdXRfdG9rZW4pLHIodGhpcywibGltaXRLZXkiLHQubGltaXRfa2V5KSxyKHRoaXMsIm1vcmVSZXN1bHRzIix0Lm1vcmVfcmVzdWx0cykscih0aGlzLCJvdXRwdXRUb2tlbiIsdC5vdXRwdXRfdG9rZW4pLHIodGhpcywicmVzdWx0S2V5Iix0LnJlc3VsdF9rZXkpfX0seyIuLi91dGlsIjo3NH1dLDQ0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ci5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe249bnx8e30sbyh0aGlzLCJuYW1lIixlKSxvKHRoaXMsImFwaSIsbi5hcGksITEpLHQub3BlcmF0aW9uJiZvKHRoaXMsIm9wZXJhdGlvbiIsci5zdHJpbmcubG93ZXJGaXJzdCh0Lm9wZXJhdGlvbikpO3ZhciBpPXRoaXM7WyJ0eXBlIiwiZGVzY3JpcHRpb24iLCJkZWxheSIsIm1heEF0dGVtcHRzIiwiYWNjZXB0b3JzIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtuJiZvKGksZSxuKX0pKX19LHsiLi4vdXRpbCI6NzR9XSw0NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIGkoZSx0LG4pe251bGwhPW4mJm8ucHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVt0XXx8by5tZW1vaXplZFByb3BlcnR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUsdCxuKXt0PXR8fHt9LGkodGhpcywic2hhcGUiLGUuc2hhcGUpLGkodGhpcywiYXBpIix0LmFwaSwhMSksaSh0aGlzLCJ0eXBlIixlLnR5cGUpLGkodGhpcywiZW51bSIsZS5lbnVtKSxpKHRoaXMsIm1pbiIsZS5taW4pLGkodGhpcywibWF4IixlLm1heCksaSh0aGlzLCJwYXR0ZXJuIixlLnBhdHRlcm4pLGkodGhpcywibG9jYXRpb24iLGUubG9jYXRpb258fHRoaXMubG9jYXRpb258fCJib2R5IiksaSh0aGlzLCJuYW1lIix0aGlzLm5hbWV8fGUueG1sTmFtZXx8ZS5xdWVyeU5hbWV8fGUubG9jYXRpb25OYW1lfHxuKSxpKHRoaXMsImlzU3RyZWFtaW5nIixlLnN0cmVhbWluZ3x8dGhpcy5pc1N0cmVhbWluZ3x8ITEpLGkodGhpcywicmVxdWlyZXNMZW5ndGgiLGUucmVxdWlyZXNMZW5ndGgsITEpLGkodGhpcywiaXNDb21wb3NpdGUiLGUuaXNDb21wb3NpdGV8fCExKSxpKHRoaXMsImlzU2hhcGUiLCEwLCExKSxpKHRoaXMsImlzUXVlcnlOYW1lIixCb29sZWFuKGUucXVlcnlOYW1lKSwhMSksaSh0aGlzLCJpc0xvY2F0aW9uTmFtZSIsQm9vbGVhbihlLmxvY2F0aW9uTmFtZSksITEpLGkodGhpcywiaXNJZGVtcG90ZW50IiwhMD09PWUuaWRlbXBvdGVuY3lUb2tlbiksaSh0aGlzLCJpc0pzb25WYWx1ZSIsITA9PT1lLmpzb252YWx1ZSksaSh0aGlzLCJpc1NlbnNpdGl2ZSIsITA9PT1lLnNlbnNpdGl2ZXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuc2Vuc2l0aXZlKSxpKHRoaXMsImlzRXZlbnRTdHJlYW0iLEJvb2xlYW4oZS5ldmVudHN0cmVhbSksITEpLGkodGhpcywiaXNFdmVudCIsQm9vbGVhbihlLmV2ZW50KSwhMSksaSh0aGlzLCJpc0V2ZW50UGF5bG9hZCIsQm9vbGVhbihlLmV2ZW50cGF5bG9hZCksITEpLGkodGhpcywiaXNFdmVudEhlYWRlciIsQm9vbGVhbihlLmV2ZW50aGVhZGVyKSwhMSksaSh0aGlzLCJpc1RpbWVzdGFtcEZvcm1hdFNldCIsQm9vbGVhbihlLnRpbWVzdGFtcEZvcm1hdCl8fGUucHJvdG90eXBlJiYhMD09PWUucHJvdG90eXBlLmlzVGltZXN0YW1wRm9ybWF0U2V0LCExKSxpKHRoaXMsImVuZHBvaW50RGlzY292ZXJ5SWQiLEJvb2xlYW4oZS5lbmRwb2ludGRpc2NvdmVyeWlkKSwhMSksaSh0aGlzLCJob3N0TGFiZWwiLEJvb2xlYW4oZS5ob3N0TGFiZWwpLCExKSx0LmRvY3VtZW50YXRpb24mJihpKHRoaXMsImRvY3VtZW50YXRpb24iLGUuZG9jdW1lbnRhdGlvbiksaSh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIixlLmRvY3VtZW50YXRpb25VcmwpKSxlLnhtbEF0dHJpYnV0ZSYmaSh0aGlzLCJpc1htbEF0dHJpYnV0ZSIsZS54bWxBdHRyaWJ1dGV8fCExKSxpKHRoaXMsImRlZmF1bHRWYWx1ZSIsbnVsbCksdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZX0sdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fWZ1bmN0aW9uIGMoZSl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsITApLGUuZmxhdHRlbmVkJiZpKHRoaXMsImZsYXR0ZW5lZCIsZS5mbGF0dGVuZWR8fCExKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49dGhpcyxvPW51bGwsdT0hdGhpcy5pc1NoYXBlO2MuYXBwbHkodGhpcyxhcmd1bWVudHMpLHUmJihpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJue319KSksaSh0aGlzLCJtZW1iZXJzIix7fSksaSh0aGlzLCJtZW1iZXJOYW1lcyIsW10pLGkodGhpcywicmVxdWlyZWQiLFtdKSxpKHRoaXMsImlzUmVxdWlyZWQiLChmdW5jdGlvbigpe3JldHVybiExfSkpLGkodGhpcywiaXNEb2N1bWVudCIsQm9vbGVhbihlLmRvY3VtZW50KSkpLGUubWVtYmVycyYmKGkodGhpcywibWVtYmVycyIsbmV3IHIoZS5tZW1iZXJzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGEuY3JlYXRlKG4sdCxlKX0pKSkscyh0aGlzLCJtZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUueG1sT3JkZXJ8fE9iamVjdC5rZXlzKGUubWVtYmVycyl9KSksZS5ldmVudCYmKHModGhpcywiZXZlbnRQYXlsb2FkTWVtYmVyTmFtZSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj0wLG89dC5sZW5ndGg7cjxvO3IrKylpZihlW3Rbcl1dLmlzRXZlbnRQYXlsb2FkKXJldHVybiB0W3JdfSkpLHModGhpcywiZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj1bXSxvPTAsaT10Lmxlbmd0aDtvPGk7bysrKWVbdFtvXV0uaXNFdmVudEhlYWRlciYmci5wdXNoKHRbb10pO3JldHVybiByfSkpKSksZS5yZXF1aXJlZCYmKGkodGhpcywicmVxdWlyZWQiLGUucmVxdWlyZWQpLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKHQpe2lmKCFvKXtvPXt9O2Zvcih2YXIgbj0wO248ZS5yZXF1aXJlZC5sZW5ndGg7bisrKW9bZS5yZXF1aXJlZFtuXV09ITB9cmV0dXJuIG9bdF19KSwhMSwhMCkpLGkodGhpcywicmVzdWx0V3JhcHBlciIsZS5yZXN1bHRXcmFwcGVyfHxudWxsKSxlLnBheWxvYWQmJmkodGhpcywicGF5bG9hZCIsZS5wYXlsb2FkKSwic3RyaW5nIj09dHlwZW9mIGUueG1sTmFtZXNwYWNlP2kodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZSk6Im9iamVjdCI9PXR5cGVvZiBlLnhtbE5hbWVzcGFjZSYmKGkodGhpcywieG1sTmFtZXNwYWNlUHJlZml4IixlLnhtbE5hbWVzcGFjZS5wcmVmaXgpLGkodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZS51cmkpKX1mdW5jdGlvbiBsKGUsdCl7dmFyIG49dGhpcyxyPSF0aGlzLmlzU2hhcGU7aWYoYy5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybltdfSkpLGUubWVtYmVyJiZzKHRoaXMsIm1lbWJlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUubWVtYmVyLHQpfSkpLHRoaXMuZmxhdHRlbmVkKXt2YXIgbz10aGlzLm5hbWU7cyh0aGlzLCJuYW1lIiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5tZW1iZXIubmFtZXx8b30pKX19ZnVuY3Rpb24gcChlLHQpe3ZhciBuPSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksbiYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsImtleSIsYS5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHQpKSxpKHRoaXMsInZhbHVlIixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpKSxlLmtleSYmcyh0aGlzLCJrZXkiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLmtleSx0KX0pKSxlLnZhbHVlJiZzKHRoaXMsInZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS52YWx1ZSx0KX0pKX1mdW5jdGlvbiBkKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9WyJyZXN0LXhtbCIsInF1ZXJ5IiwiZWMyIl07dGhpcy50b1R5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5hcGkmJmUuaW5kZXhPZih0aGlzLmFwaS5wcm90b2NvbCk+LTE/dHx8IiI6dCx0aGlzLmlzSnNvblZhbHVlP0pTT04ucGFyc2UodCk6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmc/dC50b1N0cmluZygpOnR9LHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzSnNvblZhbHVlP0pTT04uc3RyaW5naWZ5KGUpOmV9fWZ1bmN0aW9uIGgoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXt2YXIgdD1vLmJhc2U2NC5kZWNvZGUoZSk7aWYodGhpcy5pc1NlbnNpdGl2ZSYmby5pc05vZGUoKSYmImZ1bmN0aW9uIj09dHlwZW9mIG8uQnVmZmVyLmFsbG9jKXt2YXIgbj1vLkJ1ZmZlci5hbGxvYyh0Lmxlbmd0aCx0KTt0LmZpbGwoMCksdD1ufXJldHVybiB0fSx0aGlzLnRvV2lyZUZvcm1hdD1vLmJhc2U2NC5lbmNvZGV9ZnVuY3Rpb24gZigpe2guYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGcoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9udWxsOiJ0cnVlIj09PWV9fWEubm9ybWFsaXplZFR5cGVzPXtjaGFyYWN0ZXI6InN0cmluZyIsZG91YmxlOiJmbG9hdCIsbG9uZzoiaW50ZWdlciIsc2hvcnQ6ImludGVnZXIiLGJpZ2ludGVnZXI6ImludGVnZXIiLGJpZ2RlY2ltYWw6ImZsb2F0IixibG9iOiJiaW5hcnkifSxhLnR5cGVzPXtzdHJ1Y3R1cmU6dSxsaXN0OmwsbWFwOnAsYm9vbGVhbjpnLHRpbWVzdGFtcDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0IixlLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZih0LmlzVGltZXN0YW1wRm9ybWF0U2V0JiZ0aGlzLnRpbWVzdGFtcEZvcm1hdClpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsdGhpcy50aW1lc3RhbXBGb3JtYXQpO2Vsc2UgaWYoImhlYWRlciI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwicmZjODIyIik7ZWxzZSBpZigicXVlcnlzdHJpbmciPT09dGhpcy5sb2NhdGlvbilpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsImlzbzg2MDEiKTtlbHNlIGlmKHRoaXMuYXBpKXN3aXRjaCh0aGlzLmFwaS5wcm90b2NvbCl7Y2FzZSJqc29uIjpjYXNlInJlc3QtanNvbiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJ1bml4VGltZXN0YW1wIik7YnJlYWs7Y2FzZSJyZXN0LXhtbCI6Y2FzZSJxdWVyeSI6Y2FzZSJlYzIiOmkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpfXRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIGUudG9VVENTdHJpbmc/ZToic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9vLmRhdGUucGFyc2VUaW1lc3RhbXAoZSk6bnVsbH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uZGF0ZS5mb3JtYXQoZSx0LnRpbWVzdGFtcEZvcm1hdCl9fSxmbG9hdDpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VGbG9hdChlKX0sdGhpcy50b1dpcmVGb3JtYXQ9dGhpcy50b1R5cGV9LGludGVnZXI6ZnVuY3Rpb24oKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOnBhcnNlSW50KGUsMTApfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0sc3RyaW5nOmQsYmFzZTY0OmYsYmluYXJ5Omh9LGEucmVzb2x2ZT1mdW5jdGlvbihlLHQpe2lmKGUuc2hhcGUpe3ZhciBuPXQuYXBpLnNoYXBlc1tlLnNoYXBlXTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHNoYXBlIHJlZmVyZW5jZTogIitlLnNoYXBlKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sYS5jcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNTaGFwZSlyZXR1cm4gZTt2YXIgcj1hLnJlc29sdmUoZSx0KTtpZihyKXt2YXIgbz1PYmplY3Qua2V5cyhlKTt0LmRvY3VtZW50YXRpb258fChvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5tYXRjaCgvZG9jdW1lbnRhdGlvbi8pfSkpKTt2YXIgaT1mdW5jdGlvbigpe3IuY29uc3RydWN0b3IuY2FsbCh0aGlzLGUsdCxuKX07cmV0dXJuIGkucHJvdG90eXBlPXIsbmV3IGl9ZS50eXBlfHwoZS5tZW1iZXJzP2UudHlwZT0ic3RydWN0dXJlIjplLm1lbWJlcj9lLnR5cGU9Imxpc3QiOmUua2V5P2UudHlwZT0ibWFwIjplLnR5cGU9InN0cmluZyIpO3ZhciBzPWUudHlwZTtpZihhLm5vcm1hbGl6ZWRUeXBlc1tlLnR5cGVdJiYoZS50eXBlPWEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0pLGEudHlwZXNbZS50eXBlXSlyZXR1cm4gbmV3IGEudHlwZXNbZS50eXBlXShlLHQsbik7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc2hhcGUgdHlwZTogIitzKX0sYS5zaGFwZXM9e1N0cnVjdHVyZVNoYXBlOnUsTGlzdFNoYXBlOmwsTWFwU2hhcGU6cCxTdHJpbmdTaGFwZTpkLEJvb2xlYW5TaGFwZTpnLEJhc2U2NFNoYXBlOmZ9LHQuZXhwb3J0cz1hfSx7Ii4uL3V0aWwiOjc0LCIuL2NvbGxlY3Rpb24iOjQxfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlBhcmFtVmFsaWRhdG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXshMCE9PWUmJnZvaWQgMCE9PWV8fChlPXttaW46ITB9KSx0aGlzLnZhbGlkYXRpb249ZX0sdmFsaWRhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXJyb3JzPVtdLHRoaXMudmFsaWRhdGVNZW1iZXIoZSx0fHx7fSxufHwicGFyYW1zIiksdGhpcy5lcnJvcnMubGVuZ3RoPjEpe3ZhciBvPXRoaXMuZXJyb3JzLmpvaW4oIlxuKiAiKTt0aHJvdyBvPSJUaGVyZSB3ZXJlICIrdGhpcy5lcnJvcnMubGVuZ3RoKyIgdmFsaWRhdGlvbiBlcnJvcnM6XG4qICIrbyxyLnV0aWwuZXJyb3IobmV3IEVycm9yKG8pLHtjb2RlOiJNdWx0aXBsZVZhbGlkYXRpb25FcnJvcnMiLGVycm9yczp0aGlzLmVycm9yc30pfWlmKDE9PT10aGlzLmVycm9ycy5sZW5ndGgpdGhyb3cgdGhpcy5lcnJvcnNbMF07cmV0dXJuITB9LGZhaWw6ZnVuY3Rpb24oZSx0KXt0aGlzLmVycm9ycy5wdXNoKHIudXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6ZX0pKX0sdmFsaWRhdGVTdHJ1Y3R1cmU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNEb2N1bWVudClyZXR1cm4hMDt2YXIgcjt0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJvYmplY3QiXSwic3RydWN0dXJlIik7Zm9yKHZhciBvPTA7ZS5yZXF1aXJlZCYmbzxlLnJlcXVpcmVkLmxlbmd0aDtvKyspe3ZhciBpPXRbcj1lLnJlcXVpcmVkW29dXTtudWxsPT1pJiZ0aGlzLmZhaWwoIk1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlciIsIk1pc3NpbmcgcmVxdWlyZWQga2V5ICciK3IrIicgaW4gIituKX1mb3IociBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpKXt2YXIgcz10W3JdLGE9ZS5tZW1iZXJzW3JdO2lmKHZvaWQgMCE9PWEpe3ZhciBjPVtuLHJdLmpvaW4oIi4iKTt0aGlzLnZhbGlkYXRlTWVtYmVyKGEscyxjKX1lbHNlIG51bGwhPXMmJnRoaXMuZmFpbCgiVW5leHBlY3RlZFBhcmFtZXRlciIsIlVuZXhwZWN0ZWQga2V5ICciK3IrIicgZm91bmQgaW4gIituKX1yZXR1cm4hMH0sdmFsaWRhdGVNZW1iZXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVN0cnVjdHVyZShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZUxpc3QoZSx0LG4pO2Nhc2UibWFwIjpyZXR1cm4gdGhpcy52YWxpZGF0ZU1hcChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy52YWxpZGF0ZVNjYWxhcihlLHQsbil9fSx2YWxpZGF0ZUxpc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbQXJyYXldKSl7dGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwibGlzdCBtZW1iZXIgY291bnQiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLnZhbGlkYXRlTWVtYmVyKGUubWVtYmVyLHRbcl0sbisiWyIrcisiXSIpfX0sdmFsaWRhdGVNYXA6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJtYXAiKSl7dmFyIHI9MDtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmKHRoaXMudmFsaWRhdGVNZW1iZXIoZS5rZXksbyxuKyJba2V5PSciK28rIiddIiksdGhpcy52YWxpZGF0ZU1lbWJlcihlLnZhbHVlLHRbb10sbisiWyciK28rIiddIikscisrKTt0aGlzLnZhbGlkYXRlUmFuZ2UoZSxyLG4sIm1hcCBtZW1iZXIgY291bnQiKX19LHZhbGlkYXRlU2NhbGFyOmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2goZS50eXBlKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6Y2FzZSJzdHJpbmciOnJldHVybiB0aGlzLnZhbGlkYXRlU3RyaW5nKGUsdCxuKTtjYXNlImJhc2U2NCI6Y2FzZSJiaW5hcnkiOnJldHVybiB0aGlzLnZhbGlkYXRlUGF5bG9hZCh0LG4pO2Nhc2UiaW50ZWdlciI6Y2FzZSJmbG9hdCI6cmV0dXJuIHRoaXMudmFsaWRhdGVOdW1iZXIoZSx0LG4pO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbImJvb2xlYW4iXSk7Y2FzZSJ0aW1lc3RhbXAiOnJldHVybiB0aGlzLnZhbGlkYXRlVHlwZSh0LG4sW0RhdGUsL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfShcLlxkKyk/WiQvLCJudW1iZXIiXSwiRGF0ZSBvYmplY3QsIElTTy04NjAxIHN0cmluZywgb3IgYSBVTklYIHRpbWVzdGFtcCIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZmFpbCgiVW5rb3duVHlwZSIsIlVuaGFuZGxlZCB0eXBlICIrZS50eXBlKyIgZm9yICIrbil9fSx2YWxpZGF0ZVN0cmluZzpmdW5jdGlvbihlLHQsbil7dmFyIHI9WyJzdHJpbmciXTtlLmlzSnNvblZhbHVlJiYocj1yLmNvbmNhdChbIm51bWJlciIsIm9iamVjdCIsImJvb2xlYW4iXSkpLG51bGwhPT10JiZ0aGlzLnZhbGlkYXRlVHlwZSh0LG4scikmJih0aGlzLnZhbGlkYXRlRW51bShlLHQsbiksdGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwic3RyaW5nIGxlbmd0aCIpLHRoaXMudmFsaWRhdGVQYXR0ZXJuKGUsdCxuKSx0aGlzLnZhbGlkYXRlVXJpKGUsdCxuKSl9LHZhbGlkYXRlVXJpOmZ1bmN0aW9uKGUsdCxuKXsidXJpIj09PWUubG9jYXRpb24mJjA9PT10Lmxlbmd0aCYmdGhpcy5mYWlsKCJVcmlQYXJhbWV0ZXJFcnJvciIsJ0V4cGVjdGVkIHVyaSBwYXJhbWV0ZXIgdG8gaGF2ZSBsZW5ndGggPj0gMSwgYnV0IGZvdW5kICInK3QrJyIgZm9yICcrbil9LHZhbGlkYXRlUGF0dGVybjpmdW5jdGlvbihlLHQsbil7dGhpcy52YWxpZGF0aW9uLnBhdHRlcm4mJnZvaWQgMCE9PWUucGF0dGVybiYmKG5ldyBSZWdFeHAoZS5wYXR0ZXJuKS50ZXN0KHQpfHx0aGlzLmZhaWwoIlBhdHRlcm5NYXRjaEVycm9yIiwnUHJvdmlkZWQgdmFsdWUgIicrdCsnIiBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIC8nK2UucGF0dGVybisiLyBmb3IgIituKSl9LHZhbGlkYXRlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4scil7dGhpcy52YWxpZGF0aW9uLm1pbiYmdm9pZCAwIT09ZS5taW4mJnQ8ZS5taW4mJnRoaXMuZmFpbCgiTWluUmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiID49ICIrZS5taW4rIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pLHRoaXMudmFsaWRhdGlvbi5tYXgmJnZvaWQgMCE9PWUubWF4JiZ0PmUubWF4JiZ0aGlzLmZhaWwoIk1heFJhbmdlRXJyb3IiLCJFeHBlY3RlZCAiK3IrIiA8PSAiK2UubWF4KyIsIGJ1dCBmb3VuZCAiK3QrIiBmb3IgIituKX0sdmFsaWRhdGVFbnVtOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24uZW51bSYmdm9pZCAwIT09ZS5lbnVtJiYtMT09PWUuZW51bS5pbmRleE9mKHQpJiZ0aGlzLmZhaWwoIkVudW1FcnJvciIsIkZvdW5kIHN0cmluZyB2YWx1ZSBvZiAiK3QrIiwgYnV0IGV4cGVjdGVkICIrZS5lbnVtLmpvaW4oInwiKSsiIGZvciAiK24pfSx2YWxpZGF0ZVR5cGU6ZnVuY3Rpb24oZSx0LG4sbyl7aWYobnVsbD09ZSlyZXR1cm4hMTtmb3IodmFyIGk9ITEscz0wO3M8bi5sZW5ndGg7cysrKXtpZigic3RyaW5nIj09dHlwZW9mIG5bc10pe2lmKHR5cGVvZiBlPT09bltzXSlyZXR1cm4hMH1lbHNlIGlmKG5bc11pbnN0YW5jZW9mIFJlZ0V4cCl7aWYoKGV8fCIiKS50b1N0cmluZygpLm1hdGNoKG5bc10pKXJldHVybiEwfWVsc2V7aWYoZSBpbnN0YW5jZW9mIG5bc10pcmV0dXJuITA7aWYoci51dGlsLmlzVHlwZShlLG5bc10pKXJldHVybiEwO298fGl8fChuPW4uc2xpY2UoKSksbltzXT1yLnV0aWwudHlwZU5hbWUobltzXSl9aT0hMH12YXIgYT1vO2F8fChhPW4uam9pbigiLCAiKS5yZXBsYWNlKC8sKFteLF0rKSQvLCIsIG9yJDEiKSk7dmFyIGM9YS5tYXRjaCgvXlthZWlvdV0vaSk/Im4iOiIiO3JldHVybiB0aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSIrYysiICIrYSksITF9LHZhbGlkYXRlTnVtYmVyOmZ1bmN0aW9uKGUsdCxuKXtpZihudWxsIT10KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciByPXBhcnNlRmxvYXQodCk7ci50b1N0cmluZygpPT09dCYmKHQ9cil9dGhpcy52YWxpZGF0ZVR5cGUodCxuLFsibnVtYmVyIl0pJiZ0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0LG4sIm51bWVyaWMgdmFsdWUiKX19LHZhbGlkYXRlUGF5bG9hZDpmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUmJiJzdHJpbmciIT10eXBlb2YgZSYmKCFlfHwibnVtYmVyIiE9dHlwZW9mIGUuYnl0ZUxlbmd0aCkpe2lmKHIudXRpbC5pc05vZGUoKSl7dmFyIG49ci51dGlsLnN0cmVhbS5TdHJlYW07aWYoci51dGlsLkJ1ZmZlci5pc0J1ZmZlcihlKXx8ZSBpbnN0YW5jZW9mIG4pcmV0dXJufWVsc2UgaWYodm9pZCAwIT09dHlwZW9mIEJsb2ImJmUgaW5zdGFuY2VvZiBCbG9iKXJldHVybjt2YXIgbz1bIkJ1ZmZlciIsIlN0cmVhbSIsIkZpbGUiLCJCbG9iIiwiQXJyYXlCdWZmZXIiLCJEYXRhVmlldyJdO2lmKGUpZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe2lmKHIudXRpbC5pc1R5cGUoZSxvW2ldKSlyZXR1cm47aWYoci51dGlsLnR5cGVOYW1lKGUuY29uc3RydWN0b3IpPT09b1tpXSlyZXR1cm59dGhpcy5mYWlsKCJJbnZhbGlkUGFyYW1ldGVyVHlwZSIsIkV4cGVjdGVkICIrdCsiIHRvIGJlIGEgc3RyaW5nLCBCdWZmZXIsIFN0cmVhbSwgQmxvYiwgb3IgdHlwZWQgYXJyYXkgb2JqZWN0Iil9fX0pfSx7Ii4vY29yZSI6MTl9XSw0NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL2NvcmUiKTt0LmV4cG9ydHM9e3BvcHVsYXRlSG9zdFByZWZpeDpmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmNvbmZpZy5ob3N0UHJlZml4RW5hYmxlZClyZXR1cm4gZTt2YXIgdCxuLGkscyxhLGM9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZihmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLG49dC5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxvPXQuZW5kcG9pbnRPcGVyYXRpb24mJnQuZW5kcG9pbnRPcGVyYXRpb249PT1yLnN0cmluZy5sb3dlckZpcnN0KG4ubmFtZSk7cmV0dXJuIk5VTEwiIT09bi5lbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkfHwhMD09PW99KGUpKXJldHVybiBlO2lmKGMuZW5kcG9pbnQmJmMuZW5kcG9pbnQuaG9zdFByZWZpeCl7dmFyIHU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLG8pe2lmKCEwPT09by5ob3N0TGFiZWwpe2lmKCJzdHJpbmciIT10eXBlb2YgdFtuXXx8IiI9PT10W25dKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQYXJhbWV0ZXIgIituKyIgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4iLGNvZGU6IkludmFsaWRQYXJhbWV0ZXIifSk7dmFyIGk9bmV3IFJlZ0V4cCgiXFx7IituKyJcXH0iLCJnIik7ZT1lLnJlcGxhY2UoaSx0W25dKX19KSksZX0oYy5lbmRwb2ludC5ob3N0UHJlZml4LGUucGFyYW1zLGMuaW5wdXQpO3M9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxhPXUscy5ob3N0JiYocy5ob3N0PWErcy5ob3N0KSxzLmhvc3RuYW1lJiYocy5ob3N0bmFtZT1hK3MuaG9zdG5hbWUpLHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0bmFtZSxuPXQuc3BsaXQoIi4iKSxpPS9eW2EtekEtWjAtOV17MX0kfF5bYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0kLyxyLmFycmF5RWFjaChuLChmdW5jdGlvbihlKXtpZighZS5sZW5ndGh8fGUubGVuZ3RoPDF8fGUubGVuZ3RoPjYzKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6Ikhvc3RuYW1lIGxhYmVsIGxlbmd0aCBzaG91bGQgYmUgYmV0d2VlbiAxIHRvIDYzIGNoYXJhY3RlcnMsIGluY2x1c2l2ZS4ifSk7aWYoIWkudGVzdChlKSl0aHJvdyBvLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6ZSsiIGlzIG5vdCBob3N0bmFtZSBjb21wYXRpYmxlLiJ9KX0pKX1yZXR1cm4gZX19fSx7Ii4uL2NvcmUiOjE5LCIuLi91dGlsIjo3NH1dLDQ4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vanNvbi9idWlsZGVyIiksaT1lKCIuLi9qc29uL3BhcnNlciIpLHM9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlcXVlc3Qsbj1lLnNlcnZpY2UuYXBpLHI9bi50YXJnZXRQcmVmaXgrIi4iK24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0ubmFtZSxpPW4uanNvblZlcnNpb258fCIxLjAiLGE9bi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxjPW5ldyBvOzE9PT1pJiYoaT0iMS4wIiksbi5hd3NRdWVyeUNvbXBhdGlibGUmJih0LnBhcmFtc3x8KHQucGFyYW1zPXt9KSxPYmplY3QuYXNzaWduKHQucGFyYW1zLGUucGFyYW1zKSksdC5ib2R5PWMuYnVpbGQoZS5wYXJhbXN8fHt9LGEpLHQuaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtYW16LWpzb24tIitpLHQuaGVhZGVyc1siWC1BbXotVGFyZ2V0Il09cixzKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj1lLmh0dHBSZXNwb25zZTtpZih0LmNvZGU9bi5oZWFkZXJzWyJ4LWFtem4tZXJyb3J0eXBlIl18fCJVbmtub3duRXJyb3IiLCJzdHJpbmciPT10eXBlb2YgdC5jb2RlJiYodC5jb2RlPXQuY29kZS5zcGxpdCgiOiIpWzBdKSxuLmJvZHkubGVuZ3RoPjApdHJ5e3ZhciBvPUpTT04ucGFyc2Uobi5ib2R5LnRvU3RyaW5nKCkpLGk9by5fX3R5cGV8fG8uY29kZXx8by5Db2RlO2Zvcih2YXIgcyBpbiBpJiYodC5jb2RlPWkuc3BsaXQoIiMiKS5wb3AoKSksIlJlcXVlc3RFbnRpdHlUb29MYXJnZSI9PT10LmNvZGU/dC5tZXNzYWdlPSJSZXF1ZXN0IGJvZHkgbXVzdCBiZSBsZXNzIHRoYW4gMSBNQiI6dC5tZXNzYWdlPW8ubWVzc2FnZXx8by5NZXNzYWdlfHxudWxsLG98fHt9KSJjb2RlIiE9PXMmJiJtZXNzYWdlIiE9PXMmJih0WyJbIitzKyJdIl09IlNlZSBlcnJvci4iK3MrIiBmb3IgZGV0YWlscy4iLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHMse3ZhbHVlOm9bc10sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pKX1jYXRjaChvKXt0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c01lc3NhZ2V9ZWxzZSB0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c0NvZGUudG9TdHJpbmcoKTtlLmVycm9yPXIuZXJyb3IobmV3IEVycm9yLHQpfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCl8fCJ7fSI7aWYoITE9PT1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuY29udmVydFJlc3BvbnNlVHlwZXMpZS5kYXRhPUpTT04ucGFyc2UodCk7ZWxzZXt2YXIgbj1lLnJlcXVlc3Quc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLnJlcXVlc3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LHI9bmV3IGk7ZS5kYXRhPXIucGFyc2UodCxuKX19fX0seyIuLi9qc29uL2J1aWxkZXIiOjM3LCIuLi9qc29uL3BhcnNlciI6MzgsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi91dGlsIiksaT1lKCIuLi9xdWVyeS9xdWVyeV9wYXJhbV9zZXJpYWxpemVyIikscz1lKCIuLi9tb2RlbC9zaGFwZSIpLGE9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj1lLmh0dHBSZXF1ZXN0O24uaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCIsbi5wYXJhbXM9e1ZlcnNpb246ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uLEFjdGlvbjp0Lm5hbWV9LChuZXcgaSkuc2VyaWFsaXplKGUucGFyYW1zLHQuaW5wdXQsKGZ1bmN0aW9uKGUsdCl7bi5wYXJhbXNbZV09dH0pKSxuLmJvZHk9by5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxhKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCk7aWYobi5tYXRjaCgiPFVua25vd25PcGVyYXRpb25FeGNlcHRpb24iKSl0PXtDb2RlOiJVbmtub3duT3BlcmF0aW9uIixNZXNzYWdlOiJVbmtub3duIG9wZXJhdGlvbiAiK2UucmVxdWVzdC5vcGVyYXRpb259O2Vsc2UgdHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKG4pfWNhdGNoKG4pe3Q9e0NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxNZXNzYWdlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2V9fXQucmVxdWVzdElkJiYhZS5yZXF1ZXN0SWQmJihlLnJlcXVlc3RJZD10LnJlcXVlc3RJZCksdC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fSxpPW47aWYoaS5yZXN1bHRXcmFwcGVyKXt2YXIgYT1zLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0pO2EubWVtYmVyc1tpLnJlc3VsdFdyYXBwZXJdPW4sYS5tZW1iZXJOYW1lcz1baS5yZXN1bHRXcmFwcGVyXSxvLnByb3BlcnR5KG4sIm5hbWUiLG4ucmVzdWx0V3JhcHBlciksbj1hfXZhciBjPW5ldyByLlhNTC5QYXJzZXI7aWYobiYmbi5tZW1iZXJzJiYhbi5tZW1iZXJzLl9YQU1aUmVxdWVzdElkKXt2YXIgdT1zLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0se2FwaTp7cHJvdG9jb2w6InF1ZXJ5In19LCJyZXF1ZXN0SWQiKTtuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQ9dX12YXIgbD1jLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSxuKTtlLnJlcXVlc3RJZD1sLl9YQU1aUmVxdWVzdElkfHxsLnJlcXVlc3RJZCxsLl9YQU1aUmVxdWVzdElkJiZkZWxldGUgbC5fWEFNWlJlcXVlc3RJZCxpLnJlc3VsdFdyYXBwZXImJmxbaS5yZXN1bHRXcmFwcGVyXSYmKG8udXBkYXRlKGwsbFtpLnJlc3VsdFdyYXBwZXJdKSxkZWxldGUgbFtpLnJlc3VsdFdyYXBwZXJdKSxlLmRhdGE9bH19fSx7Ii4uL2NvcmUiOjE5LCIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiOjUzLCIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O2Z1bmN0aW9uIGkoZSx0LG4sbyl7dmFyIGk9W2UsdF0uam9pbigiLyIpO2k9aS5yZXBsYWNlKC9cLysvZywiLyIpO3ZhciBzPXt9LGE9ITE7aWYoci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgbj1vW2VdO2lmKG51bGwhPW4paWYoInVyaSI9PT10LmxvY2F0aW9uKXt2YXIgYz1uZXcgUmVnRXhwKCJcXHsiK3QubmFtZSsiKFxcKyk/XFx9Iik7aT1pLnJlcGxhY2UoYywoZnVuY3Rpb24oZSx0KXtyZXR1cm4odD9yLnVyaUVzY2FwZVBhdGg6ci51cmlFc2NhcGUpKFN0cmluZyhuKSl9KSl9ZWxzZSJxdWVyeXN0cmluZyI9PT10LmxvY2F0aW9uJiYoYT0hMCwibGlzdCI9PT10LnR5cGU/c1t0Lm5hbWVdPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUodC5tZW1iZXIudG9XaXJlRm9ybWF0KGUpLnRvU3RyaW5nKCkpfSkpOiJtYXAiPT09dC50eXBlP3IuZWFjaChuLChmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkodCk/c1tlXT10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXJpRXNjYXBlKFN0cmluZyhlKSl9KSk6c1tlXT1yLnVyaUVzY2FwZShTdHJpbmcodCkpfSkpOnNbdC5uYW1lXT1yLnVyaUVzY2FwZSh0LnRvV2lyZUZvcm1hdChuKS50b1N0cmluZygpKSl9KSksYSl7aSs9aS5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt2YXIgYz1bXTtyLmFycmF5RWFjaChPYmplY3Qua2V5cyhzKS5zb3J0KCksKGZ1bmN0aW9uKGUpe0FycmF5LmlzQXJyYXkoc1tlXSl8fChzW2VdPVtzW2VdXSk7Zm9yKHZhciB0PTA7dDxzW2VdLmxlbmd0aDt0KyspYy5wdXNoKHIudXJpRXNjYXBlKFN0cmluZyhlKSkrIj0iK3NbZV1bdF0pfSkpLGkrPWMuam9pbigiJiIpfXJldHVybiBpfXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmh0dHBNZXRob2R9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj10LmlucHV0LHI9aShlLmh0dHBSZXF1ZXN0LmVuZHBvaW50LnBhdGgsdC5odHRwUGF0aCxuLGUucGFyYW1zKTtlLmh0dHBSZXF1ZXN0LnBhdGg9cn0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtyLmVhY2godC5pbnB1dC5tZW1iZXJzLChmdW5jdGlvbih0LG4pe3ZhciBvPWUucGFyYW1zW3RdO251bGwhPW8mJigiaGVhZGVycyI9PT1uLmxvY2F0aW9uJiYibWFwIj09PW4udHlwZT9yLmVhY2gobywoZnVuY3Rpb24odCxyKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lK3RdPXJ9KSk6ImhlYWRlciI9PT1uLmxvY2F0aW9uJiYobz1uLnRvV2lyZUZvcm1hdChvKS50b1N0cmluZygpLG4uaXNKc29uVmFsdWUmJihvPXIuYmFzZTY0LmVuY29kZShvKSksZS5odHRwUmVxdWVzdC5oZWFkZXJzW24ubmFtZV09bykpfSkpfShlKSxvKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oKXt9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXt9LG89ZS5odHRwUmVzcG9uc2UsaT10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dCxzPXt9O3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7c1tlLnRvTG93ZXJDYXNlKCldPXR9KSksci5lYWNoKGkubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgaT0odC5uYW1lfHxlKS50b0xvd2VyQ2FzZSgpO2lmKCJoZWFkZXJzIj09PXQubG9jYXRpb24mJiJtYXAiPT09dC50eXBlKXtuW2VdPXt9O3ZhciBhPXQuaXNMb2NhdGlvbk5hbWU/dC5uYW1lOiIiLGM9bmV3IFJlZ0V4cCgiXiIrYSsiKC4rKSIsImkiKTtyLmVhY2goby5oZWFkZXJzLChmdW5jdGlvbih0LHIpe3ZhciBvPXQubWF0Y2goYyk7bnVsbCE9PW8mJihuW2VdW29bMV1dPXIpfSkpfWVsc2UgaWYoImhlYWRlciI9PT10LmxvY2F0aW9uKXtpZih2b2lkIDAhPT1zW2ldKXt2YXIgdT10LmlzSnNvblZhbHVlP3IuYmFzZTY0LmRlY29kZShzW2ldKTpzW2ldO25bZV09dC50b1R5cGUodSl9fWVsc2Uic3RhdHVzQ29kZSI9PT10LmxvY2F0aW9uJiYobltlXT1wYXJzZUludChvLnN0YXR1c0NvZGUsMTApKX0pKSxlLmRhdGE9bn0sZ2VuZXJhdGVVUkk6aX19LHsiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw1MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4vcmVzdCIpLGk9ZSgiLi9qc29uIikscz1lKCIuLi9qc29uL2J1aWxkZXIiKSxhPWUoIi4uL2pzb24vcGFyc2VyIiksYz1bIkdFVCIsIkhFQUQiLCJERUxFVEUiXTtmdW5jdGlvbiB1KGUsdCl7aWYoIWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pe3ZhciBuPXQ/ImJpbmFyeS9vY3RldC1zdHJlYW0iOiJhcHBsaWNhdGlvbi9qc29uIjtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPW59fXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe28uYnVpbGRSZXF1ZXN0KGUpLGMuaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHMsbj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0O2lmKG4ucGF5bG9hZCl7dmFyIHIsbz1uLm1lbWJlcnNbbi5wYXlsb2FkXTtyPWUucGFyYW1zW24ucGF5bG9hZF0sInN0cnVjdHVyZSI9PT1vLnR5cGU/KGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKHJ8fHt9LG8pLHUoZSkpOnZvaWQgMCE9PXImJihlLmh0dHBSZXF1ZXN0LmJvZHk9ciwoImJpbmFyeSI9PT1vLnR5cGV8fG8uaXNTdHJlYW1pbmcpJiZ1KGUsITApKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKGUucGFyYW1zLG4pLHUoZSl9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7aS5leHRyYWN0RXJyb3IoZSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe28uZXh0cmFjdERhdGEoZSk7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXSxzPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fTtpZihuLmhhc0V2ZW50T3V0cHV0LHMucGF5bG9hZCl7dmFyIGM9cy5tZW1iZXJzW3MucGF5bG9hZF0sdT1lLmh0dHBSZXNwb25zZS5ib2R5O2lmKGMuaXNFdmVudFN0cmVhbSlsPW5ldyBhLGUuZGF0YVtwYXlsb2FkXT1yLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1BV1MuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06dSxsLGMpO2Vsc2UgaWYoInN0cnVjdHVyZSI9PT1jLnR5cGV8fCJsaXN0Ij09PWMudHlwZSl7dmFyIGw9bmV3IGE7ZS5kYXRhW3MucGF5bG9hZF09bC5wYXJzZSh1LGMpfWVsc2UiYmluYXJ5Ij09PWMudHlwZXx8Yy5pc1N0cmVhbWluZz9lLmRhdGFbcy5wYXlsb2FkXT11OmUuZGF0YVtzLnBheWxvYWRdPWMudG9UeXBlKHUpfWVsc2V7dmFyIHA9ZS5kYXRhO2kuZXh0cmFjdERhdGEoZSksZS5kYXRhPXIubWVyZ2UocCxlLmRhdGEpfX0sdW5zZXRDb250ZW50TGVuZ3RoOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PXIuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKSYmYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKT49MCYmZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vanNvbiI6NDgsIi4vcmVzdCI6NTB9XSw1MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4vcmVzdCIpO3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe2kuYnVpbGRSZXF1ZXN0KGUpLFsiR0VUIiwiSEVBRCJdLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPDAmJmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsbj1uZXcgci5YTUwuQnVpbGRlcixpPWUucGFyYW1zLHM9dC5wYXlsb2FkO2lmKHMpe3ZhciBhPXQubWVtYmVyc1tzXTtpZih2b2lkIDA9PT0oaT1pW3NdKSlyZXR1cm47aWYoInN0cnVjdHVyZSI9PT1hLnR5cGUpe3ZhciBjPWEubmFtZTtlLmh0dHBSZXF1ZXN0LmJvZHk9bi50b1hNTChpLGEsYywhMCl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9aX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksdCx0Lm5hbWV8fHQuc2hhcGV8fG8uc3RyaW5nLnVwcGVyRmlyc3QoZS5vcGVyYXRpb24pKyJSZXF1ZXN0Iil9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RXJyb3IoZSk7dHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSl9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0O2kuZXh0cmFjdERhdGEoZSk7dmFyIG49ZS5yZXF1ZXN0LHM9ZS5odHRwUmVzcG9uc2UuYm9keSxhPW4uc2VydmljZS5hcGkub3BlcmF0aW9uc1tuLm9wZXJhdGlvbl0sYz1hLm91dHB1dCx1PShhLmhhc0V2ZW50T3V0cHV0LGMucGF5bG9hZCk7aWYodSl7dmFyIGw9Yy5tZW1iZXJzW3VdO2wuaXNFdmVudFN0cmVhbT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT1vLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1yLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/ZS5odHRwUmVzcG9uc2Uuc3RyZWFtOmUuaHR0cFJlc3BvbnNlLmJvZHksdCxsKSk6InN0cnVjdHVyZSI9PT1sLnR5cGU/KHQ9bmV3IHIuWE1MLlBhcnNlcixlLmRhdGFbdV09dC5wYXJzZShzLnRvU3RyaW5nKCksbCkpOiJiaW5hcnkiPT09bC50eXBlfHxsLmlzU3RyZWFtaW5nP2UuZGF0YVt1XT1zOmUuZGF0YVt1XT1sLnRvVHlwZShzKX1lbHNlIGlmKHMubGVuZ3RoPjApe3ZhciBwPSh0PW5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKHMudG9TdHJpbmcoKSxjKTtvLnVwZGF0ZShlLmRhdGEscCl9fX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0LCIuL3Jlc3QiOjUwfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUpe3JldHVybiBlLmlzUXVlcnlOYW1lfHwiZWMyIiE9PWUuYXBpLnByb3RvY29sP2UubmFtZTplLm5hbWVbMF0udG9VcHBlckNhc2UoKStlLm5hbWUuc3Vic3RyKDEpfWZ1bmN0aW9uIHMoZSx0LG4sbyl7ci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixyKXt2YXIgcz10W25dO2lmKG51bGwhPXMpe3ZhciBjPWkocik7YShjPWU/ZSsiLiIrYzpjLHMscixvKX19KSl9ZnVuY3Rpb24gYShlLHQsbixvKXtudWxsIT10JiYoInN0cnVjdHVyZSI9PT1uLnR5cGU/cyhlLHQsbixvKToibGlzdCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHM9bi5tZW1iZXJ8fHt9OzAhPT10Lmxlbmd0aD9yLmFycmF5RWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBjPSIuIisocisxKTtpZigiZWMyIj09PW4uYXBpLnByb3RvY29sKWMrPSIiO2Vsc2UgaWYobi5mbGF0dGVuZWQpe2lmKHMubmFtZSl7dmFyIHU9ZS5zcGxpdCgiLiIpO3UucG9wKCksdS5wdXNoKGkocykpLGU9dS5qb2luKCIuIil9fWVsc2UgYz0iLiIrKHMubmFtZT9zLm5hbWU6Im1lbWJlciIpK2M7YShlK2MsdCxzLG8pfSkpOm8uY2FsbCh0aGlzLGUsbnVsbCl9KGUsdCxuLG8pOiJtYXAiPT09bi50eXBlP2Z1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPTE7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIHM9KG4uZmxhdHRlbmVkPyIuIjoiLmVudHJ5LiIpK2krKysiLiIsYz1zKyhuLmtleS5uYW1lfHwia2V5IiksdT1zKyhuLnZhbHVlLm5hbWV8fCJ2YWx1ZSIpO2EoZStjLHQsbi5rZXksbyksYShlK3UscixuLnZhbHVlLG8pfSkpfShlLHQsbixvKTpvKGUsbi50b1dpcmVGb3JtYXQodCkudG9TdHJpbmcoKSkpfW8ucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQsbil7cygiIixlLHQsbil9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sNTQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e25vdzpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKX19fSx7fV0sNTU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2lzRmlwc1JlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlLnN0YXJ0c1dpdGgoImZpcHMtIil8fGUuZW5kc1dpdGgoIi1maXBzIikpfSxpc0dsb2JhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJlsiYXdzLWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSl9LGdldFJlYWxSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuWyJmaXBzLWF3cy1nbG9iYWwiLCJhd3MtZmlwcyIsImF3cy1nbG9iYWwiXS5pbmNsdWRlcyhlKT8idXMtZWFzdC0xIjpbImZpcHMtYXdzLXVzLWdvdi1nbG9iYWwiLCJhd3MtdXMtZ292LWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1nb3Ytd2VzdC0xIjplLnJlcGxhY2UoL2ZpcHMtKGRrci18cHJvZC0pP3wtZmlwcy8sIiIpfX19LHt9XSw1NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbCIpLG89ZSgiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiIpO2Z1bmN0aW9uIGkoZSx0KXtyLmVhY2godCwoZnVuY3Rpb24odCxuKXsiZ2xvYmFsRW5kcG9pbnQiIT09dCYmKHZvaWQgMCE9PWUuY29uZmlnW3RdJiZudWxsIT09ZS5jb25maWdbdF18fChlLmNvbmZpZ1t0XT1uKSl9KSl9dC5leHBvcnRzPXtjb25maWd1cmVFbmRwb2ludDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcucmVnaW9uLG49ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5zcGxpdCgiLSIpO3JldHVybiB0Lmxlbmd0aDwzP251bGw6dC5zbGljZSgwLHQubGVuZ3RoLTIpLmpvaW4oIi0iKSsiLSoifSh0KSxyPWUuYXBpLmVuZHBvaW50UHJlZml4O3JldHVybltbdCxyXSxbbixyXSxbdCwiKiJdLFtuLCIqIl0sWyIqIixyXSxbdCwiaW50ZXJuYWwtKiJdLFsiKiIsIioiXV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZVswXSYmZVsxXT9lLmpvaW4oIi8iKTpudWxsfSkpfShlKSxuPWUuY29uZmlnLnVzZUZpcHNFbmRwb2ludCxyPWUuY29uZmlnLnVzZUR1YWxzdGFja0VuZHBvaW50LHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGE9dFtzXTtpZihhKXt2YXIgYz1uP3I/by5kdWFsc3RhY2tGaXBzUnVsZXM6by5maXBzUnVsZXM6cj9vLmR1YWxzdGFja1J1bGVzOm8ucnVsZXM7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSkpe3ZhciB1PWNbYV07InN0cmluZyI9PXR5cGVvZiB1JiYodT1vLnBhdHRlcm5zW3VdKSxlLmlzR2xvYmFsRW5kcG9pbnQ9ISF1Lmdsb2JhbEVuZHBvaW50LHUuc2lnbmluZ1JlZ2lvbiYmKGUuc2lnbmluZ1JlZ2lvbj11LnNpZ25pbmdSZWdpb24pLHUuc2lnbmF0dXJlVmVyc2lvbnx8KHUuc2lnbmF0dXJlVmVyc2lvbj0idjQiKTt2YXIgbD0iYmVhcmVyIj09PShlLmFwaSYmZS5hcGkuc2lnbmF0dXJlVmVyc2lvbik7cmV0dXJuIHZvaWQgaShlLE9iamVjdC5hc3NpZ24oe30sdSx7c2lnbmF0dXJlVmVyc2lvbjpsPyJiZWFyZXIiOnUuc2lnbmF0dXJlVmVyc2lvbn0pKX19fX0sZ2V0RW5kcG9pbnRTdWZmaXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXsiXih1c3xldXxhcHxzYXxjYXxtZSlcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXmNuXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbS5jbiIsIl51c1xcLWdvdlxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJedXNcXC1pc29cXC1cXHcrXFwtXFxkKyQiOiJjMnMuaWMuZ292IiwiXnVzXFwtaXNvYlxcLVxcdytcXC1cXGQrJCI6InNjMnMuc2dvdi5nb3YifSxuPU9iamVjdC5rZXlzKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89UmVnRXhwKG5bcl0pLGk9dFtuW3JdXTtpZihvLnRlc3QoZSkpcmV0dXJuIGl9cmV0dXJuImFtYXpvbmF3cy5jb20ifX19LHsiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiI6NTcsIi4vdXRpbCI6NzR9XSw1NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sInVzLWlzby0qLyoiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjoidXNJc29iIiwiKi9idWRnZXRzIjoiZ2xvYmFsU1NMIiwiKi9jbG91ZGZyb250IjoiZ2xvYmFsU1NMIiwiKi9zdHMiOiJnbG9iYWxTU0wiLCIqL2ltcG9ydGV4cG9ydCI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIiLGdsb2JhbEVuZHBvaW50OiEwfSwiKi9yb3V0ZTUzIjoiZ2xvYmFsU1NMIiwiY24tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9yb3V0ZTUzIjoiZ2xvYmFsR292Q2xvdWQiLCJ1cy1pc28tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWlzb2ItKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5zYzJzLnNnb3YuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc29iLWVhc3QtMSJ9LCIqL3dhZiI6Imdsb2JhbFNTTCIsIiovaWFtIjoiZ2xvYmFsU1NMIiwiY24tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGgtMSJ9LCJ1cy1pc28tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWlzby1lYXN0LTEuYzJzLmljLmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvLWVhc3QtMSJ9LCJ1cy1nb3YtKi9pYW0iOiJnbG9iYWxHb3ZDbG91ZCIsIiovY2UiOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSwiY24tKi9jZSI6e2VuZHBvaW50OiJ7c2VydmljZX0uY24tbm9ydGh3ZXN0LTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGh3ZXN0LTEifSwidXMtZ292LSovc3RzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sInVzLWdvdi13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJldS13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJhcC1zb3V0aGVhc3QtMi9zMyI6InMzc2lnbmF0dXJlIiwiYXAtbm9ydGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInNhLWVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtZWFzdC0xL3MzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJzMyJ9LCJ1cy1lYXN0LTEvc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3NkYiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQifSxmaXBzUnVsZXM6eyIqLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1nb3YtKi8qIjoiZmlwc1N0YW5kYXJkIiwidXMtaXNvLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWlzby0qL2RtcyI6InVzSXNvIiwidXMtaXNvYi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uc2Mycy5zZ292LmdvdiJ9LCJ1cy1pc29iLSovZG1zIjoidXNJc29iIiwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSwiKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwiKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwiKi9iYXRjaCI6ImZpcHNEb3RQcmVmaXgiLCIqL2VrcyI6ImZpcHNEb3RQcmVmaXgiLCIqL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCIqL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsIiovcnVudGltZS5zYWdlbWFrZXIiOntlbmRwb2ludDoicnVudGltZS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sIiovaWFtIjoiZmlwc1dpdGhvdXRSZWdpb24iLCIqL3JvdXRlNTMiOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCIqL3dhZiI6ImZpcHNXaXRob3V0UmVnaW9uIiwidXMtZ292LSovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCJ1cy1nb3YtKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwidXMtZ292LSovYXBpLnNhZ2VtYWtlciI6ImZpcHMuYXBpLnNhZ2VtYWtlciIsInVzLWdvdi0qL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCJ1cy1nb3YtKi9ydW50aW1lLmxleCI6ImZpcHMucnVudGltZS5sZXgiLCJ1cy1nb3YtKi9hY20tcGNhIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2JhdGNoIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2Nsb3VkZm9ybWF0aW9uIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2NvbmZpZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9la3MiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY21hcHJlZHVjZSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9pZGVudGl0eXN0b3JlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2R5bmFtb2RiIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VsYXN0aWNsb2FkYmFsYW5jaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2d1YXJkZHV0eSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9tb25pdG9yaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3Jlc291cmNlLWdyb3VwcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9ydW50aW1lLnNhZ2VtYWtlciI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlcXVvdGFzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NzbSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdHMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3VwcG9ydCI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3N0YXRlcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1pc28tZWFzdC0xL2VsYXN0aWNmaWxlc3lzdGVtIjp7ZW5kcG9pbnQ6ImVsYXN0aWNmaWxlc3lzdGVtLWZpcHMue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LCJ1cy1nb3Ytd2VzdC0xL29yZ2FuaXphdGlvbnMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LXdlc3QtMS9yb3V0ZTUzIjp7ZW5kcG9pbnQ6InJvdXRlNTMudXMtZ292LmFtYXpvbmF3cy5jb20ifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZmlwc0R1YWxzdGFja0J5RGVmYXVsdCIsIiova2VuZHJhLXJhbmtpbmciOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2ludGVybmV0bW9uaXRvciI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovY29kZWNhdGFseXN0IjoiZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGR1YWxzdGFja1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMyI6ImR1YWxzdGFja0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCJhcC1zb3V0aC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsImV1LXdlc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJzYS1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLWVhc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy13ZXN0LTIvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIn0sZHVhbHN0YWNrRmlwc1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hbWF6b253ZWJzZXJ2aWNlcy5jb20uY24ifSwiKi9zMyI6ImR1YWxzdGFja0ZpcHNMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMtY29udHJvbCI6ImR1YWxzdGFja0ZpcHNMZWdhY3lDbiJ9LHBhdHRlcm5zOntnbG9iYWxTU0w6e2VuZHBvaW50OiJodHRwczovL3tzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSxnbG9iYWxHb3ZDbG91ZDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS51cy1nb3YuYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZ292LXdlc3QtMSJ9LHMzc2lnbmF0dXJlOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sdXNJc286e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LHVzSXNvYjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sZmlwc1N0YW5kYXJkOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNEb3RQcmVmaXg6e2VuZHBvaW50OiJmaXBzLntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc1dpdGhvdXRSZWdpb246e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLmVjciI6e2VuZHBvaW50OiJlY3ItZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJhcGktZmlwcy5zYWdlbWFrZXIue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLm1vZGVscy5sZXgiOntlbmRwb2ludDoibW9kZWxzLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5ydW50aW1lLmxleCI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aFNlcnZpY2VPbmx5OntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0uZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LGR1YWxzdGFja0ZpcHNMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0ZpcHNMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrTGVnYWN5RWMyOntlbmRwb2ludDoiYXBpLmVjMi57cmVnaW9ufS5hd3MifSxkdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmF3cyJ9LGZpcHNEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYXdzIn0sZ2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9Lmdsb2JhbC5hcGkuYXdzIn0sZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmdsb2JhbC5hcGkuYXdzIn19fX0se31dLDU4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vY29yZSIpLHI9ZSgiLi9zdGF0ZV9tYWNoaW5lIiksbz1uLnV0aWwuaW5oZXJpdCxpPW4udXRpbC5kb21haW4scz1lKCJqbWVzcGF0aCIpLGE9e3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9LGM9bmV3IHI7Yy5zZXR1cFN0YXRlcz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uZW1pdChuLl9hc20uY3VycmVudFN0YXRlLChmdW5jdGlvbihlKXtpZihlKWlmKHI9bixPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxyLl9hc20uY3VycmVudFN0YXRlKSl7aWYoIShpJiZuLmRvbWFpbiBpbnN0YW5jZW9mIGkuRG9tYWluKSl0aHJvdyBlO2UuZG9tYWluRW1pdHRlcj1uLGUuZG9tYWluPW4uZG9tYWluLGUuZG9tYWluVGhyb3duPSExLG4uZG9tYWluLmVtaXQoImVycm9yIixlKX1lbHNlIG4ucmVzcG9uc2UuZXJyb3I9ZSx0KGUpO2Vsc2UgdChuLnJlc3BvbnNlLmVycm9yKTt2YXIgcn0pKX07dGhpcy5hZGRTdGF0ZSgidmFsaWRhdGUiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJidWlsZCIsImFmdGVyQnVpbGQiLCJyZXN0YXJ0IixlKSx0aGlzLmFkZFN0YXRlKCJhZnRlckJ1aWxkIiwic2lnbiIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoInNpZ24iLCJzZW5kIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJldHJ5IiwiYWZ0ZXJSZXRyeSIsImFmdGVyUmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyUmV0cnkiLCJzaWduIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInNlbmQiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInZhbGlkYXRlUmVzcG9uc2UiLCJleHRyYWN0RGF0YSIsImV4dHJhY3RFcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdEVycm9yIiwiZXh0cmFjdERhdGEiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdERhdGEiLCJzdWNjZXNzIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJlc3RhcnQiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJzdWNjZXNzIiwiY29tcGxldGUiLCJjb21wbGV0ZSIsZSksdGhpcy5hZGRTdGF0ZSgiZXJyb3IiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJjb21wbGV0ZSIsbnVsbCxudWxsLGUpfSxjLnNldHVwU3RhdGVzKCksbi5SZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxvKXt2YXIgcz1lLmVuZHBvaW50LGE9ZS5jb25maWcucmVnaW9uLHU9ZS5jb25maWcuY3VzdG9tVXNlckFnZW50O2Uuc2lnbmluZ1JlZ2lvbj9hPWUuc2lnbmluZ1JlZ2lvbjplLmlzR2xvYmFsRW5kcG9pbnQmJihhPSJ1cy1lYXN0LTEiKSx0aGlzLmRvbWFpbj1pJiZpLmFjdGl2ZSx0aGlzLnNlcnZpY2U9ZSx0aGlzLm9wZXJhdGlvbj10LHRoaXMucGFyYW1zPW98fHt9LHRoaXMuaHR0cFJlcXVlc3Q9bmV3IG4uSHR0cFJlcXVlc3QocyxhKSx0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KHUpLHRoaXMuc3RhcnRUaW1lPWUuZ2V0U2tld0NvcnJlY3RlZERhdGUoKSx0aGlzLnJlc3BvbnNlPW5ldyBuLlJlc3BvbnNlKHRoaXMpLHRoaXMuX2FzbT1uZXcgcihjLnN0YXRlcywidmFsaWRhdGUiKSx0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksdGhpcy5lbWl0PXRoaXMuZW1pdEV2ZW50fSxzZW5kOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYodGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiY2FsbGJhY2siKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe2UuY2FsbCh0LHQuZXJyb3IsdC5kYXRhKX0pKSksdGhpcy5ydW5UbygpLHRoaXMucmVzcG9uc2V9LGJ1aWxkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJ1blRvKCJzZW5kIixlKX0scnVuVG86ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fYXNtLnJ1blRvKGUsdCx0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygidmFsaWRhdGVSZXNwb25zZSIpLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJleHRyYWN0RXJyb3IiKSx0aGlzLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7ZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yKCJSZXF1ZXN0IGFib3J0ZWQgYnkgdXNlciIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIixyZXRyeWFibGU6ITF9KX0pKSx0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbSYmIXRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtLmRpZENhbGxiYWNrJiYodGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uYWJvcnQoKSx0aGlzLmh0dHBSZXF1ZXN0Ll9hYm9ydENhbGxiYWNrP3RoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2soKTp0aGlzLnJlbW92ZUFsbExpc3RlbmVycygic2VuZCIpKSx0aGlzfSxlYWNoUGFnZTpmdW5jdGlvbihlKXtlPW4udXRpbC5mbi5tYWtlQXN5bmMoZSwzKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uIHQocil7ZS5jYWxsKHIsci5lcnJvcixyLmRhdGEsKGZ1bmN0aW9uKG8peyExIT09byYmKHIuaGFzTmV4dFBhZ2UoKT9yLm5leHRQYWdlKCkub24oImNvbXBsZXRlIix0KS5zZW5kKCk6ZS5jYWxsKHIsbnVsbCxudWxsLG4udXRpbC5mbi5ub29wKSl9KSl9KSkuc2VuZCgpfSxlYWNoSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZWFjaFBhZ2UoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZShyLG51bGwpO2lmKG51bGw9PT1vKXJldHVybiBlKG51bGwsbnVsbCk7dmFyIGk9dC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodC5vcGVyYXRpb24pLnJlc3VsdEtleTtBcnJheS5pc0FycmF5KGkpJiYoaT1pWzBdKTt2YXIgYT1zLnNlYXJjaChvLGkpLGM9ITA7cmV0dXJuIG4udXRpbC5hcnJheUVhY2goYSwoZnVuY3Rpb24odCl7aWYoITE9PT0oYz1lKG51bGwsdCkpKXJldHVybiBuLnV0aWwuYWJvcnR9KSksY30pKX0saXNQYWdlYWJsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5vcGVyYXRpb24pfSxjcmVhdGVSZWFkU3RyZWFtOmZ1bmN0aW9uKCl7dmFyIGU9bi51dGlsLnN0cmVhbSxyPXRoaXMsbz1udWxsO3JldHVybiAyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPyhvPW5ldyBlLlBhc3NUaHJvdWdoLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpOigobz1uZXcgZS5TdHJlYW0pLnJlYWRhYmxlPSEwLG8uc2VudD0hMSxvLm9uKCJuZXdMaXN0ZW5lciIsKGZ1bmN0aW9uKGUpe28uc2VudHx8ImRhdGEiIT09ZXx8KG8uc2VudD0hMCx0Lm5leHRUaWNrKChmdW5jdGlvbigpe3Iuc2VuZCgpfSkpKX0pKSksdGhpcy5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtvLmVtaXQoImVycm9yIixlKX0pKSx0aGlzLm9uKCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKHQsaSxzKXtpZih0PDMwMCl7ci5yZW1vdmVMaXN0ZW5lcigiaHR0cERhdGEiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5IVFRQX0RBVEEpLHIucmVtb3ZlTGlzdGVuZXIoImh0dHBFcnJvciIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfRVJST1IpLHIub24oImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe3MuZXJyb3I9ZSxzLmVycm9yLnJldHJ5YWJsZT0hMX0pKTt2YXIgYSxjPSExO2lmKCJIRUFEIiE9PXIuaHR0cFJlcXVlc3QubWV0aG9kJiYoYT1wYXJzZUludChpWyJjb250ZW50LWxlbmd0aCJdLDEwKSksdm9pZCAwIT09YSYmIWlzTmFOKGEpJiZhPj0wKXtjPSEwO3ZhciB1PTB9dmFyIGw9ZnVuY3Rpb24oKXtjJiZ1IT09YT9vLmVtaXQoImVycm9yIixuLnV0aWwuZXJyb3IobmV3IEVycm9yKCJTdHJlYW0gY29udGVudCBsZW5ndGggbWlzbWF0Y2guIFJlY2VpdmVkICIrdSsiIG9mICIrYSsiIGJ5dGVzLiIpLHtjb2RlOiJTdHJlYW1Db250ZW50TGVuZ3RoTWlzbWF0Y2gifSkpOjI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/by5lbmQoKTpvLmVtaXQoImVuZCIpfSxwPXMuaHR0cFJlc3BvbnNlLmNyZWF0ZVVuYnVmZmVyZWRTdHJlYW0oKTtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKWlmKGMpe3ZhciBkPW5ldyBlLlBhc3NUaHJvdWdoO2QuX3dyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aCYmKHUrPXQubGVuZ3RoKSxlLlBhc3NUaHJvdWdoLnByb3RvdHlwZS5fd3JpdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkLm9uKCJlbmQiLGwpLG8ub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxwLnVucGlwZShkKSxkLmVtaXQoImVuZCIpLGQuZW5kKCl9KSkscC5waXBlKGQpLnBpcGUobyx7ZW5kOiExfSl9ZWxzZSBwLnBpcGUobyk7ZWxzZSBjJiZwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7ZSYmZS5sZW5ndGgmJih1Kz1lLmxlbmd0aCl9KSkscC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZGF0YSIsZSl9KSkscC5vbigiZW5kIixsKTtwLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe2M9ITEsby5lbWl0KCJlcnJvciIsZSl9KSl9fSkpLG99LGVtaXRFdmVudDpmdW5jdGlvbihlLHQscil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQsdD1udWxsKSxyfHwocj1mdW5jdGlvbigpe30pLHR8fCh0PXRoaXMuZXZlbnRQYXJhbWV0ZXJzKGUsdGhpcy5yZXNwb25zZSkpLG4uU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5lbWl0LmNhbGwodGhpcyxlLHQsKGZ1bmN0aW9uKGUpe2UmJih0aGlzLnJlc3BvbnNlLmVycm9yPWUpLHIuY2FsbCh0aGlzLGUpfSkpfSxldmVudFBhcmFtZXRlcnM6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UicmVzdGFydCI6Y2FzZSJ2YWxpZGF0ZSI6Y2FzZSJzaWduIjpjYXNlImJ1aWxkIjpjYXNlImFmdGVyVmFsaWRhdGUiOmNhc2UiYWZ0ZXJCdWlsZCI6cmV0dXJuW3RoaXNdO2Nhc2UiZXJyb3IiOnJldHVyblt0aGlzLnJlc3BvbnNlLmVycm9yLHRoaXMucmVzcG9uc2VdO2RlZmF1bHQ6cmV0dXJuW3RoaXMucmVzcG9uc2VdfX0scHJlc2lnbjpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KHQ9ZSxlPW51bGwpLChuZXcgbi5TaWduZXJzLlByZXNpZ24pLnNpZ24odGhpcy50b0dldCgpLGUsdCl9LGlzUHJlc2lnbmVkOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMsInByZXNpZ25lZC1leHBpcmVzIil9LHRvVW5hdXRoZW50aWNhdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZD0hMCx0aGlzLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsbi5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX0NSRURFTlRJQUxTKSx0aGlzLnJlbW92ZUxpc3RlbmVyKCJzaWduIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0lHTiksdGhpc30sdG9HZXQ6ZnVuY3Rpb24oKXtyZXR1cm4icXVlcnkiIT09dGhpcy5zZXJ2aWNlLmFwaS5wcm90b2NvbCYmImVjMiIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sfHwodGhpcy5yZW1vdmVMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCksdGhpcy5hZGRMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCkpLHRoaXN9LGJ1aWxkQXNHZXQ6ZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5tZXRob2Q9IkdFVCIsZS5odHRwUmVxdWVzdC5wYXRoPWUuc2VydmljZS5lbmRwb2ludC5wYXRoKyI/IitlLmh0dHBSZXF1ZXN0LmJvZHksZS5odHRwUmVxdWVzdC5ib2R5PSIiLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl19LGhhbHRIYW5kbGVyc09uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSEwfX0pLG4uUmVxdWVzdC5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucHJvbWlzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoInByb21pc2UiKSxuZXcgZSgoZnVuY3Rpb24oZSxuKXt0Lm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/bih0LmVycm9yKTplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LmRhdGF8fHt9LCIkcmVzcG9uc2UiLHt2YWx1ZTp0fSkpfSkpLHQucnVuVG8oKX0pKX19LG4uUmVxdWVzdC5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5wcm9taXNlfSxuLnV0aWwuYWRkUHJvbWlzZXMobi5SZXF1ZXN0KSxuLnV0aWwubWl4aW4obi5SZXF1ZXN0LG4uU2VxdWVudGlhbEV4ZWN1dG9yKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9zdGF0ZV9tYWNoaW5lIjo3MyxfcHJvY2Vzczo5MSxqbWVzcGF0aDo5MH1dLDU5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnJlcXVlc3QuX3dhaXRlcixuPXQuY29uZmlnLmFjY2VwdG9ycyxyPSExLG89InJldHJ5IjtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe2lmKCFyKXt2YXIgaT10Lm1hdGNoZXJzW24ubWF0Y2hlcl07aSYmaShlLG4uZXhwZWN0ZWQsbi5hcmd1bWVudCkmJihyPSEwLG89bi5zdGF0ZSl9fSkpLCFyJiZlLmVycm9yJiYobz0iZmFpbHVyZSIpLCJzdWNjZXNzIj09PW8/dC5zZXRTdWNjZXNzKGUpOnQuc2V0RXJyb3IoZSwicmV0cnkiPT09byl9ci5SZXNvdXJjZVdhaXRlcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3RoaXMuc2VydmljZT1lLHRoaXMuc3RhdGU9dCx0aGlzLmxvYWRXYWl0ZXJDb25maWcodGhpcy5zdGF0ZSl9LHNlcnZpY2U6bnVsbCxzdGF0ZTpudWxsLGNvbmZpZzpudWxsLG1hdGNoZXJzOntwYXRoOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfXJldHVybiBpLnN0cmljdERlZXBFcXVhbChyLHQpfSxwYXRoQWxsOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7dmFyIG89ci5sZW5ndGg7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBzPTA7czxvO3MrKylpZighaS5zdHJpY3REZWVwRXF1YWwocltzXSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0scGF0aEFueTpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1BcnJheS5pc0FycmF5KHIpfHwocj1bcl0pO2Zvcih2YXIgbz1yLmxlbmd0aCxzPTA7czxvO3MrKylpZihpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiEwO3JldHVybiExfSxzdGF0dXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmbj09PXR9LGVycm9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZlLmVycm9yP3Q9PT1lLmVycm9yLmNvZGU6dD09PSEhZS5lcnJvcn19LGxpc3RlbmVyczoobmV3IHIuU2VxdWVudGlhbEV4ZWN1dG9yKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyO2UuZXJyb3ImJiJSZXNvdXJjZU5vdFJlYWR5Ij09PWUuZXJyb3IuY29kZSYmKGUuZXJyb3IucmV0cnlEZWxheT0xZTMqKHQuY29uZmlnLmRlbGF5fHwwKSl9KSksZSgiQ0hFQ0tfT1VUUFVUIiwiZXh0cmFjdERhdGEiLHMpLGUoIkNIRUNLX0VSUk9SIiwiZXh0cmFjdEVycm9yIixzKX0pKSx3YWl0OmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGUmJmUuJHdhaXRlciYmKCJudW1iZXIiPT10eXBlb2YoZT1yLnV0aWwuY29weShlKSkuJHdhaXRlci5kZWxheSYmKHRoaXMuY29uZmlnLmRlbGF5PWUuJHdhaXRlci5kZWxheSksIm51bWJlciI9PXR5cGVvZiBlLiR3YWl0ZXIubWF4QXR0ZW1wdHMmJih0aGlzLmNvbmZpZy5tYXhBdHRlbXB0cz1lLiR3YWl0ZXIubWF4QXR0ZW1wdHMpLGRlbGV0ZSBlLiR3YWl0ZXIpO3ZhciBuPXRoaXMuc2VydmljZS5tYWtlUmVxdWVzdCh0aGlzLmNvbmZpZy5vcGVyYXRpb24sZSk7cmV0dXJuIG4uX3dhaXRlcj10aGlzLG4ucmVzcG9uc2UubWF4UmV0cmllcz10aGlzLmNvbmZpZy5tYXhBdHRlbXB0cyxuLmFkZExpc3RlbmVycyh0aGlzLmxpc3RlbmVycyksdCYmbi5zZW5kKHQpLG59LHNldFN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZS5lcnJvcj1udWxsLGUuZGF0YT1lLmRhdGF8fHt9LGUucmVxdWVzdC5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3REYXRhIil9LHNldEVycm9yOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhPW51bGwsZS5lcnJvcj1yLnV0aWwuZXJyb3IoZS5lcnJvcnx8bmV3IEVycm9yLHtjb2RlOiJSZXNvdXJjZU5vdFJlYWR5IixtZXNzYWdlOiJSZXNvdXJjZSBpcyBub3QgaW4gdGhlIHN0YXRlICIrdGhpcy5zdGF0ZSxyZXRyeWFibGU6dH0pfSxsb2FkV2FpdGVyQ29uZmlnOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlN0YXRlTm90Rm91bmRFcnJvciIsbWVzc2FnZToiU3RhdGUgIitlKyIgbm90IGZvdW5kLiJ9KTt0aGlzLmNvbmZpZz1yLnV0aWwuY29weSh0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pfX0pfSx7Ii4vY29yZSI6MTksam1lc3BhdGg6OTB9XSw2MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT1lKCJqbWVzcGF0aCIpO3IuUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0PWUsdGhpcy5kYXRhPW51bGwsdGhpcy5lcnJvcj1udWxsLHRoaXMucmV0cnlDb3VudD0wLHRoaXMucmVkaXJlY3RDb3VudD0wLHRoaXMuaHR0cFJlc3BvbnNlPW5ldyByLkh0dHBSZXNwb25zZSxlJiYodGhpcy5tYXhSZXRyaWVzPWUuc2VydmljZS5udW1SZXRyaWVzKCksdGhpcy5tYXhSZWRpcmVjdHM9ZS5zZXJ2aWNlLmNvbmZpZy5tYXhSZWRpcmVjdHMpfSxuZXh0UGFnZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMucmVxdWVzdC5zZXJ2aWNlLG89dGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbjt0cnl7dD1uLnBhZ2luYXRpb25Db25maWcobywhMCl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfWlmKCF0aGlzLmhhc05leHRQYWdlKCkpe2lmKGUpZSh0aGlzLmVycm9yLG51bGwpO2Vsc2UgaWYodGhpcy5lcnJvcil0aHJvdyB0aGlzLmVycm9yO3JldHVybiBudWxsfXZhciBpPXIudXRpbC5jb3B5KHRoaXMucmVxdWVzdC5wYXJhbXMpO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnMpe3ZhciBzPXQuaW5wdXRUb2tlbjsic3RyaW5nIj09dHlwZW9mIHMmJihzPVtzXSk7Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspaVtzW2FdXT10aGlzLm5leHRQYWdlVG9rZW5zW2FdO3JldHVybiBuLm1ha2VSZXF1ZXN0KHRoaXMucmVxdWVzdC5vcGVyYXRpb24saSxlKX1yZXR1cm4gZT9lKG51bGwsbnVsbCk6bnVsbH0saGFzTmV4dFBhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZU5leHRQYWdlVG9rZW5zKCksISF0aGlzLm5leHRQYWdlVG9rZW5zfHx2b2lkIDA9PT10aGlzLm5leHRQYWdlVG9rZW5zJiZ2b2lkIDB9LGNhY2hlTmV4dFBhZ2VUb2tlbnM6ZnVuY3Rpb24oKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywibmV4dFBhZ2VUb2tlbnMiKSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2Vuczt0aGlzLm5leHRQYWdlVG9rZW5zPXZvaWQgMDt2YXIgZT10aGlzLnJlcXVlc3Quc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHRoaXMucmVxdWVzdC5vcGVyYXRpb24pO2lmKCFlKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnM9bnVsbCxlLm1vcmVSZXN1bHRzJiYhaS5zZWFyY2godGhpcy5kYXRhLGUubW9yZVJlc3VsdHMpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3ZhciB0PWUub3V0cHV0VG9rZW47cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLHQsKGZ1bmN0aW9uKGUpe3ZhciB0PWkuc2VhcmNoKHRoaXMuZGF0YSxlKTt0JiYodGhpcy5uZXh0UGFnZVRva2Vucz10aGlzLm5leHRQYWdlVG9rZW5zfHxbXSx0aGlzLm5leHRQYWdlVG9rZW5zLnB1c2godCkpfSkpLHRoaXMubmV4dFBhZ2VUb2tlbnN9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MH1dLDYxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIik7ci5TZXF1ZW50aWFsRXhlY3V0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnRzPXt9fSxsaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50c1tlXT90aGlzLl9ldmVudHNbZV0uc2xpY2UoMCk6W119LG9uOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP24/dGhpcy5fZXZlbnRzW2VdLnVuc2hpZnQodCk6dGhpcy5fZXZlbnRzW2VdLnB1c2godCk6dGhpcy5fZXZlbnRzW2VdPVt0XSx0aGlzfSxvbkFzeW5jOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5faXNBc3luYz0hMCx0aGlzLm9uKGUsdCxuKX0scmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ldmVudHNbZV07aWYobil7Zm9yKHZhciByPW4ubGVuZ3RoLG89LTEsaT0wO2k8cjsrK2kpbltpXT09PXQmJihvPWkpO28+LTEmJm4uc3BsaWNlKG8sMSl9cmV0dXJuIHRoaXN9LHJlbW92ZUFsbExpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gZT9kZWxldGUgdGhpcy5fZXZlbnRzW2VdOnRoaXMuX2V2ZW50cz17fSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUsdCxuKXtufHwobj1mdW5jdGlvbigpe30pO3ZhciByPXRoaXMubGlzdGVuZXJzKGUpLG89ci5sZW5ndGg7cmV0dXJuIHRoaXMuY2FsbExpc3RlbmVycyhyLHQsbiksbz4wfSxjYWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXRoaXMscz1vfHxudWxsO2Z1bmN0aW9uIGEobyl7aWYobyYmKHM9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixvKSxpLl9oYWx0SGFuZGxlcnNPbkVycm9yKSlyZXR1cm4gbi5jYWxsKGkscyk7aS5jYWxsTGlzdGVuZXJzKGUsdCxuLHMpfWZvcig7ZS5sZW5ndGg+MDspe3ZhciBjPWUuc2hpZnQoKTtpZihjLl9pc0FzeW5jKXJldHVybiB2b2lkIGMuYXBwbHkoaSx0LmNvbmNhdChbYV0pKTt0cnl7Yy5hcHBseShpLHQpfWNhdGNoKGUpe3M9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixlKX1pZihzJiZpLl9oYWx0SGFuZGxlcnNPbkVycm9yKXJldHVybiB2b2lkIG4uY2FsbChpLHMpfW4uY2FsbChpLHMpfSxhZGRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZS5fZXZlbnRzJiYoZT1lLl9ldmVudHMpLHIudXRpbC5lYWNoKGUsKGZ1bmN0aW9uKGUsbil7ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPVtuXSksci51dGlsLmFycmF5RWFjaChuLChmdW5jdGlvbihuKXt0Lm9uKGUsbil9KSl9KSksdH0sYWRkTmFtZWRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpc1tlXT1uLHRoaXMuYWRkTGlzdGVuZXIodCxuLHIpLHRoaXN9LGFkZE5hbWVkQXN5bmNMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbi5faXNBc3luYz0hMCx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoZSx0LG4scil9LGFkZE5hbWVkTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoKGZ1bmN0aW9uKCl7dC5hZGROYW1lZExpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pLChmdW5jdGlvbigpe3QuYWRkTmFtZWRBc3luY0xpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pKSx0aGlzfX0pLHIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1yLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUub24sdC5leHBvcnRzPXIuU2VxdWVudGlhbEV4ZWN1dG9yfSx7Ii4vY29yZSI6MTl9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKSxvPWUoIi4vbW9kZWwvYXBpIiksaT1lKCIuL3JlZ2lvbl9jb25maWciKSxzPXIudXRpbC5pbmhlcml0LGE9MCxjPWUoIi4vcmVnaW9uL3V0aWxzIik7ci5TZXJ2aWNlPXMoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmxvYWRTZXJ2aWNlQ2xhc3MpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvciwiU2VydmljZSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYG5ldycgb3BlcmF0b3IiKTtpZihlKXtpZihlLnJlZ2lvbil7dmFyIHQ9ZS5yZWdpb247Yy5pc0ZpcHNSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCksZS51c2VGaXBzRW5kcG9pbnQ9ITApLGMuaXNHbG9iYWxSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCkpfSJib29sZWFuIj09dHlwZW9mIGUudXNlRHVhbHN0YWNrJiYiYm9vbGVhbiIhPXR5cGVvZiBlLnVzZUR1YWxzdGFja0VuZHBvaW50JiYoZS51c2VEdWFsc3RhY2tFbmRwb2ludD1lLnVzZUR1YWxzdGFjayl9dmFyIG49dGhpcy5sb2FkU2VydmljZUNsYXNzKGV8fHt9KTtpZihuKXt2YXIgbz1yLnV0aWwuY29weShlKSxpPW5ldyBuKGUpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwiX29yaWdpbmFsQ29uZmlnIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksaS5fY2xpZW50SWQ9KythLGl9dGhpcy5pbml0aWFsaXplKGUpfSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3ZhciB0PXIuY29uZmlnW3RoaXMuc2VydmljZUlkZW50aWZpZXJdO2lmKHRoaXMuY29uZmlnPW5ldyByLkNvbmZpZyhyLmNvbmZpZyksdCYmdGhpcy5jb25maWcudXBkYXRlKHQsITApLGUmJnRoaXMuY29uZmlnLnVwZGF0ZShlLCEwKSx0aGlzLnZhbGlkYXRlU2VydmljZSgpLHRoaXMuY29uZmlnLmVuZHBvaW50fHxpLmNvbmZpZ3VyZUVuZHBvaW50KHRoaXMpLHRoaXMuY29uZmlnLmVuZHBvaW50PXRoaXMuZW5kcG9pbnRGcm9tVGVtcGxhdGUodGhpcy5jb25maWcuZW5kcG9pbnQpLHRoaXMuc2V0RW5kcG9pbnQodGhpcy5jb25maWcuZW5kcG9pbnQpLHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksci5TZXJ2aWNlLmFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzKHRoaXMpLCh0aGlzLmNvbmZpZy5jbGllbnRTaWRlTW9uaXRvcmluZ3x8ci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZykmJnRoaXMucHVibGlzaGVyKXt2YXIgbz10aGlzLnB1Ymxpc2hlcjt0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0NBTEwiLCJhcGlDYWxsIiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKSx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0FUVEVNUFQiLCJhcGlDYWxsQXR0ZW1wdCIsKGZ1bmN0aW9uKGUpe24ubmV4dFRpY2soKGZ1bmN0aW9uKCl7by5ldmVudEhhbmRsZXIoZSl9KSl9KSl9fSx2YWxpZGF0ZVNlcnZpY2U6ZnVuY3Rpb24oKXt9LGxvYWRTZXJ2aWNlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtpZihyLnV0aWwuaXNFbXB0eSh0aGlzLmFwaSkpe2lmKHQuYXBpQ29uZmlnKXJldHVybiByLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLHQuYXBpQ29uZmlnKTtpZih0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKXsodD1uZXcgci5Db25maWcoci5jb25maWcpKS51cGRhdGUoZSwhMCk7dmFyIG49dC5hcGlWZXJzaW9uc1t0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyXTtyZXR1cm4gbj1ufHx0LmFwaVZlcnNpb24sdGhpcy5nZXRMYXRlc3RTZXJ2aWNlQ2xhc3Mobil9cmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LGdldExhdGVzdFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZT10aGlzLmdldExhdGVzdFNlcnZpY2VWZXJzaW9uKGUpLG51bGw9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzW2VdJiZyLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLGUpLHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV19LGdldExhdGVzdFNlcnZpY2VWZXJzaW9uOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzfHwwPT09dGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBzZXJ2aWNlcyBkZWZpbmVkIG9uICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcik7aWYoZT9yLnV0aWwuaXNUeXBlKGUsRGF0ZSkmJihlPXIudXRpbC5kYXRlLmlzbzg2MDEoZSkuc3BsaXQoIlQiKVswXSk6ZT0ibGF0ZXN0IixPYmplY3QuaGFzT3duUHJvcGVydHkodGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcyxlKSlyZXR1cm4gZTtmb3IodmFyIHQ9T2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcykuc29ydCgpLG49bnVsbCxvPXQubGVuZ3RoLTE7bz49MDtvLS0paWYoIioiIT09dFtvXVt0W29dLmxlbmd0aC0xXSYmKG49dFtvXSksdFtvXS5zdWJzdHIoMCwxMCk8PWUpcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCAiK3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXIrIiBBUEkgdG8gc2F0aXNmeSB2ZXJzaW9uIGNvbnN0cmFpbnQgYCIrZSsiJyIpfSxhcGk6e30sZGVmYXVsdFJldHJ5Q291bnQ6MyxjdXN0b21pemVSZXF1ZXN0czpmdW5jdGlvbihlKXtpZihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FsbGJhY2sgdHlwZSAnIit0eXBlb2YgZSsiJyBwcm92aWRlZCBpbiBjdXN0b21pemVSZXF1ZXN0cyIpO3RoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9ZX1lbHNlIHRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9bnVsbH0sbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdD10fHx7fSx0aGlzLmNvbmZpZy5wYXJhbXMpe3ZhciBvPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV07byYmKHQ9ci51dGlsLmNvcHkodCksci51dGlsLmVhY2godGhpcy5jb25maWcucGFyYW1zLChmdW5jdGlvbihlLG4pe28uaW5wdXQubWVtYmVyc1tlXSYmKHZvaWQgMCE9PXRbZV0mJm51bGwhPT10W2VdfHwodFtlXT1uKSl9KSkpfXZhciBpPW5ldyByLlJlcXVlc3QodGhpcyxlLHQpO3JldHVybiB0aGlzLmFkZEFsbFJlcXVlc3RMaXN0ZW5lcnMoaSksdGhpcy5hdHRhY2hNb25pdG9yaW5nRW1pdHRlcihpKSxuJiZpLnNlbmQobiksaX0sbWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9e30pO3ZhciByPXRoaXMubWFrZVJlcXVlc3QoZSx0KS50b1VuYXV0aGVudGljYXRlZCgpO3JldHVybiBuP3Iuc2VuZChuKTpyfSx3YWl0Rm9yOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IHIuUmVzb3VyY2VXYWl0ZXIodGhpcyxlKS53YWl0KHQsbil9LGFkZEFsbFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtyLmV2ZW50cyxyLkV2ZW50TGlzdGVuZXJzLkNvcmUsdGhpcy5zZXJ2aWNlSW50ZXJmYWNlKCksci5FdmVudExpc3RlbmVycy5Db3JlUG9zdF0sbj0wO248dC5sZW5ndGg7bisrKXRbbl0mJmUuYWRkTGlzdGVuZXJzKHRbbl0pO3RoaXMuY29uZmlnLnBhcmFtVmFsaWRhdGlvbnx8ZS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSx0aGlzLmNvbmZpZy5sb2dnZXImJmUuYWRkTGlzdGVuZXJzKHIuRXZlbnRMaXN0ZW5lcnMuTG9nZ2VyKSx0aGlzLnNldHVwUmVxdWVzdExpc3RlbmVycyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXImJnRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJjdXN0b21SZXF1ZXN0SGFuZGxlciIpJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcihlKX0sYXBpQ2FsbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbCIsQXBpOnQ/dC5uYW1lOmUub3BlcmF0aW9uLFZlcnNpb246MSxTZXJ2aWNlOmUuc2VydmljZS5hcGkuc2VydmljZUlkfHxlLnNlcnZpY2UuYXBpLmVuZHBvaW50UHJlZml4LFJlZ2lvbjplLmh0dHBSZXF1ZXN0LnJlZ2lvbixNYXhSZXRyaWVzRXhjZWVkZWQ6MCxVc2VyQWdlbnQ6ZS5odHRwUmVxdWVzdC5nZXRVc2VyQWdlbnQoKX0scj1lLnJlc3BvbnNlO2lmKHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkZpbmFsSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksci5lcnJvcil7dmFyIG89ci5lcnJvcjtyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPjI5OT8oby5jb2RlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbj1vLmNvZGUpLG8ubWVzc2FnZSYmKG4uRmluYWxBd3NFeGNlcHRpb25NZXNzYWdlPW8ubWVzc2FnZSkpOigoby5jb2RlfHxvLm5hbWUpJiYobi5GaW5hbFNka0V4Y2VwdGlvbj1vLmNvZGV8fG8ubmFtZSksby5tZXNzYWdlJiYobi5GaW5hbFNka0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSl9cmV0dXJuIG59LGFwaUF0dGVtcHRFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49e1R5cGU6IkFwaUNhbGxBdHRlbXB0IixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsRnFkbjplLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7cmV0dXJuIHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkh0dHBTdGF0dXNDb2RlPXIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpLCFlLl91bkF1dGhlbnRpY2F0ZWQmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJihuLkFjY2Vzc0tleT1lLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPyhlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0mJihuLlNlc3Npb25Ub2tlbj1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXSYmKG4uWEFtem5SZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0mJihuLlhBbXpSZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0mJihuLlhBbXpJZDI9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotaWQtMiJdKSxuKTpufSxhdHRlbXB0RmFpbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYXBpQXR0ZW1wdEV2ZW50KGUpLG49ZS5yZXNwb25zZSxyPW4uZXJyb3I7cmV0dXJuIG4uaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhyLmNvZGUmJih0LkF3c0V4Y2VwdGlvbj1yLmNvZGUpLHIubWVzc2FnZSYmKHQuQXdzRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKTooKHIuY29kZXx8ci5uYW1lKSYmKHQuU2RrRXhjZXB0aW9uPXIuY29kZXx8ci5uYW1lKSxyLm1lc3NhZ2UmJih0LlNka0V4Y2VwdGlvbk1lc3NhZ2U9ci5tZXNzYWdlKSksdH0sYXR0YWNoTW9uaXRvcmluZ0VtaXR0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixvLGkscyxhLGM9MCx1PXRoaXM7ZS5vbigidmFsaWRhdGUiLChmdW5jdGlvbigpe2k9ci51dGlsLnJlYWxDbG9jay5ub3coKSxhPURhdGUubm93KCl9KSwhMCksZS5vbigic2lnbiIsKGZ1bmN0aW9uKCl7bj1yLnV0aWwucmVhbENsb2NrLm5vdygpLHQ9RGF0ZS5ub3coKSxzPWUuaHR0cFJlcXVlc3QucmVnaW9uLGMrK30pLCEwKSxlLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oKXtvPU1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMX0FUVEVNUFQiLCJzdWNjZXNzIiwoZnVuY3Rpb24oKXt2YXIgbj11LmFwaUF0dGVtcHRFdmVudChlKTtuLlRpbWVzdGFtcD10LG4uQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsbi5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0Iixbbl0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVF9SRVRSWSIsInJldHJ5IiwoZnVuY3Rpb24oKXt2YXIgaT11LmF0dGVtcHRGYWlsRXZlbnQoZSk7aS5UaW1lc3RhbXA9dCxvPW98fE1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKSxpLkF0dGVtcHRMYXRlbmN5PW8+PTA/bzowLGkuUmVnaW9uPXMsdS5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW2ldKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMIiwiY29tcGxldGUiLChmdW5jdGlvbigpe3ZhciB0PXUuYXBpQ2FsbEV2ZW50KGUpO2lmKHQuQXR0ZW1wdENvdW50PWMsISh0LkF0dGVtcHRDb3VudDw9MCkpe3QuVGltZXN0YW1wPWE7dmFyIG49TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLWkpO3QuTGF0ZW5jeT1uPj0wP246MDt2YXIgbz1lLnJlc3BvbnNlO28uZXJyb3ImJm8uZXJyb3IucmV0cnlhYmxlJiYibnVtYmVyIj09dHlwZW9mIG8ucmV0cnlDb3VudCYmIm51bWJlciI9PXR5cGVvZiBvLm1heFJldHJpZXMmJm8ucmV0cnlDb3VudD49by5tYXhSZXRyaWVzJiYodC5NYXhSZXRyaWVzRXhjZWVkZWQ9MSksdS5lbWl0KCJhcGlDYWxsIixbdF0pfX0pKX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe30sZ2V0U2lnbmluZ05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcGkuc2lnbmluZ05hbWV8fHRoaXMuYXBpLmVuZHBvaW50UHJlZml4fSxnZXRTaWduZXJDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsbz0iIjtyZXR1cm4gZSYmKG89KG49KGUuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXXx8bnVsbCk/bi5hdXRodHlwZToiIiksdD10aGlzLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uP3RoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb246InY0Ij09PW98fCJ2NC11bnNpZ25lZC1ib2R5Ij09PW8/InY0IjoiYmVhcmVyIj09PW8/ImJlYXJlciI6dGhpcy5hcGkuc2lnbmF0dXJlVmVyc2lvbixyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uKHQpfSxzZXJ2aWNlSW50ZXJmYWNlOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImVjMiI6Y2FzZSJxdWVyeSI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUXVlcnk7Y2FzZSJqc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5Kc29uO2Nhc2UicmVzdC1qc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0SnNvbjtjYXNlInJlc3QteG1sIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0WG1sfWlmKHRoaXMuYXBpLnByb3RvY29sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZXJ2aWNlIGBwcm90b2NvbCcgIit0aGlzLmFwaS5wcm90b2NvbCsiIGluIEFQSSBjb25maWciKX0sc3VjY2Vzc2Z1bFJlc3BvbnNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPDMwMH0sbnVtUmV0cmllczpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMuY29uZmlnLm1heFJldHJpZXM6dGhpcy5kZWZhdWx0UmV0cnlDb3VudH0scmV0cnlEZWxheXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkoZSx0aGlzLmNvbmZpZy5yZXRyeURlbGF5T3B0aW9ucyx0KX0scmV0cnlhYmxlRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLnRpbWVvdXRFcnJvcihlKXx8ISF0aGlzLm5ldHdvcmtpbmdFcnJvcihlKXx8ISF0aGlzLmV4cGlyZWRDcmVkZW50aWFsc0Vycm9yKGUpfHwhIXRoaXMudGhyb3R0bGVkRXJyb3IoZSl8fGUuc3RhdHVzQ29kZT49NTAwfSxuZXR3b3JraW5nRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIk5ldHdvcmtpbmdFcnJvciI9PT1lLmNvZGV9LHRpbWVvdXRFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iVGltZW91dEVycm9yIj09PWUuY29kZX0sZXhwaXJlZENyZWRlbnRpYWxzRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI9PT1lLmNvZGV9LGNsb2NrU2tld0Vycm9yOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UiUmVxdWVzdFRpbWVUb29Ta2V3ZWQiOmNhc2UiUmVxdWVzdEV4cGlyZWQiOmNhc2UiSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbiI6Y2FzZSJTaWduYXR1cmVEb2VzTm90TWF0Y2giOmNhc2UiQXV0aEZhaWx1cmUiOmNhc2UiUmVxdWVzdEluVGhlRnV0dXJlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZ2V0U2tld0NvcnJlY3RlZERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSt0aGlzLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCl9LGFwcGx5Q2xvY2tPZmZzZXQ6ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0PWUtRGF0ZS5ub3coKSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gTWF0aC5hYnModGhpcy5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLmdldFRpbWUoKS1lKT49M2U1fSx0aHJvdHRsZWRFcnJvcjpmdW5jdGlvbihlKXtpZig0Mjk9PT1lLnN0YXR1c0NvZGUpcmV0dXJuITA7c3dpdGNoKGUuY29kZSl7Y2FzZSJQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEV4Y2VwdGlvbiI6Y2FzZSJUaHJvdHRsaW5nIjpjYXNlIlRocm90dGxpbmdFeGNlcHRpb24iOmNhc2UiUmVxdWVzdExpbWl0RXhjZWVkZWQiOmNhc2UiUmVxdWVzdFRocm90dGxlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkRXhjZXB0aW9uIjpjYXNlIlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiI6Y2FzZSJUcmFuc2FjdGlvbkluUHJvZ3Jlc3NFeGNlcHRpb24iOmNhc2UiRUMyVGhyb3R0bGVkRXhjZXB0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZW5kcG9pbnRGcm9tVGVtcGxhdGU6ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWU7cmV0dXJuIHQ9KHQ9KHQ9dC5yZXBsYWNlKC9ce3NlcnZpY2VcfS9nLHRoaXMuYXBpLmVuZHBvaW50UHJlZml4KSkucmVwbGFjZSgvXHtyZWdpb25cfS9nLHRoaXMuY29uZmlnLnJlZ2lvbikpLnJlcGxhY2UoL1x7c2NoZW1lXH0vZyx0aGlzLmNvbmZpZy5zc2xFbmFibGVkPyJodHRwcyI6Imh0dHAiKX0sc2V0RW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dGhpcy5lbmRwb2ludD1uZXcgci5FbmRwb2ludChlLHRoaXMuY29uZmlnKX0scGFnaW5hdGlvbkNvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV0ucGFnaW5hdG9yO2lmKCFuKXtpZih0KXt2YXIgbz1uZXcgRXJyb3I7dGhyb3cgci51dGlsLmVycm9yKG8sIk5vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbiBmb3IgIitlKX1yZXR1cm4gbnVsbH1yZXR1cm4gbn19KSxyLnV0aWwudXBkYXRlKHIuU2VydmljZSx7ZGVmaW5lTWV0aG9kczpmdW5jdGlvbihlKXtyLnV0aWwuZWFjaChlLnByb3RvdHlwZS5hcGkub3BlcmF0aW9ucywoZnVuY3Rpb24odCl7ZS5wcm90b3R5cGVbdF18fCgibm9uZSI9PT1lLnByb3RvdHlwZS5hcGkub3BlcmF0aW9uc1t0XS5hdXRodHlwZT9lLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KHQsZSxuKX06ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5tYWtlUmVxdWVzdCh0LGUsbil9KX0pKX0sZGVmaW5lU2VydmljZTpmdW5jdGlvbihlLHQsbil7ci5TZXJ2aWNlLl9zZXJ2aWNlTWFwW2VdPSEwLEFycmF5LmlzQXJyYXkodCl8fChuPXQsdD1bXSk7dmFyIG89cyhyLlNlcnZpY2Usbnx8e30pO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7ci5TZXJ2aWNlLmFkZFZlcnNpb25zKG8sdCk7dmFyIGk9by5zZXJ2aWNlSWRlbnRpZmllcnx8ZTtvLnNlcnZpY2VJZGVudGlmaWVyPWl9ZWxzZSBvLnByb3RvdHlwZS5hcGk9ZSxyLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhvKTtpZihyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMucHJvdG90eXBlKSwhdGhpcy5wcm90b3R5cGUucHVibGlzaGVyJiZyLnV0aWwuY2xpZW50U2lkZU1vbml0b3Jpbmcpe3ZhciBhPXIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5QdWJsaXNoZXIsYz0oMCxyLnV0aWwuY2xpZW50U2lkZU1vbml0b3JpbmcuY29uZmlnUHJvdmlkZXIpKCk7dGhpcy5wcm90b3R5cGUucHVibGlzaGVyPW5ldyBhKGMpLGMuZW5hYmxlZCYmKHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3Jpbmc9ITApfXJldHVybiByLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKG8ucHJvdG90eXBlKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnMoby5wcm90b3R5cGUpLG99LGFkZFZlcnNpb25zOmZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlLnNlcnZpY2VzPWUuc2VydmljZXN8fHt9O2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMD09PWUuc2VydmljZXNbdFtuXV0mJihlLnNlcnZpY2VzW3Rbbl1dPW51bGwpO2UuYXBpVmVyc2lvbnM9T2JqZWN0LmtleXMoZS5zZXJ2aWNlcykuc29ydCgpfSxkZWZpbmVTZXJ2aWNlQXBpOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1zKGUse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KTtmdW5jdGlvbiBhKHQpe3QuaXNBcGk/aS5wcm90b3R5cGUuYXBpPXQ6aS5wcm90b3R5cGUuYXBpPW5ldyBvKHQse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KX1pZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKG4pYShuKTtlbHNlIHRyeXthKHIuYXBpTG9hZGVyKGUuc2VydmljZUlkZW50aWZpZXIsdCkpfWNhdGNoKG4pe3Rocm93IHIudXRpbC5lcnJvcihuLHttZXNzYWdlOiJDb3VsZCBub3QgZmluZCBBUEkgY29uZmlndXJhdGlvbiAiK2Uuc2VydmljZUlkZW50aWZpZXIrIi0iK3R9KX1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5zZXJ2aWNlcyx0KXx8KGUuYXBpVmVyc2lvbnM9ZS5hcGlWZXJzaW9ucy5jb25jYXQodCkuc29ydCgpKSxlLnNlcnZpY2VzW3RdPWl9ZWxzZSBhKHQpO3JldHVybiByLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhpKSxpfSxoYXNTZXJ2aWNlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoci5TZXJ2aWNlLl9zZXJ2aWNlTWFwLGUpfSxhZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZE5hbWVkTGlzdGVuZXIoIk1PTklUT1JfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO24uX2V2ZW50cyYmbi5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW3RdKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkNBTExfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGwiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGwiLFt0XSl9KSl9LF9zZXJ2aWNlTWFwOnt9fSksci51dGlsLm1peGluKHIuU2VydmljZSxyLlNlcXVlbnRpYWxFeGVjdXRvciksdC5leHBvcnRzPXIuU2VydmljZX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9tb2RlbC9hcGkiOjQwLCIuL3JlZ2lvbi91dGlscyI6NTUsIi4vcmVnaW9uX2NvbmZpZyI6NTYsX3Byb2Nlc3M6OTF9XSw2MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL2NvbmZpZ19yZWdpb25hbF9lbmRwb2ludCIpO3IudXRpbC51cGRhdGUoci5TVFMucHJvdG90eXBlLHtjcmVkZW50aWFsc0Zyb206ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT8odHx8KHQ9bmV3IHIuVGVtcG9yYXJ5Q3JlZGVudGlhbHMpLHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRBY2Nlc3NLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbix0KTpudWxsfSxhc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkiLGUsdCl9LGFzc3VtZVJvbGVXaXRoU0FNTDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KCJhc3N1bWVSb2xlV2l0aFNBTUwiLGUsdCl9LHNldHVwUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZExpc3RlbmVyKCJ2YWxpZGF0ZSIsdGhpcy5vcHRJblJlZ2lvbmFsRW5kcG9pbnQsITApfSxvcHRJblJlZ2lvbmFsRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5jb25maWc7aWYobi5zdHNSZWdpb25hbEVuZHBvaW50cz1vKHQuX29yaWdpbmFsQ29uZmlnLHtlbnY6IkFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTIixzaGFyZWRDb25maWc6InN0c19yZWdpb25hbF9lbmRwb2ludHMiLGNsaWVudENvbmZpZzoic3RzUmVnaW9uYWxFbmRwb2ludHMifSksInJlZ2lvbmFsIj09PW4uc3RzUmVnaW9uYWxFbmRwb2ludHMmJnQuaXNHbG9iYWxFbmRwb2ludCl7aWYoIW4ucmVnaW9uKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSk7dmFyIGk9bi5lbmRwb2ludC5pbmRleE9mKCIuYW1hem9uYXdzLmNvbSIpLHM9bi5lbmRwb2ludC5zdWJzdHJpbmcoMCxpKSsiLiIrbi5yZWdpb24rbi5lbmRwb2ludC5zdWJzdHJpbmcoaSk7ZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChzKSxlLmh0dHBSZXF1ZXN0LnJlZ2lvbj1uLnJlZ2lvbn19fSl9LHsiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50IjoxOCwiLi4vY29yZSI6MTl9XSw2NDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLlNpZ25lcnMuQmVhcmVyPXIudXRpbC5pbmhlcml0KHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSl9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj0iQmVhcmVyICIrZS50b2tlbn19KX0seyIuLi9jb3JlIjoxOX1dLDY1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT0icHJlc2lnbmVkLWV4cGlyZXMiO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLG49ZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpO2lmKGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlVzZXItQWdlbnQiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Vc2VyLUFnZW50Il0sbj09PXIuU2lnbmVycy5WNCl7aWYodD42MDQ4MDApdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiSW52YWxpZEV4cGlyeVRpbWUiLG1lc3NhZ2U6IlByZXNpZ25pbmcgZG9lcyBub3Qgc3VwcG9ydCBleHBpcnkgdGltZSBncmVhdGVyIHRoYW4gYSB3ZWVrIHdpdGggU2lnVjQgc2lnbmluZy4iLHJldHJ5YWJsZTohMX0pO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fWVsc2V7aWYobiE9PXIuU2lnbmVycy5TMyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQcmVzaWduaW5nIG9ubHkgc3VwcG9ydHMgUzMgb3IgU2lnVjQgc2lnbmluZy4iLGNvZGU6IlVuc3VwcG9ydGVkU2lnbmVyIixyZXRyeWFibGU6ITF9KTt2YXIgbz1lLnNlcnZpY2U/ZS5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCk6ci51dGlsLmRhdGUuZ2V0RGF0ZSgpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT1wYXJzZUludChyLnV0aWwuZGF0ZS51bml4VGltZXN0YW1wKG8pK3QsMTApLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxuPXIudXRpbC51cmxQYXJzZShlLmh0dHBSZXF1ZXN0LnBhdGgpLG89e307bi5zZWFyY2gmJihvPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKG4uc2VhcmNoLnN1YnN0cigxKSkpO3ZhciBzPWUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLnNwbGl0KCIgIik7aWYoIkFXUyI9PT1zWzBdKXM9c1sxXS5zcGxpdCgiOiIpLG8uU2lnbmF0dXJlPXMucG9wKCksby5BV1NBY2Nlc3NLZXlJZD1zLmpvaW4oIjoiKSxyLnV0aWwuZWFjaChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7ZT09PWkmJihlPSJFeHBpcmVzIiksMD09PWUuaW5kZXhPZigieC1hbXotbWV0YS0iKSYmKGRlbGV0ZSBvW2VdLGU9ZS50b0xvd2VyQ2FzZSgpKSxvW2VdPXR9KSksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXSxkZWxldGUgby5BdXRob3JpemF0aW9uLGRlbGV0ZSBvLkhvc3Q7ZWxzZSBpZigiQVdTNC1ITUFDLVNIQTI1NiI9PT1zWzBdKXtzLnNoaWZ0KCk7dmFyIGE9cy5qb2luKCIgIikubWF0Y2goL1NpZ25hdHVyZT0oLio/KSg/Oix8XHN8XHI/XG58JCkvKVsxXTtvWyJYLUFtei1TaWduYXR1cmUiXT1hLGRlbGV0ZSBvLkV4cGlyZXN9dC5wYXRobmFtZT1uLnBhdGhuYW1lLHQuc2VhcmNoPXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG8pfXIuU2lnbmVycy5QcmVzaWduPW8oe3NpZ246ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fHwzNjAwLGUub24oImJ1aWxkIixzKSxlLm9uKCJzaWduIixhKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0VUX0NPTlRFTlRfTEVOR1RIKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuQ09NUFVURV9TSEEyNTYpLGUuZW1pdCgiYmVmb3JlUHJlc2lnbiIsW2VdKSwhbil7aWYoZS5idWlsZCgpLGUucmVzcG9uc2UuZXJyb3IpdGhyb3cgZS5yZXNwb25zZS5lcnJvcjtyZXR1cm4gci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KX1lLmJ1aWxkKChmdW5jdGlvbigpe3RoaXMucmVzcG9uc2UuZXJyb3I/bih0aGlzLnJlc3BvbnNlLmVycm9yKTpuKG51bGwsci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KSl9KSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5QcmVzaWdufSx7Ii4uL2NvcmUiOjE5fV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZX0sc2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKGUpe3RoaXMuc2VydmljZUNsaWVudElkPWV9LGdldFNlcnZpY2VDbGllbnRJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VDbGllbnRJZH19KSxyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInYyIjpyZXR1cm4gci5TaWduZXJzLlYyO2Nhc2UidjMiOnJldHVybiByLlNpZ25lcnMuVjM7Y2FzZSJzM3Y0IjpjYXNlInY0IjpyZXR1cm4gci5TaWduZXJzLlY0O2Nhc2UiczMiOnJldHVybiByLlNpZ25lcnMuUzM7Y2FzZSJ2M2h0dHBzIjpyZXR1cm4gci5TaWduZXJzLlYzSHR0cHM7Y2FzZSJiZWFyZXIiOnJldHVybiByLlNpZ25lcnMuQmVhcmVyfXRocm93IG5ldyBFcnJvcigiVW5rbm93biBzaWduaW5nIHZlcnNpb24gIitlKX0sZSgiLi92MiIpLGUoIi4vdjMiKSxlKCIuL3YzaHR0cHMiKSxlKCIuL3Y0IiksZSgiLi9zMyIpLGUoIi4vcHJlc2lnbiIpLGUoIi4vYmVhcmVyIil9LHsiLi4vY29yZSI6MTksIi4vYmVhcmVyIjo2NCwiLi9wcmVzaWduIjo2NSwiLi9zMyI6NjcsIi4vdjIiOjY4LCIuL3YzIjo2OSwiLi92M2h0dHBzIjo3MCwiLi92NCI6NzF9XSw2NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5TMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtzdWJSZXNvdXJjZXM6e2FjbDoxLGFjY2VsZXJhdGU6MSxhbmFseXRpY3M6MSxjb3JzOjEsbGlmZWN5Y2xlOjEsZGVsZXRlOjEsaW52ZW50b3J5OjEsbG9jYXRpb246MSxsb2dnaW5nOjEsbWV0cmljczoxLG5vdGlmaWNhdGlvbjoxLHBhcnROdW1iZXI6MSxwb2xpY3k6MSxyZXF1ZXN0UGF5bWVudDoxLHJlcGxpY2F0aW9uOjEscmVzdG9yZToxLHRhZ2dpbmc6MSx0b3JyZW50OjEsdXBsb2FkSWQ6MSx1cGxvYWRzOjEsdmVyc2lvbklkOjEsdmVyc2lvbmluZzoxLHZlcnNpb25zOjEsd2Vic2l0ZToxfSxyZXNwb25zZUhlYWRlcnM6eyJyZXNwb25zZS1jb250ZW50LXR5cGUiOjEsInJlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UiOjEsInJlc3BvbnNlLWV4cGlyZXMiOjEsInJlc3BvbnNlLWNhY2hlLWNvbnRyb2wiOjEsInJlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24iOjEsInJlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmciOjF9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8KHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09ci51dGlsLmRhdGUucmZjODIyKHQpKSxlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKTt2YXIgbj10aGlzLnNpZ24oZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSksbz0iQVdTICIrZS5hY2Nlc3NLZXlJZCsiOiIrbjt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPW99LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PVtdO3QucHVzaChlLm1ldGhvZCksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1NRDUiXXx8IiIpLHQucHVzaChlLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8IiIpO3ZhciBuPXRoaXMuY2Fub25pY2FsaXplZEFtekhlYWRlcnMoKTtyZXR1cm4gbiYmdC5wdXNoKG4pLHQucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZWRSZXNvdXJjZSgpKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRBbXpIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpe3QubWF0Y2goL154LWFtei0vaSkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dC5wdXNoKGUudG9Mb3dlckNhc2UoKSsiOiIrU3RyaW5nKHRoaXMucmVxdWVzdC5oZWFkZXJzW2VdKSl9KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxpemVkUmVzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QsdD1lLnBhdGguc3BsaXQoIj8iKSxuPXRbMF0sbz10WzFdLGk9IiI7aWYoZS52aXJ0dWFsSG9zdGVkQnVja2V0JiYoaSs9Ii8iK2UudmlydHVhbEhvc3RlZEJ1Y2tldCksaSs9bixvKXt2YXIgcz1bXTtyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxvLnNwbGl0KCImIiksKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIj0iKVswXSxuPWUuc3BsaXQoIj0iKVsxXTtpZih0aGlzLnN1YlJlc291cmNlc1t0XXx8dGhpcy5yZXNwb25zZUhlYWRlcnNbdF0pe3ZhciByPXtuYW1lOnR9O3ZvaWQgMCE9PW4mJih0aGlzLnN1YlJlc291cmNlc1t0XT9yLnZhbHVlPW46ci52YWx1ZT1kZWNvZGVVUklDb21wb25lbnQobikpLHMucHVzaChyKX19KSkscy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWU8dC5uYW1lPy0xOjF9KSkscy5sZW5ndGgmJihvPVtdLHIudXRpbC5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS52YWx1ZT9vLnB1c2goZS5uYW1lKTpvLnB1c2goZS5uYW1lKyI9IitlLnZhbHVlKX0pKSxpKz0iPyIrby5qb2luKCImIikpfXJldHVybiBpfSxzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLHQsImJhc2U2NCIsInNoYTEiKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlMzfSx7Ii4uL2NvcmUiOjE5fV0sNjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuVjI9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7YWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3R8fCh0PXIudXRpbC5kYXRlLmdldERhdGUoKSk7dmFyIG49dGhpcy5yZXF1ZXN0O24ucGFyYW1zLlRpbWVzdGFtcD1yLnV0aWwuZGF0ZS5pc284NjAxKHQpLG4ucGFyYW1zLlNpZ25hdHVyZVZlcnNpb249IjIiLG4ucGFyYW1zLlNpZ25hdHVyZU1ldGhvZD0iSG1hY1NIQTI1NiIsbi5wYXJhbXMuQVdTQWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCxlLnNlc3Npb25Ub2tlbiYmKG4ucGFyYW1zLlNlY3VyaXR5VG9rZW49ZS5zZXNzaW9uVG9rZW4pLGRlbGV0ZSBuLnBhcmFtcy5TaWduYXR1cmUsbi5wYXJhbXMuU2lnbmF0dXJlPXRoaXMuc2lnbmF0dXJlKGUpLG4uYm9keT1yLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhuLnBhcmFtcyksbi5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW4uYm9keS5sZW5ndGh9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0aGlzLnJlcXVlc3QuZW5kcG9pbnQuaG9zdC50b0xvd2VyQ2FzZSgpKSxlLnB1c2godGhpcy5yZXF1ZXN0LnBhdGhuYW1lKCkpLGUucHVzaChyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyh0aGlzLnJlcXVlc3QucGFyYW1zKSksZS5qb2luKCJcbiIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjJ9LHsiLi4vY29yZSI6MTl9XSw2OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUucmZjODIyKHQpO3RoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09bixlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXpuLUF1dGhvcml6YXRpb24iXT10aGlzLmF1dGhvcml6YXRpb24oZSxuKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iQVdTMyBBV1NBY2Nlc3NLZXlJZD0iK2UuYWNjZXNzS2V5SWQrIixBbGdvcml0aG09SG1hY1NIQTI1NixTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkrIixTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlKX0sc2lnbmVkSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbih0KXtlLnB1c2godC50b0xvd2VyQ2FzZSgpKX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QuaGVhZGVycyx0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbihuKXt0LnB1c2gobi50b0xvd2VyQ2FzZSgpLnRyaW0oKSsiOiIrU3RyaW5nKGVbbl0pLnRyaW0oKSl9KSksdC5zb3J0KCkuam9pbigiXG4iKSsiXG4ifSxoZWFkZXJzVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoKHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXsoIkhvc3QiPT09dHx8IkNvbnRlbnQtRW5jb2RpbmciPT09dHx8dC5tYXRjaCgvXlgtQW16L2kpKSYmZS5wdXNoKHQpfSkpLGV9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCgiLyIpLGUucHVzaCgiIiksZS5wdXNoKHRoaXMuY2Fub25pY2FsSGVhZGVycygpKSxlLnB1c2godGhpcy5yZXF1ZXN0LmJvZHkpLHIudXRpbC5jcnlwdG8uc2hhMjU2KGUuam9pbigiXG4iKSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WM30seyIuLi9jb3JlIjoxOX1dLDcwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ZSgiLi92MyIpLHIuU2lnbmVycy5WM0h0dHBzPW8oci5TaWduZXJzLlYzLHthdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzLUhUVFBTIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzSHR0cHN9LHsiLi4vY29yZSI6MTksIi4vdjMiOjY5fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuL3Y0X2NyZWRlbnRpYWxzIiksaT1yLnV0aWwuaW5oZXJpdCxzPSJwcmVzaWduZWQtZXhwaXJlcyI7ci5TaWduZXJzLlY0PWkoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxuKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSksdGhpcy5zZXJ2aWNlTmFtZT10LG49bnx8e30sdGhpcy5zaWduYXR1cmVDYWNoZT0iYm9vbGVhbiIhPXR5cGVvZiBuLnNpZ25hdHVyZUNhY2hlfHxuLnNpZ25hdHVyZUNhY2hlLHRoaXMub3BlcmF0aW9uPW4ub3BlcmF0aW9uLHRoaXMuc2lnbmF0dXJlVmVyc2lvbj1uLnNpZ25hdHVyZVZlcnNpb259LGFsZ29yaXRobToiQVdTNC1ITUFDLVNIQTI1NiIsYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXIudXRpbC5kYXRlLmlzbzg2MDEodCkucmVwbGFjZSgvWzpcLV18XC5cZHszfS9nLCIiKTt0aGlzLmlzUHJlc2lnbmVkKCk/dGhpcy51cGRhdGVGb3JQcmVzaWduZWQoZSxuKTp0aGlzLmFkZEhlYWRlcnMoZSxuKSx0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhZGRIZWFkZXJzOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT10LGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pfSx1cGRhdGVGb3JQcmVzaWduZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWRlbnRpYWxTdHJpbmcodCksbz17IlgtQW16LURhdGUiOnQsIlgtQW16LUFsZ29yaXRobSI6dGhpcy5hbGdvcml0aG0sIlgtQW16LUNyZWRlbnRpYWwiOmUuYWNjZXNzS2V5SWQrIi8iK24sIlgtQW16LUV4cGlyZXMiOnRoaXMucmVxdWVzdC5oZWFkZXJzW3NdLCJYLUFtei1TaWduZWRIZWFkZXJzIjp0aGlzLnNpZ25lZEhlYWRlcnMoKX07ZS5zZXNzaW9uVG9rZW4mJihvWyJYLUFtei1TZWN1cml0eS1Ub2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0mJihvWyJDb250ZW50LVR5cGUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdJiYob1siQ29udGVudC1NRDUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1NRDUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSYmKG9bIkNhY2hlLUNvbnRyb2wiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdKSxyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7aWYoZSE9PXMmJnRoaXMuaXNTaWduYWJsZUhlYWRlcihlKSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpOzA9PT1uLmluZGV4T2YoIngtYW16LW1ldGEtIik/b1tuXT10OjA9PT1uLmluZGV4T2YoIngtYW16LSIpJiYob1tlXT10KX19KSk7dmFyIGk9dGhpcy5yZXF1ZXN0LnBhdGguaW5kZXhPZigiPyIpPj0wPyImIjoiPyI7dGhpcy5yZXF1ZXN0LnBhdGgrPWkrci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9LGF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KTtyZXR1cm4gbi5wdXNoKHRoaXMuYWxnb3JpdGhtKyIgQ3JlZGVudGlhbD0iK2UuYWNjZXNzS2V5SWQrIi8iK3IpLG4ucHVzaCgiU2lnbmVkSGVhZGVycz0iK3RoaXMuc2lnbmVkSGVhZGVycygpKSxuLnB1c2goIlNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUsdCkpLG4uam9pbigiLCAiKX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5nZXRTaWduaW5nS2V5KGUsdC5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUsdGhpcy5zaWduYXR1cmVDYWNoZSk7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhuLHRoaXMuc3RyaW5nVG9TaWduKHQpLCJoZXgiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0LnB1c2goIkFXUzQtSE1BQy1TSEEyNTYiKSx0LnB1c2goZSksdC5wdXNoKHRoaXMuY3JlZGVudGlhbFN0cmluZyhlKSksdC5wdXNoKHRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJlcXVlc3QucGF0aG5hbWUoKTtyZXR1cm4iczMiIT09dGhpcy5zZXJ2aWNlTmFtZSYmInMzdjQiIT09dGhpcy5zaWduYXR1cmVWZXJzaW9uJiYodD1yLnV0aWwudXJpRXNjYXBlUGF0aCh0KSksZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0KSxlLnB1c2godGhpcy5yZXF1ZXN0LnNlYXJjaCgpKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkrIlxuIiksZS5wdXNoKHRoaXMuc2lnbmVkSGVhZGVycygpKSxlLnB1c2godGhpcy5oZXhFbmNvZGVkQm9keUhhc2goKSksZS5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0LG4pe2UucHVzaChbdCxuXSl9KSksZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlWzBdLnRvTG93ZXJDYXNlKCk8dFswXS50b0xvd2VyQ2FzZSgpPy0xOjF9KSk7dmFyIHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0udG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzU2lnbmFibGVIZWFkZXIobikpe3ZhciBvPWVbMV07aWYobnVsbD09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8udG9TdHJpbmcpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcigiSGVhZGVyICIrbisiIGNvbnRhaW5zIGludmFsaWQgdmFsdWUiKSx7Y29kZToiSW52YWxpZEhlYWRlciJ9KTt0LnB1c2gobisiOiIrdGhpcy5jYW5vbmljYWxIZWFkZXJWYWx1ZXMoby50b1N0cmluZygpKSl9fSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsSGVhZGVyVmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xzKy9nLCIgIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCksdGhpcy5pc1NpZ25hYmxlSGVhZGVyKHQpJiZlLnB1c2godCl9KSksZS5zb3J0KCkuam9pbigiOyIpfSxjcmVkZW50aWFsU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBvLmNyZWF0ZVNjb3BlKGUuc3Vic3RyKDAsOCksdGhpcy5yZXF1ZXN0LnJlZ2lvbix0aGlzLnNlcnZpY2VOYW1lKX0saGV4RW5jb2RlZEhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uc2hhMjU2KGUsImhleCIpfSxoZXhFbmNvZGVkQm9keUhhc2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3Q7cmV0dXJuIHRoaXMuaXNQcmVzaWduZWQoKSYmWyJzMyIsInMzLW9iamVjdC1sYW1iZGEiXS5pbmRleE9mKHRoaXMuc2VydmljZU5hbWUpPi0xJiYhZS5ib2R5PyJVTlNJR05FRC1QQVlMT0FEIjplLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il0/ZS5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdOnRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5yZXF1ZXN0LmJvZHl8fCIiKX0sdW5zaWduYWJsZUhlYWRlcnM6WyJhdXRob3JpemF0aW9uIiwiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiLCJ1c2VyLWFnZW50IixzLCJleHBlY3QiLCJ4LWFtem4tdHJhY2UtaWQiXSxpc1NpZ25hYmxlSGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIngtYW16LSIpfHx0aGlzLnVuc2lnbmFibGVIZWFkZXJzLmluZGV4T2YoZSk8MH0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucmVxdWVzdC5oZWFkZXJzW3NdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjR9LHsiLi4vY29yZSI6MTksIi4vdjRfY3JlZGVudGlhbHMiOjcyfV0sNzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz17fSxpPVtdLHM9ImF3czRfcmVxdWVzdCI7dC5leHBvcnRzPXtjcmVhdGVTY29wZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuW2Uuc3Vic3RyKDAsOCksdCxuLHNdLmpvaW4oIi8iKX0sZ2V0U2lnbmluZ0tleTpmdW5jdGlvbihlLHQsbixhLGMpe3ZhciB1PVtyLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksZS5hY2Nlc3NLZXlJZCwiYmFzZTY0IiksdCxuLGFdLmpvaW4oIl8iKTtpZigoYz0hMSE9PWMpJiZ1IGluIG8pcmV0dXJuIG9bdV07dmFyIGw9ci51dGlsLmNyeXB0by5obWFjKCJBV1M0IitlLnNlY3JldEFjY2Vzc0tleSx0LCJidWZmZXIiKSxwPXIudXRpbC5jcnlwdG8uaG1hYyhsLG4sImJ1ZmZlciIpLGQ9ci51dGlsLmNyeXB0by5obWFjKHAsYSwiYnVmZmVyIiksaD1yLnV0aWwuY3J5cHRvLmhtYWMoZCxzLCJidWZmZXIiKTtyZXR1cm4gYyYmKG9bdV09aCxpLnB1c2godSksaS5sZW5ndGg+NTAmJmRlbGV0ZSBvW2kuc2hpZnQoKV0pLGh9LGVtcHR5Q2FjaGU6ZnVuY3Rpb24oKXtvPXt9LGk9W119fX0seyIuLi9jb3JlIjoxOX1dLDczOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3RoaXMuY3VycmVudFN0YXRlPXR8fG51bGwsdGhpcy5zdGF0ZXM9ZXx8e319ci5wcm90b3R5cGUucnVuVG89ZnVuY3Rpb24oZSx0LG4scil7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPW4sbj10LHQ9ZSxlPW51bGwpO3ZhciBvPXRoaXMsaT1vLnN0YXRlc1tvLmN1cnJlbnRTdGF0ZV07aS5mbi5jYWxsKG58fG8sciwoZnVuY3Rpb24ocil7aWYocil7aWYoIWkuZmFpbClyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28uY3VycmVudFN0YXRlPWkuZmFpbH1lbHNle2lmKCFpLmFjY2VwdClyZXR1cm4gdD90LmNhbGwobik6bnVsbDtvLmN1cnJlbnRTdGF0ZT1pLmFjY2VwdH1pZihvLmN1cnJlbnRTdGF0ZT09PWUpcmV0dXJuIHQ/dC5jYWxsKG4scik6bnVsbDtvLnJ1blRvKGUsdCxuLHIpfSkpfSxyLnByb3RvdHlwZS5hZGRTdGF0ZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxuPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYocj1uLG49bnVsbCksdGhpcy5jdXJyZW50U3RhdGV8fCh0aGlzLmN1cnJlbnRTdGF0ZT1lKSx0aGlzLnN0YXRlc1tlXT17YWNjZXB0OnQsZmFpbDpuLGZuOnJ9LHRoaXN9LHQuZXhwb3J0cz1yfSx7fV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obixyKXsoZnVuY3Rpb24oKXt2YXIgbyxpPXtlbnZpcm9ubWVudDoibm9kZWpzIixlbmdpbmU6ZnVuY3Rpb24oKXtpZihpLmlzQnJvd3NlcigpJiYidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcilyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgZT1uLnBsYXRmb3JtKyIvIituLnZlcnNpb247cmV0dXJuIG4uZW52LkFXU19FWEVDVVRJT05fRU5WJiYoZSs9IiBleGVjLWVudi8iK24uZW52LkFXU19FWEVDVVRJT05fRU5WKSxlfSx1c2VyQWdlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1pLmVudmlyb25tZW50LG49ImF3cy1zZGstIit0KyIvIitlKCIuL2NvcmUiKS5WRVJTSU9OO3JldHVybiJub2RlanMiPT09dCYmKG4rPSIgIitpLmVuZ2luZSgpKSxufSx1cmlFc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiB0PSh0PXQucmVwbGFjZSgvW15BLVphLXowLTlfLn5cLSVdKy9nLGVzY2FwZSkpLnJlcGxhY2UoL1sqXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSkpfSx1cmlFc2NhcGVQYXRoOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KCIvIiksKGZ1bmN0aW9uKGUpe3QucHVzaChpLnVyaUVzY2FwZShlKSl9KSksdC5qb2luKCIvIil9LHVybFBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5wYXJzZShlKX0sdXJsRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5mb3JtYXQoZSl9LHF1ZXJ5U3RyaW5nUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkucXVlcnlzdHJpbmcucGFyc2UoZSl9LHF1ZXJ5UGFyYW1zVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1pLnVyaUVzY2FwZSxyPU9iamVjdC5rZXlzKGUpLnNvcnQoKTtyZXR1cm4gaS5hcnJheUVhY2gociwoZnVuY3Rpb24ocil7dmFyIG89ZVtyXSxzPW4ociksYT1zKyI9IjtpZihBcnJheS5pc0FycmF5KG8pKXt2YXIgYz1bXTtpLmFycmF5RWFjaChvLChmdW5jdGlvbihlKXtjLnB1c2gobihlKSl9KSksYT1zKyI9IitjLnNvcnQoKS5qb2luKCImIitzKyI9Iil9ZWxzZSBudWxsIT1vJiYoYT1zKyI9IituKG8pKTt0LnB1c2goYSl9KSksdC5qb2luKCImIil9LHJlYWRGaWxlU3luYzpmdW5jdGlvbih0KXtyZXR1cm4gaS5pc0Jyb3dzZXIoKT9udWxsOmUoImZzIikucmVhZEZpbGVTeW5jKHQsInV0Zi04Iil9LGJhc2U2NDp7ZW5jb2RlOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGJhc2U2NCBlbmNvZGUgbnVtYmVyICIrZSkpO3JldHVybiBudWxsPT1lP2U6aS5idWZmZXIudG9CdWZmZXIoZSkudG9TdHJpbmcoImJhc2U2NCIpfSxkZWNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGRlY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlLCJiYXNlNjQiKX19LGJ1ZmZlcjp7dG9CdWZmZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaS5CdWZmZXIuZnJvbSYmaS5CdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbT9pLkJ1ZmZlci5mcm9tKGUsdCk6bmV3IGkuQnVmZmVyKGUsdCl9LGFsbG9jOmZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJzaXplIHBhc3NlZCB0byBhbGxvYyBtdXN0IGJlIGEgbnVtYmVyLiIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5hbGxvYylyZXR1cm4gaS5CdWZmZXIuYWxsb2MoZSx0LG4pO3ZhciByPW5ldyBpLkJ1ZmZlcihlKTtyZXR1cm4gdm9pZCAwIT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIHIuZmlsbCYmci5maWxsKHQsdm9pZCAwLHZvaWQgMCxuKSxyfSx0b1N0cmVhbTpmdW5jdGlvbihlKXtpLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9aS5idWZmZXIudG9CdWZmZXIoZSkpO3ZhciB0PW5ldyBpLnN0cmVhbS5SZWFkYWJsZSxuPTA7cmV0dXJuIHQuX3JlYWQ9ZnVuY3Rpb24ocil7aWYobj49ZS5sZW5ndGgpcmV0dXJuIHQucHVzaChudWxsKTt2YXIgbz1uK3I7bz5lLmxlbmd0aCYmKG89ZS5sZW5ndGgpLHQucHVzaChlLnNsaWNlKG4sbykpLG49b30sdH0sY29uY2F0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0ubGVuZ3RoO2Zvcih0PWkuYnVmZmVyLmFsbG9jKHIpLG49MDtuPGUubGVuZ3RoO24rKyllW25dLmNvcHkodCxvKSxvKz1lW25dLmxlbmd0aDtyZXR1cm4gdH19LHN0cmluZzp7Ynl0ZUxlbmd0aDpmdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLCJudW1iZXIiPT10eXBlb2YgdC5ieXRlTGVuZ3RoKXJldHVybiB0LmJ5dGVMZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0LnNpemUpcmV0dXJuIHQuc2l6ZTtpZigic3RyaW5nIj09dHlwZW9mIHQucGF0aClyZXR1cm4gZSgiZnMiKS5sc3RhdFN5bmModC5wYXRoKS5zaXplO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIGxlbmd0aCBvZiAiK3QpLHtvYmplY3Q6dH0pfSx1cHBlckZpcnN0OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSl9LGxvd2VyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKX19LGluaTp7cGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj17fTtyZXR1cm4gaS5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7aWYoIlsiPT09KGU9ZS5zcGxpdCgvKF58XHMpWzsjXS8pWzBdLnRyaW0oKSlbMF0mJiJdIj09PWVbZS5sZW5ndGgtMV0pe2lmKCJfX3Byb3RvX18iPT09KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSl8fCJfX3Byb3RvX18iPT09dC5zcGxpdCgvXHMvKVsxXSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgcHJvZmlsZSBuYW1lICciK3QrIicgZnJvbSBzaGFyZWQgaW5pIGZpbGUuIikpfWVsc2UgaWYodCl7dmFyIHI9ZS5pbmRleE9mKCI9Iiksbz1lLmxlbmd0aC0xO2lmKC0xIT09ciYmMCE9PXImJnIhPT1vKXt2YXIgcz1lLnN1YnN0cmluZygwLHIpLnRyaW0oKSxhPWUuc3Vic3RyaW5nKHIrMSkudHJpbSgpO25bdF09blt0XXx8e30sblt0XVtzXT1hfX19KSksbn19LGZuOntub29wOmZ1bmN0aW9uKCl7fSxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlKXRocm93IGV9LG1ha2VBc3luYzpmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0PD1lLmxlbmd0aD9lOmZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3QucG9wKCkoZS5hcHBseShudWxsLHQpKX19fSxkYXRlOntnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG98fChvPWUoIi4vY29yZSIpKSxvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD9uZXcgRGF0ZSgobmV3IERhdGUpLmdldFRpbWUoKStvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCk6bmV3IERhdGV9LGlzbzg2MDE6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCJaIil9LHJmYzgyMjpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b1VUQ1N0cmluZygpfSx1bml4VGltZXN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLmdldFRpbWUoKS8xZTN9LGZyb206ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP25ldyBEYXRlKDFlMyplKTpuZXcgRGF0ZShlKX0sZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PSJpc284NjAxIiksaS5kYXRlW3RdKGkuZGF0ZS5mcm9tKGUpKX0scGFyc2VUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gbmV3IERhdGUoMWUzKmUpO2lmKGUubWF0Y2goL15cZHs0fS8pKXJldHVybiBuZXcgRGF0ZShlKTtpZihlLm1hdGNoKC9eXHd7M30sLykpcmV0dXJuIG5ldyBEYXRlKGUpO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJ1bmhhbmRsZWQgdGltZXN0YW1wIGZvcm1hdDogIitlKSx7Y29kZToiVGltZXN0YW1wUGFyc2VyRXJyb3IifSl9fSxjcnlwdG86e2NyYzMyVGFibGU6WzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LDI4ODI2MTY2NjUsNjUxNzY3OTgwLDEzNzM1MDM1NDYsMzM2OTU1NDMwNCwzMjE4MTA0NTk4LDU2NTUwNzI1MywxNDU0NjIxNzMxLDM0ODUxMTE3MDUsMzA5OTQzNjMwMyw2NzEyNjY5NzQsMTU5NDE5ODAyNCwzMzIyNzMwOTMwLDI5NzAzNDc4MTIsNzk1ODM1NTI3LDE0ODMyMzAyMjUsMzI0NDM2NzI3NSwzMDYwMTQ5NTY1LDE5OTQxNDYxOTIsMzExNTg1MzQsMjU2MzkwNzc3Miw0MDIzNzE3OTMwLDE5MDc0NTk0NjUsMTEyNjM3MjE1LDI2ODAxNTMyNTMsMzkwNDQyNzA1OSwyMDEzNzc2MjkwLDI1MTcyMjAzNiwyNTE3MjE1Mzc0LDM3NzU4MzAwNDAsMjEzNzY1Njc2MywxNDEzNzY4MTMsMjQzOTI3NzcxOSwzODY1MjcxMjk3LDE4MDIxOTU0NDQsNDc2ODY0ODY2LDIyMzgwMDEzNjgsNDA2NjUwODg3OCwxODEyMzcwOTI1LDQ1MzA5MjczMSwyMTgxNjI1MDI1LDQxMTE0NTEyMjMsMTcwNjA4ODkwMiwzMTQwNDI3MDQsMjM0NDUzMjIwMiw0MjQwMDE3NTMyLDE2NTg2NTgyNzEsMzY2NjE5OTc3LDIzNjI2NzAzMjMsNDIyNDk5NDQwNSwxMzAzNTM1OTYwLDk4NDk2MTQ4NiwyNzQ3MDA3MDkyLDM1NjkwMzc1MzgsMTI1NjE3MDgxNywxMDM3NjA0MzExLDI3NjUyMTA3MzMsMzU1NDA3OTk5NSwxMTMxMDE0NTA2LDg3OTY3OTk5NiwyOTA5MjQzNDYyLDM2NjM3NzE4NTYsMTE0MTEyNDQ2Nyw4NTU4NDIyNzcsMjg1MjgwMTYzMSwzNzA4NjQ4NjQ5LDEzNDI1MzM5NDgsNjU0NDU5MzA2LDMxODgzOTYwNDgsMzM3MzAxNTE3NCwxNDY2NDc5OTA5LDU0NDE3OTYzNSwzMTEwNTIzOTEzLDM0NjI1MjIwMTUsMTU5MTY3MTA1NCw3MDIxMzg3NzYsMjk2NjQ2MDQ1MCwzMzUyNzk5NDEyLDE1MDQ5MTg4MDcsNzgzNTUxODczLDMwODI2NDA0NDMsMzIzMzQ0Mjk4OSwzOTg4MjkyMzg0LDI1OTYyNTQ2NDYsNjIzMTcwNjgsMTk1NzgxMDg0MiwzOTM5ODQ1OTQ1LDI2NDc4MTYxMTEsODE0NzA5OTcsMTk0MzgwMzUyMywzODE0OTE4OTMwLDI0ODk1OTY4MDQsMjI1Mjc0NDMwLDIwNTM3OTAzNzYsMzgyNjE3NTc1NSwyNDY2OTA2MDEzLDE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LDMyNjg5MzU1OTEsMzA1MDM2MDYyNSw3NTI0NTk0MDMsMTU0MTMyMDIyMSwyNjA3MDcxOTIwLDM5NjU5NzMwMzAsMTk2OTkyMjk3Miw0MDczNTQ5OCwyNjE3ODM3MjI1LDM5NDM1NzcxNTEsMTkxMzA4Nzg3Nyw4MzkwODM3MSwyNTEyMzQxNjM0LDM4MDM3NDA2OTIsMjA3NTIwODYyMiwyMTMyNjExMTIsMjQ2MzI3MjYwMywzODU1OTkwMjg1LDIwOTQ4NTQwNzEsMTk4OTU4ODgxLDIyNjIwMjkwMTIsNDA1NzI2MDYxMCwxNzU5MzU5OTkyLDUzNDQxNDE5MCwyMTc2NzE4NTQxLDQxMzkzMjkxMTUsMTg3MzgzNjAwMSw0MTQ2NjQ1NjcsMjI4MjI0ODkzNCw0Mjc5MjAwMzY4LDE3MTE2ODQ1NTQsMjg1MjgxMTE2LDI0MDU4MDE3MjcsNDE2NzIxNjc0NSwxNjM0NDY3Nzk1LDM3NjIyOTcwMSwyNjg1MDY3ODk2LDM2MDgwMDc0MDYsMTMwODkxODYxMiw5NTY1NDM5MzgsMjgwODU1NTEwNSwzNDk1OTU4MjYzLDEyMzE2MzYzMDEsMTA0NzQyNzAzNSwyOTMyOTU5ODE4LDM2NTQ3MDM4MzYsMTA4ODM1OTI3MCw5MzY5MThlMywyODQ3NzE0ODk5LDM3MzY4Mzc4MjksMTIwMjkwMDg2Myw4MTcyMzM4OTcsMzE4MzM0MjEwOCwzNDAxMjM3MTMwLDE0MDQyNzc1NTIsNjE1ODE4MTUwLDMxMzQyMDc0OTMsMzQ1MzQyMTIwMywxNDIzODU3NDQ5LDYwMTQ1MDQzMSwzMDA5ODM3NjE0LDMyOTQ3MTA0NTYsMTU2NzEwMzc0Niw3MTE5Mjg3MjQsMzAyMDY2ODQ3MSwzMjcyMzgwMDY1LDE1MTAzMzQyMzUsNzU1MTY3MTE3XSxjcmMzMjpmdW5jdGlvbihlKXt2YXIgdD1pLmNyeXB0by5jcmMzMlRhYmxlLG49LTE7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspbj1uPj4+OF50WzI1NSYobl5lLnJlYWRVSW50OChyKSldO3JldHVybigtMV5uKT4+PjB9LGhtYWM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG58fChuPSJiaW5hcnkiKSwiYnVmZmVyIj09PW4mJihuPXZvaWQgMCkscnx8KHI9InNoYTI1NiIpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLGkuY3J5cHRvLmxpYi5jcmVhdGVIbWFjKHIsZSkudXBkYXRlKHQpLmRpZ2VzdChuKX0sbWQ1OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgibWQ1IixlLHQsbil9LHNoYTI1NjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGkuY3J5cHRvLmhhc2goInNoYTI1NiIsZSx0LG4pfSxoYXNoOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWkuY3J5cHRvLmNyZWF0ZUhhc2goZSk7bnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuYnVmZmVyLnRvQnVmZmVyKHQpKTt2YXIgcz1pLmFycmF5U2xpY2VGbih0KSxhPWkuQnVmZmVyLmlzQnVmZmVyKHQpO2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQmJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPSEwKSxyJiYib2JqZWN0Ij09dHlwZW9mIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uJiYhYSl0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by51cGRhdGUoZSl9KSksdC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtyKGUpfSkpLHQub24oImVuZCIsKGZ1bmN0aW9uKCl7cihudWxsLG8uZGlnZXN0KG4pKX0pKTtlbHNle2lmKCFyfHwhc3x8YXx8InVuZGVmaW5lZCI9PXR5cGVvZiBGaWxlUmVhZGVyKXtpLmlzQnJvd3NlcigpJiYib2JqZWN0Ij09dHlwZW9mIHQmJiFhJiYodD1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkodCkpKTt2YXIgYz1vLnVwZGF0ZSh0KS5kaWdlc3Qobik7cmV0dXJuIHImJnIobnVsbCxjKSxjfXZhciB1PTAsbD1uZXcgRmlsZVJlYWRlcjtsLm9uZXJyb3I9ZnVuY3Rpb24oKXtyKG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZGF0YS4iKSl9LGwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGkuQnVmZmVyKG5ldyBVaW50OEFycmF5KGwucmVzdWx0KSk7by51cGRhdGUoZSksdSs9ZS5sZW5ndGgsbC5fY29udGludWVSZWFkaW5nKCl9LGwuX2NvbnRpbnVlUmVhZGluZz1mdW5jdGlvbigpe2lmKHU+PXQuc2l6ZSlyKG51bGwsby5kaWdlc3QobikpO2Vsc2V7dmFyIGU9dSs1MjQyODg7ZT50LnNpemUmJihlPXQuc2l6ZSksbC5yZWFkQXNBcnJheUJ1ZmZlcihzLmNhbGwodCx1LGUpKX19LGwuX2NvbnRpbnVlUmVhZGluZygpfX0sdG9IZXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goKCIwIitlLmNoYXJDb2RlQXQobikudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIsMikpO3JldHVybiB0LmpvaW4oIiIpfSxjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe3JldHVybiBpLmNyeXB0by5saWIuY3JlYXRlSGFzaChlKX19LGFib3J0Ont9LGVhY2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5jYWxsKHRoaXMsbixlW25dKT09PWkuYWJvcnQpYnJlYWt9LGFycmF5RWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxlW25dLHBhcnNlSW50KG4sMTApKT09PWkuYWJvcnQpYnJlYWt9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLmVhY2godCwoZnVuY3Rpb24odCxuKXtlW3RdPW59KSksZX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS51cGRhdGUoaS5jb3B5KGUpLHQpfSxjb3B5OmZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSxpc0VtcHR5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfSxhcnJheVNsaWNlRm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zbGljZXx8ZS53ZWJraXRTbGljZXx8ZS5tb3pTbGljZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGx9LGlzVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1pLnR5cGVOYW1lKHQpKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk9PT0iW29iamVjdCAiK3QrIl0ifSx0eXBlTmFtZTpmdW5jdGlvbihlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpKXJldHVybiBlLm5hbWU7dmFyIHQ9ZS50b1N0cmluZygpLG49dC5tYXRjaCgvXlxzKmZ1bmN0aW9uICguKylcKC8pO3JldHVybiBuP25bMV06dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO2Zvcih2YXIgciBpbiJzdHJpbmciPT10eXBlb2YgZS5tZXNzYWdlJiYiIiE9PWUubWVzc2FnZSYmKCJzdHJpbmciPT10eXBlb2YgdHx8dCYmdC5tZXNzYWdlKSYmKChuPWkuY29weShlKSkubWVzc2FnZT1lLm1lc3NhZ2UpLGUubWVzc2FnZT1lLm1lc3NhZ2V8fG51bGwsInN0cmluZyI9PXR5cGVvZiB0P2UubWVzc2FnZT10OiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJihpLnVwZGF0ZShlLHQpLHQubWVzc2FnZSYmKGUubWVzc2FnZT10Lm1lc3NhZ2UpLCh0LmNvZGV8fHQubmFtZSkmJihlLmNvZGU9dC5jb2RlfHx0Lm5hbWUpLHQuc3RhY2smJihlLnN0YWNrPXQuc3RhY2spKSwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5JiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5hbWUiLHt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1lc3NhZ2UiLHtlbnVtZXJhYmxlOiEwfSkpLGUubmFtZT1TdHJpbmcodCYmdC5uYW1lfHxlLm5hbWV8fGUuY29kZXx8IkVycm9yIiksZS50aW1lPW5ldyBEYXRlLG4mJihlLm9yaWdpbmFsRXJyb3I9biksdHx8e30paWYoIlsiPT09clswXSYmIl0iPT09cltyLmxlbmd0aC0xXSl7aWYoImNvZGUiPT09KHI9ci5zbGljZSgxLC0xKSl8fCJtZXNzYWdlIj09PXIpY29udGludWU7ZVsiWyIrcisiXSJdPSJTZWUgZXJyb3IuIityKyIgZm9yIGRldGFpbHMuIixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHt2YWx1ZTplW3JdfHx0JiZ0W3JdfHxuJiZuW3JdLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KX1yZXR1cm4gZX0saW5oZXJpdDpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7aWYodm9pZCAwPT09dCl0PWUsZT1PYmplY3Qsbj17fTtlbHNle3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuPW5ldyByfXJldHVybiB0LmNvbnN0cnVjdG9yPT09T2JqZWN0JiYodC5jb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe2lmKGUhPT1PYmplY3QpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU9bixpLnVwZGF0ZSh0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSx0LmNvbnN0cnVjdG9yLl9fc3VwZXJfXz1lLHQuY29uc3RydWN0b3J9LG1peGluOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylmb3IodmFyIG4gaW4gYXJndW1lbnRzW3RdLnByb3RvdHlwZSl7dmFyIHI9YXJndW1lbnRzW3RdLnByb3RvdHlwZVtuXTsiY29uc3RydWN0b3IiIT09biYmKGUucHJvdG90eXBlW25dPXIpfXJldHVybiBlfSxoaWRlUHJvcGVydGllczpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJmkuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KSl9LHByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOnZvaWQgMD09PXJ8fHJ9OyJmdW5jdGlvbiIhPXR5cGVvZiBufHxvPyhpLnZhbHVlPW4saS53cml0YWJsZT0hMCk6aS5nZXQ9bixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGkpfSxtZW1vaXplZFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW51bGw7aS5wcm9wZXJ0eShlLHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1vJiYobz1uKCkpLG99KSxyKX0saG9pc3RQYXlsb2FkTWVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLG89ci5vdXRwdXQ7aWYoby5wYXlsb2FkJiYhci5oYXNFdmVudE91dHB1dCl7dmFyIHM9by5tZW1iZXJzW28ucGF5bG9hZF0sYT1lLmRhdGFbby5wYXlsb2FkXTsic3RydWN0dXJlIj09PXMudHlwZSYmaS5lYWNoKGEsKGZ1bmN0aW9uKHQsbil7aS5wcm9wZXJ0eShlLmRhdGEsdCxuLCExKX0pKX19LGNvbXB1dGVTaGEyNTY6ZnVuY3Rpb24odCxuKXtpZihpLmlzTm9kZSgpKXt2YXIgcj1pLnN0cmVhbS5TdHJlYW0sbz1lKCJmcyIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiZ0IGluc3RhbmNlb2Ygcil7aWYoInN0cmluZyIhPXR5cGVvZiB0LnBhdGgpcmV0dXJuIG4obmV3IEVycm9yKCJOb24tZmlsZSBzdHJlYW0gb2JqZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFNpZ1Y0IikpO3ZhciBzPXt9OyJudW1iZXIiPT10eXBlb2YgdC5zdGFydCYmKHMuc3RhcnQ9dC5zdGFydCksIm51bWJlciI9PXR5cGVvZiB0LmVuZCYmKHMuZW5kPXQuZW5kKSx0PW8uY3JlYXRlUmVhZFN0cmVhbSh0LnBhdGgscyl9fWkuY3J5cHRvLnNoYTI1Nih0LCJoZXgiLChmdW5jdGlvbihlLHQpe2U/bihlKTpuKG51bGwsdCl9KSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gaS5wcm9wZXJ0eShvLmNvbmZpZywiaXNDbG9ja1NrZXdlZCIsTWF0aC5hYnMoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSk+PTNlNSwhMSksby5jb25maWcuaXNDbG9ja1NrZXdlZH0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYoby5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS0obmV3IERhdGUpLmdldFRpbWUoKSl9LGV4dHJhY3RSZXF1ZXN0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdfHxlLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl07IXQmJmUuZGF0YSYmZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEmJih0PWUuZGF0YS5SZXNwb25zZU1ldGFkYXRhLlJlcXVlc3RJZCksdCYmKGUucmVxdWVzdElkPXQpLGUuZXJyb3ImJihlLmVycm9yLnJlcXVlc3RJZD10KX0sYWRkUHJvbWlzZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTt2b2lkIDA9PT10JiZvJiZvLmNvbmZpZyYmKHQ9by5jb25maWcuZ2V0UHJvbWlzZXNEZXBlbmRlbmN5KCkpLHZvaWQgMD09PXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmKHQ9UHJvbWlzZSksImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihuPSEwKSxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO24/aS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcyYmaS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcygpOmkuYWRkUHJvbWlzZXNUb0NsYXNzJiZpLmFkZFByb21pc2VzVG9DbGFzcyh0KX19LHByb21pc2lmeU1ldGhvZDpmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtyLnB1c2goKGZ1bmN0aW9uKGUsbil7ZT9vKGUpOnQobil9KSksbltlXS5hcHBseShuLHIpfSkpfX0saXNEdWFsc3RhY2tBdmFpbGFibGU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dmFyIG49ZSgiLi4vYXBpcy9tZXRhZGF0YS5qc29uIik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD10LnNlcnZpY2VJZGVudGlmaWVyKSwhKCJzdHJpbmciIT10eXBlb2YgdHx8IW4uaGFzT3duUHJvcGVydHkodCl8fCFuW3RdLmR1YWxzdGFja0F2YWlsYWJsZSl9LGNhbGN1bGF0ZVJldHJ5RGVsYXk6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj10LmN1c3RvbUJhY2tvZmZ8fG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIHIoZSxuKTt2YXIgbz0ibnVtYmVyIj09dHlwZW9mIHQuYmFzZT90LmJhc2U6MTAwO3JldHVybiBNYXRoLnJhbmRvbSgpKihNYXRoLnBvdygyLGUpKm8pfSxoYW5kbGVSZXF1ZXN0V2l0aFJldHJpZXM6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj1vLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPXQuaHR0cE9wdGlvbnN8fHt9LGE9MCxjPWZ1bmN0aW9uKGUpe3ZhciByPXQubWF4UmV0cmllc3x8MDtpZihlJiYiVGltZW91dEVycm9yIj09PWUuY29kZSYmKGUucmV0cnlhYmxlPSEwKSxlJiZlLnJldHJ5YWJsZSYmYTxyKXt2YXIgbz1pLmNhbGN1bGF0ZVJldHJ5RGVsYXkoYSx0LnJldHJ5RGVsYXlPcHRpb25zLGUpO2lmKG8+PTApcmV0dXJuIGErKyx2b2lkIHNldFRpbWVvdXQodSxvKyhlLnJldHJ5QWZ0ZXJ8fDApKX1uKGUpfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7ci5oYW5kbGVSZXF1ZXN0KGUscywoZnVuY3Rpb24oZSl7ZS5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe3QrPWUudG9TdHJpbmcoKX0pKSxlLm9uKCJlbmQiLChmdW5jdGlvbigpe3ZhciByPWUuc3RhdHVzQ29kZTtpZihyPDMwMCluKG51bGwsdCk7ZWxzZXt2YXIgbz0xZTMqcGFyc2VJbnQoZS5oZWFkZXJzWyJyZXRyeS1hZnRlciJdLDEwKXx8MCxzPWkuZXJyb3IobmV3IEVycm9yLHtzdGF0dXNDb2RlOnIscmV0cnlhYmxlOnI+PTUwMHx8NDI5PT09cn0pO28mJnMucmV0cnlhYmxlJiYocy5yZXRyeUFmdGVyPW8pLGMocyl9fSkpfSksYyl9O28udXRpbC5kZWZlcih1KX0sdXVpZDp7djQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgidXVpZCIpLnY0KCl9fSxjb252ZXJ0UGF5bG9hZFRvU3RyaW5nOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLm91dHB1dHx8e307ci5wYXlsb2FkJiZlLmRhdGFbci5wYXlsb2FkXSYmKGUuZGF0YVtyLnBheWxvYWRdPWUuZGF0YVtyLnBheWxvYWRdLnRvU3RyaW5nKCkpfSxkZWZlcjpmdW5jdGlvbihlKXsib2JqZWN0Ij09dHlwZW9mIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLm5leHRUaWNrP24ubmV4dFRpY2soZSk6ImZ1bmN0aW9uIj09dHlwZW9mIHI/cihlKTpzZXRUaW1lb3V0KGUsMCl9LGdldFJlcXVlc3RQYXlsb2FkU2hhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zO2lmKHQpe3ZhciBuPSh0fHx7fSlbZS5vcGVyYXRpb25dO2lmKG4mJm4uaW5wdXQmJm4uaW5wdXQucGF5bG9hZClyZXR1cm4gbi5pbnB1dC5tZW1iZXJzW24uaW5wdXQucGF5bG9hZF19fSxnZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWc6ZnVuY3Rpb24oZSx0KXt2YXIgcj17fSxvPXt9O24uZW52W2kuY29uZmlnT3B0SW5FbnZdJiYobz1lLmxvYWRGcm9tKHtpc0NvbmZpZzohMCxmaWxlbmFtZTpuLmVudltpLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSkpO3ZhciBzPXt9O3RyeXtzPWUubG9hZEZyb20oe2ZpbGVuYW1lOnR8fG4uZW52W2kuY29uZmlnT3B0SW5FbnZdJiZuLmVudltpLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl19KX1jYXRjaChlKXtpZighbi5lbnZbaS5jb25maWdPcHRJbkVudl0pdGhyb3cgZX1mb3IodmFyIGE9MCxjPU9iamVjdC5rZXlzKG8pO2E8Yy5sZW5ndGg7YSsrKXJbY1thXV09dShyW2NbYV1dfHx7fSxvW2NbYV1dKTtmb3IoYT0wLGM9T2JqZWN0LmtleXMocyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LHNbY1thXV0pO3JldHVybiByO2Z1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MCxyPU9iamVjdC5rZXlzKHQpO248ci5sZW5ndGg7bisrKWVbcltuXV09dFtyW25dXTtyZXR1cm4gZX19LEFSTjp7dmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJjA9PT1lLmluZGV4T2YoImFybjoiKSYmZS5zcGxpdCgiOiIpLmxlbmd0aD49Nn0scGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiOiIpO3JldHVybntwYXJ0aXRpb246dFsxXSxzZXJ2aWNlOnRbMl0scmVnaW9uOnRbM10sYWNjb3VudElkOnRbNF0scmVzb3VyY2U6dC5zbGljZSg1KS5qb2luKCI6Iil9fSxidWlsZDpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lLnNlcnZpY2V8fHZvaWQgMD09PWUucmVnaW9ufHx2b2lkIDA9PT1lLmFjY291bnRJZHx8dm9pZCAwPT09ZS5yZXNvdXJjZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiSW5wdXQgQVJOIG9iamVjdCBpcyBpbnZhbGlkIikpO3JldHVybiJhcm46IisoZS5wYXJ0aXRpb258fCJhd3MiKSsiOiIrZS5zZXJ2aWNlKyI6IitlLnJlZ2lvbisiOiIrZS5hY2NvdW50SWQrIjoiK2UucmVzb3VyY2V9fSxkZWZhdWx0UHJvZmlsZToiZGVmYXVsdCIsY29uZmlnT3B0SW5FbnY6IkFXU19TREtfTE9BRF9DT05GSUciLHNoYXJlZENyZWRlbnRpYWxzRmlsZUVudjoiQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFIixzaGFyZWRDb25maWdGaWxlRW52OiJBV1NfQ09ORklHX0ZJTEUiLGltZHNEaXNhYmxlZEVudjoiQVdTX0VDMl9NRVRBREFUQV9ESVNBQkxFRCJ9O3QuZXhwb3J0cz1pfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSl9LHsiLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuL2NvcmUiOjE5LF9wcm9jZXNzOjkxLGZzOjgyLHRpbWVyczo5OSx1dWlkOjEwMn1dLDc1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vbW9kZWwvc2hhcGUiKTtmdW5jdGlvbiBpKCl7fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSxyPTAsbz1uLmxlbmd0aDtyPG87cisrKWlmKG5bcl0ucGFyZW50Tm9kZT09PWUpcmV0dXJuIG5bcl19ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0fHwodD17fSksdC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGMoZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXt9LHI9dC5rZXkubmFtZXx8ImtleSIsbz10LnZhbHVlLm5hbWV8fCJ2YWx1ZSIsaT10LmZsYXR0ZW5lZD90Lm5hbWU6ImVudHJ5IixjPWUuZmlyc3RFbGVtZW50Q2hpbGQ7Yzspe2lmKGMubm9kZU5hbWU9PT1pKXt2YXIgdT1zKGMscikudGV4dENvbnRlbnQsbD1zKGMsbyk7blt1XT1hKGwsdC52YWx1ZSl9Yz1jLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPXQuZmxhdHRlbmVkP3QubmFtZTp0Lm1lbWJlci5uYW1lfHwibWVtYmVyIixvPWUuZmlyc3RFbGVtZW50Q2hpbGQ7bzspby5ub2RlTmFtZT09PXImJm4ucHVzaChhKG8sdC5tZW1iZXIpKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBufShlLHQpO2Nhc2Ugdm9pZCAwOmNhc2UgbnVsbDpyZXR1cm4gZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4iIjtpZighZS5maXJzdEVsZW1lbnRDaGlsZClyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZS5wYXJlbnROb2RlP3t9OjA9PT1lLmNoaWxkTm9kZXMubGVuZ3RoPyIiOmUudGV4dENvbnRlbnQ7Zm9yKHZhciB0PXt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319LG49ZS5maXJzdEVsZW1lbnRDaGlsZDtuOyl7dmFyIHI9bi5ub2RlTmFtZTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5tZW1iZXJzLHIpP3QubWVtYmVyc1tyXS50eXBlPSJsaXN0Ijp0Lm1lbWJlcnNbcl09e25hbWU6cn0sbj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gYyhlLHQpfShlKTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe2lmKGUuZ2V0QXR0cmlidXRlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZW5jb2RpbmciKTsiYmFzZTY0Ij09PW4mJih0PW5ldyBvLmNyZWF0ZSh7dHlwZTpufSkpfXZhciByPWUudGV4dENvbnRlbnQ7cmV0dXJuIiI9PT1yJiYocj1udWxsKSwiZnVuY3Rpb24iPT10eXBlb2YgdC50b1R5cGU/dC50b1R5cGUocik6cn0oZSx0KX19ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBudWxsPT09ZXx8ci5lYWNoKHQubWVtYmVycywoZnVuY3Rpb24ocixvKXtpZihvLmlzWG1sQXR0cmlidXRlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5hdHRyaWJ1dGVzLG8ubmFtZSkpe3ZhciBpPWUuYXR0cmlidXRlc1tvLm5hbWVdLnZhbHVlO25bcl09YSh7dGV4dENvbnRlbnQ6aX0sbyl9fWVsc2V7dmFyIGM9by5mbGF0dGVuZWQ/ZTpzKGUsby5uYW1lKTtjP25bcl09YShjLG8pOm8uZmxhdHRlbmVkfHwibGlzdCIhPT1vLnR5cGV8fHQuYXBpLnhtbE5vRGVmYXVsdExpc3RzfHwobltyXT1vLmRlZmF1bHRWYWx1ZSl9fSkpLG59aS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtpZigiIj09PWUucmVwbGFjZSgvXlxzKy8sIiIpKXJldHVybnt9O3ZhciBuLG87dHJ5e2lmKHdpbmRvdy5ET01QYXJzZXIpe3RyeXtuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7b3JpZ2luYWxFcnJvcjplLGNvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX1pZihudWxsPT09bi5kb2N1bWVudEVsZW1lbnQpdGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBlbXB0eSBkb2N1bWVudC4iKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3ZhciBpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF07aWYoaSYmKGkucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5ub2RlTmFtZXx8aS5wYXJlbnROb2RlLnBhcmVudE5vZGU9PT1ufHwiYm9keSI9PT1pLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpe3ZhciBjPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpWzBdfHxpO3Rocm93IHIuZXJyb3IobmV3IEVycm9yKGMudGV4dENvbnRlbnR8fCJQYXJzZXIgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1lbHNle2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIFhNTCBwYXJzZXIiKTtpZigobj1uZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSkuYXN5bmM9ITEsIW4ubG9hZFhNTChlKSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1jYXRjaChlKXtvPWV9aWYobiYmbi5kb2N1bWVudEVsZW1lbnQmJiFvKXt2YXIgdT1hKG4uZG9jdW1lbnRFbGVtZW50LHQpLGw9cyhuLmRvY3VtZW50RWxlbWVudCwiUmVzcG9uc2VNZXRhZGF0YSIpO3JldHVybiBsJiYodS5SZXNwb25zZU1ldGFkYXRhPWEobCx7fSkpLHV9aWYobyl0aHJvdyByLmVycm9yKG98fG5ldyBFcnJvcix7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3JldHVybnt9fSx0LmV4cG9ydHM9aX0seyIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3V0aWwiOjc0fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL3htbC1ub2RlIikuWG1sTm9kZSxpPWUoIi4veG1sLXRleHQiKS5YbWxUZXh0O2Z1bmN0aW9uIHMoKXt9ZnVuY3Rpb24gYShlLHQsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQsbil7ci5hcnJheUVhY2gobi5tZW1iZXJOYW1lcywoZnVuY3Rpb24ocil7dmFyIGk9bi5tZW1iZXJzW3JdO2lmKCJib2R5Ij09PWkubG9jYXRpb24pe3ZhciBzPXRbcl0sdT1pLm5hbWU7aWYobnVsbCE9cylpZihpLmlzWG1sQXR0cmlidXRlKWUuYWRkQXR0cmlidXRlKHUscyk7ZWxzZSBpZihpLmZsYXR0ZW5lZClhKGUscyxpKTtlbHNle3ZhciBsPW5ldyBvKHUpO2UuYWRkQ2hpbGROb2RlKGwpLGMobCxpKSxhKGwscyxpKX19fSkpfShlLHQsbik7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGk9bi5rZXkubmFtZXx8ImtleSIscz1uLnZhbHVlLm5hbWV8fCJ2YWx1ZSI7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9bmV3IG8obi5mbGF0dGVuZWQ/bi5uYW1lOiJlbnRyeSIpO2UuYWRkQ2hpbGROb2RlKGMpO3ZhciB1PW5ldyBvKGkpLGw9bmV3IG8ocyk7Yy5hZGRDaGlsZE5vZGUodSksYy5hZGRDaGlsZE5vZGUobCksYSh1LHQsbi5rZXkpLGEobCxyLG4udmFsdWUpfSkpfShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe24uZmxhdHRlbmVkP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fG4ubmFtZSxpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKTpyLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcj1uLm1lbWJlci5uYW1lfHwibWVtYmVyIixpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKX0oZSx0LG4pO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtlLmFkZENoaWxkTm9kZShuZXcgaShuLnRvV2lyZUZvcm1hdCh0KSkpfShlLHQsbil9fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByLG89InhtbG5zIjt0LnhtbE5hbWVzcGFjZVVyaT8ocj10LnhtbE5hbWVzcGFjZVVyaSx0LnhtbE5hbWVzcGFjZVByZWZpeCYmKG8rPSI6Iit0LnhtbE5hbWVzcGFjZVByZWZpeCkpOm4mJnQuYXBpLnhtbE5hbWVzcGFjZVVyaSYmKHI9dC5hcGkueG1sTmFtZXNwYWNlVXJpKSxyJiZlLmFkZEF0dHJpYnV0ZShvLHIpfXMucHJvdG90eXBlLnRvWE1MPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW5ldyBvKG4pO3JldHVybiBjKGksdCwhMCksYShpLGUsdCksaS5jaGlsZHJlbi5sZW5ndGg+MHx8cj9pLnRvU3RyaW5nKCk6IiJ9LHQuZXhwb3J0cz1zfSx7Ii4uL3V0aWwiOjc0LCIuL3htbC1ub2RlIjo3OSwiLi94bWwtdGV4dCI6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXNjYXBlQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8nL2csIiZhcG9zOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9fX0se31dLDc4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC9cci9nLCImI3gwRDsiKS5yZXBsYWNlKC9cbi9nLCImI3gwQTsiKS5yZXBsYWNlKC9cdTAwODUvZywiJiN4ODU7IikucmVwbGFjZSgvXHUyMDI4LywiJiN4MjAyODsiKX19fSx7fV0sNzk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2VzY2FwZS1hdHRyaWJ1dGUiKS5lc2NhcGVBdHRyaWJ1dGU7ZnVuY3Rpb24gbyhlLHQpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLm5hbWU9ZSx0aGlzLmNoaWxkcmVuPXQsdGhpcy5hdHRyaWJ1dGVzPXt9fW8ucHJvdG90eXBlLmFkZEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfSxvLnByb3RvdHlwZS5hZGRDaGlsZE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucHVzaChlKSx0aGlzfSxvLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbZV0sdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9Qm9vbGVhbih0aGlzLmNoaWxkcmVuLmxlbmd0aCksdD0iPCIrdGhpcy5uYW1lLG49dGhpcy5hdHRyaWJ1dGVzLG89MCxpPU9iamVjdC5rZXlzKG4pO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dLGE9bltzXTtudWxsIT1hJiYodCs9IiAiK3MrJz0iJytyKCIiK2EpKyciJyl9cmV0dXJuIHQrKGU/Ij4iK3RoaXMuY2hpbGRyZW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkpLmpvaW4oIiIpKyI8LyIrdGhpcy5uYW1lKyI+IjoiLz4iKX0sdC5leHBvcnRzPXtYbWxOb2RlOm99fSx7Ii4vZXNjYXBlLWF0dHJpYnV0ZSI6Nzd9XSw4MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWVsZW1lbnQiKS5lc2NhcGVFbGVtZW50O2Z1bmN0aW9uIG8oZSl7dGhpcy52YWx1ZT1lfW8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIoIiIrdGhpcy52YWx1ZSl9LHQuZXhwb3J0cz17WG1sVGV4dDpvfX0seyIuL2VzY2FwZS1lbGVtZW50Ijo3OH1dLDgxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uYnl0ZUxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1jKGUpLG49dFswXSxyPXRbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxuLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1jKGUpLHM9clswXSxhPXJbMV0sdT1uZXcgaShmdW5jdGlvbihlLHQsbil7cmV0dXJuIDMqKHQrbikvNC1ufSgwLHMsYSkpLGw9MCxwPWE+MD9zLTQ6cztmb3Iobj0wO248cDtuKz00KXQ9b1tlLmNoYXJDb2RlQXQobildPDwxOHxvW2UuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1tlLmNoYXJDb2RlQXQobisyKV08PDZ8b1tlLmNoYXJDb2RlQXQobiszKV0sdVtsKytdPXQ+PjE2JjI1NSx1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0O3JldHVybiAyPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwyfG9bZS5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmdCksMT09PWEmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MTB8b1tlLmNoYXJDb2RlQXQobisxKV08PDR8b1tlLmNoYXJDb2RlQXQobisyKV0+PjIsdVtsKytdPXQ+PjgmMjU1LHVbbCsrXT0yNTUmdCksdX0sbi5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPWUubGVuZ3RoLG89biUzLGk9W10scz0xNjM4MyxhPTAsYz1uLW87YTxjO2ErPXMpaS5wdXNoKHUoZSxhLGErcz5jP2M6YStzKSk7cmV0dXJuIDE9PT1vPyh0PWVbbi0xXSxpLnB1c2goclt0Pj4yXStyW3Q8PDQmNjNdKyI9PSIpKToyPT09byYmKHQ9KGVbbi0yXTw8OCkrZVtuLTFdLGkucHVzaChyW3Q+PjEwXStyW3Q+PjQmNjNdK3JbdDw8MiY2M10rIj0iKSksaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxzPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixhPTA7YTw2NDsrK2EpclthXT1zW2FdLG9bcy5jaGFyQ29kZUF0KGEpXT1hO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49ZS5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj10KSxbbixuPT09dD8wOjQtbiU0XX1mdW5jdGlvbiB1KGUsdCxuKXtmb3IodmFyIG8saSxzPVtdLGE9dDthPG47YSs9MylvPShlW2FdPDwxNiYxNjcxMTY4MCkrKGVbYSsxXTw8OCY2NTI4MCkrKDI1NSZlW2ErMl0pLHMucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gcy5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30se31dLDgyOltmdW5jdGlvbihlLHQsbil7fSx7fV0sODM6W2Z1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX0se31dLDg0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvcHkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRVSW50OH19LHt9XSw4NTpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpe3ZhciBvPS8lW3NkaiVdL2c7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoIXYoZSkpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYShhcmd1bWVudHNbbl0pKTtyZXR1cm4gdC5qb2luKCIgIil9bj0xO2Zvcih2YXIgcj1hcmd1bWVudHMsaT1yLmxlbmd0aCxzPVN0cmluZyhlKS5yZXBsYWNlKG8sKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSksYz1yW25dO248aTtjPXJbKytuXSlnKGMpfHwhUyhjKT9zKz0iICIrYzpzKz0iICIrYShjKTtyZXR1cm4gc30sci5kZXByZWNhdGU9ZnVuY3Rpb24oZSxvKXtpZih5KG4ucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVwcmVjYXRlKGUsbykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PXQubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighaSl7aWYodC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTt0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGk9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGkscz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTp1fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxmKHQpP24uc2hvd0hpZGRlbj10OnQmJnIuX2V4dGVuZChuLHQpLHkobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSkseShuLmRlcHRoKSYmKG4uZGVwdGg9MikseShuLmNvbG9ycykmJihuLmNvbG9ycz0hMSkseShuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT1jKSxsKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49YS5zdHlsZXNbdF07cmV0dXJuIG4/IhtbIithLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK2EuY29sb3JzW25dWzFdKyJtIjplfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBsKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJlQodC5pbnNwZWN0KSYmdC5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciBvPXQuaW5zcGVjdChuLGUpO3JldHVybiB2KG8pfHwobz1sKGUsbyxuKSksb312YXIgaT1mdW5jdGlvbihlLHQpe2lmKHkodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYodih0KSl7dmFyIG49IiciK0pTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIGUuc3R5bGl6ZShuLCJzdHJpbmciKX1yZXR1cm4gbSh0KT9lLnN0eWxpemUoIiIrdCwibnVtYmVyIik6Zih0KT9lLnN0eWxpemUoIiIrdCwiYm9vbGVhbiIpOmcodCk/ZS5zdHlsaXplKCJudWxsIiwibnVsbCIpOnZvaWQgMH0oZSx0KTtpZihpKXJldHVybiBpO3ZhciBzPU9iamVjdC5rZXlzKHQpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0W2VdPSEwfSkpLHR9KHMpO2lmKGUuc2hvd0hpZGRlbiYmKHM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkpLEModCkmJihzLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8cy5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gcCh0KTtpZigwPT09cy5sZW5ndGgpe2lmKFQodCkpe3ZhciBjPXQubmFtZT8iOiAiK3QubmFtZToiIjtyZXR1cm4gZS5zdHlsaXplKCJbRnVuY3Rpb24iK2MrIl0iLCJzcGVjaWFsIil9aWYoRSh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoYih0KSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksImRhdGUiKTtpZihDKHQpKXJldHVybiBwKHQpfXZhciB1LFM9IiIsST0hMSxBPVsieyIsIn0iXTtyZXR1cm4gaCh0KSYmKEk9ITAsQT1bIlsiLCJdIl0pLFQodCkmJihTPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpLEUodCkmJihTPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLGIodCkmJihTPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxDKHQpJiYoUz0iICIrcCh0KSksMCE9PXMubGVuZ3RofHxJJiYwIT10Lmxlbmd0aD9uPDA/RSh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSx1PUk/ZnVuY3Rpb24oZSx0LG4scixvKXtmb3IodmFyIGk9W10scz0wLGE9dC5sZW5ndGg7czxhOysrcyl3KHQsU3RyaW5nKHMpKT9pLnB1c2goZChlLHQsbixyLFN0cmluZyhzKSwhMCkpOmkucHVzaCgiIik7cmV0dXJuIG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7by5tYXRjaCgvXlxkKyQvKXx8aS5wdXNoKGQoZSx0LG4scixvLCEwKSl9KSksaX0oZSx0LG4sYSxzKTpzLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGQoZSx0LG4sYSxyLEkpfSkpLGUuc2Vlbi5wb3AoKSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiXG4iKSxlK3QucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtyZXR1cm4gcj42MD9uWzBdKygiIj09PXQ/IiI6dCsiXG4gIikrIiAiK2Uuam9pbigiLFxuICAiKSsiICIrblsxXTpuWzBdK3QrIiAiK2Uuam9pbigiLCAiKSsiICIrblsxXX0odSxTLEEpKTpBWzBdK1MrQVsxXX1mdW5jdGlvbiBwKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZChlLHQsbixyLG8saSl7dmFyIHMsYSxjO2lmKChjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKXx8e3ZhbHVlOnRbb119KS5nZXQ/YT1jLnNldD9lLnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTplLnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOmMuc2V0JiYoYT1lLnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSx3KHIsbyl8fChzPSJbIitvKyJdIiksYXx8KGUuc2Vlbi5pbmRleE9mKGMudmFsdWUpPDA/KGE9ZyhuKT9sKGUsYy52YWx1ZSxudWxsKTpsKGUsYy52YWx1ZSxuLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1pP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAiK2V9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgICIrZX0pKS5qb2luKCJcbiIpKTphPWUuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSkseShzKSl7aWYoaSYmby5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitvKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz1lLnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBnKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiB2KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiB5KGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09SShlKX1mdW5jdGlvbiBTKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gYihlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgRGF0ZV0iPT09SShlKX1mdW5jdGlvbiBDKGUpe3JldHVybiBTKGUpJiYoIltvYmplY3QgRXJyb3JdIj09PUkoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gVChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBJKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ci5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZih5KGkpJiYoaT10LmVudi5OT0RFX0RFQlVHfHwiIiksZT1lLnRvVXBwZXJDYXNlKCksIXNbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChpKSl7dmFyIG49dC5waWQ7c1tlXT1mdW5jdGlvbigpe3ZhciB0PXIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLGUsbix0KX19ZWxzZSBzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gc1tlXX0sci5pbnNwZWN0PWEsYS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGEuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sci5pc0FycmF5PWgsci5pc0Jvb2xlYW49ZixyLmlzTnVsbD1nLHIuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LHIuaXNOdW1iZXI9bSxyLmlzU3RyaW5nPXYsci5pc1N5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9LHIuaXNVbmRlZmluZWQ9eSxyLmlzUmVnRXhwPUUsci5pc09iamVjdD1TLHIuaXNEYXRlPWIsci5pc0Vycm9yPUMsci5pc0Z1bmN0aW9uPVQsci5pc1ByaW1pdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fHZvaWQgMD09PWV9LHIuaXNCdWZmZXI9ZSgiLi9zdXBwb3J0L2lzQnVmZmVyIik7dmFyIF89WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXIubG9nPWZ1bmN0aW9uKCl7dmFyIGUsdDtjb25zb2xlLmxvZygiJXMgLSAlcyIsKGU9bmV3IERhdGUsdD1bQShlLmdldEhvdXJzKCkpLEEoZS5nZXRNaW51dGVzKCkpLEEoZS5nZXRTZWNvbmRzKCkpXS5qb2luKCI6IiksW2UuZ2V0RGF0ZSgpLF9bZS5nZXRNb250aCgpXSx0XS5qb2luKCIgIikpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgiaW5oZXJpdHMiKSxyLl9leHRlbmQ9ZnVuY3Rpb24oZSx0KXtpZighdHx8IVModCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3N1cHBvcnQvaXNCdWZmZXIiOjg0LF9wcm9jZXNzOjkxLGluaGVyaXRzOjgzfV0sODY6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG49ZSgiYmFzZTY0LWpzIiksbz1lKCJpZWVlNzU0IiksaT1lKCJpc2FycmF5Iik7ZnVuY3Rpb24gcygpe3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEoZSx0KXtpZihzKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBjKGUsdCxuKXtpZighKGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGMpKXJldHVybiBuZXcgYyhlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBwKHRoaXMsZSl9cmV0dXJuIHUodGhpcyxlLHQsbil9ZnVuY3Rpb24gdShlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LG4pOm5ldyBVaW50OEFycmF5KHQsbixyKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWMucHJvdG90eXBlOmU9ZChlLHQpLGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4IiksIWMuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGYodCxuKSxvPShlPWEoZSxyKSkud3JpdGUodCxuKTtyZXR1cm4gbyE9PXImJihlPWUuc2xpY2UoMCxvKSksZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYy5pc0J1ZmZlcih0KSl7dmFyIG49MHxoKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPWEoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP2EoZSwwKTpkKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmkodC5kYXRhKSlyZXR1cm4gZChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBwKGUsdCl7aWYobCh0KSxlPWEoZSx0PDA/MDowfGgodCkpLCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXQubGVuZ3RoPDA/MDowfGgodC5sZW5ndGgpO2U9YShlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gaChlKXtpZihlPj1zKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3MoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gZihlLHQpe2lmKGMuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBqKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEIoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyhlLHQsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4+dGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gUih0aGlzLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBBKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIE4odGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHYoZSx0LG4scixvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWMuZnJvbSh0LHIpKSxjLmlzQnVmZmVyKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6eShlLHQsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LG4pOnkoZSxbdF0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHkoZSx0LG4scixvKXt2YXIgaSxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxhO2krKylpZih1KGUsaSk9PT11KHQsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBwPSEwLGQ9MDtkPGM7ZCsrKWlmKHUoZSxpK2QpIT09dSh0LGQpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gRShlLHQsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz1lLmxlbmd0aC1uO3I/KHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9dC5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+aS8yJiYocj1pLzIpO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtuK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gUyhlLHQsbixyKXtyZXR1cm4gVihCKHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIGIoZSx0LG4scil7cmV0dXJuIFYoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBiKGUsdCxuLHIpfWZ1bmN0aW9uIFQoZSx0LG4scil7cmV0dXJuIFYoaih0KSxlLG4scil9ZnVuY3Rpb24gSShlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG8saT1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKXI9KG49ZS5jaGFyQ29kZUF0KHMpKT4+OCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIEEoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP24uZnJvbUJ5dGVBcnJheShlKTpuLmZyb21CeXRlQXJyYXkoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBfKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPXQ7bzxuOyl7dmFyIGkscyxhLGMsdT1lW29dLGw9bnVsbCxwPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYobytwPD1uKXN3aXRjaChwKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9ZVtvKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZpKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzppPWVbbysxXSxzPWVbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmaSk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6aT1lW28rMV0scz1lW28rMl0sYT1lW28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmaSk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxwPTEpOmw+NjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9cH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9dylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz13KSk7cmV0dXJuIG59KHIpfXIuQnVmZmVyPWMsci5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxjLmFsbG9jKCtlKX0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgZT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PWUuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN1YmFycmF5JiYwPT09ZS5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHIua01heExlbmd0aD1zKCksYy5wb29sU2l6ZT04MTkyLGMuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPWMucHJvdG90eXBlLGV9LGMuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHUobnVsbCxlLHQsbil9LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGMucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxjLl9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmY1tTeW1ib2wuc3BlY2llc109PT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksYy5hbGxvYz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBsKHQpLHQ8PTA/YShlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP2EoZSx0KS5maWxsKG4scik6YShlLHQpLmZpbGwobik6YShlLHQpfShudWxsLGUsdCxuKX0sYy5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWMuaXNCdWZmZXIoZSl8fCFjLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxyPXRbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxjLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGMuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYy5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPWMuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07aWYoIWMuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShyLG8pLG8rPXMubGVuZ3RofXJldHVybiByfSxjLmJ5dGVMZW5ndGg9ZixjLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW0odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCltKHRoaXMsdCx0KzMpLG0odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KW0odGhpcyx0LHQrNyksbSh0aGlzLHQrMSx0KzYpLG0odGhpcyx0KzIsdCs1KSxtKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Xyh0aGlzLDAsZSk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09Yy5jb21wYXJlKHRoaXMsZSl9LGMucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCx0KS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+dCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxjLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZ0Pj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKGkscyksdT10aGlzLnNsaWNlKHIsbyksbD1lLnNsaWNlKHQsbikscD0wO3A8YTsrK3ApaWYodVtwXSE9PWxbcF0pe2k9dVtwXSxzPWxbcF07YnJlYWt9cmV0dXJuIGk8cz8tMTpzPGk/MTowfSxjLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxjLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCEwKX0sYy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITEpfSxjLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gRSh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBTKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBiKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB3PTQwOTY7ZnVuY3Rpb24gUihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbb10pO3JldHVybiByfWZ1bmN0aW9uIGsoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbb10pO3JldHVybiByfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByLG89ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5vKSYmKG49byk7Zm9yKHZhciBpPSIiLHM9dDtzPG47KytzKWkrPShyPWVbc10pPDE2PyIwIityLnRvU3RyaW5nKDE2KTpyLnRvU3RyaW5nKDE2KTtyZXR1cm4gaX1mdW5jdGlvbiBOKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTyhlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gRChlLHQsbixyLG8saSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFAoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGk7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIHgoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288aTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gTShlLHQsbixyLG8saSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFUoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEYoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fWMucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGMuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyBjKG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK2VdfXJldHVybiBufSxjLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGMucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxjLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGk9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9LGMucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8TyhlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxjLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sYy5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSxjLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDI1NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2ktMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7RCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2krMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDEyNywtMTI4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpQKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PHItbiYmKHI9ZS5sZW5ndGgtdCtuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09ZSYmbjx0JiZ0PHIpZm9yKG89aS0xO28+PTA7LS1vKWVbbyt0XT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pZVtvK3RdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4raSksdCk7cmV0dXJuIGl9LGMucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIG89ZS5jaGFyQ29kZUF0KDApO288MjU2JiYoZT1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWMuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9dClyZXR1cm4gdGhpczt2YXIgaTtpZih0Pj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3IoaT10O2k8bjsrK2kpdGhpc1tpXT1lO2Vsc2V7dmFyIHM9Yy5pc0J1ZmZlcihlKT9lOkIobmV3IGMoZSxyKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihpPTA7aTxuLXQ7KytpKXRoaXNbaSt0XT1zW2klYV19cmV0dXJuIHRoaXN9O3ZhciBxPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIEIoZSx0KXt2YXIgbjt0PXR8fDEvMDtmb3IodmFyIHI9ZS5sZW5ndGgsbz1udWxsLGk9W10scz0wO3M8cjsrK3Mpe2lmKChuPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09cil7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigodC09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIGooZSl7cmV0dXJuIG4udG9CeXRlQXJyYXkoZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShxLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBWKGUsdCxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PXQubGVuZ3RofHxvPj1lLmxlbmd0aCk7KytvKXRbbytuXT1lW29dO3JldHVybiBvfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sZSgiYnVmZmVyIikuQnVmZmVyKX0seyJiYXNlNjQtanMiOjgxLGJ1ZmZlcjo4NixpZWVlNzU0Ojg4LGlzYXJyYXk6ODl9XSw4NzpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBpKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGlzTmFOKGUpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9LHIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEsYyx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PWUmJighdGhpcy5fZXZlbnRzLmVycm9yfHxpKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoKHQ9YXJndW1lbnRzWzFdKWluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdDt2YXIgbD1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJyt0KyIpIik7dGhyb3cgbC5jb250ZXh0PXQsbH1pZihzKG49dGhpcy5fZXZlbnRzW2VdKSlyZXR1cm4hMTtpZihvKG4pKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6bi5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG4uYXBwbHkodGhpcyxhKX1lbHNlIGlmKGkobikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9KHU9bi5zbGljZSgpKS5sZW5ndGgsYz0wO2M8cjtjKyspdVtjXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIixlLG8odC5saXN0ZW5lcik/dC5saXN0ZW5lcjp0KSx0aGlzLl9ldmVudHNbZV0/aSh0aGlzLl9ldmVudHNbZV0pP3RoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdGhpcy5fZXZlbnRzW2VdLHRdOnRoaXMuX2V2ZW50c1tlXT10LGkodGhpcy5fZXZlbnRzW2VdKSYmIXRoaXMuX2V2ZW50c1tlXS53YXJuZWQmJihuPXModGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmbj4wJiZ0aGlzLl9ldmVudHNbZV0ubGVuZ3RoPm4mJih0aGlzLl9ldmVudHNbZV0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbZV0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpLG58fChuPSEwLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gci5saXN0ZW5lcj10LHRoaXMub24oZSxyKSx0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1tlXSlyZXR1cm4gdGhpcztpZihzPShuPXRoaXMuX2V2ZW50c1tlXSkubGVuZ3RoLHI9LTEsbj09PXR8fG8obi5saXN0ZW5lcikmJm4ubGlzdGVuZXI9PT10KWRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpO2Vsc2UgaWYoaShuKSl7Zm9yKGE9czthLS0gPjA7KWlmKG5bYV09PT10fHxuW2FdLmxpc3RlbmVyJiZuW2FdLmxpc3RlbmVyPT09dCl7cj1hO2JyZWFrfWlmKHI8MClyZXR1cm4gdGhpczsxPT09bi5sZW5ndGg/KG4ubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSk6bi5zcGxpY2UociwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCl9cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1tlXSYmZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodCBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PXQmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHQpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihvKG49dGhpcy5fZXZlbnRzW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbik7ZWxzZSBpZihuKWZvcig7bi5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuW24ubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW2VdP28odGhpcy5fZXZlbnRzW2VdKT9bdGhpcy5fZXZlbnRzW2VdXTp0aGlzLl9ldmVudHNbZV0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlKXtpZih0aGlzLl9ldmVudHMpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZihvKHQpKXJldHVybiAxO2lmKHQpcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lckNvdW50KHQpfX0se31dLDg4OltmdW5jdGlvbihlLHQsbil7bi5yZWFkPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGkscyxhPTgqby1yLTEsYz0oMTw8YSktMSx1PWM+PjEsbD0tNyxwPW4/by0xOjAsZD1uPy0xOjEsaD1lW3QrcF07Zm9yKHArPWQsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9YTtsPjA7aT0yNTYqaStlW3QrcF0scCs9ZCxsLT04KTtmb3Iocz1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7cz0yNTYqcytlW3QrcF0scCs9ZCxsLT04KTtpZigwPT09aSlpPTEtdTtlbHNle2lmKGk9PT1jKXJldHVybiBzP05hTjoxLzAqKGg/LTE6MSk7cys9TWF0aC5wb3coMixyKSxpLT11fXJldHVybihoPy0xOjEpKnMqTWF0aC5wb3coMixpLXIpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGMsdT04Kmktby0xLGw9KDE8PHUpLTEscD1sPj4xLGQ9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZj1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxjKj0yKSwodCs9cytwPj0xP2QvYzpkKk1hdGgucG93KDIsMS1wKSkqYz49MiYmKHMrKyxjLz0yKSxzK3A+PWw/KGE9MCxzPWwpOnMrcD49MT8oYT0odCpjLTEpKk1hdGgucG93KDIsbykscys9cCk6KGE9dCpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixvKSxzPTApKTtvPj04O2VbbitoXT0yNTUmYSxoKz1mLGEvPTI1NixvLT04KTtmb3Iocz1zPDxvfGEsdSs9bzt1PjA7ZVtuK2hdPTI1NSZzLGgrPWYscy89MjU2LHUtPTgpO2VbbitoLWZdfD0xMjgqZ319LHt9XSw4OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1yLmNhbGwoZSl9fSx7fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiByKGUsbyl7aWYoZT09PW8pcmV0dXJuITA7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXJldHVybiExO2lmKCEwPT09dChlKSl7aWYoZS5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZighMT09PXIoZVtpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZighMD09PW4oZSkpe3ZhciBzPXt9O2Zvcih2YXIgYSBpbiBlKWlmKGhhc093blByb3BlcnR5LmNhbGwoZSxhKSl7aWYoITE9PT1yKGVbYV0sb1thXSkpcmV0dXJuITE7c1thXT0hMH1mb3IodmFyIGMgaW4gbylpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG8sYykmJiEwIT09c1tjXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe2lmKCIiPT09ZXx8ITE9PT1lfHxudWxsPT09ZSlyZXR1cm4hMDtpZih0KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuITA7aWYobihlKSl7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgaTtpPSJmdW5jdGlvbiI9PXR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1MZWZ0KCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqKC4qKS8pWzFdfTt2YXIgcz0wLGE9MSxjPTIsdT0zLGw9NCxwPTYsZD04LGg9OSxmPXswOiJudW1iZXIiLDE6ImFueSIsMjoic3RyaW5nIiwzOiJhcnJheSIsNDoib2JqZWN0Iiw1OiJib29sZWFuIiw2OiJleHByZXNzaW9uIiw3OiJudWxsIiw4OiJBcnJheTxudW1iZXI+Iiw5OiJBcnJheTxzdHJpbmc+In0sZz0iRU9GIixtPSJVbnF1b3RlZElkZW50aWZpZXIiLHY9IlF1b3RlZElkZW50aWZpZXIiLHk9IlJicmFja2V0IixFPSJScGFyZW4iLFM9IkNvbW1hIixiPSJDb2xvbiIsQz0iUmJyYWNlIixUPSJOdW1iZXIiLEk9IkN1cnJlbnQiLEE9IkV4cHJlZiIsXz0iUGlwZSIsdz0iT3IiLFI9IkFuZCIsaz0iRVEiLEw9IkdUIixOPSJMVCIsTz0iR1RFIixEPSJMVEUiLFA9Ik5FIix4PSJGbGF0dGVuIixNPSJTdGFyIixVPSJGaWx0ZXIiLEY9IkRvdCIscT0iTm90IixCPSJMYnJhY2UiLGo9IkxicmFja2V0IixWPSJMcGFyZW4iLFc9IkxpdGVyYWwiLEc9eyIuIjpGLCIqIjpNLCIsIjpTLCI6IjpiLCJ7IjpCLCJ9IjpDLCJdIjp5LCIoIjpWLCIpIjpFLCJAIjpJfSxIPXsiPCI6ITAsIj4iOiEwLCI9IjohMCwiISI6ITB9LHo9eyIgIjohMCwiXHQiOiEwLCJcbiI6ITB9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIGU+PSIwIiYmZTw9IjkifHwiLSI9PT1lfWZ1bmN0aW9uIFgoKXt9WC5wcm90b3R5cGU9e3Rva2VuaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGk9W107Zm9yKHRoaXMuX2N1cnJlbnQ9MDt0aGlzLl9jdXJyZW50PGUubGVuZ3RoOylpZigobz1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZvPD0ieiJ8fG8+PSJBIiYmbzw9IloifHwiXyI9PT1vKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOm0sdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZih2b2lkIDAhPT1HW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh7dHlwZTpHW2VbdGhpcy5fY3VycmVudF1dLHZhbHVlOmVbdGhpcy5fY3VycmVudF0sc3RhcnQ6dGhpcy5fY3VycmVudH0pLHRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKEsoZVt0aGlzLl9jdXJyZW50XSkpcj10aGlzLl9jb25zdW1lTnVtYmVyKGUpLGkucHVzaChyKTtlbHNlIGlmKCJbIj09PWVbdGhpcy5fY3VycmVudF0pcj10aGlzLl9jb25zdW1lTEJyYWNrZXQoZSksaS5wdXNoKHIpO2Vsc2UgaWYoJyInPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6dix2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCInIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVJhd1N0cmluZ0xpdGVyYWwoZSksaS5wdXNoKHt0eXBlOlcsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiYCI9PT1lW3RoaXMuX2N1cnJlbnRdKXt0PXRoaXMuX2N1cnJlbnQ7dmFyIHM9dGhpcy5fY29uc3VtZUxpdGVyYWwoZSk7aS5wdXNoKHt0eXBlOlcsdmFsdWU6cyxzdGFydDp0fSl9ZWxzZSBpZih2b2lkIDAhPT1IW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh0aGlzLl9jb25zdW1lT3BlcmF0b3IoZSkpO2Vsc2UgaWYodm9pZCAwIT09eltlW3RoaXMuX2N1cnJlbnRdXSl0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZigiJiI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssIiYiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTpSLHZhbHVlOiImJiIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6QSx2YWx1ZToiJiIsc3RhcnQ6dH0pO2Vsc2V7aWYoInwiIT09ZVt0aGlzLl9jdXJyZW50XSl7dmFyIGE9bmV3IEVycm9yKCJVbmtub3duIGNoYXJhY3RlcjoiK2VbdGhpcy5fY3VycmVudF0pO3Rocm93IGEubmFtZT0iTGV4ZXJFcnJvciIsYX10PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCJ8Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6dyx2YWx1ZToifHwiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOl8sdmFsdWU6InwiLHN0YXJ0OnR9KX1yZXR1cm4gaX0sX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9jdXJyZW50O2Zvcih0aGlzLl9jdXJyZW50Kys7dGhpcy5fY3VycmVudDxlLmxlbmd0aCYmKCh0PWVbdGhpcy5fY3VycmVudF0pPj0iYSImJnQ8PSJ6Inx8dD49IkEiJiZ0PD0iWiJ8fHQ+PSIwIiYmdDw9IjkifHwiXyI9PT10KTspdGhpcy5fY3VycmVudCsrO3JldHVybiBlLnNsaWNlKG4sdGhpcy5fY3VycmVudCl9LF9jb25zdW1lUXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7JyInIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmJyInIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLEpTT04ucGFyc2UoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKX0sX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsiJyIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYiJyIhPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssZS5zbGljZSh0KzEsdGhpcy5fY3VycmVudC0xKS5yZXBsYWNlKCJcXCciLCInIil9LF9jb25zdW1lTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDtLKGVbdGhpcy5fY3VycmVudF0pJiZ0aGlzLl9jdXJyZW50PG47KXRoaXMuX2N1cnJlbnQrKzt2YXIgcj1wYXJzZUludChlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpO3JldHVybnt0eXBlOlQsdmFsdWU6cixzdGFydDp0fX0sX2NvbnN1bWVMQnJhY2tldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3JldHVybiB0aGlzLl9jdXJyZW50KyssIj8iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlUsdmFsdWU6Ils/IixzdGFydDp0fSk6Il0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOngsdmFsdWU6IltdIixzdGFydDp0fSk6e3R5cGU6aix2YWx1ZToiWyIsc3RhcnQ6dH19LF9jb25zdW1lT3BlcmF0b3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudCxuPWVbdF07cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiISI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpQLHZhbHVlOiIhPSIsc3RhcnQ6dH0pOnt0eXBlOnEsdmFsdWU6IiEiLHN0YXJ0OnR9OiI8Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOkQsdmFsdWU6Ijw9IixzdGFydDp0fSk6e3R5cGU6Tix2YWx1ZToiPCIsc3RhcnQ6dH06Ij4iPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6Tyx2YWx1ZToiPj0iLHN0YXJ0OnR9KTp7dHlwZTpMLHZhbHVlOiI+IixzdGFydDp0fToiPSI9PT1uJiYiPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6ayx2YWx1ZToiPT0iLHN0YXJ0OnR9KTp2b2lkIDB9LF9jb25zdW1lTGl0ZXJhbDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciB0LG49dGhpcy5fY3VycmVudCxyPWUubGVuZ3RoOyJgIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8cjspe3ZhciBvPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbb118fCJcXCIhPT1lW28rMV0mJiJgIiE9PWVbbysxXT9vKys6bys9Mix0aGlzLl9jdXJyZW50PW99dmFyIHM9aShlLnNsaWNlKG4sdGhpcy5fY3VycmVudCkpO3JldHVybiBzPXMucmVwbGFjZSgiXFxgIiwiYCIpLHQ9dGhpcy5fbG9va3NMaWtlSlNPTihzKT9KU09OLnBhcnNlKHMpOkpTT04ucGFyc2UoJyInK3MrJyInKSx0aGlzLl9jdXJyZW50KyssdH0sX2xvb2tzTGlrZUpTT046ZnVuY3Rpb24oZSl7aWYoIiI9PT1lKXJldHVybiExO2lmKCdbeyInLmluZGV4T2YoZVswXSk+PTApcmV0dXJuITA7aWYoWyJ0cnVlIiwiZmFsc2UiLCJudWxsIl0uaW5kZXhPZihlKT49MClyZXR1cm4hMDtpZighKCItMDEyMzQ1Njc4OSIuaW5kZXhPZihlWzBdKT49MCkpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX19O3ZhciBZPXt9O2Z1bmN0aW9uICQoKXt9ZnVuY3Rpb24gSihlKXt0aGlzLnJ1bnRpbWU9ZX1mdW5jdGlvbiBRKGUpe3RoaXMuX2ludGVycHJldGVyPWUsdGhpcy5mdW5jdGlvblRhYmxlPXthYnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQWJzLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sYXZnOntfZnVuYzp0aGlzLl9mdW5jdGlvbkF2Zyxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LGNlaWw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ2VpbCxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGNvbnRhaW5zOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNvbnRhaW5zLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX0se3R5cGVzOlthXX1dfSxlbmRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRW5kc1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxmbG9vcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25GbG9vcixfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGxlbmd0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25MZW5ndGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHUsbF19XX0sbWFwOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1hcCxfc2lnbmF0dXJlOlt7dHlwZXM6W3BdfSx7dHlwZXM6W3VdfV19LG1heDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXgsX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1lcmdlOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1lcmdlLF9zaWduYXR1cmU6W3t0eXBlczpbbF0sdmFyaWFkaWM6ITB9XX0sbWF4X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sc3VtOntfZnVuYzp0aGlzLl9mdW5jdGlvblN1bSxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LHN0YXJ0c193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvblN0YXJ0c1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxtaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluLF9zaWduYXR1cmU6W3t0eXBlczpbZCxoXX1dfSxtaW5fYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluQnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSx0eXBlOntfZnVuYzp0aGlzLl9mdW5jdGlvblR5cGUsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSxrZXlzOntfZnVuYzp0aGlzLl9mdW5jdGlvbktleXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSx2YWx1ZXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVmFsdWVzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sc29ydDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0LF9zaWduYXR1cmU6W3t0eXBlczpbaCxkXX1dfSxzb3J0X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnRCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LGpvaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uSm9pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2hdfV19LHJldmVyc2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uUmV2ZXJzZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19XX0sdG9fYXJyYXk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9BcnJheSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX3N0cmluZzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub1N0cmluZyxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX251bWJlcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub051bWJlcixfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LG5vdF9udWxsOntfZnVuYzp0aGlzLl9mdW5jdGlvbk5vdE51bGwsX3NpZ25hdHVyZTpbe3R5cGVzOlthXSx2YXJpYWRpYzohMH1dfX19WVtnXT0wLFlbbV09MCxZW3ZdPTAsWVt5XT0wLFlbRV09MCxZW1NdPTAsWVtDXT0wLFlbVF09MCxZW0ldPTAsWVtBXT0wLFlbX109MSxZW3ddPTIsWVtSXT0zLFlba109NSxZW0xdPTUsWVtOXT01LFlbT109NSxZW0RdPTUsWVtQXT01LFlbeF09OSxZW01dPTIwLFlbVV09MjEsWVtGXT00MCxZW3FdPTQ1LFlbQl09NTAsWVtqXT01NSxZW1ZdPTYwLCQucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlKXt0aGlzLl9sb2FkVG9rZW5zKGUpLHRoaXMuaW5kZXg9MDt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Zyl7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZTogIituLnR5cGUrIiwgdmFsdWU6ICIrbi52YWx1ZSk7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn1yZXR1cm4gdH0sX2xvYWRUb2tlbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBYKS50b2tlbml6ZShlKTt0LnB1c2goe3R5cGU6Zyx2YWx1ZToiIixzdGFydDplLmxlbmd0aH0pLHRoaXMudG9rZW5zPXR9LGV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7dGhpcy5fYWR2YW5jZSgpO2Zvcih2YXIgbj10aGlzLm51ZCh0KSxyPXRoaXMuX2xvb2thaGVhZCgwKTtlPFlbcl07KXRoaXMuX2FkdmFuY2UoKSxuPXRoaXMubGVkKHIsbikscj10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuIG59LF9sb29rYWhlYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV0udHlwZX0sX2xvb2thaGVhZFRva2VuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdfSxfYWR2YW5jZTpmdW5jdGlvbigpe3RoaXMuaW5kZXgrK30sbnVkOmZ1bmN0aW9uKGUpe3ZhciB0LG47c3dpdGNoKGUudHlwZSl7Y2FzZSBXOnJldHVybnt0eXBlOiJMaXRlcmFsIix2YWx1ZTplLnZhbHVlfTtjYXNlIG06cmV0dXJue3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2Nhc2Ugdjp2YXIgcj17dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07aWYodGhpcy5fbG9va2FoZWFkKDApPT09Vil0aHJvdyBuZXcgRXJyb3IoIlF1b3RlZCBpZGVudGlmaWVyIG5vdCBhbGxvd2VkIGZvciBmdW5jdGlvbiBuYW1lcy4iKTtyZXR1cm4gcjtjYXNlIHE6cmV0dXJue3R5cGU6Ik5vdEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0PXRoaXMuZXhwcmVzc2lvbihZLk5vdCldfTtjYXNlIE06cmV0dXJuIHQ9bnVsbCx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9sb29rYWhlYWQoMCk9PT15P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX07Y2FzZSBVOnJldHVybiB0aGlzLmxlZChlLnR5cGUse3R5cGU6IklkZW50aXR5In0pO2Nhc2UgQjpyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifV19LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmxhdHRlbildfTtjYXNlIGo6cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKT09PVR8fHRoaXMuX2xvb2thaGVhZCgwKT09PWI/KHQ9dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh7dHlwZToiSWRlbnRpdHkifSx0KSk6dGhpcy5fbG9va2FoZWFkKDApPT09TSYmdGhpcy5fbG9va2FoZWFkKDEpPT09eT8odGhpcy5fYWR2YW5jZSgpLHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk6dGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKTtjYXNlIEk6cmV0dXJue3R5cGU6SX07Y2FzZSBBOnJldHVybnt0eXBlOiJFeHByZXNzaW9uUmVmZXJlbmNlIixjaGlsZHJlbjpbbj10aGlzLmV4cHJlc3Npb24oWS5FeHByZWYpXX07Y2FzZSBWOmZvcih2YXIgbz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhuPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bj10aGlzLmV4cHJlc3Npb24oMCksby5wdXNoKG4pO3JldHVybiB0aGlzLl9tYXRjaChFKSxvWzBdO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbihlKX19LGxlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3N3aXRjaChlKXtjYXNlIEY6dmFyIHI9WS5Eb3Q7cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKSE9PU0/e3R5cGU6IlN1YmV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VEb3RSSFMocildfToodGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKHIpXX0pO2Nhc2UgXzpyZXR1cm4gbj10aGlzLmV4cHJlc3Npb24oWS5QaXBlKSx7dHlwZTpfLGNoaWxkcmVuOlt0LG5dfTtjYXNlIHc6cmV0dXJue3R5cGU6Ik9yRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5PcildfTtjYXNlIFI6cmV0dXJue3R5cGU6IkFuZEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFkuQW5kKV19O2Nhc2UgVjpmb3IodmFyIG8saT10Lm5hbWUscz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhvPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bz10aGlzLmV4cHJlc3Npb24oMCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmdGhpcy5fbWF0Y2goUykscy5wdXNoKG8pO3JldHVybiB0aGlzLl9tYXRjaChFKSx7dHlwZToiRnVuY3Rpb24iLG5hbWU6aSxjaGlsZHJlbjpzfTtjYXNlIFU6dmFyIGE9dGhpcy5leHByZXNzaW9uKDApO3JldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiRmlsdGVyUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9sb29rYWhlYWQoMCk9PT14P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZpbHRlciksYV19O2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3RdfSx0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgazpjYXNlIFA6Y2FzZSBMOmNhc2UgTzpjYXNlIE46Y2FzZSBEOnJldHVybiB0aGlzLl9wYXJzZUNvbXBhcmF0b3IodCxlKTtjYXNlIGo6dmFyIGM9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7cmV0dXJuIGMudHlwZT09PVR8fGMudHlwZT09PWI/KG49dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh0LG4pKToodGhpcy5fbWF0Y2goTSksdGhpcy5fbWF0Y2goeSkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk7ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKHRoaXMuX2xvb2thaGVhZFRva2VuKDApKX19LF9tYXRjaDpmdW5jdGlvbihlKXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1lKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxuPW5ldyBFcnJvcigiRXhwZWN0ZWQgIitlKyIsIGdvdDogIit0LnR5cGUpO3Rocm93IG4ubmFtZT0iUGFyc2VyRXJyb3IiLG59dGhpcy5fYWR2YW5jZSgpfSxfZXJyb3JUb2tlbjpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoIkludmFsaWQgdG9rZW4gKCIrZS50eXBlKycpOiAiJytlLnZhbHVlKyciJyk7dGhyb3cgdC5uYW1lPSJQYXJzZXJFcnJvciIsdH0sX3BhcnNlSW5kZXhFeHByZXNzaW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbG9va2FoZWFkKDApPT09Ynx8dGhpcy5fbG9va2FoZWFkKDEpPT09YilyZXR1cm4gdGhpcy5fcGFyc2VTbGljZUV4cHJlc3Npb24oKTt2YXIgZT17dHlwZToiSW5kZXgiLHZhbHVlOnRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlfTtyZXR1cm4gdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKHkpLGV9LF9wcm9qZWN0SWZTbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPXt0eXBlOiJJbmRleEV4cHJlc3Npb24iLGNoaWxkcmVuOltlLHRdfTtyZXR1cm4iU2xpY2UiPT09dC50eXBlP3t0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbbix0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19Om59LF9wYXJzZVNsaWNlRXhwcmVzc2lvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bbnVsbCxudWxsLG51bGxdLHQ9MCxuPXRoaXMuX2xvb2thaGVhZCgwKTtuIT09eSYmdDwzOyl7aWYobj09PWIpdCsrLHRoaXMuX2FkdmFuY2UoKTtlbHNle2lmKG4hPT1UKXt2YXIgcj10aGlzLl9sb29rYWhlYWQoMCksbz1uZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIityLnZhbHVlKyIoIityLnR5cGUrIikiKTt0aHJvdyBvLm5hbWU9IlBhcnNlcmVycm9yIixvfWVbdF09dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWUsdGhpcy5fYWR2YW5jZSgpfW49dGhpcy5fbG9va2FoZWFkKDApfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiU2xpY2UiLGNoaWxkcmVuOmV9fSxfcGFyc2VDb21wYXJhdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IkNvbXBhcmF0b3IiLG5hbWU6dCxjaGlsZHJlbjpbZSx0aGlzLmV4cHJlc3Npb24oWVt0XSldfX0sX3BhcnNlRG90UkhTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm5bbSx2LE1dLmluZGV4T2YodCk+PTA/dGhpcy5leHByZXNzaW9uKGUpOnQ9PT1qPyh0aGlzLl9tYXRjaChqKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpKTp0PT09Qj8odGhpcy5fbWF0Y2goQiksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKSk6dm9pZCAwfSxfcGFyc2VQcm9qZWN0aW9uUkhTOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKFlbdGhpcy5fbG9va2FoZWFkKDApXTwxMCl0PXt0eXBlOiJJZGVudGl0eSJ9O2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09ail0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PVUpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1GKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiU3l0YW54IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK24udmFsdWUrIigiK24udHlwZSsiKSIpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9dGhpcy5fbWF0Y2goRiksdD10aGlzLl9wYXJzZURvdFJIUyhlKX1yZXR1cm4gdH0sX3BhcnNlTXVsdGlzZWxlY3RMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PXk7KXt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYoZS5wdXNoKHQpLHRoaXMuX2xvb2thaGVhZCgwKT09PVMmJih0aGlzLl9tYXRjaChTKSx0aGlzLl9sb29rYWhlYWQoMCk9PT15KSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gUmJyYWNrZXQiKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6Ik11bHRpU2VsZWN0TGlzdCIsY2hpbGRyZW46ZX19LF9wYXJzZU11bHRpc2VsZWN0SGFzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj1bXSxvPVttLHZdOzspe2lmKGU9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksby5pbmRleE9mKGUudHlwZSk8MCl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBhbiBpZGVudGlmaWVyIHRva2VuLCBnb3Q6ICIrZS50eXBlKTtpZih0PWUudmFsdWUsdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKGIpLG49e3R5cGU6IktleVZhbHVlUGFpciIsbmFtZTp0LHZhbHVlOnRoaXMuZXhwcmVzc2lvbigwKX0sci5wdXNoKG4pLHRoaXMuX2xvb2thaGVhZCgwKT09PVMpdGhpcy5fbWF0Y2goUyk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1DKXt0aGlzLl9tYXRjaChDKTticmVha319cmV0dXJue3R5cGU6Ik11bHRpU2VsZWN0SGFzaCIsY2hpbGRyZW46cn19fSxKLnByb3RvdHlwZT17c2VhcmNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudmlzaXQoZSx0KX0sdmlzaXQ6ZnVuY3Rpb24oZSxpKXt2YXIgcyxhLGMsdSxsLHAsZCxoLGY7c3dpdGNoKGUudHlwZSl7Y2FzZSJGaWVsZCI6cmV0dXJuIG51bGwhPT1pJiZuKGkpP3ZvaWQgMD09PShwPWlbZS5uYW1lXSk/bnVsbDpwOm51bGw7Y2FzZSJTdWJleHByZXNzaW9uIjpmb3IoYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksZj0xO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWlmKG51bGw9PT0oYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYykpKXJldHVybiBudWxsO3JldHVybiBjO2Nhc2UiSW5kZXhFeHByZXNzaW9uIjpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UiSW5kZXgiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBnPWUudmFsdWU7cmV0dXJuIGc8MCYmKGc9aS5sZW5ndGgrZyksdm9pZCAwPT09KGM9aVtnXSkmJihjPW51bGwpLGM7Y2FzZSJTbGljZSI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIG09ZS5jaGlsZHJlbi5zbGljZSgwKSx2PXRoaXMuY29tcHV0ZVNsaWNlUGFyYW1zKGkubGVuZ3RoLG0pLHk9dlswXSxFPXZbMV0sUz12WzJdO2lmKGM9W10sUz4wKWZvcihmPXk7ZjxFO2YrPVMpYy5wdXNoKGlbZl0pO2Vsc2UgZm9yKGY9eTtmPkU7Zis9UyljLnB1c2goaVtmXSk7cmV0dXJuIGM7Y2FzZSJQcm9qZWN0aW9uIjp2YXIgYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoYikpcmV0dXJuIG51bGw7Zm9yKGg9W10sZj0wO2Y8Yi5sZW5ndGg7ZisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYltmXSkpJiZoLnB1c2goYSk7cmV0dXJuIGg7Y2FzZSJWYWx1ZVByb2plY3Rpb24iOmlmKCFuKGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDtoPVtdO3ZhciBDPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2goZVt0W3JdXSk7cmV0dXJuIG59KGIpO2ZvcihmPTA7ZjxDLmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxDW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIkZpbHRlclByb2plY3Rpb24iOmlmKCF0KGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDt2YXIgVD1bXSx3PVtdO2ZvcihmPTA7ZjxiLmxlbmd0aDtmKyspbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsyXSxiW2ZdKSl8fFQucHVzaChiW2ZdKTtmb3IodmFyIFI9MDtSPFQubGVuZ3RoO1IrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLFRbUl0pKSYmdy5wdXNoKGEpO3JldHVybiB3O2Nhc2UiQ29tcGFyYXRvciI6c3dpdGNoKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGw9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpLGUubmFtZSl7Y2FzZSBrOmM9cih1LGwpO2JyZWFrO2Nhc2UgUDpjPSFyKHUsbCk7YnJlYWs7Y2FzZSBMOmM9dT5sO2JyZWFrO2Nhc2UgTzpjPXU+PWw7YnJlYWs7Y2FzZSBOOmM9dTxsO2JyZWFrO2Nhc2UgRDpjPXU8PWw7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29tcGFyYXRvcjogIitlLm5hbWUpfXJldHVybiBjO2Nhc2UgeDp2YXIgTT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoTSkpcmV0dXJuIG51bGw7dmFyIFU9W107Zm9yKGY9MDtmPE0ubGVuZ3RoO2YrKyl0KGE9TVtmXSk/VS5wdXNoLmFwcGx5KFUsYSk6VS5wdXNoKGEpO3JldHVybiBVO2Nhc2UiSWRlbnRpdHkiOnJldHVybiBpO2Nhc2UiTXVsdGlTZWxlY3RMaXN0IjppZihudWxsPT09aSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaC5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIGg7Y2FzZSJNdWx0aVNlbGVjdEhhc2giOmlmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBGO2ZvcihoPXt9LGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloWyhGPWUuY2hpbGRyZW5bZl0pLm5hbWVdPXRoaXMudmlzaXQoRi52YWx1ZSxpKTtyZXR1cm4gaDtjYXNlIk9yRXhwcmVzc2lvbiI6cmV0dXJuIG8ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpJiYocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSkpLHM7Y2FzZSJBbmRFeHByZXNzaW9uIjpyZXR1cm4hMD09PW8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpP3U6dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpO2Nhc2UiTm90RXhwcmVzc2lvbiI6cmV0dXJuIG8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpO2Nhc2UiTGl0ZXJhbCI6cmV0dXJuIGUudmFsdWU7Y2FzZSBfOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSBJOnJldHVybiBpO2Nhc2UiRnVuY3Rpb24iOnZhciBxPVtdO2ZvcihmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspcS5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIHRoaXMucnVudGltZS5jYWxsRnVuY3Rpb24oZS5uYW1lLHEpO2Nhc2UiRXhwcmVzc2lvblJlZmVyZW5jZSI6dmFyIEI9ZS5jaGlsZHJlblswXTtyZXR1cm4gQi5qbWVzcGF0aFR5cGU9QSxCO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIitlLnR5cGUpfX0sY29tcHV0ZVNsaWNlUGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0sbz10WzJdLGk9W251bGwsbnVsbCxudWxsXTtpZihudWxsPT09bylvPTE7ZWxzZSBpZigwPT09byl7dmFyIHM9bmV3IEVycm9yKCJJbnZhbGlkIHNsaWNlLCBzdGVwIGNhbm5vdCBiZSAwIik7dGhyb3cgcy5uYW1lPSJSdW50aW1lRXJyb3IiLHN9dmFyIGE9bzwwO3JldHVybiBuPW51bGw9PT1uP2E/ZS0xOjA6dGhpcy5jYXBTbGljZVJhbmdlKGUsbixvKSxyPW51bGw9PT1yP2E/LTE6ZTp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxyLG8pLGlbMF09bixpWzFdPXIsaVsyXT1vLGl9LGNhcFNsaWNlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PDA/KHQrPWUpPDAmJih0PW48MD8tMTowKTp0Pj1lJiYodD1uPDA/ZS0xOmUpLHR9fSxRLnByb3RvdHlwZT17Y2FsbEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mdW5jdGlvblRhYmxlW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZ1bmN0aW9uOiAiK2UrIigpIik7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlQXJncyhlLHQsbi5fc2lnbmF0dXJlKSxuLl9mdW5jLmNhbGwodGhpcyx0KX0sX3ZhbGlkYXRlQXJnczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLHM7aWYobltuLmxlbmd0aC0xXS52YXJpYWRpYyl7aWYodC5sZW5ndGg8bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyBhdCBsZWFzdCIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKX1lbHNlIGlmKHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyAiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3M9ITEsbz1uW2FdLnR5cGVzLGk9dGhpcy5fZ2V0VHlwZU5hbWUodFthXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspaWYodGhpcy5fdHlwZU1hdGNoZXMoaSxvW2NdLHRbYV0pKXtzPSEwO2JyZWFrfWlmKCFzKXt2YXIgdT1vLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGZbZV19KSkuam9pbigiLCIpO3Rocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiAiK2UrIigpIGV4cGVjdGVkIGFyZ3VtZW50ICIrKGErMSkrIiB0byBiZSB0eXBlICIrdSsiIGJ1dCByZWNlaXZlZCB0eXBlICIrZltpXSsiIGluc3RlYWQuIil9fX0sX3R5cGVNYXRjaGVzOmZ1bmN0aW9uKGUsdCxuKXtpZih0PT09YSlyZXR1cm4hMDtpZih0IT09aCYmdCE9PWQmJnQhPT11KXJldHVybiBlPT09dDtpZih0PT09dSlyZXR1cm4gZT09PXU7aWYoZT09PXUpe3ZhciByO3Q9PT1kP3I9czp0PT09aCYmKHI9Yyk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYoIXRoaXMuX3R5cGVNYXRjaGVzKHRoaXMuX2dldFR5cGVOYW1lKG5bb10pLHIsbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fSxfZ2V0VHlwZU5hbWU6ZnVuY3Rpb24oZSl7c3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBjO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gcztjYXNlIltvYmplY3QgQXJyYXldIjpyZXR1cm4gdTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybiA1O2Nhc2UiW29iamVjdCBOdWxsXSI6cmV0dXJuIDc7Y2FzZSJbb2JqZWN0IE9iamVjdF0iOnJldHVybiBlLmptZXNwYXRoVHlwZT09PUE/cDpsfX0sX2Z1bmN0aW9uU3RhcnRzV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWVbMF0ubGFzdEluZGV4T2YoZVsxXSl9LF9mdW5jdGlvbkVuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO3JldHVybi0xIT09dC5pbmRleE9mKG4sdC5sZW5ndGgtbi5sZW5ndGgpfSxfZnVuY3Rpb25SZXZlcnNlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yyl7Zm9yKHZhciB0PWVbMF0sbj0iIixyPXQubGVuZ3RoLTE7cj49MDtyLS0pbis9dFtyXTtyZXR1cm4gbn12YXIgbz1lWzBdLnNsaWNlKDApO3JldHVybiBvLnJldmVyc2UoKSxvfSxfZnVuY3Rpb25BYnM6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGVbMF0pfSxfZnVuY3Rpb25DZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZVswXSl9LF9mdW5jdGlvbkF2ZzpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHQvbi5sZW5ndGh9LF9mdW5jdGlvbkNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLmluZGV4T2YoZVsxXSk+PTB9LF9mdW5jdGlvbkZsb29yOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGVbMF0pfSxfZnVuY3Rpb25MZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZVswXSk/T2JqZWN0LmtleXMoZVswXSkubGVuZ3RoOmVbMF0ubGVuZ3RofSxfZnVuY3Rpb25NYXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzBdLG89ZVsxXSxpPTA7aTxvLmxlbmd0aDtpKyspdC5wdXNoKG4udmlzaXQocixvW2ldKSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1lcmdlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Zm9yKHZhciBvIGluIHIpdFtvXT1yW29dfXJldHVybiB0fSxfZnVuY3Rpb25NYXg6ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspbi5sb2NhbGVDb21wYXJlKHRbcl0pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25NaW46ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspdFtyXS5sb2NhbGVDb21wYXJlKG4pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25TdW06ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0fSxfZnVuY3Rpb25UeXBlOmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl9nZXRUeXBlTmFtZShlWzBdKSl7Y2FzZSBzOnJldHVybiJudW1iZXIiO2Nhc2UgYzpyZXR1cm4ic3RyaW5nIjtjYXNlIHU6cmV0dXJuImFycmF5IjtjYXNlIGw6cmV0dXJuIm9iamVjdCI7Y2FzZSA1OnJldHVybiJib29sZWFuIjtjYXNlIHA6cmV0dXJuImV4cHJlZiI7Y2FzZSA3OnJldHVybiJudWxsIn19LF9mdW5jdGlvbktleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGVbMF0pfSxfZnVuY3Rpb25WYWx1ZXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj1PYmplY3Qua2V5cyh0KSxyPVtdLG89MDtvPG4ubGVuZ3RoO28rKylyLnB1c2godFtuW29dXSk7cmV0dXJuIHJ9LF9mdW5jdGlvbkpvaW46ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtyZXR1cm4gZVsxXS5qb2luKHQpfSxfZnVuY3Rpb25Ub0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PXU/ZVswXTpbZVswXV19LF9mdW5jdGlvblRvU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWM/ZVswXTpKU09OLnN0cmluZ2lmeShlWzBdKX0sX2Z1bmN0aW9uVG9OdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9nZXRUeXBlTmFtZShlWzBdKTtyZXR1cm4gbj09PXM/ZVswXTpuIT09Y3x8KHQ9K2VbMF0saXNOYU4odCkpP251bGw6dH0sX2Z1bmN0aW9uTm90TnVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZig3IT09dGhpcy5fZ2V0VHlwZU5hbWUoZVt0XSkpcmV0dXJuIGVbdF07cmV0dXJuIG51bGx9LF9mdW5jdGlvblNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtyZXR1cm4gdC5zb3J0KCksdH0sX2Z1bmN0aW9uU29ydEJ5OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB0O3ZhciBuPXRoaXMuX2ludGVycHJldGVyLHI9ZVsxXSxvPXRoaXMuX2dldFR5cGVOYW1lKG4udmlzaXQocix0WzBdKSk7aWYoW3MsY10uaW5kZXhPZihvKTwwKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yIik7Zm9yKHZhciBpPXRoaXMsYT1bXSx1PTA7dTx0Lmxlbmd0aDt1KyspYS5wdXNoKFt1LHRbdV1dKTthLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIHM9bi52aXNpdChyLGVbMV0pLGE9bi52aXNpdChyLHRbMV0pO2lmKGkuX2dldFR5cGVOYW1lKHMpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUocykpO2lmKGkuX2dldFR5cGVOYW1lKGEpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUoYSkpO3JldHVybiBzPmE/MTpzPGE/LTE6ZVswXS10WzBdfSkpO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7bCsrKXRbbF09YVtsXVsxXTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWF4Qnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0tMS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKT5hJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1pbkJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW3MsY10pLGE9MS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKTxhJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LGNyZWF0ZUtleUZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPXRoaXMuX2ludGVycHJldGVyO3JldHVybiBmdW5jdGlvbihvKXt2YXIgaT1yLnZpc2l0KGUsbyk7aWYodC5pbmRleE9mKG4uX2dldFR5cGVOYW1lKGkpKTwwKXt2YXIgcz0iVHlwZUVycm9yOiBleHBlY3RlZCBvbmUgb2YgIit0KyIsIHJlY2VpdmVkICIrbi5fZ2V0VHlwZU5hbWUoaSk7dGhyb3cgbmV3IEVycm9yKHMpfXJldHVybiBpfX19LGUudG9rZW5pemU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBYKS50b2tlbml6ZShlKX0sZS5jb21waWxlPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgJCkucGFyc2UoZSl9LGUuc2VhcmNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3ICQscj1uZXcgUSxvPW5ldyBKKHIpO3IuX2ludGVycHJldGVyPW87dmFyIGk9bi5wYXJzZSh0KTtyZXR1cm4gby5zZWFyY2goaSxlKX0sZS5zdHJpY3REZWVwRXF1YWw9cn0odm9pZCAwPT09bj90aGlzLmptZXNwYXRoPXt9Om4pfSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9dC5leHBvcnRzPXt9O2Z1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBjKGUpe2lmKHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHI9PT1zfHwhcikmJnNldFRpbWVvdXQpcmV0dXJuIHI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19IWZ1bmN0aW9uKCl7dHJ5e3I9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpzfWNhdGNoKGUpe3I9c310cnl7bz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDphfWNhdGNoKGUpe289YX19KCk7dmFyIHUsbD1bXSxwPSExLGQ9LTE7ZnVuY3Rpb24gaCgpe3AmJnUmJihwPSExLHUubGVuZ3RoP2w9dS5jb25jYXQobCk6ZD0tMSxsLmxlbmd0aCYmZigpKX1mdW5jdGlvbiBmKCl7aWYoIXApe3ZhciBlPWMoaCk7cD0hMDtmb3IodmFyIHQ9bC5sZW5ndGg7dDspe2Zvcih1PWwsbD1bXTsrK2Q8dDspdSYmdVtkXS5ydW4oKTtkPS0xLHQ9bC5sZW5ndGh9dT1udWxsLHA9ITEsZnVuY3Rpb24oZSl7aWYobz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChvPT09YXx8IW8pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG89Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIG8oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gby5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGcoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiBtKCl7fWkubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsLnB1c2gobmV3IGcoZSx0KSksMSE9PWwubGVuZ3RofHxwfHxjKGYpfSxnLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxpLnRpdGxlPSJicm93c2VyIixpLmJyb3dzZXI9ITAsaS5lbnY9e30saS5hcmd2PVtdLGkudmVyc2lvbj0iIixpLnZlcnNpb25zPXt9LGkub249bSxpLmFkZExpc3RlbmVyPW0saS5vbmNlPW0saS5vZmY9bSxpLnJlbW92ZUxpc3RlbmVyPW0saS5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxpLmVtaXQ9bSxpLnByZXBlbmRMaXN0ZW5lcj1tLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLGkubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxpLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0saS5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sOTI6W2Z1bmN0aW9uKGUsdCxvKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGkpeyJvYmplY3QiPT10eXBlb2YgbyYmbyYmby5ub2RlVHlwZSwib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQubm9kZVR5cGU7dmFyIHM9Im9iamVjdCI9PXR5cGVvZiBlJiZlO3MuZ2xvYmFsIT09cyYmcy53aW5kb3chPT1zJiZzLnNlbGY7dmFyIGEsYz0yMTQ3NDgzNjQ3LHU9MzYsbD0xLHA9MjYsZD0zOCxoPTcwMCxmPTcyLGc9MTI4LG09Ii0iLHY9L154bi0tLyx5PS9bXlx4MjAtXHg3RV0vLEU9L1tceDJFXHUzMDAyXHVGRjBFXHVGRjYxXS9nLFM9e292ZXJmbG93OiJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcyIsIm5vdC1iYXNpYyI6IklsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCkiLCJpbnZhbGlkLWlucHV0IjoiSW52YWxpZCBpbnB1dCJ9LGI9dS1sLEM9TWF0aC5mbG9vcixUPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gSShlKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihTW2VdKX1mdW5jdGlvbiBBKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9W107bi0tOylyW25dPXQoZVtuXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gXyhlLHQpe3ZhciBuPWUuc3BsaXQoIkAiKSxyPSIiO3JldHVybiBuLmxlbmd0aD4xJiYocj1uWzBdKyJAIixlPW5bMV0pLHIrQSgoZT1lLnJlcGxhY2UoRSwiLiIpKS5zcGxpdCgiLiIpLHQpLmpvaW4oIi4iKX1mdW5jdGlvbiB3KGUpe2Zvcih2YXIgdCxuLHI9W10sbz0wLGk9ZS5sZW5ndGg7bzxpOykodD1lLmNoYXJDb2RlQXQobysrKSk+PTU1Mjk2JiZ0PD01NjMxOSYmbzxpPzU2MzIwPT0oNjQ1MTImKG49ZS5jaGFyQ29kZUF0KG8rKykpKT9yLnB1c2goKCgxMDIzJnQpPDwxMCkrKDEwMjMmbikrNjU1MzYpOihyLnB1c2godCksby0tKTpyLnB1c2godCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUihlKXtyZXR1cm4gQShlLChmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZT42NTUzNSYmKHQrPVQoKGUtPTY1NTM2KT4+PjEwJjEwMjN8NTUyOTYpLGU9NTYzMjB8MTAyMyZlKSx0Kz1UKGUpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gZSsyMis3NSooZTwyNiktKCgwIT10KTw8NSl9ZnVuY3Rpb24gTChlLHQsbil7dmFyIHI9MDtmb3IoZT1uP0MoZS9oKTplPj4xLGUrPUMoZS90KTtlPmIqcD4+MTtyKz11KWU9QyhlL2IpO3JldHVybiBDKHIrKGIrMSkqZS8oZStkKSl9ZnVuY3Rpb24gTihlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEU9W10sUz1lLmxlbmd0aCxiPTAsVD1nLEE9Zjtmb3IoKG49ZS5sYXN0SW5kZXhPZihtKSk8MCYmKG49MCkscj0wO3I8bjsrK3IpZS5jaGFyQ29kZUF0KHIpPj0xMjgmJkkoIm5vdC1iYXNpYyIpLEUucHVzaChlLmNoYXJDb2RlQXQocikpO2ZvcihvPW4+MD9uKzE6MDtvPFM7KXtmb3IoaT1iLHM9MSxhPXU7bz49UyYmSSgiaW52YWxpZC1pbnB1dCIpLCgoZD0oeT1lLmNoYXJDb2RlQXQobysrKSktNDg8MTA/eS0yMjp5LTY1PDI2P3ktNjU6eS05NzwyNj95LTk3OnUpPj11fHxkPkMoKGMtYikvcykpJiZJKCJvdmVyZmxvdyIpLGIrPWQqcywhKGQ8KGg9YTw9QT9sOmE+PUErcD9wOmEtQSkpO2ErPXUpcz5DKGMvKHY9dS1oKSkmJkkoIm92ZXJmbG93Iikscyo9djtBPUwoYi1pLHQ9RS5sZW5ndGgrMSwwPT1pKSxDKGIvdCk+Yy1UJiZJKCJvdmVyZmxvdyIpLFQrPUMoYi90KSxiJT10LEUuc3BsaWNlKGIrKywwLFQpfXJldHVybiBSKEUpfWZ1bmN0aW9uIE8oZSl7dmFyIHQsbixyLG8saSxzLGEsZCxoLHYseSxFLFMsYixBLF89W107Zm9yKEU9KGU9dyhlKSkubGVuZ3RoLHQ9ZyxuPTAsaT1mLHM9MDtzPEU7KytzKSh5PWVbc10pPDEyOCYmXy5wdXNoKFQoeSkpO2ZvcihyPW89Xy5sZW5ndGgsbyYmXy5wdXNoKG0pO3I8RTspe2ZvcihhPWMscz0wO3M8RTsrK3MpKHk9ZVtzXSk+PXQmJnk8YSYmKGE9eSk7Zm9yKGEtdD5DKChjLW4pLyhTPXIrMSkpJiZJKCJvdmVyZmxvdyIpLG4rPShhLXQpKlMsdD1hLHM9MDtzPEU7KytzKWlmKCh5PWVbc10pPHQmJisrbj5jJiZJKCJvdmVyZmxvdyIpLHk9PXQpe2ZvcihkPW4saD11OyEoZDwodj1oPD1pP2w6aD49aStwP3A6aC1pKSk7aCs9dSlBPWQtdixiPXUtdixfLnB1c2goVChrKHYrQSViLDApKSksZD1DKEEvYik7Xy5wdXNoKFQoayhkLDApKSksaT1MKG4sUyxyPT1vKSxuPTAsKytyfSsrbiwrK3R9cmV0dXJuIF8uam9pbigiIil9YT17dmVyc2lvbjoiMS40LjEiLHVjczI6e2RlY29kZTp3LGVuY29kZTpSfSxkZWNvZGU6TixlbmNvZGU6Tyx0b0FTQ0lJOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB5LnRlc3QoZSk/InhuLS0iK08oZSk6ZX0pKX0sdG9Vbmljb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB2LnRlc3QoZSk/TihlLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpOmV9KSl9fSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBhfS5jYWxsKG8sbixvLHQpKXx8KHQuZXhwb3J0cz1yKX0oKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIHM9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIHM7dmFyIGE9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBjPTFlMztpJiYibnVtYmVyIj09dHlwZW9mIGkubWF4S2V5cyYmKGM9aS5tYXhLZXlzKTt2YXIgdT1lLmxlbmd0aDtjPjAmJnU+YyYmKHU9Yyk7Zm9yKHZhciBsPTA7bDx1OysrbCl7dmFyIHAsZCxoLGYsZz1lW2xdLnJlcGxhY2UoYSwiJTIwIiksbT1nLmluZGV4T2Yobik7bT49MD8ocD1nLnN1YnN0cigwLG0pLGQ9Zy5zdWJzdHIobSsxKSk6KHA9ZyxkPSIiKSxoPWRlY29kZVVSSUNvbXBvbmVudChwKSxmPWRlY29kZVVSSUNvbXBvbmVudChkKSxyKHMsaCk/byhzW2hdKT9zW2hdLnB1c2goZik6c1toXT1bc1toXSxmXTpzW2hdPWZ9cmV0dXJuIHN9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9fSx7fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP2kocyhlKSwoZnVuY3Rpb24ocyl7dmFyIGE9ZW5jb2RlVVJJQ29tcG9uZW50KHIocykpK247cmV0dXJuIG8oZVtzXSk/aShlW3NdLChmdW5jdGlvbihlKXtyZXR1cm4gYStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTphK2VuY29kZVVSSUNvbXBvbmVudChyKGVbc10pKX0pKS5qb2luKHQpOmE/ZW5jb2RlVVJJQ29tcG9uZW50KHIoYSkpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtmdW5jdGlvbiBpKGUsdCl7aWYoZS5tYXApcmV0dXJuIGUubWFwKHQpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspbi5wdXNoKHQoZVtyXSxyKSk7cmV0dXJuIG59dmFyIHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LnB1c2gobik7cmV0dXJuIHR9fSx7fV0sOTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kZWNvZGU9bi5wYXJzZT1lKCIuL2RlY29kZSIpLG4uZW5jb2RlPW4uc3RyaW5naWZ5PWUoIi4vZW5jb2RlIil9LHsiLi9kZWNvZGUiOjkzLCIuL2VuY29kZSI6OTR9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgaT17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gaTt2YXIgcz0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGE9MWUzO28mJiJudW1iZXIiPT10eXBlb2Ygby5tYXhLZXlzJiYoYT1vLm1heEtleXMpO3ZhciBjPWUubGVuZ3RoO2E+MCYmYz5hJiYoYz1hKTtmb3IodmFyIHU9MDt1PGM7Kyt1KXt2YXIgbCxwLGQsaCxmPWVbdV0ucmVwbGFjZShzLCIlMjAiKSxnPWYuaW5kZXhPZihuKTtnPj0wPyhsPWYuc3Vic3RyKDAsZykscD1mLnN1YnN0cihnKzEpKToobD1mLHA9IiIpLGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGwpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLHIoaSxkKT9BcnJheS5pc0FycmF5KGlbZF0pP2lbZF0ucHVzaChoKTppW2RdPVtpW2RdLGhdOmlbZF09aH1yZXR1cm4gaX19LHt9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkubWFwKChmdW5jdGlvbihvKXt2YXIgaT1lbmNvZGVVUklDb21wb25lbnQocihvKSkrbjtyZXR1cm4gQXJyYXkuaXNBcnJheShlW29dKT9lW29dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpfSkpLmpvaW4odCk6aStlbmNvZGVVUklDb21wb25lbnQocihlW29dKSl9KSkuam9pbih0KTpvP2VuY29kZVVSSUNvbXBvbmVudChyKG8pKStuK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKToiIn19LHt9XSw5ODpbZnVuY3Rpb24oZSx0LG4pe2FyZ3VtZW50c1s0XVs5NV1bMF0uYXBwbHkobixhcmd1bWVudHMpfSx7Ii4vZGVjb2RlIjo5NiwiLi9lbmNvZGUiOjk3LGR1cDo5NX1dLDk5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQscil7KGZ1bmN0aW9uKCl7dmFyIG89ZSgicHJvY2Vzcy9icm93c2VyLmpzIikubmV4dFRpY2ssaT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkscz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT17fSxjPTA7ZnVuY3Rpb24gdShlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fW4uc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0VGltZW91dCx3aW5kb3csYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxuLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRJbnRlcnZhbCx3aW5kb3csYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sbi5jbGVhclRpbWVvdXQ9bi5jbGVhckludGVydmFsPWZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0sdS5wcm90b3R5cGUudW5yZWY9dS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSx1LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csdGhpcy5faWQpfSxuLmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSxuLnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sbi5fdW5yZWZBY3RpdmU9bi5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fb25UaW1lb3V0JiZlLl9vblRpbWVvdXQoKX0pLHQpKX0sbi5zZXRJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbihlKXt2YXIgdD1jKysscj0hKGFyZ3VtZW50cy5sZW5ndGg8MikmJnMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGFbdF09ITAsbygoZnVuY3Rpb24oKXthW3RdJiYocj9lLmFwcGx5KG51bGwscik6ZS5jYWxsKG51bGwpLG4uY2xlYXJJbW1lZGlhdGUodCkpfSkpLHR9LG4uY2xlYXJJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpmdW5jdGlvbihlKXtkZWxldGUgYVtlXX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSxlKCJ0aW1lcnMiKS5jbGVhckltbWVkaWF0ZSl9LHsicHJvY2Vzcy9icm93c2VyLmpzIjo5MSx0aW1lcnM6OTl9XSwxMDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJwdW55Y29kZSIpO2Z1bmN0aW9uIG8oKXt0aGlzLnByb3RvY29sPW51bGwsdGhpcy5zbGFzaGVzPW51bGwsdGhpcy5hdXRoPW51bGwsdGhpcy5ob3N0PW51bGwsdGhpcy5wb3J0PW51bGwsdGhpcy5ob3N0bmFtZT1udWxsLHRoaXMuaGFzaD1udWxsLHRoaXMuc2VhcmNoPW51bGwsdGhpcy5xdWVyeT1udWxsLHRoaXMucGF0aG5hbWU9bnVsbCx0aGlzLnBhdGg9bnVsbCx0aGlzLmhyZWY9bnVsbH1uLnBhcnNlPXYsbi5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYoZSwhMSwhMCkucmVzb2x2ZSh0KX0sbi5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/dihlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHQpOnR9LG4uZm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB5KGUpJiYoZT12KGUpKSxlIGluc3RhbmNlb2Ygbz9lLmZvcm1hdCgpOm8ucHJvdG90eXBlLmZvcm1hdC5jYWxsKGUpfSxuLlVybD1vO3ZhciBpPS9eKFthLXowLTkuKy1dKzopL2kscz0vOlswLTldKiQvLGE9WyJ7IiwifSIsInwiLCJcXCIsIl4iLCJgIl0uY29uY2F0KFsiPCIsIj4iLCciJywiYCIsIiAiLCJcciIsIlxuIiwiXHQiXSksYz1bIiciXS5jb25jYXQoYSksdT1bIiUiLCIvIiwiPyIsIjsiLCIjIl0uY29uY2F0KGMpLGw9WyIvIiwiPyIsIiMiXSxwPS9eW2EtejAtOUEtWl8tXXswLDYzfSQvLGQ9L14oW2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8saD17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxmPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGc9e2h0dHA6ITAsaHR0cHM6ITAsZnRwOiEwLGdvcGhlcjohMCxmaWxlOiEwLCJodHRwOiI6ITAsImh0dHBzOiI6ITAsImZ0cDoiOiEwLCJnb3BoZXI6IjohMCwiZmlsZToiOiEwfSxtPWUoInF1ZXJ5c3RyaW5nIik7ZnVuY3Rpb24gdihlLHQsbil7aWYoZSYmRShlKSYmZSBpbnN0YW5jZW9mIG8pcmV0dXJuIGU7dmFyIHI9bmV3IG87cmV0dXJuIHIucGFyc2UoZSx0LG4pLHJ9ZnVuY3Rpb24geShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9ZnVuY3Rpb24gRShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIG51bGw9PT1lfW8ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxuKXtpZigheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90ICIrdHlwZW9mIGUpO3ZhciBvPWU7bz1vLnRyaW0oKTt2YXIgcz1pLmV4ZWMobyk7aWYocyl7dmFyIGE9KHM9c1swXSkudG9Mb3dlckNhc2UoKTt0aGlzLnByb3RvY29sPWEsbz1vLnN1YnN0cihzLmxlbmd0aCl9aWYobnx8c3x8by5tYXRjaCgvXlwvXC9bXkBcL10rQFteQFwvXSsvKSl7dmFyIHY9Ii8vIj09PW8uc3Vic3RyKDAsMik7IXZ8fHMmJmZbc118fChvPW8uc3Vic3RyKDIpLHRoaXMuc2xhc2hlcz0hMCl9aWYoIWZbc10mJih2fHxzJiYhZ1tzXSkpe2Zvcih2YXIgRSxTLGI9LTEsQz0wO0M8bC5sZW5ndGg7QysrKS0xIT09KFQ9by5pbmRleE9mKGxbQ10pKSYmKC0xPT09Ynx8VDxiKSYmKGI9VCk7Zm9yKC0xIT09KFM9LTE9PT1iP28ubGFzdEluZGV4T2YoIkAiKTpvLmxhc3RJbmRleE9mKCJAIixiKSkmJihFPW8uc2xpY2UoMCxTKSxvPW8uc2xpY2UoUysxKSx0aGlzLmF1dGg9ZGVjb2RlVVJJQ29tcG9uZW50KEUpKSxiPS0xLEM9MDtDPHUubGVuZ3RoO0MrKyl7dmFyIFQ7LTEhPT0oVD1vLmluZGV4T2YodVtDXSkpJiYoLTE9PT1ifHxUPGIpJiYoYj1UKX0tMT09PWImJihiPW8ubGVuZ3RoKSx0aGlzLmhvc3Q9by5zbGljZSgwLGIpLG89by5zbGljZShiKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIEk9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighSSlmb3IodmFyIEE9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxfPShDPTAsQS5sZW5ndGgpO0M8XztDKyspe3ZhciB3PUFbQ107aWYodyYmIXcubWF0Y2gocCkpe2Zvcih2YXIgUj0iIixrPTAsTD13Lmxlbmd0aDtrPEw7aysrKXcuY2hhckNvZGVBdChrKT4xMjc/Uis9IngiOlIrPXdba107aWYoIVIubWF0Y2gocCkpe3ZhciBOPUEuc2xpY2UoMCxDKSxPPUEuc2xpY2UoQysxKSxEPXcubWF0Y2goZCk7RCYmKE4ucHVzaChEWzFdKSxPLnVuc2hpZnQoRFsyXSkpLE8ubGVuZ3RoJiYobz0iLyIrTy5qb2luKCIuIikrbyksdGhpcy5ob3N0bmFtZT1OLmpvaW4oIi4iKTticmVha319fWlmKHRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLCFJKXt2YXIgUD10aGlzLmhvc3RuYW1lLnNwbGl0KCIuIikseD1bXTtmb3IoQz0wO0M8UC5sZW5ndGg7KytDKXt2YXIgTT1QW0NdO3gucHVzaChNLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pPyJ4bi0tIityLmVuY29kZShNKTpNKX10aGlzLmhvc3RuYW1lPXguam9pbigiLiIpfXZhciBVPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLEY9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PUYrVSx0aGlzLmhyZWYrPXRoaXMuaG9zdCxJJiYodGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnN1YnN0cigxLHRoaXMuaG9zdG5hbWUubGVuZ3RoLTIpLCIvIiE9PW9bMF0mJihvPSIvIitvKSl9aWYoIWhbYV0pZm9yKEM9MCxfPWMubGVuZ3RoO0M8XztDKyspe3ZhciBxPWNbQ10sQj1lbmNvZGVVUklDb21wb25lbnQocSk7Qj09PXEmJihCPWVzY2FwZShxKSksbz1vLnNwbGl0KHEpLmpvaW4oQil9dmFyIGo9by5pbmRleE9mKCIjIik7LTEhPT1qJiYodGhpcy5oYXNoPW8uc3Vic3RyKGopLG89by5zbGljZSgwLGopKTt2YXIgVj1vLmluZGV4T2YoIj8iKTtyZXR1cm4tMSE9PVY/KHRoaXMuc2VhcmNoPW8uc3Vic3RyKFYpLHRoaXMucXVlcnk9by5zdWJzdHIoVisxKSx0JiYodGhpcy5xdWVyeT1tLnBhcnNlKHRoaXMucXVlcnkpKSxvPW8uc2xpY2UoMCxWKSk6dCYmKHRoaXMuc2VhcmNoPSIiLHRoaXMucXVlcnk9e30pLG8mJih0aGlzLnBhdGhuYW1lPW8pLGdbYV0mJnRoaXMuaG9zdG5hbWUmJiF0aGlzLnBhdGhuYW1lJiYodGhpcy5wYXRobmFtZT0iLyIpLCh0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCkmJihVPXRoaXMucGF0aG5hbWV8fCIiLE09dGhpcy5zZWFyY2h8fCIiLHRoaXMucGF0aD1VK00pLHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LG8ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsbz0hMSxpPSIiO3RoaXMuaG9zdD9vPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihvPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKG8rPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZFKHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPW0uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgcz10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxnW3RdKSYmITEhPT1vPyhvPSIvLyIrKG98fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTpvfHwobz0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxzJiYiPyIhPT1zLmNoYXJBdCgwKSYmKHM9Ij8iK3MpLHQrbysobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKHM9cy5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LG8ucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh2KGUsITEsITApKS5mb3JtYXQoKX0sby5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZih5KGUpKXt2YXIgdD1uZXcgbzt0LnBhcnNlKGUsITEsITApLGU9dH12YXIgbj1uZXcgbztpZihPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2VdPXRoaXNbZV19KSx0aGlzKSxuLmhhc2g9ZS5oYXNoLCIiPT09ZS5ocmVmKXJldHVybiBuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUuc2xhc2hlcyYmIWUucHJvdG9jb2wpcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJwcm90b2NvbCIhPT10JiYoblt0XT1lW3RdKX0pKSxnW24ucHJvdG9jb2xdJiZuLmhvc3RuYW1lJiYhbi5wYXRobmFtZSYmKG4ucGF0aD1uLnBhdGhuYW1lPSIvIiksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnByb3RvY29sJiZlLnByb3RvY29sIT09bi5wcm90b2NvbCl7aWYoIWdbZS5wcm90b2NvbF0pcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKG4ucHJvdG9jb2w9ZS5wcm90b2NvbCxlLmhvc3R8fGZbZS5wcm90b2NvbF0pbi5wYXRobmFtZT1lLnBhdGhuYW1lO2Vsc2V7Zm9yKHZhciByPShlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyLmxlbmd0aCYmIShlLmhvc3Q9ci5zaGlmdCgpKTspO2UuaG9zdHx8KGUuaG9zdD0iIiksZS5ob3N0bmFtZXx8KGUuaG9zdG5hbWU9IiIpLCIiIT09clswXSYmci51bnNoaWZ0KCIiKSxyLmxlbmd0aDwyJiZyLnVuc2hpZnQoIiIpLG4ucGF0aG5hbWU9ci5qb2luKCIvIil9aWYobi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LG4uaG9zdD1lLmhvc3R8fCIiLG4uYXV0aD1lLmF1dGgsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHxlLmhvc3Qsbi5wb3J0PWUucG9ydCxuLnBhdGhuYW1lfHxuLnNlYXJjaCl7dmFyIGk9bi5wYXRobmFtZXx8IiIscz1uLnNlYXJjaHx8IiI7bi5wYXRoPWkrc31yZXR1cm4gbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59dmFyIGE9bi5wYXRobmFtZSYmIi8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCksYz1lLmhvc3R8fGUucGF0aG5hbWUmJiIvIj09PWUucGF0aG5hbWUuY2hhckF0KDApLHU9Y3x8YXx8bi5ob3N0JiZlLnBhdGhuYW1lLGw9dSxwPW4ucGF0aG5hbWUmJm4ucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sZD0ocj1lLnBhdGhuYW1lJiZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLG4ucHJvdG9jb2wmJiFnW24ucHJvdG9jb2xdKTtpZihkJiYobi5ob3N0bmFtZT0iIixuLnBvcnQ9bnVsbCxuLmhvc3QmJigiIj09PXBbMF0/cFswXT1uLmhvc3Q6cC51bnNoaWZ0KG4uaG9zdCkpLG4uaG9zdD0iIixlLnByb3RvY29sJiYoZS5ob3N0bmFtZT1udWxsLGUucG9ydD1udWxsLGUuaG9zdCYmKCIiPT09clswXT9yWzBdPWUuaG9zdDpyLnVuc2hpZnQoZS5ob3N0KSksZS5ob3N0PW51bGwpLHU9dSYmKCIiPT09clswXXx8IiI9PT1wWzBdKSksYyluLmhvc3Q9ZS5ob3N0fHwiIj09PWUuaG9zdD9lLmhvc3Q6bi5ob3N0LG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8IiI9PT1lLmhvc3RuYW1lP2UuaG9zdG5hbWU6bi5ob3N0bmFtZSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnkscD1yO2Vsc2UgaWYoci5sZW5ndGgpcHx8KHA9W10pLHAucG9wKCkscD1wLmNvbmNhdChyKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnk7ZWxzZSBpZihudWxsIT1lLnNlYXJjaClyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PXAuc2hpZnQoKSwoYj0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1iLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9Yi5zaGlmdCgpKSksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoIXAubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgaD1wLnNsaWNlKC0xKVswXSxtPShuLmhvc3R8fGUuaG9zdCkmJigiLiI9PT1ofHwiLi4iPT09aCl8fCIiPT09aCx2PTAsRT1wLmxlbmd0aDtFPj0wO0UtLSkiLiI9PShoPXBbRV0pP3Auc3BsaWNlKEUsMSk6Ii4uIj09PWg/KHAuc3BsaWNlKEUsMSksdisrKTp2JiYocC5zcGxpY2UoRSwxKSx2LS0pO2lmKCF1JiYhbClmb3IoO3YtLTt2KXAudW5zaGlmdCgiLi4iKTshdXx8IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKXx8cC51bnNoaWZ0KCIiKSxtJiYiLyIhPT1wLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZwLnB1c2goIiIpO3ZhciBiLEM9IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKTtyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PUM/IiI6cC5sZW5ndGg/cC5zaGlmdCgpOiIiLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSwodT11fHxuLmhvc3QmJnAubGVuZ3RoKSYmIUMmJnAudW5zaGlmdCgiIikscC5sZW5ndGg/bi5wYXRobmFtZT1wLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmF1dGg9ZS5hdXRofHxuLmF1dGgsbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59LG8ucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXMuZXhlYyhlKTt0JiYoIjoiIT09KHQ9dFswXSkmJih0aGlzLnBvcnQ9dC5zdWJzdHIoMSkpLGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGUmJih0aGlzLmhvc3RuYW1lPWUpfX0se3B1bnljb2RlOjkyLHF1ZXJ5c3RyaW5nOjk1fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO2Zvcih2YXIgcj1bXSxvPTA7bzwyNTY7KytvKXJbb109KG8rMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpO3ZhciBpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8MCxvPXI7cmV0dXJuW29bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV1dLmpvaW4oIiIpfTtuLmRlZmF1bHQ9aX0se31dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYxIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pO3ZhciByPWEoZSgiLi92MS5qcyIpKSxvPWEoZSgiLi92My5qcyIpKSxpPWEoZSgiLi92NC5qcyIpKSxzPWEoZSgiLi92NS5qcyIpKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX19LHsiLi92MS5qcyI6MTA2LCIuL3YzLmpzIjoxMDcsIi4vdjQuanMiOjEwOSwiLi92NS5qcyI6MTEwfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG8oZSx0LG4sbyxpLHMpe3JldHVybiByKChhPXIocih0LGUpLHIobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxuKTt2YXIgYSxjfWZ1bmN0aW9uIGkoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZufH50JnIsZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHQmcnxuJn5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Xm5ecixlLHQsaSxzLGEpfWZ1bmN0aW9uIGMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8obl4odHx+ciksZSx0LGkscyxhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgdT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWVbbl09dC5jaGFyQ29kZUF0KG4pfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bXSxpPTMyKmUubGVuZ3RoLHM9IjAxMjM0NTY3ODlhYmNkZWYiO2Zvcih0PTA7dDxpO3QrPTgpbj1lW3Q+PjVdPj4+dCUzMiYyNTUscj1wYXJzZUludChzLmNoYXJBdChuPj4+NCYxNSkrcy5jaGFyQXQoMTUmbiksMTYpLG8ucHVzaChyKTtyZXR1cm4gb30oZnVuY3Rpb24oZSx0KXt2YXIgbixvLHUsbCxwO2VbdD4+NV18PTEyODw8dCUzMixlWzE0Kyh0KzY0Pj4+OTw8NCldPXQ7dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3Iobj0wO248ZS5sZW5ndGg7bis9MTYpbz1kLHU9aCxsPWYscD1nLGQ9aShkLGgsZixnLGVbbl0sNywtNjgwODc2OTM2KSxnPWkoZyxkLGgsZixlW24rMV0sMTIsLTM4OTU2NDU4NiksZj1pKGYsZyxkLGgsZVtuKzJdLDE3LDYwNjEwNTgxOSksaD1pKGgsZixnLGQsZVtuKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPWkoZCxoLGYsZyxlW24rNF0sNywtMTc2NDE4ODk3KSxnPWkoZyxkLGgsZixlW24rNV0sMTIsMTIwMDA4MDQyNiksZj1pKGYsZyxkLGgsZVtuKzZdLDE3LC0xNDczMjMxMzQxKSxoPWkoaCxmLGcsZCxlW24rN10sMjIsLTQ1NzA1OTgzKSxkPWkoZCxoLGYsZyxlW24rOF0sNywxNzcwMDM1NDE2KSxnPWkoZyxkLGgsZixlW24rOV0sMTIsLTE5NTg0MTQ0MTcpLGY9aShmLGcsZCxoLGVbbisxMF0sMTcsLTQyMDYzKSxoPWkoaCxmLGcsZCxlW24rMTFdLDIyLC0xOTkwNDA0MTYyKSxkPWkoZCxoLGYsZyxlW24rMTJdLDcsMTgwNDYwMzY4MiksZz1pKGcsZCxoLGYsZVtuKzEzXSwxMiwtNDAzNDExMDEpLGY9aShmLGcsZCxoLGVbbisxNF0sMTcsLTE1MDIwMDIyOTApLGQ9cyhkLGg9aShoLGYsZyxkLGVbbisxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbbisxXSw1LC0xNjU3OTY1MTApLGc9cyhnLGQsaCxmLGVbbis2XSw5LC0xMDY5NTAxNjMyKSxmPXMoZixnLGQsaCxlW24rMTFdLDE0LDY0MzcxNzcxMyksaD1zKGgsZixnLGQsZVtuXSwyMCwtMzczODk3MzAyKSxkPXMoZCxoLGYsZyxlW24rNV0sNSwtNzAxNTU4NjkxKSxnPXMoZyxkLGgsZixlW24rMTBdLDksMzgwMTYwODMpLGY9cyhmLGcsZCxoLGVbbisxNV0sMTQsLTY2MDQ3ODMzNSksaD1zKGgsZixnLGQsZVtuKzRdLDIwLC00MDU1Mzc4NDgpLGQ9cyhkLGgsZixnLGVbbis5XSw1LDU2ODQ0NjQzOCksZz1zKGcsZCxoLGYsZVtuKzE0XSw5LC0xMDE5ODAzNjkwKSxmPXMoZixnLGQsaCxlW24rM10sMTQsLTE4NzM2Mzk2MSksaD1zKGgsZixnLGQsZVtuKzhdLDIwLDExNjM1MzE1MDEpLGQ9cyhkLGgsZixnLGVbbisxM10sNSwtMTQ0NDY4MTQ2NyksZz1zKGcsZCxoLGYsZVtuKzJdLDksLTUxNDAzNzg0KSxmPXMoZixnLGQsaCxlW24rN10sMTQsMTczNTMyODQ3MyksZD1hKGQsaD1zKGgsZixnLGQsZVtuKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbbis1XSw0LC0zNzg1NTgpLGc9YShnLGQsaCxmLGVbbis4XSwxMSwtMjAyMjU3NDQ2MyksZj1hKGYsZyxkLGgsZVtuKzExXSwxNiwxODM5MDMwNTYyKSxoPWEoaCxmLGcsZCxlW24rMTRdLDIzLC0zNTMwOTU1NiksZD1hKGQsaCxmLGcsZVtuKzFdLDQsLTE1MzA5OTIwNjApLGc9YShnLGQsaCxmLGVbbis0XSwxMSwxMjcyODkzMzUzKSxmPWEoZixnLGQsaCxlW24rN10sMTYsLTE1NTQ5NzYzMiksaD1hKGgsZixnLGQsZVtuKzEwXSwyMywtMTA5NDczMDY0MCksZD1hKGQsaCxmLGcsZVtuKzEzXSw0LDY4MTI3OTE3NCksZz1hKGcsZCxoLGYsZVtuXSwxMSwtMzU4NTM3MjIyKSxmPWEoZixnLGQsaCxlW24rM10sMTYsLTcyMjUyMTk3OSksaD1hKGgsZixnLGQsZVtuKzZdLDIzLDc2MDI5MTg5KSxkPWEoZCxoLGYsZyxlW24rOV0sNCwtNjQwMzY0NDg3KSxnPWEoZyxkLGgsZixlW24rMTJdLDExLC00MjE4MTU4MzUpLGY9YShmLGcsZCxoLGVbbisxNV0sMTYsNTMwNzQyNTIwKSxkPWMoZCxoPWEoaCxmLGcsZCxlW24rMl0sMjMsLTk5NTMzODY1MSksZixnLGVbbl0sNiwtMTk4NjMwODQ0KSxnPWMoZyxkLGgsZixlW24rN10sMTAsMTEyNjg5MTQxNSksZj1jKGYsZyxkLGgsZVtuKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1jKGgsZixnLGQsZVtuKzVdLDIxLC01NzQzNDA1NSksZD1jKGQsaCxmLGcsZVtuKzEyXSw2LDE3MDA0ODU1NzEpLGc9YyhnLGQsaCxmLGVbbiszXSwxMCwtMTg5NDk4NjYwNiksZj1jKGYsZyxkLGgsZVtuKzEwXSwxNSwtMTA1MTUyMyksaD1jKGgsZixnLGQsZVtuKzFdLDIxLC0yMDU0OTIyNzk5KSxkPWMoZCxoLGYsZyxlW24rOF0sNiwxODczMzEzMzU5KSxnPWMoZyxkLGgsZixlW24rMTVdLDEwLC0zMDYxMTc0NCksZj1jKGYsZyxkLGgsZVtuKzZdLDE1LC0xNTYwMTk4MzgwKSxoPWMoaCxmLGcsZCxlW24rMTNdLDIxLDEzMDkxNTE2NDkpLGQ9YyhkLGgsZixnLGVbbis0XSw2LC0xNDU1MjMwNzApLGc9YyhnLGQsaCxmLGVbbisxMV0sMTAsLTExMjAyMTAzNzkpLGY9YyhmLGcsZCxoLGVbbisyXSwxNSw3MTg3ODcyNTkpLGg9YyhoLGYsZyxkLGVbbis5XSwyMSwtMzQzNDg1NTUxKSxkPXIoZCxvKSxoPXIoaCx1KSxmPXIoZixsKSxnPXIoZyxwKTtyZXR1cm5bZCxoLGYsZ119KGZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZVt0LzhdKTw8dCUzMjtyZXR1cm4gbn0oZSksOCplLmxlbmd0aCkpfTtuLmRlZmF1bHQ9dX0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiByKG8pfTt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fCJ1bmRlZmluZWQiIT10eXBlb2YgbXNDcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMmJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSxvPW5ldyBVaW50OEFycmF5KDE2KX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIHQmbl5+dCZyO2Nhc2UgMTpjYXNlIDM6cmV0dXJuIHRebl5yO2Nhc2UgMjpyZXR1cm4gdCZuXnQmcl5uJnJ9fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml0sbj1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIGk9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspZVtzXT1pLmNoYXJDb2RlQXQocyl9ZS5wdXNoKDEyOCk7dmFyIGE9ZS5sZW5ndGgvNCsyLGM9TWF0aC5jZWlsKGEvMTYpLHU9bmV3IEFycmF5KGMpO2ZvcihzPTA7czxjO3MrKyl7dVtzXT1uZXcgQXJyYXkoMTYpO2Zvcih2YXIgbD0wO2w8MTY7bCsrKXVbc11bbF09ZVs2NCpzKzQqbF08PDI0fGVbNjQqcys0KmwrMV08PDE2fGVbNjQqcys0KmwrMl08PDh8ZVs2NCpzKzQqbCszXX1mb3IodVtjLTFdWzE0XT04KihlLmxlbmd0aC0xKS9NYXRoLnBvdygyLDMyKSx1W2MtMV1bMTRdPU1hdGguZmxvb3IodVtjLTFdWzE0XSksdVtjLTFdWzE1XT04KihlLmxlbmd0aC0xKSY0Mjk0OTY3Mjk1LHM9MDtzPGM7cysrKXtmb3IodmFyIHA9bmV3IEFycmF5KDgwKSxkPTA7ZDwxNjtkKyspcFtkXT11W3NdW2RdO2ZvcihkPTE2O2Q8ODA7ZCsrKXBbZF09byhwW2QtM11ecFtkLThdXnBbZC0xNF1ecFtkLTE2XSwxKTt2YXIgaD1uWzBdLGY9blsxXSxnPW5bMl0sbT1uWzNdLHY9bls0XTtmb3IoZD0wO2Q8ODA7ZCsrKXt2YXIgeT1NYXRoLmZsb29yKGQvMjApLEU9byhoLDUpK3IoeSxmLGcsbSkrdit0W3ldK3BbZF0+Pj4wO3Y9bSxtPWcsZz1vKGYsMzApPj4+MCxmPWgsaD1FfW5bMF09blswXStoPj4+MCxuWzFdPW5bMV0rZj4+PjAsblsyXT1uWzJdK2c+Pj4wLG5bM109blszXSttPj4+MCxuWzRdPW5bNF0rdj4+PjB9cmV0dXJuW25bMF0+PjI0JjI1NSxuWzBdPj4xNiYyNTUsblswXT4+OCYyNTUsMjU1Jm5bMF0sblsxXT4+MjQmMjU1LG5bMV0+PjE2JjI1NSxuWzFdPj44JjI1NSwyNTUmblsxXSxuWzJdPj4yNCYyNTUsblsyXT4+MTYmMjU1LG5bMl0+PjgmMjU1LDI1NSZuWzJdLG5bM10+PjI0JjI1NSxuWzNdPj4xNiYyNTUsblszXT4+OCYyNTUsMjU1Jm5bM10sbls0XT4+MjQmMjU1LG5bNF0+PjE2JjI1NSxuWzRdPj44JjI1NSwyNTUmbls0XV19O24uZGVmYXVsdD1pfSx7fV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByLG8saT1hKGUoIi4vcm5nLmpzIikpLHM9YShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBjPTAsdT0wLGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPXQmJm58fDAsbD10fHxbXSxwPShlPWV8fHt9KS5ub2RlfHxyLGQ9dm9pZCAwIT09ZS5jbG9ja3NlcT9lLmNsb2Nrc2VxOm87aWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIGg9ZS5yYW5kb218fChlLnJuZ3x8aS5kZWZhdWx0KSgpO251bGw9PXAmJihwPXI9WzF8aFswXSxoWzFdLGhbMl0saFszXSxoWzRdLGhbNV1dKSxudWxsPT1kJiYoZD1vPTE2MzgzJihoWzZdPDw4fGhbN10pKX12YXIgZj12b2lkIDAhPT1lLm1zZWNzP2UubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz12b2lkIDAhPT1lLm5zZWNzP2UubnNlY3M6dSsxLG09Zi1jKyhnLXUpLzFlNDtpZihtPDAmJnZvaWQgMD09PWUuY2xvY2tzZXEmJihkPWQrMSYxNjM4MyksKG08MHx8Zj5jKSYmdm9pZCAwPT09ZS5uc2VjcyYmKGc9MCksZz49MWU0KXRocm93IG5ldyBFcnJvcigidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWMiKTtjPWYsdT1nLG89ZDt2YXIgdj0oMWU0KigyNjg0MzU0NTUmKGYrPTEyMjE5MjkyOGU1KSkrZyklNDI5NDk2NzI5NjtsW2ErK109dj4+PjI0JjI1NSxsW2ErK109dj4+PjE2JjI1NSxsW2ErK109dj4+PjgmMjU1LGxbYSsrXT0yNTUmdjt2YXIgeT1mLzQyOTQ5NjcyOTYqMWU0JjI2ODQzNTQ1NTtsW2ErK109eT4+PjgmMjU1LGxbYSsrXT0yNTUmeSxsW2ErK109eT4+PjI0JjE1fDE2LGxbYSsrXT15Pj4+MTYmMjU1LGxbYSsrXT1kPj4+OHwxMjgsbFthKytdPTI1NSZkO2Zvcih2YXIgRT0wO0U8NjsrK0UpbFthK0VdPXBbRV07cmV0dXJuIHR8fCgwLHMuZGVmYXVsdCkobCl9O24uZGVmYXVsdD1sfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL21kNS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz0oMCxyLmRlZmF1bHQpKCJ2MyIsNDgsby5kZWZhdWx0KTtuLmRlZmF1bHQ9c30seyIuL21kNS5qcyI6MTAzLCIuL3YzNS5qcyI6MTA4fV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUscixpLHMpe3ZhciBhPWkmJnN8fDA7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1mdW5jdGlvbihlKXtlPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fShlKSksInN0cmluZyI9PXR5cGVvZiByJiYocj1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5yZXBsYWNlKC9bYS1mQS1GMC05XXsyfS9nLChmdW5jdGlvbihlKXt0LnB1c2gocGFyc2VJbnQoZSwxNikpfSkpLHR9KHIpKSwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBUeXBlRXJyb3IoInZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2YgYnl0ZXMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8MTYhPT1yLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoIm5hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIik7dmFyIGM9bihyLmNvbmNhdChlKSk7aWYoY1s2XT0xNSZjWzZdfHQsY1s4XT02MyZjWzhdfDEyOCxpKWZvcih2YXIgdT0wO3U8MTY7Kyt1KWlbYSt1XT1jW3VdO3JldHVybiBpfHwoMCxvLmRlZmF1bHQpKGMpfTt0cnl7ci5uYW1lPWV9Y2F0Y2goZSl7fXJldHVybiByLkROUz1pLHIuVVJMPXMscn0sbi5VUkw9bi5ETlM9dm9pZCAwO3ZhciByLG89KHI9ZSgiLi9ieXRlc1RvVXVpZC5qcyIpKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07Y29uc3QgaT0iNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLkROUz1pO2NvbnN0IHM9IjZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCI7bi5VUkw9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDF9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3JuZy5qcyIpKSxvPWkoZSgiLi9ieXRlc1RvVXVpZC5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dCYmbnx8MDsic3RyaW5nIj09dHlwZW9mIGUmJih0PSJiaW5hcnkiPT09ZT9uZXcgQXJyYXkoMTYpOm51bGwsZT1udWxsKTt2YXIgcz0oZT1lfHx7fSkucmFuZG9tfHwoZS5ybmd8fHIuZGVmYXVsdCkoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCx0KWZvcih2YXIgYT0wO2E8MTY7KythKXRbaSthXT1zW2FdO3JldHVybiB0fHwoMCxvLmRlZmF1bHQpKHMpfTtuLmRlZmF1bHQ9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDEsIi4vcm5nLmpzIjoxMDR9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3YzNS5qcyIpKSxvPWkoZSgiLi9zaGExLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInY1Iiw4MCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vc2hhMS5qcyI6MTA1LCIuL3YzNS5qcyI6MTA4fV0sMTExOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1lKCIuL3V0aWxzL0xSVSIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTFlMyksdGhpcy5tYXhTaXplPWUsdGhpcy5jYWNoZT1uZXcgci5MUlVDYWNoZShlKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LG4pe3ZhciByPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LG89dGhpcy5wb3B1bGF0ZVZhbHVlKG4pO3RoaXMuY2FjaGUucHV0KHIsbyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxyPURhdGUubm93KCksbz10aGlzLmNhY2hlLmdldChuKTtpZihvKXtmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSlvW2ldLkV4cGlyZTxyJiZvLnNwbGljZShpLDEpO2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmNhY2hlLnJlbW92ZShuKX1yZXR1cm4gb30sZS5nZXRLZXlTdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49T2JqZWN0LmtleXMoZSkuc29ydCgpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt2b2lkIDAhPT1lW29dJiZ0LnB1c2goZVtvXSl9cmV0dXJuIHQuam9pbigiICIpfSxlLnByb3RvdHlwZS5wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PURhdGUubm93KCk7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm57QWRkcmVzczplLkFkZHJlc3N8fCIiLEV4cGlyZTp0KzYwKihlLkNhY2hlUGVyaW9kSW5NaW51dGVzfHwxKSoxZTN9fSkpfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3RoaXMuY2FjaGUuZW1wdHkoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0O3RoaXMuY2FjaGUucmVtb3ZlKG4pfSxlfSgpO24uRW5kcG9pbnRDYWNoZT1vfSx7Ii4vdXRpbHMvTFJVIjoxMTJ9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKGUsdCl7dGhpcy5rZXk9ZSx0aGlzLnZhbHVlPXR9LG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZU1hcD17fSx0aGlzLnNpemU9MCwibnVtYmVyIiE9dHlwZW9mIGV8fGU8MSl0aHJvdyBuZXcgRXJyb3IoIkNhY2hlIHNpemUgY2FuIG9ubHkgYmUgcG9zaXRpdmUgbnVtYmVyIik7dGhpcy5zaXplTGltaXQ9ZX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnByZXBlbmRUb0xpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPyh0aGlzLmhlYWRlck5vZGUucHJldj1lLGUubmV4dD10aGlzLmhlYWRlck5vZGUpOnRoaXMudGFpbE5vZGU9ZSx0aGlzLmhlYWRlck5vZGU9ZSx0aGlzLnNpemUrK30sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVRhaWw9ZnVuY3Rpb24oKXtpZih0aGlzLnRhaWxOb2RlKXt2YXIgZT10aGlzLnRhaWxOb2RlLHQ9ZS5wcmV2O3JldHVybiB0JiYodC5uZXh0PXZvaWQgMCksZS5wcmV2PXZvaWQgMCx0aGlzLnRhaWxOb2RlPXQsdGhpcy5zaXplLS0sZX19LGUucHJvdG90eXBlLmRldGFjaEZyb21MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT09PWUmJih0aGlzLmhlYWRlck5vZGU9ZS5uZXh0KSx0aGlzLnRhaWxOb2RlPT09ZSYmKHRoaXMudGFpbE5vZGU9ZS5wcmV2KSxlLnByZXYmJihlLnByZXYubmV4dD1lLm5leHQpLGUubmV4dCYmKGUubmV4dC5wcmV2PWUucHJldiksZS5uZXh0PXZvaWQgMCxlLnByZXY9dm9pZCAwLHRoaXMuc2l6ZS0tfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07cmV0dXJuIHRoaXMuZGV0YWNoRnJvbUxpc3QodCksdGhpcy5wcmVwZW5kVG9MaXN0KHQpLHQudmFsdWV9fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07dGhpcy5kZXRhY2hGcm9tTGlzdCh0KSxkZWxldGUgdGhpcy5ub2RlTWFwW2VdfX0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5ub2RlTWFwW2VdKXRoaXMucmVtb3ZlKGUpO2Vsc2UgaWYodGhpcy5zaXplPT09dGhpcy5zaXplTGltaXQpe3ZhciBuPXRoaXMucmVtb3ZlRnJvbVRhaWwoKS5rZXk7ZGVsZXRlIHRoaXMubm9kZU1hcFtuXX12YXIgbz1uZXcgcihlLHQpO3RoaXMubm9kZU1hcFtlXT1vLHRoaXMucHJlcGVuZFRvTGlzdChvKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9T2JqZWN0LmtleXModGhpcy5ub2RlTWFwKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj10aGlzLm5vZGVNYXBbbl07dGhpcy5kZXRhY2hGcm9tTGlzdChyKSxkZWxldGUgdGhpcy5ub2RlTWFwW25dfX0sZX0oKTtuLkxSVUNhY2hlPW99LHt9XSwxMTM6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuL2Jyb3dzZXJfbG9hZGVyIik7dmFyIHI9ZSgiLi9jb3JlIik7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuQVdTPXIpLHZvaWQgMCE9PXQmJih0LmV4cG9ydHM9ciksInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYoc2VsZi5BV1M9ciksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIkNvbm5lY3QiKXx8KHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3Q9e30sci5Db25uZWN0PXIuU2VydmljZS5kZWZpbmVTZXJ2aWNlKCJjb25uZWN0IixbIjIwMTctMDItMTUiXSkpLHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3RbIjIwMTctMDItMTUiXT1lKCIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iKX0seyIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iOjMsIi4vYnJvd3Nlcl9sb2FkZXIiOjE2LCIuL2NvcmUiOjE5fV19LHt9LFsxMTNdKX0sNzU0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5DbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJnZXRBZ2VudFNuYXBzaG90IiwicHV0QWdlbnRTdGF0ZSIsImdldEFnZW50U3RhdGVzIiwiZ2V0RGlhbGFibGVDb3VudHJ5Q29kZXMiLCJnZXRSb3V0aW5nUHJvZmlsZVF1ZXVlcyIsImdldEFnZW50UGVybWlzc2lvbnMiLCJnZXRBZ2VudENvbmZpZ3VyYXRpb24iLCJ1cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24iLCJhY2NlcHRDb250YWN0IiwiY3JlYXRlT3V0Ym91bmRDb250YWN0IiwiY3JlYXRlVGFza0NvbnRhY3QiLCJjbGVhckNvbnRhY3QiLCJjb21wbGV0ZUNvbnRhY3QiLCJkZXN0cm95Q29udGFjdCIsInJlamVjdENvbnRhY3QiLCJub3RpZnlDb250YWN0SXNzdWUiLCJ1cGRhdGVDb250YWN0QXR0cmlidXRlcyIsImNyZWF0ZUFkZGl0aW9uYWxDb25uZWN0aW9uIiwiZGVzdHJveUNvbm5lY3Rpb24iLCJob2xkQ29ubmVjdGlvbiIsInJlc3VtZUNvbm5lY3Rpb24iLCJ0b2dnbGVBY3RpdmVDb25uZWN0aW9ucyIsImNvbmZlcmVuY2VDb25uZWN0aW9ucyIsInNlbmRDbGllbnRMb2dzIiwic2VuZERpZ2l0cyIsInNlbmRTb2Z0cGhvbmVDYWxsUmVwb3J0Iiwic2VuZFNvZnRwaG9uZUNhbGxNZXRyaWNzIiwiZ2V0RW5kcG9pbnRzIiwiZ2V0TmV3QXV0aFRva2VuIiwiY3JlYXRlVHJhbnNwb3J0IiwibXV0ZVBhcnRpY2lwYW50IiwidW5tdXRlUGFydGljaXBhbnQiLCJ1cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSIsInBhdXNlQ29udGFjdCIsInJlc3VtZUNvbnRhY3QiXSksdC5BZ2VudEFwcENsaWVudE1ldGhvZHM9e0dFVF9DT05UQUNUOiJBZ2VudEFwcFNlcnZpY2UuTGNtcy5nZXRDb250YWN0IixERUxFVEVfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVsZXRlU3BlYWtlciIsRU5ST0xMX0JZX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmVucm9sbEJ5U2Vzc2lvbiIsRVZBTFVBVEVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZXZhbHVhdGVTZXNzaW9uIixERVNDUklCRV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNwZWFrZXIiLE9QVF9PVVRfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQub3B0T3V0U3BlYWtlciIsVVBEQVRFX1ZPSUNFX0lEX0RBVEE6IkFnZW50QXBwU2VydmljZS5MY21zLnVwZGF0ZVZvaWNlSWREYXRhIixERVNDUklCRV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNlc3Npb24iLFVQREFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC51cGRhdGVTZXNzaW9uIixTVEFSVF9WT0lDRV9JRF9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuTmFzYS5zdGFydFZvaWNlSWRTZXNzaW9uIixMSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUzoiQWdlbnRBcHBTZXJ2aWNlLkFjcy5saXN0SW50ZWdyYXRpb25Bc3NvY2lhdGlvbnMifSx0Lk1hc3Rlck1ldGhvZHM9dC5tYWtlRW51bShbImJlY29tZU1hc3RlciIsImNoZWNrTWFzdGVyIl0pLHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImxpc3RUYXNrVGVtcGxhdGVzIiwiZ2V0VGFza1RlbXBsYXRlIiwiY3JlYXRlVGVtcGxhdGVkVGFzayIsInVwZGF0ZUNvbnRhY3QiXSksdC5BcGlQcm94eUNsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbInFySW50ZWdyYXRpb25FeGlzdHMiLCJxclNlYXJjaFF1aWNrUmVzcG9uc2VzIl0pLHQuUmV0cnlhYmxlQ2xpZW50TWV0aG9kc0xpc3Q9W3QuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1QsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMsdC5DbGllbnRNZXRob2RzLkdFVF9ESUFMQUJMRV9DT1VOVFJZX0NPREVTLHQuQ2xpZW50TWV0aG9kcy5HRVRfUk9VVElOR19QUk9GSUxFX1FVRVVFU10sdC5SZXRyeWFibGVFcnJvcnM9dC5tYWtlRW51bShbInVuYXV0aG9yaXplZCIsImFjY2Vzc0RlbmllZCJdKSx0LlJldHJ5U3RhdHVzPXQubWFrZUVudW0oWyJyZXRyeWluZyIsImV4aGF1c3RlZCIsIm5vbmUiXSk7dmFyIG49ZnVuY3Rpb24oKXt9O24uRU1QVFlfQ0FMTEJBQ0tTPXtzdWNjZXNzOmZ1bmN0aW9uKCl7fSxmYWlsdXJlOmZ1bmN0aW9uKCl7fX0sbi5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsIm1ldGhvZCIpO3ZhciBpPXJ8fHt9LHM9b3x8bi5FTVBUWV9DQUxMQkFDS1M7dGhpcy5fY2FsbEltcGwoZSxpLHMpfSxuLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXtpZihyJiZyLmZhaWx1cmUpe3ZhciBvPXQuc3ByaW50ZigiTm8gc3VjaCBtZXRob2QgZXhpc3RzIG9uIE5VTEwgY2xpZW50OiAlcyIsZSk7ci5mYWlsdXJlKG5ldyB0LlZhbHVlRXJyb3Iobykse21lc3NhZ2U6b30pfX07dmFyIG89ZnVuY3Rpb24oZSxyLG8pe24uY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZSx0aGlzLnJlcXVlc3RFdmVudD1yLHRoaXMucmVzcG9uc2VFdmVudD1vLHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcD17fSx0aGlzLmNvbmR1aXQub25VcHN0cmVhbShvLHQuaGl0Y2godGhpcyx0aGlzLl9oYW5kbGVSZXNwb25zZSkpfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXF1ZXN0KHRoaXMucmVxdWVzdEV2ZW50LGUsbik7dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW28ucmVxdWVzdElkXT1yO2NvbnN0IGk9W3QuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1MsdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JUXTt0cnl7by5ldmVudCE9PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUfHxpLmluY2x1ZGVzKG8ubWV0aG9kKXx8dC5nZXRMb2coKS50cmFjZShgU2VuZGluZyBBUElfUkVRVUVTVCBldmVudCBmb3IgJHtvLm1ldGhvZH0gdG8gdXBzdHJlYW1gKS53aXRoT2JqZWN0KHttZXRob2Q6by5tZXRob2QscGFyYW1zOm8ucGFyYW1zLHN0YWNrOihuZXcgRXJyb3IpLnN0YWNrfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJTdGFjayB0cmFjZSBMb2cgRmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXRoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0oby5ldmVudCxvKX0sby5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LG8ucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGk9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5BUElfUkVRVUVTVCx0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIHM9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVNQT05TRSx0LmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKSx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e319OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodC5FdmVudFR5cGUuQVBJX1BST1hZX1JFUVVFU1QsZSxuKTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPXIsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BUElfUFJPWFlfUkVRVUVTVCxvKX0scy5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LHMucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGE9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCx0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UpfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWE7dmFyIGM9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJhdXRoQ29va2llTmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJhdXRoVG9rZW4iKSx0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChvKSx0aGlzLmF1dGhUb2tlbj1yLHRoaXMuYXV0aENvb2tpZU5hbWU9ZX07KGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXt9O2lbby5hdXRoQ29va2llTmFtZV09by5hdXRoVG9rZW47dmFyIHM9e21ldGhvZDoicG9zdCIsYm9keTpKU09OLnN0cmluZ2lmeShufHx7fSksaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtQW16LXRhcmdldCI6ZSwiWC1BbXotQmVhcmVyIjpKU09OLnN0cmluZ2lmeShpKX19O3QuZmV0Y2goby5lbmRwb2ludFVybCxzKS50aGVuKChmdW5jdGlvbihlKXtyLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5ib2R5LmdldFJlYWRlcigpO2xldCBuPSIiO2NvbnN0IG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoe2RvbmU6cyx2YWx1ZTphfSl7aWYocyl7dmFyIGM9SlNPTi5wYXJzZShuKTtyZXR1cm4gYy5zdGF0dXM9ZS5zdGF0dXMsdm9pZCByLmZhaWx1cmUoYyl9cmV0dXJuIG4rPW8uZGVjb2RlKGEpLHQucmVhZCgpLnRoZW4oaSl9KSl9KSl9O3ZhciB1PWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiYXV0aFRva2VuIiksdC5hc3NlcnROb3ROdWxsKHIsInJlZ2lvbiIpLG4uY2FsbCh0aGlzKSxBV1MuY29uZmlnLmNyZWRlbnRpYWxzPW5ldyBBV1MuQ3JlZGVudGlhbHMoe30pLEFXUy5jb25maWcucmVnaW9uPXIsdGhpcy5hdXRoVG9rZW49ZTt2YXIgaT10LmdldEJhc2VVcmwoKSxzPW98fChpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT9pKyIvY29ubmVjdC9hcGkiOmkrIi9hcGkiKSxhPW5ldyBBV1MuRW5kcG9pbnQocyk7dGhpcy5jbGllbnQ9bmV3IEFXUy5Db25uZWN0KHtlbmRwb2ludDphfSksdGhpcy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLHRoaXMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MH07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuZ2V0TG9nKCk7aWYodC5jb250YWlucyh0aGlzLmNsaWVudCxlKSluPXRoaXMuX3RyYW5zbGF0ZVBhcmFtcyhlLG4pLCJwYXVzZUNvbnRhY3QiIT09ZSYmInJlc3VtZUNvbnRhY3QiIT09ZXx8ZGVsZXRlIG4uYXV0aGVudGljYXRpb24sbiYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCxpLnRyYWNlKCJBV1NDbGllbnQ6IC0tXHgzZSBDYWxsaW5nIG9wZXJhdGlvbiAnJXMnIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50W2VdKG4pLm9uKCJidWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQmVhcmVyIl09by5hdXRoVG9rZW59KSkuc2VuZCgoZnVuY3Rpb24obixzKXt0cnl7aWYobiluLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTnx8NDAxPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEKTpuLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT058fDQwMz09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQpOihvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHIuZmFpbHVyZShvLl9mb3JtYXRDYWxsRXJyb3Ioby5fYWRkU3RhdHVzQ29kZVRvRXJyb3IobikpLHMpKSxpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBmYWlsZWQ6ICVzIixlLEpTT04uc3RyaW5naWZ5KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7bGV0IHQ9e307aS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgc3VjY2VlZGVkLiIsZSkud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsdGhpcy5odHRwUmVzcG9uc2UmJnRoaXMuaHR0cFJlc3BvbnNlLmhhc093blByb3BlcnR5KCJib2R5IikmJih0LmNvbnRlbnRMZW5ndGg9dGhpcy5odHRwUmVzcG9uc2UuYm9keS5sZW5ndGgpLHIuc3VjY2VzcyhzLHQpfX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaGFuZGxlIEFXUyBBUEkgcmVxdWVzdCBmb3IgbWV0aG9kICVzIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpO2Vsc2V7dmFyIHM9dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gQVdTIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKHMpLHttZXNzYWdlOnN9KX19LHUucHJvdG90eXBlLl9pc1JldHJ5YWJsZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdC5pbmNsdWRlcyhlKX0sdS5wcm90b3R5cGUuX3JldHJ5TWV0aG9kPWZ1bmN0aW9uKGUsbixyLG8saSl7dmFyIHM9dGhpcyxhPXQuZ2V0TG9nKCk7Y29uc3QgYz1lPT5zLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpO2xldCB1PXttYXhDb3VudDp0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOihlLHQpPT5uLmZhaWx1cmUoYyhlKSx0KSxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYXV0aEZhaWx1cmUoYyhlKSx0KX07c3dpdGNoKGkpe2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDp1PXsuLi51LG1heENvdW50OnQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6ImFjY2VzcyBkZW5pZWQiLGV4aGF1c3RlZFJldHJpZXM6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hY2Nlc3NEZW5pZWQoYyhlKSx0KX19bGV0IGw9ey4uLnIscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5OT05FfTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIXUuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkIHdpdGggJHt1LmVycm9yTWVzc2FnZX0gZXJyb3IuIFJldHJ5aW5nIGNhbGwgZm9yIGEgJHt1LmZhaWxDb3VudGVyKzF9IHRpbWVgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUuaW5jcmVhc2VDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLlJFVFJZSU5HfSx2b2lkIHUucmV0cnlDYWxsYmFjayhsLG8pO2EudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGV4aGF1c3RlZCBtYXggJHt1Lm1heENvdW50fSBudW1iZXIgb2YgcmV0cmllcyBmb3IgJHt1LmVycm9yTWVzc2FnZX0gZXJyb3JgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUucmVzZXRDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLkVYSEFVU1RFRH19ZWxzZSBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocil9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt1LmRlZmF1bHRDYWxsYmFjayhsLG8pfSx1LnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKGUpe2NvbnN0IG49e3R5cGU6ZS5jb2RlLG1lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOmUucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSwuLi5lLnN0YXR1c0NvZGUmJntzdGF0dXNDb2RlOmUuc3RhdHVzQ29kZX19O2lmKGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/bi5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz9uLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYobi5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1maW5hbGx5e31yZXR1cm4gbn0sdS5wcm90b3R5cGUuX2FkZFN0YXR1c0NvZGVUb0Vycm9yPWZ1bmN0aW9uKGUpe2lmKGUuc3RhdHVzQ29kZSlyZXR1cm4gZTtjb25zdCBuPXsuLi5lfTtpZihlLmNvZGUpc3dpdGNoKG4uY29kZSl7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2UgdC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDN9ZWxzZSBuLnN0YXR1c0NvZGU9NDAwO3JldHVybiBufSx1LnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsbil7c3dpdGNoKGUpe2Nhc2UgdC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOm4uY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24obi5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6bi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3Mobi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDpuLnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KG4ucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYobi5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksbn0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LHUucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgbD1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciByPW5ldyBBV1MuRW5kcG9pbnQoZSksbz1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woYCR7ci5ob3N0fSR7b30vdGFzay10ZW1wbGF0ZXMvYXBpL2NjcGApfX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7biYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCx0LmFzc2VydE5vdE51bGwoZSwibWV0aG9kIiksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO3ZhciBvPXtjcmVkZW50aWFsczoiaW5jbHVkZSIsbWV0aG9kOiJHRVQiLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWNzcmYtdG9rZW4iOiJjc3JmIn19LGk9bi5pbnN0YW5jZUlkLHM9dGhpcy5lbmRwb2ludFVybCxhPXQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM7c3dpdGNoKGUpe2Nhc2UgYS5MSVNUX1RBU0tfVEVNUExBVEVTOmlmKHMrPWAvcHJveHkvaW5zdGFuY2UvJHtpfS90YXNrL3RlbXBsYXRlYCxuLnF1ZXJ5UGFyYW1zKXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXMobi5xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtlJiYocys9YD8ke2V9YCl9YnJlYWs7Y2FzZSBhLkdFVF9UQVNLX1RFTVBMQVRFOnQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMiKTtjb25zdCByPXQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLmlkLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMuaWQiKSxjPW4udGVtcGxhdGVQYXJhbXMudmVyc2lvbjtzKz1gL3Byb3h5L2luc3RhbmNlLyR7aX0vdGFzay90ZW1wbGF0ZS8ke3J9YCxjJiYocys9YD9zbmFwc2hvdFZlcnNpb249JHtjfWApO2JyZWFrO2Nhc2UgYS5DUkVBVEVfVEVNUExBVEVEX1RBU0s6cys9YC8ke2V9YCxvLmJvZHk9SlNPTi5zdHJpbmdpZnkobiksby5tZXRob2Q9IlBVVCI7YnJlYWs7Y2FzZSBhLlVQREFURV9DT05UQUNUOnMrPWAvJHtlfWAsby5ib2R5PUpTT04uc3RyaW5naWZ5KG4pLG8ubWV0aG9kPSJQT1NUIn10LmZldGNoKHMsbykudGhlbigoZnVuY3Rpb24oZSl7ci5zdWNjZXNzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zdCB0PWUuYm9keS5nZXRSZWFkZXIoKTtsZXQgbj0iIjtjb25zdCBvPW5ldyBUZXh0RGVjb2Rlcjt0LnJlYWQoKS50aGVuKChmdW5jdGlvbiBpKHtkb25lOnMsdmFsdWU6YX0pe2lmKHMpe3ZhciBjPUpTT04ucGFyc2Uobik7cmV0dXJuIGMuc3RhdHVzPWUuc3RhdHVzLHZvaWQgci5mYWlsdXJlKGMpfXJldHVybiBuKz1vLmRlY29kZShhKSx0LnJlYWQoKS50aGVuKGkpfSkpfSkpfSx0LkNsaWVudEJhc2U9bix0Lk51bGxDbGllbnQ9cix0LlVwc3RyZWFtQ29uZHVpdENsaWVudD1pLHQuQXBpUHJveHlDbGllbnQ9cyx0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudD1hLHQuQVdTQ2xpZW50PXUsdC5BZ2VudEFwcENsaWVudD1jLHQuVGFza1RlbXBsYXRlc0NsaWVudD1sfSgpfSw4OTU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmNvcmU9e30sdC5jb3JlLmluaXRpYWxpemVkPSExLHQudmVyc2lvbj0iMi4xNC42Iix0Lm91dGVyQ29udGV4dFN0cmVhbXNWZXJzaW9uPW51bGwsdC5ERUZBVUxUX0JBVENIX1NJWkU9NTAwO3ZhciBuPSJBbWF6b24gQ29ubmVjdCBDQ1AiLHI9Imh0dHBzOi8ve2FsaWFzfS5hd3NhcHBzLmNvbS9hdXRoLz9jbGllbnRfaWQ9e2NsaWVudF9pZH0mcmVkaXJlY3RfdXJpPXtyZWRpcmVjdH0iLG89IjA2OTE5ZjRmZDhlZDMyNGUiLGk9Ii9hdXRoL2F1dGhvcml6ZSIscz0iL2Nvbm5lY3QvYXV0aC9hdXRob3JpemUiLGE9IklmcmFtZVJlZnJlc2hBdHRlbXB0cyIsYz0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzRHIiLHU9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2VzcyIsbD0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzRHIiO2NvbnN0IHA9ImN1c3RvbXZpZXdzIixkPXsiMC0xMDAiOlswLDEwMF0sIjEwMS01MDAiOlsxMDEsNTAwXSwiNTAxLTEwMDAiOls1MDEsMWUzXSwiMTAwMC0zMDAwIjpbMTAwMSwzZTNdLCIzMDAxLTUwMDAiOlszMDAxLDVlM10sIjUwMDEtMTAwMDAiOls1MDAxLDFlNF0sIjEwMDAxLTIwMDAwIjpbMTAwMDEsMmU0XSwiMjAwMDArIjpbMjAwMDEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdfTt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz0wLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPTAsdC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT049Myx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UPTEwLHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudD0wLHQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9bnVsbCx0LmNvcmUuY3RpVGltZW91dElkPW51bGwsdC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQ9MjAsdC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5UPTEwLHQuU2Vzc2lvblN0b3JhZ2VLZXlzPXQubWFrZUVudW0oWyJ0YWJfaWQiLCJhdXRob3JpemVfcmV0cnlfY291bnQiXSk7Y2xhc3MgaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT1gJHt0fVBhcmFtc1N0b3JhZ2U6OiR7ZS5sb2NhdGlvbi5vcmlnaW59YH1nZXQoKXt0cnl7Y29uc3QgdD1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKGAke3RoaXMua2V5fTo6IEZhaWxlZCB0byBnZXQgc29mdHBob25lIHBhcmFtcyBmcm9tIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXJldHVybiBudWxsfXNldChuKXt0cnl7biYmZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmtleSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gc2V0IHNvZnRwaG9uZSBwYXJhbXMgdG8gbG9jYWwgc3RvcmFnZSFgKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fWNsZWFuKCl7ZS5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmtleSl9fWNvbnN0IGY9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJTb2Z0cGhvbmUiKX19LGc9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJSaW5ndG9uZSIpfX07ZnVuY3Rpb24gbShlKXt2YXIgdD1lLm1hdGNoKC9eKD86aHR0cHM/OlwvXC8pPyg/OlteQFxuXStAKT8oPzp3d3dcLik/KFteOlwvXG4/XSspL2dpKTtyZXR1cm4gdC5sZW5ndGg/dFswXToiIn10LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZD1mdW5jdGlvbigpe3QuY29yZS5pbml0aWFsaXplZCYmdC5nZXRMb2coKS53YXJuKCJDb25uZWN0IGNvcmUgYWxyZWFkeSBpbml0aWFsaXplZCwgb25seSBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBvbmNlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3ZhciB2PWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBZ2VudFN0YXRlcygpLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10LkFnZW50U3RhdGVUeXBlLk9GRkxJTkV9KSk7ZS5zZXRTdGF0ZShyLG4pfSx5PWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBjb250YWN0cyBzdXBwcmVzc29yIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLHtzdXBwcmVzczplLHNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW06ITF9KX0sRT1mdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuaW5mbygiW0RJU0FTVEVSIFJFQ09WRVJZXSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBmb3JjZU9mZmxpbmUgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSx0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7b2ZmbGluZTplLG5leHRBY3RpdmVBcm46bn0pfSxTPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKTtjb25zdCBvPXQuYWdlbnQuaW5pdGlhbGl6ZWQ/dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpOnQuY29yZS5yZWdpb247ci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEF0dGVtcHRpbmcgdG8gZm9yY2UgaW5zdGFuY2UgJHtvfSBvZmZsaW5lIHVzaW5nICR7ZT8ic29mdCI6ImhhcmQifSBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hZ2VudCgoZnVuY3Rpb24obyl7dmFyIGk9MCxzPW8uZ2V0Q29udGFjdHMoKSxhPSExO2lmKHMubGVuZ3RoKWZvcihsZXQgYyBvZiBzKXtpZihhKWJyZWFrOyFlfHxjLmdldFR5cGUoKSE9PXQuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJmMuZ2V0VHlwZSgpIT10LkNvbnRhY3RUeXBlLlZPSUNFP2MuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZGVzdHJveSh7c3VjY2VzczpmdW5jdGlvbigpeysraT09PXMubGVuZ3RoJiYoRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7ci53YXJuKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIG9mZmxpbmUgaW4gcmVnaW9uICVzIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIud2FybihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLEUoITAsbiksYT0hMH19KTooci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFdpbGwgd2FpdCB0byBjb21wbGV0ZSBmYWlsb3ZlciBvZiBpbnN0YW5jZSAlcyB1bnRpbCB2b2ljZSBjb250YWN0IHdpdGggSUQgJXMgaXMgZGVzdHJveWVkIix0LmNvcmUucmVnaW9uLGMuZ2V0Q29udGFjdElkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcse25leHRBY3RpdmVBcm46bn0pLGMub25EZXN0cm95KChmdW5jdGlvbihlKXtyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gVm9pY2UgY29udGFjdCB3aXRoIElEICVzIGRlc3Ryb3llZCwgY29udGludWluZyB3aXRoIGZhaWxvdmVyIGluIGluc3RhbmNlICVzIixlLmdldENvbnRhY3RJZCgpLHQuY29yZS5yZWdpb24pLFMoITAsbil9KSkpfWVsc2UgRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX07dC5jb3JlLnRlcm1pbmF0ZUN1c3RvbVZpZXc9ZnVuY3Rpb24oZSxuPSIiLHtyZXNvbHZlSWZyYW1lOnI9ITAsdGltZW91dDpvPTVlMyxoaWRlSWZyYW1lOmk9ITB9PXt9KXtsZXQgcztjb25zdCBhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD8ucXVlcnlTZWxlY3RvcihuKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl9O3M9bj9gJHtwfSR7bn1gOmAke3B9YDtjb25zdCBjPXQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZ2V0KHMpPy5jb250YWluZXJET00sdT1gaWZyYW1lW2lkPScke3N9J11gLGw9YShzLGMsdSk7aWYobCl0cnl7Y29uc3Qgbj17dG9waWM6ImxpZmVjeWNsZS50ZXJtaW5hdGVkIn07bC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG4sZSksciYmKGkmJihsLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxjb25zb2xlLmluZm8oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgaWZyYW1lIGhpZGRlbiBmb3IgcmVzb2x1dGlvbiBkdXJpbmcgdGVybWluYXRpb24iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuYWdlbnRBcHAuc3RvcEFwcChzKSxhKHMsYyx1KT9jb25zb2xlLndhcm4oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgYXBwbGljYXRpb24gZGlkIG5vdCBzdG9wIHN1Y2Nlc3NmdWxseSBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3IG9wZXJhdGlvbiIpOmNvbnNvbGUuaW5mbygiW0N1c3RvbVZpZXdzXSBjdXN0b212aWV3cyBhcHBsaWNhdGlvbiBzdWNjZXNzZnVsbHkgc3RvcHBlZCIpfSksbykpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXSBFcnJvciBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3OiAiLGUpfWVsc2UgY29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdIHRlcm1pbmF0ZUN1c3RvbVZpZXcgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gaWZyYW1lIG5vdCBmb3VuZCIpfSx0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3Zlcnk9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuZ2V0TG9nKCk7dC5jb3JlLnJlZ2lvbj1lLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz1ufHx5LHQuY29yZS5mb3JjZU9mZmxpbmU9cnx8Uyx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe3QuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIpfSkpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3ZlcixlJiZlLm5leHRBY3RpdmVBcm4pfSkpfSkpLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyByZWdpb24gJXMgYXMgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSksKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGFscmVhZHkgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUucG9sbEZvckZhaWxvdmVyJiZ0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLHtpbnN0YW5jZUFybjplLmluc3RhbmNlQXJuLG90aGVyQXJuOmUub3RoZXJBcm4sYXV0aFRva2VuOmUuYXV0aFRva2VufSk6ZS5pc1ByaW1hcnk/KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCExKSxvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHByaW1hcnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOih0LmNvcmUuc3VwcHJlc3NDb250YWN0cyghMCksdC5jb3JlLmZvcmNlT2ZmbGluZSgpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gc3RhbmQtYnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSx0LmNvcmUuaW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUuaW5pdENsaWVudChlKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KGUpLHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudChlKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITB9LHQuY29yZS5pbml0Q2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj10LmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxyPXQuYXNzZXJ0Tm90TnVsbChlLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLG89ZS5lbmRwb2ludHx8bnVsbDt0LmNvcmUuY2xpZW50PW5ldyB0LkFXU0NsaWVudChuLHIsbyl9LHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUuYXV0aENvb2tpZU5hbWUsInBhcmFtcy5hdXRoQ29va2llTmFtZSIpLG89dC5hc3NlcnROb3ROdWxsKGUuYWdlbnRBcHBFbmRwb2ludCwicGFyYW1zLmFnZW50QXBwRW5kcG9pbnQiKTt0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IHQuQWdlbnRBcHBDbGllbnQocixuLG8pfSx0LmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPWUudGFza1RlbXBsYXRlc0VuZHBvaW50fHxlLmVuZHBvaW50O3QuYXNzZXJ0Tm90TnVsbChuLCJ0YXNrVGVtcGxhdGVzRW5kcG9pbnQiKSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgdC5UYXNrVGVtcGxhdGVzQ2xpZW50KG4pfSx0LmNvcmUudGVybWluYXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hcGlQcm94eUNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5OdWxsQ2xpZW50O3ZhciBlPXQuY29yZS5nZXRFdmVudEJ1cygpO2UmJmUudW5zdWJzY3JpYmVBbGwoKSx0LmNvcmUuYnVzPW5ldyB0LkV2ZW50QnVzLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1udWxsLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bnVsbCx0LnN0b3JhZ2VBY2Nlc3MucmVzZXRTdG9yYWdlQWNjZXNzU3RhdGUoKSx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29yZS5pbml0aWFsaXplZD0hMX0sdC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1udWxsLHQuY29yZS5zZXRTb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZnVuY3Rpb24oZSl7dC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1lfSx0LmNvcmUuaW5pdFJpbmd0b25lRW5naW5lcz1mdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gaW5pdFJpbmd0b25lRW5naW5lIHN0YXJ0ZWQiKS53aXRoT2JqZWN0KHtwYXJhbXM6bn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO2NvbnN0IG89cnx8Qzt2YXIgaT1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicmluZ3RvbmVTZXR0aW5ncyIpLHQuYXNzZXJ0Tm90TnVsbChlLnZvaWNlLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlIiksdC5hc3NlcnRUcnVlKGUudm9pY2UucmluZ3RvbmVVcmx8fGUudm9pY2UuZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnZvaWNlLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuYXNzZXJ0Tm90TnVsbChlLnF1ZXVlX2NhbGxiYWNrLCJyaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrIiksdC5hc3NlcnRUcnVlKGUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmx8fGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuY29yZS5yaW5ndG9uZUVuZ2luZXM9e30sdC5hZ2VudCgoZnVuY3Rpb24obil7bi5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtsZXQgbj0hMTtlLnZvaWNlLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZT1uZXcgdC5Wb2ljZVJpbmd0b25lRW5naW5lKGUudm9pY2UpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJWb2ljZVJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUuY2hhdC5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0fHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0PW5ldyB0LkNoYXRSaW5ndG9uZUVuZ2luZShlLmNoYXQpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJDaGF0UmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS50YXNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2s9bmV3IHQuVGFza1Jpbmd0b25lRW5naW5lKGUudGFzayksbj0hMCx0LmdldExvZygpLmluZm8oIlRhc2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFjaz1uZXcgdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUoZS5xdWV1ZV9jYWxsYmFjayksbj0hMCx0LmdldExvZygpLmluZm8oIlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxuJiZ0LmNvcmUuX3JpbmdlckRldmljZUlkJiZvKHtkZXZpY2VJZDp0LmNvcmUuX3JpbmdlckRldmljZUlkfSl9KSl9KSl9KSksYigpfSxzPWZ1bmN0aW9uKGUsbil7ZS5yaW5ndG9uZT1lLnJpbmd0b25lfHx7fSxlLnJpbmd0b25lLnZvaWNlPWUucmluZ3RvbmUudm9pY2V8fHt9LGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9ZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFja3x8e30sZS5yaW5ndG9uZS5jaGF0PWUucmluZ3RvbmUuY2hhdHx8e2Rpc2FibGVkOiEwfSxlLnJpbmd0b25lLnRhc2s9ZS5yaW5ndG9uZS50YXNrfHx7ZGlzYWJsZWQ6ITB9LG4uc29mdHBob25lJiYobi5zb2Z0cGhvbmUuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZS5kaXNhYmxlZD0hMCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkPSEwKSxuLnNvZnRwaG9uZS5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUudm9pY2UucmluZ3RvbmVVcmw9bi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCkpLG4uY2hhdCYmKG4uY2hhdC5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLmNoYXQuZGlzYWJsZWQ9ITApLG4uY2hhdC5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUuY2hhdC5yaW5ndG9uZVVybD1uLmNoYXQucmluZ3RvbmVVcmwpKSxuLnRhc2smJihuLnRhc2suZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS50YXNrLmRpc2FibGVkPSEwKSxuLnRhc2sucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLnRhc2sucmluZ3RvbmVVcmw9bi50YXNrLnJpbmd0b25lVXJsKSksbi5yaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2U9dC5tZXJnZShlLnJpbmd0b25lLnZvaWNlLG4ucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPXQubWVyZ2UoZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjayxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5jaGF0PXQubWVyZ2UoZS5yaW5ndG9uZS5jaGF0LG4ucmluZ3RvbmUuY2hhdHx8e30pLGUucmluZ3RvbmUudGFzaz10Lm1lcmdlKGUucmluZ3RvbmUudGFzayxuLnJpbmd0b25lLnRhc2t8fHt9KSl9O2lmKHMobixuKSx0LmlzRnJhbWVkKCkpe2xldCByO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2UuY2xlYXJUaW1lb3V0KHIpLHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxzKG4sbyksZy5zZXQobi5yaW5ndG9uZSksaShuLnJpbmd0b25lKX0pKTtjb25zdCBvPWcuZ2V0KCk7byYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7biYmbi5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSAmIEluaXRpYWxpemluZyBzZXR1cFJpbmd0b25lRW5naW5lcyAoUmluZ3RvbmUgRW5naW5lKSBmcm9tIGxvY2FsU3RvcmFnZSByaW5ndG9uZSBwYXJhbXMuICIpLndpdGhPYmplY3Qoe3Jpbmd0b25lOm99KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkobyl9KSwxMDApKX0pKX1lbHNlIGkobi5yaW5ndG9uZSl9O3ZhciBiPWZ1bmN0aW9uKCl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxDKX0sQz1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgcmluZ2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwwPT09dC5rZXlzKHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpLmxlbmd0aClyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzZXRSaW5nZXJEZXZpY2UgY2FsbGVkIGJlZm9yZSByaW5ndG9uZSBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQobiYmKHQuY29yZS5fcmluZ2VyRGV2aWNlSWQ9bix0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHN0b3JlZCBkZXZpY2UgSWQgZm9yIGxhdGVyIHVzZSwgb25jZSByaW5ndG9uZSBlbmdpbmUgaXMgdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IlNldFJpbmdlckRldmljZUJlZm9yZUluaXRSaW5ndG9uZUVuZ2luZSIsZGF0YTp7Y291bnQ6MX19KSkpO2lmKG4pe2ZvcihsZXQgZSBpbiB0LmNvcmUucmluZ3RvbmVFbmdpbmVzKXQuY29yZS5yaW5ndG9uZUVuZ2luZXNbZV0uc2V0T3V0cHV0RGV2aWNlKG4pLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gcmluZ3RvbmVUeXBlICR7ZX0gc3VjY2Vzc2Z1bGx5IHNldCB0byBkZXZpY2VpZCAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcihlKX0pKTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOm59fSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgcmluZ2VyIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt0LmNvcmUuaW5pdFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24obil7dmFyIHI9bnx8e307dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGluaXRTb2Z0cGhvbmVNYW5hZ2VyIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSBleGVjdXRlZCIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihlKXtlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gYWdlbnQgcmVmcmVzaCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29uZmlybWVkIGFzIHNvZnRwaG9uZSBtYXN0ZXIgdG9waWMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSxyLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZih0LmlzRnJhbWVkKCkmJnQuaXNDQ1AoKSl7bGV0IG47dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7ZS5jbGVhclRpbWVvdXQobiksdC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmLnNldChyLnNvZnRwaG9uZSksci5zb2Z0cGhvbmUmJnIuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLG8oci5zb2Z0cGhvbmUpKSxpKHIuc29mdHBob25lKX0pKTtsZXQgcj1mLmdldCgpO3ImJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHMpe3MmJnMuaWQmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG49ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxpKHIpLHIuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8ocikpfSksMTAwKSl9KSl9ZWxzZSBvKHIpLGkocik7ZnVuY3Rpb24gaShlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmNvcmUuc29mdHBob25lUGFyYW1zPW4sdC5pc0ZpcmVmb3hCcm93c2VyKCkmJih0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT10Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09dC5jb3JlLnBvcnRTdHJlYW1JZCYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJih0LmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7dC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuYWdlbnQoKGZ1bmN0aW9uKGUpeyF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSx0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksdC5jb250YWN0KChmdW5jdGlvbihlKXt0LmFnZW50KChmdW5jdGlvbihuKXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYodC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIHI9ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCksbz1lLmlzU29mdHBob25lQ2FsbCgpJiZuLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGk9ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhyfHxvfHxpKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfXQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFfSl9KSl9LHQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmdC5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTt0LmlzQ0NQKCk/ZT90LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmlzRnJhbWVkKCk/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0sdC5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksdC5pc0ZyYW1lZCgpKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksbi5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LHQuY29yZS5pbml0QXBpUHJveHlTZXJ2aWNlPWZ1bmN0aW9uKCl7dC5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyB0LkFwaVByb3h5Q2xpZW50LHQuaXNGcmFtZWQoKSYmKHQuY29yZS5oYW5kbGVBcGlQcm94eVJlcXVlc3Q9ZnVuY3Rpb24oZSl7ZT8ubWV0aG9kJiZ0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKS5jYWxsKGUubWV0aG9kLGUucGFyYW1zLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2NvbnN0IHI9e2RhdGE6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX0sZmFpbHVyZTpmdW5jdGlvbihuKXtjb25zdCByPXtlcnI6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX19KX0pfSx0LmNvcmUuZ2V0RnJhbWVNZWRpYURldmljZXM9ZnVuY3Rpb24oZSl7dmFyIG49bnVsbCxyPWV8fDFlMyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIlRpbWVvdXQgZXhjZWVkZWQiKSl9KSxyKX0pKSxpPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2lmKHQuaXNDQ1AoKSluYXZpZ2F0b3ImJm5hdmlnYXRvci5tZWRpYURldmljZXM/bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigoZnVuY3Rpb24odCl7ZGV2aWNlcz10fHxbXSxkZXZpY2VzPWRldmljZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSxlKGRldmljZXMpfSkpOnIobmV3IEVycm9yKCJObyBuYXZpZ2F0b3Igb3IgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBvYmplY3QgZm91bmQiKSk7ZWxzZXt2YXIgbz10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuPW8uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVNQT05TRSwoZnVuY3Rpb24odCl7dC5lcnJvcj9yKG5ldyBFcnJvcih0LmVycm9yKSk6ZSh0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QpfX0pKTtyZXR1cm4gUHJvbWlzZS5yYWNlKFtpLG9dKS5maW5hbGx5KChmdW5jdGlvbigpe24mJm4udW5zdWJzY3JpYmUoKX0pKX0sdC5jb3JlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj1lO3JldHVybiBufHwobj10LmNvcmUuaXNMZWdhY3lEb21haW4oKT9zOmkpLHQuZmV0Y2gobix7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSwyZTMsNSl9LHQuY29yZS52ZXJpZnlEb21haW5BY2Nlc3M9ZnVuY3Rpb24oZSxuKXtpZih0LmdldExvZygpLndhcm4oIlRoaXMgQVBJIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIHJlbGVhc2UiKSwhdC5pc0ZyYW1lZCgpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgcj17aGVhZGVyczp7IlgtQW16LUJlYXJlciI6ZX19LG89bnVsbDtyZXR1cm4gbz1ufHwodC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/Ii9jb25uZWN0L3doaXRlbGlzdGVkLW9yaWdpbnMiOiIvd2hpdGVsaXN0ZWQtb3JpZ2lucyIpLHQuZmV0Y2gobyxyLDJlMyw1KS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1tKHdpbmRvdy5kb2N1bWVudC5yZWZlcnJlcik7cmV0dXJuIGUud2hpdGVsaXN0ZWRPcmlnaW5zLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0PT09bShlKX0pKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdCgpfSkpfSx0LmNvcmUuaXNMZWdhY3lEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWYpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKX0sdC5jb3JlLmluaXRTaGFyZWRXb3JrZXI9ZnVuY3Rpb24obil7aWYodC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhdC5jb3JlLmluaXRpYWxpemVkKXt0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIHI9dC5hc3NlcnROb3ROdWxsKG4uc2hhcmVkV29ya2VyVXJsLCJwYXJhbXMuc2hhcmVkV29ya2VyVXJsIiksbz10LmFzc2VydE5vdE51bGwobi5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxhPXQuYXNzZXJ0Tm90TnVsbChuLnJlZnJlc2hUb2tlbiwicGFyYW1zLnJlZnJlc2hUb2tlbiIpLGM9dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuRXhwaXJhdGlvbiwicGFyYW1zLmF1dGhUb2tlbkV4cGlyYXRpb24iKSx1PXQuYXNzZXJ0Tm90TnVsbChuLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLGw9bi5lbmRwb2ludHx8bnVsbCxwPW4uYXV0aG9yaXplRW5kcG9pbnQ7cHx8KHA9dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKTt2YXIgZD1uLmFnZW50QXBwRW5kcG9pbnR8fG51bGwsaD1uLnRhc2tUZW1wbGF0ZXNFbmRwb2ludHx8bnVsbCxmPW4uYXV0aENvb2tpZU5hbWV8fG51bGw7dHJ5e3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiEwfSksdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShuKTt2YXIgZz1uZXcgU2hhcmVkV29ya2VyKHIsIkNvbm5lY3RTaGFyZWRXb3JrZXIiKSxtPW5ldyB0LkNvbmR1aXQoIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0IixuZXcgdC5Qb3J0U3RyZWFtKGcucG9ydCksbmV3IHQuV2luZG93SU9TdHJlYW0od2luZG93LHBhcmVudCkpO3QuY29yZS51cHN0cmVhbT1tLHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgSSxlLm9udW5sb2FkPWZ1bmN0aW9uKCl7bS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UpLGcucG9ydC5jbG9zZSgpfSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoKG0pLHQuZ2V0TG9nKCkuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoKCksbS5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSxtLm9uQWxsVXBzdHJlYW0obS5wYXNzRG93bnN0cmVhbSgpKSx0LmlzRnJhbWVkKCkmJihtLm9uQWxsRG93bnN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbERvd25zdHJlYW0oKGZ1bmN0aW9uKGUsbil7bj09PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUJiZ0LmNvbnRhaW5zVmFsdWUodC5BcGlQcm94eUNsaWVudE1ldGhvZHMsZT8ubWV0aG9kKT90LmNvcmUuaGFuZGxlQXBpUHJveHlSZXF1ZXN0KGUpOm0ucGFzc1Vwc3RyZWFtKCkoZSxuKX0pKSksbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46byxhdXRoVG9rZW5FeHBpcmF0aW9uOmMsZW5kcG9pbnQ6bCxyZWZyZXNoVG9rZW46YSxyZWdpb246dSxhdXRob3JpemVFbmRwb2ludDpwLGFnZW50QXBwRW5kcG9pbnQ6ZCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6aCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczpuLmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuX3NldFRhYklkKCksdC5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5vbkF1dGhGYWlsKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aEZhaWwsbi5sb2dpbkVuZHBvaW50fHxudWxsLHApKSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLHQuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK3QuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIG49ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDt0LmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1ufSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVt0LmNvcmUudGFiSWRdJiYhaXNOYU4oZVt0LmNvcmUudGFiSWRdLmxlbmd0aCkmJnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCYmKHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbdC5jb3JlLnRhYklkXS5sZW5ndGgsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmdC5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIit0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDp0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJnQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuTUVUUklDUywoKCk9PnQuYWdlbnQoKCgpPT50LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNDUFRhYnNBY3Jvc3NCcm93c2VyQ291bnQiLGRhdGE6e3RhYklkOmUudGFiSWQsY291bnQ6ZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXJ9fSkpKSkpfSkpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmFnZW50KChmdW5jdGlvbigpeyhuZXcgdC5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSx0LmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e3QuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLHQuY29yZS50YWJJZHx8KHQuY29yZS50YWJJZD10LnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELHQuY29yZS50YWJJZCkpLHQuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDp0LmNvcmUudGFiSWR9KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0sdC5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24obixpKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPURhdGUubm93KCk7dHJ5e2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkpcmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiQXR0ZW1wdGVkIHRvIGNhbGwgaW5pdENDUCB3aGVuIGFuIGlmcmFtZSBnZW5lcmF0ZWQgYnkgaW5pdENDUCBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgaW5pdENDUCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX12YXIgcD17fTsic3RyaW5nIj09dHlwZW9mIGk/cC5jY3BVcmw9aTpwPWksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lckRpdiIpLHQuYXNzZXJ0Tm90TnVsbChwLmNjcFVybCwicGFyYW1zLmNjcFVybCIpLHAuc29mdHBob25lPy5kaXNhYmxlU3RvcmluZ1BhcmFtc0luTG9jYWxTdG9yYWdlfHwoZi5jbGVhbigpLGcuY2xlYW4oKSksdC5zdG9yYWdlQWNjZXNzLmluaXQocC5jY3BVcmwsbixwLnN0b3JhZ2VBY2Nlc3N8fHt9KTt2YXIgZD10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShuLHApLGg9bmV3IHQuSUZyYW1lQ29uZHVpdChwLmNjcFVybCx3aW5kb3csZCk7dC5jb3JlLnVwc3RyZWFtPWgsdC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzKHtsb2dFdmVudHM6ITF9KSx0LnN0b3JhZ2VBY2Nlc3MuY2FuUmVxdWVzdCgpP3Quc3RvcmFnZUFjY2Vzcy5zZXR1cFJlcXVlc3RIYW5kbGVycyh7b25HcmFudDptfSk6bSgpfWZ1bmN0aW9uIG0oKXt0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEEodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5tZWRpYUZhY3Rvcnk9bmV3IHQuTWVkaWFGYWN0b3J5KHApLHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoZCxoKSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IEksaC5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1uZXcgVChoLHQuY29yZS5nZXRFdmVudEJ1cygpLHAuY2NwU3luVGltZW91dHx8MWUzLHAuY2NwQWNrVGltZW91dHx8M2UzKSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSx0LmdldExvZygpLmluZm8oIkNDUCBMb2FkVGltZW91dCB0cmlnZ2VyZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkscC5jY3BMb2FkVGltZW91dHx8NWUzKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaChoKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoKGgpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7aWYodC5nZXRMb2coKS5pbmZvKCJBY2tub3dsZWRnZWQgYnkgdGhlIENDUCEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KGgpLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KGgpLHQuY29yZS5wb3J0U3RyZWFtSWQ9bi5pZCwocC5zb2Z0cGhvbmV8fHAuY2hhdHx8cC50YXNrfHxwLnBhZ2VPcHRpb25zfHxwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9nc3x8cC5kaXNhc3RlclJlY292ZXJ5T24pJiZoLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUse3NvZnRwaG9uZTpwLnNvZnRwaG9uZSxjaGF0OnAuY2hhdCx0YXNrOnAudGFzayxwYWdlT3B0aW9uczpwLnBhZ2VPcHRpb25zLHNob3VsZEFkZE5hbWVzcGFjZVRvTG9nczpwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9ncyxkaXNhc3RlclJlY292ZXJ5T246cC5kaXNhc3RlclJlY292ZXJ5T259KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQuY29yZS5yZWdpb249cC5yZWdpb24sdC5jb3JlLnN1cHByZXNzQ29udGFjdHM9eSx0LmNvcmUuZm9yY2VPZmZsaW5lPWZ1bmN0aW9uKGUpe2guc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TRVRfT0ZGTElORSxlKX0saC5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRElTQVNURVJfUkVDT1ZFUlkscCkpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlJiYoZS5jbGVhclRpbWVvdXQodC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwpLGguc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTyx7c3RyZWFtc1ZlcnNpb246dC52ZXJzaW9ufSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXIuc3RhcnQoKSx0aGlzLnVuc3Vic2NyaWJlKCksdC5jb3JlLmluaXRpYWxpemVkPSEwLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSU5JVCkscyl7dmFyIHI9RGF0ZS5ub3coKS1zLG89dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwO3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgaW5pdGlhbGl6YXRpb24gdGltZSAke3J9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7b31gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHNldFRpbWVvdXQoKCgpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lIixkYXRhOntjb3VudDpyfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lRHIiLGRhdGE6e2NvdW50OnJ9fSkpLHM9bnVsbH0pLDFlMyl9fSkpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQsKGZ1bmN0aW9uKCl7aWYoITEhPT1wLmxvZ2luUG9wdXApdHJ5e3ZhciBpPWZ1bmN0aW9uKG4pe3ZhciBpPSJodHRwczovL2xpbHkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vdGF3L2F1dGgvY29kZSI7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChpKSxuLmxvZ2luVXJsP24ubG9naW5Vcmw6bi5hbGlhcz8obG9nLndhcm4oIlRoZSBgYWxpYXNgIHBhcmFtIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8gZnVuY3Rpb24gcHJvcGVybHkuIFBsZWFzZSB1c2UgYGNjcFVybGAgb3IgYGxvZ2luVXJsYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWF6b24tY29ubmVjdC9hbWF6b24tY29ubmVjdC1zdHJlYW1zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNjb25uZWN0Y29yZWluaXRjY3AgZm9yIHZhbGlkIHBhcmFtZXRlcnMuIiksci5yZXBsYWNlKCJ7YWxpYXN9IixuLmFsaWFzKS5yZXBsYWNlKCJ7Y2xpZW50X2lkfSIsbykucmVwbGFjZSgie3JlZGlyZWN0fSIsZS5lbmNvZGVVUklDb21wb25lbnQoaSkpKTpuLmNjcFVybH0ocCk7dC5nZXRMb2coKS53YXJuKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCwgYXR0ZW1wdGluZyB0byBwb3AgdGhlIGxvZ2luIHBhZ2UgaWYgbm90IGFscmVhZHkgb3Blbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5fb3BlblBvcHVwV2l0aExvY2soaSxwLmxvZ2luT3B0aW9ucyl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiQUNLX1RJTUVPVVQgb2NjdXJyZWQgYnV0IHdlIGFyZSB1bmFibGUgdG8gb3BlbiB0aGUgbG9naW4gcG9wdXAuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWlmKG51bGw9PXQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl0cnl7aC5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLChwLmxvZ2luUG9wdXBBdXRvQ2xvc2V8fHAubG9naW5PcHRpb25zJiZwLmxvZ2luT3B0aW9ucy5hdXRvQ2xvc2UpJiZ0LmNvcmUubG9naW5XaW5kb3cmJih0LmNvcmUubG9naW5XaW5kb3cuY2xvc2UoKSx0LmNvcmUubG9naW5XaW5kb3c9bnVsbCl9KSksdC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0KHAsbil9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVmcmVzaGluZyBpZnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHAub25WaWV3Q29udGFjdCYmdC5jb3JlLm9uVmlld0NvbnRhY3QocC5vblZpZXdDb250YWN0KSxoLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLChmdW5jdGlvbihlKXt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz1lLmxlbmd0aH0pKSxoLm9uVXBzdHJlYW0odC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsKGZ1bmN0aW9uKGUpe2UmJmUuZG9tYWluSWQmJih0LmNvcmUudm9pY2VJZERvbWFpbklkPWUuZG9tYWluSWQpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsKGZ1bmN0aW9uKCl7aWYocyl7dmFyIGU9dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0LTE7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oIlRpbWUgYWZ0ZXIgaWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQgIisoRGF0ZS5ub3coKS1zKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZTphLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOnUsZGF0YTp7Y291bnQ6MH19KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQucHVibGlzaE1ldHJpYyh7bmFtZTpjLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmwsZGF0YTp7Y291bnQ6MH19KSkscz1udWxsfX0pKSx0LmNvcmUuc29mdHBob25lUGFyYW1zPXAuc29mdHBob25lfX0sdC5jb3JlLl9vcGVuUG9wdXBXaXRoTG9jaz1mdW5jdGlvbihlLG4pe2NvbnN0IHI9ImNvbm5lY3QtbG9naW4tcG9wdXAtbG9jayIrZTt0cnl7bmF2aWdhdG9yLmxvY2tzLnJlcXVlc3Qocix7bW9kZToiZXhjbHVzaXZlIixpZkF2YWlsYWJsZTohMH0sKGFzeW5jIHI9PntpZighcilyZXR1cm4gdm9pZCB0LmdldExvZygpLmluZm8oIlBvcHVwIGFscmVhZHkgb3BlbmVkIGJ5IGFub3RoZXIgdGFiLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dC5nZXRMb2coKS5pbmZvKCJPcGVuaW5nIHBvcHVwIHdpbmRvdyB3aXRoIHdlYmxvY2suIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUubG9naW5XaW5kb3c9dC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLm9wZW4oZSx0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCxuKSx0LmNvcmUuX3Nob3VsZEhvbGRQb3B1cExvY2s9ITA7Y29uc3Qgbz1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LmNvcmUubG9naW5XaW5kb3cmJiF0LmNvcmUubG9naW5XaW5kb3c/LmNsb3NlZHx8KGNsZWFySW50ZXJ2YWwobyksdC5jb3JlLl9zaG91bGRIb2xkUG9wdXBMb2NrPSExLHQuZ2V0TG9nKCkuaW5mbygiQ2xlYXJlZCBjaGVjayBwb3B1cCBpbnRlcnZhbC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0pLDFlMyk7Zm9yKDt0LmNvcmUuX3Nob3VsZEhvbGRQb3B1cExvY2s7KWF3YWl0IG5ldyBQcm9taXNlKChlPT5zZXRUaW1lb3V0KGUsMWUzKSkpO3QuZ2V0TG9nKCkuaW5mbygiUmVsZWFzaW5nIHdlYmxvY2sgZm9yIG9wZW5pbmcgbG9naW4gcG9wdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX1jYXRjaChyKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gdXNlIHdlYmxvY2sgdG8gb3BlbiBwb3B1cC4gWW91ciBicm93c2VyIG1heSBiZSBvdXQgb2YgZGF0ZS4iKS53aXRoRXhjZXB0aW9uKHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmxvZ2luV2luZG93fHwodC5jb3JlLmxvZ2luV2luZG93PXQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5vcGVuKGUsdC5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVAsbikpfX0sdC5jb3JlLm9uSWZyYW1lUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0PWZ1bmN0aW9uKG4scil7dC5hc3NlcnROb3ROdWxsKG4sImluaXRDQ1BQYXJhbXMiKSx0LmFzc2VydE5vdE51bGwociwiY29udGFpbmVyRGl2Iik7dmFyIG89bi5jY3BMb2FkVGltZW91dD9uLmNjcExvYWRUaW1lb3V0Om4uZGlzYXN0ZXJSZWNvdmVyeU9uPzFlNDo1ZTM7ZS5jbGVhclRpbWVvdXQodC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe2lmKHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdD0odC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwKSsxLHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdDw9MTApe3RyeXt2YXIgbz10LmNvcmUuX2dldENDUElmcmFtZSgpO28mJm8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKTt2YXIgaT10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShyLG4pO3QuY29yZS51cHN0cmVhbS51cHN0cmVhbS5vdXRwdXQ9aS5jb250ZW50V2luZG93LHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoaSx0LmNvcmUudXBzdHJlYW0pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciwgYW5kIHJlY3JlYXRpbmcsIHRoZSBDQ1AgSUZyYW1lIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dChuLHIpfWVsc2UgdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQpLGUuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl9KSxvKX0sdC5jb3JlLl9nZXRDQ1BJZnJhbWU9ZnVuY3Rpb24oKXtmb3IodmFyIGUgb2Ygd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSlpZihlLm5hbWU9PT1uKXJldHVybiBlO3JldHVybiBudWxsfSx0LmNvcmUuX2NyZWF0ZUNDUElmcmFtZT1mdW5jdGlvbihlLHIpe3QuYXNzZXJ0Tm90TnVsbChyLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKGUsImNvbnRhaW5lckRpdiIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz1yLmNjcFVybCxvLmFsbG93PSJtaWNyb3Bob25lOyBjYW1lcmE7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGlkZW50aXR5LWNyZWRlbnRpYWxzLWdldCIsby5zdHlsZT1yLnN0eWxlfHwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJSIsby50aXRsZT1yLmlmcmFtZVRpdGxlfHxuLG8ubmFtZT1uLHQuc3RvcmFnZUFjY2Vzcy5jYW5SZXF1ZXN0KCkmJihvLnNyYz10LnN0b3JhZ2VBY2Nlc3MuZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmwoKSxvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHQuc3RvcmFnZUFjY2Vzcy5yZXF1ZXN0KSksZS5hcHBlbmRDaGlsZChvKSxvfSx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImlmcmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb25kdWl0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgcj17ZGlzcGxheTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpLmRpc3BsYXksb2Zmc2V0V2lkdGg6ZS5vZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQ6ZS5vZmZzZXRIZWlnaHQsY2xpZW50UmVjdHNMZW5ndGg6ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aH07bi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuSUZSQU1FX1NUWUxFLHIpfSksMWU0KX07dmFyIFQ9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5jb25kdWl0PWUsdGhpcy5ldmVudEJ1cz10LHRoaXMuc3luVGltZW91dD1uLHRoaXMuYWNrVGltZW91dD1yLHRoaXMuYWNrVGltZXI9bnVsbCx0aGlzLnN5blRpbWVyPW51bGwsdGhpcy5hY2tTdWI9bnVsbH07VC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU1lOQ0hST05JWkUpLHRoaXMuYWNrU3ViPXRoaXMuY29uZHVpdC5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dChuLmFja1RpbWVyKSxuLl9kZWZlclN0YXJ0KCl9KSksdGhpcy5hY2tUaW1lcj1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5hY2tTdWIudW5zdWJzY3JpYmUoKSxuLmV2ZW50QnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQpLG4uX2RlZmVyU3RhcnQoKX0pLHRoaXMuYWNrVGltZW91dCl9LFQucHJvdG90eXBlLl9kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCl9LFQucHJvdG90eXBlLmRlZmVyU3RhcnQ9ZnVuY3Rpb24oKXtudWxsPT10aGlzLnN5blRpbWVyJiYodGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCkpfTt2YXIgST1mdW5jdGlvbigpe3ZhciBlPXtpbml0RmFpbHVyZTpuZXcgU2V0LHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sbj1mdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZSh0KX0pKX07dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsKGZ1bmN0aW9uKCl7bihlLmluaXRGYWlsdXJlKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fT1BFTiwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25PcGVuLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9DTE9TRSwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25DbG9zZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTiwoZnVuY3Rpb24oKXtuKGUuY29ubmVjdGlvbkdhaW4pfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbkxvc3QsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLChmdW5jdGlvbih0KXtuKGUuc3Vic2NyaXB0aW9uVXBkYXRlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsKGZ1bmN0aW9uKHQpe24oZS5zdWJzY3JpcHRpb25GYWlsdXJlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQUxMX01FU1NBR0UsKGZ1bmN0aW9uKHQpe24oZS5hbGxNZXNzYWdlLHQpLGUudG9waWMuaGFzKHQudG9waWMpJiZuKGUudG9waWMuZ2V0KHQudG9waWMpLHQpfSkpLHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsZSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuaW5pdEZhaWx1cmUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuaW5pdEZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uT3Blbi5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uT3Blbi5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uQ2xvc2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkdhaW4uYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkdhaW4uZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uTG9zdC5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uTG9zdC5kZWxldGUobil9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShuKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLHQuYXNzZXJ0VHJ1ZSh0LmlzQXJyYXkoZSksInRvcGljcyBtdXN0IGJlIGEgYXJyYXkiKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSUJFLGUpfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihuLHIpe3JldHVybiB0LmFzc2VydE5vdE51bGwobiwidG9waWNOYW1lIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUudG9waWMuaGFzKG4pP2UudG9waWMuZ2V0KG4pLmFkZChyKTplLnRvcGljLnNldChuLG5ldyBTZXQoW3JdKSksZnVuY3Rpb24oKXtyZXR1cm4gZS50b3BpYy5nZXQobikuZGVsZXRlKHIpfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmFsbE1lc3NhZ2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWxsTWVzc2FnZS5kZWxldGUobil9fX0sQT1mdW5jdGlvbihlKXt0aGlzLmJ1cz1lLHRoaXMuYnVzLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlVQREFURSx0LmhpdGNoKHRoaXMsdGhpcy51cGRhdGVBZ2VudERhdGEpKX07QS5wcm90b3R5cGUudXBkYXRlQWdlbnREYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuYWdlbnREYXRhO3RoaXMuYWdlbnREYXRhPWU7dHJ5e2NvbnN0IHI9RGF0ZS5wYXJzZShlLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKTtpZighbnx8ciE9PURhdGUucGFyc2Uobi5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCkpe2NvbnN0IG49KG5ldyBEYXRlKS5nZXRUaW1lKCktcjtfKCJTbmFwc2hvdFJlY2VpdmVkQnlDbGllbnQiLG4se0NvbnRlbnRMZW5ndGhJbkJ5dGVzOnQuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQoZS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9KX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW01ldHJpY3NdIEZhaWxlZCB0byBzZW5kIG1ldHJpY3MuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfW51bGw9PW4mJih0LmFnZW50LmluaXRpYWxpemVkPSEwLHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5JTklULG5ldyB0LkFnZW50KSksdGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLlJFRlJFU0gsbmV3IHQuQWdlbnQpLHRoaXMuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cyhuKX0sQS5wcm90b3R5cGUuZ2V0QWdlbnREYXRhPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5hZ2VudERhdGEpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiTm8gYWdlbnQgZGF0YSBpcyBhdmFpbGFibGUgeWV0ISIpO3JldHVybiB0aGlzLmFnZW50RGF0YX0sQS5wcm90b3R5cGUuZ2V0Q29udGFjdERhdGE9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRBZ2VudERhdGEoKSxyPXQuZmluZChuLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWN0SWQ9PT1lfSkpO2lmKG51bGw9PXIpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsZSk7cmV0dXJuIHJ9LEEucHJvdG90eXBlLmdldENvbm5lY3Rpb25EYXRhPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcy5nZXRDb250YWN0RGF0YShlKSxvPXQuZmluZChyLmNvbm5lY3Rpb25zLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb25uZWN0aW9uSWQ9PT1ufSkpO2lmKG51bGw9PW8pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29ubmVjdGlvbiAlcyBmb3IgY29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsbixlKTtyZXR1cm4gb30sQS5wcm90b3R5cGUuZ2V0SW5zdGFuY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvaW5zdGFuY2VcLyhbMC05YS1mQS1GfC1dKylcLy8pWzFdfSxBLnByb3RvdHlwZS5nZXRBV1NBY2NvdW50SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goLzooWzAtOV0rKTppbnN0YW5jZS8pWzFdfSxBLnByb3RvdHlwZS5fZGlmZkNvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciBuPXthZGRlZDp7fSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6dC5pbmRleChudWxsPT1lP1tdOmUuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxuZXdNYXA6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6MH07cmV0dXJuIHQua2V5cyhuLm9sZE1hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb250YWlucyhuLm5ld01hcCxlKT9uLmNvbW1vbltlXT1uLm5ld01hcFtlXTpuLnJlbW92ZWRbZV09bi5vbGRNYXBbZV19KSksdC5rZXlzKG4ubmV3TWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvbnRhaW5zKG4ub2xkTWFwLGUpfHwobi5hZGRlZFtlXT1uLm5ld01hcFtlXSl9KSksbi5lbmRUaW1lPXBlcmZvcm1hbmNlLm5vdygpLG59LEEucHJvdG90eXBlLl9maXJlQWdlbnRVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPW51bGwsbz1udWxsPT1lP3QuQWdlbnRBdmFpbFN0YXRlcy5JTklUOmUuc25hcHNob3Quc3RhdGUubmFtZSxpPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLm5hbWUscz1udWxsPT1lP3QuQWdlbnRTdGF0ZVR5cGUuSU5JVDplLnNuYXBzaG90LnN0YXRlLnR5cGUsYT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS50eXBlO3MhPT1hJiZ0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLHMsYSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSxvIT09aSYmKHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0Use2FnZW50Om5ldyB0LkFnZW50LG9sZFN0YXRlOm8sbmV3U3RhdGU6aX0pLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLG8saSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSk7dmFyIGM9ZSYmZS5zbmFwc2hvdC5uZXh0U3RhdGU/ZS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsLHU9dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlP3RoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGw7YyE9PXUmJnUmJm4uYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLG5ldyB0LkFnZW50KTtjb25zdCBsPXBlcmZvcm1hbmNlLm5vdygpO3I9bnVsbCE9PWU/dGhpcy5fZGlmZkNvbnRhY3RzKGUpOnthZGRlZDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSkscmVtb3ZlZDp7fSxjb21tb246e30sb2xkTWFwOnt9LG5ld01hcDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksZW5kVGltZTpwZXJmb3JtYW5jZS5ub3coKX07Y29uc3QgcD1wZXJmb3JtYW5jZS5ub3coKTt0LnZhbHVlcyhyLmFkZGVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5JTklULG5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpKSxuLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLmNvbnRhY3RJZCx0LkNvbnRhY3RTdGF0ZVR5cGUuSU5JVCxlLnN0YXRlLnR5cGUpfSkpLHQudmFsdWVzKHIucmVtb3ZlZCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKSksbi5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELGUuY29udGFjdElkKSxuZXcgdC5Db250YWN0U25hcHNob3QoZSkpLG4uX3Vuc3ViQWxsQ29udGFjdEV2ZW50c0ZvckNvbnRhY3QoZS5jb250YWN0SWQpfSkpLHQua2V5cyhyLmNvbW1vbikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHMoZSxyLm9sZE1hcFtlXS5zdGF0ZS50eXBlLHIubmV3TWFwW2VdLnN0YXRlLnR5cGUpfSkpO2NvbnN0IGQ9cGVyZm9ybWFuY2Uubm93KCksaD17Q29udGVudExlbmd0aEluQnl0ZXM6dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9O3RyeXtfKCJTbmFwc2hvdENvbXBhcmlzb25TdGVwVGltZSIsci5lbmRUaW1lLWwsaCksXygiU25hcHNob3RFdmVudFRyaWdnZXJTdGVwVGltZSIsZC1wLGgpLF8oIlNuYXBzaG90VG90YWxQcm9jZXNzaW5nVGltZSIsZC1sLGgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19O2xldCBfPShlLG4scik9Pnt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxkYXRhOntsYXRlbmN5Om4sb3B0aW9uYWxEaW1lbnNpb25zOnJ9fSl9O3QuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQ9ZnVuY3Rpb24oZSl7aWYoZSYmZS5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpKXtjb25zdCB0PXBhcnNlSW50KGUuY29udGVudExlbmd0aCk7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMoZCkpe2NvbnN0W24scl09ZFtlXTtpZih0Pj1uJiZ0PD1yKXJldHVybiBlfX1yZXR1cm4idW5kZWZpbmVkIn0sQS5wcm90b3R5cGUuX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzO24hPT1yJiZ0LmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxuLHIpLmZvckVhY2goKGZ1bmN0aW9uKG4pe28uYnVzLnRyaWdnZXIobixuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKG4sZSksbmV3IHQuQ29udGFjdChlKSl9KSksby5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCxuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5SRUZSRVNILGUpLG5ldyB0LkNvbnRhY3QoZSkpfSxBLnByb3RvdHlwZS5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QudmFsdWVzKHQuQ29udGFjdEV2ZW50cykuZm9yRWFjaCgoZnVuY3Rpb24ocil7bi5idXMuZ2V0U3Vic2NyaXB0aW9ucyh0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShyLGUpKS5tYXAoKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0pKX0sdC5jb3JlLm9uVmlld0NvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuVklFVyxlKX0sdC5jb3JlLnZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5WSUVXLGRhdGE6e2NvbnRhY3RJZDplfX0pfSx0LmNvcmUub25BY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZSl9LHQuY29yZS5hY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSxuLHIsbyl7Y29uc3QgaT17dmlld1R5cGU6ZSxtZWRpYVR5cGU6bn07ciYmKGkuc291cmNlPXIpLG8mJihpLmNhc2VJZD1vKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZGF0YTppfSl9LHQuY29yZS50cmlnZ2VyVGFza0NyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LlRhc2tFdmVudHMuQ1JFQVRFRCxlKX0sdC5jb3JlLm9uQWNjZXNzRGVuaWVkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCxlKX0sdC5jb3JlLm9uQXV0aEZhaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5vbkF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BVVRIT1JJWkVfU1VDQ0VTUyxlKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULDApfSx0LmNvcmUuX2hhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUsbixyKXtyJiZyLmF1dGhvcml6ZT90LmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWwoZSk6dC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbChuKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVGYWlsPWZ1bmN0aW9uKGUpe2xldCBuPXQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQoKTtpZighdC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZClpZihuPHQuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OKXt0LmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50KCk7bGV0IHI9QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShuKzF8fDAse2Jhc2U6MmUzfSk7dC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5fcmVkaXJlY3RUb0xvZ2luKGUpfSkscil9ZWxzZSB0LmdldExvZygpLndhcm4oIldlIGhhdmUgZXhoYXVzdGVkIG91ciBhdXRob3JpemF0aW9uIHJldHJpZXMgZHVlIHRvIDQwMXMgZnJvbSB0aGUgYXV0aG9yaXplIGFwaS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIHRoaXMgc2Vzc2lvbiB1bnRpbCB0aGUgYXV0aG9yaXplIGFwaSByZXR1cm5zIDIwMC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0sdC5jb3JlLl9yZWRpcmVjdFRvTG9naW49ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP2xvY2F0aW9uLmFzc2lnbihlKTpsb2NhdGlvbi5yZWxvYWQoKX0sdC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbD1mdW5jdGlvbihlKXtpZighdC5jb3JlLmN0aVRpbWVvdXRJZClpZih0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ8dC5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVCl7dC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50Kys7bGV0IG49QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheSh0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnR8fDAse2Jhc2U6NTAwfSk7dC5jb3JlLmN0aVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5hdXRob3JpemUoZSkudGhlbih0LmNvcmUuX3RyaWdnZXJBdXRob3JpemVTdWNjZXNzLmJpbmQodC5jb3JlKSkuY2F0Y2godC5jb3JlLl90cmlnZ2VyQXV0aEZhaWwuYmluZCh0LmNvcmUse2F1dGhvcml6ZTohMH0pKSx0LmNvcmUuY3RpVGltZW91dElkPW51bGx9KSxuKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBDVEkgc2VydmljZS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIHVudGlsIHRoZSBwYWdlIGlzIHJlZnJlc2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHQuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTKX0sdC5jb3JlLl90cmlnZ2VyQXV0aEZhaWw9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQ9ZnVuY3Rpb24oKXtsZXQgZT13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQpO2lmKG51bGwhPT1lKXtpZihpc05hTihwYXJzZUludChlKSkpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIHNlc3Npb24gc3RvcmFnZSB2YWx1ZSBmb3IgYXV0aCByZXRyeSBjb3VudCB3YXMgTmFOIik7cmV0dXJuIHBhcnNlSW50KGUpfXJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCksMH0sdC5jb3JlLl9pbmNyZW1lbnRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwodC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpKzEpLnRvU3RyaW5nKCkpfSx0LmNvcmUub25BdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUub25DVElBdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLm9uU29mdHBob25lU2Vzc2lvbkluaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGUpfSx0LmNvcmUub25Db25maWd1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ09ORklHVVJFLGUpfSx0LmNvcmUub25Jbml0aWFsaXplZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklOSVQsZSl9LHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lPWZ1bmN0aW9uKGUsbil7aWYodC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb250YWN0SWQiKSwhdC5jb250YWlucyh0LnZhbHVlcyh0LkNvbnRhY3RFdmVudHMpLGUpKXRocm93IG5ldyB0LlZhbHVlRXJyb3IoIiVzIGlzIG5vdCBhIHZhbGlkIGNvbnRhY3QgZXZlbnQuIixlKTtyZXR1cm4gdC5zcHJpbnRmKCIlczo6JXMiLGUsbil9LHQuY29yZS5nZXRFdmVudEJ1cz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZXZlbnRCdXN9LHQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcn0sdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudERhdGFQcm92aWRlcn0sdC5jb3JlLmdldExvY2FsVGltZXN0YW1wPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LmxvY2FsVGltZXN0YW1wfSx0LmNvcmUuZ2V0U2tldz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKS5zbmFwc2hvdC5za2V3fSx0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaH0sdC5jb3JlLmFnZW50Um91dGluZ0V2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5ST1VUQUJMRSx0LkFnZW50RXZlbnRzLlJPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuTk9UX1JPVVRBQkxFLHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuT0ZGTElORSx0LkFnZW50RXZlbnRzLk9GRkxJTkUpLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRTdGF0ZUV2ZW50R3JhcGh9LHQuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LnZhbHVlcyh0LkFnZW50RXJyb3JTdGF0ZXMpLHQuQWdlbnRFdmVudHMuRVJST1IpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudEF2YWlsU3RhdGVzLkFGVEVSX0NBTExfV09SSyx0LkFnZW50RXZlbnRzLkFDVyksdC5jb3JlLmdldENvbnRhY3RFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5jb250YWN0RXZlbnRHcmFwaH0sdC5jb3JlLmNvbnRhY3RFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLlBFTkRJTkcsdC5Db250YWN0RXZlbnRzLlBFTkRJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FTkRFRCx0LkNvbnRhY3RFdmVudHMuQUNXKS5hc3NvYyh0LnZhbHVlcyh0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyksdC52YWx1ZXModC5yZWxhdGl2ZUNvbXBsZW1lbnQodC5DT05UQUNUX0FDVElWRV9TVEFURVMsdC5Db250YWN0U3RhdGVUeXBlKSksdC5Db250YWN0RXZlbnRzLkVOREVEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuRVJST1IpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5NSVNTRUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5NSVNTRUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLlJFSkVDVEVELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RTdGF0ZVR5cGUuUkVKRUNURUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCksdC5jb3JlLmdldENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuY2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGNvcmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuY2xpZW50fSx0LmNvcmUuY2xpZW50PW51bGwsdC5jb3JlLmdldEFwaVByb3h5Q2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5hcGlQcm94eUNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBhcGlQcm94eSBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuYXBpUHJveHlDbGllbnR9LHQuY29yZS5hcGlQcm94eUNsaWVudD1udWxsLHQuY29yZS5nZXRBZ2VudEFwcENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuYWdlbnRBcHBDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgQWdlbnRBcHAgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmFnZW50QXBwQ2xpZW50fSx0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBUYXNrVGVtcGxhdGVzIENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50fSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1udWxsLHQuY29yZS5nZXRNYXN0ZXJDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLm1hc3RlckNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBtYXN0ZXIgY2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLm1hc3RlckNsaWVudH0sdC5jb3JlLm1hc3RlckNsaWVudD1udWxsLHQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyfSx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1udWxsLHQuY29yZS5nZXROb3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyfHwodC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bmV3IHQuTm90aWZpY2F0aW9uTWFuYWdlciksdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ9LHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyPW51bGwsdC5jb3JlLmdldFBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUucG9wdXBNYW5hZ2VyfSx0LmNvcmUucG9wdXBNYW5hZ2VyPW5ldyB0LlBvcHVwTWFuYWdlcix0LmNvcmUuZ2V0VXBzdHJlYW09ZnVuY3Rpb24oKXtpZighdC5jb3JlLnVwc3RyZWFtKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZXJlIGlzIG5vIHVwc3RyZWFtIGNvbmR1aXQhIik7cmV0dXJuIHQuY29yZS51cHN0cmVhbX0sdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLkFnZW50RGF0YVByb3ZpZGVyPUF9KCl9LDU5MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuPSI8PGFsbD4+IixyPXQubWFrZUVudW0oWyJhY2tub3dsZWRnZSIsImFja190aW1lb3V0IiwiaW5pdCIsImFwaV9yZXF1ZXN0IiwiYXBpX3Jlc3BvbnNlIiwiYXV0aF9mYWlsIiwiYWNjZXNzX2RlbmllZCIsImNsb3NlIiwiY29uZmlndXJlIiwibG9nIiwibWFzdGVyX3JlcXVlc3QiLCJtYXN0ZXJfcmVzcG9uc2UiLCJzeW5jaHJvbml6ZSIsInRlcm1pbmF0ZSIsInRlcm1pbmF0ZWQiLCJzZW5kX2xvZ3MiLCJyZWxvYWRfYWdlbnRfY29uZmlndXJhdGlvbiIsImJyb2FkY2FzdCIsImFwaV9tZXRyaWMiLCJjbGllbnRfbWV0cmljIiwic29mdHBob25lX3N0YXRzIiwic29mdHBob25lX3JlcG9ydCIsImNsaWVudF9zaWRlX2xvZ3MiLCJzZXJ2ZXJfYm91bmRfaW50ZXJuYWxfbG9nIiwibXV0ZSIsImlmcmFtZV9zdHlsZSIsImlmcmFtZV9yZXRyaWVzX2V4aGF1c3RlZCIsInVwZGF0ZV9jb25uZWN0ZWRfY2NwcyIsIm91dGVyX2NvbnRleHRfaW5mbyIsIm1lZGlhX2RldmljZV9yZXF1ZXN0IiwibWVkaWFfZGV2aWNlX3Jlc3BvbnNlIiwidGFiX2lkIiwiYXV0aG9yaXplX3N1Y2Nlc3MiLCJhdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjdGlfYXV0aG9yaXplX3JldHJpZXNfZXhoYXVzdGVkIiwiY2xpY2tfc3RyZWFtX2RhdGEiLCJzZXRfcXVpY2tfZ2V0X2FnZW50X3NuYXBzaG90X2ZsYWciLCJhcGlfcHJveHlfcmVxdWVzdCIsImFwaV9wcm94eV9yZXNwb25zZSJdKSxvPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25uZWN0IixbImxvZ2luUG9wdXAiLCJzZW5kTG9ncyIsInNvZnRwaG9uZSIsInJpbmd0b25lIiwibWV0cmljcyIsImZhaWxvdmVyIl0pLGk9dC5tYWtlTmFtZXNwYWNlZEVudW0oImFnZW50IixbImluaXQiLCJ1cGRhdGUiLCJyZWZyZXNoIiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJwZW5kaW5nIiwiY29udGFjdF9wZW5kaW5nIiwib2ZmbGluZSIsImVycm9yIiwic29mdHBob25lX2Vycm9yIiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fbG9zdCIsIndlYnNvY2tldF9jb25uZWN0aW9uX2dhaW5lZCIsInN0YXRlX2NoYW5nZSIsImFjdyIsIm11dGVfdG9nZ2xlIiwibG9jYWxfbWVkaWFfc3RyZWFtX2NyZWF0ZWQiLCJlbnF1ZXVlZF9uZXh0X3N0YXRlIl0pLHM9dC5tYWtlTmFtZXNwYWNlZEVudW0oIndlYlNvY2tldCIsWyJpbml0X2ZhaWx1cmUiLCJjb25uZWN0aW9uX29wZW4iLCJjb25uZWN0aW9uX2Nsb3NlIiwiY29ubmVjdGlvbl9lcnJvciIsImNvbm5lY3Rpb25fZ2FpbiIsImNvbm5lY3Rpb25fbG9zdCIsInN1YnNjcmlwdGlvbl91cGRhdGUiLCJzdWJzY3JpcHRpb25fZmFpbHVyZSIsImFsbF9tZXNzYWdlIiwic2VuZCIsInN1YnNjcmliZSJdKSxhPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb250YWN0IixbImluaXQiLCJyZWZyZXNoIiwiZGVzdHJveWVkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImFjdyIsInZpZXciLCJlbmRlZCIsImVycm9yIiwiYWNjZXB0ZWQiXSksYz10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFza0xpc3QiLFsiYWN0aXZhdGVfY2hhbm5lbF93aXRoX3ZpZXdfdHlwZSJdKSx1PXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ0YXNrIixbImNyZWF0ZWQiXSksbD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29ubmVjdGlvbiIsWyJzZXNzaW9uX2luaXQiLCJyZWFkeV90b19zdGFydF9zZXNzaW9uIl0pLHA9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbmZpZ3VyYXRpb24iLFsiY29uZmlndXJlIiwic2V0X3NwZWFrZXJfZGV2aWNlIiwic2V0X21pY3JvcGhvbmVfZGV2aWNlIiwic2V0X3Jpbmdlcl9kZXZpY2UiLCJzcGVha2VyX2RldmljZV9jaGFuZ2VkIiwibWljcm9waG9uZV9kZXZpY2VfY2hhbmdlZCIsInJpbmdlcl9kZXZpY2VfY2hhbmdlZCIsImNhbWVyYV9kZXZpY2VfY2hhbmdlZCIsImJhY2tncm91bmRfYmx1cl9jaGFuZ2VkIl0pLGQ9dC5tYWtlTmFtZXNwYWNlZEVudW0oImRpc2FzdGVyUmVjb3ZlcnkiLFsic3VwcHJlc3MiLCJmb3JjZV9vZmZsaW5lIiwic2V0X29mZmxpbmUiLCJpbml0X2Rpc2FzdGVyX3JlY292ZXJ5IiwiZmFpbG92ZXIiLCJmYWlsb3Zlcl9wZW5kaW5nIiwiaW5pdF9kcl9wb2xsaW5nIl0pLGg9dC5tYWtlTmFtZXNwYWNlZEVudW0oInZvaWNlSWQiLFsidXBkYXRlX2RvbWFpbl9pZCJdKSxmPWZ1bmN0aW9uKCl7fTtmLmNyZWF0ZVJlcXVlc3Q9ZnVuY3Rpb24oZSxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJhbmRvbUlkKCksbWV0aG9kOm4scGFyYW1zOnJ9fSxmLmNyZWF0ZVJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJlcXVlc3RJZCxkYXRhOm4sZXJyOnJ8fG51bGx9fTt2YXIgZz1mdW5jdGlvbihlLG4scil7dGhpcy5zdWJNYXA9ZSx0aGlzLmlkPXQucmFuZG9tSWQoKSx0aGlzLmV2ZW50TmFtZT1uLHRoaXMuZj1yfTtnLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuc3ViTWFwLnVuc3Vic2NyaWJlKHRoaXMuZXZlbnROYW1lLHRoaXMuaWQpfTt2YXIgbT1mdW5jdGlvbigpe3RoaXMuc3ViSWRNYXA9e30sdGhpcy5zdWJFdmVudE5hbWVNYXA9e319O20ucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBnKHRoaXMsZSx0KTt0aGlzLnN1YklkTWFwW24uaWRdPW47dmFyIHI9dGhpcy5zdWJFdmVudE5hbWVNYXBbZV18fFtdO3JldHVybiByLnB1c2gobiksdGhpcy5zdWJFdmVudE5hbWVNYXBbZV09cixufSxtLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlLG4pe3QuY29udGFpbnModGhpcy5zdWJFdmVudE5hbWVNYXAsZSkmJih0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkIT09bn0pKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5sZW5ndGg8MSYmZGVsZXRlIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdKSx0LmNvbnRhaW5zKHRoaXMuc3ViSWRNYXAsbikmJmRlbGV0ZSB0aGlzLnN1YklkTWFwW25dfSxtLnByb3RvdHlwZS5nZXRBbGxTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3ViRXZlbnROYW1lTWFwKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQpfSksW10pfSxtLnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W119O3ZhciB2PWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuc3ViTWFwPW5ldyBtLHRoaXMubG9nRXZlbnRzPXQubG9nRXZlbnRzfHwhMX07di5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKGUsbil9LHYucHJvdG90eXBlLnN1YnNjcmliZUFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuc3ViTWFwLnN1YnNjcmliZShuLGUpfSx2LnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpfSx2LnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKGUscil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpO3ZhciBvPXRoaXMsaT10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKG4pLHM9dGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhlKTt0aGlzLmxvZ0V2ZW50cyYmZSE9PXQuRXZlbnRUeXBlLkxPRyYmZSE9PXQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSYmZSE9PXQuRXZlbnRUeXBlLkFQSV9NRVRSSUMmJmUhPT10LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HJiZ0LmdldExvZygpLnRyYWNlKCJQdWJsaXNoaW5nIGV2ZW50OiAlcyIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLnN0YXJ0c1dpdGgodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSYmciYmci5jb250YWN0SWQmJiEociBpbnN0YW5jZW9mIHQuQ29udGFjdCkmJihyPW5ldyB0LkNvbnRhY3Qoci5jb250YWN0SWQpKSxpLmNvbmNhdChzKS5mb3JFYWNoKChmdW5jdGlvbihuKXt0cnl7bi5mKHJ8fG51bGwsZSxvKX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCInJXMnIGV2ZW50IGhhbmRsZXIgZmFpbGVkLiIsZSkud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKX0sdi5wcm90b3R5cGUuYnJpZGdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnRyaWdnZXIobix0KX19LHYucHJvdG90eXBlLnVuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAuZ2V0QWxsU3Vic2NyaXB0aW9ucygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0sdC5FdmVudEJ1cz12LHQuRXZlbnRGYWN0b3J5PWYsdC5FdmVudFR5cGU9cix0LkFnZW50RXZlbnRzPWksdC5Db25maWd1cmF0aW9uRXZlbnRzPXAsdC5Db25uZWN0aW9uRXZlbnRzPWwsdC5Db25ubmVjdGlvbkV2ZW50cz1sLHQuQ29udGFjdEV2ZW50cz1hLHQuQ2hhbm5lbFZpZXdFdmVudHM9Yyx0LlRhc2tFdmVudHM9dSx0LlZvaWNlSWRFdmVudHM9aCx0LldlYlNvY2tldEV2ZW50cz1zLHQuTWFzdGVyVG9waWNzPW8sdC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzPWR9KCl9LDI4NjooKT0+eyFmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiBuKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgbz10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfW4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQocixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LCJhIix0KSx0fSxuLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LG4ucD0iIixuKG4ucz0yKX0oW2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxvPSJERUJVRyIsaT0iQU1aX1dFQl9TT0NLRVRfTUFOQUdFUjoiLHM9Ik5ldHdvcmsgb2ZmbGluZSIsYT0iTmV0d29yayBvbmxpbmUsIGNvbm5lY3RpbmcgdG8gV2ViU29ja2V0IHNlcnZlciIsYz0iTmV0d29yayBvZmZsaW5lLCBpZ25vcmluZyB0aGlzIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCIsdT0iSGVhcnRiZWF0IHJlc3BvbnNlIG5vdCByZWNlaXZlZCIsbD0iRmFpbGVkIHRvIHNlbmQgaGVhcnRiZWF0IHNpbmNlIFdlYlNvY2tldCBpcyBub3Qgb3BlbiIscD0iV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQhIixkPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBjbG9zZWQiLGg9IldlYlNvY2tldE1hbmFnZXIgRXJyb3IsIGVycm9yX2V2ZW50OiAiLGY9IlNjaGVkdWxpbmcgV2ViU29ja2V0IHJlaW5pdGlhbGl6YXRpb24sIGFmdGVyIGRlbGF5ICIsZz0iV2ViU29ja2V0IFVSTCBjYW5ub3QgYmUgdXNlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiIsbT0iV2ViU29ja2V0IEluaXRpYWxpemF0aW9uIGZhaWxlZCAtIFRlcm1pbmF0aW5nIGFuZCBjbGVhbmluZyBzdWJzY3JpcHRpb25zIix2PSJGZXRjaGluZyBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIseT0iU3VjY2Vzc2Z1bGx5IGZldGNoZWQgd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsRT0iRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLFM9IlJldHJ5aW5nIGZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixiPSJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXIiLEM9IldlYlNvY2tldE1hbmFnZXIgTWVzc2FnZSBFcnJvciIsVD0iTWVzc2FnZSByZWNlaXZlZCBmb3IgdG9waWMgIixJPSJJbnZhbGlkIGluY29taW5nIG1lc3NhZ2UiLEE9ImF3cy9zdWJzY3JpYmUiLF89ImF3cy9oZWFydGJlYXQiLHc9ImRpc2Nvbm5lY3RlZCI7ZnVuY3Rpb24gUihlKXtyZXR1cm4oUj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfXZhciBrPXthc3NlcnRUcnVlOmZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKHQpfSxhc3NlcnROb3ROdWxsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGsuYXNzZXJ0VHJ1ZShudWxsIT09ZSYmdm9pZCAwIT09UihlKSxPYmplY3Qoci5zcHJpbnRmKSgiJXMgbXVzdCBiZSBwcm92aWRlZCIsdHx8IkEgdmFsdWUiKSksZX0saXNOb25FbXB0eVN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUubGVuZ3RoPjB9LGFzc2VydElzTGlzdDpmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGFuIGFycmF5Iil9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5KX0saXNPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuISgib2JqZWN0IiE9PVIoZSl8fG51bGw9PT1lKX0saXNTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfSxpc051bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9fSxMPW5ldyBSZWdFeHAoIl4od3NzOi8vKVxcdyoiKTtrLnZhbGlkV1NVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIEwudGVzdChlKX0say5nZXRTdWJzY3JpcHRpb25SZXNwb25zZT1mdW5jdGlvbihlLHQsbil7cmV0dXJue3RvcGljOmUsY29udGVudDp7c3RhdHVzOnQ/InN1Y2Nlc3MiOiJmYWlsdXJlIix0b3BpY3M6bn19fSxrLmFzc2VydElzT2JqZWN0PWZ1bmN0aW9uKGUsdCl7aWYoIWsuaXNPYmplY3QoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gb2JqZWN0ISIpfSxrLmFkZEppdHRlcj1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MTt0PU1hdGgubWluKHQsMSk7dmFyIG49TWF0aC5yYW5kb20oKT4uNT8xOi0xO3JldHVybiBNYXRoLmZsb29yKGUrbiplKk1hdGgucmFuZG9tKCkqdCl9LGsuaXNOZXR3b3JrT25saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5vbkxpbmV9LGsuaXNOZXR3b3JrRmFpbHVyZT1mdW5jdGlvbihlKXtyZXR1cm4hKCFlLl9kZWJ1Z3x8IWUuX2RlYnVnLnR5cGUpJiYiTmV0d29ya2luZ0Vycm9yIj09PWUuX2RlYnVnLnR5cGV9O3ZhciBOPWs7ZnVuY3Rpb24gTyhlKXtyZXR1cm4oTz1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfSkoZSl9ZnVuY3Rpb24gRChlLHQpe3JldHVybihEPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5fX3Byb3RvX189dCxlfSkoZSx0KX1mdW5jdGlvbiBQKGUpe3JldHVybihQPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9ZnVuY3Rpb24geChlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1mdW5jdGlvbiBVKGUsdCxuKXtyZXR1cm4gdCYmTShlLnByb3RvdHlwZSx0KSxuJiZNKGUsbiksZX12YXIgRj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSl9cmV0dXJuIFUoZSxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX1dKSxlfSgpLHE9aSxCPXtERUJVRzoxMCxJTkZPOjIwLFdBUk46MzAsRVJST1I6NDAsQURWQU5DRURfTE9HOjUwfSxqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKSx0aGlzLnVwZGF0ZUxvZ2dlckNvbmZpZygpLHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI9RygpfXJldHVybiBVKGUsW3trZXk6IndyaXRlVG9DbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5oYXNDbGllbnRMb2dnZXIoKSlzd2l0Y2goZSl7Y2FzZSBCLkRFQlVHOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuZGVidWcodCl8fHQ7Y2FzZSBCLklORk86cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5pbmZvKHQpfHx0O2Nhc2UgQi5XQVJOOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIud2Fybih0KXx8dDtjYXNlIEIuRVJST1I6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5lcnJvcih0KXx8dDtjYXNlIEIuQURWQU5DRURfTE9HOnJldHVybiB0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj90aGlzLl9jbGllbnRMb2dnZXJbdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXJdKHQpfHx0OiIifX19LHtrZXk6ImlzTGV2ZWxFbmFibGVkIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5fbGV2ZWx9fSx7a2V5OiJoYXNDbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLl9jbGllbnRMb2dnZXJ9fSx7a2V5OiJnZXRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUucHJlZml4fHxxO3JldHVybiB0aGlzLl9sb2dzRGVzdGluYXRpb249PT1vP3RoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI6bmV3IFcodCl9fSx7a2V5OiJ1cGRhdGVMb2dnZXJDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuX2xldmVsPXQubGV2ZWx8fEIuSU5GTyx0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj0id2FybiIsdC5hZHZhbmNlZExvZ1dyaXRlciYmKHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPXQuYWR2YW5jZWRMb2dXcml0ZXIpLHQuY3VzdG9taXplZExvZ2dlciYmIm9iamVjdCI9PT1QKHQuY3VzdG9taXplZExvZ2dlcikmJih0aGlzLnVzZUNsaWVudExvZ2dlcj0hMCksdGhpcy5fY2xpZW50TG9nZ2VyPXQubG9nZ2VyfHx0aGlzLnNlbGVjdExvZ2dlcih0KSx0aGlzLl9sb2dzRGVzdGluYXRpb249Ik5VTEwiLHQuZGVidWcmJih0aGlzLl9sb2dzRGVzdGluYXRpb249byksdC5sb2dnZXImJih0aGlzLl9sb2dzRGVzdGluYXRpb249IkNMSUVOVF9MT0dHRVIiKX19LHtrZXk6InNlbGVjdExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY3VzdG9taXplZExvZ2dlciYmIm9iamVjdCI9PT1QKGUuY3VzdG9taXplZExvZ2dlcik/ZS5jdXN0b21pemVkTG9nZ2VyOmUudXNlRGVmYXVsdExvZ2dlcj8odGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1HKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcik6bnVsbH19XSksZX0oKSxWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKX1yZXR1cm4gVShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKCl7fX1dKSxlfSgpLFc9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXt2YXIgbjtyZXR1cm4geCh0aGlzLHQpLChuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCJvYmplY3QiIT09UCh0KSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfShlKTp0fSh0aGlzLE8odCkuY2FsbCh0aGlzKSkpLnByZWZpeD1lfHxxLG59cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJkQoZSx0KX0odCxWKSxVKHQsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5ERUJVRyx0KX19LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLklORk8sdCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5XQVJOLHQpfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkVSUk9SLHQpfX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkFEVkFOQ0VEX0xPRyx0KX19LHtrZXk6Il9zaG91bGRMb2ciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBILmhhc0NsaWVudExvZ2dlcigpJiZILmlzTGV2ZWxFbmFibGVkKGUpfX0se2tleToiX3dyaXRlVG9DbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEgud3JpdGVUb0NsaWVudExvZ2dlcihlLHQpfX0se2tleToiX2xvZyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9zaG91bGRMb2coZSkpe3ZhciBuPUgudXNlQ2xpZW50TG9nZ2VyP3Q6dGhpcy5fY29udmVydFRvU2luZ2xlU3RhdGVtZW50KHQsZSk7cmV0dXJuIHRoaXMuX3dyaXRlVG9DbGllbnRMb2dnZXIoZSxuKX19fSx7a2V5OiJfY29udmVydFRvU2luZ2xlU3RhdGVtZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCkscj10aGlzLl9nZXRMb2dMZXZlbEJ5VmFsdWUodCksbz0iWyIuY29uY2F0KG4sIl1bIikuY29uY2F0KHIsIl0iKTt0aGlzLnByZWZpeCYmKG8rPXRoaXMucHJlZml4KyIgIiksdGhpcy5vcHRpb25zJiYodGhpcy5vcHRpb25zLnByZWZpeD9vKz0iICIrdGhpcy5vcHRpb25zLnByZWZpeCsiOiI6bys9IiIsdGhpcy5vcHRpb25zLmxvZ01ldGFEYXRhP28rPSIgTWV0YSBkYXRhOiAiK0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5sb2dNZXRhRGF0YSk6bys9IiIpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcz1lW2ldO28rPXRoaXMuX2NvbnZlcnRUb1N0cmluZyhzKSsiICJ9cmV0dXJuIG99fSx7a2V5OiJfZ2V0TG9nTGV2ZWxCeVZhbHVlIix2YWx1ZTpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSAxMDpyZXR1cm4iREVCVUciO2Nhc2UgMjA6cmV0dXJuIklORk8iO2Nhc2UgMzA6cmV0dXJuIldBUk4iO2Nhc2UgNDA6cmV0dXJuIkVSUk9SIjtjYXNlIDUwOnJldHVybiJBRFZBTkNFRF9MT0cifX19LHtrZXk6Il9jb252ZXJ0VG9TdHJpbmciLHZhbHVlOmZ1bmN0aW9uKGUpe3RyeXtpZighZSlyZXR1cm4iIjtpZihOLmlzU3RyaW5nKGUpKXJldHVybiBlO2lmKE4uaXNPYmplY3QoZSkmJk4uaXNGdW5jdGlvbihlLnRvU3RyaW5nKSl7dmFyIHQ9ZS50b1N0cmluZygpO2lmKCJbb2JqZWN0IE9iamVjdF0iIT09dClyZXR1cm4gdH1yZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHdoaWxlIGNvbnZlcnRpbmcgYXJndW1lbnQgdG8gc3RyaW5nIixlLHQpLCIifX19XSksdH0oKSxHPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFY7cmV0dXJuIGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5kZWJ1Zy5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLmluZm89ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5pbmZvLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLndhcm4uYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS5lcnJvcj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmVycm9yLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGV9LEg9bmV3IGo7ZnVuY3Rpb24geihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXZhciBLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MmUzOyFmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGUpLHRoaXMubnVtQXR0ZW1wdHM9MCx0aGlzLmV4ZWN1dG9yPXQsdGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITEsdGhpcy5kZWZhdWx0UmV0cnk9bn12YXIgdCxuO3JldHVybiB0PWUsKG49W3trZXk6InJldHJ5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb258fCh0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuX2V4ZWN1dGUoKX0pLHRoaXMuX2dldERlbGF5KCkpKX19LHtrZXk6Il9leGVjdXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSExLHRoaXMuZXhlY3V0b3IoKSx0aGlzLm51bUF0dGVtcHRzKyt9fSx7a2V5OiJjb25uZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5udW1BdHRlbXB0cz0wfX0se2tleToiX2dldERlbGF5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPU1hdGgucG93KDIsdGhpcy5udW1BdHRlbXB0cykqdGhpcy5kZWZhdWx0UmV0cnk7cmV0dXJuIGU8PTNlND9lOjNlNH19LHtrZXk6ImdldElzQ29ubmVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLm51bUF0dGVtcHRzfX1dKSYmeih0LnByb3RvdHlwZSxuKSxlfSgpO24uZCh0LCJhIiwoZnVuY3Rpb24oKXtyZXR1cm4gWX0pKTt2YXIgWD1mdW5jdGlvbigpe3ZhciBlPUguZ2V0TG9nZ2VyKHtwcmVmaXg6aX0pLHQ9Ti5pc05ldHdvcmtPbmxpbmUoKSxuPXtwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9LHI9e3JlY29ubmVjdFdlYlNvY2tldDohMCx3ZWJzb2NrZXRJbml0RmFpbGVkOiExLGV4cG9uZW50aWFsQmFja09mZlRpbWU6MWUzLGV4cG9uZW50aWFsVGltZW91dEhhbmRsZTpudWxsLGxpZmVUaW1lVGltZW91dEhhbmRsZTpudWxsLHdlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkOm51bGwsY29ublN0YXRlOm51bGx9LG89e2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50OjAsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6bnVsbCxub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpudWxsfSxSPXtwZW5kaW5nUmVzcG9uc2U6ITEsaW50ZXJ2YWxIYW5kbGU6bnVsbH0saz17aW5pdEZhaWx1cmU6bmV3IFNldCxnZXRXZWJTb2NrZXRUcmFuc3BvcnQ6bnVsbCxzdWJzY3JpcHRpb25VcGRhdGU6bmV3IFNldCxzdWJzY3JpcHRpb25GYWlsdXJlOm5ldyBTZXQsdG9waWM6bmV3IE1hcCxhbGxNZXNzYWdlOm5ldyBTZXQsY29ubmVjdGlvbkdhaW46bmV3IFNldCxjb25uZWN0aW9uTG9zdDpuZXcgU2V0LGNvbm5lY3Rpb25PcGVuOm5ldyBTZXQsY29ubmVjdGlvbkNsb3NlOm5ldyBTZXR9LEw9e2Nvbm5Db25maWc6bnVsbCxwcm9taXNlSGFuZGxlOm51bGwscHJvbWlzZUNvbXBsZXRlZDohMH0sTz17c3Vic2NyaWJlZDpuZXcgU2V0LHBlbmRpbmc6bmV3IFNldCxzdWJzY3JpcHRpb25IaXN0b3J5Om5ldyBTZXR9LEQ9e3Jlc3BvbnNlQ2hlY2tJbnRlcnZhbElkOm51bGwscmVxdWVzdENvbXBsZXRlZDohMCxyZVN1YnNjcmliZUludGVydmFsSWQ6bnVsbCxjb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzOjAsY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdDowfSxQPW5ldyBLKChmdW5jdGlvbigpe3NlKCl9KSkseD1uZXcgU2V0KFtBLCJhd3MvdW5zdWJzY3JpYmUiLF9dKSxNPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKHQhPT1OLmlzTmV0d29ya09ubGluZSgpKXtpZighKHQ9Ti5pc05ldHdvcmtPbmxpbmUoKSkpcmV0dXJuIGUuYWR2YW5jZWRMb2cocyksdm9pZCB1ZShlLmluZm8ocykpO3ZhciBuPVcoKTt0JiYoIW58fEIobixXZWJTb2NrZXQuQ0xPU0lORyl8fEIobixXZWJTb2NrZXQuQ0xPU0VEKSkmJihlLmFkdmFuY2VkTG9nKGEpLHVlKGUuaW5mbyhhKSksc2UoKSl9fSksMjUwKSxVPWZ1bmN0aW9uKHQsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0cnl7dChuKX1jYXRjaCh0KXt1ZShlLmVycm9yKCJFcnJvciBleGVjdXRpbmcgY2FsbGJhY2siLHQpKX19KSl9LEY9ZnVuY3Rpb24oZSl7aWYobnVsbD09PWUpcmV0dXJuIk5VTEwiO3N3aXRjaChlLnJlYWR5U3RhdGUpe2Nhc2UgV2ViU29ja2V0LkNPTk5FQ1RJTkc6cmV0dXJuIkNPTk5FQ1RJTkciO2Nhc2UgV2ViU29ja2V0Lk9QRU46cmV0dXJuIk9QRU4iO2Nhc2UgV2ViU29ja2V0LkNMT1NJTkc6cmV0dXJuIkNMT1NJTkciO2Nhc2UgV2ViU29ja2V0LkNMT1NFRDpyZXR1cm4iQ0xPU0VEIjtkZWZhdWx0OnJldHVybiJVTkRFRklORUQifX0scT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIjt1ZShlLmRlYnVnKCJbIit0KyJdIFByaW1hcnkgV2ViU29ja2V0OiAiK0Yobi5wcmltYXJ5KSsiIHwgU2Vjb25kYXJ5IFdlYlNvY2tldDogIitGKG4uc2Vjb25kYXJ5KSkpfSxCPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUucmVhZHlTdGF0ZT09PXR9LGo9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSxXZWJTb2NrZXQuT1BFTil9LFY9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1lLnJlYWR5U3RhdGV8fEIoZSxXZWJTb2NrZXQuQ0xPU0VEKX0sVz1mdW5jdGlvbigpe3JldHVybiBudWxsIT09bi5zZWNvbmRhcnk/bi5zZWNvbmRhcnk6bi5wcmltYXJ5fSxHPWZ1bmN0aW9uKCl7cmV0dXJuIGooVygpKX0sej1mdW5jdGlvbigpe2lmKFIucGVuZGluZ1Jlc3BvbnNlKXJldHVybiBlLmFkdmFuY2VkTG9nKHUpLHVlKGUud2Fybih1KSksY2xlYXJJbnRlcnZhbChSLmludGVydmFsSGFuZGxlKSxSLnBlbmRpbmdSZXNwb25zZT0hMSx2b2lkIHNlKCk7RygpPyh1ZShlLmRlYnVnKCJTZW5kaW5nIGhlYXJ0YmVhdCIpKSxXKCkuc2VuZChvZShfKSksUi5wZW5kaW5nUmVzcG9uc2U9ITApOihlLmFkdmFuY2VkTG9nKGwpLHVlKGUud2FybihsKSkscSgic2VuZEhlYXJ0QmVhdCIpLHNlKCkpfSxYPWZ1bmN0aW9uKCl7ZS5hZHZhbmNlZExvZygiUmVzZXQgV2Vic29ja2V0IHN0YXRlIiksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lPTFlMyxSLnBlbmRpbmdSZXNwb25zZT0hMSxyLnJlY29ubmVjdFdlYlNvY2tldD0hMCxjbGVhclRpbWVvdXQoci5saWZlVGltZVRpbWVvdXRIYW5kbGUpLGNsZWFySW50ZXJ2YWwoUi5pbnRlcnZhbEhhbmRsZSksY2xlYXJUaW1lb3V0KHIuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlKSxjbGVhclRpbWVvdXQoci53ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZCl9LFk9ZnVuY3Rpb24oKXtELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCxjbGVhckludGVydmFsKEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQpLGNsZWFySW50ZXJ2YWwoRC5yZVN1YnNjcmliZUludGVydmFsSWQpfSwkPWZ1bmN0aW9uKCl7by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudD0wLG8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU9bnVsbCxvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wPW51bGx9LEo9ZnVuY3Rpb24oKXtQLmNvbm5lY3RlZCgpO3RyeXtlLmFkdmFuY2VkTG9nKHApLHVlKGUuaW5mbyhwKSkscSgid2ViU29ja2V0T25PcGVuIiksbnVsbCE9PXIuY29ublN0YXRlJiZyLmNvbm5TdGF0ZSE9PXd8fFUoay5jb25uZWN0aW9uR2Fpbiksci5jb25uU3RhdGU9ImNvbm5lY3RlZCI7dmFyIHQ9RGF0ZS5ub3coKTtVKGsuY29ubmVjdGlvbk9wZW4se2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Om8uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSxub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wLGNvbm5lY3Rpb25Fc3RhYmxpc2hlZFRpbWU6dCx0aW1lVG9Db25uZWN0OnQtby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSx0aW1lV2l0aG91dENvbm5lY3Rpb246by5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD90LW8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6bnVsbH0pLCQoKSxYKCksVygpLm9wZW5UaW1lc3RhbXA9RGF0ZS5ub3coKSwwPT09Ty5zdWJzY3JpYmVkLnNpemUmJmoobi5zZWNvbmRhcnkpJiZ0ZShuLnByaW1hcnksIltQcmltYXJ5IFdlYlNvY2tldF0gQ2xvc2luZyBXZWJTb2NrZXQiKSwoTy5zdWJzY3JpYmVkLnNpemU+MHx8Ty5wZW5kaW5nLnNpemU+MCkmJihqKG4uc2Vjb25kYXJ5KSYmdWUoZS5pbmZvKCJTdWJzY3JpYmluZyBzZWNvbmRhcnkgd2Vic29ja2V0IHRvIHRvcGljcyBvZiBwcmltYXJ5IHdlYnNvY2tldCIpKSxPLnN1YnNjcmliZWQuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpcHRpb25IaXN0b3J5LmFkZChlKSxPLnBlbmRpbmcuYWRkKGUpfSkpLE8uc3Vic2NyaWJlZC5jbGVhcigpLGVlKCkpLHooKSxSLmludGVydmFsSGFuZGxlPXNldEludGVydmFsKHosMWU0KTt2YXIgaT0xZTMqTC5jb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kczt1ZShlLmRlYnVnKCJTY2hlZHVsaW5nIFdlYlNvY2tldCBtYW5hZ2VyIHJlY29ubmVjdGlvbiwgYWZ0ZXIgZGVsYXkgIitpKyIgbXMiKSksci5saWZlVGltZVRpbWVvdXRIYW5kbGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt1ZShlLmRlYnVnKCJTdGFydGluZyBzY2hlZHVsZWQgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0aW9uIikpLHNlKCl9KSxpKX1jYXRjaCh0KXt1ZShlLmVycm9yKCJFcnJvciBhZnRlciBlc3RhYmxpc2hpbmcgV2ViU29ja2V0IGNvbm5lY3Rpb24iLHQpKX19LFE9ZnVuY3Rpb24odCl7cSgid2ViU29ja2V0T25FcnJvciIpLGUuYWR2YW5jZWRMb2coaCxKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5lcnJvcihoLEpTT04uc3RyaW5naWZ5KHQpKSksUC5nZXRJc0Nvbm5lY3RlZCgpP3NlKCk6UC5yZXRyeSgpfSxaPWZ1bmN0aW9uKHQpe3ZhciByPUpTT04ucGFyc2UodC5kYXRhKTtzd2l0Y2goci50b3BpYyl7Y2FzZSBBOmlmKHVlKGUuZGVidWcoIlN1YnNjcmlwdGlvbiBNZXNzYWdlIHJlY2VpdmVkIGZyb20gd2ViU29ja2V0IHNlcnZlciIsdC5kYXRhKSksRC5yZXF1ZXN0Q29tcGxldGVkPSEwLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLCJzdWNjZXNzIj09PXIuY29udGVudC5zdGF0dXMpRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTAsci5jb250ZW50LnRvcGljcy5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmlwdGlvbkhpc3RvcnkuZGVsZXRlKGUpLE8ucGVuZGluZy5kZWxldGUoZSksTy5zdWJzY3JpYmVkLmFkZChlKX0pKSwwPT09Ty5zdWJzY3JpcHRpb25IaXN0b3J5LnNpemU/aihuLnNlY29uZGFyeSkmJih1ZShlLmluZm8oIlN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHNlY29uZGFyeSB3ZWJzb2NrZXQgdG8gYWxsIHRvcGljcyBvZiBwcmltYXJ5IHdlYnNvY2tldCIpKSx0ZShuLnByaW1hcnksIltQcmltYXJ5IFdlYlNvY2tldF0gQ2xvc2luZyBXZWJTb2NrZXQiKSk6ZWUoKSxVKGsuc3Vic2NyaXB0aW9uVXBkYXRlLHIpO2Vsc2V7aWYoY2xlYXJJbnRlcnZhbChELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZCksKytELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHMsNT09PUQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cylyZXR1cm4gVShrLnN1YnNjcmlwdGlvbkZhaWx1cmUsciksdm9pZChELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCk7RC5yZVN1YnNjcmliZUludGVydmFsSWQ9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7ZWUoKX0pLDUwMCl9YnJlYWs7Y2FzZSBfOnVlKGUuZGVidWcoIkhlYXJ0YmVhdCByZXNwb25zZSByZWNlaXZlZCIpKSxSLnBlbmRpbmdSZXNwb25zZT0hMTticmVhaztkZWZhdWx0OmlmKHIudG9waWMpe2lmKGUuYWR2YW5jZWRMb2coVCxyLnRvcGljKSx1ZShlLmRlYnVnKFQrci50b3BpYykpLGoobi5wcmltYXJ5KSYmaihuLnNlY29uZGFyeSkmJjA9PT1PLnN1YnNjcmlwdGlvbkhpc3Rvcnkuc2l6ZSYmdGhpcz09PW4ucHJpbWFyeSlyZXR1cm4gdm9pZCB1ZShlLndhcm4oIklnbm9yaW5nIE1lc3NhZ2UgZm9yIFRvcGljICIrci50b3BpYysiLCB0byBhdm9pZCBkdXBsaWNhdGVzIikpO2lmKDA9PT1rLmFsbE1lc3NhZ2Uuc2l6ZSYmMD09PWsudG9waWMuc2l6ZSlyZXR1cm4gdm9pZCB1ZShlLndhcm4oIk5vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgbGlzdGVuZXIgZm9yIFRvcGljIixyLnRvcGljKSk7ZS5hZHZhbmNlZExvZygiV2Vic29ja2V0TWFuYWdlciBpbnZva2UgY2FsbGJhY2tzIGZvciB0b3BpYyBzdWNjZXNzICIsci50b3BpYyksVShrLmFsbE1lc3NhZ2Usciksay50b3BpYy5oYXMoci50b3BpYykmJlUoay50b3BpYy5nZXQoci50b3BpYykscil9ZWxzZSByLm1lc3NhZ2U/KGUuYWR2YW5jZWRMb2coQyxyKSx1ZShlLndhcm4oQyxyKSkpOihlLmFkdmFuY2VkTG9nKEksciksdWUoZS53YXJuKEkscikpKX19LGVlPWZ1bmN0aW9uIHQoKXtpZihELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q+MylyZXR1cm4gdWUoZS53YXJuKCJJZ25vcmluZyBzdWJzY3JpYmVQZW5kaW5nVG9waWNzIHNpbmNlIHdlIGhhdmUgZXhoYXVzdGVkIG1heCBzdWJzY3JpcHRpb24gcmV0cmllcyB3aXRoIG5vIHJlc3BvbnNlIikpLHZvaWQgVShrLnN1YnNjcmlwdGlvbkZhaWx1cmUsTi5nZXRTdWJzY3JpcHRpb25SZXNwb25zZShBLCExLEFycmF5LmZyb20oTy5wZW5kaW5nKSkpO0coKT8wIT09QXJyYXkuZnJvbShPLnBlbmRpbmcpLmxlbmd0aCYmKGNsZWFySW50ZXJ2YWwoRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZCksVygpLnNlbmQob2UoQSx7dG9waWNzOkFycmF5LmZyb20oTy5wZW5kaW5nKX0pKSxELnJlcXVlc3RDb21wbGV0ZWQ9ITEsRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtELnJlcXVlc3RDb21wbGV0ZWR8fCgrK0QuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdCx0KCkpfSksMWUzKSk6dWUoZS53YXJuKCJJZ25vcmluZyBzdWJzY3JpYmVQZW5kaW5nVG9waWNzIGNhbGwgc2luY2UgRGVmYXVsdCBXZWJTb2NrZXQgaXMgbm90IG9wZW4iKSl9LHRlPWZ1bmN0aW9uKHQsbil7Qih0LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8Qih0LFdlYlNvY2tldC5PUEVOKT90LmNsb3NlKDFlMyxuKTp1ZShlLndhcm4oIklnbm9yaW5nIFdlYlNvY2tldCBDbG9zZSByZXF1ZXN0LCBXZWJTb2NrZXQgU3RhdGU6ICIrRih0KSkpfSxuZT1mdW5jdGlvbihlKXt0ZShuLnByaW1hcnksIltQcmltYXJ5XSBXZWJTb2NrZXQgIitlKSx0ZShuLnNlY29uZGFyeSwiW1NlY29uZGFyeV0gV2ViU29ja2V0ICIrZSl9LHJlPWZ1bmN0aW9uKHQpe1goKSxZKCksZS5hZHZhbmNlZExvZyhtLHQpLHVlKGUuZXJyb3IobSkpLHIud2Vic29ja2V0SW5pdEZhaWxlZD0hMCxuZSgiVGVybWluYXRpbmcgV2ViU29ja2V0IE1hbmFnZXIiKSxjbGVhckludGVydmFsKE0pLFUoay5pbml0RmFpbHVyZSx7Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLHJlYXNvbjp0fSksJCgpfSxvZT1mdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh7dG9waWM6ZSxjb250ZW50OnR9KX0saWU9ZnVuY3Rpb24odCl7cmV0dXJuISEoTi5pc09iamVjdCh0KSYmTi5pc09iamVjdCh0LndlYlNvY2tldFRyYW5zcG9ydCkmJk4uaXNOb25FbXB0eVN0cmluZyh0LndlYlNvY2tldFRyYW5zcG9ydC51cmwpJiZOLnZhbGlkV1NVcmwodC53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKSYmMWUzKnQud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzPj0zZTUpfHwodWUoZS5lcnJvcigiSW52YWxpZCBXZWJTb2NrZXQgQ29ubmVjdGlvbiBDb25maWd1cmF0aW9uIix0KSksITEpfSxzZT1mdW5jdGlvbigpe2lmKCFOLmlzTmV0d29ya09ubGluZSgpKXJldHVybiBlLmFkdmFuY2VkTG9nKGMpLHZvaWQgdWUoZS5pbmZvKGMpKTtpZihyLndlYnNvY2tldEluaXRGYWlsZWQpdWUoZS5kZWJ1ZygiV2ViU29ja2V0IEluaXQgaGFkIGZhaWxlZCwgaWdub3JpbmcgdGhpcyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QiKSk7ZWxzZXtpZihMLnByb21pc2VDb21wbGV0ZWQpcmV0dXJuIFgoKSxlLmFkdmFuY2VkTG9nKHYpLHVlKGUuaW5mbyh2KSksby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZT1vLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lfHxEYXRlLm5vdygpLEwucHJvbWlzZUNvbXBsZXRlZD0hMSxMLnByb21pc2VIYW5kbGU9ay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQoKSxMLnByb21pc2VIYW5kbGUudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIEwucHJvbWlzZUNvbXBsZXRlZD0hMCxlLmFkdmFuY2VkTG9nKHkpLHVlKGUuZGVidWcoeSx0KSksaWUodCk/KEwuY29ubkNvbmZpZz10LEwuY29ubkNvbmZpZy51cmxDb25uVmFsaWRUaW1lPURhdGUubm93KCkrODVlMyxhZSgpKToocmUoIkludmFsaWQgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbjogIit0KSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH0pfSksKGZ1bmN0aW9uKHQpe3JldHVybiBMLnByb21pc2VDb21wbGV0ZWQ9ITAsZS5hZHZhbmNlZExvZyhFKSx1ZShlLmVycm9yKEUsdCkpLE4uaXNOZXR3b3JrRmFpbHVyZSh0KT8oZS5hZHZhbmNlZExvZyhTK0pTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmluZm8oUytKU09OLnN0cmluZ2lmeSh0KSkpLFAucmV0cnkoKSk6cmUoIkZhaWxlZCB0byBmZXRjaCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uOiAiK0pTT04uc3RyaW5naWZ5KHQpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH19KSk7dWUoZS5kZWJ1ZygiVGhlcmUgaXMgYW4gb25nb2luZyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QsIHRoaXMgcmVxdWVzdCB3aWxsIGJlIGlnbm9yZWQiKSl9fSxhZT1mdW5jdGlvbigpe2lmKHIud2Vic29ja2V0SW5pdEZhaWxlZClyZXR1cm4gdWUoZS5pbmZvKCJ3ZWItc29ja2V0IGluaXRpYWxpemluZyBoYWQgZmFpbGVkLCBhYm9ydGluZyByZS1pbml0IikpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfTtpZighTi5pc05ldHdvcmtPbmxpbmUoKSlyZXR1cm4gdWUoZS53YXJuKCJTeXN0ZW0gaXMgb2ZmbGluZSBhYm9ydGluZyB3ZWItc29ja2V0IGluaXQiKSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9O2UuYWR2YW5jZWRMb2coYiksdWUoZS5pbmZvKGIpKSxxKCJpbml0V2ViU29ja2V0Iik7dHJ5e2lmKGllKEwuY29ubkNvbmZpZykpe3ZhciB0PW51bGw7cmV0dXJuIGoobi5wcmltYXJ5KT8odWUoZS5kZWJ1ZygiUHJpbWFyeSBTb2NrZXQgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG9wZW4iKSksQihuLnNlY29uZGFyeSxXZWJTb2NrZXQuQ09OTkVDVElORyl8fCh1ZShlLmRlYnVnKCJFc3RhYmxpc2hpbmcgYSBzZWNvbmRhcnkgd2ViLXNvY2tldCBjb25uZWN0aW9uIikpLFAubnVtQXR0ZW1wdHM9MCxuLnNlY29uZGFyeT1jZSgpKSx0PW4uc2Vjb25kYXJ5KTooQihuLnByaW1hcnksV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHwodWUoZS5kZWJ1ZygiRXN0YWJsaXNoaW5nIGEgcHJpbWFyeSB3ZWItc29ja2V0IGNvbm5lY3Rpb24iKSksbi5wcmltYXJ5PWNlKCkpLHQ9bi5wcmltYXJ5KSxyLndlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aih0KXx8ZnVuY3Rpb24oKXtvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Kys7dmFyIHQ9Ti5hZGRKaXR0ZXIoci5leHBvbmVudGlhbEJhY2tPZmZUaW1lLC4zKTtEYXRlLm5vdygpK3Q8PUwuY29ubkNvbmZpZy51cmxDb25uVmFsaWRUaW1lPyhlLmFkdmFuY2VkTG9nKGYpLHVlKGUuZGVidWcoZit0KyIgbXMiKSksci5leHBvbmVudGlhbFRpbWVvdXRIYW5kbGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gYWUoKX0pLHQpLHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZSo9Mik6KGUuYWR2YW5jZWRMb2coZyksdWUoZS53YXJuKGcpKSxzZSgpKX0oKX0pLDFlMykse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITF9fX1jYXRjaCh0KXtyZXR1cm4gdWUoZS5lcnJvcigiRXJyb3IgSW5pdGlhbGl6aW5nIHdlYi1zb2NrZXQtbWFuYWdlciIsdCkpLHJlKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBuZXcgV2ViU29ja2V0OiAiK3QubWVzc2FnZSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9fX0sY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgV2ViU29ja2V0KEwuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIixKKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFopLHQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLFEpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLChmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24odCxpKXtlLmFkdmFuY2VkTG9nKGQsSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuaW5mbyhkLEpTT04uc3RyaW5naWZ5KHQpKSkscSgid2ViU29ja2V0T25DbG9zZSBiZWZvcmUtY2xlYW51cCIpLFUoay5jb25uZWN0aW9uQ2xvc2Use29wZW5UaW1lc3RhbXA6aS5vcGVuVGltZXN0YW1wLGNsb3NlVGltZXN0YW1wOkRhdGUubm93KCksY29ubmVjdGlvbkR1cmF0aW9uOkRhdGUubm93KCktaS5vcGVuVGltZXN0YW1wLGNvZGU6dC5jb2RlLHJlYXNvbjp0LnJlYXNvbn0pLFYobi5wcmltYXJ5KSYmKG4ucHJpbWFyeT1udWxsKSxWKG4uc2Vjb25kYXJ5KSYmKG4uc2Vjb25kYXJ5PW51bGwpLHIucmVjb25uZWN0V2ViU29ja2V0JiYoaihuLnByaW1hcnkpfHxqKG4uc2Vjb25kYXJ5KT9WKG4ucHJpbWFyeSkmJmoobi5zZWNvbmRhcnkpJiYodWUoZS5pbmZvKCJbUHJpbWFyeV0gV2ViU29ja2V0IENsZWFubHkgQ2xvc2VkIikpLG4ucHJpbWFyeT1uLnNlY29uZGFyeSxuLnNlY29uZGFyeT1udWxsKToodWUoZS53YXJuKCJOZWl0aGVyIHByaW1hcnkgd2Vic29ja2V0IGFuZCBub3Igc2Vjb25kYXJ5IHdlYnNvY2tldCBoYXZlIG9wZW4gY29ubmVjdGlvbnMsIGF0dGVtcHRpbmcgdG8gcmUtZXN0YWJsaXNoIGNvbm5lY3Rpb24iKSksci5jb25uU3RhdGU9PT13P3VlKGUuaW5mbygiSWdub3JpbmcgY29ubmVjdGlvbkxvc3QgY2FsbGJhY2sgaW52b2NhdGlvbiIpKTooVShrLmNvbm5lY3Rpb25Mb3N0LHtvcGVuVGltZXN0YW1wOmkub3BlblRpbWVzdGFtcCxjbG9zZVRpbWVzdGFtcDpEYXRlLm5vdygpLGNvbm5lY3Rpb25EdXJhdGlvbjpEYXRlLm5vdygpLWkub3BlblRpbWVzdGFtcCxjb2RlOnQuY29kZSxyZWFzb246dC5yZWFzb259KSxvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wPURhdGUubm93KCkpLHIuY29ublN0YXRlPXcsc2UoKSkscSgid2ViU29ja2V0T25DbG9zZSBhZnRlci1jbGVhbnVwIikpfShpLHQpfSkpLHR9LHVlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlciYmZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGV9O3RoaXMuaW5pdD1mdW5jdGlvbih0KXtpZihOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJ0cmFuc3BvcnRIYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIiksbnVsbD09PWsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0KXJldHVybiBrLmdldFdlYlNvY2tldFRyYW5zcG9ydD10LHNlKCk7dWUoZS53YXJuKCJXZWIgU29ja2V0IE1hbmFnZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiSW5pdGlhbGl6aW5nIFdlYnNvY2tldCBNYW5hZ2VyIEZhaWxlZCEiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmluaXRGYWlsdXJlLmFkZCh0KSxyLndlYnNvY2tldEluaXRGYWlsZWQmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmluaXRGYWlsdXJlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uT3Blbj1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gb3BlbiIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbk9wZW4uYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbk9wZW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25DbG9zZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gY2xvc2UiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25DbG9zZS5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uQ2xvc2UuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25HYWluPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBnYWluIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uR2Fpbi5hZGQodCksRygpJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uR2Fpbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGxvc3QiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25Mb3N0LmFkZCh0KSxyLmNvbm5TdGF0ZT09PXcmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25Mb3N0LmRlbGV0ZSh0KX19LHRoaXMub25TdWJzY3JpcHRpb25VcGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24oZSksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuc3Vic2NyaXB0aW9uVXBkYXRlLmFkZChlKSxmdW5jdGlvbigpe3JldHVybiBrLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUoZSl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uRmFpbHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IHN1YnNjcmlwdGlvbiBmYWlsdXJlIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTi5hc3NlcnROb3ROdWxsKGUsInRvcGljTmFtZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsudG9waWMuaGFzKGUpP2sudG9waWMuZ2V0KGUpLmFkZCh0KTprLnRvcGljLnNldChlLG5ldyBTZXQoW3RdKSksZnVuY3Rpb24oKXtyZXR1cm4gay50b3BpYy5nZXQoZSkuZGVsZXRlKHQpfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24oZSksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuYWxsTWVzc2FnZS5hZGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gay5hbGxNZXNzYWdlLmRlbGV0ZShlKX19LHRoaXMuc3Vic2NyaWJlVG9waWNzPWZ1bmN0aW9uKGUpe04uYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY3MiKSxOLmFzc2VydElzTGlzdChlKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaWJlZC5oYXMoZSl8fE8ucGVuZGluZy5hZGQoZSl9KSksRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsZWUoKX0sdGhpcy5zZW5kTWVzc2FnZT1mdW5jdGlvbih0KXtpZihOLmFzc2VydElzT2JqZWN0KHQsInBheWxvYWQiKSx2b2lkIDA9PT10LnRvcGljfHx4Lmhhcyh0LnRvcGljKSl1ZShlLndhcm4oIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIEludmFsaWQgdG9waWMiLHQpKTtlbHNle3RyeXt0PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKG4pe3JldHVybiB2b2lkIHVlKGUud2FybigiRXJyb3Igc3RyaW5naWZ5IG1lc3NhZ2UiLHQpKX1HKCk/VygpLnNlbmQodCk6dWUoZS53YXJuKCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IG9wZW4iKSl9fSx0aGlzLmNsb3NlV2ViU29ja2V0PWZ1bmN0aW9uKCl7WCgpLFkoKSxyLnJlY29ubmVjdFdlYlNvY2tldD0hMSxjbGVhckludGVydmFsKE0pLG5lKCJVc2VyIHJlcXVlc3QgdG8gY2xvc2UgV2ViU29ja2V0Iil9LHRoaXMudGVybWluYXRlV2ViU29ja2V0TWFuYWdlcj1yZX0sWT17Y3JlYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSxzZXRHbG9iYWxDb25maWc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5sb2dnZXJDb25maWc7SC51cGRhdGVMb2dnZXJDb25maWcodCl9LExvZ0xldmVsOkIsTG9nZ2VyOkZ9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBvPXtub3Rfc3RyaW5nOi9bXnNdLyxub3RfYm9vbDovW150XS8sbm90X3R5cGU6L1teVF0vLG5vdF9wcmltaXRpdmU6L1tedl0vLG51bWJlcjovW2RpZWZnXS8sbnVtZXJpY19hcmc6L1tiY2RpZWZndXhYXS8sanNvbjovW2pdLyxub3RfanNvbjovW15qXS8sdGV4dDovXlteXHgyNV0rLyxtb2R1bG86L15ceDI1ezJ9LyxwbGFjZWhvbGRlcjovXlx4MjUoPzooWzEtOV1cZCopXCR8XCgoW14pXSspXCkpPyhcKyk/KDB8J1teJF0pPygtKT8oXGQrKT8oPzpcLihcZCspKT8oW2ItZ2lqb3N0VHV2eFhdKS8sa2V5Oi9eKFthLXpfXVthLXpfXGRdKikvaSxrZXlfYWNjZXNzOi9eXC4oW2Etel9dW2Etel9cZF0qKS9pLGluZGV4X2FjY2VzczovXlxbKFxkKylcXS8sc2lnbjovXlsrLV0vfTtmdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhLGMsdSxsLHAsZCxoPTEsZj1lLmxlbmd0aCxnPSIiO2ZvcihyPTA7cjxmO3IrKylpZigic3RyaW5nIj09dHlwZW9mIGVbcl0pZys9ZVtyXTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZVtyXSl7aWYoKGE9ZVtyXSkua2V5cylmb3Iobj10W2hdLHM9MDtzPGEua2V5cy5sZW5ndGg7cysrKXtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcihpKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSAiJXMiIG9mIHVuZGVmaW5lZCB2YWx1ZSAiJXMiJyxhLmtleXNbc10sYS5rZXlzW3MtMV0pKTtuPW5bYS5rZXlzW3NdXX1lbHNlIG49YS5wYXJhbV9ubz90W2EucGFyYW1fbm9dOnRbaCsrXTtpZihvLm5vdF90eXBlLnRlc3QoYS50eXBlKSYmby5ub3RfcHJpbWl0aXZlLnRlc3QoYS50eXBlKSYmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYobj1uKCkpLG8ubnVtZXJpY19hcmcudGVzdChhLnR5cGUpJiYibnVtYmVyIiE9dHlwZW9mIG4mJmlzTmFOKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoaSgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVUIixuKSk7c3dpdGNoKG8ubnVtYmVyLnRlc3QoYS50eXBlKSYmKHA9bj49MCksYS50eXBlKXtjYXNlImIiOm49cGFyc2VJbnQobiwxMCkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjpuPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobiwxMCkpO2JyZWFrO2Nhc2UiZCI6Y2FzZSJpIjpuPXBhcnNlSW50KG4sMTApO2JyZWFrO2Nhc2UiaiI6bj1KU09OLnN0cmluZ2lmeShuLG51bGwsYS53aWR0aD9wYXJzZUludChhLndpZHRoKTowKTticmVhaztjYXNlImUiOm49YS5wcmVjaXNpb24/cGFyc2VGbG9hdChuKS50b0V4cG9uZW50aWFsKGEucHJlY2lzaW9uKTpwYXJzZUZsb2F0KG4pLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOm49YS5wcmVjaXNpb24/cGFyc2VGbG9hdChuKS50b0ZpeGVkKGEucHJlY2lzaW9uKTpwYXJzZUZsb2F0KG4pO2JyZWFrO2Nhc2UiZyI6bj1hLnByZWNpc2lvbj9TdHJpbmcoTnVtYmVyKG4udG9QcmVjaXNpb24oYS5wcmVjaXNpb24pKSk6cGFyc2VGbG9hdChuKTticmVhaztjYXNlIm8iOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjpuPVN0cmluZyhuKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ0IjpuPVN0cmluZyghIW4pLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlIlQiOm49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UidSI6bj1wYXJzZUludChuLDEwKT4+PjA7YnJlYWs7Y2FzZSJ2IjpuPW4udmFsdWVPZigpLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlIngiOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1vLmpzb24udGVzdChhLnR5cGUpP2crPW46KCFvLm51bWJlci50ZXN0KGEudHlwZSl8fHAmJiFhLnNpZ24/ZD0iIjooZD1wPyIrIjoiLSIsbj1uLnRvU3RyaW5nKCkucmVwbGFjZShvLnNpZ24sIiIpKSx1PWEucGFkX2NoYXI/IjAiPT09YS5wYWRfY2hhcj8iMCI6YS5wYWRfY2hhci5jaGFyQXQoMSk6IiAiLGw9YS53aWR0aC0oZCtuKS5sZW5ndGgsYz1hLndpZHRoJiZsPjA/dS5yZXBlYXQobCk6IiIsZys9YS5hbGlnbj9kK24rYzoiMCI9PT11P2QrYytuOmMrZCtuKX1yZXR1cm4gZ30oZnVuY3Rpb24oZSl7aWYoYVtlXSlyZXR1cm4gYVtlXTtmb3IodmFyIHQsbj1lLHI9W10saT0wO247KXtpZihudWxsIT09KHQ9by50ZXh0LmV4ZWMobikpKXIucHVzaCh0WzBdKTtlbHNlIGlmKG51bGwhPT0odD1vLm1vZHVsby5leGVjKG4pKSlyLnB1c2goIiUiKTtlbHNle2lmKG51bGw9PT0odD1vLnBsYWNlaG9sZGVyLmV4ZWMobikpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXIiKTtpZih0WzJdKXtpfD0xO3ZhciBzPVtdLGM9dFsyXSx1PVtdO2lmKG51bGw9PT0odT1vLmtleS5leGVjKGMpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5Iik7Zm9yKHMucHVzaCh1WzFdKTsiIiE9PShjPWMuc3Vic3RyaW5nKHVbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0odT1vLmtleV9hY2Nlc3MuZXhlYyhjKSkpcy5wdXNoKHVbMV0pO2Vsc2V7aWYobnVsbD09PSh1PW8uaW5kZXhfYWNjZXNzLmV4ZWMoYykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTtzLnB1c2godVsxXSl9dFsyXT1zfWVsc2UgaXw9MjtpZigzPT09aSl0aHJvdyBuZXcgRXJyb3IoIltzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQiKTtyLnB1c2goe3BsYWNlaG9sZGVyOnRbMF0scGFyYW1fbm86dFsxXSxrZXlzOnRbMl0sc2lnbjp0WzNdLHBhZF9jaGFyOnRbNF0sYWxpZ246dFs1XSx3aWR0aDp0WzZdLHByZWNpc2lvbjp0WzddLHR5cGU6dFs4XX0pfW49bi5zdWJzdHJpbmcodFswXS5sZW5ndGgpfXJldHVybiBhW2VdPXJ9KGUpLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBpLmFwcGx5KG51bGwsW2VdLmNvbmNhdCh0fHxbXSkpfXZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7dC5zcHJpbnRmPWksdC52c3ByaW50Zj1zLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnNwcmludGY9aSx3aW5kb3cudnNwcmludGY9cyx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybntzcHJpbnRmOmksdnNwcmludGY6c319LmNhbGwodCxuLHQsZSkpfHwoZS5leHBvcnRzPXIpKX0oKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksZnVuY3Rpb24oZSl7bi5kKHQsIldlYlNvY2tldE1hbmFnZXIiLChmdW5jdGlvbigpe3JldHVybiBvfSkpO3ZhciByPW4oMCk7ZS5jb25uZWN0PWUuY29ubmVjdHx8e30sY29ubmVjdC5XZWJTb2NrZXRNYW5hZ2VyPXIuYTt2YXIgbz1yLmF9LmNhbGwodGhpcyxuKDMpKX0sZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59XSl9LDE1MTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPXtURVNUOiJURVNUIixUUkFDRToiVFJBQ0UiLERFQlVHOiJERUJVRyIsSU5GTzoiSU5GTyIsTE9HOiJMT0ciLFdBUk46IldBUk4iLEVSUk9SOiJFUlJPUiIsQ1JJVElDQUw6IkNSSVRJQ0FMIn0scj17Q0NQOiJjY3AiLFNPRlRQSE9ORToic29mdHBob25lIixDSEFUOiJjaGF0IixUQVNLOiJ0YXNrIn0sbz17VEVTVDowLFRSQUNFOjEwLERFQlVHOjIwLElORk86MzAsTE9HOjQwLFdBUk46NTAsRVJST1I6MTAwLENSSVRJQ0FMOjIwMH0saT0iQ0NQIixzPSJTaGFyZWRXb3JrZXIiLGE9IkNSTSIsYz17VFJBQ0U6ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxERUJVRzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LElORk86ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxMT0c6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFRFU1Q6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFdBUk46ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKGUpfSxFUlJPUjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxDUklUSUNBTDpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfX0sdT1mdW5jdGlvbihlKXt2YXIgdCxuLG89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwwKSxpPW8uc2hpZnQoKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1PYmplY3QudmFsdWVzKHIpLmluZGV4T2YoZSl9KGkpPyhuPWksdD1vLnNoaWZ0KCkpOih0PWksbj1yLkNDUCkse2Zvcm1hdDp0LGNvbXBvbmVudDpuLGFyZ3M6b319LGw9ZnVuY3Rpb24oZSxuLHIsbyxjLHUpe3RoaXMuY29tcG9uZW50PWUsdGhpcy5sZXZlbD1uLHRoaXMudGV4dD1yLHRoaXMudGltZT1uZXcgRGF0ZSx0aGlzLnRhYklkPW51bGw9PT1jP251bGw6Y3x8dC5jb3JlLnRhYklkLHRoaXMuZXhjZXB0aW9uPW51bGwsdGhpcy5vYmplY3RzPVtdLHRoaXMubGluZT0wLHRoaXMuYWdlbnRSZXNvdXJjZUlkPW51bGw7dHJ5e3QuYWdlbnQuaW5pdGlhbGl6ZWQmJih0aGlzLmFnZW50UmVzb3VyY2VJZD0obmV3IHQuQWdlbnQpLl9nZXRSZXNvdXJjZUlkKCkpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCJJc3N1ZSBmaW5kaW5nIGFnZW50UmVzb3VyY2VJZDogIixlKX10aGlzLmxvZ2dlcklkPW8sdT90aGlzLmNvbnRleHRMYXllcj11OnQuaXNTaGFyZWRXb3JrZXIoKT90aGlzLmNvbnRleHRMYXllcj1zOnQuaXNDUk0oKT90aGlzLmNvbnRleHRMYXllcj1hOnQuaXNDQ1AoKSYmKHRoaXMuY29udGV4dExheWVyPWkpfTtsLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWJJZHx8bnVsbCxuPWUuY29udGV4dExheWVyfHxudWxsLG89bmV3IGwoci5DQ1AsZS5sZXZlbCxlLnRleHQsZS5sb2dnZXJJZCx0LG4pO3JldHVybiJbb2JqZWN0IERhdGVdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnRpbWUpP28udGltZT1uZXcgRGF0ZShlLnRpbWUuZ2V0VGltZSgpKToibnVtYmVyIj09dHlwZW9mIGUudGltZT9vLnRpbWU9bmV3IERhdGUoZS50aW1lKToic3RyaW5nIj09dHlwZW9mIGUudGltZT9vLnRpbWU9RGF0ZS5wYXJzZShlLnRpbWUpOm8udGltZT1uZXcgRGF0ZSxvLmV4Y2VwdGlvbj1lLmV4Y2VwdGlvbixvLm9iamVjdHM9ZS5vYmplY3RzLG99O3ZhciBwPWZ1bmN0aW9uKGUpe3ZhciB0PS9BdXRoVG9rZW4uKlw9L2c7ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihuKXsib2JqZWN0Ij09dHlwZW9mIGVbbl0/cChlW25dKToic3RyaW5nIj09dHlwZW9mIGVbbl0mJigidXJsIj09PW58fCJ0ZXh0Ij09PW4/ZVtuXT1lW25dLnJlcGxhY2UodCwiW3JlZGFjdGVkXSIpOlsicXVpY2tDb25uZWN0TmFtZSJdLmluY2x1ZGVzKG4pP2Vbbl09IltyZWRhY3RlZF0iOlsiY3VzdG9tZXJJZCIsIkN1c3RvbWVySWQiLCJTcGVha2VySWQiLCJDdXN0b21lclNwZWFrZXJJZCJdLmluY2x1ZGVzKG4pJiYoZVtuXT1gW29iZnVzY2F0ZWQgdmFsdWVdICR7bWQ1KGVbbl0pfWApKX0pKX0sZD1mdW5jdGlvbihlKXtpZih0aGlzLnR5cGU9ZSBpbnN0YW5jZW9mIEVycm9yP2UubmFtZTplLmNvZGV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSx0aGlzLm1lc3NhZ2U9ZS5tZXNzYWdlLHRoaXMuc3RhY2s9W10sZS5zdGFjayl0cnl7QXJyYXkuaXNBcnJheShlLnN0YWNrKT90aGlzLnN0YWNrPWUuc3RhY2s6Im9iamVjdCI9PXR5cGVvZiBlLnN0YWNrP3RoaXMuc3RhY2s9W0pTT04uc3RyaW5naWZ5KGUuc3RhY2spXToic3RyaW5nIj09dHlwZW9mIGUuc3RhY2smJih0aGlzLnN0YWNrPWUuc3RhY2suc3BsaXQoIlxuIikpfWNhdGNoe319O2wucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc3ByaW50ZigiWyVzXSBbJXNdIFslc106ICVzIix0aGlzLmdldFRpbWUoKSYmdGhpcy5nZXRUaW1lKCkudG9JU09TdHJpbmc/dGhpcy5nZXRUaW1lKCkudG9JU09TdHJpbmcoKToiPz8/Iix0aGlzLmdldExldmVsKCksdGhpcy5nZXRBZ2VudFJlc291cmNlSWQoKSx0aGlzLmdldFRleHQoKSl9LGwucHJvdG90eXBlLmdldFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lfSxsLnByb3RvdHlwZS5nZXRBZ2VudFJlc291cmNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZ2VudFJlc291cmNlSWR9LGwucHJvdG90eXBlLmdldFRhYklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiSWR9LGwucHJvdG90eXBlLmdldENvbnRleHRMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHRMYXllcn0sbC5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZXZlbH0sbC5wcm90b3R5cGUuZ2V0VGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHR9LGwucHJvdG90eXBlLmdldENvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudH0sbC5wcm90b3R5cGUud2l0aEV4Y2VwdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5leGNlcHRpb249bmV3IGQoZSksdGhpc30sbC5wcm90b3R5cGUud2l0aE9iamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmRlZXBjb3B5KGUpO3JldHVybiBwKG4pLHRoaXMub2JqZWN0cy5wdXNoKG4pLHRoaXN9LGwucHJvdG90eXBlLndpdGhDcm9zc09yaWdpbkV2ZW50T2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50KGUpO3JldHVybiBwKG4pLHRoaXMub2JqZWN0cy5wdXNoKG4pLHRoaXN9LGwucHJvdG90eXBlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0TG9nKCkuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2godGhpcyksdGhpc307dmFyIGg9ZnVuY3Rpb24oKXt0aGlzLl9sb2dzPVtdLHRoaXMuX3JvbGxlZExvZ3M9W10sdGhpcy5fbG9nc1RvUHVzaD1bXSx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXSx0aGlzLl9lY2hvTGV2ZWw9by5JTkZPLHRoaXMuX2xvZ0xldmVsPW8uSU5GTyx0aGlzLl9saW5lQ291bnQ9MCx0aGlzLl9sb2dSb2xsSW50ZXJ2YWw9MCx0aGlzLl9sb2dSb2xsVGltZXI9bnVsbCx0aGlzLl9sb2dnZXJJZD0obmV3IERhdGUpLmdldFRpbWUoKSsiLSIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksdGhpcy5zZXRMb2dSb2xsSW50ZXJ2YWwoMThlNSksdGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaD0wfTtoLnByb3RvdHlwZS5zZXRMb2dSb2xsSW50ZXJ2YWw9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0aGlzLl9sb2dSb2xsVGltZXImJnQ9PT10aGlzLl9sb2dSb2xsSW50ZXJ2YWw/dGhpcy53YXJuKCJMb2dnZXIgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGdpdmVuIGludGVydmFsOiAlZCIsdGhpcy5fbG9nUm9sbEludGVydmFsKToodGhpcy5fbG9nUm9sbFRpbWVyJiZlLmNsZWFySW50ZXJ2YWwodGhpcy5fbG9nUm9sbFRpbWVyKSx0aGlzLl9sb2dSb2xsSW50ZXJ2YWw9dCx0aGlzLl9sb2dSb2xsVGltZXI9ZS5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtuLl9yb2xsZWRMb2dzPW4uX2xvZ3Msbi5fbG9ncz1bXSxuLl9zdGFydExvZ0luZGV4VG9QdXNoPTAsbi5pbmZvKCJMb2cgcm9sbCBpbnRlcnZhbCBvY2N1cnJlZC4iKX0pLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbCkpfSxoLnByb3RvdHlwZS5zZXRMb2dMZXZlbD1mdW5jdGlvbihlKXtpZighKGUgaW4gbykpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGxvZ2dpbmcgbGV2ZWw6ICIrZSk7dGhpcy5fbG9nTGV2ZWw9b1tlXX0saC5wcm90b3R5cGUuc2V0RWNob0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9lY2hvTGV2ZWw9b1tlXX0saC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBsKGUsdCxuLHRoaXMuZ2V0TG9nZ2VySWQoKSk7cmV0dXJuIHAociksdGhpcy5hZGRMb2dFbnRyeShyKSxyfSxoLnByb3RvdHlwZS5hZGRMb2dFbnRyeT1mdW5jdGlvbihlKXtwKGUpLHRoaXMuX2xvZ3MucHVzaChlKSxyLlNPRlRQSE9ORT09PWUuY29tcG9uZW50JiZ0aGlzLl9sb2dzVG9QdXNoLnB1c2goZSksZS5sZXZlbCBpbiBvJiZvW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKG9bZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmY1tlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcj1mdW5jdGlvbihlKXt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5wdXNoKGUpLGUubGV2ZWwgaW4gbyYmb1tlLmxldmVsXT49dGhpcy5fbG9nTGV2ZWwmJihvW2UubGV2ZWxdPj10aGlzLl9lY2hvTGV2ZWwmJmNbZS5nZXRMZXZlbCgpXShlLnRvU3RyaW5nKCkpLGUubGluZT10aGlzLl9saW5lQ291bnQrKyl9LGgucHJvdG90eXBlLmNsZWFyT2JqZWN0cz1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5fbG9ncy5sZW5ndGg7ZSsrKXRoaXMuX2xvZ3NbZV0ub2JqZWN0cyYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0ub2JqZWN0c30saC5wcm90b3R5cGUuY2xlYXJFeGNlcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5leGNlcHRpb24mJmRlbGV0ZSB0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbn0saC5wcm90b3R5cGUudHJhY2U9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5UUkFDRSx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkRFQlVHLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5JTkZPLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkxPRyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uVEVTVCx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS53YXJuPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uV0FSTix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkVSUk9SLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmNyaXRpY2FsPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uRVJST1IsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8dGhpcy5fbG9ncy5sZW5ndGg7dCsrKWUucHVzaCh0aGlzLl9sb2dzW3RdLnRvU3RyaW5nKCkpO3JldHVybiBlLmpvaW4oIlxuIil9LGgucHJvdG90eXBlLmRvd25sb2FkPWZ1bmN0aW9uKHQpe3ZhciBuPSJhZ2VudC1sb2ciLHI9ITE7Im9iamVjdCI9PXR5cGVvZiB0PyhuPXQubG9nTmFtZXx8bixyPXQuZmlsdGVyQnlMb2dMZXZlbHx8cik6InN0cmluZyI9PXR5cGVvZiB0JiYobj10fHxuKTt2YXIgaT10aGlzLHM9dGhpcy5fcm9sbGVkTG9ncy5jb25jYXQodGhpcy5fbG9ncyk7ciYmKHM9cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBvW2UubGV2ZWxdPj1pLl9sb2dMZXZlbH0pKSk7dmFyIGE9bmV3IGUuQmxvYihbSlNPTi5zdHJpbmdpZnkocyx2b2lkIDAsNCldLFsidGV4dC9wbGFpbiJdKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtuPW58fCJhZ2VudC1sb2ciLGMuaHJlZj1lLlVSTC5jcmVhdGVPYmplY3RVUkwoYSksYy5kb3dubG9hZD1uKyIudHh0Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpLGMuY2xpY2soKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtTG9nUHVzaD1mdW5jdGlvbihuKXt0LnVwc3RyZWFtTG9nUHVzaFNjaGVkdWxlZHx8KHQudXBzdHJlYW1Mb2dQdXNoU2NoZWR1bGVkPSEwLGUuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucmVwb3J0TWFzdGVyTG9nc1VwU3RyZWFtLG4pLDVlMykpfSxoLnByb3RvdHlwZS5yZXBvcnRNYXN0ZXJMb2dzVXBTdHJlYW09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fbG9nc1RvUHVzaC5zbGljZSgpO3RoaXMuX2xvZ3NUb1B1c2g9W10sdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MsKGZ1bmN0aW9uKCl7bi5sZW5ndGg+MCYmZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU0VORF9MT0dTLG4pfSkpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzUHVzaD1mdW5jdGlvbihuKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hPdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NVcHN0cmVhbSxuKSwxZTMpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQTG9nc1B1c2g9ZnVuY3Rpb24obil7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoT3V0ZXJDb250ZXh0Q0NQTG9nc1Vwc3RyZWFtLG4pLDFlMyl9LGgucHJvdG90eXBlLnB1c2hPdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NVcHN0cmVhbT1mdW5jdGlvbihlKXtpZih0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg+MCl7Zm9yKHZhciBuPTA7bjx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg7bisrKXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dLnRleHQ9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0udGV4dDtlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzKSx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXX19LGgucHJvdG90eXBlLnB1c2hPdXRlckNvbnRleHRDQ1BMb2dzVXBzdHJlYW09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXRoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g7bjx0aGlzLl9sb2dzLmxlbmd0aDtuKyspdGhpcy5fbG9nc1tuXS5sb2dnZXJJZD09PXRoaXMuX2xvZ2dlcklkJiZlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csdGhpcy5fbG9nc1tuXSk7dGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaD10aGlzLl9sb2dzLmxlbmd0aH0saC5wcm90b3R5cGUuZ2V0TG9nZ2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9nZ2VySWR9LGgucHJvdG90eXBlLnNjaGVkdWxlRG93bnN0cmVhbUNsaWVudFNpZGVMb2dzUHVzaD1mdW5jdGlvbigpe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaENsaWVudFNpZGVMb2dzRG93bnN0cmVhbSksNWUzKX0saC5wcm90b3R5cGUucHVzaENsaWVudFNpZGVMb2dzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPVtdO3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDw1MHx8KHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aD41MDA/ZT10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5zcGxpY2UoMCw1MDApOihlPXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdKSx0LnB1Ymxpc2hDbGllbnRTaWRlTG9ncyhlKSl9O3ZhciBmPWZ1bmN0aW9uKG4pe2guY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9bixlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLl9wdXNoTG9nc0Rvd25zdHJlYW0pLGYuTE9HX1BVU0hfSU5URVJWQUwpLGUuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsfTtmLkxPR19QVVNIX0lOVEVSVkFMPTFlMyxmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGgucHJvdG90eXBlKSxmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mLGYucHJvdG90eXBlLnB1c2hMb2dzRG93bnN0cmVhbT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyxlKX0pKX0sZi5wcm90b3R5cGUuX3B1c2hMb2dzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fbG9ncy5mb3JFYWNoKChmdW5jdGlvbihuKXtlLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLG4pfSkpLHRoaXMuX2xvZ3M9W107Zm9yKHZhciBuPTA7bjx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg7bisrKXRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dKTt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXX07dmFyIGc9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChlKXtjLkVSUk9SKGUpfX19O3Qucm9vdExvZ2dlcj1uZXcgaCxmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSkiZnVuY3Rpb24iPT10eXBlb2YgZVt0XSYmKGVbdF09ZyhlW3RdKSl9KHQucm9vdExvZ2dlciksKHQ9dHx8e30pLmdldExvZz1mdW5jdGlvbigpe3JldHVybiB0LnJvb3RMb2dnZXJ9LHQuTG9nRW50cnk9bCx0LkxvZ2dlcj1oLHQuTG9nTGV2ZWw9bix0LkxvZ0NvbXBvbmVudD1yLHQuRG93bnN0cmVhbUNvbmR1aXRMb2dnZXI9Zn0oKX0sMTYzOmZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG4oZSxuLHIsbyxpLHMpe3JldHVybiB0KChhPXQodChuLGUpLHQobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxyKTt2YXIgYSxjfWZ1bmN0aW9uIHIoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odCZyfH50Jm8sZSx0LGkscyxhKX1mdW5jdGlvbiBvKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHQmb3xyJn5vLGUsdCxpLHMsYSl9ZnVuY3Rpb24gaShlLHQscixvLGkscyxhKXtyZXR1cm4gbih0XnJebyxlLHQsaSxzLGEpfWZ1bmN0aW9uIHMoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4ocl4odHx+byksZSx0LGkscyxhKX1mdW5jdGlvbiBhKGUsbil7dmFyIGEsYyx1LGwscDtlW24+PjVdfD0xMjg8PG4lMzIsZVsxNCsobis2ND4+Pjk8PDQpXT1uO3ZhciBkPTE3MzI1ODQxOTMsaD0tMjcxNzMzODc5LGY9LTE3MzI1ODQxOTQsZz0yNzE3MzM4Nzg7Zm9yKGE9MDthPGUubGVuZ3RoO2ErPTE2KWM9ZCx1PWgsbD1mLHA9ZyxkPXIoZCxoLGYsZyxlW2FdLDcsLTY4MDg3NjkzNiksZz1yKGcsZCxoLGYsZVthKzFdLDEyLC0zODk1NjQ1ODYpLGY9cihmLGcsZCxoLGVbYSsyXSwxNyw2MDYxMDU4MTkpLGg9cihoLGYsZyxkLGVbYSszXSwyMiwtMTA0NDUyNTMzMCksZD1yKGQsaCxmLGcsZVthKzRdLDcsLTE3NjQxODg5NyksZz1yKGcsZCxoLGYsZVthKzVdLDEyLDEyMDAwODA0MjYpLGY9cihmLGcsZCxoLGVbYSs2XSwxNywtMTQ3MzIzMTM0MSksaD1yKGgsZixnLGQsZVthKzddLDIyLC00NTcwNTk4MyksZD1yKGQsaCxmLGcsZVthKzhdLDcsMTc3MDAzNTQxNiksZz1yKGcsZCxoLGYsZVthKzldLDEyLC0xOTU4NDE0NDE3KSxmPXIoZixnLGQsaCxlW2ErMTBdLDE3LC00MjA2MyksaD1yKGgsZixnLGQsZVthKzExXSwyMiwtMTk5MDQwNDE2MiksZD1yKGQsaCxmLGcsZVthKzEyXSw3LDE4MDQ2MDM2ODIpLGc9cihnLGQsaCxmLGVbYSsxM10sMTIsLTQwMzQxMTAxKSxmPXIoZixnLGQsaCxlW2ErMTRdLDE3LC0xNTAyMDAyMjkwKSxkPW8oZCxoPXIoaCxmLGcsZCxlW2ErMTVdLDIyLDEyMzY1MzUzMjkpLGYsZyxlW2ErMV0sNSwtMTY1Nzk2NTEwKSxnPW8oZyxkLGgsZixlW2ErNl0sOSwtMTA2OTUwMTYzMiksZj1vKGYsZyxkLGgsZVthKzExXSwxNCw2NDM3MTc3MTMpLGg9byhoLGYsZyxkLGVbYV0sMjAsLTM3Mzg5NzMwMiksZD1vKGQsaCxmLGcsZVthKzVdLDUsLTcwMTU1ODY5MSksZz1vKGcsZCxoLGYsZVthKzEwXSw5LDM4MDE2MDgzKSxmPW8oZixnLGQsaCxlW2ErMTVdLDE0LC02NjA0NzgzMzUpLGg9byhoLGYsZyxkLGVbYSs0XSwyMCwtNDA1NTM3ODQ4KSxkPW8oZCxoLGYsZyxlW2ErOV0sNSw1Njg0NDY0MzgpLGc9byhnLGQsaCxmLGVbYSsxNF0sOSwtMTAxOTgwMzY5MCksZj1vKGYsZyxkLGgsZVthKzNdLDE0LC0xODczNjM5NjEpLGg9byhoLGYsZyxkLGVbYSs4XSwyMCwxMTYzNTMxNTAxKSxkPW8oZCxoLGYsZyxlW2ErMTNdLDUsLTE0NDQ2ODE0NjcpLGc9byhnLGQsaCxmLGVbYSsyXSw5LC01MTQwMzc4NCksZj1vKGYsZyxkLGgsZVthKzddLDE0LDE3MzUzMjg0NzMpLGQ9aShkLGg9byhoLGYsZyxkLGVbYSsxMl0sMjAsLTE5MjY2MDc3MzQpLGYsZyxlW2ErNV0sNCwtMzc4NTU4KSxnPWkoZyxkLGgsZixlW2ErOF0sMTEsLTIwMjI1NzQ0NjMpLGY9aShmLGcsZCxoLGVbYSsxMV0sMTYsMTgzOTAzMDU2MiksaD1pKGgsZixnLGQsZVthKzE0XSwyMywtMzUzMDk1NTYpLGQ9aShkLGgsZixnLGVbYSsxXSw0LC0xNTMwOTkyMDYwKSxnPWkoZyxkLGgsZixlW2ErNF0sMTEsMTI3Mjg5MzM1MyksZj1pKGYsZyxkLGgsZVthKzddLDE2LC0xNTU0OTc2MzIpLGg9aShoLGYsZyxkLGVbYSsxMF0sMjMsLTEwOTQ3MzA2NDApLGQ9aShkLGgsZixnLGVbYSsxM10sNCw2ODEyNzkxNzQpLGc9aShnLGQsaCxmLGVbYV0sMTEsLTM1ODUzNzIyMiksZj1pKGYsZyxkLGgsZVthKzNdLDE2LC03MjI1MjE5NzkpLGg9aShoLGYsZyxkLGVbYSs2XSwyMyw3NjAyOTE4OSksZD1pKGQsaCxmLGcsZVthKzldLDQsLTY0MDM2NDQ4NyksZz1pKGcsZCxoLGYsZVthKzEyXSwxMSwtNDIxODE1ODM1KSxmPWkoZixnLGQsaCxlW2ErMTVdLDE2LDUzMDc0MjUyMCksZD1zKGQsaD1pKGgsZixnLGQsZVthKzJdLDIzLC05OTUzMzg2NTEpLGYsZyxlW2FdLDYsLTE5ODYzMDg0NCksZz1zKGcsZCxoLGYsZVthKzddLDEwLDExMjY4OTE0MTUpLGY9cyhmLGcsZCxoLGVbYSsxNF0sMTUsLTE0MTYzNTQ5MDUpLGg9cyhoLGYsZyxkLGVbYSs1XSwyMSwtNTc0MzQwNTUpLGQ9cyhkLGgsZixnLGVbYSsxMl0sNiwxNzAwNDg1NTcxKSxnPXMoZyxkLGgsZixlW2ErM10sMTAsLTE4OTQ5ODY2MDYpLGY9cyhmLGcsZCxoLGVbYSsxMF0sMTUsLTEwNTE1MjMpLGg9cyhoLGYsZyxkLGVbYSsxXSwyMSwtMjA1NDkyMjc5OSksZD1zKGQsaCxmLGcsZVthKzhdLDYsMTg3MzMxMzM1OSksZz1zKGcsZCxoLGYsZVthKzE1XSwxMCwtMzA2MTE3NDQpLGY9cyhmLGcsZCxoLGVbYSs2XSwxNSwtMTU2MDE5ODM4MCksaD1zKGgsZixnLGQsZVthKzEzXSwyMSwxMzA5MTUxNjQ5KSxkPXMoZCxoLGYsZyxlW2ErNF0sNiwtMTQ1NTIzMDcwKSxnPXMoZyxkLGgsZixlW2ErMTFdLDEwLC0xMTIwMjEwMzc5KSxmPXMoZixnLGQsaCxlW2ErMl0sMTUsNzE4Nzg3MjU5KSxoPXMoaCxmLGcsZCxlW2ErOV0sMjEsLTM0MzQ4NTU1MSksZD10KGQsYyksaD10KGgsdSksZj10KGYsbCksZz10KGcscCk7cmV0dXJuW2QsaCxmLGddfWZ1bmN0aW9uIGMoZSl7dmFyIHQsbj0iIixyPTMyKmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3Q+PjVdPj4+dCUzMiYyNTUpO3JldHVybiBufWZ1bmN0aW9uIHUoZSl7dmFyIHQsbj1bXTtmb3IoblsoZS5sZW5ndGg+PjIpLTFdPXZvaWQgMCx0PTA7dDxuLmxlbmd0aDt0Kz0xKW5bdF09MDt2YXIgcj04KmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpblt0Pj41XXw9KDI1NSZlLmNoYXJDb2RlQXQodC84KSk8PHQlMzI7cmV0dXJuIG59ZnVuY3Rpb24gbChlKXt2YXIgdCxuLHI9IjAxMjM0NTY3ODlhYmNkZWYiLG89IiI7Zm9yKG49MDtuPGUubGVuZ3RoO24rPTEpdD1lLmNoYXJDb2RlQXQobiksbys9ci5jaGFyQXQodD4+PjQmMTUpK3IuY2hhckF0KDE1JnQpO3JldHVybiBvfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGMoYSh1KGUpLDgqZS5sZW5ndGgpKX0ocChlKSl9ZnVuY3Rpb24gaChlLHQpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsbz11KGUpLGk9W10scz1bXTtmb3IoaVsxNV09c1sxNV09dm9pZCAwLG8ubGVuZ3RoPjE2JiYobz1hKG8sOCplLmxlbmd0aCkpLG49MDtuPDE2O24rPTEpaVtuXT05MDk1MjI0ODZeb1tuXSxzW25dPTE1NDk1NTY4Mjheb1tuXTtyZXR1cm4gcj1hKGkuY29uY2F0KHUodCkpLDUxMis4KnQubGVuZ3RoKSxjKGEocy5jb25jYXQociksNjQwKSl9KHAoZSkscCh0KSl9KHRoaXN8fGdsb2JhbFRoaXMpLm1kNT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ/bj9oKHQsZSk6bChoKHQsZSkpOm4/ZChlKTpsKGQoZSkpfX0oKX0sNDM5OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5DaGF0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKSxvPXQuTG9nQ29tcG9uZW50LkNIQVQsaT1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0scz1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7ci5lcnJvcihvLCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIixlKX0pKSxlLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKChmdW5jdGlvbihlKXtyLmluZm8obywiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiLGUpfSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7aSgiQ2hhdCBtZWRpYSBjb250cm9sbGVyIGluaXQiLGUuY29udGFjdElkKSxyLmluZm8obywiQ2hhdCBtZWRpYSBjb250cm9sbGVyIGluaXQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5DaGF0U2Vzc2lvbi5zZXRHbG9iYWxDb25maWcoe2xvZ2dlckNvbmZpZzp7bG9nZ2VyOnJ9LHJlZ2lvbjpuLnJlZ2lvbn0pO3ZhciBhPXQuQ2hhdFNlc3Npb24uY3JlYXRlKHtjaGF0RGV0YWlsczplLHR5cGU6IkFHRU5UIix3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gcyhhKSxhLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmZvKG8sIkNoYXQgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgZm9yIGNvbnRhY3RJZCAlcyIsZS5jb250YWN0SWQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLGF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IHIuZXJyb3IobywiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIixlLmNvbnRhY3RJZCx0KSx0fSkpfSgpfX19fSgpfSwyNzk6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0Lk1lZGlhRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgbj17fSxyPW5ldyBTZXQsbz10LmdldExvZygpLGk9dC5Mb2dDb21wb25lbnQuQ0hBVCxzPXQubWVyZ2Uoe30sZSl8fHt9O3MucmVnaW9uPXMucmVnaW9ufHwidXMtd2VzdC0yIjt2YXIgYT1mdW5jdGlvbihlKXtuW2VdJiYhci5oYXMoZSkmJihvLmluZm8oaSwiRGVzdHJveWluZyBtZWRpYUNvbnRyb2xsZXIgZm9yICVzIixlKSxyLmFkZChlKSxuW2VdLnRoZW4oKGZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFuVXAmJnQuY2xlYW5VcCgpLGRlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpLmNhdGNoKChmdW5jdGlvbigpe2RlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpKX07cmV0dXJue2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0oZSk/ZnVuY3Rpb24oZSl7dmFyIHI9ZS5nZXRDb25uZWN0aW9uSWQoKTtpZighZS5nZXRNZWRpYUluZm8oKSlyZXR1cm4gby5lcnJvcihpLCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciBhIG1lZGlhIHR5cGUgJXMiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgiTWVkaWEgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb25uZWN0aW9uIik7aWYobltyXSlyZXR1cm4gbltyXTtzd2l0Y2goby5pbmZvKGksIm1lZGlhIGNvbnRyb2xsZXIgb2YgdHlwZSAlcyBpbml0IixlLmdldE1lZGlhVHlwZSgpKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5nZXRNZWRpYVR5cGUoKSl7Y2FzZSB0Lk1lZGlhVHlwZS5DSEFUOnJldHVybiBuW3JdPW5ldyB0LkNoYXRNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSxzKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlNPRlRQSE9ORTpyZXR1cm4gbltyXT1uZXcgdC5Tb2Z0cGhvbmVNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7Y2FzZSB0Lk1lZGlhVHlwZS5UQVNLOnJldHVybiBuW3JdPW5ldyB0LlRhc2tNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7ZGVmYXVsdDpyZXR1cm4gby5lcnJvcihpLCJVbnJlY29nbml6ZWQgbWVkaWEgdHlwZSAlcyAiLGUuZ2V0TWVkaWFUeXBlKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksUHJvbWlzZS5yZWplY3QoKX19KGUpOihhKGUuZ2V0Q29ubmVjdGlvbklkKCkpLFByb21pc2UucmVqZWN0KCJNZWRpYSBDb250cm9sbGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yIHRoaXMgY29ubmVjdGlvbiIpKX0sZGVzdHJveTphfX19KCl9LDQxODooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfX19fSgpfSwxODc6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlRhc2tNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7dmFyIG49dC5nZXRMb2coKSxyPXQuTG9nQ29tcG9uZW50LlRBU0ssbz1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0saT1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7bi5lcnJvcihyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7bi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtvKCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLG4uaW5mbyhyLCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSk7dmFyIHM9dC5UYXNrU2Vzc2lvbi5jcmVhdGUoe2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOmUuaW5pdGlhbENvbnRhY3RJZCx3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gaShzKSxzLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmluZm8ociwiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCksbygiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLHN9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IG4uZXJyb3IociwiVGFzayBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCksbygiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sMTYxOigpPT57IWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDtjb25zdCBuPSIvcmVxdWVzdC1zdG9yYWdlLWFjY2VzcyIscj17Y2FuUmVxdWVzdDohMSxtb2RlOiJkZWZhdWx0IixjdXN0b206e2hpZGVDQ1A6ITB9fTtsZXQgbyxpPXt9LHM9IiIsYT1udWxsLGM9ITE7Y29uc3QgdT17SU5JVDoic3RvcmFnZUFjY2Vzczo6aW5pdCIsR1JBTlRFRDoic3RvcmFnZUFjY2Vzczo6Z3JhbnRlZCIsREVOSUVEOiJzdG9yYWdlQWNjZXNzOjpkZW5pZWQiLFJFUVVFU1Q6InN0b3JhZ2VBY2Nlc3M6OnJlcXVlc3QifSxsPSgpPT4oe3Nob3c6KCk9PnthLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0saGlkZTooKT0+e2Euc3R5bGUuZGlzcGxheT0ibm9uZSJ9fSkscD0oKT0+aSYmImN1c3RvbSI9PT1pLm1vZGUsZD1lPT5lLm1hdGNoKC8uY29ubmVjdC5hd3MuYTJ6LmNvbXwubXkuY29ubmVjdC5hd3N8LmdvdmNsb3VkLmNvbm5lY3QuYXdzfC5hd3NhcHBzLmNvbS8pLGg9ZT0+e2NvbnN0e29yaWdpbjp0LHBhdGhuYW1lOnJ9PW5ldyBVUkwoZSk7aWYodC5tYXRjaCgvLmF3c2FwcHMuY29tLykpe2xldCBlPSJjb25uZWN0IjtyZXR1cm4gci5zdGFydHNXaXRoKCIvY29ubmVjdC1nYW1tYSIpJiYoZT0iY29ubmVjdC1nYW1tYSIpLGAke3R9LyR7ZX0ke259YH1yZXR1cm5gJHt0fSR7bn1gfSxmPWU9PmUubWF0Y2goL15odHRwcz86XC9cL2xvY2FsaG9zdC8pLGc9KCk9PntpZighcyl0aHJvdyBuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0bGFuZEF0UGF0aF0gSW52b2tlIGNvbm5lY3Quc3RvcmFnZUFjY2Vzcy5pbml0IGZpcnN0Iik7aWYoZChzKXx8ZihzKSl7Y29uc3R7cGF0aG5hbWU6ZX09bmV3IFVSTChzKTtyZXR1cm4gZX1yZXR1cm4iL2Nvbm5lY3QvY2NwLXYyIn0sbT0oe29uSW5pdDplLG9uRGVueTpuLG9uR3JhbnQ6cn0pPT57ZnVuY3Rpb24gbyh7ZGF0YTppLHNvdXJjZTpzfSl7aWYodC5jb3JlLl9nZXRDQ1BJZnJhbWUoKS5jb250ZW50V2luZG93IT09cylyZXR1cm4hMTtzd2l0Y2godC5jb3JlLmluaXRpYWxpemVkJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyksaS5ldmVudCl7Y2FzZSB1LklOSVQ6dC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bSU5JVF0gbWVzc2FnZSByZWNpZXZlZCIpLndpdGhPYmplY3QoaSksZSYmZShpKTticmVhaztjYXNlIHUuR1JBTlRFRDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtHUkFOVEVEXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxyJiZyKGkpO2JyZWFrO2Nhc2UgdS5ERU5JRUQ6dC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bREVOSUVEXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxuJiZuKGkpO2JyZWFrO2RlZmF1bHQ6dC5jb3JlLmluaXRpYWxpemVkJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyl9fXJldHVybiBpLmNhblJlcXVlc3QmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKSx7dW5zdWJzY3JpYmU6KCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyl9fX07dC5zdG9yYWdlQWNjZXNzPU9iamVjdC5mcmVlemUoe2NhblJlcXVlc3Q6KCk9PmkuY2FuUmVxdWVzdCxvcHRPdXRGcm9tUmVxdWVzdEFjY2VzczooKT0+e3IuY2FuUmVxdWVzdD0hMX0sb3B0SW5Gb3JSZXF1ZXN0QWNjZXNzOigpPT57ci5jYW5SZXF1ZXN0PSEwfSxpbml0OihlLG4sbz17fSk9Pnt0LmFzc2VydE5vdE51bGwoZSwiY2NwVXJsIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lciIpLGE9bixzPWUsKChlPXt9KT0+e2UuY3VzdG9tPWUuY3VzdG9tfHx7fSxpPXsuLi5yLC4uLmUsY3VzdG9tOnsuLi5yLmN1c3RvbSwuLi5lLmN1c3RvbX19LGkuY2FuUmVxdWVzdD0hKCJmYWxzZSI9PT1pLmNhblJlcXVlc3R8fCExPT09aS5jYW5SZXF1ZXN0KX0pKG8pLHQuZ2V0TG9nKCkuaW5mbyhgW1N0b3JhZ2VBY2Nlc3NdW2luaXRdIFJlcXVlc3QgU3RvcmFnZSBBY2NjZXNzIGluaXQgY2FsbGVkIHdpdGggY2NwVXJsIC0gJHtlfSAtICR7aS5jYW5SZXF1ZXN0PyJQcm9jZWVkaW5nIHdpdGggcmVxdWVzdGluZyBzdG9yYWdlIGFjY2VzcyI6InVzZXIgaGFzIG9wdGVkIG91dCwgc2tpcHBpbmcgcmVxdWVzdCBzdG9yYWdlIGFjY2VzcyJ9YCkud2l0aE9iamVjdChpKX0sc2V0dXBSZXF1ZXN0SGFuZGxlcnM6KHtvbkdyYW50OmV9KT0+e28mJm8udW5zdWJzY3JpYmUoKSxvPW0oe29uSW5pdDplPT57Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0lOSVRdIiwiYmFja2dyb3VuZDp5ZWxsb3c7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkluaXRdIGNhbGxiYWNrIGV4ZWN1dGVkIikud2l0aE9iamVjdChlPy5kYXRhKSwhZT8uZGF0YS5oYXNBY2Nlc3MmJnAoKSYmbCgpLnNob3coKX0sb25EZW55OigpPT57Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0RFTklFRF0iLCJiYWNrZ3JvdW5kOnJlZDsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uRGVueV0gY2FsbGJhY2sgZXhlY3V0ZWQiKSxwKCkmJmwoKS5zaG93KCl9LG9uR3JhbnQ6KCk9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bR1JBTlRFRF0iLCJiYWNrZ3JvdW5kOmxpbWU7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkdyYW50XSBjYWxsYmFjayBleGVjdXRlZCIpLHAoKSYmaT8uY3VzdG9tPy5oaWRlQ0NQJiZsKCkuaGlkZSgpLGN8fChlKCksYz0hMCl9fSl9LGdldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsOigpPT57aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZva2UgY29ubmVjdC5zdG9yYWdlQWNjZXNzLmluaXQgZmlyc3QiKTtpZihkKHMpKXJldHVybiBoKHMpO2lmKGYocykpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdIFtDQ1BdIExvY2FsIHRlc3RpbmciKSxgJHtzfSR7bn1gO2lmKGkuaW5zdGFuY2VVcmwmJmQoaS5pbnN0YW5jZVVybCkpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbyhgW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gQ3VzdG9tZXIgaGFzIHByb3ZpZGVkIHN0b3JhZ2VQYXJhbXMuaW5zdGFuY2VVcmwgJHtpLmluc3RhbmNlVXJsfWApLGgoaS5pbnN0YW5jZVVybCk7aWYoaS5pbnN0YW5jZVVybCYmZihpLmluc3RhbmNlVXJsKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBMb2NhbCB0ZXN0aW5nIiksYCR7aS5pbnN0YW5jZVVybH0ke259YDt0aHJvdyB0LmdldExvZygpLmVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZhbGlkIENvbm5lY3QgaW5zdGFuY2UvQ0NQIFVSTCBwcm92aWRlZCwgcGxlYXNlIHBhc3MgdGhlIGNvcnJlY3QgY2NwVXJsIG9yIHN0b3JhZ2VBY2Nlc3MuaW5zdGFuY2VVcmwgcGFyYW1ldGVycyIpLG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52YWxpZCBDb25uZWN0IGluc3RhbmNlL0NDUCBVUkwgcHJvdmlkZWQsIHBsZWFzZSBwYXNzIHRoZSB2YWxpZCBDb25uZWN0IENDUCBVUkwgb3IgaW4gY2FzZSBDQ1AgVVJMIGlzIGNvbmZpZ3VyZWQgdG8gYmUgdGhlIFNTTyBVUkwgdGhlbiB1c2Ugc3RvcmFnZUFjY2Vzcy5pbnN0YW5jZVVybCBhbmQgcGFzcyB0aGUgQ29ubmVjdCBDQ1AgVVJMIil9LHN0b3JhZ2VBY2Nlc3NFdmVudHM6dSxyZXNldFN0b3JhZ2VBY2Nlc3NTdGF0ZTooKT0+e2k9e30scz0iIixhPW51bGwsYz0hMX0sZ2V0T25HcmFudENhbGxiYWNrSW52b2tlZDooKT0+YyxnZXRTdG9yYWdlQWNjZXNzUGFyYW1zOigpPT5pLG9uUmVxdWVzdDptLHJlcXVlc3Q6KCk9Pnt0LmNvcmUuX2dldENDUElmcmFtZSgpLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe2V2ZW50OnUuUkVRVUVTVCxkYXRhOnsuLi5pLGxhbmRhdDpnKCl9fSwiKiIpfX0pfSgpfSw3NDM6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbihuKXt2YXIgcj10aGlzO2lmKHRoaXMuX3ByZXZDb250YWN0SWQ9bnVsbCx0LmFzc2VydE5vdE51bGwobiwicmluZ3RvbmVDb25maWciKSwhbi5yaW5ndG9uZVVybCl0aHJvdyBuZXcgRXJyb3IoInJpbmd0b25lVXJsIGlzIHJlcXVpcmVkISIpO2UuQXVkaW8mJnZvaWQgMCE9PWUuUHJvbWlzZT90aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxvKXtyLl9hdWRpbz1uZXcgQXVkaW8obi5yaW5ndG9uZVVybCksci5fYXVkaW8ubG9vcD0hMCxyLl9hdWRpby5hZGRFdmVudExpc3RlbmVyKCJjYW5wbGF5IiwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIlJpbmd0b25lIGlzIHJlYWR5IHRvIHBsYXk6ICIsK24ucmluZ3RvbmVVcmwpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5fYXVkaW9QbGF5YWJsZT0hMCxlKHIuX2F1ZGlvKX0pKX0pKToodGhpcy5fYXVkaW89bnVsbCx0LmdldExvZygpLmVycm9yKCJVbmFibGUgdG8gcHJvdmlkZSBhIHJpbmd0b25lLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLHIuX2RyaXZlUmluZ3RvbmUoKX07bi5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZC4iKX0sbi5wcm90b3R5cGUuX3N0YXJ0UmluZ3RvbmU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0aGlzLl9hdWRpbyYmKHRoaXMuX2F1ZGlvLnBsYXkoKS50aGVuKChmdW5jdGlvbigpe24uX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgU3RhcnQiLGUpLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgU3RhcnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihyKXtuLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFBsYXliYWNrIEZhaWx1cmUiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoIlJpbmd0b25lIFBsYXliYWNrIEZhaWx1cmUiKS53aXRoRXhjZXB0aW9uKHIpLndpdGhPYmplY3Qoe2N1cnJlbnRTcmM6bi5fYXVkaW8uY3VycmVudFNyYyxzaW5rSWQ6bi5fYXVkaW8uc2lua0lkLHZvbHVtZTpuLl9hdWRpby52b2x1bWV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLHQuZ2V0TG9nKCkuaW5mbyhgQXR0ZW1wdGluZyB0byBzdGFydCByaW5ndG9uZSB0byBkZXZpY2UgJHt0aGlzLl9hdWRpby5zaW5rSWR8fCInJyJ9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LG4ucHJvdG90eXBlLl9zdG9wUmluZ3RvbmU9ZnVuY3Rpb24oZSl7dGhpcy5fYXVkaW8mJih0aGlzLl9hdWRpby5wYXVzZSgpLHRoaXMuX2F1ZGlvLmN1cnJlbnRUaW1lPTAsdGhpcy5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBTdG9wIixlKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIFN0b3AiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sbi5wcm90b3R5cGUuc3RvcFJpbmd0b25lPWZ1bmN0aW9uKCl7dGhpcy5fc3RvcFJpbmd0b25lKCl9LG4ucHJvdG90eXBlLl9yaW5ndG9uZVNldHVwPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtuLl9zdGFydFJpbmd0b25lKGUpLG4uX3ByZXZDb250YWN0SWQ9ZS5nZXRDb250YWN0SWQoKSxlLm9uQ29ubmVjdGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uQWNjZXB0ZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25FbmRlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vblJlZnJlc2goKGZ1bmN0aW9uKGUpe2UuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlORyYmbi5fc3RvcFJpbmd0b25lKCl9KSl9KSl9LG4ucHJvdG90eXBlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQ9ZnVuY3Rpb24oZSxuKXtuJiZuLmdldENvbnRhY3RJZCgpJiZ0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bi5nZXRDb250YWN0SWQoKX0pfSxuLnByb3RvdHlwZS5zZXRPdXRwdXREZXZpY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlP1Byb21pc2UucmFjZShbdGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2UsbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe24oIlRpbWVkIG91dCB3YWl0aW5nIGZvciBwbGF5YWJsZSBhdWRpbyIpfSksM2UzKX0pKV0pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLnNldFNpbmtJZD9lLnNldFNpbmtJZCh0KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChgUmluZ3RvbmVFbmdpbmVCYXNlLnNldE91dHB1dERldmljZSBmYWlsZWQ6IGF1ZGlvLnNldFNpbmtJZCgpIGZhaWxlZCB3aXRoIGVycm9yICR7ZX1gKX0pKTpQcm9taXNlLnJlamVjdChgUmluZ3RvbmVFbmdpbmVCYXNlLnNldE91dHB1dERldmljZSBmYWlsZWQ6ICR7ZT8iYXVkaW8iOiJhdWRpby5zZXRTaW5rSWQifSBub3QgZm91bmQuYCl9KSk6ZS5Qcm9taXNlP1Byb21pc2UucmVqZWN0KCJOb3QgZWxpZ2libGUgcmluZ3RvbmUgb3duZXIiKTp2b2lkIDB9O3ZhciByPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlZPSUNFJiZuLmlzU29mdHBob25lQ2FsbCgpJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpLChuZXcgdC5BZ2VudCkuZ2V0Q29udGFjdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJm4oZSl9KSl9O3ZhciBvPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLkNIQVQmJm4uaXNJbmJvdW5kKCkmJjA9PT1uLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChlPT5lLmdldFR5cGUoKT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlQmJmUuaXNTaWxlbnRNb25pdG9yKCkpKS5sZW5ndGgmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIkNoYXQgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgaT1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5UQVNLJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJUYXNrIFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKX07dmFyIHM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5jb250YWN0KChmdW5jdGlvbihuKXtuLm9uSW5jb21pbmcoKGZ1bmN0aW9uKCl7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIkNhbGxiYWNrIFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSkpfSkpfSx0LlZvaWNlUmluZ3RvbmVFbmdpbmU9cix0LkNoYXRSaW5ndG9uZUVuZ2luZT1vLHQuVGFza1Jpbmd0b25lRW5naW5lPWksdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmU9c30oKX0sNjQyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsZS5jY3BWZXJzaW9uPSJWMiI7Y29uc3Qgbj0iQ0lUUklYIixyPSJBV1NfV09SS1NQQUNFIjt2YXIgbz17fTtvW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fT05MWV09IkF1ZGlvIixvW3QuU29mdHBob25lQ2FsbFR5cGUuVklERU9fT05MWV09IlZpZGVvIixvW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fVklERU9dPSJBdWRpb1ZpZGVvIixvW3QuU29mdHBob25lQ2FsbFR5cGUuTk9ORV09Ik5vbmUiO3ZhciBpPSJhdWRpb19pbnB1dCIscz0iYXVkaW9fb3V0cHV0Ijsoe30pW3QuQ29udGFjdFR5cGUuVk9JQ0VdPSJWb2ljZSI7dmFyIGE9W10sYz1bXSx1PVtdLGw9e30scD17fSxkPTAsaD0wLGY9MCxnPTAsbT0wLHY9bnVsbCx5PW51bGwsRT1udWxsLFM9bnVsbCxiPXQuU29mdHBob25lRXJyb3JUeXBlcyxDPXt9LFQ9dC5yYW5kb21JZCgpLEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULGUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7bihlLnNvZnRwaG9uZVRyYW5zcG9ydC5zb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zKX0sZmFpbHVyZTpmdW5jdGlvbihlKXtlLm1lc3NhZ2UmJmUubWVzc2FnZS5pbmNsdWRlcygiU29mdHBob25lQ29ubmVjdGlvbkxpbWl0QnJlYWNoZWRFeGNlcHRpb24iKSYmRigibXVsdGlwbGVfc29mdHBob25lX2FjdGl2ZV9zZXNzaW9ucyIsIk51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgYXJlIG1vcmUgdGhlbiBhbGxvd2VkIGxpbWl0LiIsIiIpLHIoRXJyb3IoInJlcXVlc3RJY2VBY2Nlc3MgZmFpbGVkIikpfSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3IoRXJyb3IoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSByZXF1ZXN0SWNlQWNjZXNzIikpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXtyKEVycm9yKCJBY2Nlc3MgRGVuaWVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9fSl9KSl9LEE9ZnVuY3Rpb24oZT17fSl7dmFyIG89dGhpcztsZXQgaTtpZigoUz1uZXcgZWUodC5nZXRMb2coKSkpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gc29mdHBob25lIG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gaGFzIGJlZ3VuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxTLmluZm8oYFtTb2Z0cGhvbmVNYW5hZ2VyXSBDbGllbnQgUHJvdmlkZWQgU3RyYXRlZ3k6ICR7ZS5WRElQbGF0Zm9ybX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuVkRJUGxhdGZvcm0pe3Y9ZS5WRElQbGF0Zm9ybTt0cnl7aWYoZS5WRElQbGF0Zm9ybT09PW4paT1uZXcgdC5DaXRyaXhWRElTdHJhdGVneSxTLmluZm8oYFtTb2Z0cGhvbmVNYW5hZ2VyXSBTdHJhdGVneSBjb25zdHJ1Y3RvciByZXRyaWV2ZWQ6ICR7aX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7aWYoZS5WRElQbGF0Zm9ybSE9PXIpdGhyb3cgbmV3IEVycm9yKCJWREkgU3RyYXRlZ3kgbm90IHN1cHBvcnRlZCIpO2k9bmV3IHQuRENWV2ViUlRDU3RyYXRlZ3ksUy5pbmZvKGBbU29mdHBob25lTWFuYWdlcl0gU3RyYXRlZ3kgY29uc3RydWN0b3IgcmV0cmlldmVkOiAke2l9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19Y2F0Y2goZSl7dGhyb3ciVkRJIFN0cmF0ZWd5IG5vdCBzdXBwb3J0ZWQiPT09ZS5tZXNzYWdlPyhGKGIuVkRJX1NUUkFURUdZX05PVF9TVVBQT1JURUQsZS5tZXNzYWdlLCIiKSxlKToiQ2l0cml4IFdlYlJUQyByZWRpcmVjdGlvbiBmZWF0dXJlIGlzIE5PVCBzdXBwb3J0ZWQhIj09PWUubWVzc2FnZXx8IkRDViBXZWJSVEMgcmVkaXJlY3Rpb24gZmVhdHVyZSBpcyBOT1Qgc3VwcG9ydGVkISI9PT1lLm1lc3NhZ2U/KEYoYi5WRElfUkVESVJfTk9UX1NVUFBPUlRFRCxlLm1lc3NhZ2UsIiIpLGUpOihGKGIuT1RIRVIsZS5tZXNzYWdlLCIiKSxlKX19dmFyIHM7dC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkmJihzPWk/bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KFMsdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxULHQuaGl0Y2gobyxJLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOlR9KSx0LmhpdGNoKG8sRiksaSk6bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KFMsdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxULHQuaGl0Y2gobyxJLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOlR9KSx0LmhpdGNoKG8sRikpKSxBLmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZCgpfHxGKGIuVU5TVVBQT1JURURfQlJPV1NFUiwiQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYnJvd3Nlci4gU29tZSBmdW5jdGlvbmFsaXR5IG1heSBub3Qgd29yay4gIiwiIiksVSh7c3VjY2VzczpmdW5jdGlvbihlKXtCKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJncmFudGVkIn0pfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe0YoZSwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIiksQigiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZGVuaWVkIn0pfX0pO2NvbnN0IGE9dygpLGM9UigpLHU9ayghZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbik7TCgpLHRoaXMucmluZ3RvbmVFbmdpbmU9bnVsbDt2YXIgbD17fSxwPXt9LGQ9ITEsaD1udWxsLGY9bnVsbCxnPWZ1bmN0aW9uKCl7ZD0hMSxoPW51bGwsZj1udWxsfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oZSl7cmV0dXJuIGxbZV19LHRoaXMucmVwbGFjZUxvY2FsTWVkaWFUcmFjaz1mdW5jdGlvbihlLHQpe3ZhciBuPUNbZV0uc3RyZWFtO2lmKG4pe3ZhciByPW4uZ2V0QXVkaW9UcmFja3MoKVswXTt0LmVuYWJsZWQ9ci5lbmFibGVkLHIuZW5hYmxlZD0hMSxuLnJlbW92ZVRyYWNrKHIpLG4uYWRkVHJhY2sodCl9fTt2YXIgbT1mdW5jdGlvbihlKXtpZihsLmhhc093blByb3BlcnR5KGUpKXt2YXIgdD1sW2VdO25ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2RlbGV0ZSBsW2VdLGRlbGV0ZSBwW2VdLHQuaGFuZ3VwKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2xpbHkuZ2V0TG9nKCkud2FybigiQ2xlYW4gdXAgdGhlIHNlc3Npb24gbG9jYWxseSAiK2UsdC5tZXNzYWdlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfX07dGhpcy5zdGFydFNlc3Npb249ZnVuY3Rpb24obixyKXt2YXIgbz1kP2g6bixhPWQ/ZjpyO2lmKG8mJmEpe2coKSxwW2FdPSEwLFMuaW5mbygiU29mdHBob25lIGNhbGwgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIrby5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmdW5jdGlvbihlKXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKGooIk11bHRpU2Vzc2lvbkhhbmdVcCIsZVt0XS5jYWxsSWQsdCksbSh0KSk7dGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUgc2Vzc2lvbiBkZXRlY3RlZCwgcmVmdXNpbmcgdG8gc2V0dXAgbmV3IGNvbm5lY3Rpb24iKX19KGwpLG8uZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmQigiU29mdHBob25lIENvbm5lY3RpbmciLG8uZ2V0Q29udGFjdElkKCkpLEgoKTt2YXIgYyx1LHY9by5nZXRBZ2VudENvbm5lY3Rpb24oKS5nZXRTb2Z0cGhvbmVNZWRpYUluZm8oKSx5PU0odi5jYWxsQ29uZmlnSnNvbik7eS51c2VXZWJTb2NrZXRQcm92aWRlciYmKGM9dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSksKHU9aT9uZXcgdC5SVENTZXNzaW9uKHkuc2lnbmFsaW5nRW5kcG9pbnQseS5pY2VTZXJ2ZXJzLHYuY2FsbENvbnRleHRUb2tlbixTLG8uZ2V0Q29udGFjdElkKCksYSxjLGkpOm5ldyB0LlJUQ1Nlc3Npb24oeS5zaWduYWxpbmdFbmRwb2ludCx5LmljZVNlcnZlcnMsdi5jYWxsQ29udGV4dFRva2VuLFMsby5nZXRDb250YWN0SWQoKSxhLGMpKS5lY2hvQ2FuY2VsbGF0aW9uPSFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uLGxbYV09dSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGRhdGE6e2Nvbm5lY3Rpb25JZDphfX0pLHUub25TZXNzaW9uRmFpbGVkPWZ1bmN0aW9uKGUsdCl7ZGVsZXRlIGxbYV0sZGVsZXRlIHBbYV0seChlLHQpLHEoby5nZXRDb250YWN0SWQoKSx0KSxKKG8sZS5zZXNzaW9uUmVwb3J0KX0sdS5vblNlc3Npb25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7QigiU29mdHBob25lIFNlc3Npb24gQ29ubmVjdGVkIixvLmdldENvbnRhY3RJZCgpKSx0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MpLFcoZSksRyhvKSxfKG8pfSx1Lm9uU2Vzc2lvbkNvbXBsZXRlZD1mdW5jdGlvbihlKXtCKCJTb2Z0cGhvbmUgU2Vzc2lvbiBDb21wbGV0ZWQiLG8uZ2V0Q29udGFjdElkKCkpLGRlbGV0ZSBsW2FdLGRlbGV0ZSBwW2FdLEoobyxlLnNlc3Npb25SZXBvcnQpLE4oYSl9LHUub25Mb2NhbFN0cmVhbUFkZGVkPWZ1bmN0aW9uKGUsbil7Q1thXT17c3RyZWFtOm59LHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZGF0YTp7Y29ubmVjdGlvbklkOmF9fSl9LHUucmVtb3RlQXVkaW9FbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKXx8d2luZG93LnBhcmVudC5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpLHM/dS5jb25uZWN0KHMuZ2V0KHkuaWNlU2VydmVycykpOnUuY29ubmVjdCgpfX07dmFyIHk9ZnVuY3Rpb24oZSxuKXtsW25dJiZmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5FTkRFRHx8ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5FUlJPUnx8ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5NSVNTRUR9KGUpJiYobShuKSxnKCkpLCFlLmlzU29mdHBob25lQ2FsbCgpfHxwW25dfHxlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJmUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkd8fCh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKT9mdW5jdGlvbihlLHQpe2Q9ITAsaD1lLGY9dH0oZSxuKTpvLnN0YXJ0U2Vzc2lvbihlLG4pKX0sRT1mdW5jdGlvbihlKXt2YXIgdD1lLmdldEFnZW50Q29ubmVjdGlvbigpLmNvbm5lY3Rpb25JZDtTLmluZm8oIkNvbnRhY3QgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxwW3RdfHwoZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7eShlLHQpfSkpLGUub25EZXN0cm95KChmdW5jdGlvbigpeyFmdW5jdGlvbihlKXtsW2VdJiZtKGUpfSh0KX0pKSl9O28ub25Jbml0Q29udGFjdFN1Yj10LmNvbnRhY3QoRSksKG5ldyB0LkFnZW50KS5nZXRDb250YWN0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO1MuaW5mbygiQ29udGFjdCBleGlzdCBpbiB0aGUgc25hcHNob3QuIFJlaW5pdGlhdGUgdGhlIENvbnRhY3QgYW5kIFJUQyBzZXNzaW9uIGNyZWF0aW9uIGZvciBjb250YWN0SWQiK2UuZ2V0Q29udGFjdElkKCksImFnZW50IGNvbm5lY3Rpb25JZCAiK3QpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksRShlKSx5KGUsdCl9KSksdGhpcy50ZXJtaW5hdGU9KCk9PntvLm9uSW5pdENvbnRhY3RTdWImJm8ub25Jbml0Q29udGFjdFN1Yi51bnN1YnNjcmliZSYmby5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksYSYmYS51bnN1YnNjcmliZSYmYS51bnN1YnNjcmliZSgpLGMmJmMudW5zdWJzY3JpYmUmJmMudW5zdWJzY3JpYmUoKSx1JiZ1LnVuc3Vic2NyaWJlJiZ1LnVuc3Vic2NyaWJlKCkscy5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQmJnMuY2xlYXJJZGxlUnRjUGVlckNvbm5lY3Rpb25UaW1lcklkKCkscz1udWxsfX0sXz1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0VXBzdHJlYW0oKSxyPWUuZ2V0QWdlbnRDb25uZWN0aW9uKCk7aWYocil7dmFyIG89ci5nZXRTb2Z0cGhvbmVNZWRpYUluZm8oKTtvPyEwPT09by5hdXRvQWNjZXB0PyhTLmluZm8oIkF1dG8tYWNjZXB0IGlzIGVuYWJsZWQsIHNlbmRpbmcgb3V0IEFjY2VwdGVkIGV2ZW50IHRvIHN0b3AgcmluZ3RvbmUuLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZGF0YTpuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0pLG4uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGUuY29udGFjdElkKSxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSkpOlMuaW5mbygiQXV0by1hY2NlcHQgaXMgZGlzYWJsZWQsIHJpbmd0b25lIHdpbGwgYmUgc3RvcHBlZCBieSB1c2VyIGFjdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOlMuaW5mbygiTm90IGFibGUgdG8gcmV0cmlldmUgdGhlIGF1dG8tYWNjZXB0IHNldHRpbmcgZnJvbSBudWxsIFNvZnRwaG9uZU1lZGlhSW5mbywgaWdub3JpbmcgZXZlbnQgcHVibGlzaC4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1lbHNlIFMuaW5mbygiTm90IGFibGUgdG8gcmV0cmlldmUgdGhlIGF1dG8tYWNjZXB0IHNldHRpbmcgZnJvbSBudWxsIEFnZW50Q29ubmVjdGlvbiwgaWdub3JpbmcgZXZlbnQgcHVibGlzaC4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sdz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuTVVURSxPKX0sUj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9TUEVBS0VSX0RFVklDRSxEKX0saz1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfTUlDUk9QSE9ORV9ERVZJQ0UsKHQ9PlAoey4uLnQsZW5hYmxlRWNob0NhbmNlbGxhdGlvbjplfSkpKX0sTD1mdW5jdGlvbigpe3RyeXt0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+NDMmJm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZToibWljcm9waG9uZSJ9KS50aGVuKChmdW5jdGlvbihlKXtlLm9uY2hhbmdlPWZ1bmN0aW9uKCl7Uy5pbmZvKCJNaWNyb3Bob25lIFBlcm1pc3Npb246ICIrZS5zdGF0ZSksQigiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czplLnN0YXRlfSksImRlbmllZCI9PT1lLnN0YXRlJiZGKGIuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKX19KSl9Y2F0Y2goZSl7Uy5lcnJvcigiRmFpbGVkIGluIGRldGVjdGluZyBtaWNyb3Bob25lIHBlcm1pc3Npb24gc3RhdHVzOiAiK2UpfX0sTj1mdW5jdGlvbihlKXtkZWxldGUgQ1tlXSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGRhdGE6e211dGVkOiExfX0pfSxPPWZ1bmN0aW9uKGUpe3ZhciBuO2lmKDAhPT10LmtleXMoQykubGVuZ3RoKXtmb3IodmFyIHIgaW4gZSYmdm9pZCAwIT09ZS5tdXRlJiYobj1lLm11dGUpLEMpaWYoQy5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89Q1tyXS5zdHJlYW07aWYobyl7dmFyIGk9by5nZXRBdWRpb1RyYWNrcygpWzBdO3ZvaWQgMCE9PW4/KGkuZW5hYmxlZD0hbixDW3JdLm11dGVkPW4sbj9TLmluZm8oIkFnZW50IGhhcyBtdXRlZCB0aGUgY29udGFjdCwgY29ubmVjdGlvbklkIC0gICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTpTLmluZm8oIkFnZW50IGhhcyB1bm11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAiK3IpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOm49Q1tyXS5tdXRlZHx8ITF9fXQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6bn19KX19LEQ9ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IHNwZWFrZXIgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4pe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKXx8d2luZG93LnBhcmVudC5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpO3ImJiJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFNpbmtJZD9yLnNldFNpbmtJZChuKS50aGVuKCgoKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU3BlYWtlciBkZXZpY2UgJHtufSBzdWNjZXNzZnVsbHkgc2V0IHRvIHNwZWFrZXIgYXVkaW8gZWxlbWVudGApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgc3BlYWtlciBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSk6dC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyByZW1vdGVBdWRpb0VsZW1lbnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LFA9ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDAhPT10LmtleXMoQykubGVuZ3RoKWlmKG4pe3ZhciByPXQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyKCksbz17YXVkaW86e2RldmljZUlkOntleGFjdDpufX19O2UuZW5hYmxlRWNob0NhbmNlbGxhdGlvbnx8KG8uYXVkaW8uZWNob0NhbmNlbGxhdGlvbj0hMSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJlY2hvQ2FuY2VsbGF0aW9uQ2hlY2siLGRhdGE6e2NvdW50OjEsZGlzYWJsZUVjaG9DYW5jZWxsYXRpb246IWUuZW5hYmxlRWNob0NhbmNlbGxhdGlvbn19KSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKChlPT57dHJ5e3ZhciBvPWUuZ2V0QXVkaW9UcmFja3MoKVswXTtmb3IodmFyIGkgaW4gQylDLmhhc093blByb3BlcnR5KGkpJiYoQ1tpXS5zdHJlYW0sci5nZXRTZXNzaW9uKGkpLl9wYy5nZXRTZW5kZXJzKClbMF0ucmVwbGFjZVRyYWNrKG8pLnRoZW4oKGZ1bmN0aW9uKCl7ci5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrKGksbyksdC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBNaWNyb3Bob25lIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gbG9jYWwgbWVkaWEgc3RyZWFtIGluIFJUQ1J0cFNlbmRlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgbWljcm9waG9uZSBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgbG9jYWxNZWRpYVN0cmVhbSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LHg9ZnVuY3Rpb24oZSxuKXtpZihuPT09dC5SVENFcnJvcnMuSUNFX0NPTExFQ1RJT05fVElNRU9VVCl7Zm9yKHZhciByPSJcbiIsbz0wO288ZS5faWNlU2VydmVycy5sZW5ndGg7bysrKWZvcih2YXIgaT0wO2k8ZS5faWNlU2VydmVyc1tvXS51cmxzLmxlbmd0aDtpKyspcj1yK2UuX2ljZVNlcnZlcnNbb10udXJsc1tpXSsiXG4iO0YoYi5JQ0VfQ09MTEVDVElPTl9USU1FT1VULCJJY2UgY29sbGVjdGlvbiB0aW1lZG91dC4gIixyKX1lbHNlIG49PT10LlJUQ0Vycm9ycy5VU0VSX0JVU1k/RihiLlVTRVJfQlVTWV9FUlJPUiwiU29mdHBob25lIGNhbGwgVXNlckJ1c3kgZXJyb3IuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFP0YoYi5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFLCJIYW5kc2hha2luZyB3aXRoIFNpZ25hbGxpbmcgU2VydmVyICIrZS5fc2lnbmFsaW5nVXJpKyIgZmFpbGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkdVTV9USU1FT1VUX0ZBSUxVUkV8fG49PT10LlJUQ0Vycm9ycy5HVU1fT1RIRVJfRkFJTFVSRT9GKGIuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKTpuPT09dC5SVENFcnJvcnMuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkU/RihiLlNJR05BTExJTkdfQ09OTkVDVElPTl9GQUlMVVJFLCJVUkwgIitlLl9zaWduYWxpbmdVcmkrIiBjYW5ub3QgYmUgcmVhY2hlZC4gIixlLl9zaWduYWxpbmdVcmkpOm49PT10LlJUQ0Vycm9ycy5DQUxMX05PVF9GT1VORD9TLmVycm9yKCJTb2Z0cGhvbmUgY2FsbCBmYWlsZWQgZHVlIHRvIENhbGxOb3RGb3VuZEV4Y2VwdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOkYoYi5XRUJSVENfRVJST1IsIndlYnJ0YyBzeXN0ZW0gZXJyb3IuICIsIiIpfSxNPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvJnF1b3Q7L2csJyInKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX0sVT1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0LnN1Y2Nlc3M9dC5zdWNjZXNzfHxmdW5jdGlvbigpe30sdC5mYWlsdXJlPXQuZmFpbHVyZXx8ZnVuY3Rpb24oKXt9O3ZhciBuPXthdWRpbzohMH0scj1udWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlKXtpZigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSlyPW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG4pO2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpcmV0dXJuIHZvaWQgdC5mYWlsdXJlKGIuVU5TVVBQT1JURURfQlJPV1NFUik7cj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKG4sZSx0KX0pKX1yZXR1cm4gci50aGVuKChmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF1ZGlvVHJhY2tzKCk7biYmbi5sZW5ndGg+MD90LnN1Y2Nlc3MoZSk6dC5mYWlsdXJlKGIuTUlDUk9QSE9ORV9OT1RfU0hBUkVEKX0pLChmdW5jdGlvbihlKXt0LmZhaWx1cmUoYi5NSUNST1BIT05FX05PVF9TSEFSRUQpfSkpLHJ9dC5mYWlsdXJlKGIuVU5TVVBQT1JURURfQlJPV1NFUil9LEY9ZnVuY3Rpb24oZSxuLHIpe1MuZXJyb3IoIlNvZnRwaG9uZSBlcnJvciBvY2N1cnJlZCA6ICIsZSxufHwiIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLlNPRlRQSE9ORV9FUlJPUixkYXRhOm5ldyB0LlNvZnRwaG9uZUVycm9yKGUsbixyKX0pfSxxPWZ1bmN0aW9uKGUsdCl7QigiU29mdHBob25lIFNlc3Npb24gRmFpbGVkIixlLHtmYWlsZWRSZWFzb246dH0pfSxCPWZ1bmN0aW9uKGUsbixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bixkYXRhOnJ9KX0saj1mdW5jdGlvbihlLHQsbil7QihlLHQsW3tuYW1lOiJBZ2VudENvbm5lY3Rpb25JZCIsdmFsdWU6bn1dKSxTLmluZm8oIlB1Ymxpc2ggbXVsdGlwbGUgc2Vzc2lvbiBlcnJvciBtZXRyaWNzIixlLCJjb250YWN0SWQgIit0LCJhZ2VudCBjb25uZWN0aW9uSWQgIituKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTtBLmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHQuaXNPcGVyYUJyb3dzZXIoKSYmdC5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uKCk+MTcpfHwhISh0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+MjIpfHwhISh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb24oKT4yMSl9O3ZhciBWPWZ1bmN0aW9uKGUpe3ZhciB0PWEuc2xpY2UoKTthPVtdLHQubGVuZ3RoPjAmJmUuc2VuZFNvZnRwaG9uZU1ldHJpY3ModCx7c3VjY2VzczpmdW5jdGlvbigpe1MuaW5mbygic2VuZFNvZnRwaG9uZU1ldHJpY3Mgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7Uy5lcnJvcigic2VuZFNvZnRwaG9uZU1ldHJpY3MgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KX0sVz1mdW5jdGlvbihlKXt5PXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlLmdldFVzZXJBdWRpb1N0YXRzKCkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9bCxuPXoobD1lLHQsaSk7YS5wdXNoKG4pLEsobil9KSwoZnVuY3Rpb24oZSl7Uy5kZWJ1ZygiRmFpbGVkIHRvIGdldCB1c2VyIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLmdldFJlbW90ZUF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1wLG49eihwPWUsdCxzKTthLnB1c2gobiksSyhuKX0pLChmdW5jdGlvbihlKXtTLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlbW90ZSBhdWRpbyBzdGF0cy4iLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSwxZTMpfSxHPWZ1bmN0aW9uKGUpe0U9d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe1YoZSl9KSwzZTQpfSxIPWZ1bmN0aW9uKCl7bD1udWxsLHA9bnVsbCxhPVtdLGM9W10sdT1bXSx5PW51bGwsRT1udWxsLGQ9MCxoPTAsZj0wLGc9MCxtPTB9LHo9ZnVuY3Rpb24oZSx0LG4pe2lmKHQmJmUpe3ZhciByPWUucGFja2V0c0xvc3Q+dC5wYWNrZXRzTG9zdD9lLnBhY2tldHNMb3N0LXQucGFja2V0c0xvc3Q6MCxvPWUucGFja2V0c0NvdW50PnQucGFja2V0c0NvdW50P2UucGFja2V0c0NvdW50LXQucGFja2V0c0NvdW50OjA7cmV0dXJuIFgobyxuKSxZKGUuYXVkaW9MZXZlbCxuKSxuZXcgUShlLnRpbWVzdGFtcCxyLG8sbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9cmV0dXJuIG5ldyBRKGUudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9LEs9ZnVuY3Rpb24oZSl7aWYoZS5zb2Z0cGhvbmVTdHJlYW1UeXBlPT09aSl7Zm9yKDtjLmxlbmd0aD49MTA4MDA7KWMuc2hpZnQoKTtjLnB1c2goZSl9ZWxzZSBpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1zKXtmb3IoO3UubGVuZ3RoPj0xMDgwMDspdS5zaGlmdCgpO3UucHVzaChlKX19LFg9ZnVuY3Rpb24oZSx0KXt0PT09aT8obSsrLGU8PTA/ZCsrOmQ9MCk6dD09PXMmJihlPD0wP2YrKzpmPTApfSxZPWZ1bmN0aW9uKGUsdCl7dD09PWk/bnVsbCE9PWUmJmU8PTE/aCsrOmg9MDp0PT09cyYmKG51bGwhPT1lJiZlPD0xP2crKzpnPTApfSwkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwoZSksbnVsbH0sSj1mdW5jdGlvbihuLHIpe3k9JCh5KSxFPSQoRSksZnVuY3Rpb24obixyLG8sYSl7ci5zdHJlYW1TdGF0cz1bWihvLGkpLFooYSxzKV07dmFyIGw9e2NhbGxTdGFydFRpbWU6ci5zZXNzaW9uU3RhcnRUaW1lLGNhbGxFbmRUaW1lOnIuc2Vzc2lvbkVuZFRpbWUsZ3VtVGltZU1pbGxpczpyLmd1bVRpbWVNaWxsaXMsaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOnIuaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnIuaWNlQ29sbGVjdGlvblRpbWVNaWxsaXMsc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnIuc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzLGhhbmRzaGFraW5nVGltZU1pbGxpczpyLmhhbmRzaGFraW5nVGltZU1pbGxpcyxwcmVUYWxraW5nVGltZU1pbGxpczpyLnByZVRhbGtpbmdUaW1lTWlsbGlzLHRhbGtpbmdUaW1lTWlsbGlzOnIudGFsa2luZ1RpbWVNaWxsaXMsY2xlYW51cFRpbWVNaWxsaXM6ci5jbGVhbnVwVGltZU1pbGxpcyxpY2VDb2xsZWN0aW9uRmFpbHVyZTpyLmljZUNvbGxlY3Rpb25GYWlsdXJlLHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTpyLnNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZSxoYW5kc2hha2luZ0ZhaWx1cmU6ci5oYW5kc2hha2luZ0ZhaWx1cmUsZ3VtT3RoZXJGYWlsdXJlOnIuZ3VtT3RoZXJGYWlsdXJlLGd1bVRpbWVvdXRGYWlsdXJlOnIuZ3VtVGltZW91dEZhaWx1cmUsY3JlYXRlT2ZmZXJGYWlsdXJlOnIuY3JlYXRlT2ZmZXJGYWlsdXJlLHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOnIuc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmUsdXNlckJ1c3lGYWlsdXJlOnIudXNlckJ1c3lGYWlsdXJlLGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOnIuaW52YWxpZFJlbW90ZVNEUEZhaWx1cmUsbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOnIubm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlLHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTpyLnNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOnIuc3RyZWFtU3RhdHN9O24uc2VuZFNvZnRwaG9uZVJlcG9ydChsLHtzdWNjZXNzOmZ1bmN0aW9uKCl7Uy5pbmZvKCJzZW5kU29mdHBob25lUmVwb3J0IHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KGwpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe1MuZXJyb3IoInNlbmRTb2Z0cGhvbmVSZXBvcnQgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KTt2YXIgcD17QVVESU9fSU5QVVQ6e3BhY2tldHNDb3VudDpjLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDpjLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6Yy5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczpjLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKX0sQVVESU9fT1VUUFVUOntwYWNrZXRzQ291bnQ6dS5tYXAoKGU9PmUucGFja2V0c0NvdW50KSkscGFja2V0c0xvc3Q6dS5tYXAoKGU9PmUucGFja2V0c0xvc3QpKSxhdWRpb0xldmVsOnUubWFwKChlPT5lLmF1ZGlvTGV2ZWwpKSxqaXR0ZXJCdWZmZXJNaWxsaXM6dS5tYXAoKGU9PmUuaml0dGVyQnVmZmVyTWlsbGlzKSkscm91bmRUcmlwVGltZU1pbGxpczp1Lm1hcCgoZT0+ZS5yb3VuZFRyaXBUaW1lTWlsbGlzKSl9fSx5PXsuLi5sLHNvZnRwaG9uZVN0cmVhbVBlclNlY29uZFN0YXRpc3RpY3M6cCxpY2VDb25uZWN0aW9uc0xvc3Q6ci5pY2VDb25uZWN0aW9uc0xvc3QsaWNlQ29ubmVjdGlvbnNGYWlsZWQ6ci5pY2VDb25uZWN0aW9uc0ZhaWxlZHx8bnVsbCxwZWVyQ29ubmVjdGlvbkZhaWxlZDpyLnBlZXJDb25uZWN0aW9uRmFpbGVkfHxudWxsLHJ0Y0pzVmVyc2lvbjpyLnJ0Y0pzVmVyc2lvbnx8bnVsbCxjb25zZWN1dGl2ZU5vQXVkaW9JbnB1dFBhY2tldHM6ZCxjb25zZWN1dGl2ZUxvd0lucHV0QXVkaW9MZXZlbDpoLGNvbnNlY3V0aXZlTm9BdWRpb091dHB1dFBhY2tldHM6Zixjb25zZWN1dGl2ZUxvd091dHB1dEF1ZGlvTGV2ZWw6ZyxhdWRpb0lucHV0Q29ubmVjdGVkRHVyYXRpb25TZWNvbmRzOm0sY2NwTWVkaWFSZWFkeUxhdGVuY3lNaWxsaXM6MCxjb250YWN0U3VidHlwZTpuLmdldENvbnRhY3RTdWJ0eXBlKCksZWFybHlHdW1FbmFibGVkOiExLGVhcmx5R3VtV29ya2VkOiExLHZkaVBsYXRmb3JtOnZ8fG51bGwsc3RyZWFtSnNWZXJzaW9uOnQudmVyc2lvbn07dC5wdWJsaXNoU29mdHBob25lUmVwb3J0KHtjb250YWN0SWQ6bi5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6eX0pLFMuaW5mbygic2VudCBUZWxlbWV0cnlDYWxsUmVwb3J0ICIrSlNPTi5zdHJpbmdpZnkoeSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KG4scixaKGwsaSksWihwLHMpKSxWKG4pfSxRPWZ1bmN0aW9uKGUsdCxuLHIsbyxpLHMpe3RoaXMuc29mdHBob25lU3RyZWFtVHlwZT1yLHRoaXMudGltZXN0YW1wPWUsdGhpcy5wYWNrZXRzTG9zdD10LHRoaXMucGFja2V0c0NvdW50PW4sdGhpcy5hdWRpb0xldmVsPW8sdGhpcy5qaXR0ZXJCdWZmZXJNaWxsaXM9aSx0aGlzLnJvdW5kVHJpcFRpbWVNaWxsaXM9c30sWj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUSgoZT1lfHx7fSkudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsdCxlLmF1ZGlvTGV2ZWwpfSxlZT1mdW5jdGlvbihlKXt0aGlzLl9vcmlnaW5hbExvZ2dlcj1lO3ZhciBuPXRoaXM7dGhpcy5fdGVlPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWzBdKSxvPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKCl7bys9IiAlcyJ9KSksci5hcHBseShuLl9vcmlnaW5hbExvZ2dlcixbdC5Mb2dDb21wb25lbnQuU09GVFBIT05FLG9dLmNvbmNhdChlKSl9fX07ZWUucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgxLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmRlYnVnKShhcmd1bWVudHMpfSxlZS5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMix0aGlzLl9vcmlnaW5hbExvZ2dlci5pbmZvKShhcmd1bWVudHMpfSxlZS5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgzLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmxvZykoYXJndW1lbnRzKX0sZWUucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDQsdGhpcy5fb3JpZ2luYWxMb2dnZXIud2FybikoYXJndW1lbnRzKX0sZWUucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg1LHRoaXMuX29yaWdpbmFsTG9nZ2VyLmVycm9yKShhcmd1bWVudHMpfSx0LlNvZnRwaG9uZU1hbmFnZXI9QX0oKX0sOTQ0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FjaGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzWzBdKXx8KHQuY2FjaGVbYXJndW1lbnRzWzBdXT10LnBhcnNlKGFyZ3VtZW50c1swXSkpLHQuZm9ybWF0LmNhbGwobnVsbCx0LmNhY2hlW2FyZ3VtZW50c1swXV0sYXJndW1lbnRzKX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1bXTt0PjA7blstLXRdPWUpO3JldHVybiBuLmpvaW4oIiIpfXQuZm9ybWF0PWZ1bmN0aW9uKGUsbyl7dmFyIGkscyxhLGMsdSxsLHAsZD0xLGg9ZS5sZW5ndGgsZj0iIixnPVtdO2ZvcihzPTA7czxoO3MrKylpZigic3RyaW5nIj09PShmPW4oZVtzXSkpKWcucHVzaChlW3NdKTtlbHNlIGlmKCJhcnJheSI9PT1mKXtpZigoYz1lW3NdKVsyXSlmb3IoaT1vW2RdLGE9MDthPGNbMl0ubGVuZ3RoO2ErKyl7aWYoIWkuaGFzT3duUHJvcGVydHkoY1syXVthXSkpdGhyb3cgdCgnW3NwcmludGZdIHByb3BlcnR5ICIlcyIgZG9lcyBub3QgZXhpc3QnLGNbMl1bYV0pO2k9aVtjWzJdW2FdXX1lbHNlIGk9Y1sxXT9vW2NbMV1dOm9bZCsrXTtpZigvW15zXS8udGVzdChjWzhdKSYmIm51bWJlciIhPW4oaSkpdGhyb3cgdCgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVzIixuKGkpKTtzd2l0Y2goY1s4XSl7Y2FzZSJiIjppPWkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjppPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7YnJlYWs7Y2FzZSJkIjppPXBhcnNlSW50KGksMTApO2JyZWFrO2Nhc2UiZSI6aT1jWzddP2kudG9FeHBvbmVudGlhbChjWzddKTppLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOmk9Y1s3XT9wYXJzZUZsb2F0KGkpLnRvRml4ZWQoY1s3XSk6cGFyc2VGbG9hdChpKTticmVhaztjYXNlIm8iOmk9aS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmk9KGk9U3RyaW5nKGkpKSYmY1s3XT9pLnN1YnN0cmluZygwLGNbN10pOmk7YnJlYWs7Y2FzZSJ1IjppPj4+PTA7YnJlYWs7Y2FzZSJ4IjppPWkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6aT1pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWk9L1tkZWZdLy50ZXN0KGNbOF0pJiZjWzNdJiZpPj0wPyIrIitpOmksbD1jWzRdPyIwIj09Y1s0XT8iMCI6Y1s0XS5jaGFyQXQoMSk6IiAiLHA9Y1s2XS1TdHJpbmcoaSkubGVuZ3RoLHU9Y1s2XT9yKGwscCk6IiIsZy5wdXNoKGNbNV0/aSt1OnUraSl9cmV0dXJuIGcuam9pbigiIil9LHQuY2FjaGU9e30sdC5wYXJzZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZSxuPVtdLHI9W10sbz0wO3Q7KXtpZihudWxsIT09KG49L15bXlx4MjVdKy8uZXhlYyh0KSkpci5wdXNoKG5bMF0pO2Vsc2UgaWYobnVsbCE9PShuPS9eXHgyNXsyfS8uZXhlYyh0KSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KG49L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteXCldKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1mb3N1eFhdKS8uZXhlYyh0KSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2lmKG5bMl0pe298PTE7dmFyIGk9W10scz1uWzJdLGE9W107aWYobnVsbD09PShhPS9eKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7Zm9yKGkucHVzaChhWzFdKTsiIiE9PShzPXMuc3Vic3RyaW5nKGFbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0oYT0vXlwuKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSlpLnB1c2goYVsxXSk7ZWxzZXtpZihudWxsPT09KGE9L15cWyhcZCspXF0vLmV4ZWMocykpKXRocm93IltzcHJpbnRmXSBodWg/IjtpLnB1c2goYVsxXSl9blsyXT1pfWVsc2Ugb3w9MjtpZigzPT09byl0aHJvdyJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIjtyLnB1c2gobil9dD10LnN1YnN0cmluZyhuWzBdLmxlbmd0aCl9cmV0dXJuIHJ9LGUuc3ByaW50Zj10LGUudnNwcmludGY9ZnVuY3Rpb24oZSxuLHIpe3JldHVybihyPW4uc2xpY2UoMCkpLnNwbGljZSgwLDAsZSksdC5hcHBseShudWxsLHIpfX0oKX0sODI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfSxuLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7fSxyLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe307dmFyIG89ZnVuY3Rpb24oZSx0KXtuLmNhbGwodGhpcyksdGhpcy53aW5kb3c9ZSx0aGlzLmRvbWFpbj10fHwiKiJ9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LnBvc3RNZXNzYWdlKGUsdGhpcy5kb21haW4pfSxvLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9O3ZhciBpPWZ1bmN0aW9uKGUsdCxyKXtuLmNhbGwodGhpcyksdGhpcy5pbnB1dD1lLHRoaXMub3V0cHV0PXQsdGhpcy5kb21haW49cnx8IioifTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLm91dHB1dC5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0saS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHQ9Pnt0LnNvdXJjZT09PXRoaXMub3V0cHV0JiZlKHQpfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyksdGhpcy5wb3J0PWUsdGhpcy5pZD10LnJhbmRvbUlkKCl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5wb3N0TWVzc2FnZShlKX0scy5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlKX0scy5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH07dmFyIGE9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMuc3RyZWFtTWFwPWU/dC5pbmRleChlLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJZCgpfSkpOnt9LHRoaXMubWVzc2FnZUxpc3RlbmVycz1bXX07KGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1hLGEucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Quc2VuZChlKX1jYXRjaChlKXt9fSkpfSxhLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5tZXNzYWdlTGlzdGVuZXJzLnB1c2goZSksdGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbk1lc3NhZ2UoZSl9KSl9LGEucHJvdG90eXBlLmFkZFN0cmVhbT1mdW5jdGlvbihlKXt0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldPWUsdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Uub25NZXNzYWdlKHQpfSkpfSxhLnByb3RvdHlwZS5yZW1vdmVTdHJlYW09ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuc3RyZWFtTWFwW2UuZ2V0SWQoKV19LGEucHJvdG90eXBlLmdldFN0cmVhbXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3RyZWFtTWFwKX0sYS5wcm90b3R5cGUuZ2V0U3RyZWFtRm9yUG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0U3RyZWFtcygpLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wb3J0PT09ZX0pKX07dmFyIGM9ZnVuY3Rpb24oZSxuLG8pe3RoaXMubmFtZT1lLHRoaXMudXBzdHJlYW09bnx8bmV3IHIsdGhpcy5kb3duc3RyZWFtPW98fG5ldyByLHRoaXMuZG93bnN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtQnVzPW5ldyB0LkV2ZW50QnVzLHRoaXMudXBzdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMudXBzdHJlYW1CdXMpKSx0aGlzLmRvd25zdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMuZG93bnN0cmVhbUJ1cykpfTtjLnByb3RvdHlwZS5vblVwc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy51cHN0cmVhbUJ1cy5zdWJzY3JpYmUoZSxuKX0sYy5wcm90b3R5cGUub25BbGxVcHN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5vbkRvd25zdHJlYW09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsRG93bnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuZG93bnN0cmVhbUJ1cy5zdWJzY3JpYmVBbGwoZSl9LGMucHJvdG90eXBlLnNlbmRVcHN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLnVwc3RyZWFtLnNlbmQoe2V2ZW50OmUsZGF0YTpufSl9LGMucHJvdG90eXBlLnNlbmREb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHRoaXMuZG93bnN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZGF0YTtuLmV2ZW50JiZlLnRyaWdnZXIobi5ldmVudCxuLmRhdGEpfSxjLnByb3RvdHlwZS5wYXNzVXBzdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudXBzdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnBhc3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7dGhpcy51cHN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpLHRoaXMuZG93bnN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpfTt2YXIgdT1mdW5jdGlvbihlLHQsbixyKXtjLmNhbGwodGhpcyxlLG5ldyBpKHQsbi5jb250ZW50V2luZG93LHJ8fCIqIiksbnVsbCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx0LlN0cmVhbT1uLHQuTnVsbFN0cmVhbT1yLHQuV2luZG93U3RyZWFtPW8sdC5XaW5kb3dJT1N0cmVhbT1pLHQuUG9ydFN0cmVhbT1zLHQuU3RyZWFtTXVsdGlwbGV4ZXI9YSx0LkNvbmR1aXQ9Yyx0LklGcmFtZUNvbmR1aXQ9dX0oKX0sODMzOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKG4sInRvU3RhdGUiKSx0aGlzLmZyb21TdGF0ZT1lLHRoaXMudG9TdGF0ZT1ufTtuLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7dGhyb3cgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCl9LG4ucHJvdG90eXBlLmdldEZyb21TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyb21TdGF0ZX0sbi5wcm90b3R5cGUuZ2V0VG9TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RhdGV9O3ZhciByPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiYXNzb2NpYXRpb25zIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmFzc29jaWF0aW9ucz1vfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFzc29jaWF0aW9uc307dmFyIG89ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChvLCJjbG9zdXJlIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihvKSwiY2xvc3VyZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxuLmNhbGwodGhpcyxlLHIpLHRoaXMuY2xvc3VyZT1vfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3N1cmUoZSx0aGlzLmdldEZyb21TdGF0ZSgpLHRoaXMuZ2V0VG9TdGF0ZSgpKX07dmFyIGk9ZnVuY3Rpb24oKXt0aGlzLmZyb21NYXA9e319O2kuQU5ZPSI8PGFueT4+IixpLnByb3RvdHlwZS5hc3NvYz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcztpZighZSl0aHJvdyBuZXcgRXJyb3IoImZyb21TdGF0ZU9iaiBpcyBub3QgZGVmaW5lZC4iKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInRvU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJhc3NvY09iaiBpcyBub3QgZGVmaW5lZC4iKTtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aS5hc3NvYyhlLHQsbil9KSk6dCBpbnN0YW5jZW9mIEFycmF5P3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5hc3NvYyhlLHQsbil9KSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IG8oZSx0LG4pKTpuIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LG4pKTp0aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgcihlLHQsW25dKSksdGhpc30saS5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwobiwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKTt2YXIgbz1bXSxzPXRoaXMuZnJvbU1hcFtpLkFOWV18fHt9LGE9dGhpcy5mcm9tTWFwW25dfHx7fTtyZXR1cm4gbz0obz1vLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKHMsZSxuLHIpKSkuY29uY2F0KHRoaXMuX2dldEFzc29jaWF0aW9uc0Zyb21NYXAoYSxlLG4scikpfSxpLnByb3RvdHlwZS5fYWRkQXNzb2NpYXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5mcm9tTWFwW2UuZ2V0RnJvbVN0YXRlKCldO3R8fCh0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXT17fSk7dmFyIG49dFtlLmdldFRvU3RhdGUoKV07bnx8KG49dFtlLmdldFRvU3RhdGUoKV09W10pLG4ucHVzaChlKX0saS5wcm90b3R5cGUuX2dldEFzc29jaWF0aW9uc0Zyb21NYXA9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuKGVbaS5BTlldfHxbXSkuY29uY2F0KGVbcl18fFtdKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29uY2F0KG4uZ2V0QXNzb2NpYXRpb25zKHQpKX0pLFtdKX0sdC5FdmVudEdyYXBoPWl9KCl9LDg5MTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQscj1bImJ1YmJsZXMiLCJjYW5jZWxCdWJibGUiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJkYXRhIiwiZGVmYXVsdFByZXZlbnRlZCIsImV2ZW50UGhhc2UiLCJpc1RydXN0ZWQiLCJsYXN0RXZlbnRJZCIsIm9yaWdpbiIsInJldHVyblZhbHVlIiwidGltZVN0YW1wIiwidHlwZSJdO3Quc3ByaW50Zj1lLnNwcmludGYsdC52c3ByaW50Zj1lLnZzcHJpbnRmLGRlbGV0ZSBlLnNwcmludGYsZGVsZXRlIGUudnNwcmludGYsdC5IVFRQX1NUQVRVU19DT0RFUz17U1VDQ0VTUzoyMDAsVU5BVVRIT1JJWkVEOjQwMSxBQ0NFU1NfREVOSUVEOjQwMyxUT09fTUFOWV9SRVFVRVNUUzo0MjksSU5URVJOQUxfU0VSVkVSX0VSUk9SOjUwMH0sdC5UUkFOU1BPUlRfVFlQRVM9e0NIQVRfVE9LRU46ImNoYXRfdG9rZW4iLFdFQl9TT0NLRVQ6IndlYl9zb2NrZXQiLEFHRU5UX0RJU0NPVkVSWToiYWdlbnRfZGlzY292ZXJ5IixXRUJfUlRDOiJ3ZWJfcnRjIn0sdC5oaXRjaD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksbj1lLnNoaWZ0KCkscj1lLnNoaWZ0KCk7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChuLCJzY29wZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJtZXRob2QiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiByLmFwcGx5KG4sZS5jb25jYXQodCkpfX0sdC5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LHQuaXNBcnJheT1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSx0LmtleXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChyKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChlW3JdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaCh7a2V5Om4sdmFsdWU6ZVtuXX0pO3JldHVybiB0fSx0Lm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5lbnRyaWVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZS5rZXldPWUudmFsdWV9KSl9KSksbn0sdC5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdC5maW5kPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYodChlW25dKSlyZXR1cm4gZVtuXTtyZXR1cm4gbnVsbH0sdC5jb250YWlucz1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpuIGluIGV9LHQuY29udGFpbnNWYWx1ZT1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpudWxsIT10LmZpbmQodC52YWx1ZXMoZSksKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKX0sdC5yYW5kb21JZD1mdW5jdGlvbigpe3JldHVybiB0LnNwcmludGYoIiVzLSVzIix0Lm5vdygpLE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpKX0sdC5tYWtlRW51bT1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoL1wuPyhbYS16XSspXz8vZywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpKyJfIn0pKS5yZXBsYWNlKC9fJC8sIiIpO3Rbbl09ZX0pKSx0fSx0Lm1ha2VOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4pe3ZhciByPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbihuKXtyW25dPXQuc3ByaW50ZigiJXM6OiVzIixlLHJbbl0pfSkpLHJ9LHQubWFrZUdlbmVyaWNOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4scil7dmFyIG89dC5tYWtlRW51bShuKTtyZXR1cm4gdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKG4pe29bbl09dC5zcHJpbnRmKCIlcyIrcisiJXMiLGUsb1tuXSl9KSksb30sdC5pc0Nocm9tZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiQ2hyb21lIil9LHQuaXNGaXJlZm94QnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJGaXJlZm94Iil9LHQuaXNPcGVyYUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiT3BlcmEiKX0sdC5pc0VkZ2VCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkVkZyIpfSx0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9bi5zdWJzdHJpbmcobi5pbmRleE9mKCJDaHJvbWUiKSs3KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiRmlyZWZveCIpKzgpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LHQuaXNWYWxpZExvY2FsZT1mdW5jdGlvbihlKXtyZXR1cm5be2lkOiJlbl9VUyIsbGFiZWw6IkVuZ2xpc2gifSx7aWQ6ImRlX0RFIixsYWJlbDoiRGV1dHNjaCJ9LHtpZDoiZXNfRVMiLGxhYmVsOiJFc3Bhw7FvbCJ9LHtpZDoiZnJfRlIiLGxhYmVsOiJGcmFuw6dhaXMifSx7aWQ6ImphX0pQIixsYWJlbDoi5pel5pys6KqeIn0se2lkOiJpdF9JVCIsbGFiZWw6Ikl0YWxpYW5vIn0se2lkOiJrb19LUiIsbGFiZWw6Iu2VnOq1reyWtCJ9LHtpZDoicHRfQlIiLGxhYmVsOiJQb3J0dWd1w6pzIn0se2lkOiJ6aF9DTiIsbGFiZWw6IuS4reaWhyjnroDkvZMpIn0se2lkOiJ6aF9UVyIsbGFiZWw6IuS4reaWhyjnuYHpq5QpIn1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWR9KSkuaW5jbHVkZXMoZSl9LHQuZ2V0T3BlcmFCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uaW5kZXhPZigiT3BlcmEiKSx0PS0xIT09bi5pbmRleE9mKCJWZXJzaW9uIik/bi5zdWJzdHJpbmcoZSs4KTpuLnN1YnN0cmluZyhlKzYpO3JldHVybiB0P3BhcnNlRmxvYXQodCk6LTF9LHQuaW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW3QoZSldPWV9KSksbn0sdC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT0xfSkpLHR9LHQucmVsYXRpdmVDb21wbGVtZW50PWZ1bmN0aW9uKGUsbil7dmFyIHI9e307cmV0dXJuIHQua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0IGluIGV8fChyW3RdPW5bdF0pfSkpLHJ9LHQuYXNzZXJ0VHJ1ZT1mdW5jdGlvbihlLG4pe2lmKCFlKXRocm93IG5ldyB0LlZhbHVlRXJyb3Iobil9LHQuYXNzZXJ0Tm90TnVsbD1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydFRydWUobnVsbCE9ZSYmdm9pZCAwIT09dHlwZW9mIGUsdC5zcHJpbnRmKCIlcyBtdXN0IGJlIHByb3ZpZGVkIixufHwiQSB2YWx1ZSIpKSxlfSx0LmRlZXBjb3B5PWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX0sdC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQ9ZnVuY3Rpb24oZSl7Y29uc3Qgbj17fTtyZXR1cm4gci5mb3JFYWNoKChyPT57dHJ5e25bcl09ZVtyXX1jYXRjaChlKXt0LmdldExvZygpLmluZm8oImRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudCBmYWlsZWQgb24ga2V5OiAiLHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHQuZGVlcGNvcHkobil9LHQuZ2V0QmFzZVVybD1mdW5jdGlvbigpe3ZhciBuPWUubG9jYXRpb247cmV0dXJuIHQuc3ByaW50ZigiJXMvLyVzOiVzIixuLnByb3RvY29sLG4uaG9zdG5hbWUsbi5wb3J0KX0sdC5nZXRVcmxXaXRoUHJvdG9jb2w9ZnVuY3Rpb24obil7dmFyIHI9ZS5sb2NhdGlvbi5wcm90b2NvbDtyZXR1cm4gbi5zdWJzdHIoMCxyLmxlbmd0aCkhPT1yP3Quc3ByaW50ZigiJXMvLyVzIixyLG4pOm59LHQuaXNGcmFtZWQ9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHdpbmRvdy5zZWxmIT09d2luZG93LnRvcH1jYXRjaChlKXtyZXR1cm4hMH19LHQuaGFzT3RoZXJDb25uZWN0ZWRDQ1BzPWZ1bmN0aW9uKCl7cmV0dXJuIHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPjF9LHQuZmV0Y2g9ZnVuY3Rpb24oZSxuLHIsbyl7cmV0dXJuIG89b3x8NSxyPXJ8fDFlMyxuPW58fHt9LG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBvKGEpe2ZldGNoKGUsbikudGhlbigoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlNVQ0NFU1M/ZS5qc29uKCkudGhlbigoZT0+aShlKSkpLmNhdGNoKCgoKT0+aSh7fSkpKToxIT09YSYmKGUuc3RhdHVzPj10LkhUVFBfU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUnx8ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlRPT19NQU5ZX1JFUVVFU1RTKT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe28oLS1hKX0pLHIpOnMoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KG8pfSkpfSx0LmZldGNoV2l0aFRpbWVvdXQ9YXN5bmMgZnVuY3Rpb24oZSxuLHIsbyxpKXtpZihyPXJ8fHt9LCFuKXJldHVybiB0LmZldGNoKGUscixvLGkpO2NvbnN0IHM9bmV3IEFib3J0Q29udHJvbGxlcixhPXNldFRpbWVvdXQoKCgpPT5zLmFib3J0KCkpLG4pLGM9YXdhaXQgdC5mZXRjaChlLHsuLi5yLHNpZ25hbDpzLnNpZ25hbH0sbyxpKTtyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGN9LHQuYmFja29mZj1mdW5jdGlvbihuLHIsbyxpKXt0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmdW5jIG11c3QgYmUgYSBGdW5jdGlvbiIpO3ZhciBzPXRoaXM7bih7c3VjY2VzczpmdW5jdGlvbihlKXtpJiZpLnN1Y2Nlc3MmJmkuc3VjY2VzcyhlKX0sZmFpbHVyZTpmdW5jdGlvbih0LGEpe2lmKG8+MCl7dmFyIGM9MipyKk1hdGgucmFuZG9tKCk7ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3MuYmFja29mZihuLDIqYywtLW8saSl9KSxjKX1lbHNlIGkmJmkuZmFpbHVyZSYmaS5mYWlsdXJlKHQsYSl9fSl9LHQucHVibGlzaE1ldHJpYz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5DTElFTlRfTUVUUklDLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfU1RBVFMsZGF0YTplfSl9LHQucHVibGlzaFNvZnRwaG9uZVJlcG9ydD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfUkVQT1JULGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGE9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJQ0tfU1RSRUFNX0RBVEEsZGF0YTplfSl9LHQucHVibGlzaENsaWVudFNpZGVMb2dzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ0xJRU5UX1NJREVfTE9HUyxlKX0sdC5hZGROYW1lc3BhY2VUb0xvZ3M9ZnVuY3Rpb24oZSl7WyJsb2ciLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciXS5mb3JFYWNoKCh0PT57Y29uc3Qgbj13aW5kb3cuY29uc29sZVt0XTt3aW5kb3cuY29uc29sZVt0XT1mdW5jdGlvbigpe2NvbnN0IHQ9QXJyYXkuZnJvbShhcmd1bWVudHMpO3QudW5zaGlmdChgWyR7ZX1dYCksbi5hcHBseSh3aW5kb3cuY29uc29sZSx0KX19KSl9LHQuUG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7fSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUub3Blbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbDtpZihuKXt2YXIgbz1uLmhlaWdodHx8NTc4LGk9bi53aWR0aHx8NDMzLHM9bi50b3B8fDAsYT1uLmxlZnR8fDA7KHI9d2luZG93Lm9wZW4oIiIsdCwid2lkdGg9IitpKyIsIGhlaWdodD0iK28rIiwgdG9wPSIrcysiLCBsZWZ0PSIrYSkpLmxvY2F0aW9uIT09ZSYmKHI9d2luZG93Lm9wZW4oZSx0LCJ3aWR0aD0iK2krIiwgaGVpZ2h0PSIrbysiLCB0b3A9IitzKyIsIGxlZnQ9IithKSl9ZWxzZShyPXdpbmRvdy5vcGVuKCIiLHQpKS5sb2NhdGlvbiE9PWUmJihyPXdpbmRvdy5vcGVuKGUsdCkpO3JldHVybiByfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpO2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCkscj1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKG4pO3JldHVybiByP3BhcnNlSW50KHIsMTApOjB9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHIsIiIrbil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TG9jYWxTdG9yYWdlS2V5PWZ1bmN0aW9uKGUpe3JldHVybiJjb25uZWN0UG9wdXBNYW5hZ2VyOjoiK2V9O3ZhciBvPXQubWFrZUVudW0oWyJncmFudGVkIiwiZGVuaWVkIiwiZGVmYXVsdCJdKTt0Lk5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlPVtdLHRoaXMucGVybWlzc2lvbj1vLkRFRkFVTFR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUucmVxdWVzdFBlcm1pc3Npb249ZnVuY3Rpb24oKXt2YXIgbj10aGlzOyJOb3RpZmljYXRpb24iaW4gZT9lLk5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uPT09by5ERU5JRUQ/KHQuZ2V0TG9nKCkud2FybigiVGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0byBub3QgcmVjZWl2ZSBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKTp0aGlzLnBlcm1pc3Npb24hPT1vLkdSQU5URUQmJmUuTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbigoZnVuY3Rpb24oZSl7bi5wZXJtaXNzaW9uPWUsZT09PW8uR1JBTlRFRD9uLl9zaG93UXVldWVkKCk6bi5xdWV1ZT1bXX0pKToodC5nZXRMb2coKS53YXJuKCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbnMuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnBlcm1pc3Npb249by5ERU5JRUQpfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSxuKXtpZih0aGlzLnBlcm1pc3Npb249PT1vLkdSQU5URUQpcmV0dXJuIHRoaXMuX3Nob3dJbXBsKHt0aXRsZTplLG9wdGlvbnM6bn0pO2lmKHRoaXMucGVybWlzc2lvbj09PW8uREVOSUVEKXQuZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHNob3cgbm90aWZpY2F0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7dGl0bGU6ZSxvcHRpb25zOm59KTtlbHNle3ZhciByPXt0aXRsZTplLG9wdGlvbnM6bn07dC5nZXRMb2coKS53YXJuKCJEZWZlcnJpbmcgbm90aWZpY2F0aW9uIHVudGlsIHVzZXIgZGVjaWRlcyB0byBhbGxvdyBvciBkZW55LiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnF1ZXVlLnB1c2gocil9fSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93UXVldWVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucXVldWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2hvd0ltcGwodCl9KSk7cmV0dXJuIHRoaXMucXVldWU9W10sdH0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd0ltcGw9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGUuTm90aWZpY2F0aW9uKHQudGl0bGUsdC5vcHRpb25zKTtyZXR1cm4gdC5vcHRpb25zLmNsaWNrZWQmJihuLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Lm9wdGlvbnMuY2xpY2tlZC5jYWxsKG4pfSksbn0sdC5WYWx1ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuVmFsdWVFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuVmFsdWVFcnJvcixFcnJvciksdC5WYWx1ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJWYWx1ZUVycm9yIix0Lk5vdEltcGxlbWVudGVkRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5Ob3RJbXBsZW1lbnRlZEVycm9yLEVycm9yKSx0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLm5hbWU9Ik5vdEltcGxlbWVudGVkRXJyb3IiLHQuU3RhdGVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlN0YXRlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlN0YXRlRXJyb3IsRXJyb3IpLHQuU3RhdGVFcnJvci5wcm90b3R5cGUubmFtZT0iU3RhdGVFcnJvciIsdC5Wb2ljZUlkRXJyb3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByLnR5cGU9ZSxyLm1lc3NhZ2U9dCxyLnN0YWNrPUVycm9yKHQpLnN0YWNrLHIuZXJyPW4scn0sdC5pc0NDUD1mdW5jdGlvbigpe3JldHVybiEhdC5jb3JlLnVwc3RyZWFtJiYiQ29ubmVjdFNoYXJlZFdvcmtlckNvbmR1aXQiPT09dC5jb3JlLmdldFVwc3RyZWFtKCkubmFtZX0sdC5pc1NoYXJlZFdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0LndvcmtlciYmISF0Lndvcmtlci5jbGllbnRFbmdpbmV9LHQuaXNDUk09ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmdC5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIHQuSUZyYW1lQ29uZHVpdH19KCl9LDczNjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQud29ya2VyPXt9O3ZhciBuPSJMQURTLkdldEFnZW50RmFpbG92ZXJDb25maWd1cmF0aW9uIjtjb25zdCByPXtjcmVhdGVUYXNrQ29udGFjdDoiY3JlYXRlVGFza0NvbnRhY3QiLGNyZWF0ZU91dGJvdW5kQ29udGFjdDoiY3JlYXRlT3V0Ym91bmRDb250YWN0IixjcmVhdGVUZW1wbGF0ZWRUYXNrOiJjcmVhdGVUZW1wbGF0ZWRUYXNrIn07dmFyIG89ZnVuY3Rpb24oKXt0aGlzLnRvcGljTWFzdGVyTWFwPXt9fTtvLnByb3RvdHlwZS5nZXRNYXN0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpYyIpLHRoaXMudG9waWNNYXN0ZXJNYXBbZV18fG51bGx9LG8ucHJvdG90eXBlLnNldE1hc3Rlcj1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpYyIpLHQuYXNzZXJ0Tm90TnVsbChuLCJpZCIpLHRoaXMudG9waWNNYXN0ZXJNYXBbZV09bn0sby5wcm90b3R5cGUucmVtb3ZlTWFzdGVyPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJpZCIpO3ZhciBuPXRoaXM7dC5lbnRyaWVzKHRoaXMudG9waWNNYXN0ZXJNYXApLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWU9PT1lfSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2RlbGV0ZSBuLnRvcGljTWFzdGVyTWFwW2Uua2V5XX0pKX07dmFyIGk9ZnVuY3Rpb24oZSl7dC5DbGllbnRCYXNlLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PWV9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQuQ2xpZW50QmFzZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3QuY29udGFpbnNWYWx1ZSh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcyxlKT90LmNvcmUuZ2V0QWdlbnRBcHBDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0KX19KTp0LmNvbnRhaW5zVmFsdWUodC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcyxlKT90LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbiksci5zdWNjZXNzKHQpfSxmYWlsdXJlOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5mYWlsdXJlKHQpfX0pOnQuY29yZS5nZXRDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQscyl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbiksci5zdWNjZXNzKHQscyl9LGZhaWx1cmU6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0LHMpfSxhdXRoRmFpbHVyZTpmdW5jdGlvbih0LHMpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5hdXRoRmFpbHVyZSgpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuYWNjZXNzRGVuaWVkJiZyLmFjY2Vzc0RlbmllZCgpfX0pfSxpLnByb3RvdHlwZS5fcmVjb3JkQVBJTGF0ZW5jeT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz0obmV3IERhdGUpLmdldFRpbWUoKS10O3RoaXMuX3NlbmRBUElNZXRyaWNzKGUsbyxuLHIpfSxpLnByb3RvdHlwZS5fc2VuZEFQSU1ldHJpY3M9ZnVuY3Rpb24oZSxuLG8saSl7bGV0IHM9e25hbWU6ZSx0aW1lOm4sZXJyb3I6aSxlcnJvcjV4eDowfTtjb25zdCBhPVt7bmFtZToiQ2F0ZWdvcnkiLHZhbHVlOiJBUEkifV0sYz1pJiZpLnN0YXR1c0NvZGV8fDIwMCx1PWkmJmkucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSxsPVt7bmFtZToiSHR0cFN0YXR1c0NvZGUiLHZhbHVlOmN9LHtuYW1lOiJIdHRwR2VuZXJpY1N0YXR1c0NvZGUiLHZhbHVlOmAke2MudG9TdHJpbmcoKS5jaGFyQXQoMCl9WFhgfSx7bmFtZToiUmV0cnlTdGF0dXMiLHZhbHVlOnV9XTtpZigiNSI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApJiYocy5lcnJvcjV4eD0xKSwiNSI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApP3MuZmF1bHQ9MToiMiI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApJiYocy5mYXVsdD0wKSxyW2VdJiZvJiZvLnJlbGF0ZWRDb250YWN0SWQpe2xldCBuPXtuYW1lOmAke2V9V2l0aFJlbGF0ZWRDb250YWN0SWRgLHRpbWU6cy50aW1lLGVycm9yOnMuZXJyb3IsZXJyb3I1eHg6cy5lcnJvcjV4eH07dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9NRVRSSUMsey4uLm4sZGltZW5zaW9uczphLG9wdGlvbmFsRGltZW5zaW9uczpsfSl9dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9NRVRSSUMsey4uLnMsZGltZW5zaW9uczphLG9wdGlvbmFsRGltZW5zaW9uczpsfSl9O3ZhciBzPWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLm11bHRpcGxleGVyPW5ldyB0LlN0cmVhbU11bHRpcGxleGVyLHRoaXMuY29uZHVpdD1uZXcgdC5Db25kdWl0KCJBbWF6b25Db25uZWN0U2hhcmVkV29ya2VyIixudWxsLHRoaXMubXVsdGlwbGV4ZXIpLHRoaXMuY2xpZW50PW5ldyBpKHRoaXMuY29uZHVpdCksdGhpcy50aW1lb3V0PW51bGwsdGhpcy5hZ2VudD1udWxsLHRoaXMubmV4dFRva2VuPW51bGwsdGhpcy5pbml0RGF0YT17fSx0aGlzLnBvcnRDb25kdWl0TWFwPXt9LHRoaXMuc3RyZWFtTWFwQnlUYWJJZD17fSx0aGlzLm1hc3RlckNvb3JkPW5ldyBvLHRoaXMubG9nc0J1ZmZlcj1bXSx0aGlzLnN1cHByZXNzPSExLHRoaXMuZm9yY2VPZmZsaW5lPSExLHRoaXMubG9uZ1BvbGxpbmdPcHRpb25zPXthbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZTohMSxhbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU6ITF9LHRoaXMuZHJQb2xsaW5nVXJsPW51bGwsdGhpcy50aGlzQXJuPW51bGwsdGhpcy5vdGhlckFybj1udWxsLHRoaXMucGVuZGluZ0ZhaWxvdmVyPW51bGw7dmFyIHI9bnVsbDt0LnJvb3RMb2dnZXI9bmV3IHQuRG93bnN0cmVhbUNvbmR1aXRMb2dnZXIodGhpcy5jb25kdWl0KSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFTkRfTE9HUywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5wdXNoTG9nc0Rvd25zdHJlYW0oZSksbi5sb2dzQnVmZmVyPW4ubG9nc0J1ZmZlci5jb25jYXQoZSksbi5sb2dzQnVmZmVyLmxlbmd0aD40MDAmJm4uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlcil9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU1VQUFJFU1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBTdXBwcmVzcyB0byAlcyIsZS5zdXBwcmVzcykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPWUuc3VwcHJlc3N8fCExLG4uc3VwcHJlc3N8fChuLmZvcmNlT2ZmbGluZT0hMSksKHZvaWQgMD09PWUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbXx8ZS5zaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtKSYmbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7aXNQcmltYXJ5OiFuLnN1cHByZXNzfSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTZXR0aW5nIEZPUkNFX09GRkxJTkUgdG8gJXMiLGUub2ZmbGluZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmZvcmNlT2ZmbGluZXx8KG4ucGVuZGluZ0ZhaWxvdmVyPSExLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohMSxuZXh0QWN0aXZlQXJuOmUubmV4dEFjdGl2ZUFybn0pKSxuLmZvcmNlT2ZmbGluZT1lLm9mZmxpbmV8fCExfSkpLHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcmJnRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORywoZnVuY3Rpb24oZSl7dmFyIHI9dC5nZXRMb2coKTtuLmRyUG9sbGluZ1VybD8oci5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBZGRpbmcgbmV3IENDUCB0byBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMSkpOihyLmluZm8oYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5pdGlhbGl6aW5nIGFjdGl2ZSByZWdpb24gcG9sbGluZyBmb3IgaW5zdGFuY2UgJHtlLmluc3RhbmNlQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi50aGlzQXJuPWUuaW5zdGFuY2VBcm4sbi5vdGhlckFybj1lLm90aGVyQXJuLG4uZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZT0+e24uZHJQb2xsaW5nVXJsPWUsbi5wb2xsRm9yQWN0aXZlUmVnaW9uKCEwLCEwKX0pLCh0PT57ci5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn07IHN1cHByZXNzaW5nIGNvbnRhY3RzYCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uc3VwcHJlc3M9ITB9KSkpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihvKXtjb25zb2xlLmxvZygiQEBAIGNvbmZpZ3VyZSBldmVudCBoYW5kbGVyIixvKTt0cnl7by5hdXRoVG9rZW4mJm8uYXV0aFRva2VuIT09bi5pbml0RGF0YS5hdXRoVG9rZW4mJihuLmluaXREYXRhPW8sdC5jb3JlLmluaXQobyksby5sb25nUG9sbGluZ09wdGlvbnMmJigiYm9vbGVhbiI9PXR5cGVvZiBvLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSYmKG4ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlPW8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlKSwiYm9vbGVhbiI9PXR5cGVvZiBvLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU9by5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlKSkscj90LmdldExvZygpLmluZm8oIk5vdCBJbml0aWFsaXppbmcgYSBuZXcgV2Vic29ja2V0TWFuYWdlciBpbnN0YW5jZSwgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKToodC5nZXRMb2coKS5pbmZvKCJDcmVhdGluZyBhIG5ldyBXZWJzb2NrZXQgY29ubmVjdGlvbiBmb3IgQ0NQIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LldlYlNvY2tldE1hbmFnZXIuc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjp0LmdldExvZygpLGFkdmFuY2VkTG9nV3JpdGVyOiJpbmZvIixsZXZlbDoxMH19KSwocj10LldlYlNvY2tldE1hbmFnZXIuY3JlYXRlKCkpLm9uSW5pdEZhaWx1cmUoKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSl9KSksci5vbkNvbm5lY3Rpb25PcGVuKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLGUpfSkpLHIub25Db25uZWN0aW9uQ2xvc2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLGUpfSkpLHIub25Db25uZWN0aW9uR2FpbigoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4pfSkpLHIub25Db25uZWN0aW9uTG9zdCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULGUpfSkpLHIub25TdWJzY3JpcHRpb25VcGRhdGUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLGUpfSkpLHIub25TdWJzY3JpcHRpb25GYWlsdXJlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsZSl9KSksci5vbkFsbE1lc3NhZ2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSxlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsKGZ1bmN0aW9uKGUpe3Iuc2VuZE1lc3NhZ2UoZSl9KSksbi5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlVG9waWNzKGUpfSkpLHIuaW5pdCh0LmhpdGNoKG4sbi5nZXRXZWJTb2NrZXRVcmwpKS50aGVuKChmdW5jdGlvbihyKXt0cnl7aWYociYmIXIud2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZCl0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGFnZW50IHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFnZW50KCksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBjb25maWcgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKHtyZXBlYXRGb3JldmVyOiEwfSksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBhdXRoIHRva2VuIHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc2V0SW50ZXJ2YWwodC5oaXRjaChuLG4uY2hlY2tBdXRoVG9rZW4pLDNlNSk7ZWxzZSBpZighdC53ZWJTb2NrZXRJbml0RmFpbGVkKXtjb25zdCBlPXQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRTt0aHJvdyBuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0oZSksdC53ZWJTb2NrZXRJbml0RmFpbGVkPSEwLG5ldyBFcnJvcihlKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiV2ViU29ja2V0IGZhaWxlZCB0byBpbml0aWFsaXplIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSkpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkBAQCBlcnJvciIsZSl9fSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFLChmdW5jdGlvbigpe24uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlciksdC5jb3JlLnRlcm1pbmF0ZSgpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEVEKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1QsKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlLmV2ZW50LGUuZGF0YSl9KSksZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wb3J0c1swXSxvPW5ldyB0LlBvcnRTdHJlYW0ocik7bi5tdWx0aXBsZXhlci5hZGRTdHJlYW0obyksci5zdGFydCgpO3ZhciBpPW5ldyB0LkNvbmR1aXQoby5nZXRJZCgpLG51bGwsbyk7aS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSx7aWQ6by5nZXRJZCgpfSksbi5wb3J0Q29uZHVpdE1hcFtvLmdldElkKCldPWksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx7bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0pLG51bGwhPT1uLmFnZW50JiZuLnVwZGF0ZUFnZW50KCksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlQVBJUmVxdWVzdCxpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlTWFzdGVyUmVxdWVzdCxpLG8uZ2V0SWQoKSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQsdC5oaXRjaChuLG4uaGFuZGxlVGFiSWRFdmVudCxvKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UsdC5oaXRjaChuLG4uaGFuZGxlQ2xvc2VFdmVudCxvKSl9fTtzLnByb3RvdHlwZS5wb2xsRm9yQWN0aXZlUmVnaW9uPWZ1bmN0aW9uKHIsbyl7dmFyIGk9dGhpcyxzPXQuZ2V0TG9nKCk7aWYoIWkuZHJQb2xsaW5nVXJsKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVHJpZWQgdG8gcG9sbCBmb3IgYWN0aXZlIHJlZ2lvbiB3aXRob3V0IGZpcnN0IGluaXRpYWxpemluZyBEUiBwb2xsaW5nIGluIHRoZSB3b3JrZXIuIik7cy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBQb2xsaW5nIGZvciBmYWlsb3ZlciB3aXRoIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpLmNhdGNoKChlPT57aWYoZS5zdGF0dXMpe2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7c3RhdHVzQ29kZTplLnN0YXR1c30pLFt0LkhUVFBfU1RBVFVTX0NPREVTLkFDQ0VTU19ERU5JRUQsdC5IVFRQX1NUQVRVU19DT0RFUy5VTkFVVEhPUklaRURdLmluY2x1ZGVzKGUuc3RhdHVzKSlyZXR1cm4gcy5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQ7IHRyeWluZyB0byBnZXQgYSBuZXcgVVJMIGZvciBwb2xsaW5nLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntpLmRyUG9sbGluZ1VybD1lfSkpLnRoZW4oKCgpPT4oYT0obmV3IERhdGUpLmdldFRpbWUoKSx0LmZldGNoV2l0aFRpbWVvdXQoaS5kclBvbGxpbmdVcmwsMWU0KSkpKTt2YXIgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVjZWl2ZWQgdW5leHBlY3RlZCByZXNwb25zZSBjb2RlICR7ZS5zdGF0dXN9YDt0aHJvdyBzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9dGhyb3cgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVxdWVzdCB0aW1lZCBvdXQgb3IgYWJvcnRlZGAsaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOi0xfSkscy5lcnJvcihyKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbmV3IEVycm9yKHIpfSkpLnRoZW4oKGU9PntpZihpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEpLCJib29sZWFuIj09dHlwZW9mIGUuVGVybWluYXRlQWN0aXZlQ29udGFjdHMpe3ZhciBjPSFlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzO2lmKGUuSW5zdGFuY2VBcm4paWYocy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBTdWNjZXNzZnVsbHkgcG9sbGVkIGZvciBhY3RpdmUgcmVnaW9uLiBQcmltYXJ5IGluc3RhbmNlIEFSTiBpcyAke2UuSW5zdGFuY2VBcm59IGFuZCBzb2Z0IGZhaWxvdmVyIGlzIGArKGM/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkudGhpc0Fybj09PWUuSW5zdGFuY2VBcm4mJiFpLnN1cHByZXNzJiZyKXMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBwcmltYXJ5YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KTtlbHNlIGlmKGkub3RoZXJBcm49PT1lLkluc3RhbmNlQXJuKXtpZighY3x8b3x8IXJ8fGkuc3VwcHJlc3MmJiFpLnBlbmRpbmdGYWlsb3Zlcnx8aS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjppLnRoaXNBcm59KSwhaS5zdXBwcmVzcyl7aS5zdXBwcmVzcz0hMDtjb25zdCBuPWMmJiFvO24/KGkucGVuZGluZ0ZhaWxvdmVyPSEwLHMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IHdpbGwgYmUgc2V0IHRvIHN0YW5kLWJ5IHVzaW5nIHNvZnQgZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSBpcyBiZWluZyBzZXQgdG8gc3RhbmQtYnkgaW1tZWRpYXRlbHlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7c29mdEZhaWxvdmVyOm4sbmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSl9fWVsc2VbaS50aGlzQXJuLGkub3RoZXJBcm5dLmluY2x1ZGVzKGUuSW5zdGFuY2VBcm4pfHxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFRoZSBjdXJyZW50IHByaW1hcnkgaW5zdGFuY2UgaW4gdGhpcyBhZ2VudCdzIGZhaWxvdmVyIGdyb3VwICR7ZS5JbnN0YW5jZUFybn0gZG9lc24ndCBtYXRjaCB0aGlzIGluc3RhbmNlICR7aS50aGlzQXJufSBvciB0aGUgb3RoZXIgaW5zdGFuY2UgJHtpLm90aGVyQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdHJ1dGh5IGFjdGl2ZSBpbnN0YW5jZSBBUk4uIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugcy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBEUiBwb2xsaW5nIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHZhbHVlIGZvciBUZXJtaW5hdGVBY3RpdmVDb250YWN0cy4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGU9PntlLnN0YXR1cyYmaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHsuLi5lLHN0YXR1c0NvZGU6ZS5zdGF0dXN9KSxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufS5gKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuZmluYWxseSgoKCk9PnshbyYmcnx8ZS5zZXRUaW1lb3V0KHQuaGl0Y2goaSxpLnBvbGxGb3JBY3RpdmVSZWdpb24pLDZlNCl9KSl9LHMucHJvdG90eXBlLmdldFByZXNpZ25lZERpc2NvdmVyeVVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBHZXR0aW5nIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5BR0VOVF9ESVNDT1ZFUll9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQucHJlc2lnbmVkVXJsPyh0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmwpKToodC5nZXRMb2coKS5pbmZvKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgcmVjZWl2ZWQgZW1wdHkvaW52YWxpZCBkYXRhIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoRXJyb3IoImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKSkpfSxmYWlsdXJlOmZ1bmN0aW9uKG4sbyl7dC5nZXRMb2coKS5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobmV3IEVycm9yKCJGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGF1dGggZmFpbHVyZSB3aGVuIGdldHRpbmcgcHJlc2lnbmVkIFVSTCIpKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKSgpLHIobmV3IEVycm9yKCJFbmNvdW50ZXJlZCBhY2Nlc3MgZGVuaWVkIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfX0pfSkpfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9dC5oaXRjaChuLG4uaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1Qse25leHRUb2tlbjpuLm5leHRUb2tlbix0aW1lb3V0OjNlNH0se3N1Y2Nlc3M6ZnVuY3Rpb24ocixvKXt0cnl7bi5hZ2VudD1uLmFnZW50fHx7fSxuLmFnZW50LnNuYXBzaG90PXIuc25hcHNob3Qsbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcD10Lm5vdygpLG4uYWdlbnQuc25hcHNob3Quc2tldz1uLmFnZW50LnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wLW4uYWdlbnQuc25hcHNob3QubG9jYWxUaW1lc3RhbXAsbi5uZXh0VG9rZW49ci5uZXh0VG9rZW4sbyYmby5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpJiYobi5hZ2VudC5zbmFwc2hvdC5jb250ZW50TGVuZ3RoPW8uY29udGVudExlbmd0aCksdC5nZXRMb2coKS50cmFjZSgiR0VUX0FHRU5UX1NOQVBTSE9UIHN1Y2NlZWRlZC4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi51cGRhdGVBZ2VudCgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkxvbmcgcG9sbCBmYWlsZWQgdG8gdXBkYXRlIGFnZW50LiIpLndpdGhPYmplY3Qocikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWZpbmFsbHl7ZS5zZXRUaW1lb3V0KHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudCksMTAwKX19LGZhaWx1cmU6ZnVuY3Rpb24ocixvKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGdldCBhZ2VudCBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOnIsZGF0YTpvfSl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSw1ZTMpfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtyKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKG4sbi5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxvPW58fHt9LGk9dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix7fSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT1uLmNvbmZpZ3VyYXRpb247ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhpKSxyLnBvbGxGb3JBZ2VudFN0YXRlcyhpKSxyLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhpKSxyLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhpKSxvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uLG8pLDNlNCl9LGZhaWx1cmU6ZnVuY3Rpb24obixpKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IGNvbmZpZ3VyYXRpb24gZGF0YS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjpuLGRhdGE6aX0pfWZpbmFsbHl7by5yZXBlYXRGb3JldmVyJiZlLnNldFRpbWVvdXQodC5oaXRjaChyLHIucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbiksM2U0LG8pfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtpKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudFN0YXRlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50U3RhdGVzKGUse3N0YXRlczooby5zdGF0ZXN8fFtdKS5jb25jYXQodC5zdGF0ZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLmFnZW50U3RhdGVzPShvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHN0YXRlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50UGVybWlzc2lvbnM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50UGVybWlzc2lvbnMoZSx7cGVybWlzc2lvbnM6KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucGVybWlzc2lvbnM9KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHBlcm1pc3Npb25zIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXMoZSx7Y291bnRyeUNvZGVzOihvLmNvdW50cnlDb2Rlc3x8W10pLmNvbmNhdCh0LmNvdW50cnlDb2RlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuZGlhbGFibGVDb3VudHJpZXM9KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggZGlhbGFibGUgY291bnRyeSBjb2RlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTLHtyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLG5leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXMoZSx7Y291bnRyeUNvZGVzOihvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucm91dGluZ1Byb2ZpbGUucXVldWVzPShvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJvdXRpbmcgcHJvZmlsZSBxdWV1ZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLmhhbmRsZUFQSVJlcXVlc3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RoaXMuY2xpZW50LmNhbGwobi5tZXRob2Qsbi5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4scik7ZS5zZW5kRG93bnN0cmVhbShvLmV2ZW50LG8pfSxmYWlsdXJlOmZ1bmN0aW9uKG8saSl7dmFyIHM9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4saSxKU09OLnN0cmluZ2lmeShvKSk7ZS5zZW5kRG93bnN0cmVhbShzLmV2ZW50LHMpLHQuZ2V0TG9nKCkuZXJyb3IoIiclcycgQVBJIHJlcXVlc3QgZmFpbGVkIixuLm1ldGhvZCkud2l0aE9iamVjdCh7cmVxdWVzdDpyLmZpbHRlckF1dGhUb2tlbihuKSxyZXNwb25zZTpzfSkud2l0aEV4Y2VwdGlvbihvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVBdXRoRmFpbCx7YXV0aG9yaXplOiEwfSl9KX0scy5wcm90b3R5cGUuaGFuZGxlTWFzdGVyUmVxdWVzdD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcy5jb25kdWl0LGk9bnVsbDtzd2l0Y2goci5tZXRob2Qpe2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVI6dmFyIHM9dGhpcy5tYXN0ZXJDb29yZC5nZXRNYXN0ZXIoci5wYXJhbXMudG9waWMpLGE9Qm9vbGVhbihzKSYmcyE9PW47dGhpcy5tYXN0ZXJDb29yZC5zZXRNYXN0ZXIoci5wYXJhbXMudG9waWMsbiksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6bix0YWtlT3ZlcjphLHRvcGljOnIucGFyYW1zLnRvcGljfSksYSYmby5zZW5kRG93bnN0cmVhbShpLmV2ZW50LGkpO2JyZWFrO2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkNIRUNLX01BU1RFUjoocz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYykpfHxyLnBhcmFtcy5zaG91bGROb3RCZWNvbWVNYXN0ZXJJZk5vbmV8fCh0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxzPW4pLGk9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLHIse21hc3RlcklkOnMsaXNNYXN0ZXI6bj09PXMsdG9waWM6ci5wYXJhbXMudG9waWN9KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBtYXN0ZXIgbWV0aG9kOiAiK3IubWV0aG9kKX1lLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSl9LHMucHJvdG90eXBlLmhhbmRsZVRhYklkRXZlbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RyeXtsZXQgbz1uLnRhYklkLGk9ci5zdHJlYW1NYXBCeVRhYklkW29dLHM9ZS5nZXRJZCgpLGE9T2JqZWN0LmtleXMoci5zdHJlYW1NYXBCeVRhYklkKS5maWx0ZXIoKGU9PnIuc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtpZihpJiZpLmxlbmd0aD4wKXtpZighaS5pbmNsdWRlcyhzKSl7ci5zdHJlYW1NYXBCeVRhYklkW29dLnB1c2gocyk7bGV0IGU9e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6YX07ZVtvXT17bGVuZ3RoOmkubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLGUpfX1lbHNle3Iuc3RyZWFtTWFwQnlUYWJJZFtvXT1bZS5nZXRJZCgpXTtsZXQgbj17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphKzF9O25bb109e2xlbmd0aDpyLnN0cmVhbU1hcEJ5VGFiSWRbb10ubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLG4pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgY29ubmVjdGVkIENDUHMgd2l0aGluIHRoZSBzYW1lIHRhYiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19LHMucHJvdG90eXBlLmhhbmRsZUNsb3NlRXZlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLm11bHRpcGxleGVyLnJlbW92ZVN0cmVhbShlKSxkZWxldGUgbi5wb3J0Q29uZHVpdE1hcFtlLmdldElkKCldLG4ubWFzdGVyQ29vcmQucmVtb3ZlTWFzdGVyKGUuZ2V0SWQoKSk7bGV0IHI9e2xlbmd0aDpPYmplY3Qua2V5cyhuLnBvcnRDb25kdWl0TWFwKS5sZW5ndGh9LG89T2JqZWN0LmtleXMobi5zdHJlYW1NYXBCeVRhYklkKTt0cnl7bGV0IHQ9by5maW5kKCh0PT5uLnN0cmVhbU1hcEJ5VGFiSWRbdF0uaW5jbHVkZXMoZS5nZXRJZCgpKSkpO2lmKHQpe2xldCBvPW4uc3RyZWFtTWFwQnlUYWJJZFt0XS5maW5kSW5kZXgoKHQ9PmUuZ2V0SWQoKT09PXQpKTtuLnN0cmVhbU1hcEJ5VGFiSWRbdF0uc3BsaWNlKG8sMSk7bGV0IGk9bi5zdHJlYW1NYXBCeVRhYklkW3RdP24uc3RyZWFtTWFwQnlUYWJJZFt0XS5sZW5ndGg6MDtyW3RdPXtsZW5ndGg6aX0sci50YWJJZD10fWxldCBpPW8uZmlsdGVyKChlPT5uLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjApKS5sZW5ndGg7ci5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI9aX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgdGFiSWQtc3BlY2lmaWMgc3RyZWFtIGRhdGEiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxyKX0scy5wcm90b3R5cGUudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUpe2UucGVybWlzc2lvbnMmJmUuZGlhbGFibGVDb3VudHJpZXMmJmUuYWdlbnRTdGF0ZXMmJmUucm91dGluZ1Byb2ZpbGUucXVldWVzPyh0aGlzLmFnZW50PXRoaXMuYWdlbnR8fHt9LHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbj1lLHRoaXMudXBkYXRlQWdlbnQoKSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgY29uZmlndXJhdGlvbiB1bnRpbCBhbGwgY29uZmlnIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxzLnByb3RvdHlwZS51cGRhdGVBZ2VudD1mdW5jdGlvbigpe3RoaXMuYWdlbnQ/dGhpcy5hZ2VudC5zbmFwc2hvdD90aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24/KHRoaXMuYWdlbnQuc25hcHNob3Quc3RhdHVzPXRoaXMuYWdlbnQuc3RhdGUsdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cyYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5sZW5ndGg+MSYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCktdC5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9ZS5zdGF0ZSxlLmNvbm5lY3Rpb25zLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYWRkcmVzcz1lLmVuZHBvaW50fSkpfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUFSTix0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucXVldWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucXVldWVJZD1lLnF1ZXVlQVJOfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5xdWV1ZSYmKGUucXVldWUucXVldWVJZD1lLnF1ZXVlLnF1ZXVlQVJOKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sdGhpcy5zdXBwcmVzcyYmKHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHM9dGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR8fGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkVOREVEfSkpLHRoaXMuZm9yY2VPZmZsaW5lJiZ0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUpKSx0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5VUERBVEUsdGhpcy5hZ2VudCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBzbmFwc2hvdCBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgaGFzIGJlZW4gZnVsbHkgY29uc3RydWN0ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0scy5wcm90b3R5cGUuZ2V0V2ViU29ja2V0VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQuY29yZS5nZXRDbGllbnQoKSxyPXQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKSxvPXQuaGl0Y2goZSxlLmhhbmRsZUFjY2Vzc0RlbmllZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfU09DS0VUfSx7c3VjY2VzczpmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImdldFdlYlNvY2tldFVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KSxpKHtyZWFzb246ImdldFdlYlNvY2tldFVybCBmYWlsZWQiLF9kZWJ1ZzplfSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEF1dGggRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLHIoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEFjY2VzcyBEZW5pZWQgRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQWNjZXNzIERlbmllZCBGYWlsdXJlIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLG8oKX19KX0pKX0scy5wcm90b3R5cGUuaGFuZGxlU2VuZExvZ3NSZXF1ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPVtdLHI9ZS5sb2dzQnVmZmVyLnNsaWNlKCk7ZS5sb2dzQnVmZmVyPVtdLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5wdXNoKHt0aW1lc3RhbXA6ZS50aW1lLGNvbXBvbmVudDplLmNvbXBvbmVudCxtZXNzYWdlOmUudGV4dH0pfSkpLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1Mse2xvZ0V2ZW50czpufSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlNlbmRMb2dzIHJlcXVlc3Qgc3VjY2VlZGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJTZW5kTG9ncyByZXF1ZXN0IGZhaWxlZC4iKS53aXRoT2JqZWN0KG4pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sYXV0aEZhaWx1cmU6dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpfSl9LHMucHJvdG90eXBlLmhhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2U/dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKTp0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMKX0scy5wcm90b3R5cGUuaGFuZGxlUG9sbGluZ0F1dGhGYWlsPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSxzLnByb3RvdHlwZS5oYW5kbGVBY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCl9LHMucHJvdG90eXBlLmNoZWNrQXV0aFRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPW5ldyBEYXRlKGUuaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbikscj0obmV3IERhdGUpLmdldFRpbWUoKTtuLmdldFRpbWUoKTxyKzE4ZTUmJih0LmdldExvZygpLmluZm8oIkF1dGggdG9rZW4gZXhwaXJlcyBhdCAiK24rIiBTdGFydCByZWZyZXNoaW5nIHRva2VuIHdpdGggcmV0cnkuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmJhY2tvZmYodC5oaXRjaChlLGUuYXV0aG9yaXplKSwxZTQsNCkpfSxzLnByb3RvdHlwZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmNvcmUuYXV0aG9yaXplKHRoaXMuaW5pdERhdGEuYXV0aG9yaXplRW5kcG9pbnQpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBvPW5ldyBEYXRlKHIuZXhwaXJhdGlvbik7dC5nZXRMb2coKS5pbmZvKCJBdXRob3JpemF0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHRva2VuIGV4cGlyZXMgYXQgJXMiLG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5pbml0RGF0YS5hdXRoVG9rZW49ci5hY2Nlc3NUb2tlbixuLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb249byx0LmNvcmUuaW5pdENsaWVudChuLmluaXREYXRhKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KG4uaW5pdERhdGEpLGUuc3VjY2VzcygpfSkpLmNhdGNoKChmdW5jdGlvbihyKXt0LmdldExvZygpLmVycm9yKCJBdXRob3JpemF0aW9uIGZhaWxlZCB3aXRoIGNvZGUgJXMiLHIuc3RhdHVzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDQwMT09PXIuc3RhdHVzP24uaGFuZGxlQXV0aEZhaWwoKTplLmZhaWx1cmUoKX0pKX0scy5wcm90b3R5cGUuZmlsdGVyQXV0aFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKWlmKCJwYXJhbXMiPT09bil7dmFyIHI9e307Zm9yKHZhciBvIGluIGUucGFyYW1zKSJhdXRoZW50aWNhdGlvbiIhPT1vJiYocltvXT1lLnBhcmFtc1tvXSk7dC5wYXJhbXM9cn1lbHNlIHRbbl09ZVtuXTtyZXR1cm4gdH0sdC53b3JrZXIubWFpbj1mdW5jdGlvbigpe3Qud29ya2VyLmNsaWVudEVuZ2luZT1uZXcgc319KCl9fSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIG89dFtyXTtpZih2b2lkIDAhPT1vKXJldHVybiBvLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLG4oODI3KSxuKDE2Myksbig5NDQpLG4oMTUxKSxuKDg5MSksbig1OTIpLG4oODIpLG4oNzU0KSxuKDgzMyksbigxNjEpLG4oOTY1KSxuKDI4Niksbig4OTUpLG4oNzQzKSxuKDY0Miksbig3MzYpLG4oNDM5KSxuKDI3OSksbig0MTgpLG4oMTg3KSxuKDgyMSksbig1MDApfSkoKTs="),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","","