Tips & Tricks

How to build an AI travel SaaS With Tape as backend

App Builder & Automation Expert

Stay Updated with ProcFu!

Subscribe to our newsletter for the latest tips, updates, and automation insights.

Subscribe Now

What if you could turn an idea into a revenue-ready SaaS in a few hours? I did just that with ProcFu, a low-code platform, building an AI-powered travel itinerary generator. From a simple form to OpenAI integration, Stripe payments, and email delivery, it’s live and customer-ready—proof that you can spin up a project fast and focus on sales. Here’s how I did it, complete with the code, so you can build it too.

The Vision: AI Meets Travel Planning

The app lets users input travel details - destination, dates, preferences, budget—and get a personalized itinerary. You get a free summary for free and if you like it, you can pay 3$ to get the whole itenary.

It’s a digital travel agent, built to sell. With ProcFu, I went from concept to working SaaS in hours, not months.

Step 1: ProcFu - Tape integration

You can quickly integrate your Tape account with ProcFu through the integrations page. Simply retrieve your Tape API key and enter it into the API key field within ProcFu.

ProcFu also offers several wrappers for Tape API, making it easier to make API calls from ProcFu to Tape and extract information efficiently.

We need to create three apps in Tape for this project:

Users App: Stores user information, including name, email, password, and a "Last Request" field. An automation will update this field with the latest itinerary request for easy access.

ProcFu App Builder Interface

Itinerary Request App: Linked to the Users app, this stores all form submission details. It also includes two fields for AI-generated itineraries: a summary and a full itinerary.

ProcFu App Builder Interface

Payments App: Connected to both the User and Itinerary Request apps, this stores payment information retrieved from Stripe, including transaction details.

ProcFu App Builder Interface

Additionally, we'll use a Tape automation to update the user's record with the latest itinerary request ID.

Step 2: The Homepage

ProcFu App Builder Interface

ProcFu App Builder Interface

Screen Type: Generic HTML Form

Screen Visibility: Public

Purpose: This is where users start, they see the form and enters their travel details to kick off the process.

ProcFu’s form builder and scripting let me craft a polished UI without backend headaches. The data flows straight into the next step.

Header Section:

Adds the title to the form and required styles.

Header section of the homepage with the code to style

Header section of the homepage with the code to style

Content Section:

We create a multi-step HTML form with a clean, styled layout. It’s split into four steps: destination/dates, travelers/interests, budget/pace, and name/email.

Next/Prev Buttons: Clicking "Next" hides the current step and shows the next one; "Back" reverses it. JavaScript in the On-Render section handles this seamlessly.

Content section of the homepage with the form code

Content Section of the homepage with the form code

On-Render Section

This section enables the Next/Prev buttons to show or hide form steps.

JS code in the On Render section to power the next/previous buttons

JS code in the On Render section to power the next/previous buttons

Before-Submit Section

On submit, ProcFu validates required fields (marked with *), creates a user in an SQL database if new, logs the request, and redirects to the payment screen.

You must Integrate your database to ProcFu in the integrations page.

Before Submit section of the home page - Part 1 of the code

Before Submit section of the home page - Part 1 of the code

Before Submit section of the home page - Part 2 of the code

Before Submit section of the home page - Part 2 of the code

Step 2: The Payments Page

Screen Type: Text Information

Screen Visibility: Public

Purpose: This screen shows a free trip summary generated by AI and offers the option to pay $3 for the full itinerary.

Content Section:

On Load, a loading spinner displays while an AJAX call fetches a summary from the backend.

Once the summary arrives, the spinner hides, and the formatted summary appears. JavaScript styles it into readable HTML.

Clicking "Buy Now" redirects to a Stripe payment link.

Content section of the payment page

Content Section of the payment page

Header Section:

Sets up the layout and styles for the summary display and payment button.

Header section of the payment page with the code to style

Header section of the payment page with the code to style

On-Render Section:

Triggers an AJAX call to fetch the summary, displays it by hiding the spinner, and sets up the payment redirect.

JS code in the On Render section to make AJAX request and display the summary when ready

JS code in the On Render section to make AJAX request and display the summary when ready

Step 3: The Ajax Page

Screen Type: Text Information

Screen Visibility: Private (backend only)

Purpose: This screen shows a free trip summary generated by AI and offers the option to pay $3 for the full itinerary.

Before-Process Section:

ProcFu sends a POST request to OpenAI with the user’s input, gets a summary, stores it in the database, and returns it to the payment screen.

ProcFu’s remote_curl and MySQL integration make API calls and data storage effortless, keeping the flow smooth.

Before Process section of the AJAX screen where the summary generation happens

Before Process section of the AJAX screen where the summary generation happens

Step 4: The Success Page

Screen Type: Text Information

Screen Visibility: Public

Purpose: Confirms payment success and informs the user their full itinerary is on its way. A simple, clear UI reassures users while the backend handles the heavy lifting.

Header Section:

Styles the confirmation message with a success theme.

Header section of the success page with the code to style

Header section of the success page with the code to style

Content Section:

Displays a checkmark and a message about email delivery.

Content section of the payment page showing success message

Content section of the payment page showing success message

Step 5: The Stripe Webhook

Screen Type: Code Block (Webhook)

Purpose: Processes the Stripe webhook, generates the full itinerary, and emails it to the user. The script verifies the payment, generates the full itinerary with OpenAI, updates the database, and emails the user.

WebHook Stripe triggers a Webhook to a unique ProcFu URL (Auto generated when the script mode is set to HTTP - via URL) when payment completes.

Code Block to handle the Stripe Webhook

Code Block to handle the Stripe Webhook

Step 6: Setting up ProcFu URL in Stripe for Webhook

Purpose: This step connects the Stripe payment system to ProcFu by setting up a webhook URL, ensuring payment events trigger the itinerary generation and delivery process.

Locate the Webhook URL in ProcFu:

In ProcFu, go to the "Code Blocks" section where you created the Stripe webhook (Step 5).

After saving the code block, ProcFu generates a unique URL (e.g., https://procfu.com/widgets/code/YOUR_WEBHOOK_ID). Copy this URL.

Set Up the Webhook in Stripe:

Log in to your Stripe dashboard (use Test Mode if testing).

Navigate to Developers > Webhooks in the left sidebar.

Click + Add Endpoint.

Paste the ProcFu webhook URL into the "Endpoint URL" field.

Select the event checkout.session.completed to listen for successful payments.

Click Add Endpoint.

This step ensures Stripe notifies ProcFu when a $3 payment is completed, triggering the full itinerary delivery.

Header section of the homepage with the code to style

Code Block to handle the Stripe Webhook

Why It Matters: A Starting Point with Endless Potential

This entire SaaS—form, AI, payments, delivery—took hours, not months. ProcFu’s low-code power let me focus on the product, not the plumbing. It’s live, it’s sellable, and now it’s about getting customers.

But this is just the beginning. It could be fleshed out in countless ways—add user accounts, itinerary customization, multi-language support, or even a subscription model. The power lies in how fast you can go from idea to revenue-ready product, letting you focus on growth, not grunt work. What’s your twist on this? Let’s connect and explore.

The Real Punchline: Building’s Easy, Cashing In’s the Circus

So, there you have it - I slapped together this $3 AI travel itinerary SaaS in a few hours with ProcFu’s low-code wizardry and Tape's impressive backend, proving building stuff has become a breeze. Now comes the hard work of distribution, marketing and selling.

Download Code

To add this app to your ProcFu account:

  • Create a new app in ProcFu.
  • In the right sidebar of the Application Configuration page, click Import from Data.
  • Paste the code below into the popup and click Import.
  • After importing, you'll see a screen named "code". Its "Before-Process" event contains the Stripe Webhook handling code.
  • Open the Code Editor, create a new script, and paste in the code from the code screen. Set the mode to HTTP - via URL. This script will handle Stripe Webhooks.
  • Once the script is created, you can safely delete the code screen. It’s no longer needed for the app to function.
  • Do not forget to update the Stripe API key in the "code" screen and the "ajax" screen.

Code

ewogICJwa0FwcHMiOiAiMTAxNDgiLAogICJhcHBOYW1lIjogIkFJIFRyYXZlbCBJdGVuYXJ5IEdlbmVyYXRvciIsCiAgIm5pY2VTbHVnIjogIiIsCiAgImZrVXNlcnMiOiAiMjQxOSIsCiAgImF1dGhUeXBlIjogIiIsCiAgImV4dElkIjogIjlxUk1qeDd4VWR1ayIsCiAgImFwcERlc2NyaXB0aW9uIjogIiIsCiAgInRhZ3MiOiAiIiwKICAiaWNvbiI6ICIiLAogICJsYXN0U2F2ZSI6ICIyMDI1LTAzLTI1IDExOjI2OjE0IiwKICAiZGF0YSI6IHsKICAgICJ2ZXJzaW9uIjogMywKICAgICJhcHBOYW1lIjogIkFJIFRyYXZlbCBJdGVuYXJ5IEdlbmVyYXRvciIsCiAgICAiYXV0aFR5cGUiOiAiIiwKICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgIm5pY2VTbHVnIjogIiIsCiAgICAiaHR0cHMiOiAxLAogICAgInNjcmVlbnMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJzdGFydCIsCiAgICAgICAgInB1YmxpYyI6ICIxIiwKICAgICAgICAic2NyZWVuVHlwZSI6ICJhdXRoIiwKICAgICAgICAiY29uZmlnIjogeyAiYXV0aFR5cGUiOiAibiIsICJvblN1Ym1pdCI6ICIxIiB9CiAgICAgIH0sCiAgICAgIHsKICAgICAgICAicHVibGljIjogIjEiLAogICAgICAgICJuYW1lIjogImhvbWVwYWdlIiwKICAgICAgICAic2NyZWVuVHlwZSI6ICJmb3JtIiwKICAgICAgICAic2NyTWtkSGVhZCI6ICI8aDI+R2VuZXJhdGUgUGVyc29uYWxpc2VkIEl0ZXJuYXJ5IHdpdGggQUkganVzdCBmb3IgeW91LjwvaDI+XG48c3R5bGU+XG5ib2R5IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kOiAjZjBmOGZmOyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgaGVpZ2h0OiAxMDB2aDsgfVxuaDIgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDA3YmZmOyB9XG5sYWJlbCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDEwcHggMCA1cHg7IH1cbmlucHV0LCBzZWxlY3QsIHRleHRhcmVhIHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweDsgbWFyZ2luLWJvdHRvbTogMTVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLXJhZGl1czogNXB4OyB9XG5idXR0b246aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMDA1NmIzOyB9XG4ubmV4dC1zdGVwIHsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICMwMDdiZmY7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjsgfVxuLnByZXYtc3RlcCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgY29sb3I6ICMwMDdiZmY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA1cHg7IHRyYW5zaXRpb246IGNvbG9yIDAuM3MgZWFzZS1pbi1vdXQ7IH1cbi5wcmV2LXN0ZXA6aG92ZXIgeyBjb2xvcjogIzAwNTZiMzsgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9XG4uY29udGFpbmVyIHsgYmFja2dyb3VuZDogd2hpdGU7IHBhZGRpbmc6IDIwcHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJveC1zaGFkb3c6IDAgNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEpOyB3aWR0aDogMzUwcHg7IH1cbi5wZi1mb3JtIHsgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7ICBib3JkZXI6IG5vbmU7IH1cbjwvc3R5bGU+IiwKICAgICAgICAic2NyTWtkRm9vdCI6ICIiLAogICAgICAgICJpbnRub3RlcyI6ICIiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAiaHRtbCI6ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tc3RlcFwiPlxuICAgIDxsYWJlbCBmb3I9XCJkZXN0aW5hdGlvblwiPldoZXJlIGFyZSB5b3UgdHJhdmVsaW5nPyo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVzdGluYXRpb25cIiBuYW1lPVwiZGVzdGluYXRpb25cIiBwbGFjZWhvbGRlcj1cImUuZy4sIFBhcmlzLCBGcmFuY2VcIj5cbiAgICBcbiAgICA8bGFiZWwgZm9yPVwic3RhcnREYXRlXCI+U3RhcnQgRGF0ZSo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGlkPVwic3RhcnREYXRlXCIgbmFtZT1cInN0YXJ0RGF0ZVwiPlxuICAgIFxuICAgIDxsYWJlbCBmb3I9XCJlbmREYXRlXCI+RW5kIERhdGUqPC9sYWJlbD5cbiAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBpZD1cImVuZERhdGVcIiBuYW1lPVwiZW5kRGF0ZVwiPlxuICAgIFxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmV4dC1zdGVwXCI+TmV4dDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXN0ZXBcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgPGxhYmVsIGZvcj1cInRyYXZlbGVyc1wiPk51bWJlciBvZiBUcmF2ZWxlcnMqPC9sYWJlbD5cbiAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwidHJhdmVsZXJzXCIgbmFtZT1cInRyYXZlbGVyc1wiPlxuICAgIFxuICAgIDxsYWJlbD5XaGF0J3MgeW91ciB0cmF2ZWwgc3R5bGU/PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtZ3JvdXBcIj5cbiAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJpbnRlcmVzdHNcIiB2YWx1ZT1cIkFkdmVudHVyZVwiPiBBZHZlbnR1cmU8L2xhYmVsPlxuICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImludGVyZXN0c1wiIHZhbHVlPVwiQ3VsdHVyZVwiPiBDdWx0dXJlPC9sYWJlbD5cbiAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJpbnRlcmVzdHNcIiB2YWx1ZT1cIkZvb2RcIj4gRm9vZDwvbGFiZWw+XG4gICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiaW50ZXJlc3RzXCIgdmFsdWU9XCJOYXR1cmVcIj4gTmF0dXJlPC9sYWJlbD5cbiAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJpbnRlcmVzdHNcIiB2YWx1ZT1cIlJlbGF4YXRpb25cIj4gUmVsYXhhdGlvbjwvbGFiZWw+XG4gICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiaW50ZXJlc3RzXCIgdmFsdWU9XCJOaWdodGxpZmVcIj4gTmlnaHRsaWZlPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5leHQtc3RlcFwiPk5leHQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXYtc3RlcFwiPkJhY2s8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zdGVwXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgIDxsYWJlbCBmb3I9XCJidWRnZXRcIj5CdWRnZXQgTGV2ZWwqPC9sYWJlbD5cbiAgICA8c2VsZWN0IGlkPVwiYnVkZ2V0XCIgbmFtZT1cImJ1ZGdldFwiPlxuICAgIDxvcHRpb24gdmFsdWU9XCJCdWRnZXRcIj5CdWRnZXQ8L29wdGlvbj5cbiAgICA8b3B0aW9uIHZhbHVlPVwiTWlkLXJhbmdlXCI+TWlkLXJhbmdlPC9vcHRpb24+XG4gICAgPG9wdGlvbiB2YWx1ZT1cIkx1eHVyeVwiPkx1eHVyeTwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICAgIFxuICAgIDxsYWJlbCBmb3I9XCJwYWNlXCI+UHJlZmVycmVkIFBhY2U8L2xhYmVsPlxuICAgIDxzZWxlY3QgaWQ9XCJwYWNlXCIgbmFtZT1cInBhY2VcIj5cbiAgICA8b3B0aW9uIHZhbHVlPVwiUmVsYXhlZFwiPlJlbGF4ZWQ8L29wdGlvbj5cbiAgICA8b3B0aW9uIHZhbHVlPVwiQmFsYW5jZWRcIj5CYWxhbmNlZDwvb3B0aW9uPlxuICAgIDxvcHRpb24gdmFsdWU9XCJGYXN0LVBhY2VkXCI+RmFzdC1QYWNlZDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICAgIFxuICAgIDxsYWJlbCBmb3I9XCJkaWV0YXJ5XCI+RGlldGFyeSBQcmVmZXJlbmNlczwvbGFiZWw+XG4gICAgPHNlbGVjdCBpZD1cImRpZXRhcnlcIiBuYW1lPVwiZGlldGFyeVwiPlxuICAgIDxvcHRpb24gdmFsdWU9XCJObyBSZXN0cmljdGlvbnNcIj5ObyBSZXN0cmljdGlvbnM8L29wdGlvbj5cbiAgICA8b3B0aW9uIHZhbHVlPVwiVmVnZXRhcmlhblwiPlZlZ2V0YXJpYW48L29wdGlvbj5cbiAgICA8b3B0aW9uIHZhbHVlPVwiVmVnYW5cIj5WZWdhbjwvb3B0aW9uPlxuICAgIDxvcHRpb24gdmFsdWU9XCJBbGxlcmdpZXNcIj5BbGxlcmdpZXM8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgICBcbiAgICA8bGFiZWwgZm9yPVwic3BlY2lhbFJlcXVlc3RzXCI+U3BlY2lhbCBSZXF1ZXN0czwvbGFiZWw+XG4gICAgPHRleHRhcmVhIGlkPVwic3BlY2lhbFJlcXVlc3RzXCIgbmFtZT1cInNwZWNpYWxSZXF1ZXN0c1wiIHBsYWNlaG9sZGVyPVwiQW55IG11c3Qtc2VlIHBsYWNlcyBvciByZXF1aXJlbWVudHNcIiByb3dzPVwiNVwiPjwvdGV4dGFyZWE+XG4gICAgXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZXh0LXN0ZXBcIj5OZXh0PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmV2LXN0ZXBcIj5CYWNrPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tc3RlcFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICBcbiAgICA8bGFiZWwgZm9yPVwibmFtZVwiPllvdXIgbmFtZTwvbGFiZWw+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJuYW1lXCIgbmFtZT1cIm5hbWVcIj5cbiAgICBcbiAgICA8bGFiZWwgZm9yPVwiZW1haWxcIj5Zb3VyIEVtYWlsPC9sYWJlbD5cbiAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJlbWFpbFwiIG5hbWU9XCJlbWFpbFwiPlxuICAgIFxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiPkdlbmVyYXRlIEl0aW5lcmFyeTwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJldi1zdGVwXCI+QmFjazwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PiIsCiAgICAgICAgICAib25TdWJtaXQiOiAiMiIKICAgICAgICB9LAogICAgICAgICJiaHZPblJlbmRlciI6ICIvLyBKYXZhU2NyaXB0IHJ1bnMgd2hlbmV2ZXIgZGF0YSBpcyByZW5kZXJlZFxuLy8gTkI6IHRoaXMgaXMgSmF2YVNjcmlwdCBhbmQgTk9UIFByb2NTY3JpcHRcbi8vIHRhcmdldCA9IGpxdWVyeSBET00gd3JhcHBlciBvZiB0aGUgY3VycmVudCBzY3JlZW5cbi8vIG15X3ZhcmlhYmxlcyA9IHtmb286XCJiYXJcIixldGN9IC0gY2Fubm90IGJlIGNoYW5nZWQgaGVyZVxubGV0IHN0ZXAgPSAwO1xuJChcIi5uZXh0LXN0ZXBcIikuY2xpY2soZnVuY3Rpb24oKSB7XG5cdCQoXCIuZm9ybS1zdGVwXCIpLmVxKHN0ZXApLmhpZGUoKTtcblx0c3RlcCsrO1xuXHQkKFwiLmZvcm0tc3RlcFwiKS5lcShzdGVwKS5zaG93KCk7XG59KTtcblxuJChcIi5wcmV2LXN0ZXBcIikuY2xpY2soZnVuY3Rpb24oKSB7XG5cdCQoXCIuZm9ybS1zdGVwXCIpLmVxKHN0ZXApLmhpZGUoKTtcblx0c3RlcC0tO1xuXHQkKFwiLmZvcm0tc3RlcFwiKS5lcShzdGVwKS5zaG93KCk7XG59KTsiLAogICAgICAgICJiaHZCZWZvcmVTdWJtaXRWYWxpZGF0aW9uIjogIiRtaXNzaW5nRmllbGRzID0gW107XG5cbmlmIChlbXB0eShmb3JtX3ZhbHVlc1tcImVtYWlsXCJdKSkgeyAkbWlzc2luZ0ZpZWxkc1tdID0gXCJlbWFpbFwiOyB9IFxuaWYgKGVtcHR5KGZvcm1fdmFsdWVzW1wibmFtZVwiXSkpIHsgJG1pc3NpbmdGaWVsZHNbXSA9IFwibmFtZVwiOyB9IFxuaWYgKGVtcHR5KGZvcm1fdmFsdWVzW1wiZGVzdGluYXRpb25cIl0pKSB7ICRtaXNzaW5nRmllbGRzW10gPSBcImRlc3RpbmF0aW9uXCI7IH1cbmlmIChlbXB0eShmb3JtX3ZhbHVlc1tcInN0YXJ0RGF0ZVwiXSkgfHwgZW1wdHkoJGZvcm1fdmFsdWVzW1wiZW5kRGF0ZVwiXSkpIHsgJG1pc3NpbmdGaWVsZHNbXSA9IFwidHJpcCBkYXRlc1wiOyB9XG5pZiAoZW1wdHkoZm9ybV92YWx1ZXNbXCJ0cmF2ZWxlcnNcIl0pKSB7ICRtaXNzaW5nRmllbGRzW10gPSBcIm51bWJlciBvZiB0cmF2ZWxlcnNcIjsgfVxuaWYgKGVtcHR5KGZvcm1fdmFsdWVzW1wiYnVkZ2V0XCJdKSkgeyAkbWlzc2luZ0ZpZWxkc1tdID0gXCJidWRnZXQgcHJlZmVyZW5jZVwiOyB9XG5cblxuaWYgKCFlbXB0eSgkbWlzc2luZ0ZpZWxkcykpIHtcbiAgICByZXR1cm4gXCJZb3UgbXVzdCBmaWxsIGluIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBcIiArIGltcGxvZGUoXCIsIFwiLCAkbWlzc2luZ0ZpZWxkcykgKyBcIiB0byBwcm9jZWVkLlwiO1xufVxuXG4vL0dlbmVyYXRlIHVzZXIgaWYgZG9lcyBub3QgZXhpc3RcbnF1ZXJ5MSA9IFwiU0VMRUNUIGlkIEZST00gYHVzZXJzYCBXSEVSRSBlbWFpbCA9ID9cIjtcbnVzZXIgPSBteXNxbF9xdWVyeShxdWVyeTEsIFtmb3JtX3ZhbHVlc1tcImVtYWlsXCJdXSwgXCJhaV9pdGluZXJhcnlfZ2VuZXJhdG9yXCIpXG5cbi8vIElmIHVzZXIgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGVtXG5pZiAoIXVzZXIpIHtcbiAgICBxdWVyeTIgPSBcIklOU0VSVCBJTlRPIGB1c2Vyc2AgKG5hbWUsIGVtYWlsLCBwYXNzd29yZCwgY3JlYXRlZF9hdCkgVkFMVUVTICg/LCA/LCA/LCBOT1coKSlcIjtcdFxuICAgIGhhc2hlZF9wYXNzd29yZCA9IG1kNShcImRlZmF1bHQxMjNcIiwgZmFsc2UpO1xuICAgIG15c3FsX3F1ZXJ5KHF1ZXJ5MiwgW2Zvcm1fdmFsdWVzW1wibmFtZVwiXSxmb3JtX3ZhbHVlc1tcImVtYWlsXCJdLCBoYXNoZWRfcGFzc3dvcmRdLCBcImFpX2l0aW5lcmFyeV9nZW5lcmF0b3JcIik7XG5cbiAgICAvLyBHZXQgdGhlIG5ld2x5IGNyZWF0ZWQgdXNlciBJRFxuICAgIHVzZXIgPSBteXNxbF9xdWVyeShxdWVyeTEsIFtmb3JtX3ZhbHVlc1tcImVtYWlsXCJdXSwgXCJhaV9pdGluZXJhcnlfZ2VuZXJhdG9yXCIpXG59XG5cbi8vTWFrZSBEQiBlbnRyeVxucXVlcnkzID0gXCJJTlNFUlQgSU5UTyBgaXRpbmVyYXJ5X3JlcXVlc3RzYCAodXNlcl9pZCwgZGVzdGluYXRpb24sIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgdHJhdmVsZXJzLCBpbnRlcmVzdHMsIGJ1ZGdldCwgcGFjZSwgZGlldGFyeSwgYHNwZWNpYWxfcmVxdWVzdHNgLCBgY3JlYXRlZF9hdGApIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgTk9XKCkpXCJcbnBhcmFtcyA9IFtcbiAgICB1c2VyW1wiaWRcIl0sIFxuICAgIGZvcm1fdmFsdWVzW1wiZGVzdGluYXRpb25cIl0sIFxuICAgIGZvcm1fdmFsdWVzW1wic3RhcnREYXRlXCJdLCBcbiAgICBmb3JtX3ZhbHVlc1tcImVuZERhdGVcIl0sIFxuICAgIGZvcm1fdmFsdWVzW1widHJhdmVsZXJzXCJdLCBcbiAgICBmb3JtX3ZhbHVlc1tcImludGVyZXN0c1wiXSwgXG4gICAgZm9ybV92YWx1ZXNbXCJidWRnZXRcIl0sIFxuICAgIGZvcm1fdmFsdWVzW1wicGFjZVwiXSwgXG4gICAgZm9ybV92YWx1ZXNbXCJkaWV0YXJ5XCJdLCBcbiAgICBmb3JtX3ZhbHVlc1tcInNwZWNpYWxSZXF1ZXN0c1wiXVxuXVxuXG5teXNxbF9jb21tYW5kKHF1ZXJ5MywgcGFyYW1zLCBcImFpX2l0aW5lcmFyeV9nZW5lcmF0b3JcIilcblxucXVlcnk0ID0gXCJTRUxFQ1QgKiBGUk9NIGBpdGluZXJhcnlfcmVxdWVzdHNgIFdIRVJFIHVzZXJfaWQgPSA/IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxXCI7XG5yZXF1ZXN0ID0gbXlzcWxfcXVlcnkocXVlcnk0LCBbdXNlcltcImlkXCJdXSwgXCJhaV9pdGluZXJhcnlfZ2VuZXJhdG9yXCIpXG5cbmN1c3RvbV90b2tlbnMudXNlcl9pZCA9IHVzZXJbXCJpZFwiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdF9pZCA9IHJlcXVlc3RbXCJpZFwiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdC5kZXN0aW5hdGlvbiA9IHJlcXVlc3RbXCJkZXN0aW5hdGlvblwiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdC5zdGFydERhdGUgPSByZXF1ZXN0W1wic3RhcnRfZGF0ZVwiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdC5lbmREYXRlID0gcmVxdWVzdFtcImVuZF9kYXRlXCJdO1xuY3VzdG9tX3Rva2Vucy5yZXF1ZXN0LnRyYXZlbGVycyA9IHJlcXVlc3RbXCJ0cmF2ZWxlcnNcIl07XG5jdXN0b21fdG9rZW5zLnJlcXVlc3QuaW50ZXJlc3RzID0gcmVxdWVzdFtcImludGVyZXN0c1wiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdC5idWRnZXQgPSByZXF1ZXN0W1wiYnVkZ2V0XCJdO1xuY3VzdG9tX3Rva2Vucy5yZXF1ZXN0LnBhY2UgPSByZXF1ZXN0W1wicGFjZVwiXTtcbmN1c3RvbV90b2tlbnMucmVxdWVzdC5kaWV0YXJ5ID0gcmVxdWVzdFtcImRpZXRhcnlcIl07XG5jdXN0b21fdG9rZW5zLnJlcXVlc3Quc3BlY2lhbFJlcXVlc3RzID0gcmVxdWVzdFtcInNwZWNpYWxSZXF1ZXN0c1wiXTtcblxuXG4iLAogICAgICAgICJiaHZBZnRlclN1Ym1pdCI6ICIvLyBQcm9jU2NyaXB0IHJ1bnMgYWZ0ZXIgc2F2aW5nIGFuIGl0ZW1cbi8vIGZvcm1fYWN0aW9uID0gY3JlYXRlL3VwZGF0ZS9kZWxldGVcbi8vIGl0ZW1faWRcbi8vIGZvcm1fdmFsdWVzID0ge3RpdGxlOlwiZm9vXCIsIGV0Y31cbi8vIG15X3ZhcmlhYmxlcyA9IHtmb286XCJiYXJcIixldGN9IC0gdGhlc2UgYXJlIHlvdXJzIHRvIGNoYW5nZVxuLy8gY3VzdG9tX3Rva2VucyA9IHt9IChlZyBjdXN0b21fdG9rZW5zLmZvbyA9IFwiYmFyXCIgLSB0aGVuIHVzZSBAW3BmX2N1c3RvbTpmb29dXG5cbiIsCiAgICAgICAgImJodkJlZm9yZVByb2Nlc3MiOiAiLy8gUHJvY1NjcmlwdCBydW5zIGJlZm9yZSBzY3JlZW4gaW5pdGlhbGl6ZXNcbi8vIHRyYW5zbGF0aW9ucyA9IHtcIlRpdGxlXCI6XCJIZWFkaW5nXCIsIGV0Y31cbi8vIGxvY2F0aW9uID0gXCJodHRwczovL3Byb2NkdS5jb20vbWNhcHAvaWQ/cGFyYW1zXCIgLSBjaGFuZ2UgdG8gcmVkaXJlY3Rcbi8vIHVybF9wYXJhbWV0ZXJzID0ge31cbi8vIG15X3ZhcmlhYmxlcyA9IHtmb286XCJiYXJcIixldGN9IC0gdGhlc2UgYXJlIHlvdXJzIHRvIGNoYW5nZVxuLy8gY3VzdG9tX3Rva2VucyA9IHt9IChlZyBjdXN0b21fdG9rZW5zLmZvbyA9IFwiYmFyXCIgLSB0aGVuIHVzZSBAW3BmX2N1c3RvbTpmb29dXG4vLyBpc19sb2dnZWRfaW4gPSB0cnVlL2ZhbHNlXG4vLyBhdXRoX2l0ZW0ge2l0ZW1faWQ6MTIzNCwgZmllbGRzOlsuLi5dLCBldGN9IC0gcmF3IHBvZGlvIGl0ZW0gb3IgbnVsbFxuLy8gYXV0aF9pdGVtX3ZhbHVlcyB7dGl0bGU6XCJmb29cIiwgbnVtYmVyOjIsIGV0Y30gb3IgbnVsbFxuY3VzdG9tX3Rva2VucyA9IG51bGw7IgogICAgICB9LAogICAgICB7CiAgICAgICAgInB1YmxpYyI6ICIxIiwKICAgICAgICAibmFtZSI6ICJwYXltZW50X3NjcmVlbiIsCiAgICAgICAgInNjcmVlblR5cGUiOiAidGV4dCIsCiAgICAgICAgInNjck1rZEhlYWQiOiAiPHN0eWxlPlxuICAgIGJvZHkgeyBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7bWF4LXdpZHRoOiA2MDBweDttYXJnaW46IDUwcHggYXV0bzt0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbiAgICAuc3VtbWFyeS1ib3ggeyBiYWNrZ3JvdW5kOiAjZjhmOWZhO3RleHQtYWxpZ246IGxlZnQ7cGFkZGluZzogMjBweDtib3JkZXItcmFkaXVzOiAxMHB4O2JveC1zaGFkb3c6IDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSk7bWFyZ2luLWJvdHRvbTogMjBweDttaW4taGVpZ2h0OiA1MHB4OyB9XG4gICAgLmxvYWRpbmctc3Bpbm5lciB7IGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7Ym9yZGVyLXRvcDogNHB4IHNvbGlkICMwMDdiZmY7Ym9yZGVyLXJhZGl1czogNTAlO3dpZHRoOiAzMHB4O2hlaWdodDogMzBweDthbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlO21hcmdpbjogMCBhdXRvO2Rpc3BsYXk6IGJsb2NrOyB9XG4gICAgQGtleWZyYW1lcyBzcGluIHsgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfSAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9XG4gICAgLmJ0biB7IGRpc3BsYXk6IGlubGluZS1ibG9jazttYXJnaW4tdG9wOiAxNXB4O3BhZGRpbmc6IDEwcHggMjBweDtiYWNrZ3JvdW5kOiAjMDA3YmZmO2NvbG9yOiB3aGl0ZTtib3JkZXI6IG5vbmU7Y3Vyc29yOiBwb2ludGVyO2JvcmRlci1yYWRpdXM6IDVweDtmb250LXNpemU6IDE2cHg7dGV4dC1kZWNvcmF0aW9uOiBub25lOyB9XG4gICAgLmJ0bjpob3ZlciB7YmFja2dyb3VuZDogIzAwNTZiMzsgfVxuICAgIC5yZW1pbmRlciB7Zm9udC1zaXplOiAxNHB4O2NvbG9yOiAjNTU1O21hcmdpbi10b3A6IDEwcHg7IH1cbjwvc3R5bGU+IiwKICAgICAgICAic2NyTWtkRm9vdCI6ICIiLAogICAgICAgICJpbnRub3RlcyI6ICIiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAibWtkVGV4dCI6ICI8aDI+WW91ciBUcmlwIFN1bW1hcnk8L2gyPlxuPGRpdiBjbGFzcz1cInN1bW1hcnktYm94XCI+XG4gICAgPGRpdiBpZD1cImxvYWRpbmctc3Bpbm5lclwiIGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XG4gICAgPHAgaWQ9XCJ0cmlwLXN1bW1hcnlcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9wPlxuPC9kaXY+XG5cbjxwIGNsYXNzPVwicmVtaW5kZXJcIj7imqDvuI8gUGxlYXNlIHVzZSB0aGUgKipzYW1lIGVtYWlsIGluIFN0cmlwZSoqLiBZb3VyIGZ1bGwgaXRpbmVyYXJ5IHdpbGwgYmUgc2VudCB0byB0aGF0IGVtYWlsIHdpdGhpbiA1IG1pbnV0ZXMuPC9wPlxuXG48YnV0dG9uIGlkPVwiYnV5LW5vd1wiIGNsYXNzPVwiYnRuXCI+QnV5IEZ1bGwgUGVyc29uYWxpc2VkIEl0ZW5hcnkgLSAkMzwvYnV0dG9uPiIKICAgICAgICB9LAogICAgICAgICJiaHZCZWZvcmVQcm9jZXNzIjogIi8vIFByb2NTY3JpcHQgcnVucyBiZWZvcmUgc2NyZWVuIGluaXRpYWxpemVzXG4vLyB0cmFuc2xhdGlvbnMgPSB7XCJUaXRsZVwiOlwiSGVhZGluZ1wiLCBldGN9XG4vLyBsb2NhdGlvbiA9IFwiaHR0cHM6Ly9wcm9jZHUuY29tL21jYXBwL2lkP3BhcmFtc1wiIC0gY2hhbmdlIHRvIHJlZGlyZWN0XG4vLyB1cmxfcGFyYW1ldGVycyA9IHt9XG4vLyBteV92YXJpYWJsZXMgPSB7Zm9vOlwiYmFyXCIsZXRjfSAtIHRoZXNlIGFyZSB5b3VycyB0byBjaGFuZ2Vcbi8vIGN1c3RvbV90b2tlbnMgPSB7fSAoZWcgY3VzdG9tX3Rva2Vucy5mb28gPSBcImJhclwiIC0gdGhlbiB1c2UgQFtwZl9jdXN0b206Zm9vXVxuLy8gaXNfbG9nZ2VkX2luID0gdHJ1ZS9mYWxzZVxuLy8gYXV0aF9pdGVtIHtpdGVtX2lkOjEyMzQsIGZpZWxkczpbLi4uXSwgZXRjfSAtIHJhdyBwb2RpbyBpdGVtIG9yIG51bGxcbi8vIGF1dGhfaXRlbV92YWx1ZXMge3RpdGxlOlwiZm9vXCIsIG51bWJlcjoyLCBldGN9IG9yIG51bGxcbiIsCiAgICAgICAgImJodk9uUmVuZGVyIjogImZ1bmN0aW9uIHN1Y2Nlc3NGdW5jKGRhdGEpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICAkKFwiI2xvYWRpbmctc3Bpbm5lclwiKS5oaWRlKCk7IC8vIEhpZGUgbG9hZGluZyBzcGlubmVyXG4gICAgJChcIiN0cmlwLXN1bW1hcnlcIikuaHRtbChkYXRhKS5zaG93KCk7IC8vIFNob3cgc3VtbWFyeVxuICB9XG59XG5cbmZ1bmN0aW9uIGVyckZ1bmMoKSB7XG4gIGNvbnNvbGUubG9nKFwiRXJyb3JcIik7XG59XG5cblBmSnMuYWpheENhbGwoXCJhamF4XCIsIHt9LCBzdWNjZXNzRnVuYywgZXJyRnVuYyk7XG5cbiQoXCIjYnV5LW5vd1wiKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gIGxldCBzdHJpcGVMaW5rID0gXCJTVFJJUEVfTElOS1wiO1xuICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHN0cmlwZUxpbms7XG59KTtcbiIKICAgICAgfSwKICAgICAgewogICAgICAgICJwdWJsaWMiOiAiMSIsCiAgICAgICAgIm5hbWUiOiAiYWpheCIsCiAgICAgICAgInNjcmVlblR5cGUiOiAidGV4dCIsCiAgICAgICAgInNjck1rZEhlYWQiOiAiIiwKICAgICAgICAic2NyTWtkRm9vdCI6ICIiLAogICAgICAgICJpbnRub3RlcyI6ICIiLAogICAgICAgICJjb25maWciOiB7ICJta2RUZXh0IjogIiIgfSwKICAgICAgICAiYmh2QmVmb3JlUHJvY2VzcyI6ICIka2V5ID0gXCJTVFJJUEVfQVBJX0tFWVwiO1xuXG4vLyBPcGVuQUkgQVBJIFVSTFxuJHVybCA9IFwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zXCI7XG4vLyBBUEkgSGVhZGVycyAoUmVwbGFjZSBZT1VSX0FQSV9LRVkgd2l0aCB5b3VyIGFjdHVhbCBPcGVuQUkga2V5KVxuJGhlYWRlcnMgPSBcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiAsIEF1dGhvcml6YXRpb246IEJlYXJlciBcIiska2V5O1xuLy8gT3BlbkFJIFJlcXVlc3QgQm9keVxuJHJlcXVlc3RfYm9keSA9IFtcbiAgICBcIm1vZGVsXCIgPT4gXCJncHQtNG8tbWluaS0yMDI0LTA3LTE4XCIsXG4gICAgXCJtZXNzYWdlc1wiID0+IFtcbiAgICAgICAgW1wicm9sZVwiID0+IFwic3lzdGVtXCIsIFwiY29udGVudFwiID0+IFwiWW91IGFyZSBhIHRyYXZlbCBwbGFubmVyLiBHZW5lcmF0ZSBhIHNob3J0IHN1bW1hcnkgZm9yIGEgdHJpcCBpdGluZXJhcnkuXCJdLFxuICAgICAgICBbXCJyb2xlXCIgPT4gXCJ1c2VyXCIsIFwiY29udGVudFwiID0+IGpzb25fZW5jb2RlKGN1c3RvbV90b2tlbnMucmVxdWVzdCldXG4gICAgXSxcbiAgICBcInRlbXBlcmF0dXJlXCIgPT4gMC43XG5dO1xuXG4vLyBTZW5kIEFQSSByZXF1ZXN0XG4kb3V0cHV0ID0gIHJlbW90ZV9jdXJsKCR1cmwsIFwiUE9TVFwiLCAkaGVhZGVycywgJHJlcXVlc3RfYm9keSwgMCk7XG4kZGVjb2RlZF9vdXRwdXQgPSBqc29uX2RlY29kZSgkb3V0cHV0LHRydWUpO1xuJHN1bW1hcnkgPSAkZGVjb2RlZF9vdXRwdXRbXCJjaG9pY2VzXCJdWzBdW1wibWVzc2FnZVwiXVtcImNvbnRlbnRcIl07XG5cbnF1ZXJ5ID0gXCJJTlNFUlQgSU5UTyBgaXRpbmVyYXJpZXNgICh1c2VyX2lkLCByZXF1ZXN0X2lkLCBgcGFydGlhbF9pdGluZXJhcnlgLGBnZW5lcmF0ZWRfYXRgKSBWQUxVRVMgKD8sID8sID8sIE5PVygpKVwiXG5wYXJhbXMgPSBbXG4gICAgY3VzdG9tX3Rva2Vuc1tcInVzZXJfaWRcIl0sIFxuXHRjdXN0b21fdG9rZW5zW1wicmVxdWVzdF9pZFwiXSwgXG5cdCRzdW1tYXJ5IFxuXVxuXG5teXNxbF9jb21tYW5kKHF1ZXJ5LCBwYXJhbXMsIFwiYWlfaXRpbmVyYXJ5X2dlbmVyYXRvclwiKVxuXHRcbnByaW50IG1hcmtkb3duX3RvX2h0bWwoJHN1bW1hcnkpIgogICAgICB9LAogICAgICB7CiAgICAgICAgInB1YmxpYyI6ICIxIiwKICAgICAgICAibmFtZSI6ICJzdWNjZXNzIiwKICAgICAgICAic2NyZWVuVHlwZSI6ICJ0ZXh0IiwKICAgICAgICAic2NyTWtkSGVhZCI6ICI8c3R5bGU+XG5ib2R5IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQ6ICNmOGY5ZmE7IHBhZGRpbmc6IDUwcHg7IH1cbmgyIHsgY29sb3I6ICMyOGE3NDU7IH1cbnAgeyBjb2xvcjogIzU1NTsgZm9udC1zaXplOiAxNnB4OyB9XG4uY29udGFpbmVyIHsgYmFja2dyb3VuZDogd2hpdGU7IHBhZGRpbmc6IDMwcHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7IG1heC13aWR0aDogNTAwcHg7IG1hcmdpbjogYXV0bzsgfVxuLnN1Y2Nlc3MtaWNvbiB7IGZvbnQtc2l6ZTogNTBweDsgY29sb3I6ICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDEwcHg7IH1cbi5idG4geyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZDogIzAwN2JmZjsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyB9XG4uYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogIzAwNTZiMzsgfVxuPC9zdHlsZT4iLAogICAgICAgICJzY3JNa2RGb290IjogIiIsCiAgICAgICAgImludG5vdGVzIjogIiIsCiAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICJta2RUZXh0IjogIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3VjY2Vzcy1pY29uXCI+4pyFPC9kaXY+XG4gICAgPGgyPlBheW1lbnQgU3VjY2Vzc2Z1bCE8L2gyPlxuICAgIDxwPllvdXIgZnVsbCBpdGluZXJhcnkgd2lsbCBiZSBzZW50IHRvIHlvdXIgZW1haWwgd2l0aGluIDUgbWludXRlcy4gPC9wPlxuICAgIDxwPlBsZWFzZSBjaGVjayB5b3VyIGluYm94IChhbmQgc3BhbSBmb2xkZXIganVzdCBpbiBjYXNlKS48L3A+XG48L2Rpdj4iCiAgICAgICAgfQogICAgICB9LAogICAgICB7CiAgICAgICAgInB1YmxpYyI6IG51bGwsCiAgICAgICAgIm5hbWUiOiAiY29kZSIsCiAgICAgICAgInNjcmVlblR5cGUiOiAidGV4dCIsCiAgICAgICAgInNjck1rZEhlYWQiOiAiIiwKICAgICAgICAic2NyTWtkRm9vdCI6ICIiLAogICAgICAgICJpbnRub3RlcyI6ICIiLAogICAgICAgICJjb25maWciOiB7ICJta2RUZXh0IjogIiIgfSwKICAgICAgICAiYmh2QmVmb3JlUHJvY2VzcyI6ICIvLyBQcm9jU2NyaXB0IHJ1bnMgYmVmb3JlIHNjcmVlbiBpbml0aWFsaXplc1xuLy8gdHJhbnNsYXRpb25zID0ge1wiVGl0bGVcIjpcIkhlYWRpbmdcIiwgZXRjfVxuLy8gbG9jYXRpb24gPSBcImh0dHBzOi8vcHJvY2R1LmNvbS9tY2FwcC9pZD9wYXJhbXNcIiAtIGNoYW5nZSB0byByZWRpcmVjdFxuLy8gdXJsX3BhcmFtZXRlcnMgPSB7fVxuLy8gbXlfdmFyaWFibGVzID0ge2ZvbzpcImJhclwiLGV0Y30gLSB0aGVzZSBhcmUgeW91cnMgdG8gY2hhbmdlXG4vLyBjdXN0b21fdG9rZW5zID0ge30gKGVnIGN1c3RvbV90b2tlbnMuZm9vID0gXCJiYXJcIiAtIHRoZW4gdXNlIEBbcGZfY3VzdG9tOmZvb11cbi8vIGlzX2xvZ2dlZF9pbiA9IHRydWUvZmFsc2Vcbi8vIGF1dGhfaXRlbSB7aXRlbV9pZDoxMjM0LCBmaWVsZHM6Wy4uLl0sIGV0Y30gLSByYXcgcG9kaW8gaXRlbSBvciBudWxsXG4vLyBhdXRoX2l0ZW1fdmFsdWVzIHt0aXRsZTpcImZvb1wiLCBudW1iZXI6MiwgZXRjfSBvciBudWxsXG5cbi8vIG5hbWUgdGhpcyBjb2RlIGJsb2NrXG5kZWNvZGVkX3BheWxvYWQgPSBqc29uX2RlY29kZShwYXlsb2FkLGZhbHNlKVxuJGV2ZW50ID0ganNvbl9kZWNvZGUoZGVjb2RlZF9wYXlsb2FkW1wiU1RESU5cIl0sZmFsc2UpXG4kdHlwZSA9IFwiU1FMXCI7XG5cbmlmICgkZXZlbnRbXCJ0eXBlXCJdID09PSBcImNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkXCIgJiYgJHR5cGUgPSBcIlNRTFwiKSB7XG4gICAgJHNlc3Npb24gPSAkZXZlbnRbXCJkYXRhXCJdW1wib2JqZWN0XCJdO1x0XG5cdFx0XG5cdCRhbW91bnQgPSAkc2Vzc2lvbltcImFtb3VudF90b3RhbFwiXSAvIDEwMDtcblx0JGN1cnJlbmN5ID0gc3RydG91cHBlcigkc2Vzc2lvbltcImN1cnJlbmN5XCJdKTtcblx0JHN0YXR1cyA9ICgkc2Vzc2lvbltcInBheW1lbnRfc3RhdHVzXCJdID09PSBcInBhaWRcIikgPyBcImNvbXBsZXRlZFwiIDogXCJmYWlsZWRcIjtcbiAgICAkdHJhbnNhY3Rpb25faWQgPSAkc2Vzc2lvbltcInBheW1lbnRfaW50ZW50XCJdO1xuXHQkZW1haWwgPSAkc2Vzc2lvbltcImN1c3RvbWVyX2RldGFpbHNcIl1bXCJlbWFpbFwiXTtcdFxuXHRcblx0Ly9GSU5EIFVTRVJcblx0cXVlcnkxID0gXCJTRUxFQ1QgKiBGUk9NIGB1c2Vyc2AgV0hFUkUgZW1haWwgPSA/XCI7XG5cdHVzZXIgPSBteXNxbF9xdWVyeShxdWVyeTEsIFskZW1haWxdLCBcImFpX2l0aW5lcmFyeV9nZW5lcmF0b3JcIik7XG5cdFxuXHQvL0ZJTkQgSVRFTkFSWSBSRVFVRVNUXG5cdHF1ZXJ5MiA9IFwiU0VMRUNUICogRlJPTSBgaXRpbmVyYXJ5X3JlcXVlc3RzYCBXSEVSRSB1c2VyX2lkID0gKFNFTEVDVCBpZCBGUk9NIHVzZXJzIFdIRVJFIGVtYWlsID0gPykgT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFcIjtcblx0aXRpbmVyYXJ5X3JlcXVlc3QgPSBteXNxbF9xdWVyeShxdWVyeTIsIFskZW1haWxdLCBcImFpX2l0aW5lcmFyeV9nZW5lcmF0b3JcIik7XG4gICBcbiAgICAvL0ZJTkQgUEFZTUVOVC4gSUYgTk8sIENSRUFURSBQQVlNRU5UXG5cdCRxdWVyeTUgPSBcIlNFTEVDVCAqIEZST00gYHBheW1lbnRzYCBXSEVSRSB0cmFuc2FjdGlvbl9pZCA9ID8gTElNSVQgMVwiO1xuXHQkcGF5bWVudCA9IG15c3FsX3F1ZXJ5KHF1ZXJ5NSwgWyR0cmFuc2FjdGlvbl9pZF0sIFwiYWlfaXRpbmVyYXJ5X2dlbmVyYXRvclwiKTtcblx0aWYoISRwYXltZW50KSB7XG5cdFx0JHNxbCA9IFwiSU5TRVJUIElOVE8gcGF5bWVudHMgKHVzZXJfaWQsIGFtb3VudCwgY3VycmVuY3ksIHN0YXR1cywgdHJhbnNhY3Rpb25faWQsIGl0aW5lcmFyeV9yZXF1ZXN0X2lkLCBjcmVhdGVkX2F0KSBWQUxVRVMgKD8sID8sID8sID8sID8sID8sIE5PVygpKVwiOyAgICBcblx0XHQkcGFyYW1zID0gW3VzZXJbXCJpZFwiXSwgJGFtb3VudCwgJGN1cnJlbmN5LCAkc3RhdHVzLCAkdHJhbnNhY3Rpb25faWQsIGl0aW5lcmFyeV9yZXF1ZXN0W1wiaWRcIl1dO1xuXHRcdG15c3FsX2NvbW1hbmQoJHNxbCwgJHBhcmFtcyxcImFpX2l0aW5lcmFyeV9nZW5lcmF0b3JcIik7XG5cdH1cblx0XG5cdC8vRklORCBQQVlNRU5ULiBJRiBOTywgQ1JFQVRFIFBBWU1FTlRcblx0Y3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmRlc3RpbmF0aW9uID0gaXRpbmVyYXJ5X3JlcXVlc3RbXCJkZXN0aW5hdGlvblwiXTtcblx0Y3VzdG9tX3Rva2Vucy5yZXF1ZXN0LnN0YXJ0RGF0ZSA9IGl0aW5lcmFyeV9yZXF1ZXN0W1wic3RhcnRfZGF0ZVwiXTtcblx0Y3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmVuZERhdGUgPSBpdGluZXJhcnlfcmVxdWVzdFtcImVuZF9kYXRlXCJdO1xuXHRjdXN0b21fdG9rZW5zLnJlcXVlc3QudHJhdmVsZXJzID0gaXRpbmVyYXJ5X3JlcXVlc3RbXCJ0cmF2ZWxlcnNcIl07XG5cdGN1c3RvbV90b2tlbnMucmVxdWVzdC5pbnRlcmVzdHMgPSBpdGluZXJhcnlfcmVxdWVzdFtcImludGVyZXN0c1wiXTtcblx0Y3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmJ1ZGdldCA9IGl0aW5lcmFyeV9yZXF1ZXN0W1wiYnVkZ2V0XCJdO1xuXHRjdXN0b21fdG9rZW5zLnJlcXVlc3QucGFjZSA9IGl0aW5lcmFyeV9yZXF1ZXN0W1wicGFjZVwiXTtcblx0Y3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmRpZXRhcnkgPSBpdGluZXJhcnlfcmVxdWVzdFtcImRpZXRhcnlcIl07XG5cdGN1c3RvbV90b2tlbnMucmVxdWVzdC5zcGVjaWFsUmVxdWVzdHMgPSBpdGluZXJhcnlfcmVxdWVzdFtcInNwZWNpYWxSZXF1ZXN0c1wiXTtcblx0XHRcblx0JGtleSA9IFwiU1RSSVBFX0FQSV9LRVlcIjtcblx0JHVybCA9IFwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zXCI7XG5cdCRoZWFkZXJzID0gXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24gLCBBdXRob3JpemF0aW9uOiBCZWFyZXIgXCIrJGtleTtcblx0JHJlcXVlc3RfYm9keSA9IFtcblx0XHRcIm1vZGVsXCIgPT4gXCJncHQtNG8tbWluaS0yMDI0LTA3LTE4XCIsXG5cdFx0XCJtZXNzYWdlc1wiID0+IFtcblx0XHRcdFtcInJvbGVcIiA9PiBcInN5c3RlbVwiLCBcImNvbnRlbnRcIiA9PiBcIllvdSBhcmUgYSB0cmF2ZWwgcGxhbm5lci4gR2VuZXJhdGUgYSBkZXRhaWxlZCBpdGluZXJhcnkgZm9yIHRoZSBmb2xsb3dpbmcgdHJpcC5cIl0sXG5cdFx0XHRbXCJyb2xlXCIgPT4gXCJ1c2VyXCIsIFwiY29udGVudFwiID0+IGpzb25fZW5jb2RlKGN1c3RvbV90b2tlbnMucmVxdWVzdCldXG5cdFx0XSxcblx0XHRcInRlbXBlcmF0dXJlXCIgPT4gMC43XG5cdF07XG5cdCRvdXRwdXQgPSAgcmVtb3RlX2N1cmwoJHVybCwgXCJQT1NUXCIsICRoZWFkZXJzLCAkcmVxdWVzdF9ib2R5LCAwKTtcblx0JGRlY29kZWRfb3V0cHV0ID0ganNvbl9kZWNvZGUoJG91dHB1dCx0cnVlKVxuXHQkaXRlbmFyeSA9ICRkZWNvZGVkX291dHB1dFtcImNob2ljZXNcIl1bMF1bXCJtZXNzYWdlXCJdW1wiY29udGVudFwiXTtcblx0XG5cdCRxdWVyeTMgPSBcIlNFTEVDVCAqIEZST00gYGl0aW5lcmFyaWVzYCBXSEVSRSByZXF1ZXN0X2lkID0gPyBPUkRFUiBCWSBnZW5lcmF0ZWRfYXQgREVTQyBMSU1JVCAxXCI7XG5cdCRpdGluZXJhcnlfZW50cnkgPSBteXNxbF9xdWVyeShxdWVyeTMsIFtpdGluZXJhcnlfcmVxdWVzdFtcImlkXCJdXSwgXCJhaV9pdGluZXJhcnlfZ2VuZXJhdG9yXCIpO1xuXHRcblx0aWYgKCRpdGluZXJhcnlfZW50cnkpIHtcblx0XHQkdXBkYXRlX3F1ZXJ5ID0gXCJVUERBVEUgYGl0aW5lcmFyaWVzYCBTRVQgYGZ1bGxfaXRpbmVyYXJ5YCA9ID8sIGBnZW5lcmF0ZWRfYXRgID0gTk9XKCkgV0hFUkUgaWQgPSA/XCI7XG5cdFx0bXlzcWxfY29tbWFuZCgkdXBkYXRlX3F1ZXJ5LCBbJGl0ZW5hcnksICRpdGluZXJhcnlfZW50cnlbXCJpZFwiXV0sIFwiYWlfaXRpbmVyYXJ5X2dlbmVyYXRvclwiKTtcblx0fSBlbHNlIHtcblx0XHQkaW5zZXJ0X3F1ZXJ5ID0gXCJJTlNFUlQgSU5UTyBgaXRpbmVyYXJpZXNgICh1c2VyX2lkLCByZXF1ZXN0X2lkLCBgZnVsbF9pdGluZXJhcnlgLCBgZ2VuZXJhdGVkX2F0YCkgVkFMVUVTICg/LCA/LCA/LCBOT1coKSlcIjtcblx0XHRteXNxbF9jb21tYW5kKCRpbnNlcnRfcXVlcnksIFt1c2VyW1wiaWRcIl0sIGl0aW5lcmFyeV9yZXF1ZXN0W1wiaWRcIl0sICRmdWxsX2l0aW5lcmFyeV0sIFwiYWlfaXRpbmVyYXJ5X2dlbmVyYXRvclwiKTtcblx0fVxuXHRcblx0JHN1YmplY3QgPSBcIllvdXIgRnVsbCBJdGluZXJhcnkgZm9yIFwiICsgY3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmRlc3RpbmF0aW9uICsgXCIgaXMgUmVhZHkhXCI7XG5cdCRib2R5ID0gXCJcIlwiXG5cdFx0PGh0bWw+XG5cdFx0PGhlYWQ+XG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdGJvZHkgeyBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IGxpbmUtaGVpZ2h0OiAxLjY7IGNvbG9yOiAjMzMzOyB9XG5cdFx0XHRcdC5jb250YWluZXIgeyBtYXgtd2lkdGg6IDYwMHB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMjBweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLXJhZGl1czogOHB4OyB9XG5cdFx0XHRcdGgyIHsgY29sb3I6ICMwMDdiZmY7IH1cblx0XHRcdFx0LmZvb3RlciB7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM3Nzc7IG1hcmdpbi10b3A6IDIwcHg7IH1cblx0XHRcdDwvc3R5bGU+XG5cdFx0PC9oZWFkPlxuXHRcdDxib2R5PlxuXHRcdFx0PGRpdiBjbGFzcz0nY29udGFpbmVyJz5cblx0XHRcdFx0PGgyPllvdXIgSXRpbmVyYXJ5IGZvciAnXCJcIlwiICsgY3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmRlc3RpbmF0aW9uICsgXCJcIlwiJyBpcyBSZWFkeSE8L2gyPlxuXHRcdFx0XHQ8cD5EZWFyIFwiXCJcIiArIHVzZXJbXCJuYW1lXCJdICsgXCJcIlwiLDwvcD5cblx0XHRcdFx0PHA+VGhhbmsgeW91IGZvciB5b3VyIHBheW1lbnQhIFlvdXIgZnVsbCBpdGluZXJhcnkgaXMgbm93IGF2YWlsYWJsZS48L3A+XG5cdFx0XHRcdDxoMz5UcmlwIERldGFpbHM6PC9oMz5cblx0XHRcdFx0PHA+PHN0cm9uZz5EZXN0aW5hdGlvbjo8L3N0cm9uZz4gJ1wiXCJcIiArIGN1c3RvbV90b2tlbnMucmVxdWVzdC5kZXN0aW5hdGlvbiArIFwiXCJcIic8L3A+XG5cdFx0XHRcdDxwPjxzdHJvbmc+RGF0ZXM6PC9zdHJvbmc+ICdcIlwiXCIgKyBjdXN0b21fdG9rZW5zLnJlcXVlc3Quc3RhcnREYXRlICsgXCJcIlwiJyB0byAnXCJcIlwiICsgY3VzdG9tX3Rva2Vucy5yZXF1ZXN0LmVuZERhdGUgKyBcIlwiXCInPC9wPlxuXHRcdFx0XHQ8cD48c3Ryb25nPlRyYXZlbGVyczo8L3N0cm9uZz4gJ1wiXCJcIiArIGN1c3RvbV90b2tlbnMucmVxdWVzdC50cmF2ZWxlcnMgKyBcIlwiXCInPC9wPlxuXHRcdFx0XHQ8cD48c3Ryb25nPkJ1ZGdldDo8L3N0cm9uZz4gJ1wiXCJcIiArIGN1c3RvbV90b2tlbnMucmVxdWVzdC5idWRnZXQgKyBcIlwiXCInPC9wPlxuXHRcdFx0XHQ8cD48c3Ryb25nPkludGVyZXN0czo8L3N0cm9uZz4gJ1wiXCJcIiArIGN1c3RvbV90b2tlbnMucmVxdWVzdC5pbnRlcmVzdHMgKyBcIlwiXCInPC9wPlxuXHRcdFx0XHQ8aDM+WW91ciBJdGluZXJhcnk6PC9oMz5cblx0XHRcdFx0PHA+J1wiXCJcIiArIG1hcmtkb3duX3RvX2h0bWwoJGl0ZW5hcnkpICsgXCJcIlwiJzwvcD5cblx0XHRcdFx0PHA+V2UgaG9wZSB5b3UgaGF2ZSBhbiBhbWF6aW5nIHRyaXAhIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMsIGZlZWwgZnJlZSB0byByZWFjaCBvdXQuPC9wPlxuXHRcdFx0XHQ8cD5TYWZlIHRyYXZlbHMsPC9wPlxuXHRcdFx0XHQ8cD48c3Ryb25nPlRoZSBUcmF2ZWwgUGxhbm5lciBUZWFtPC9zdHJvbmc+PC9wPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdmb290ZXInPlxuXHRcdFx0XHRcdDxwPlRoaXMgZW1haWwgd2FzIHNlbnQgYXV0b21hdGljYWxseS4gSWYgeW91IGRpZCBub3QgcmVxdWVzdCB0aGlzIGl0aW5lcmFyeSwgcGxlYXNlIGlnbm9yZSB0aGlzIG1lc3NhZ2UuPC9wPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvYm9keT5cblx0XHQ8L2h0bWw+XG5cdFwiXCJcIjtcblx0XG5cdGVtYWlsX3NlbmRfY29ubihcImdsb2JpXCIsICRlbWFpbCwgJHN1YmplY3QsICRib2R5LCBcIlwiLCBcInRoYWhhQGdsb2JpLmNhXCIsIFwiXCIsIFtdKTtcblx0XG59XG4iCiAgICAgIH0KICAgIF0sCiAgICAicHVibGljU2NyZWVucyI6IFswLCAxLCAyLCAzLCA0XSwKICAgICJwdWJsaWNTdGFydCI6ICIwIgogIH0sCiAgInZlcnNpb24iOiAzLAogICJtZXRhIjogewogICAgImxhc3RwaW5nIjogewogICAgICAidXNlciI6ICJ0aGFoYUB0aGV3b3JraW5nd2ViLmNvbSIsCiAgICAgICJ0YWJpZCI6ICJweDVrajFzeWNzMnFybThxNTB2ODQiLAogICAgICAidGltZSI6IDE3NDMwOTQ2MTIKICAgIH0KICB9LAogICJwdWJsaWNTdGFydCI6ICIwIgp9Cg==

Love using ProcFu Guide?

Share your testimonial and let us know how ProcFu has helped you.

Share Your Testimonial

Built with ❤️ by Thaha for the Community