diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000..06a7076e
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,56 @@
+name: Deploy to GitHub Pages
+
+on:
+ push:
+ branches:
+ - main
+ - toyibat
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ - uses: peaceiris/actions-hugo@v3
+ with:
+ hugo-version: '0.147.0'
+ extended: true
+ - name: Install dependencies
+ run: npm ci
+ - name: Copy layout override
+ run: cp layouts/index.html node_modules/@thulite/doks-core/layouts/index.html; cp layouts/index.html node_modules/@thulite/core/layouts/index.html || true
+
+ - name: Build
+ run: hugo --minify --gc --baseURL "https://writetech-hub.github.io/wth-docs-lab/"
+ env:
+ HUGO_ENVIRONMENT: production
+ - name: Check public folder
+ run: ls -la public/ | head -20
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./public
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..115cc41a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+public/
+node_modules/
+resources/_gen/
+.hugo_build.lock
diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml
index 52312b3f..fbcac792 100644
--- a/config/_default/hugo.toml
+++ b/config/_default/hugo.toml
@@ -1,5 +1,5 @@
title = "WTH Docs Lab"
-baseurl = "http://localhost/"
+baseurl = "https://writetech-hub.github.io/wth-docs-lab/"
canonifyURLs = false
disableAliases = false
disableHugoGeneratorInject = true
@@ -47,7 +47,7 @@ copyRight = "Copyright (c) 2020-2024 Thulite"
priority = 0.5
[caches]
- [caches.getjson]
+ [caches.getresource]
dir = ":cacheDir/:project"
maxAge = -1 # "30m"
@@ -84,3 +84,7 @@ copyRight = "Copyright (c) 2020-2024 Thulite"
hint = "photo"
quality = 85
resampleFilter = "Lanczos"
+
+ [security]
+ [security.exec]
+ allow = ['postcss', 'node']
diff --git a/config/_default/params.toml b/config/_default/params.toml
index c29741af..11481f49 100644
--- a/config/_default/params.toml
+++ b/config/_default/params.toml
@@ -1,6 +1,6 @@
# Hugo
-title = "WTH Docs Lab"
-description = "Congrats on setting up a new Doks project!"
+title = "WriteTech Hub Resource Library"
+description = "A structured learning path for technical writers from beginner to advanced."
images = ["cover.png"]
# mainSections
@@ -41,13 +41,13 @@ mainSections = ["guides"]
alertDismissable = true # true (default) or false
# Bootstrap
- bootstrapJavascript = false # false (default) or true
+ bootstrapJavascript = true # false (default) or true
# Nav
- sectionNav = ["docs"] # ["docs"] (default) or list of sections (e.g. ["docs", "guides"])
+ sectionNav = ["docs", "guides"] # ["docs"] (default) or list of sections (e.g. ["docs", "guides"])
toTopButton = false # false (default) or true
breadcrumbTrail = false # false (default) or true
- headlineHash = true # true (default) or false
+ headlineHash = false # true (default) or false
scrollSpy = true # true (default) or false
# Multilingual
@@ -59,7 +59,7 @@ mainSections = ["guides"]
docsVersion = "1.0"
# UX
- headerBar = false # true (default) or false
+ headerBar = true # true (default) or false
backgroundDots = true # true (default) or false
# Homepage
diff --git a/content/_index.md b/content/_index.md
index 5c52ada6..7128a6be 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,13 +1,13 @@
---
-title: "Welcome to WriteTech Hub Docs Lab"
-description: ""
-lead: "Congrats on setting up a new Doks project!"
+title: "WriteTech Hub Resource Library"
+description: "A structured learning path for technical writers — beginner to advanced."
+lead: "A structured, practitioner-built resource library for technical writers."
date: 2023-09-07T16:33:54+02:00
lastmod: 2023-09-07T16:33:54+02:00
draft: false
seo:
- title: "Welcome to WTH Docs Lab" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
+ title: "WriteTech Hub Resource Library"
+ description: "A structured learning path for technical writers at beginner, intermediate, and advanced levels."
+ canonical: ""
+ robots: ""
---
diff --git a/content/guides/_index.md b/content/guides/_index.md
index 510bdd4e..1ba0546b 100644
--- a/content/guides/_index.md
+++ b/content/guides/_index.md
@@ -1,15 +1,64 @@
----
-title: "Guides"
-description: ""
-summary: ""
-date: 2023-09-07T16:12:03+02:00
-lastmod: 2023-09-07T16:12:03+02:00
+---
+title: "Technical Writing Resources"
+description: "A curated resource bank for technical writers at every level beginner, intermediate, and advanced."
+summary: "Structured learning path with capstone deliverables for technical writers."
+date: 2026-06-14T20:51:00+01:00
+lastmod: 2026-06-14T20:51:00+01:00
+type: guides
draft: false
-weight: 999
+weight: 100
toc: true
seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
+ title: "Technical Writing Resources - WriteTech Hub"
+ description: "Curated learning resources for technical writers at beginner, intermediate, and advanced levels."
+ canonical: ""
+ robots: ""
+---
+
+This repository is a curated resource bank for technical writers at every level. Whether you are just getting started, actively practising, or working on complex documentation projects, there is a starting point here for you.
+
+The resources are organised into three levels: **Beginner**, **Intermediate**, and **Advanced**. Each level follows the same structure: you learn a concept, study the relevant resources, practise applying it, and work toward a concrete deliverable you can add to your portfolio.
+
+Start at the level that matches where you are now. If you are unsure, begin with [Beginner](beginner.md).
+
+## Levels
+
+- **Beginner**: Foundations
+- **Intermediate**: Practice and Delivery
+- **Advanced**: Systems and Scale
+
+## How the levels work
+
+Each level closes with a capstone deliverable. It is the practical proof that you have absorbed what the level covers and are ready to move forward. Build it, review it honestly, and use it as a portfolio piece.
+
+The resources within each level are there to support the work, not replace it. Read enough to understand the concept, then practise.
+
+## Community
+
+WriteTech Hub is a community for technical writers at all levels. This repository is one of the ways we support writers with structured learning and practical growth.
+
+Technical writing is easier when you're not doing it alone. You improve faster when you share your work, ask questions, and get feedback from people who understand the craft.
+
+We encourage you to:
+
+- Share your progress as you move through each level
+- Ask questions whenever something is unclear
+- Request feedback and reviews on your documentation
+- Review and learn from other people's work
+- Build in public instead of waiting until things feel perfect
+
+You can engage with us by:
+
+- Opening an Issue in this repository to ask questions or request feedback
+- Submitting Pull Requests to improve resources or suggest additions
+- Sharing your capstone projects for review
+- Collaborating with other writers on documentation practice
+- Joining our [Slack community](https://writetechhub.org) to connect, ask questions, and get faster feedback from other writers
+
+Don't wait until you feel ready. Start early, share your work, and improve through feedback. That's how technical writers grow.
+
---
+
+**Contact**: [info@writetechhub.org](mailto:info@writetechhub.org)
+**Website**: [writetechhub.org](https://writetechhub.org)
+**Community**: [WriteTech Hub](https://writetechhub.org)
diff --git a/content/guides/advanced/index.md b/content/guides/advanced/index.md
new file mode 100644
index 00000000..43c7d1d0
--- /dev/null
+++ b/content/guides/advanced/index.md
@@ -0,0 +1,499 @@
+---
+title: "Advanced Resources"
+description: "Systems and scale-focused technical writing resources for programme-level documentation strategy, governance, and automation."
+summary: "Own documentation across entire products with content strategy, measurement, cross-functional influence, and AI governance."
+date: 2026-06-14T20:51:00+01:00
+lastmod: 2026-06-14T20:51:00+01:00
+type: guides
+draft: false
+weight: 400
+toc: true
+seo:
+ title: "Advanced Technical Writing Resources - WriteTech Hub"
+ description: "Master documentation programme strategy, governance, measurement, and AI systems at scale."
+ canonical: ""
+ robots: ""
+---
+
+This level is for writers who are already producing good documentation and want to work at a programme level. The skills here are not about writing more document types or using more sophisticated tools. They are about operating at a different scope: owning documentation across an entire product or system, making strategic decisions about what gets documented and how, and building processes that let a documentation programme function without depending on any single person.
+
+This means thinking about governance and standards, measuring whether your documentation is working, influencing the people and decisions that determine documentation quality upstream, and building tooling and automation that give you leverage.
+
+## 1. Content strategy and governance
+
+Most documentation problems are not writing problems. They are strategy problems because nobody defined what the documentation should cover, who is responsible for it, or what happens when it goes out of date. Content strategy is the work of answering those questions before they become problems.
+
+At the advanced level, you should be able to define and document a strategy for a documentation programme, not just contribute to one.
+
+### Core areas to develop
+
+**Scope and vision.** What does this documentation cover, for which readers, and what is explicitly out of scope? The out-of-scope question is as important as the in-scope one. Documentation that tries to cover everything covers nothing well.
+
+**Ownership.** Who is responsible for which content? What happens when an owner leaves or a product changes? A documentation programme without a clear ownership model accumulates orphaned pages.
+
+**Content standards and templates.** What does a good tutorial look like in this codebase? What fields does an API reference entry require? Templates reduce the decision load for contributors and make reviews faster.
+
+**Deprecation and versioning policy.** Old documentation does not disappear on its own. Define how outdated content is identified, marked, and removed. Define how documentation maps to product versions and what happens at a major release.
+
+### Resources
+
+- [WriteTech Accelerator Programme](https://writetechhub.org/accelerator-program/) is a project-based programme for writers ready to work on production-level documentation. Participants adopt docs-as-code workflows and build a portfolio of real documentation artefacts.
+- [Technical Content Marketing: A 7-Step Strategy](https://www.screendragon.com/blog/content-marketing-strategy-meaning-and-how-to-build-one/) explains how content strategy is applied in technical environments, including planning, structuring, and aligning documentation with user needs and product goals. It shows how strategy connects documentation to product communication at scale.
+- [Content Strategy: My simple (but complete) guide for 2026](https://technicalwriterhq.com/writing/technical-writing/single-source-authoring/) provides a practical breakdown of content strategy for technical writers, including planning, structuring documentation systems, and maintaining consistency across documentation sets. It is written specifically for documentation practitioners.
+- [Stages of Building a Technical Documentation Content Strategy for Tech Firms](https://paligo.net/blog/information-architecture/information-architecture-101-for-technical-writers/) explains how documentation teams evolve from ad-hoc writing to structured strategy, including planning stages, governance decisions, and scaling documentation systems.
+- [Content Strategy 101: Building a Foundation for Technical Documentation](https://document360.com/blog/information-architecture-for-technical-writing/) introduces the fundamentals of content strategy in technical documentation, focusing on structure, planning, and aligning documentation with user needs and business goals.
+- [Content Governance 101](https://www.figma.com/resource-library/what-is-information-architecture/) explains the core principles of governance, including ownership, workflow definition, review cycles, and content accountability in documentation systems.
+- [What Is a Content Governance System? A Guide](https://mockflow.com/blog/information-architecture-a-beginners-guide) breaks down how governance systems work in practice, including roles, rules, workflows, and enforcement mechanisms that ensure documentation stays accurate over time.
+- [Content Governance Best Practices](https://www.uxdt.nic.in/guidelines/ux-design-guidelines/navigation-and-information-architecture/) outlines practical approaches to managing content quality, including approval workflows, consistency enforcement, and long-term maintenance planning.
+
+### Practice
+
+Write a 2-3 page content strategy document for a documentation project of your choice. This can be based on a fictional or real system such as:
+
+- A task management app like Trello or Notion
+- A note-taking app like Notion, Obsidian, or Evernote
+- A cloud storage service like Google Drive or Dropbox
+
+Choose something simple enough that you can clearly define its users and documentation needs.
+
+Your content strategy document must include:
+
+- **Audience definition:** who the documentation is for (e.g. developers, end users, beginners, internal teams) and what each group needs
+- **Scope definition:** what the documentation will cover and what is explicitly out of scope
+- **Content ownership model:** who is responsible for creating, maintaining, and updating each part of the documentation
+- **Review and update process:** how content is reviewed, how often it is updated, and what triggers a review
+- **Deprecation policy:** how outdated content is identified, marked, and removed or archived
+
+Your document should feel like something a real documentation team could use to guide how they manage their content. It should clearly define decisions, responsibilities, and boundaries.
+
+## 2. Measurement
+
+Most documentation work is evaluated on the basis of volume, such as how many pages exist, how recently they were updated, and whether the backlog is shrinking. None of those things tells you whether the documentation is actually working. Building the habit of measuring documentation outcomes is one of the things that distinguishes a senior writer from a mid-level one.
+
+The challenge is that documentation quality is hard to measure directly. You are usually measuring proxies, and it takes discipline to choose proxies that are meaningful rather than easy.
+
+### Metrics worth thinking about
+
+- **Task completion rates:** Can readers do what they came to the documentation to do?
+- **Search success:** What are people searching for and not finding? What searches return no results?
+- **Support ticket content:** Are there recurring questions that documentation should already answer?
+- **Page engagement:** Are readers reaching the end of long pages, or leaving partway through?
+
+### Tools you can use to measure these metrics
+
+- **Google Analytics** is commonly used to track page views, user flow, bounce rates, and time on page. It helps you understand how users move through documentation.
+- **PostHog** provides product analytics that can be used to track user journeys, events, and interactions inside documentation portals or developer tools.
+- **Hotjar** allows you to see heatmaps and session recordings to understand where users scroll, click, or get stuck.
+- **GitBook Analytics** (or similar documentation platforms like ReadMe or Docusaurus plugins) can show page-level engagement, popular pages, and navigation patterns.
+- **Zendesk** or **HelpScout** can be used to analyze support tickets and identify recurring documentation-related questions.
+- **Sentry** (or similar error tracking tools) can indirectly support documentation measurement by showing where users encounter integration or usage errors that documentation should help prevent.
+
+### Practice
+
+Write a metrics plan for a documentation project. You may base your project on:
+
+- A SaaS product (e.g. Notion-style task manager, expense tracker, learning platform)
+- An API service (e.g. Stripe-like payments API or GitHub-style API)
+- A developer tool (e.g. CLI tool or deployment system)
+
+Your plan must include:
+
+- 3-5 metrics you will track
+- What each metric actually tells you about documentation quality
+- What each metric does not tell you (important for avoiding false conclusions)
+- How you would collect the data (which tools or systems you would use)
+- What a "meaningful improvement" would look like for each metric
+
+### Resources
+
+- [5 Metrics to Measure Documentation Quality](https://daily.dev/blog/5-metrics-to-measure-documentation-quality/) explains practical ways to evaluate documentation using real-world signals such as readability, usability, content quality, navigation, and customer satisfaction. It breaks down each metric with examples of how teams apply them in practice to understand whether documentation is actually helping users.
+- [Documentation Metrics: How to Measure Documentation Quality](https://idratherbewriting.com/learnapidoc/docapis_measuring_impact.html) explores how technical writers define meaningful documentation goals and choose metrics that actually reflect user success. It also highlights an important limitation of metrics: they show what happened, but not why it happened, which is why measurement must always be paired with user context and qualitative research.
+
+## 3. Cross-functional influence
+
+At the advanced level, the limiting factor for documentation quality is rarely the writing. It is the decisions made upstream, including unclear product requirements, engineering work that ships without a docs review, and feature changes that nobody told the documentation team about. The only way to address those problems is to be in the room where the decisions are made, or to have relationships with the people who are.
+
+### Things to work on
+
+**Get upstream.** Attend product planning and sprint review meetings. The main cost is time, but the benefit is significant. You catch documentation issues early, while they are still easy to fix, instead of discovering them after a feature has already shipped.
+
+It also gives you a voice in shaping the product itself. Instead of waiting for features to be handed over, you can flag potential user experience or clarity issues early and help resolve them before they are baked into the product.
+
+This shifts documentation work from being reactive to proactive, as you influence how the product and its communication are built from the start.
+
+**Agree on a definition of done.** Work with engineering to establish that documentation is part of the definition of done for a feature, not something that happens after.
+
+**Design reviews that get responses.** The reason most documentation reviews are slow is that reviewers do not know what they are being asked to do. A review request with a specific question ("Does this accurately describe the authentication flow?") gets a faster and more useful response than one that asks for general feedback.
+
+**Build relationships with support.** Support teams see documentation failures before anyone else does. A regular conversation with support about recurring questions is one of the most efficient ways to identify documentation gaps.
+
+### Resources
+
+- [Why Tech Writers Belong in Initial Product Dev Meetings](https://idratherbewriting.com/learnapidoc/docapis_measuring_impact.html) explains how early involvement reduces costs, increases efficiency, and enhances UX by aligning terminology and catching usability issues before they are baked into the product. It breaks down practical steps like inviting writers to kickoffs, sharing prototypes early, and positioning the writer as a user advocate who asks clarifying questions about navigation and transitions.
+- [Technical Writing in a Multi-Team Agile Environment](https://plane.so/blog/definition-of-done-dod-checklist-examples-for-agile-teams) provides practical guidance on which Agile meetings writers should attend, including sprint planning as essential, daily scrums two to three times per week, and retrospectives for senior writers. It includes a checklist of what to accomplish in scrums to make attendance productive rather than passive.
+- [What is the Definition of Done (DoD) in Agile?](https://plane.so/blog/definition-of-done-dod-checklist-examples-for-agile-teams) explains how the DoD is a shared checklist for when work is truly complete, created collaboratively by the whole team and reviewed quarterly. It shows why documentation updates should be a non-negotiable criterion and how framing it as a shared quality standard makes it more likely to be followed consistently.
+- [Definition of done (DoD): Checklist examples for Agile teams](https://plane.so/blog/definition-of-done-dod-checklist-examples-for-agile-teams) shows how documentation updates fit into story-level, sprint-level, and release-level definitions of done. It emphasizes that unfinished docs create support tickets, delay releases, and force rework, making the case for including documentation as a core completion criterion.
+- [How to manage cross-functional teams effectively](https://plane.so/blog/how-to-manage-cross-functional-teams-effectively) provides a practical system for managing cross-functional collaboration, including aligning on a single shared outcome, defining roles and decision rights, establishing clear communication norms, and running lightweight execution cadences. It emphasizes planning with dependencies and capacity in mind, and managing blockers as first-class work items rather than side conversations. For documentation leaders, this translates to treating content alignment across teams as a project with its own goals, owners, and metrics.
+
+## 4. Information architecture at scale
+
+Information architecture at the intermediate level is about structuring a single documentation site well. At the advanced level, it is about structuring documentation systems: multiple products, multiple audiences, multiple versions, potentially multiple languages, all of which need to feel coherent to a reader who may only ever see one corner of the whole system.
+
+### Core concepts to develop
+
+**Multi-product ecosystems.** How do shared concepts, shared navigation, and shared terminology work across a family of products? What is centralised and what lives with the individual product?
+
+**Taxonomies and metadata.** Tagging content consistently makes it possible to surface the right documentation in search, filter by audience or product version, and reuse content across contexts. This requires defining the taxonomy before you start tagging, not after.
+
+**Content modelling.** Before writing, define what content types exist and what fields each type requires. A content model for an API reference entry might require: endpoint, method, description, parameters, authentication, example request, example response, and error codes. Defining this upfront makes both writing and review faster.
+
+**Localisation readiness.** If there is any chance your documentation will be translated, the time to structure it for translation is before you write it, not after. Avoid embedded text in images, cultural references that do not translate, and sentence structures that break under translation.
+
+### Practice
+
+Choose an existing documentation site that has grown over time and now feels inconsistent, duplicated, or difficult to navigate. This could be a small open-source project or a well-known product with public documentation.
+
+Good starting examples include:
+
+- [Mautic documentation](https://docs.mautic.org/)
+- [Wagtail CMS documentation](https://docs.wagtail.org/)
+- [CHAOSS documentation](https://chaoss.community/kb-metrics-and-metrics-models/)
+- [Flask documentation](https://flask.palletsprojects.com/)
+- [GitHub Docs](https://docs.github.com/) (only focus on one section, not the entire site)
+
+Your task is to redesign its information architecture, as if you were joining the documentation team and improving the structure for scale.
+
+You should produce:
+
+- **A before-and-after sitemap:** Show how the documentation is currently structured, then how you would restructure it. This should make it clear what you moved, merged, split, or removed.
+- **Defined content types:** Identify the types of documentation you would enforce in the structure (for example: tutorials, how-to guides, reference, explanations). Explain where each type belongs and why.
+- **Rationale for your decisions:** Explain the reasoning behind your restructuring. Focus on user needs, navigation clarity, duplication issues, and content clarity rather than aesthetics.
+- **Localisation considerations:** Identify at least three issues in the existing documentation that would make translation or localisation difficult. These could include:
+ - Unclear or inconsistent terminology across pages
+ - Mixed content types within a single page (e.g., tutorial + reference together)
+ - Culturally specific examples that do not translate well
+ - Inconsistent UI labels or product terms
+ - Duplicated content that would increase translation cost and inconsistency
+
+Then briefly explain how your redesign would reduce or solve these issues.
+
+### Resources
+
+- [How to structure your documentation's information architecture (IA)](https://paligo.net/blog/information-architecture/information-architecture-101-for-technical-writers/) provides a practical framework for mapping product portfolios, brands, product areas, and endpoints to create a coherent IA. It breaks down the process into exercises that help teams identify friction points, mock up structures, and iterate based on usability testing, making it especially useful for teams managing multiple products or platforms.
+- [Best Practices for Metadata Tagging](https://www.figma.com/resource-library/what-is-information-architecture/) outlines how to establish a clear metadata strategy, create controlled vocabularies, and implement taxonomies or ontologies that organize terms into structured hierarchies. It emphasizes that metadata should be treated as a strategic initiative rather than an afterthought, with human-supervised automation and regular audits to maintain quality over time.
+- [Scalable Content Taxonomy for Technical Documentation](https://technicalwritingmp.com/docs/information-Architecture/) focuses specifically on documentation taxonomies, explaining how to audit existing content for redundant categories, define essential categories based on user needs rather than org charts, and enforce taxonomy compliance at scale using automated scanning and scoring against defined standards.
+- [Content Modeling for Technical Writing: Definition, Importance, Creating](https://document360.com/blog/information-architecture-for-technical-writing/) applies content modeling specifically to technical writing, showing how to create taxonomies of content types and establish relationships between them. It demonstrates how a single content model can be reused across different products or contexts, saving time and ensuring consistency.
+- [Best Practices for Writing Content for Localization](https://translators-usa.com/software-localization-best-practices/) covers how to provide context to translators through code comments, glossaries, and style guides, and why giving translators access to the software or reference material like wireframes and mockups improves translation quality. It emphasizes proofreading source content before translation, since errors in the source propagate across all language versions.
+- [Best practices in software localization: A practical guide for 2026](https://translators-usa.com/software-localization-best-practices/) explains the foundational technical practice of separating application logic from language content using translation keys, designing key architecture deliberately with meaningful hierarchies, and building RTL support from the beginning using CSS logical properties. It also covers why context quality is directly tied to translation quality and how providing screenshots, character limits, and descriptions reduces rework.
+
+## 5. Using AI in senior-level technical writing
+
+At the advanced level, AI is not a writing assistant. It is a strategic capability that requires governance, infrastructure, and risk management. You design the systems that make AI scalable and safe across teams, not just use AI tools for your own drafts.
+
+### What you should own at this level
+
+#### 1. Agentic AI and multi-step workflows
+
+Design AI systems that can complete complex documentation tasks through reasoning and action loops. This includes ReAct (Reason + Act) patterns, where AI systems iterate through thought → action → observation to complete tasks grounded in real systems.
+
+For example, design an agent that:
+
+- Reads a code repository and identifies changed endpoints
+- Updates API documentation based on those changes
+- Opens a pull request for human review
+- Flags any changes that need SME verification
+
+The agent does not replace the writer. It automates the routine parts of the workflow so writers can focus on judgment and quality.
+
+#### 2. Prompt systems and governance
+
+Build enterprise prompt frameworks that teams can rely on. This includes:
+
+- **Reusable prompt libraries:** versioned, tested prompts for common documentation tasks (release notes, API reference entries, troubleshooting guides, onboarding content)
+- **Prompt evaluation datasets:** collections of test inputs and expected outputs that let you measure whether a prompt change improves or degrades results
+- **A/B testing for prompts:** running variants against each other to find which produces more accurate, consistent output
+- **Prompt review workflows:** treating prompt changes like code changes, with pull requests, review, and rollback capability
+
+A prompt library at this level is a team asset with documentation, ownership, and maintenance processes.
+
+#### 3. Retrieval-Augmented Generation (RAG) for documentation
+
+Design systems where AI retrieves information from your documentation corpus before generating responses. This ensures AI-generated answers are grounded in your actual content, not generic training data.
+
+Key design decisions you will own:
+
+- **Chunking strategy:** how to break documentation into retrievable units. Each chunk should be self-contained and answer a specific question. Too large and retrieval misses detail; too small and context is lost.
+- **Embedding models:** selecting models that understand technical vocabulary and code. Standard models may miss API-specific terminology or confuse similar-sounding endpoints.
+- **Vector database and indexing:** how content is stored, updated, and queried. When documentation changes, the index must update without breaking existing queries.
+- **Source attribution:** ensuring AI responses can point back to specific documentation pages, not just general knowledge. Users must be able to verify what the AI told them.
+- **Hybrid search:** combining semantic search (what the user meant) with keyword search (exact terms like API endpoint names) for better retrieval accuracy.
+
+#### 4. Quality and risk management for AI-assisted docs
+
+Establish the systems that catch AI failures before they reach readers. This includes:
+
+- **Regression tests for AI output:** automated tests that run AI-generated content through the same checks as human-written content (Vale linting, link validation, code sample testing)
+- **Evaluation datasets:** curated sets of questions and expected answers that you run against your AI system regularly to detect drift or degradation
+- **Release gates:** defining what must pass before AI-assisted documentation can be published. This might include human review for certain content types, automated checks for others, and SME sign-off for API reference changes.
+- **Escalation paths:** when AI produces incorrect or harmful content, who is notified, how is it corrected, and how is the system improved to prevent recurrence
+- **Responsible AI guidelines:** team-level policies on what AI can be used for, what data can be fed into AI tools, and what review is required for different risk levels
+
+### What you can use AI for at this level
+
+- Automate documentation updates from code changes: design pipelines that detect API changes, generate updated reference docs, and flag human reviewers for verification
+- Build intelligent search and chat systems: create RAG-based systems that answer user questions using your documentation corpus, with source attribution and confidence scoring
+- Generate and maintain documentation at scale: design systems that produce first drafts for large product surfaces, with human review gates for accuracy and tone
+- Analyse documentation effectiveness: use AI to process support tickets, identify documentation gaps, and prioritise content investments based on actual user pain points
+- Dynamic content personalisation: implement systems that adjust tone, depth, and examples based on the reader's role without maintaining separate document versions
+- Content migration and restructuring: use AI to assist with large-scale documentation migrations, identifying content relationships, suggesting new structures, and flagging content that needs human review
+
+### What you should not rely on AI for at this level
+
+- **Final accountability for accuracy:** AI systems fail. You own the escalation path, the remediation, and the communication when they do.
+- **Strategic decisions about what to document:** AI can suggest, but only humans can prioritise based on business context, user needs, and product direction.
+- **Ethical and compliance judgments:** AI does not understand regulatory requirements, cultural sensitivity, or organisational risk appetite. You do.
+- **Governance and policy decisions:** who can use AI, for what purposes, with what review, these are human decisions that require understanding of organisational context, legal constraints, and team capacity.
+
+### Practice
+
+Design an AI-assisted documentation system for a hypothetical product. Your deliverable should include:
+
+1. A system architecture diagram showing how AI fits into the documentation workflow, from content creation to publication to reader-facing search/chat
+2. A prompt library with 5 reusable prompts for common documentation tasks, versioned and tested, with evaluation notes for each
+3. A RAG configuration showing how documentation content is chunked, embedded, and retrieved, with specific decisions on chunk size, embedding model, and update frequency
+4. A quality assurance plan with evaluation criteria, test cases, and escalation procedures for when AI output fails
+5. A governance document defining who can use AI, for what purposes, with what review requirements, and what data must never be fed into AI tools
+
+### Resources
+
+- [Prompt Engineering Guide](https://www.promptingguide.ai/): Advanced techniques for designing, testing, and deploying prompt systems at scale. Covers chain-of-thought, ReAct, self-consistency, and prompt versioning. Essential for building enterprise prompt libraries.
+- [Building RAG Applications with LangChain](https://python.langchain.com/docs/tutorials/rag/): A practical course on building retrieval-augmented generation systems for documentation and knowledge bases. Covers chunking, embeddings, vector stores, and evaluation.
+- [AI Risk Management Framework](https://www.nist.gov/itl/ai-risk-management-framework): The US National Institute of Standards and Technology framework for managing AI risks, including governance, measurement, and mitigation. Essential for designing responsible AI systems in documentation.
+- [Responsible AI Practices](https://ai.google/responsibility/responsible-ai-practices/): Google's operational guidance on building AI systems responsibly, including fairness, transparency, accountability, and privacy. Useful for establishing team-level AI ethics standards.
+
+## 6. Tooling and automation
+
+At the advanced level, tooling is not about knowing which tools exist. It is about building systems that maintain documentation quality at scale without requiring constant manual oversight. The goal is leverage, meaning the ability to maintain a high-quality documentation programme without headcount growing in proportion to content volume.
+
+### 1. Continuous Integration pipelines for documentation
+
+A documentation continuous integration (CI) pipeline should run on every pull request and include at minimum:
+
+- Documentation build checks (to ensure the site compiles successfully)
+- Broken link checks (to prevent navigation failures)
+- Prose linting using Vale (style, tone, and consistency rules)
+- Spell checking
+
+Optionally, you can add:
+
+- Terminology enforcement for product-specific language
+- Link validation across versioned docs
+- Markdown or structure validation rules
+
+All CI rules and checks should be documented in `CONTRIBUTING.md` so contributors understand what is being enforced and why.
+
+### 2. Platform and documentation lifecycle management
+
+Beyond individual pull requests, documentation systems often break at the platform level, especially during migrations or upgrades.
+
+Common migrations include moving between tools like Hugo, MkDocs, Docusaurus, or GitBook.
+
+Before starting a migration, you should clearly define:
+
+- What problems exist in the current system (scalability, usability, maintenance, etc.)
+- What the new platform improves
+- How content will be migrated and validated
+- How long the transition period will last
+- Who owns content cleanup during and after migration
+
+### 3. API documentation automation
+
+Some documentation can be generated automatically, especially API reference material.
+
+Tools like OpenAPI and Swagger allow documentation to be generated directly from API specifications, keeping reference material aligned with code automatically.
+
+However, automation has clear limits:
+
+- It can generate accurate reference content
+- It cannot replace guides, tutorials, explanations, or examples
+- It does not understand user intent or learning flow
+
+At this level, your job is to decide what should be automated and what must remain human-written, and to design a workflow where both coexist.
+
+### Resources
+
+- [Prose Linting with Vale (Meilisearch)](https://blog.meilisearch.com/prose-linting-with-vale/) is a practical walkthrough for setting Vale up in a CI pipeline.
+- [Elastic Vale Rules on GitHub](https://github.com/elastic/vale-rules) is an open-sourced example of a large organisation's full Vale configuration, useful as a reference when building your own.
+- [Documenting APIs: A Guide for Technical Writers](https://idratherbewriting.com/learnapidoc/) covers OpenAPI and Swagger in the context of a broader API documentation workflow.
+- [Docs Linting Guide](https://www.writethedocs.org/guide/tools/testing/) explains how documentation linting applies the same engineering rigor to prose that code linters apply to software, catching broken links, style violations, and terminology issues before deployment. It breaks down how Vale scans prose for voice, wording, and structure, and how integrating these checks into CI/CD pipelines prevents documentation errors from reaching production.
+- [4 Steps for a Successful Content Migration Project](https://3di-info.com/tips-for-content-migration/) breaks down the post-migration review process into peer review, AI-powered proofreading, and final output checks. It explains how to verify that migrated content adheres to requirements, that table of contents layouts and pagination function correctly, and that build logs show no warnings or errors that need attention.
+- [Run code migrations (OpenAI Codex)](https://openai.com/index/introducing-codex/) offers an advanced framework for controlled migrations, applicable to documentation platform transitions. It recommends inventorying legacy assumptions, mapping old systems to new ones, proposing incremental migration plans with compatibility layers, and running validation after each milestone rather than waiting for a full cutover. This approach of working in checkpoints with explicit parity tests applies directly to documentation tooling migrations.
+- [OpenAPI Specification Guide: Structure Implementation & Best Practices](https://swagger.io/resources/open-api/) explains the benefits of OpenAPI for automated documentation and code generation, including standardized machine-readable formats, automatic generation of client SDKs and server stubs, and simplified testing through mock servers. It emphasizes maintaining a single source of truth and using continuous integration to validate specs against actual API behaviour.
+- [Best Practices - OpenAPI Documentation](https://www.openapis.org/) from the OpenAPI Initiative provides authoritative guidance on keeping OpenAPI descriptions as first-class source files, making them available to users for client generation, and using design-first approaches to prevent issues before development begins. It notes that there is seldom need to write OpenAPI descriptions by hand, since editors, domain-specific languages, and code annotations can generate them automatically.
+
+## 7. Documentation specialisations
+
+Advanced writers often develop depth in one or two areas while maintaining broad enough coverage to contribute across a documentation programme. The areas below are the most common specialisations for senior writers.
+
+**API documentation** involves writing complete API references with endpoint descriptions, parameter tables, authentication flows, and tested code examples. It requires close collaboration with engineers to keep documentation accurate as the API evolves, and familiarity with OpenAPI/Swagger tooling.
+
+**User documentation** focuses on guides, FAQs, onboarding materials, and help centre content for non-technical or mixed audiences. The emphasis is task-based writing: give readers the shortest path to completing what they came to do.
+
+**Product documentation** covers feature descriptions, changelogs, and release notes. It requires staying in sync with product releases and maintaining close relationships with product managers to capture decisions and intent accurately.
+
+**Developer documentation** includes SDK guides, architecture overviews, setup instructions, and tutorials for developers onboarding to a platform. It requires enough technical depth to explain system behaviour accurately, and enough clarity to serve developers who are new to the platform.
+
+**Long-form and whitepaper content** covers in-depth technical explanations, research summaries, and strategic documents. The skills here overlap with technical writing but extend into document architecture, argument structure, and editorial judgement for long-form work.
+
+## 8. Video tutorials (WriteTech Hub)
+
+The sessions below are from the WriteTech Accelerator Program. They cover CI/CD, automated linting, AI and ML documentation, infrastructure documentation, DevOps, and Web3. The "relates to" column points to the section above that each video supports.
+
+| Relates to | # | Video | Duration |
+|:---|:---|:---|:---|
+| General review | 1 | WriteTech Accelerator Program Onboarding | 47:02 |
+| Section 1: Content strategy | 2 | Week 3, Session 1: Introduction to CI/CD for Technical Writers | 1:40:53 |
+| Section 5: Tooling | 3 | Week 3, Session 2: Introduction to Automated Linters | 1:56:07 |
+| Section 5: Tooling | 4 | Week 3, Session 3: Automated Linters for API Documentation | 1:49:20 |
+| Section 5: Tooling | 5 | Week 3, Session 4: Documentation Workflows and AI Integration | 1:13:29 |
+| Section 6: Specialisations | 6 | Week 4, Session 1: Documenting AI/ML Systems | 1:07:52 |
+| Section 5: Tooling | 7 | Week 4, Session 2: Using AI Tools in Your Documentation Workflow | 1:04:55 |
+| General review | 8 | Week 5: Ask Me Anything and Feedback, Weeks 1 to 4 | 2:01:37 |
+| Section 5: Tooling | 9 | Week 5, Session 1: Docs in the DevOps Ecosystem | 1:46:50 |
+| Section 6: Developer docs | 10 | Week 5, Session 2: Infrastructure Docs and YAML/Terraform Annotations | 2:01:50 |
+| Section 6: Developer docs | 11 | Week 5, Session 3: Getting Started with Terraform for Technical Writers | 1:38:23 |
+| Section 7: Real-world ownership | 12 | Week 6, Session 1: Open Source DevOps Docs Audit | 1:25:34 |
+| Section 6: Specialisations | 13 | Week 7, Session 2: Web3 Docs in Practice | 1:17:40 |
+| Section 3: Cross-functional influence | 14 | DevOps and Technical Writing | 1:11:39 |
+
+Watch the onboarding session first, then follow the CI/CD and linting cluster (sessions 2 to 5) alongside section 5. The DevOps and infrastructure sessions (9 to 12) work best once you are comfortable with tooling. The AI/ML and Web3 sessions (6 to 7, 13) are domain-specific deep dives for when you are exploring a particular specialisation.
+
+## 9. Ownership and community contribution
+
+At the advanced level, you are no longer only contributing documentation inside a system. You are responsible for how documentation systems behave over time, how they scale across teams, and how they stay aligned with the product and the wider organisation.
+
+This includes technical writing work, but also system design, coordination, and long-term maintenance across people, processes, and content types.
+
+The focus moves from "writing documentation" to owning documentation as an evolving product.
+
+### Things worth aiming for
+
+#### 1. Lead documentation end-to-end
+
+Take ownership of documentation from early planning through to publication and iteration. This includes structuring content, aligning with engineering and product teams, and ensuring documentation stays current after release.
+
+#### 2. Redesign documentation systems
+
+Work on documentation that has outgrown its original structure and redesign its information architecture, workflows, and content types so it scales better for users, contributors, and translators.
+
+#### 3. Define and maintain documentation standards
+
+Create and maintain documentation guidelines, templates, and review workflows for a team or organisation. This includes aligning documentation with:
+
+- Product and engineering workflows
+- Support and customer success needs
+- Marketing or external communication content
+- Internal training and onboarding materials
+
+#### 4. Define documentation standards, templates, and review workflows for a team, and maintain them over time
+
+At the senior and staff levels, documentation work shifts from individual contribution to system design. You are no longer only writing documentation; you are building the infrastructure that allows a team, or multiple teams, to produce consistent, high-quality documentation at scale. This includes creating standards that align with product and engineering workflows, designing templates that reduce cognitive load for contributors, establishing review workflows that catch issues without creating bottlenecks, and ensuring that marketing content, support materials, internal training, and external documentation all speak with the same voice. The goal is not control for its own sake, but clarity: when everyone understands how documentation is structured, reviewed, and maintained, the quality of the entire ecosystem improves without requiring constant intervention.
+
+### Things to work on
+
+**Build a documentation governance framework.** A governance framework is not a style guide alone. It is the set of policies, roles, and processes that determine how documentation is created, reviewed, published, and retired across the organization. This includes defining who owns which docs, how content is classified and tagged, what the review cadence looks like, and how standards are enforced. At the enterprise level, governance models typically fall into three categories: centralized (a single team sets all policies), federated (domain teams manage their own docs within enterprise-wide standards), or hybrid (centralized policy-setting with federated execution). The right model depends on your organization's size, regulatory environment, and need for agility. What matters most is that the framework is documented, communicated, and regularly reviewed, rather than existing as an unwritten assumption.
+
+**Design templates that encode standards.** A good template does more than provide a heading structure. It encodes the content model for a given document type: what information is required, what is optional, and in what order it should appear. For an API reference entry, this might mean mandating endpoint, method, description, parameters, authentication, example request, example response, and error codes. For a troubleshooting guide, it might mean symptoms, cause, solution, and prevention. Templates should be paired with writing standards that cover voice, tone, terminology, and accessibility, and they should be stored where contributors can find them easily.
+
+**Establish review workflows that separate concerns.** A single "please review this doc" request is inefficient because it dumps multiple types of feedback onto a single reviewer. A better approach is to design a workflow with distinct stages: a technical review for accuracy, an editorial review for clarity and tone, and a final check for formatting and compliance. Each stage should have clear owners and criteria. For example, the technical review might be owned by the engineering lead who wrote the feature, while the editorial review is owned by a senior writer or editor. This separation prevents reviewers from being overwhelmed and ensures that each type of feedback gets the attention it deserves.
+
+**Align documentation with cross-functional content types.** Documentation does not exist in isolation. Marketing content, support articles, in-product UI text, training materials, and sales enablement docs all contribute to the user experience, and when they contradict each other, user trust erodes. At the senior level, part of your role is to map these content types, identify ownership, and establish shared terminology and style standards across teams. This might mean creating a cross-functional content council, running alignment workshops, or simply maintaining a shared glossary that all teams reference. The goal is to ensure that a user who reads a marketing white paper, then a support article, then the API docs, encounters consistent terminology, tone, and structure.
+
+**Build training and onboarding into the system.** Standards and templates are only useful if people know they exist and understand how to use them. This means creating onboarding materials for new writers and contributors, running regular training sessions on style and process, and making it easy to ask questions without fear of judgment. For engineering teams who contribute docs, this might mean a 30-minute workshop on how to use the templates and what the review process looks like. For junior writers, it might mean a structured mentorship program where they shadow a senior writer through a full documentation lifecycle. The investment in training pays off in reduced review cycles and higher-quality first drafts.
+
+**Maintain standards over time through iteration.** Documentation standards are not set-and-forget artifacts. They should be reviewed quarterly or biannually, with input from the teams who use them. Metrics like review cycle time, number of style violations caught in CI, and contributor satisfaction can tell you whether your standards are helping or hindering. If a template is consistently ignored, it may be too rigid. If a style rule is constantly debated, it may be unclear. The senior writer's job is to treat the documentation system as a product: iterate based on feedback, measure impact, and communicate changes clearly when they happen.
+
+### 5. Publishing and knowledge sharing
+
+Ownership also extends beyond your immediate team and into the wider documentation and technical communication community. This can involve publishing technical analyses or case studies based on real documentation work, where you reflect on decisions, systems, and outcomes rather than just the final output.
+
+It also includes sharing documentation patterns, workflows, and systems that others can learn from or adapt in their own work. In some cases, this takes the form of contributing templates, frameworks, or tooling improvements back into open-source projects.
+
+At this stage, speaking at documentation, developer, or technical writing events becomes another way of sharing practical experience, especially when it is grounded in real systems you have worked on. Mentoring beginner and intermediate writers is also a natural extension of this work, helping them develop not just writing ability but an understanding of how documentation functions in real organisations.
+
+### Resources
+
+- [Enterprise Data Governance: Frameworks and Workflows for Scale](https://www.figma.com/resource-library/what-is-information-architecture/) explains how enterprise governance programs are structured across centralized, federated, and hybrid models, and how to assess organizational readiness across six dimensions: data culture, strategic readiness, governance strategy, people and roles, processes, and technology. It breaks down how to establish governance structures with clear roles and how to define policies for classification, access control, quality standards, and retention.
+- [Template Standardization: Definition, Examples & Best Practices](https://mockflow.com/blog/information-architecture-a-beginners-guide) provides documentation use cases for template standardization, including knowledge base articles and process documentation.
+- [What a Senior Technical Writer ACTUALLY Does](https://technicalwriterhq.com/writing/technical-writing/single-source-authoring/) explains how senior writers build documentation standards, taxonomy, and workflows, including review processes that separate technical accuracy checks from clarity editing. It notes that without standards and taxonomy, docs turn into a maze, and that senior writers are expected to manage ambiguity by asking targeted questions, building draft structures, and pulling stakeholders into alignment rather than waiting for perfect information.
+- [Technical Writing Management](https://www.projectmanager.com/blog/6-tips-developing-cross-functional-teams) defines the responsibilities of a technical writing manager, including hiring and supporting a world-class team, balancing assignments across the team to prevent over-resourcing, helping writers refine skills through editorial feedback, and defining processes that align with product and engineering goals.
+- [Technical Writing Manager: Definition, Responsibilities, Job Description](https://plane.so/blog/how-to-manage-cross-functional-teams-effectively) explains how a technical writing manager acts as both a communication manager and a technical documentation manager. It breaks down how this role involves hiring high-caliber writers, knowing each employee's strengths and weaknesses, distributing assignments based on individual characteristics and workload, and aligning team effort with company strategy.
+- [Document workflow management: A practical guide](https://plane.so/blog/definition-of-done-dod-checklist-examples-for-agile-teams) explains how to monitor document workflows using metrics like processing time, approval speed, and retrieval time, and how to optimize using templates and automated checks.
+- [Data Governance Policy Template & Guide](https://www.figma.com/resource-library/what-is-information-architecture/) offers a complete governance policy template that can be adapted for documentation standards, covering purpose, scope, governance roles and responsibilities, classification, quality requirements, training and awareness, and review cadence. It demonstrates how to structure policy documents so they are actionable and maintainable over time.
+- [Tools for Collaborating in Technical Writing Teams](https://www.projectmanager.com/blog/6-tips-developing-cross-functional-teams) outlines how to improve collaboration beyond tools alone by establishing clear roles, creating shared style guides, adopting version control systems, centralizing communication channels, and making feedback a normalized part of the process. It emphasizes encouraging early edits and reviews rather than late-stage revisions, and having clear guidelines for revision cycles to prevent endless review loops.
+
+## 10. Career paths and staying current
+
+Senior technical writers move into a range of roles as they develop. Common directions include:
+
+- Documentation Engineer
+- Developer Advocate
+- API or Platform Documentation Specialist
+- Editorial Lead or Documentation Manager
+- Documentation Strategist or Information Architect
+
+[WriteTech Newsletter](https://writetechhub.org) covers technical writing job opportunities, community updates, and industry developments. It is particularly useful if you are actively looking for roles or tracking how the field is changing.
+
+## Capstone deliverable: Docs Programme Pack
+
+The capstone for this level is not a single document. It is a documentation programme proposal built from an existing system, similar to what a technical writer would do when joining a team, auditing existing documentation, or being asked to improve a live system.
+
+You are expected to work with an actual documentation source. This can be one of the following or any source of your choice:
+
+- An open-source project (for example Mautic, Wagtail, or Flask), or
+- A product with public documentation (for example Notion, OpenWeather API docs)
+
+Your goal is to evaluate, restructure, and design improvements based on what already exists.
+
+Your Docs Programme Pack should include:
+
+1. **Content strategy (two to three pages):** Based on the existing documentation, define the intended audience, scope boundaries, ownership model, content standards, and deprecation policy. Your decisions must reflect what the system actually contains today, not what you assume it should contain.
+
+2. **Governance model:** Define how documentation is created, reviewed, and maintained within the context of the existing project. This includes roles, review workflows, contribution guidelines, and how issues are handled when documentation breaks, becomes outdated, or is missed in the release process. Your model should feel realistic for the size and structure of the system you selected.
+
+3. **Information architecture proposal:** Produce a redesigned sitemap based on the current structure of the documentation you chose. Include a definition of the content types currently present (or missing but needed), and explain your structural decisions using evidence from the existing documentation, such as duplication, unclear navigation, or inconsistent page goals.
+
+4. **Metrics plan:** Define what you would measure if you were responsible for improving this documentation in production. Your metrics must be tied to real user behaviour you can reasonably infer from the system (for example search gaps, navigation issues, or support questions), not abstract assumptions. Explain how each metric would be collected and what improvement would look like in practice.
+
+5. **Automation plan:** Describe how you would introduce or improve automation in the existing documentation workflow. This should include CI checks (such as build validation, link checking, and linting with Vale), template improvements, and any API or reference automation already available in the system (such as OpenAPI-generated docs, if applicable). Your plan should reflect what is realistically possible within the current constraints.
+
+### What this is testing
+
+This capstone is designed to reflect what technical writers actually do in real teams. You are evaluating existing systems, identifying gaps, and designing improvements that fit real constraints such as tooling, team structure, and product maturity.
+
+Strong submissions will show that you can work with imperfect systems, make structured decisions based on evidence, and design documentation programmes that could realistically be handed to an engineering or product manager for implementation.
+
+### Important constraint
+
+This work should clearly reflect analysis of an existing documentation system, not AI-generated content for a fictional product. The quality of your submission will depend on how well you interpret real documentation, identify problems, and justify your design decisions using evidence from what already exists.
+
+### Submission format
+
+Your Docs Programme Pack should be submitted as a public GitHub repository.
+
+The repository should be structured like a real documentation project, not a single document dump. Each part of the capstone should be clearly separated into its own file so that someone reviewing your work can understand your thinking step by step.
+
+At minimum, your repository should include a `README.md` that explains:
+
+- The documentation system or project you selected
+- What part of the documentation you analysed (for example full docs, a section, or a feature area)
+- How to navigate your submission
+- Any assumptions or limitations you worked with
+
+Each component of the Docs Programme Pack should be written in Markdown files, for example separate files for content strategy, governance model, information architecture, metrics plan, and automation plan.
+
+Your information architecture should include a visual or structured sitemap. This can be written in Markdown using nested lists or diagrams using tools like Mermaid if you are comfortable with them.
+
+You are encouraged to use a docs-as-code workflow for this project. This means your work should include versioned commits, and optionally pull requests if you want to simulate a real team environment. You should also include a basic `CONTRIBUTING.md` if you are treating the repository as a maintained documentation project.
+
+Finally, your submission should be shared for feedback. You should post it in the [WriteTech Hub community](https://writetechhub.org/our-community/) and, where possible, request a review from another writer or mentor.
diff --git a/content/guides/beginner/index.md b/content/guides/beginner/index.md
new file mode 100644
index 00000000..7a764bc0
--- /dev/null
+++ b/content/guides/beginner/index.md
@@ -0,0 +1,235 @@
+---
+title: "Beginner Resources"
+description: "Foundational technical writing resources for beginners covering clear writing, document types, style guides, and working with subject matter experts."
+summary: "Learn the fundamentals of technical writing: clear communication, Diataxis framework, style guides, SME collaboration, and responsible AI use."
+date: 2026-06-14T20:51:00+01:00
+lastmod: 2026-06-14T20:51:00+01:00
+type: guides
+draft: false
+weight: 200
+toc: true
+seo:
+ title: "Beginner Technical Writing Resources - WriteTech Hub"
+ description: "Start your technical writing journey with foundational skills, practice exercises, and capstone deliverables."
+ canonical: ""
+ robots: ""
+---
+
+This level is for people who are new to technical writing or are still trying to understand what the role actually involves. The goal here is not to read everything available on the subject. It is to build enough of a foundation that you can sit down and write something useful for a reader.
+
+You will cover four areas in this order: *writing clearly, understanding document types, applying a style guide, and working with the people who have the information you need*. Each section has resources and a practice exercise. Do not skip the practice.
+
+## 1. What is technical writing?
+
+Before learning how to write technical documentation, it helps to understand what technical writing actually is, what technical writers do day to day, and how the role has evolved.
+
+Technical writing is the practice of creating documentation that helps people use, understand, or make decisions about technical products and systems. That includes software guides, API references, tutorials, help centres, release notes, and more. The people reading this documentation are usually developers, engineers, end users, or internal teams, each with different levels of technical knowledge and different goals.
+
+The [Knowledge Academy's article on "What Is Technical Writing? Types, Examples and Benefits"](https://www.theknowledgeacademy.com/blog/what-is-technical-writing/) provides more detail into what technical writing covers.
+
+In 2026, however, the role has expanded. Technical writers are no longer only the people who write manuals and guides after a product is finished. Many now work directly with product teams, take part in planning, review content earlier in the development process, and work alongside AI tools that make writing faster and more efficient.
+
+The [ADOC Studio guide, "Technical Writing: A Comprehensive Guide (2026)"](https://www.adoc-studio.app/blog/technical-writing-guide), provides a look at how technical writing is evolving in modern workflows and what the role looks like today in practice.
+
+## 2. Writing clearly
+
+The first thing to sort out is the difference between writing that sounds good and writing that communicates clearly. Technical writing is not about impressive vocabulary or formal tone. It is about helping a specific reader do or understand something specific. Everything else is secondary.
+
+Before you move further, get comfortable with these ideas:
+
+- Write for one reader, not a general audience
+- Use plain language and active voice
+- Structure content so readers can scan it, not just read it linearly
+- Use examples to show what you mean, not to fill space
+
+### Resources
+
+1. **[Google Technical Writing One](https://developers.google.com/tech-writing/one/)** and **[Google Technical Writing Two](https://developers.google.com/tech-writing/two/)** are free online courses from Google that cover the fundamentals: clear sentences, useful structure, audience awareness, and editing. Take them in order. Course Two builds directly on what Course One teaches.
+
+2. **[Getting Started in Technical Writing](https://github.com/Bennykillua/Getting-started-in-Technical-Writing)** (e-book) is a practical introduction to the field written for people starting from scratch. It explains what technical writers actually do and how to approach your first documentation project.
+
+3. **[Getting Started in Technical Writing: A Beginner's Guide](https://github.com/Bennykillua/Getting-started-in-Technical-Writing)** covers audience considerations and structured writing in a format you can work through at your own pace.
+
+4. **[TechnicalWritingMP](https://technicalwritingmp.com/)** has beginner-level courses on documentation fundamentals, basic API concepts, and markup languages.
+
+### Practice
+
+Find a feature from an app you use regularly. It does not need to be complicated. Document it in three ways:
+
+- A how-to guide
+- A quick-reference section with a table of the feature's key settings, controls, or options and their functions
+- A brief explanation of how the feature works and why it behaves the way it does
+
+You can use any familiar app feature, for example posting on Instagram, creating a Google Doc, organizing a Notion page, or composing an email in Gmail.
+
+## 3. Document types and structure
+
+Most beginner documentation problems come down to the same mistake: mixing content types in a single document. A tutorial that becomes a reference page halfway through. A how-to guide that stops to explain background theory. These are different types of content serving different reader needs, and combining them makes all of them worse.
+
+The [Diataxis framework](https://diataxis.fr/), developed by Daniele Procida, gives you a practical model for separating them. It identifies four types of documentation:
+
+**Tutorials** are for learning. The reader is new and needs to be led through a hands-on experience. Your job is to ensure they succeed, not to be comprehensive.
+
+**How-to guides** are for doing. The reader already knows what they want to accomplish. Your job is to give them the clearest path to that goal.
+
+**Reference** is for looking things up. The reader needs accurate, consistent information in a predictable structure. Your job is not to explain or teach, but to be complete and precise.
+
+**Explanation** is for understanding. The reader wants context, background, or the reasoning behind a decision. Your job is to give them a mental model, not instructions.
+
+### Resource
+
+The [Diataxis framework](https://diataxis.fr/) is the primary reference. It is short, well-written, and used by documentation teams at Cloudflare, Django, Gatsby, and others. Read it once to understand the model, then come back to it as you write.
+
+### Practice
+
+Pick a documentation page from a tool you use. Work out which Diataxis type it is supposed to be. If it mixes types (most do), identify where the mixing happens and rewrite one section so it fits cleanly into a single type.
+
+If you are not sure where to start, choose any familiar product or platform. This could be tools like GitHub, Notion, or any app you use regularly.
+
+## 4. Style guides
+
+A style guide is a set of agreed-upon rules for how your documentation is written: what words to use, how to format UI elements, whether to use active or passive voice, and how to write headings. Its main job is consistency. Consistent documentation is easier to read, easier to maintain, and easier to trust.
+
+You do not need to write a full style guide at this stage. You need to understand what style guides do, be able to follow one when your organisation has it, and know where to start when it does not.
+
+### Resource
+
+The [Google Developer Documentation Style Guide](https://developers.google.com/style) is the most widely used free style guide in technical writing. Use it as your working default. When you join a team or project that has its own guide, follow that instead.
+
+Other widely used style guides in the industry include the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/), which is commonly used for product documentation in enterprise and software environments, and the [Apple Style Guide](https://support.apple.com/en-us/guide/applestyleguide/welcome/web), which is used for consumer-facing documentation across Apple platforms. Some teams also maintain internal style guides that adapt these standards to their own products and workflows.
+
+### Practice
+
+Write a one-page mini style guide for a fictional product. Include at minimum:
+
+- Voice and tone
+- Capitalization rules for UI elements
+- Your preferred terms for common actions (for example, "select" rather than "click" or "press")
+- Your heading style
+
+This is a legitimate portfolio piece and a useful reference to return to as you develop your own documentation habits.
+
+## 5. Working with subject matter experts
+
+Technical writers rarely have full knowledge of what they are documenting. Most of what goes into a document comes from engineers, product managers, designers, or other specialists. The skill here is not knowing everything. It is knowing how to get the right information from the people who do.
+
+This is something most beginners underestimate. A poorly prepared conversation with an SME produces vague, incomplete information that is hard to turn into documentation. A well-prepared one gives you enough to write a first draft and ask the right follow-up questions.
+
+A few things to keep in mind:
+
+- **Prepare before you talk.** Read whatever already exists, like code comments, Slack conversations, internal tickets, and old documentation. Come with specific questions based on gaps in what you know.
+- **Bring a draft.** Even a rough, incomplete draft changes the dynamic of a review. It is much easier for an expert to say "this is wrong" or "you missed something here" than to explain a system from scratch to someone with a blank page.
+- **Ask for examples and edge cases.** The happy path is usually well-understood. What breaks it, and what happens when it does, is often where the most useful documentation lives.
+- **Follow up in writing.** After a conversation, send a summary of what you understood. It is faster for the expert to correct a written summary than to have another meeting, and it creates a record you can refer to later.
+
+## 6. Using AI in entry-level technical writing
+
+AI is now part of modern technical writing workflows, but it only becomes useful once you understand the basics of gathering and structuring information yourself. If you cannot interpret information from real systems or people, AI will not fix that gap. It will only help you produce incorrect content faster.
+
+At this stage, AI should be treated as a support tool that helps you think more clearly, structure your ideas, and refine your writing. It works alongside your process, not instead of it.
+
+A common concern for beginners is whether AI will make technical writers obsolete. The short answer is no. AI is a tool in the technical writer's toolbox, not a replacement for the role. What AI cannot do is verify facts against real systems, understand the nuance of your product's audience, or decide what information is truly relevant to your readers. Those decisions require human judgment.
+
+As Ihuoma Anosike argues in her article, ["Is AI Really Going to Replace Technical Writers?"](https://writerstable.in/ai-in-technical-writing-guide/is-ai-really-going-to-replace-technical-writers/), AI excels at generating drafts, restructuring content, and speeding up repetitive tasks. But it still needs a technical writer to guide it, validate its output, and ensure the documentation serves real users. The writers who thrive are the ones who learn to use AI as a force multiplier for their own skills, not as a substitute for them.
+
+### What you should learn at this level
+
+#### 1. Basic prompt engineering
+
+The quality of what AI gives you depends on the quality of what you ask. Learn to write clear, specific prompts that include:
+
+- **Role:** who the AI is acting as (e.g., "You are a technical writer creating API documentation for developers")
+- **Audience:** who the reader is and what they need to do
+- **Output format:** what the result should look like (e.g., "3 sentences, definition + example use case")
+- **Constraints:** tone, length, or style rules to follow
+
+Start with zero-shot prompting for simple tasks, and use few-shot prompting when you need a specific format or tone by providing one or two examples in the prompt.
+
+**Zero-shot prompting** means you ask the AI to perform a task without giving it any examples of what the output should look like. You describe the task and let the model figure out the format based on its training.
+
+**Few-shot prompting** means you provide one or more examples of the desired input-output pattern before asking the AI to complete a new, similar task. The "few" typically means 1 to 5 examples.
+
+#### 2. AI output review and validation
+
+You must be able to detect problems in AI-generated content before it reaches readers. Check for:
+
+- **Hallucinations:** facts, commands, or examples that do not exist in the actual system
+- **Tone drift:** language that is too formal, too casual, or does not match your style guide
+- **Missing context:** steps or warnings that AI omitted because it was not in the prompt
+- **Factual errors:** technical details that contradict source material or SME input
+
+Always validate AI output against real documentation, code, or SME conversations. Never publish AI-generated content without reviewing it.
+
+#### 3. Safe and approved tool use
+
+Use only AI tools approved by your organisation. Follow your team's disclosure and privacy policies. Do not paste proprietary code, internal credentials, or confidential product plans into public AI tools. When in doubt, ask your manager or security team before using a new AI tool.
+
+### What you can use AI for at this level
+
+- Turn rough notes into structured drafts: paste your SME interview notes or research findings and ask AI to organise them into a logical outline or first draft
+- Explore different ways of explaining the same idea: ask AI to rewrite a paragraph in three different styles and choose the one that fits your audience
+- Rewrite content for simplicity and readability: ask AI to simplify complex sentences, convert passive voice to active voice, or shorten a paragraph
+- Help you compare multiple versions of the same explanation: ask AI to evaluate two drafts against your style guide and suggest which is clearer
+- Generate examples and edge cases: describe a feature and ask AI to suggest realistic usage examples, but verify them against the actual system before including them
+
+### What you should not rely on AI for at this level
+
+- Deciding what is true or accurate about a product: AI does not have access to your internal systems unless you give it specific, verified information
+- Replacing SME conversations: AI cannot replace the context and nuance that comes from talking to the people who built the product
+- Writing final drafts without review: every piece of AI-assisted content must be checked for accuracy, tone, and completeness before publication
+
+A useful way to think about it is this: AI can help you write faster, but it cannot always decide what is true, or what is relevant to your work. The responsibility for accuracy always falls on you.
+
+### Resources
+
+- [Prompt Engineering for Technical Writers](https://writerstable.in/ai-in-technical-writing-guide/prompt-engineering-for-technical-writers/): A practical introduction to writing effective prompts for documentation tasks. Covers zero-shot and few-shot prompting, role-based instructions, and how to structure prompts for consistent, useful output.
+- [AI in Technical Writing: Complete Guide for 2026](https://instrktiv.com/en/ai-in-technical-writing/) by Ferry Vermeulen: A comprehensive guide covering AI workflows for technical writers, including initial draft generation, documentation restructuring, API documentation drafting, and release notes. Includes reusable prompts for user manuals, API endpoints, consistency checks, and troubleshooting.
+- [AI for Technical Writers for Better Documentation](https://technicalwritingmp.com/): A paid course designed specifically for technical writers integrating AI tools into their workflow.
+
+### Practice
+
+Take one of your earlier exercises from this guide, such as the how-to guide, quick-reference section, or explanation you wrote for a familiar app feature. Use AI to:
+
+- Generate a first draft from your rough notes or bullet points
+- Review the AI draft for hallucinations, tone drift, and missing context
+- Rewrite the prompt to fix any problems you found, then regenerate
+- Compare the final AI-assisted version with your original manual draft
+- Decide which version is stronger and explain why in one paragraph
+
+Document your prompt, the AI output, and your review notes. This is a portfolio piece that shows you can use AI responsibly and critically, not just generate content.
+
+## 7. Further reading
+
+These are supplementary articles for when you want more context on the field. Read them when you have time:
+
+- [Hackmamba Technical Writing Hub](https://hackmamba.io/)
+- [Writerstable.in](https://writerstable.in/)
+- [Introduction to Technical Writing](https://www.coursera.org/learn/technical-writing-introduction)
+- [Technical Writing 101: Definition, Examples, and How to Become One](https://www.indeed.com/career-advice/careers/what-is-technical-writing)
+- [What Is Technical Writing? Definition, Examples and Steps](https://www.indeed.com/career-advice/careers/what-is-technical-writing)
+- [What Is Technical Writing: An All-inclusive Guide](https://www.geeksforgeeks.org/technical-writing/)
+
+## Ask the community
+
+Once you have a sense of the field, introduce yourself in the [WriteTech Hub community](https://writetechhub.org/our-community/). You can also:
+
+- Share your background and why you are learning technical writing
+- Share your completed tasks for a review
+- Share what confuses you most right now about technical writing
+
+## Capstone deliverable
+
+Before moving to the Intermediate level, produce a small documentation set for a tool or process you know well. This could be tools such as Google Docs, Notion, GitHub, or Gmail. It should include:
+
+- One tutorial
+- Two how-to guides
+- One reference page
+- One troubleshooting section
+
+Each piece should be a clean example of its Diataxis type. The set should read as a coherent documentation project, not four unrelated pages.
+
+If you use AI during this process, your final documentation should show your understanding of the system, not just AI-generated fluency.
+
+What matters is how clearly and consistently you structure the documentation across different content types.
+
+This is your evidence that you understand the fundamentals and can produce documentation across different content types. When you can complete it without hesitating, you are ready for Intermediate Resources.
diff --git a/content/guides/getting-started/_index.md b/content/guides/getting-started/_index.md
deleted file mode 100644
index de0dafe1..00000000
--- a/content/guides/getting-started/_index.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Getting Started"
-description: ""
-summary: ""
-date: 2023-09-07T16:06:50+02:00
-lastmod: 2023-09-07T16:06:50+02:00
-draft: false
-weight: 800
-toc: true
-seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
----
-
-test
diff --git a/content/guides/getting-started/example.md b/content/guides/getting-started/example.md
deleted file mode 100644
index 483c160b..00000000
--- a/content/guides/getting-started/example.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-title: "Example Guide"
-description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
-summary: ""
-date: 2023-09-07T16:04:48+02:00
-lastmod: 2023-09-07T16:04:48+02:00
-draft: false
-weight: 810
-toc: true
-seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
----
-
-Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-
-## Further reading
-
-- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework
diff --git a/content/guides/intermediate/index.md b/content/guides/intermediate/index.md
new file mode 100644
index 00000000..103b252f
--- /dev/null
+++ b/content/guides/intermediate/index.md
@@ -0,0 +1,473 @@
+---
+title: "Intermediate Resources"
+description: "Intermediate technical writing resources covering information architecture, docs-as-code, API documentation, quality systems, and AI-assisted workflows."
+summary: "Develop reliable skills in information architecture, docs-as-code, API documentation, quality systems, and responsible AI use for technical writers."
+date: 2026-06-14T20:52:00+01:00
+lastmod: 2026-06-14T20:52:00+01:00
+type: guides
+draft: false
+weight: 300
+toc: true
+seo:
+ title: "Intermediate Technical Writing Resources - WriteTech Hub"
+ description: "Build portfolio-ready skills in information architecture, docs-as-code, API documentation, and quality systems for technical writers."
+ canonical: ""
+ robots: ""
+---
+
+This level is for writers who understand the basics and are ready to create documentation used in active projects and collaborative environments. The focus moves from learning concepts to developing reliable skills and a portfolio that demonstrates them.
+
+There are four skill areas to work through: information architecture, docs-as-code, API documentation, and quality systems. They build on each other, so working through them in order is worth it, but if your current project makes one more urgent, start there.
+
+## 1. Information architecture
+
+Before writing anything, you need to think about how the content is organised and why that organisation matters. Information architecture is the practice of organising and structuring documentation so that readers can find what they need without going through unrelated content or guessing where information might be. It sounds obvious, but most documentation problems are actually architecture problems in disguise. The content exists; it is just in the wrong place, split across the wrong pages, or buried under an unhelpful structure.
+
+At this level, learn to think about your documentation at the structural level before thinking about individual pages or sentences.
+
+### Core concepts to get comfortable with
+
+- **Docs hierarchy:** which pages exist, how they relate, what level of detail belongs where
+- **Page goals:** every page should have one job. If a page is trying to do two things, split it.
+- **Progressive disclosure:** give readers what they need for their immediate task, with paths to deeper information when they want it
+- **Naming and headings:** names should say what a thing is, not what you wish it were
+- **Cross-linking:** link to related content deliberately, not as a reflex
+- **Avoiding duplication:** when the same information exists in two places, both versions go out of date
+- **Content reuse and single sourcing:** avoid maintaining the same information in multiple places. Reuse content where possible and establish a single source of truth for information that appears across guides, references, and release notes
+
+### Resources
+
+- [The 5 Principles of Single Sourcing](https://paligo.net/blog/single-sourcing/the-5-principles-of-single-sourcing/) explains how to create a single source of truth for information and avoid the maintenance problems that occur when the same content is copied into multiple locations.
+- [Single Sourcing in Technical Writing](https://www.archbee.com/blog/single-sourcing-in-technical-writing) provides a practical introduction to single sourcing, including when to use it, how it improves consistency, and the trade-offs involved.
+- [Unlock the Power of Content Reuse in Technical Documentation](https://www.madcapsoftware.com/products/flare/single-sourcing.aspx) explores strategies for reusing content effectively while keeping documentation accurate, maintainable, and scalable.
+- [Information Architecture for Technical Writing](https://paligo.net/blog/information-architecture/information-architecture-101-for-technical-writers/) covers documentation hierarchy, navigation, content organization, labeling, and findability from a technical writing perspective.
+- [The Difference Between Information Architecture and Navigation](https://www.uxdt.nic.in/guidelines/ux-design-guidelines/navigation-and-information-architecture/) is a foundational article that helps you think about structure and navigation as separate but related concerns.
+- [What Information Architecture Is and How I Use It to Improve User Experience](https://mockflow.com/blog/information-architecture-a-beginners-guide) explains information architecture from the perspective of a practicing technical writer and connects it to documentation outcomes.
+
+### Practice
+
+Find an open-source project whose documentation has grown over time and is now slightly inconsistent or hard to navigate. Your task is to redesign its information architecture.
+
+You should produce:
+
+- A before-and-after sitemap and write a short rationale explaining your decisions.
+- What did you move, what did you merge, what did you cut, and why?
+
+If you are not sure where to start, you can choose from well-known open-source projects such as:
+
+- [GitHub Docs](https://docs.github.com/) ([Documentation](https://docs.github.com/), [GitHub repository](https://github.com/github/docs))
+- [Mautic](https://docs.mautic.org/) ([Documentation](https://docs.mautic.org/), [GitHub repository](https://github.com/mautic/mautic))
+- [Wagtail](https://docs.wagtail.org/) ([Documentation](https://docs.wagtail.org/), [GitHub repository](https://github.com/wagtail/wagtail))
+- [CHAOSS](https://chaoss.community/kb-metrics-and-metrics-models/) ([Documentation](https://chaoss.community/kb-metrics-and-metrics-models/), [GitHub repository](https://github.com/chaoss))
+- [Flask](https://flask.palletsprojects.com/) ([Documentation](https://flask.palletsprojects.com/), [GitHub repository](https://github.com/pallets/flask))
+
+This is a strong portfolio piece because it demonstrates structural thinking, not just writing ability.
+
+## 2. Docs-as-code
+
+Docs-as-code means managing documentation with the same tools and workflows used for software, like version control, branches, pull requests, issue tracking, and automated checks. It is the standard workflow for developer-facing documentation teams, and being comfortable with it is a practical requirement for most technical writing roles. You need to know how the workflow works and be able to operate within it.
+
+### Core concepts
+
+- Learn how to use Git for tasks like cloning a repo, creating a branch, committing changes, pushing, and opening a pull request
+- Pull request reviews as a quality gate, not just a formality
+- Using issues as a documentation backlog
+- Writing in Markdown, and understanding when rST or AsciiDoc might be used instead
+- Release notes and versioning: how documentation tracks product changes
+
+### Resources
+
+[Write the Docs: Docs as Code](https://www.writethedocs.org/guide/docs-as-code/) is the community's primary reference for this workflow. Start there.
+
+[A Technical Writer's Introduction to Docs as Code](https://www.writethedocs.org/guide/docs-as-code/) is a practical walkthrough covering the four components of a docs-as-code setup: version control, static site generator, CI/CD pipeline, and hosting.
+
+### Video tutorials
+
+The following sessions from the WriteTech Accelerator Program cover docs-as-code and Docusaurus in a practical, hands-on format. Watch sessions 1 and 2 alongside this section, and sessions 3 through 7 when you are ready to work with Docusaurus.
+
+| # | Video | Duration |
+|:---|:---|:---|
+| 1 | [Week 1, Session 1: Docs-as-Code in the Real World](https://www.youtube.com/watch?v=6xmj_ynoW8w&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=20) | 1:31:32 |
+| 2 | [Week 1, Session 2: Setting Up and Customizing Docusaurus](https://www.youtube.com/watch?v=exlr31Jc_fY&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=19) | 1:53:09 |
+| 3 | [Portfolio Project Setup and Docusaurus Practical Session](https://www.youtube.com/watch?v=4suE8xPaLHE&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=18) | 1:59:19 |
+
+### Communities
+
+Connecting with other writers is one of the most practical things you can do at this stage. These communities have active members who discuss tooling, workflows, and real documentation problems.
+
+As you work through this level, share what you are building with us in the [WriteTech Hub community](https://writetechhub.org/our-community/). Post your documentation experiments, ask for reviews on your pull requests, share what you are struggling with, and learn from how others are solving similar problems.
+
+You can also engage with broader communities to expand your perspective and see how other writers and teams approach their work:
+
+- [Hackmamba Community](https://hackmamba.io/community/)
+- [Write the Docs Community](https://www.writethedocs.org/)
+
+### Practice
+
+Set up a GitHub repository that demonstrates a basic docs-as-code workflow using a static documentation site.
+
+You are expected to follow the Docusaurus setup shown in the video tutorials for this section. However, if you prefer, you may use another static site generator such as MkDocs or Hugo, as long as your documentation is structured and published locally or online.
+
+Your documentation site should include a simple structure such as:
+
+- A home page or introduction
+- A getting-started page
+- An installation or setup guide
+- A troubleshooting page
+
+In the same repository, add a CONTRIBUTING.md file explaining how someone should contribute to the documentation.
+
+If you are not sure what to document, you can choose a simple setup such as:
+
+- Setup instructions for a development environment (Python, Node.js, Git, etc.)
+- A personal project (for example, a to-do app or portfolio website)
+- A simple open-source starter project (for example, Flask, FastAPI, or Express boilerplate)
+
+Once your repository is ready:
+
+- Make a documentation change through a pull request
+- Review it yourself after a day, or ask someone else to review it
+- Share the repository or pull request in the [WriteTech Hub community](https://writetechhub.org) for feedback
+- Then merge the pull request after applying feedback
+
+The goal is to complete the full docs-as-code workflow at least once: set up → write → commit → pull request → review → revise → merge → publish.
+
+## 3. API documentation
+
+API documentation is consistently one of the most in-demand specialisations in technical writing. You do not need to be a developer to do it well, but you do need to understand what an API does, how it communicates, and what information a developer needs to actually use it.
+
+Start by learning to read an API before you try to document one.
+
+### Core concepts
+
+- The difference between an API reference and an API guide, and why a developer needs both
+- Requests and responses: endpoints, parameters, headers, authentication, status codes
+- Error patterns: what breaks, why it breaks, and what the developer should do about it
+- OpenAPI and Swagger: what they are, what they generate, and what they cannot replace
+
+### Resources
+
+- [Documenting APIs: A Guide for Technical Writers](https://idratherbewriting.com/learnapidoc/) by Tom Johnson is the most widely used free course for this topic. It is hands-on: you learn by making actual API calls with Postman and curl, reading real responses, and writing documentation based on what you find. Work through it in full.
+
+- The [WriteTech Mentorship Pod](https://writetechhub.org) is a small-group mentorship programme for intermediate writers who want feedback on their work and accountability as they develop their skills. Join the community to participate.
+
+### Video Tutorials
+
+| # | Video | Duration |
+|:---|:---|:---|
+| 1 | [API Documentation 101: Best Practices for Writing Clear and Useful API Docs](https://www.youtube.com/watch?v=Gpq6wW9QrPU&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=10) | 1:09:54 |
+| 2 | [Week 2, Session 1: Understanding and Testing APIs](https://www.youtube.com/watch?v=9O-jK-OHggQ&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=17) | 2:09:36 |
+| 3 | [Week 2, Session 2: Writing API Docs and Working with OpenAPI](https://www.youtube.com/watch?v=5OKP5V2wiC4&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=16) | 2:02:15 |
+| 4 | [Documenting and Building with the Chimoney API](https://www.youtube.com/watch?v=64tWtTOSGbk&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=15) | 1:01:41 |
+
+### Practice
+
+Document three endpoints from a public API. Good options include APIs with clear documentation and simple authentication or no authentication.
+
+For each endpoint, you should test at least one working request.
+
+You can choose from APIs such as:
+
+- [GitHub API](https://docs.github.com/en/rest) (for example: user data, repositories, commits)
+- [OpenWeatherMap API](https://openweathermap.org/api) (for example: current weather, forecast)
+- [JSONPlaceholder](https://jsonplaceholder.typicode.com/) (fake REST API for testing; no authentication required)
+- [ReqRes API](https://reqres.in/) (simple user and authentication simulation API)
+- [NASA API](https://api.nasa.gov/) (for example: astronomy picture of the day)
+- [Open-Meteo API](https://open-meteo.com/) (weather API with no API key required)
+- Any other public API with clear documentation and testable endpoints
+
+For each endpoint, you should have a working example you tested yourself. Across the three endpoints, produce:
+
+- A quickstart guide that gets a reader to their first successful request in under ten minutes
+- An authentication guide (if required by the API)
+- An errors and troubleshooting section
+- Reference entries for each endpoint
+
+## 4. Quality and review systems
+
+Good documentation does not come from a careful writer working alone. It comes from a system that consistently catches problems before they reach readers.
+
+At the intermediate level, you should start thinking less about "writing a document" and more about "designing a process that produces reliable documentation." This means moving from relying on final reviews to building quality into your workflow from the start.
+
+### Defining what "done" means
+
+Before any documentation is considered complete, there should be a clear definition of what "good" looks like. This prevents quality from depending on memory, personal standards, or last-minute attention.
+
+A simple way to enforce this is through editorial checklists. Before publishing any document, you should be able to confirm:
+
+- Does this serve the reader's goal?
+- Is the structure correct for the content type?
+- Has it been reviewed by at least one other person?
+- Are all code samples tested and accurate?
+
+A checklist ensures these questions are asked consistently across every piece of documentation, not just when you remember to ask them.
+
+### Automating quality checks
+
+As documentation scales, manual review alone is not enough. You need systems that can enforce consistency automatically.
+
+This is where tools like [Vale](https://vale.sh/) come in. Vale is a command-line prose linter. You configure it with rules based on a style guide (Google, Microsoft, or your own), and it flags violations automatically” like passive voice, inconsistent terminology, heading capitalisation issues, and more.
+
+It can run locally as you write and also in CI pipelines like GitHub Actions, ensuring every pull request is checked before it is merged.
+
+### Resources
+
+- [Vale documentation](https://vale.sh/docs/) covers installation, configuration, and writing custom rules.
+- [Prose Linting with Vale (Meilisearch)](https://blog.meilisearch.com/prose-linting-with-vale/) is a practical walkthrough of setting Vale up for a real documentation project, from defining a style to running checks in CI.
+- [How Datadog Uses Vale](https://www.datadoghq.com/blog/engineering/how-we-use-vale-at-datadog/) shows how a large documentation team uses Vale in production, including their approach to custom rules.
+
+### Practice
+
+Add Vale to one of your documentation repositories. Configure it with at least ten custom rules relevant to a style guide you define. Set it up to run as a GitHub Actions check on every pull request. Fix the violations it surfaces. Document your Vale configuration in the project's CONTRIBUTING.md so anyone else working in the repo knows it exists and how it works.
+
+## 5. Using AI in intermediate-level technical writing
+
+At the intermediate level, AI tools are practical time-savers. Most documentation teams are already using them. The question is not whether to use them but how to use them without compromising accuracy or quality.
+
+### What you should learn at this level
+
+#### 1. Advanced prompting techniques
+
+Move beyond basic prompts to systematic approaches that produce consistent, reliable output across multiple documentation tasks. Learn to use:
+
+- **Few-shot prompting with reusable templates:** build a library of prompt templates for common documentation tasks that include 2-3 examples of the desired output format
+- **Chain-of-thought prompting:** for complex explanations, ask the AI to work through its reasoning step by step before giving the final answer. This produces more accurate technical explanations and helps you spot where the AI's logic diverges from reality
+- **Prompt chaining:** break multi-step documentation tasks into a sequence of prompts where each step feeds into the next. For example: research notes → structured outline → first draft → style review → final edit
+
+**Prompt chaining example:**
+
+> **Step 1:** "Generate research notes on [topic] from the attached spec."
+>
+> **Step 2:** "Create a detailed outline for a user guide using these notes."
+>
+> **Step 3:** "Write the first section based on this outline, targeting intermediate users."
+>
+> **Step 4:** "Review this draft for technical accuracy against the source spec."
+
+Each step uses the output from the previous step as its input. This is more reliable than asking for a complete draft in a single prompt because it gives you review points between steps.
+
+#### 2. Reusable prompt libraries and workflows
+
+Build a personal or team library of prompts that you can reuse across projects. Each prompt should be:
+
+- Tested and validated against real output
+- Versioned so you can track what changed when results shift
+- Documented with notes on when it works well and when it fails
+- Shared with teammates so quality is consistent across the team
+
+Integrate AI tools into your document workflows and CI/CD pipelines. For example:
+
+- Run AI consistency checks as part of your pull request review process
+- Use AI to generate release notes from commit logs automatically, with human review as a gate
+- Set up pre-commit hooks that flag style guide violations using AI-assisted linting alongside Vale
+
+#### 3. AI-assisted editing and quality control
+
+Use AI to enforce consistency at scale, not just to draft content. At this level, you should be able to:
+
+- Check terminology consistency across a large document set by asking AI to identify terms used inconsistently
+- Validate that AI-generated content matches your style guide by running it through the same checks you use for human-written content
+- Compare multiple versions of the same explanation and evaluate which is clearer for your audience
+- Identify gaps in documentation by asking AI to review a draft against a checklist of required topics
+
+#### 4. Content architecture for retrieval systems
+
+Design documentation content so it works well with AI retrieval systems like RAG (Retrieval-Augmented Generation) and chatbots. This means:
+
+- **Semantic chunking:** break content into self-contained units that answer specific questions, rather than long pages that cover many topics. Each chunk should make sense on its own
+- **Structured metadata:** add clear headings, labels, and tags that help retrieval systems understand what each chunk contains and who it is for
+- **Clear boundaries:** separate tutorials from reference from explanation so AI systems retrieve the right type of content for the right query
+- **Source attribution:** design content so AI-generated responses can point back to specific documentation pages, not just general knowledge
+
+This is forward-looking work. Even if your team does not use RAG yet, designing content this way makes it more useful for both human readers and AI systems.
+
+### What you can use AI for at this level
+
+- Generate first drafts from rough notes or SME input: paste interview notes, Slack threads, or ticket comments and ask AI to organise them into a structured draft, then rewrite for accuracy and structure
+- Produce release notes from commit logs or product notes: feed a changelog into AI and ask for a structured release notes draft, then verify each item against the actual release
+- Check terminology consistency across a large document set: ask AI to scan multiple files and flag where the same concept is described with different terms
+- Restructure or simplify dense technical content: give AI a complex technical explanation and ask it to reorganise using the Diataxis framework or simplify for a less technical audience
+- Write first-pass translations for review: use AI to produce initial translations, then have a native speaker review and correct
+- Build editing checklists and verification workflows: use AI to generate checklists for specific document types, then validate them against your team's actual review process
+- Automate routine quality checks: use AI alongside Vale to flag style inconsistencies, passive voice, or unclear headings across your entire documentation site
+
+### What you should be careful about
+
+AI tools produce confident output that is sometimes factually wrong. At the intermediate level, every AI-generated or AI-assisted draft needs to be validated against the actual product or system before it goes anywhere near a reader. The speed gained in drafting is often spent in review, which is why developing strong editing and validation habits matters.
+
+Specific risks at this level:
+
+- **Inconsistent output across sessions:** the same prompt may produce different results on different days. Document what works and test prompts regularly
+- **Scope creep in AI drafts:** AI may add explanations, examples, or steps that were not in your source material. Always compare AI output against your SME input
+- **False confidence in AI editing:** AI may "correct" technically accurate but unusual phrasing into something more generic but wrong. Never accept AI suggestions without understanding why
+
+### Resources
+
+- [AI in Technical Writing: Complete Guide for 2026 (INSTRKTIV)](https://instrktiv.com/en/ai-in-technical-writing/) covers workflows, effective prompting, data handling, and quality control in AI-assisted documentation. Includes reusable prompts for user manuals, API endpoints, consistency checks, and troubleshooting.
+- [AI in Technical Writing: A Complete Guide for 2026](https://www.adoc-studio.app/blog/technical-writing-guide) covers workflows, effective prompting, data handling, and quality control in AI-assisted documentation.
+- [Week 4, Session 2: Using AI Tools in Your Documentation Workflow](https://www.youtube.com/watch?v=IoOtk7Ad3X8&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=8) from the WriteTech Accelerator Program covers this in a practical, applied format.
+- [Week 3, Session 4: Documentation Workflows and AI Integration](https://www.youtube.com/watch?v=iqcjz8WMriE&list=PLVlM6pemXydq-Cqv7gVB_z3sryrA2CzsU&index=11) covers how AI fits into broader documentation workflows.
+
+### Practice
+
+Pick a documentation task you have already completed manually in this guide” such as the API endpoint documentation, the Vale configuration, or the information architecture redesign. Use AI to:
+
+1. Generate a first draft from your existing notes or source material
+2. Apply prompt chaining: break the task into steps (research → outline → draft → edit) and use a separate prompt for each step
+3. Review the AI output for consistency, accuracy, and tone against your style guide
+4. Build a reusable prompt template for this task type, tested and documented with notes on what works
+5. Share your prompt template with a peer and compare results
+
+Document your prompt library, the AI output at each stage, and your review notes. This is a portfolio piece that shows you can build repeatable AI workflows, not just generate one-off drafts.
+
+### Additional Practice
+
+Pick a simple technical topic you are already familiar with. This could be something like:
+
+- How to create a GitHub repository
+- How to install a tool (e.g., Python, Node.js, VS Code)
+- How to connect to Wi-Fi on a device
+- How to set up a basic Notion page or Google Doc structure
+- How to use a feature in an app you already use regularly
+
+Write a short explanation of the process (just a few sentences or rough notes).
+
+Then use an AI tool to:
+
+- Turn your notes into a step-by-step how-to guide
+- Rewrite it for a complete beginner who knows nothing about the tool
+- Generate a clean, structured version with headings and formatting
+
+After that, review the AI output and check:
+
+- Is anything incorrect or exaggerated?
+- Did the AI assume steps that don't exist or skip important ones?
+- Is the order of steps actually usable in real life?
+- Would someone be able to follow it without confusion?
+
+Finally, rewrite the final version yourself so it is accurate and usable.
+
+Compare:
+
+- How quickly you produced a usable draft with AI
+- How much correction was needed
+- And whether the AI made your writing clearer or introduced mistakes
+
+## 6. Tools overview
+
+You do not need to master all of these before moving to the next level. Get familiar with the categories and learn the specific tools as your projects require them.
+
+### Version control
+
+[Git](https://git-scm.com/) and [GitHub](https://github.com/) are the standard. [GitLab](https://about.gitlab.com/) and [Bitbucket](https://bitbucket.org/product) are used in some organisations. Knowing Git at a basic level is a prerequisite for most documentation roles.
+
+### Documentation site generators
+
+[MkDocs](https://www.mkdocs.org/), [Hugo](https://gohugo.io/), and [Docusaurus](https://docusaurus.io/) are the most common tools for turning Markdown files into published documentation sites. Docusaurus is covered in the video tutorials above.
+
+### Writing tools
+
+[VS Code](https://code.visualstudio.com/) with a Markdown preview extension, [Typora](https://typora.io/), or [Obsidian](https://obsidian.md/) for writing and editing. [Google Docs](https://workspace.google.com/products/docs/) or [Microsoft Word](https://word.cloud.microsoft/) for collaborative draft review.
+
+### Visual tools
+
+[Miro](https://miro.com/), [Lucidchart](https://www.lucidchart.com/pages), [Adobe](https://www.adobe.com/ng/creativecloud/illustration.html), [Canva](https://www.canva.com/), [draw.io](http://draw.io), or similar for diagrams and illustrations when you cannot get them from the engineering team.
+
+Follow the [WriteTech Tool Review Series](https://writetechhub.org) for coverage of new and updated tools as they become relevant.
+
+## 7. Portfolio projects
+
+At this level, the goal is to have real work to show. Potential employers and collaborators want to see the documentation you produced, not a description of documentation you could produce. Every project below gives you something concrete.
+
+| Project | What to do | Where to publish |
+|:---|:---|:---|
+| Technical blog posts | Write about a tool you use, a documentation workflow, or a concept you found difficult to understand. Teaching something is the fastest way to find gaps in your own knowledge. | [WriteTech Hub guest posting](https://writetechhub.org/guest-post-guideline/), [WriteTech Hub blog](https://writetechhub.org/blog/), [Hashnode](https://hashnode.com/), [Medium](https://medium.com/), [Dev.to](https://dev.to/) |
+| README improvements | Find an open-source project with a weak README and rewrite it. Open a pull request. Getting it merged is a public contribution; even if it is not merged, the before-and-after is a portfolio piece. | Example repos: [Flask](https://github.com/pallets/flask), [Requests](https://github.com/psf/requests), [Docusaurus](https://github.com/facebook/docusaurus) |
+| Open-source documentation | Search GitHub for issues labelled "documentation" or "help wanted." Pick something specific and submit a pull request. | GitHub |
+| Outreachy | Seasonal programmes like Outreachy offer structured open-source contribution with mentorship. | [Outreachy](https://www.outreachy.org/) |
+| Mock project documentation | Choose a tool or workflow you know well and write complete documentation for it from scratch. Apply everything from this level: clean IA, docs-as-code workflow, Vale in CI. | Your own GitHub |
+| Writing challenges | Join a structured writing challenge to practise producing documentation under time constraints. | [Write-a-Thon](https://github.com/WriteTech-Hub/wth-write-a-thon) and similar events |
+
+## Capstone deliverable
+
+Before moving to the Advanced level, build a complete portfolio-ready documentation project. In your capstone project, you may use AI to support drafting, restructuring, or editing your documentation. However, your final submission should clearly reflect your understanding of the system you are documenting.
+
+If AI was used in your workflow, it should improve clarity and speed, not replace your reasoning or judgment.
+
+This is a single end-to-end documentation project. You will design and build it from scratch, applying information architecture, API documentation, docs-as-code practices, and quality systems in one coherent project.
+
+You are expected to treat this like a real documentation project that could exist in a production environment.
+
+### What you will build
+
+Your project must be a documentation site hosted in a GitHub repository using a static site generator (Docusaurus is recommended, but you may use any static site generator).
+
+Your documentation system must include:
+
+- A clear information architecture showing how the documentation is structured and navigated
+- At least one complete API or technical guide, including a quickstart, authentication (if required), and error handling
+- A docs-as-code workflow using GitHub (branches, pull requests, and review process)
+- Vale integrated into the repository to enforce documentation quality checks in CI
+- At least one diagram or visual that helps explain the system (architecture, flow, or process)
+
+### Suggested project ideas
+
+If you are unsure what to document, choose something simple but realistic, such as:
+
+#### 1. A complete fictional SaaS product documentation site
+
+You will create a documentation site for a fictional software product such as a task manager, expense tracker, study planner, or booking system.
+
+Your documentation must include:
+
+- A homepage that introduces the product
+- A getting-started guide for new users
+- A full user guide explaining how to use the product features
+- A troubleshooting section for common user issues and errors
+- An API documentation section that explains how the product can be accessed programmatically
+- A clear navigation structure that organizes all documentation pages
+
+In this project, the product is both a user-facing application and an API-based system.
+
+#### 2. A fictional API platform (developer-focused product)
+
+You will create documentation for a fictional API platform that provides a service to developers (for example: a messaging API, file storage API, weather aggregation API, or payment simulation API).
+
+Your documentation must include:
+
+- A homepage explaining what the API does
+- A quickstart guide showing how to make a first successful API request
+- Authentication documentation explaining how to access the API
+- Full API reference documentation for at least 3 endpoints (request, response, parameters, errors)
+- An error handling and troubleshooting section explaining failure cases
+- A structured navigation system grouping all API documentation clearly
+
+In this project, the API is the main product being documented.
+
+#### 3. A system-based workflow documentation product
+
+You will create documentation for a complete system workflow such as onboarding, setup, or operational process (for example: user onboarding system, deployment workflow, or account setup process).
+
+Your documentation must include:
+
+- A homepage explaining the system or workflow
+- A step-by-step user guide for completing the process
+- A technical explanation of how the system works behind the scenes
+- An error and troubleshooting section covering what can go wrong and how to fix it
+- A structured documentation layout that separates user actions from system explanations
+
+In this project, the system is a process that must be clearly understood and followed.
+
+### Required for ALL options (mandatory)
+
+No matter which project you choose, your documentation must also include:
+
+- A clear information architecture showing how all pages are organized
+- A docs-as-code workflow using GitHub (branches and pull requests)
+- Vale integrated into the repository for documentation quality checks
+- At least one diagram or visual explaining a system, flow, or structure
+- A fully working static documentation site
+
+This project does not need to document a real product. A well-executed mock or a meaningful open-source contribution both count. What matters is that it demonstrates the full skill set from this level: structure, technical depth, workflow discipline, and quality control.
+
+When you can build something like this without needing to look up every step, you are ready for Advanced Resources.
diff --git a/content/guides/resources.md b/content/guides/resources.md
deleted file mode 100644
index ca9144f4..00000000
--- a/content/guides/resources.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Resources"
-description: ""
-summary: ""
-date: 2024-02-27T09:30:56+01:00
-lastmod: 2024-02-27T09:30:56+01:00
-draft: false
-weight: 999
-toc: true
-seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
----
-
-Link to valuable, relevant resources.
diff --git a/content/guides/roadmap/_index.md b/content/guides/roadmap/_index.md
deleted file mode 100644
index b766a981..00000000
--- a/content/guides/roadmap/_index.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Technical Writing Roadmap"
-description: ""
-summary: ""
-date: 2023-09-07T16:12:37+02:00
-lastmod: 2023-09-07T16:12:37+02:00
-draft: false
-weight: 900
-toc: true
-sidebar:
- collapsed: true
-seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
----
diff --git a/content/guides/roadmap/example.md b/content/guides/roadmap/example.md
deleted file mode 100644
index f920508c..00000000
--- a/content/guides/roadmap/example.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-title: "Example Reference"
-description: "Reference pages are ideal for outlining how things work in terse and clear terms."
-summary: ""
-date: 2023-09-07T16:13:18+02:00
-lastmod: 2023-09-07T16:13:18+02:00
-draft: false
-weight: 910
-toc: true
-seo:
- title: "" # custom title (optional)
- description: "" # custom description (recommended)
- canonical: "" # custom canonical URL (optional)
- robots: "" # custom robot tags (optional)
----
-
-Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-
-## Further reading
-
-- Read [about reference](https://diataxis.fr/reference/) in the Diátaxis framework
diff --git a/hugo_stats.json b/hugo_stats.json
index ba8ba18d..a9a08bc4 100644
--- a/hugo_stats.json
+++ b/hugo_stats.json
@@ -3,34 +3,28 @@
"tags": [
"a",
"article",
- "aside",
"base",
+ "blockquote",
"body",
- "button",
- "circle",
+ "br",
"code",
"details",
"div",
- "footer",
- "form",
- "g",
+ "em",
"h1",
"h2",
"h3",
- "h5",
+ "h4",
"head",
- "header",
+ "hr",
"html",
- "input",
- "kbd",
- "label",
"li",
- "line",
"link",
"main",
"meta",
"nav",
"noscript",
+ "ol",
"p",
"path",
"script",
@@ -41,172 +35,73 @@
"style",
"summary",
"svg",
- "template",
- "time",
+ "table",
+ "tbody",
+ "td",
+ "th",
+ "thead",
"title",
+ "tr",
"ul"
],
"classes": [
- "DocSearch-Label",
- "active",
- "anchor",
- "bg-dots",
"blog",
"blog-header",
- "btn",
- "btn-close",
- "btn-cta",
- "btn-lg",
- "btn-link",
- "btn-primary",
"card",
"card-body",
"card-list",
"categories",
"col-lg-10",
"col-lg-11",
- "col-lg-12",
"col-lg-5",
- "col-lg-8",
"col-lg-9",
"col-md-12",
"col-xl-3",
"col-xl-4",
"col-xl-8",
"col-xl-9",
- "container",
- "container-fluid",
- "container-lg",
- "content",
"contributors",
- "created-date",
"d-flex",
"d-lg-block",
- "d-lg-none",
- "d-md-block",
- "d-md-none",
"d-none",
"d-xl-block",
"d-xl-none",
"docs",
"docs-content",
- "docs-links",
"docs-sidebar",
+ "docs-sidebar-offset",
"docs-toc",
- "doks-sidebar",
+ "docs-toc-offset",
"error404",
"flex-column",
- "flex-grow-1",
- "flex-lg-row",
"flex-md-row",
- "flex-row",
"flex-sm-row",
"flex-xl-nowrap",
- "footer",
- "form-control",
- "form-control-lg",
- "fs-5",
"guides",
- "h-auto",
"h3",
- "h4",
- "h5",
"home",
"icon",
"icon-tabler",
"icon-tabler-arrow-left",
"icon-tabler-arrow-right",
- "icon-tabler-brand-github",
- "icon-tabler-brand-x",
"icon-tabler-clock",
- "icon-tabler-dots-vertical",
- "icon-tabler-menu",
- "icon-tabler-moon",
- "icon-tabler-search",
- "icon-tabler-sun",
- "icon-tabler-x",
"justify-content-between",
"justify-content-center",
"justify-content-end",
- "justify-content-start",
"lead",
"list",
- "list-inline",
- "list-inline-item",
- "list-nested",
- "list-unstyled",
- "list-view",
"m-2",
- "mb-0",
- "me-2",
- "me-auto",
- "me-lg-1",
- "me-lg-3",
- "message",
- "modal",
- "modal-body",
- "modal-content",
- "modal-dialog",
- "modal-dialog-scrollable",
- "modal-footer",
- "modal-fullscreen-md-down",
- "modal-header",
- "modal-title",
- "ms-2",
- "ms-3",
- "ms-auto",
- "ms-lg-2",
- "mt-3",
- "mt-n3",
- "mx-2",
- "mx-auto",
"my-3",
- "nav",
- "nav-item",
- "nav-link",
- "navbar",
- "navbar-brand",
- "navbar-expand-lg",
- "navbar-nav",
- "offcanvas",
- "offcanvas-body",
- "offcanvas-end",
- "offcanvas-header",
- "offcanvas-start",
- "offcanvas-title",
- "order-3",
- "order-lg-4",
- "p-0",
- "p-2",
"page-footer-meta",
"page-links",
"page-nav",
- "pb-3",
"position-relative",
"privacy",
- "px-0",
- "query-no-results",
"reading-time",
- "rounded-pill",
"row",
- "search-form",
- "search-input",
- "search-loading",
- "search-no-recent",
- "search-no-results",
- "search-result",
- "search-results",
- "search-text",
"section",
- "section-features",
- "section-md",
- "section-nav",
"single",
- "social-link",
- "status",
- "sticky-top",
"stretched-link",
- "submitted",
"tags",
"taxonomy",
"text-body",
@@ -214,36 +109,141 @@
"text-center",
"text-decoration-none",
"text-end",
- "text-lg-end",
- "text-lg-start",
- "text-muted",
"text-nowrap",
"text-reset",
- "title",
- "title-submitted",
"toc-mobile",
- "visually-hidden",
"w-100",
- "wrap"
+ "wth-btn",
+ "wth-btn--ghost",
+ "wth-btn--primary",
+ "wth-community",
+ "wth-community__inner",
+ "wth-container",
+ "wth-hero",
+ "wth-hero__actions",
+ "wth-hero__eyebrow",
+ "wth-hero__lead",
+ "wth-hero__title",
+ "wth-home",
+ "wth-how",
+ "wth-how__grid",
+ "wth-how__item",
+ "wth-how__num",
+ "wth-how__title",
+ "wth-level-card",
+ "wth-level-card--advanced",
+ "wth-level-card--beginner",
+ "wth-level-card--intermediate",
+ "wth-level-card__cta",
+ "wth-level-card__desc",
+ "wth-level-card__tag",
+ "wth-level-card__title",
+ "wth-level-card__topics",
+ "wth-levels",
+ "wth-levels__grid",
+ "wth-levels__header"
],
"ids": [
+ "1-a-complete-fictional-saas-product-documentation-site",
+ "1-advanced-prompting-techniques",
+ "1-agentic-ai-and-multi-step-workflows",
+ "1-basic-prompt-engineering",
+ "1-content-strategy-and-governance",
+ "1-continuous-integration-pipelines-for-documentation",
+ "1-information-architecture",
+ "1-lead-documentation-end-to-end",
+ "1-what-is-technical-writing",
+ "10-career-paths-and-staying-current",
+ "2-a-fictional-api-platform-developer-focused-product",
+ "2-ai-output-review-and-validation",
+ "2-docs-as-code",
+ "2-measurement",
+ "2-platform-and-documentation-lifecycle-management",
+ "2-prompt-systems-and-governance",
+ "2-redesign-documentation-systems",
+ "2-reusable-prompt-libraries-and-workflows",
+ "2-writing-clearly",
+ "3-a-system-based-workflow-documentation-product",
+ "3-ai-assisted-editing-and-quality-control",
+ "3-api-documentation",
+ "3-api-documentation-automation",
+ "3-cross-functional-influence",
+ "3-define-and-maintain-documentation-standards",
+ "3-document-types-and-structure",
+ "3-retrieval-augmented-generation-rag-for-documentation",
+ "3-safe-and-approved-tool-use",
+ "4-content-architecture-for-retrieval-systems",
+ "4-define-documentation-standards-templates-and-review-workflows-for-a-team-and-maintain-them-over-time",
+ "4-information-architecture-at-scale",
+ "4-quality-and-review-systems",
+ "4-quality-and-risk-management-for-ai-assisted-docs",
+ "4-style-guides",
+ "5-publishing-and-knowledge-sharing",
+ "5-using-ai-in-intermediate-level-technical-writing",
+ "5-using-ai-in-senior-level-technical-writing",
+ "5-working-with-subject-matter-experts",
+ "6-tooling-and-automation",
+ "6-tools-overview",
+ "6-using-ai-in-entry-level-technical-writing",
+ "7-documentation-specialisations",
+ "7-further-reading",
+ "7-portfolio-projects",
+ "8-video-tutorials-writetech-hub",
+ "9-ownership-and-community-contribution",
"TableOfContents",
- "buttonColorMode",
- "doks-docs-nav",
+ "additional-practice",
+ "ask-the-community",
+ "automating-quality-checks",
+ "capstone-deliverable",
+ "capstone-deliverable-docs-programme-pack",
+ "communities",
+ "community",
+ "core-areas-to-develop",
+ "core-concepts",
+ "core-concepts-1",
+ "core-concepts-to-develop",
+ "core-concepts-to-get-comfortable-with",
+ "defining-what-done-means",
+ "documentation-site-generators",
"further-reading",
- "offcanvasNavMain",
- "offcanvasNavMainLabel",
- "offcanvasNavSection",
- "offcanvasNavSectionLabel",
- "query",
- "search-form",
- "searchModal",
- "searchModalLabel",
- "searchResults",
- "searchToggleDesktop",
- "searchToggleMobile",
- "socialMenu",
- "toc"
+ "how-the-levels-work",
+ "important-constraint",
+ "levels",
+ "metrics-worth-thinking-about",
+ "practice",
+ "practice-1",
+ "practice-2",
+ "practice-3",
+ "practice-4",
+ "required-for-all-options-mandatory",
+ "resource",
+ "resource-1",
+ "resources",
+ "resources-1",
+ "resources-2",
+ "resources-3",
+ "resources-4",
+ "resources-5",
+ "resources-6",
+ "submission-format",
+ "suggested-project-ideas",
+ "things-to-work-on",
+ "things-to-work-on-1",
+ "things-worth-aiming-for",
+ "toc",
+ "tools-you-can-use-to-measure-these-metrics",
+ "version-control",
+ "video-tutorials",
+ "video-tutorials-1",
+ "visual-tools",
+ "what-this-is-testing",
+ "what-you-can-use-ai-for-at-this-level",
+ "what-you-should-be-careful-about",
+ "what-you-should-learn-at-this-level",
+ "what-you-should-not-rely-on-ai-for-at-this-level",
+ "what-you-should-own-at-this-level",
+ "what-you-will-build",
+ "writing-tools"
]
}
}
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
new file mode 100644
index 00000000..7a76760b
--- /dev/null
+++ b/layouts/_default/baseof.html
@@ -0,0 +1,22 @@
+
+
+ {{ partial "head/head" . }}
+ {{ partial "head/body-class" . }}
+
+ {{ partial "header/header" . }}
+
+
+ {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (or (not (in .Site.Params.mainSections .Type)) (.IsNode)) }}
{{ end }}
+ {{ block "main" . }}{{ end }}
+ {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (or (not (in .Site.Params.mainSections .Type)) (.IsNode)) }}
{{ end }}
+
+
+ {{ block "sidebar-prefooter" . }}{{ end }}
+ {{ block "sidebar-footer" . }}{{ end }}
+ {{ partial "footer/footer" . }}
+ {{ partial "footer/script-footer" . }}
+ {{ if eq site.Params.doks.toTopButton true -}}
+ {{ partial "footer/to-top" . }}
+ {{ end }}
+
+
diff --git a/layouts/guides/list.html b/layouts/guides/list.html
new file mode 100644
index 00000000..9a2975d6
--- /dev/null
+++ b/layouts/guides/list.html
@@ -0,0 +1,22 @@
+{{ define "main" }}
+
+
+
+ {{ if eq .CurrentSection .FirstSection }}{{ .Section | humanize }}{{ else }}{{ .Title }}{{ end }}
+ {{ with .Content }}{{ . }}
{{ end }}
+
+ {{ $currentSection := .CurrentSection }}
+ {{ range where .Site.RegularPages.ByTitle "Section" .Section }}
+ {{ if in (.RelPermalink | string) $currentSection.RelPermalink }}
+
+ {{ end }}
+ {{ end }}
+
+
+
+
+{{ end }}
diff --git a/layouts/guides/single.html b/layouts/guides/single.html
new file mode 100644
index 00000000..40764a16
--- /dev/null
+++ b/layouts/guides/single.html
@@ -0,0 +1,64 @@
+{{ define "main" }}
+
+ {{ if (in site.Params.doks.sectionNav .Section) -}}
+
+ {{ end -}}
+ {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (in .Site.Params.mainSections .Type) }}
+
+ {{ end }}
+ {{ if ne .Params.toc false -}}
+
+ {{ end -}}
+ {{ if .Params.toc -}}
+
+ {{ else -}}
+
+ {{ end -}}
+ {{ if site.Params.doks.breadcrumbTrail -}}
+
+
+
+ {{ partial "main/breadcrumb" . -}}
+ {{ .Title }}
+
+
+ {{ end }}
+ {{ .Title }}
+
+ {{ if ne .Params.toc false -}}
+
+ {{ partial "sidebar/docs-toc-mobile.html" . }}
+
+ {{ end -}}
+
+ {{ if site.Params.doks.headlineHash -}}
+ {{ partial "main/headline-hash" .Content }}
+ {{ else -}}
+ {{ .Content }}
+ {{ end -}}
+
+ {{ if site.Params.doks.lastMod -}}
+ {{ partial "main/last-modified.html" . }}
+ {{ end -}}
+ {{ if site.Params.doks.editPage -}}
+ {{ partial "main/edit-page.html" . }}
+ {{ end -}}
+
+ {{ partial "main/docs-navigation.html" . }}
+
+
+ {{ if and (eq site.Params.doks.containerBreakpoint "fluid") (in .Site.Params.mainSections .Type) }}
+
+ {{ end }}
+
+{{ end }}
diff --git a/layouts/index.html b/layouts/index.html
index d95a4a74..9dbf5184 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -1,59 +1,154 @@
{{ define "main" }}
-
-
-
-
{{ .Title }}
+
+
+
+
WriteTech Hub · Resource Library
+
Learn technical writing. Level by level.
+
A structured, practitioner-built resource library for technical writers — from your first how-to guide to owning documentation at programme scale.
+
-
-
{{ .Params.lead | safeHTML }}
-
{{ i18n "get_started" }}
- {{ .Content }}
+
+
+
+
+
+
+ Beginner
+ Foundations
+ Clear writing, document types, style guides, working with SMEs, and responsible AI use. Build enough foundation to write something useful for a real reader.
+
+ Google Technical Writing courses
+ Diataxis framework
+ Style guides (Google, Microsoft)
+ Working with subject matter experts
+ Basic prompt engineering
+
+ Start here →
+
+
+ Intermediate
+ Practice & Delivery
+ Information architecture, docs-as-code, API documentation, and quality systems. Build portfolio-ready work used in active projects.
+
+ Information architecture
+ Docs-as-code with GitHub
+ API documentation
+ Vale prose linting
+ AI-assisted editing workflows
+
+ Level up →
+
+
+ Advanced
+ Systems & Scale
+ Content strategy, governance, measurement, cross-functional influence, and AI at programme level. Own documentation across an entire product.
+
+ Content strategy & governance
+ Documentation metrics
+ Cross-functional influence
+ RAG & agentic AI systems
+ CI/CD for documentation
+
+ Go deep →
+
+
-
-
-{{ end }}
-
-{{ define "sidebar-prefooter" }}
- {{ if site.Params.doks.backgroundDots -}}
-
- {{ end -}}
- {{ if eq $.Site.Language.LanguageName "English" }}
-
-
-
-
-
Update content
-
Edit content/_index.md to see this page change.
+
+
+
+
How the library works
+
+
+
1
+
Pick your level Start at Beginner if you are new. Move up when you complete the capstone.
-
-
Add new content
-
Add Markdown files to content to create new pages.
+
+
2
+
Study and practise Read the resources, then do the exercises. The exercises are where learning happens.
-
-
Configure your site
-
Edit your config in config/_default/params.toml.
+
+
3
+
Build your capstone Each level ends with a deliverable. Build it and add it to your portfolio.
-
-
Read the docs
-
Learn more in the Docs .
+
+
4
+
Share and grow Post your work in the WriteTech Hub community and get feedback.
- {{ end }}
-{{ end }}
-
-{{ define "sidebar-footer" }}
-{{ if site.Params.doks.sectionFooter -}}
-
-
+
{{ end }}
+{{ define "sidebar-prefooter" }}{{ end }}
+{{ define "sidebar-footer" }}{{ end }}
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index 1aeb3270..3b421221 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -74,6 +74,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
"integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
@@ -1455,23 +1456,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@esbuild/win32-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
@@ -1702,25 +1686,12 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
+ "peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.34.9",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
@@ -2031,6 +2002,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
@@ -2427,20 +2399,6 @@
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"license": "ISC"
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "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.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -3035,7 +2993,6 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -3204,6 +3161,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
@@ -3368,7 +3326,6 @@
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -3523,8 +3480,7 @@
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/read-cache": {
"version": "1.0.0",
@@ -3769,7 +3725,6 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
"integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
diff --git a/node_modules/@esbuild/darwin-arm64/README.md b/node_modules/@esbuild/darwin-arm64/README.md
deleted file mode 100644
index c2c0398d..00000000
--- a/node_modules/@esbuild/darwin-arm64/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# esbuild
-
-This is the macOS ARM 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details.
diff --git a/node_modules/@esbuild/darwin-arm64/bin/esbuild b/node_modules/@esbuild/darwin-arm64/bin/esbuild
deleted file mode 100755
index e81b7dab..00000000
Binary files a/node_modules/@esbuild/darwin-arm64/bin/esbuild and /dev/null differ
diff --git a/node_modules/@esbuild/darwin-arm64/package.json b/node_modules/@esbuild/darwin-arm64/package.json
deleted file mode 100644
index 6eea7ea2..00000000
--- a/node_modules/@esbuild/darwin-arm64/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "@esbuild/darwin-arm64",
- "version": "0.21.5",
- "description": "The macOS ARM 64-bit binary for esbuild, a JavaScript bundler.",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/evanw/esbuild.git"
- },
- "license": "MIT",
- "preferUnplugged": true,
- "engines": {
- "node": ">=12"
- },
- "os": [
- "darwin"
- ],
- "cpu": [
- "arm64"
- ]
-}
diff --git a/node_modules/@rollup/rollup-darwin-arm64/README.md b/node_modules/@rollup/rollup-darwin-arm64/README.md
deleted file mode 100644
index c29619c3..00000000
--- a/node_modules/@rollup/rollup-darwin-arm64/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# `@rollup/rollup-darwin-arm64`
-
-This is the **aarch64-apple-darwin** binary for `rollup`
diff --git a/node_modules/@rollup/rollup-darwin-arm64/package.json b/node_modules/@rollup/rollup-darwin-arm64/package.json
deleted file mode 100644
index 210f6aba..00000000
--- a/node_modules/@rollup/rollup-darwin-arm64/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "@rollup/rollup-darwin-arm64",
- "version": "4.34.9",
- "os": [
- "darwin"
- ],
- "cpu": [
- "arm64"
- ],
- "files": [
- "rollup.darwin-arm64.node"
- ],
- "description": "Native bindings for Rollup",
- "author": "Lukas Taegert-Atkinson",
- "homepage": "https://rollupjs.org/",
- "license": "MIT",
- "repository": "rollup/rollup",
- "main": "./rollup.darwin-arm64.node"
-}
\ No newline at end of file
diff --git a/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node b/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node
deleted file mode 100644
index 824d39a8..00000000
Binary files a/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node and /dev/null differ
diff --git a/node_modules/@thulite/core/assets/jsconfig.json b/node_modules/@thulite/core/assets/jsconfig.json
index 5494003f..cdc4c231 100644
--- a/node_modules/@thulite/core/assets/jsconfig.json
+++ b/node_modules/@thulite/core/assets/jsconfig.json
@@ -1,10 +1,9 @@
{
"compilerOptions": {
- "baseUrl": ".",
"paths": {
"*": [
- "../../../../assets/*",
- "../../doks-core/assets/*"
+ "..\\..\\..\\..\\assets\\*",
+ "..\\..\\doks-core\\assets\\*"
]
}
}
diff --git a/node_modules/@thulite/core/layouts/index.html b/node_modules/@thulite/core/layouts/index.html
deleted file mode 100644
index c1c913cf..00000000
--- a/node_modules/@thulite/core/layouts/index.html
+++ /dev/null
@@ -1,4 +0,0 @@
-{{ define "main" }}
- {{ .Content }}
- This line is from layouts/index.html.
-{{ end }}
diff --git a/node_modules/@thulite/doks-core/layouts/index.html b/node_modules/@thulite/doks-core/layouts/index.html
index 43c5fc74..03882635 100644
--- a/node_modules/@thulite/doks-core/layouts/index.html
+++ b/node_modules/@thulite/doks-core/layouts/index.html
@@ -1,59 +1,154 @@
{{ define "main" }}
-
-
-
-
{{ .Title }}
+
+
+
+
WriteTech Hub · Resource Library
+
Learn technical writing. Level by level.
+
A structured, practitioner-built resource library for technical writers — from your first how-to guide to owning documentation at programme scale.
+
-
-
{{ .Params.lead | safeHTML }}
-
{{ i18n "get_started" }}
- {{ .Content }}
+
+
+
+
+
+
+ Beginner
+ Foundations
+ Clear writing, document types, style guides, working with SMEs, and responsible AI use. Build enough foundation to write something useful for a real reader.
+
+ Google Technical Writing courses
+ Diataxis framework
+ Style guides (Google, Microsoft)
+ Working with subject matter experts
+ Basic prompt engineering
+
+ Start here →
+
+
+ Intermediate
+ Practice & Delivery
+ Information architecture, docs-as-code, API documentation, and quality systems. Build portfolio-ready work used in active projects.
+
+ Information architecture
+ Docs-as-code with GitHub
+ API documentation
+ Vale prose linting
+ AI-assisted editing workflows
+
+ Level up →
+
+
+ Advanced
+ Systems & Scale
+ Content strategy, governance, measurement, cross-functional influence, and AI at programme level. Own documentation across an entire product.
+
+ Content strategy & governance
+ Documentation metrics
+ Cross-functional influence
+ RAG & agentic AI systems
+ CI/CD for documentation
+
+ Go deep →
+
+
-
-
-{{ end }}
-
-{{ define "sidebar-prefooter" }}
- {{ if site.Params.doks.backgroundDots -}}
-
- {{ end -}}
- {{ if eq $.Site.Language.LanguageName "English" }}
-
-
-
-
-
Update content
-
Edit content/_index.md to see this page change.
+
+
+
+
How the library works
+
+
+
1
+
Pick your level Start at Beginner if you are new. Move up when you complete the capstone.
-
-
Add new content
-
Add Markdown files to content to create new pages.
+
+
2
+
Study and practise Read the resources, then do the exercises. The exercises are where learning happens.
-
-
Configure your site
-
Edit your config in config/_default/params.toml.
+
+
3
+
Build your capstone Each level ends with a deliverable. Build it and add it to your portfolio.
-
-
Read the docs
-
Learn more in the Docs .
+
+
4
+
Share and grow Post your work in the WriteTech Hub community and get feedback.
- {{ end }}
-{{ end }}
-
-{{ define "sidebar-footer" }}
-{{ if site.Params.doks.sectionFooter -}}
-
-
+
{{ end }}
+{{ define "sidebar-prefooter" }}{{ end }}
+{{ define "sidebar-footer" }}{{ end }}
diff --git a/node_modules/fsevents/LICENSE b/node_modules/fsevents/LICENSE
deleted file mode 100644
index 5d70441c..00000000
--- a/node_modules/fsevents/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
------------
-
-Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/fsevents/README.md b/node_modules/fsevents/README.md
deleted file mode 100644
index 50373a03..00000000
--- a/node_modules/fsevents/README.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# fsevents
-
-Native access to MacOS FSEvents in [Node.js](https://nodejs.org/)
-
-The FSEvents API in MacOS allows applications to register for notifications of
-changes to a given directory tree. It is a very fast and lightweight alternative
-to kqueue.
-
-This is a low-level library. For a cross-platform file watching module that
-uses fsevents, check out [Chokidar](https://github.com/paulmillr/chokidar).
-
-## Usage
-
-```sh
-npm install fsevents
-```
-
-Supports only **Node.js v8.16 and higher**.
-
-```js
-const fsevents = require('fsevents');
-
-// To start observation
-const stop = fsevents.watch(__dirname, (path, flags, id) => {
- const info = fsevents.getInfo(path, flags);
-});
-
-// To end observation
-stop();
-```
-
-> **Important note:** The API behaviour is slightly different from typical JS APIs. The `stop` function **must** be
-> retrieved and stored somewhere, even if you don't plan to stop the watcher. If you forget it, the garbage collector
-> will eventually kick in, the watcher will be unregistered, and your callbacks won't be called anymore.
-
-The callback passed as the second parameter to `.watch` get's called whenever the operating system detects a
-a change in the file system. It takes three arguments:
-
-###### `fsevents.watch(dirname: string, (path: string, flags: number, id: string) => void): () => Promise`
-
- * `path: string` - the item in the filesystem that have been changed
- * `flags: number` - a numeric value describing what the change was
- * `id: string` - an unique-id identifying this specific event
-
- Returns closer callback which when called returns a Promise resolving when the watcher process has been shut down.
-
-###### `fsevents.getInfo(path: string, flags: number, id: string): FsEventInfo`
-
-The `getInfo` function takes the `path`, `flags` and `id` arguments and converts those parameters into a structure
-that is easier to digest to determine what the change was.
-
-The `FsEventsInfo` has the following shape:
-
-```js
-/**
- * @typedef {'created'|'modified'|'deleted'|'moved'|'root-changed'|'cloned'|'unknown'} FsEventsEvent
- * @typedef {'file'|'directory'|'symlink'} FsEventsType
- */
-{
- "event": "created", // {FsEventsEvent}
- "path": "file.txt",
- "type": "file", // {FsEventsType}
- "changes": {
- "inode": true, // Had iNode Meta-Information changed
- "finder": false, // Had Finder Meta-Data changed
- "access": false, // Had access permissions changed
- "xattrs": false // Had xAttributes changed
- },
- "flags": 0x100000000
-}
-```
-
-## Changelog
-
-- v2.3 supports Apple Silicon ARM CPUs
-- v2 supports node 8.16+ and reduces package size massively
-- v1.2.8 supports node 6+
-- v1.2.7 supports node 4+
-
-## Troubleshooting
-
-- I'm getting `EBADPLATFORM` `Unsupported platform for fsevents` error.
-- It's fine, nothing is broken. fsevents is macos-only. Other platforms are skipped. If you want to hide this warning, report a bug to NPM bugtracker asking them to hide ebadplatform warnings by default.
-
-## License
-
-The MIT License Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller — see LICENSE file.
-
-Visit our [GitHub page](https://github.com/fsevents/fsevents) and [NPM Page](https://npmjs.org/package/fsevents)
diff --git a/node_modules/fsevents/fsevents.d.ts b/node_modules/fsevents/fsevents.d.ts
deleted file mode 100644
index 2723c048..00000000
--- a/node_modules/fsevents/fsevents.d.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-declare type Event = "created" | "cloned" | "modified" | "deleted" | "moved" | "root-changed" | "unknown";
-declare type Type = "file" | "directory" | "symlink";
-declare type FileChanges = {
- inode: boolean;
- finder: boolean;
- access: boolean;
- xattrs: boolean;
-};
-declare type Info = {
- event: Event;
- path: string;
- type: Type;
- changes: FileChanges;
- flags: number;
-};
-declare type WatchHandler = (path: string, flags: number, id: string) => void;
-export declare function watch(path: string, handler: WatchHandler): () => Promise;
-export declare function watch(path: string, since: number, handler: WatchHandler): () => Promise;
-export declare function getInfo(path: string, flags: number): Info;
-export declare const constants: {
- None: 0x00000000;
- MustScanSubDirs: 0x00000001;
- UserDropped: 0x00000002;
- KernelDropped: 0x00000004;
- EventIdsWrapped: 0x00000008;
- HistoryDone: 0x00000010;
- RootChanged: 0x00000020;
- Mount: 0x00000040;
- Unmount: 0x00000080;
- ItemCreated: 0x00000100;
- ItemRemoved: 0x00000200;
- ItemInodeMetaMod: 0x00000400;
- ItemRenamed: 0x00000800;
- ItemModified: 0x00001000;
- ItemFinderInfoMod: 0x00002000;
- ItemChangeOwner: 0x00004000;
- ItemXattrMod: 0x00008000;
- ItemIsFile: 0x00010000;
- ItemIsDir: 0x00020000;
- ItemIsSymlink: 0x00040000;
- ItemIsHardlink: 0x00100000;
- ItemIsLastHardlink: 0x00200000;
- OwnEvent: 0x00080000;
- ItemCloned: 0x00400000;
-};
-export {};
diff --git a/node_modules/fsevents/fsevents.js b/node_modules/fsevents/fsevents.js
deleted file mode 100644
index 198da98e..00000000
--- a/node_modules/fsevents/fsevents.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- ** © 2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller
- ** Licensed under MIT License.
- */
-
-/* jshint node:true */
-"use strict";
-
-if (process.platform !== "darwin") {
- throw new Error(`Module 'fsevents' is not compatible with platform '${process.platform}'`);
-}
-
-const Native = require("./fsevents.node");
-const events = Native.constants;
-
-function watch(path, since, handler) {
- if (typeof path !== "string") {
- throw new TypeError(`fsevents argument 1 must be a string and not a ${typeof path}`);
- }
- if ("function" === typeof since && "undefined" === typeof handler) {
- handler = since;
- since = Native.flags.SinceNow;
- }
- if (typeof since !== "number") {
- throw new TypeError(`fsevents argument 2 must be a number and not a ${typeof since}`);
- }
- if (typeof handler !== "function") {
- throw new TypeError(`fsevents argument 3 must be a function and not a ${typeof handler}`);
- }
-
- let instance = Native.start(Native.global, path, since, handler);
- if (!instance) throw new Error(`could not watch: ${path}`);
- return () => {
- const result = instance ? Promise.resolve(instance).then(Native.stop) : Promise.resolve(undefined);
- instance = undefined;
- return result;
- };
-}
-
-function getInfo(path, flags) {
- return {
- path,
- flags,
- event: getEventType(flags),
- type: getFileType(flags),
- changes: getFileChanges(flags),
- };
-}
-
-function getFileType(flags) {
- if (events.ItemIsFile & flags) return "file";
- if (events.ItemIsDir & flags) return "directory";
- if (events.MustScanSubDirs & flags) return "directory";
- if (events.ItemIsSymlink & flags) return "symlink";
-}
-function anyIsTrue(obj) {
- for (let key in obj) {
- if (obj[key]) return true;
- }
- return false;
-}
-function getEventType(flags) {
- if (events.ItemRemoved & flags) return "deleted";
- if (events.ItemRenamed & flags) return "moved";
- if (events.ItemCreated & flags) return "created";
- if (events.ItemModified & flags) return "modified";
- if (events.RootChanged & flags) return "root-changed";
- if (events.ItemCloned & flags) return "cloned";
- if (anyIsTrue(flags)) return "modified";
- return "unknown";
-}
-function getFileChanges(flags) {
- return {
- inode: !!(events.ItemInodeMetaMod & flags),
- finder: !!(events.ItemFinderInfoMod & flags),
- access: !!(events.ItemChangeOwner & flags),
- xattrs: !!(events.ItemXattrMod & flags),
- };
-}
-
-exports.watch = watch;
-exports.getInfo = getInfo;
-exports.constants = events;
diff --git a/node_modules/fsevents/fsevents.node b/node_modules/fsevents/fsevents.node
deleted file mode 100755
index 1cc3345e..00000000
Binary files a/node_modules/fsevents/fsevents.node and /dev/null differ
diff --git a/node_modules/fsevents/package.json b/node_modules/fsevents/package.json
deleted file mode 100644
index 5d0ee15e..00000000
--- a/node_modules/fsevents/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "name": "fsevents",
- "version": "2.3.3",
- "description": "Native Access to MacOS FSEvents",
- "main": "fsevents.js",
- "types": "fsevents.d.ts",
- "os": [
- "darwin"
- ],
- "files": [
- "fsevents.d.ts",
- "fsevents.js",
- "fsevents.node"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- },
- "scripts": {
- "clean": "node-gyp clean && rm -f fsevents.node",
- "build": "node-gyp clean && rm -f fsevents.node && node-gyp rebuild && node-gyp clean",
- "test": "/bin/bash ./test.sh 2>/dev/null",
- "prepublishOnly": "npm run build"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/fsevents/fsevents.git"
- },
- "keywords": [
- "fsevents",
- "mac"
- ],
- "contributors": [
- {
- "name": "Philipp Dunkel",
- "email": "pip@pipobscure.com"
- },
- {
- "name": "Ben Noordhuis",
- "email": "info@bnoordhuis.nl"
- },
- {
- "name": "Elan Shankar",
- "email": "elan.shanker@gmail.com"
- },
- {
- "name": "Miroslav Bajtoš",
- "email": "mbajtoss@gmail.com"
- },
- {
- "name": "Paul Miller",
- "url": "https://paulmillr.com"
- }
- ],
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/fsevents/fsevents/issues"
- },
- "homepage": "https://github.com/fsevents/fsevents",
- "devDependencies": {
- "node-gyp": "^9.4.0"
- }
-}
diff --git a/package-lock.json b/package-lock.json
index 7a6a809e..38c2e0a2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -94,6 +94,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
"integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
@@ -2079,6 +2080,7 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
+ "peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
@@ -2646,6 +2648,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
@@ -3650,7 +3653,6 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -3819,6 +3821,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
@@ -3983,7 +3986,6 @@
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -4138,8 +4140,7 @@
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/read-cache": {
"version": "1.0.0",
@@ -4384,7 +4385,6 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
"integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
diff --git a/package.json b/package.json
index dcec8399..151c62d7 100644
--- a/package.json
+++ b/package.json
@@ -6,8 +6,10 @@
"license": "MIT",
"scripts": {
"create": "hugo new",
+ "predev": "cp layouts/index.html node_modules/@thulite/doks-core/layouts/index.html; cp layouts/index.html node_modules/@thulite/core/layouts/index.html || copy /Y layouts\\index.html node_modules\\@thulite\\doks-core\\layouts\\index.html",
"dev": "hugo server --disableFastRender --noHTTPCache",
"format": "prettier **/** -w -c",
+ "prebuild": "cp layouts/index.html node_modules/@thulite/doks-core/layouts/index.html; cp layouts/index.html node_modules/@thulite/core/layouts/index.html || true",
"build": "hugo --minify --gc",
"preview": "vite preview --outDir public"
},
@@ -26,4 +28,4 @@
"engines": {
"node": ">=20.11.0"
}
-}
\ No newline at end of file
+}
diff --git a/public/.gitkeep b/public/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/public/404.html b/public/404.html
deleted file mode 100644
index 13bd451a..00000000
--- a/public/404.html
+++ /dev/null
@@ -1,293 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-404 Page not found | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page not found :(
- The page you are looking for doesn't exist or has been moved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
deleted file mode 100644
index 3418e894..00000000
Binary files a/public/apple-touch-icon.png and /dev/null differ
diff --git a/public/blog/example-post/index.html b/public/blog/example-post/index.html
deleted file mode 100644
index 75b8b3bb..00000000
--- a/public/blog/example-post/index.html
+++ /dev/null
@@ -1,354 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Post | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
You can use blog posts for announcing product updates and features.
Well-thought-through product announcements will help increase feature awareness and engage users with new functionality. Just like sharing your public roadmap , it’s also a great way to let potential customers see that you’re constantly improving.
-
Further reading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/blog/index.html b/public/blog/index.html
deleted file mode 100644
index 606a5edc..00000000
--- a/public/blog/index.html
+++ /dev/null
@@ -1,314 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Blog | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- You can use blog posts for announcing product updates and features.
-
- September 7, 2023
-
-
-
- 1 minute
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/blog/index.xml b/public/blog/index.xml
deleted file mode 100644
index d726a5b3..00000000
--- a/public/blog/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Blog on WTH Docs Lab
- http://localhost:1313/blog/
- Recent content in Blog on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:27:22 +0200
-
- -
-
Example Post
- http://localhost:1313/blog/example-post/
- Thu, 07 Sep 2023 16:27:22 +0200
- http://localhost:1313/blog/example-post/
- You can use blog posts for announcing product updates and features.
-
-
-
diff --git a/public/blog/page/1/index.html b/public/blog/page/1/index.html
deleted file mode 100644
index a541f843..00000000
--- a/public/blog/page/1/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/blog/
-
-
-
-
-
-
diff --git a/public/blog/sitemap.xml b/public/blog/sitemap.xml
deleted file mode 100644
index ff03dcd0..00000000
--- a/public/blog/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/blog/example-post/
- 2023-09-07T16:27:22+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/categories/index.html b/public/categories/index.html
deleted file mode 100644
index ace784ce..00000000
--- a/public/categories/index.html
+++ /dev/null
@@ -1,295 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Categories | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/categories/index.xml b/public/categories/index.xml
deleted file mode 100644
index 4c0b1bab..00000000
--- a/public/categories/index.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- Categories on WTH Docs Lab
- http://localhost:1313/categories/
- Recent content in Categories on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
-
-
-
diff --git a/public/categories/page/1/index.html b/public/categories/page/1/index.html
deleted file mode 100644
index b7ea490b..00000000
--- a/public/categories/page/1/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/categories/
-
-
-
-
-
-
diff --git a/public/contributors/index.html b/public/contributors/index.html
deleted file mode 100644
index 991f9f3d..00000000
--- a/public/contributors/index.html
+++ /dev/null
@@ -1,295 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Contributors | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Contributors
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/contributors/index.xml b/public/contributors/index.xml
deleted file mode 100644
index f50a5a33..00000000
--- a/public/contributors/index.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- Contributors on WTH Docs Lab
- http://localhost:1313/contributors/
- Recent content in Contributors on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
-
-
-
diff --git a/public/contributors/page/1/index.html b/public/contributors/page/1/index.html
deleted file mode 100644
index b02b9c6c..00000000
--- a/public/contributors/page/1/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/contributors/
-
-
-
-
-
-
diff --git a/public/docs-copy/guides/example/index.html b/public/docs-copy/guides/example/index.html
deleted file mode 100644
index a73991f5..00000000
--- a/public/docs-copy/guides/example/index.html
+++ /dev/null
@@ -1,352 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/guides/index.html b/public/docs-copy/guides/index.html
deleted file mode 100644
index 5a6eb982..00000000
--- a/public/docs-copy/guides/index.html
+++ /dev/null
@@ -1,304 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guides | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/guides/index.xml b/public/docs-copy/guides/index.xml
deleted file mode 100644
index aca43bf9..00000000
--- a/public/docs-copy/guides/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guides on My Docs
- http://localhost:1313/docs-copy/guides/
- Recent content in Guides on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/docs-copy/guides/example/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/docs-copy/guides/example/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/docs-copy/guides/sitemap.xml b/public/docs-copy/guides/sitemap.xml
deleted file mode 100644
index 2d1f54e9..00000000
--- a/public/docs-copy/guides/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs-copy/guides/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs-copy/index.html b/public/docs-copy/index.html
deleted file mode 100644
index 7404ac19..00000000
--- a/public/docs-copy/index.html
+++ /dev/null
@@ -1,285 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Docs Copies | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Docs copy
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/index.xml b/public/docs-copy/index.xml
deleted file mode 100644
index 29575b4b..00000000
--- a/public/docs-copy/index.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- Docs Copies on My Docs
- http://localhost:1313/docs-copy/
- Recent content in Docs Copies on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
-
-
-
diff --git a/public/docs-copy/reference/example/index.html b/public/docs-copy/reference/example/index.html
deleted file mode 100644
index be41661e..00000000
--- a/public/docs-copy/reference/example/index.html
+++ /dev/null
@@ -1,352 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Reference | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Reference
-
-
-
- On this page
-
-
-
-
- Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/reference/index.html b/public/docs-copy/reference/index.html
deleted file mode 100644
index dc93bd6e..00000000
--- a/public/docs-copy/reference/index.html
+++ /dev/null
@@ -1,302 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Reference | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/reference/index.xml b/public/docs-copy/reference/index.xml
deleted file mode 100644
index 3f235bfe..00000000
--- a/public/docs-copy/reference/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Reference on My Docs
- http://localhost:1313/docs-copy/reference/
- Recent content in Reference on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:13:18 +0200
-
- -
-
Example Reference
- http://localhost:1313/docs-copy/reference/example/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/docs-copy/reference/example/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
-
-
diff --git a/public/docs-copy/reference/sitemap.xml b/public/docs-copy/reference/sitemap.xml
deleted file mode 100644
index bfaf9650..00000000
--- a/public/docs-copy/reference/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs-copy/reference/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs-copy/resources/index.html b/public/docs-copy/resources/index.html
deleted file mode 100644
index 7cff8e18..00000000
--- a/public/docs-copy/resources/index.html
+++ /dev/null
@@ -1,310 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resources | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Resources
-
-
-
-
- Link to valuable, relevant resources.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs-copy/sitemap.xml b/public/docs-copy/sitemap.xml
deleted file mode 100644
index f322798f..00000000
--- a/public/docs-copy/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs-copy/resources/
- 2024-02-27T09:30:56+01:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs/guides/example-guide/index.html b/public/docs/guides/example-guide/index.html
deleted file mode 100644
index 63d1ad7e..00000000
--- a/public/docs/guides/example-guide/index.html
+++ /dev/null
@@ -1,454 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/guides/index.html b/public/docs/guides/index.html
deleted file mode 100644
index 2bce3cce..00000000
--- a/public/docs/guides/index.html
+++ /dev/null
@@ -1,370 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guides | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/guides/index.xml b/public/docs/guides/index.xml
deleted file mode 100644
index 33f13f4d..00000000
--- a/public/docs/guides/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guides on My Docs
- http://localhost:1313/docs/guides/
- Recent content in Guides on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/docs/guides/example-guide/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/docs/guides/example-guide/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/docs/guides/sitemap.xml b/public/docs/guides/sitemap.xml
deleted file mode 100644
index 5ce1d0a7..00000000
--- a/public/docs/guides/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs/guides/example-guide/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs/index.html b/public/docs/index.html
deleted file mode 100644
index 64f0d074..00000000
--- a/public/docs/index.html
+++ /dev/null
@@ -1,381 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-User Guides | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/index.xml b/public/docs/index.xml
deleted file mode 100644
index 4164aa39..00000000
--- a/public/docs/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- User Guides on WTH Docs Lab
- http://localhost:1313/docs/
- Recent content in User Guides on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Tue, 27 Feb 2024 09:30:56 +0100
-
- -
-
Resources
- http://localhost:1313/docs/resources/
- Tue, 27 Feb 2024 09:30:56 +0100
- http://localhost:1313/docs/resources/
- <p>Link to valuable, relevant resources.</p>
-
-
-
diff --git a/public/docs/reference/example-reference/index.html b/public/docs/reference/example-reference/index.html
deleted file mode 100644
index c5245069..00000000
--- a/public/docs/reference/example-reference/index.html
+++ /dev/null
@@ -1,477 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Reference | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Reference
-
-
-
- On this page
-
-
-
-
- Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/reference/index.html b/public/docs/reference/index.html
deleted file mode 100644
index 128fe07b..00000000
--- a/public/docs/reference/index.html
+++ /dev/null
@@ -1,376 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Reference | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/reference/index.xml b/public/docs/reference/index.xml
deleted file mode 100644
index e61174be..00000000
--- a/public/docs/reference/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Reference on WTH Docs Lab
- http://localhost:1313/docs/reference/
- Recent content in Reference on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:13:18 +0200
-
- -
-
Example Reference
- http://localhost:1313/docs/reference/example-reference/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/docs/reference/example-reference/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
-
-
diff --git a/public/docs/reference/sitemap.xml b/public/docs/reference/sitemap.xml
deleted file mode 100644
index d2ed968f..00000000
--- a/public/docs/reference/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs/reference/example-reference/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs/resources/index.html b/public/docs/resources/index.html
deleted file mode 100644
index 5b98fbd1..00000000
--- a/public/docs/resources/index.html
+++ /dev/null
@@ -1,434 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resources | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Resources
-
-
-
-
- Link to valuable, relevant resources.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/sitemap.xml b/public/docs/sitemap.xml
deleted file mode 100644
index 7c3ae7cd..00000000
--- a/public/docs/sitemap.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
- http://localhost:1313/docs/user-guides/
- 2023-09-07T16:06:50+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/docs/reference/
- 2023-09-07T16:12:37+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/docs/resources/
- 2024-02-27T09:30:56+01:00
- monthly
- 0.5
-
-
- http://localhost:1313/docs/user-guides/example-guide/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
- http://localhost:1313/docs/reference/example-reference/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/docs/user-guides/example-guide/index.html b/public/docs/user-guides/example-guide/index.html
deleted file mode 100644
index 21217535..00000000
--- a/public/docs/user-guides/example-guide/index.html
+++ /dev/null
@@ -1,460 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/user-guides/index.html b/public/docs/user-guides/index.html
deleted file mode 100644
index 4e23c4c2..00000000
--- a/public/docs/user-guides/index.html
+++ /dev/null
@@ -1,376 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guides | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/docs/user-guides/index.xml b/public/docs/user-guides/index.xml
deleted file mode 100644
index 2e81b555..00000000
--- a/public/docs/user-guides/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guides on WTH Docs Lab
- http://localhost:1313/docs/user-guides/
- Recent content in Guides on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/docs/user-guides/example-guide/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/docs/user-guides/example-guide/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/docs/user-guides/sitemap.xml b/public/docs/user-guides/sitemap.xml
deleted file mode 100644
index 750615e3..00000000
--- a/public/docs/user-guides/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/docs/user-guides/example-guide/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/favicon-192x192.png b/public/favicon-192x192.png
deleted file mode 100644
index 0fb7226e..00000000
Binary files a/public/favicon-192x192.png and /dev/null differ
diff --git a/public/favicon-512x512.png b/public/favicon-512x512.png
deleted file mode 100644
index 84a8eea1..00000000
Binary files a/public/favicon-512x512.png and /dev/null differ
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index 2d14bad8..00000000
Binary files a/public/favicon.ico and /dev/null differ
diff --git a/public/favicon.svg b/public/favicon.svg
deleted file mode 100644
index 4631bc53..00000000
--- a/public/favicon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/fonts/vendor/jost/jost-v4-latin-500.woff b/public/fonts/vendor/jost/jost-v4-latin-500.woff
deleted file mode 100644
index eab8d1b6..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-500.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-500.woff2 b/public/fonts/vendor/jost/jost-v4-latin-500.woff2
deleted file mode 100644
index 92349d19..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-500.woff2 and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-500italic.woff b/public/fonts/vendor/jost/jost-v4-latin-500italic.woff
deleted file mode 100644
index 7a8ed959..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-500italic.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-500italic.woff2 b/public/fonts/vendor/jost/jost-v4-latin-500italic.woff2
deleted file mode 100644
index c6b9d56e..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-500italic.woff2 and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-700.woff b/public/fonts/vendor/jost/jost-v4-latin-700.woff
deleted file mode 100644
index 57390f51..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-700.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-700.woff2 b/public/fonts/vendor/jost/jost-v4-latin-700.woff2
deleted file mode 100644
index 584073a8..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-700.woff2 and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-700italic.woff b/public/fonts/vendor/jost/jost-v4-latin-700italic.woff
deleted file mode 100644
index e23eedf0..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-700italic.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-700italic.woff2 b/public/fonts/vendor/jost/jost-v4-latin-700italic.woff2
deleted file mode 100644
index e56d892a..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-700italic.woff2 and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-italic.woff b/public/fonts/vendor/jost/jost-v4-latin-italic.woff
deleted file mode 100644
index 5dcd1115..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-italic.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-italic.woff2 b/public/fonts/vendor/jost/jost-v4-latin-italic.woff2
deleted file mode 100644
index 9346c1d2..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-italic.woff2 and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-regular.woff b/public/fonts/vendor/jost/jost-v4-latin-regular.woff
deleted file mode 100644
index 4f24758d..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-regular.woff and /dev/null differ
diff --git a/public/fonts/vendor/jost/jost-v4-latin-regular.woff2 b/public/fonts/vendor/jost/jost-v4-latin-regular.woff2
deleted file mode 100644
index 7f0bf755..00000000
Binary files a/public/fonts/vendor/jost/jost-v4-latin-regular.woff2 and /dev/null differ
diff --git a/public/guide/getting-started.md/example/index.html b/public/guide/getting-started.md/example/index.html
deleted file mode 100644
index d0a2aca7..00000000
--- a/public/guide/getting-started.md/example/index.html
+++ /dev/null
@@ -1,358 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/getting-started.md/index.html b/public/guide/getting-started.md/index.html
deleted file mode 100644
index 8dd45fb1..00000000
--- a/public/guide/getting-started.md/index.html
+++ /dev/null
@@ -1,310 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guides | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/getting-started.md/index.xml b/public/guide/getting-started.md/index.xml
deleted file mode 100644
index 1b6acd43..00000000
--- a/public/guide/getting-started.md/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guides on My Docs
- http://localhost:1313/guide/getting-started.md/
- Recent content in Guides on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/guide/getting-started.md/example/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/guide/getting-started.md/example/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/guide/getting-started.md/sitemap.xml b/public/guide/getting-started.md/sitemap.xml
deleted file mode 100644
index b695637e..00000000
--- a/public/guide/getting-started.md/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guide/getting-started.md/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guide/getting-started/example/index.html b/public/guide/getting-started/example/index.html
deleted file mode 100644
index e2627a7e..00000000
--- a/public/guide/getting-started/example/index.html
+++ /dev/null
@@ -1,361 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/getting-started/index.html b/public/guide/getting-started/index.html
deleted file mode 100644
index 4f0e5cc3..00000000
--- a/public/guide/getting-started/index.html
+++ /dev/null
@@ -1,313 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Getting Started | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Getting Started
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/getting-started/index.xml b/public/guide/getting-started/index.xml
deleted file mode 100644
index c9cf20c1..00000000
--- a/public/guide/getting-started/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Getting Started on My Docs
- http://localhost:1313/guide/getting-started/
- Recent content in Getting Started on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/guide/getting-started/example/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/guide/getting-started/example/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/guide/getting-started/sitemap.xml b/public/guide/getting-started/sitemap.xml
deleted file mode 100644
index 9cd49b31..00000000
--- a/public/guide/getting-started/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guide/getting-started/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guide/index.html b/public/guide/index.html
deleted file mode 100644
index 988ea367..00000000
--- a/public/guide/index.html
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guide | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Guide
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/index.xml b/public/guide/index.xml
deleted file mode 100644
index ce4aafaf..00000000
--- a/public/guide/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guide on My Docs
- http://localhost:1313/guide/
- Recent content in Guide on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Tue, 27 Feb 2024 09:30:56 +0100
-
- -
-
Resources
- http://localhost:1313/guide/resources/
- Tue, 27 Feb 2024 09:30:56 +0100
- http://localhost:1313/guide/resources/
- <p>Link to valuable, relevant resources.</p>
-
-
-
diff --git a/public/guide/reference/example/index.html b/public/guide/reference/example/index.html
deleted file mode 100644
index 0a7b61b3..00000000
--- a/public/guide/reference/example/index.html
+++ /dev/null
@@ -1,375 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Reference | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Reference
-
-
-
- On this page
-
-
-
-
- Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/reference/index.html b/public/guide/reference/index.html
deleted file mode 100644
index 98eb77c2..00000000
--- a/public/guide/reference/index.html
+++ /dev/null
@@ -1,310 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Reference | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/reference/index.xml b/public/guide/reference/index.xml
deleted file mode 100644
index a3ac52a0..00000000
--- a/public/guide/reference/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Reference on My Docs
- http://localhost:1313/guide/reference/
- Recent content in Reference on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:13:18 +0200
-
- -
-
Example Reference
- http://localhost:1313/guide/reference/example/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/guide/reference/example/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
-
-
diff --git a/public/guide/reference/sitemap.xml b/public/guide/reference/sitemap.xml
deleted file mode 100644
index e7c1f192..00000000
--- a/public/guide/reference/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guide/reference/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guide/resources/index.html b/public/guide/resources/index.html
deleted file mode 100644
index c9ea6ddc..00000000
--- a/public/guide/resources/index.html
+++ /dev/null
@@ -1,335 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resources | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Resources
-
-
-
-
- Link to valuable, relevant resources.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/roadmap/example/index.html b/public/guide/roadmap/example/index.html
deleted file mode 100644
index 0cf1bffe..00000000
--- a/public/guide/roadmap/example/index.html
+++ /dev/null
@@ -1,378 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Reference | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Reference
-
-
-
- On this page
-
-
-
-
- Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/roadmap/index.html b/public/guide/roadmap/index.html
deleted file mode 100644
index cd81f1fd..00000000
--- a/public/guide/roadmap/index.html
+++ /dev/null
@@ -1,313 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Technical Writing Roadmap | My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My Docs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Technical Writing Roadmap
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guide/roadmap/index.xml b/public/guide/roadmap/index.xml
deleted file mode 100644
index b5393974..00000000
--- a/public/guide/roadmap/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Technical Writing Roadmap on My Docs
- http://localhost:1313/guide/roadmap/
- Recent content in Technical Writing Roadmap on My Docs
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:13:18 +0200
-
- -
-
Example Reference
- http://localhost:1313/guide/roadmap/example/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/guide/roadmap/example/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
-
-
diff --git a/public/guide/roadmap/sitemap.xml b/public/guide/roadmap/sitemap.xml
deleted file mode 100644
index b41146a4..00000000
--- a/public/guide/roadmap/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guide/roadmap/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guide/sitemap.xml b/public/guide/sitemap.xml
deleted file mode 100644
index 8d8228ad..00000000
--- a/public/guide/sitemap.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
- http://localhost:1313/guide/getting-started/
- 2023-09-07T16:06:50+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/guide/roadmap/
- 2023-09-07T16:12:37+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/guide/resources/
- 2024-02-27T09:30:56+01:00
- monthly
- 0.5
-
-
- http://localhost:1313/guide/getting-started/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
- http://localhost:1313/guide/roadmap/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guides/getting-started/example/index.html b/public/guides/getting-started/example/index.html
deleted file mode 100644
index 4e002f49..00000000
--- a/public/guides/getting-started/example/index.html
+++ /dev/null
@@ -1,364 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Guide | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Guide
-
-
-
- On this page
-
-
-
-
- Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/getting-started/index.html b/public/guides/getting-started/index.html
deleted file mode 100644
index 556a4640..00000000
--- a/public/guides/getting-started/index.html
+++ /dev/null
@@ -1,317 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Getting Started | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Getting Started
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/getting-started/index.xml b/public/guides/getting-started/index.xml
deleted file mode 100644
index 3722eac5..00000000
--- a/public/guides/getting-started/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Getting Started on WTH Docs Lab
- http://localhost:1313/guides/getting-started/
- Recent content in Getting Started on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:04:48 +0200
-
- -
-
Example Guide
- http://localhost:1313/guides/getting-started/example/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/guides/getting-started/example/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
-
-
diff --git a/public/guides/getting-started/sitemap.xml b/public/guides/getting-started/sitemap.xml
deleted file mode 100644
index a5d60834..00000000
--- a/public/guides/getting-started/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guides/getting-started/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guides/index.html b/public/guides/index.html
deleted file mode 100644
index d1c17668..00000000
--- a/public/guides/index.html
+++ /dev/null
@@ -1,321 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Guides | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Guides
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/index.xml b/public/guides/index.xml
deleted file mode 100644
index 3d2a82f9..00000000
--- a/public/guides/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Guides on WTH Docs Lab
- http://localhost:1313/guides/
- Recent content in Guides on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Tue, 27 Feb 2024 09:30:56 +0100
-
- -
-
Resources
- http://localhost:1313/guides/resources/
- Tue, 27 Feb 2024 09:30:56 +0100
- http://localhost:1313/guides/resources/
- <p>Link to valuable, relevant resources.</p>
-
-
-
diff --git a/public/guides/resources/index.html b/public/guides/resources/index.html
deleted file mode 100644
index 252d9e98..00000000
--- a/public/guides/resources/index.html
+++ /dev/null
@@ -1,338 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resources | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Resources
-
-
-
-
- Link to valuable, relevant resources.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/roadmap/example/index.html b/public/guides/roadmap/example/index.html
deleted file mode 100644
index 56563989..00000000
--- a/public/guides/roadmap/example/index.html
+++ /dev/null
@@ -1,381 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Example Reference | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Example Reference
-
-
-
- On this page
-
-
-
-
- Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.
-Further reading#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/roadmap/index.html b/public/guides/roadmap/index.html
deleted file mode 100644
index 4ec14fba..00000000
--- a/public/guides/roadmap/index.html
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Technical Writing Roadmap | WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Technical Writing Roadmap
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/guides/roadmap/index.xml b/public/guides/roadmap/index.xml
deleted file mode 100644
index 15b449fc..00000000
--- a/public/guides/roadmap/index.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Technical Writing Roadmap on WTH Docs Lab
- http://localhost:1313/guides/roadmap/
- Recent content in Technical Writing Roadmap on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Thu, 07 Sep 2023 16:13:18 +0200
-
- -
-
Example Reference
- http://localhost:1313/guides/roadmap/example/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/guides/roadmap/example/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
-
-
diff --git a/public/guides/roadmap/sitemap.xml b/public/guides/roadmap/sitemap.xml
deleted file mode 100644
index d8826b9f..00000000
--- a/public/guides/roadmap/sitemap.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- http://localhost:1313/guides/roadmap/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/guides/sitemap.xml b/public/guides/sitemap.xml
deleted file mode 100644
index 6d60aa85..00000000
--- a/public/guides/sitemap.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
- http://localhost:1313/guides/getting-started/
- 2023-09-07T16:06:50+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/guides/roadmap/
- 2023-09-07T16:12:37+02:00
- monthly
- 0.5
-
-
-
- http://localhost:1313/guides/resources/
- 2024-02-27T09:30:56+01:00
- monthly
- 0.5
-
-
- http://localhost:1313/guides/getting-started/example/
- 2023-09-07T16:04:48+02:00
- monthly
- 0.5
-
-
- http://localhost:1313/guides/roadmap/example/
- 2023-09-07T16:13:18+02:00
- monthly
- 0.5
-
-
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
deleted file mode 100644
index 19721100..00000000
--- a/public/index.html
+++ /dev/null
@@ -1,342 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Welcome to WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
WTH Docs Lab
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Welcome to WriteTech Hub Docs Lab
-
-
-
Congrats on setting up a new Doks project!
-
Example Guide
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Update content
-
Edit content/_index.md to see this page change.
-
-
-
Add new content
-
Add Markdown files to content to create new pages.
-
-
-
Configure your site
-
Edit your config in config/_default/params.toml.
-
-
-
Read the docs
-
Learn more in the Docs .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/index.xml b/public/index.xml
deleted file mode 100644
index fd794961..00000000
--- a/public/index.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
- Welcome to WriteTech Hub Docs Lab on WTH Docs Lab
- http://localhost:1313/
- Recent content in Welcome to WriteTech Hub Docs Lab on WTH Docs Lab
- Hugo
- en
- Copyright (c) 2020-2024 Thulite
- Tue, 27 Feb 2024 09:30:56 +0100
-
- -
-
Example Post
- http://localhost:1313/blog/example-post/
- Thu, 07 Sep 2023 16:27:22 +0200
- http://localhost:1313/blog/example-post/
- You can use blog posts for announcing product updates and features.
-
- -
-
Example Guide
- http://localhost:1313/docs/user-guides/example-guide/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/docs/user-guides/example-guide/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
- -
-
Example Guide
- http://localhost:1313/guides/getting-started/example/
- Thu, 07 Sep 2023 16:04:48 +0200
- http://localhost:1313/guides/getting-started/example/
- <p>Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. Writing a good guide requires thinking about what your users are trying to do.</p>
-
- -
-
Example Reference
- http://localhost:1313/docs/reference/example-reference/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/docs/reference/example-reference/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
- -
-
Example Reference
- http://localhost:1313/guides/roadmap/example/
- Thu, 07 Sep 2023 16:13:18 +0200
- http://localhost:1313/guides/roadmap/example/
- <p>Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what your documenting.</p>
-
- -
-
Resources
- http://localhost:1313/docs/resources/
- Tue, 27 Feb 2024 09:30:56 +0100
- http://localhost:1313/docs/resources/
- <p>Link to valuable, relevant resources.</p>
-
- -
-
Resources
- http://localhost:1313/guides/resources/
- Tue, 27 Feb 2024 09:30:56 +0100
- http://localhost:1313/guides/resources/
- <p>Link to valuable, relevant resources.</p>
-
- -
-
Privacy Policy
- http://localhost:1313/privacy/
- Thu, 07 Sep 2023 17:19:07 +0200
- http://localhost:1313/privacy/
-
-
-
-
diff --git a/public/js/app.7b88cf6a6db9ea55f31bcfef923244eae6e5de4d1ef6b62094bc3517a040c9ca.js b/public/js/app.7b88cf6a6db9ea55f31bcfef923244eae6e5de4d1ef6b62094bc3517a040c9ca.js
deleted file mode 100644
index 8424ad5b..00000000
--- a/public/js/app.7b88cf6a6db9ea55f31bcfef923244eae6e5de4d1ef6b62094bc3517a040c9ca.js
+++ /dev/null
@@ -1,1610 +0,0 @@
-"use strict";
-(() => {
- var __create = Object.create;
- var __defProp = Object.defineProperty;
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __getProtoOf = Object.getPrototypeOf;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __commonJS = (cb, mod) => function __require() {
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
- };
- var __copyProps = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
- }
- return to;
- };
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
- // If the importer is in node compatibility mode or this is not an ESM
- // file that has been converted to a CommonJS file using a Babel-
- // compatible transform (i.e. "__esModule" has not been set), then set
- // "default" to the CommonJS "module.exports" for node compatibility.
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
- mod
- ));
-
- // node_modules/lazysizes/lazysizes.js
- var require_lazysizes = __commonJS({
- "node_modules/lazysizes/lazysizes.js"(exports, module) {
- (function(window2, factory) {
- var lazySizes2 = factory(window2, window2.document, Date);
- window2.lazySizes = lazySizes2;
- if (typeof module == "object" && module.exports) {
- module.exports = lazySizes2;
- }
- })(
- typeof window != "undefined" ? window : {},
- /**
- * import("./types/global")
- * @typedef { import("./types/lazysizes-config").LazySizesConfigPartial } LazySizesConfigPartial
- */
- function l(window2, document2, Date2) {
- "use strict";
- var lazysizes, lazySizesCfg;
- (function() {
- var prop;
- var lazySizesDefaults = {
- lazyClass: "lazyload",
- loadedClass: "lazyloaded",
- loadingClass: "lazyloading",
- preloadClass: "lazypreload",
- errorClass: "lazyerror",
- //strictClass: 'lazystrict',
- autosizesClass: "lazyautosizes",
- fastLoadedClass: "ls-is-cached",
- iframeLoadMode: 0,
- srcAttr: "data-src",
- srcsetAttr: "data-srcset",
- sizesAttr: "data-sizes",
- //preloadAfterLoad: false,
- minSize: 40,
- customMedia: {},
- init: true,
- expFactor: 1.5,
- hFac: 0.8,
- loadMode: 2,
- loadHidden: true,
- ricTimeout: 0,
- throttleDelay: 125
- };
- lazySizesCfg = window2.lazySizesConfig || window2.lazysizesConfig || {};
- for (prop in lazySizesDefaults) {
- if (!(prop in lazySizesCfg)) {
- lazySizesCfg[prop] = lazySizesDefaults[prop];
- }
- }
- })();
- if (!document2 || !document2.getElementsByClassName) {
- return {
- init: function() {
- },
- /**
- * @type { LazySizesConfigPartial }
- */
- cfg: lazySizesCfg,
- /**
- * @type { true }
- */
- noSupport: true
- };
- }
- var docElem = document2.documentElement;
- var supportPicture = window2.HTMLPictureElement;
- var _addEventListener = "addEventListener";
- var _getAttribute = "getAttribute";
- var addEventListener = window2[_addEventListener].bind(window2);
- var setTimeout2 = window2.setTimeout;
- var requestAnimationFrame = window2.requestAnimationFrame || setTimeout2;
- var requestIdleCallback = window2.requestIdleCallback;
- var regPicture = /^picture$/i;
- var loadEvents = ["load", "error", "lazyincluded", "_lazyloaded"];
- var regClassCache = {};
- var forEach = Array.prototype.forEach;
- var hasClass = function(ele, cls) {
- if (!regClassCache[cls]) {
- regClassCache[cls] = new RegExp("(\\s|^)" + cls + "(\\s|$)");
- }
- return regClassCache[cls].test(ele[_getAttribute]("class") || "") && regClassCache[cls];
- };
- var addClass = function(ele, cls) {
- if (!hasClass(ele, cls)) {
- ele.setAttribute("class", (ele[_getAttribute]("class") || "").trim() + " " + cls);
- }
- };
- var removeClass = function(ele, cls) {
- var reg;
- if (reg = hasClass(ele, cls)) {
- ele.setAttribute("class", (ele[_getAttribute]("class") || "").replace(reg, " "));
- }
- };
- var addRemoveLoadEvents = function(dom, fn, add) {
- var action = add ? _addEventListener : "removeEventListener";
- if (add) {
- addRemoveLoadEvents(dom, fn);
- }
- loadEvents.forEach(function(evt) {
- dom[action](evt, fn);
- });
- };
- var triggerEvent = function(elem, name, detail, noBubbles, noCancelable) {
- var event = document2.createEvent("Event");
- if (!detail) {
- detail = {};
- }
- detail.instance = lazysizes;
- event.initEvent(name, !noBubbles, !noCancelable);
- event.detail = detail;
- elem.dispatchEvent(event);
- return event;
- };
- var updatePolyfill = function(el, full) {
- var polyfill;
- if (!supportPicture && (polyfill = window2.picturefill || lazySizesCfg.pf)) {
- if (full && full.src && !el[_getAttribute]("srcset")) {
- el.setAttribute("srcset", full.src);
- }
- polyfill({ reevaluate: true, elements: [el] });
- } else if (full && full.src) {
- el.src = full.src;
- }
- };
- var getCSS = function(elem, style) {
- return (getComputedStyle(elem, null) || {})[style];
- };
- var getWidth = function(elem, parent, width) {
- width = width || elem.offsetWidth;
- while (width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth) {
- width = parent.offsetWidth;
- parent = parent.parentNode;
- }
- return width;
- };
- var rAF = function() {
- var running, waiting;
- var firstFns = [];
- var secondFns = [];
- var fns = firstFns;
- var run = function() {
- var runFns = fns;
- fns = firstFns.length ? secondFns : firstFns;
- running = true;
- waiting = false;
- while (runFns.length) {
- runFns.shift()();
- }
- running = false;
- };
- var rafBatch = function(fn, queue) {
- if (running && !queue) {
- fn.apply(this, arguments);
- } else {
- fns.push(fn);
- if (!waiting) {
- waiting = true;
- (document2.hidden ? setTimeout2 : requestAnimationFrame)(run);
- }
- }
- };
- rafBatch._lsFlush = run;
- return rafBatch;
- }();
- var rAFIt = function(fn, simple) {
- return simple ? function() {
- rAF(fn);
- } : function() {
- var that = this;
- var args = arguments;
- rAF(function() {
- fn.apply(that, args);
- });
- };
- };
- var throttle = function(fn) {
- var running;
- var lastTime = 0;
- var gDelay = lazySizesCfg.throttleDelay;
- var rICTimeout = lazySizesCfg.ricTimeout;
- var run = function() {
- running = false;
- lastTime = Date2.now();
- fn();
- };
- var idleCallback = requestIdleCallback && rICTimeout > 49 ? function() {
- requestIdleCallback(run, { timeout: rICTimeout });
- if (rICTimeout !== lazySizesCfg.ricTimeout) {
- rICTimeout = lazySizesCfg.ricTimeout;
- }
- } : rAFIt(function() {
- setTimeout2(run);
- }, true);
- return function(isPriority) {
- var delay;
- if (isPriority = isPriority === true) {
- rICTimeout = 33;
- }
- if (running) {
- return;
- }
- running = true;
- delay = gDelay - (Date2.now() - lastTime);
- if (delay < 0) {
- delay = 0;
- }
- if (isPriority || delay < 9) {
- idleCallback();
- } else {
- setTimeout2(idleCallback, delay);
- }
- };
- };
- var debounce = function(func) {
- var timeout, timestamp;
- var wait = 99;
- var run = function() {
- timeout = null;
- func();
- };
- var later = function() {
- var last = Date2.now() - timestamp;
- if (last < wait) {
- setTimeout2(later, wait - last);
- } else {
- (requestIdleCallback || run)(run);
- }
- };
- return function() {
- timestamp = Date2.now();
- if (!timeout) {
- timeout = setTimeout2(later, wait);
- }
- };
- };
- var loader = function() {
- var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;
- var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;
- var regImg = /^img$/i;
- var regIframe = /^iframe$/i;
- var supportScroll = "onscroll" in window2 && !/(gle|ing)bot/.test(navigator.userAgent);
- var shrinkExpand = 0;
- var currentExpand = 0;
- var isLoading = 0;
- var lowRuns = -1;
- var resetPreloading = function(e2) {
- isLoading--;
- if (!e2 || isLoading < 0 || !e2.target) {
- isLoading = 0;
- }
- };
- var isVisible = function(elem) {
- if (isBodyHidden == null) {
- isBodyHidden = getCSS(document2.body, "visibility") == "hidden";
- }
- return isBodyHidden || !(getCSS(elem.parentNode, "visibility") == "hidden" && getCSS(elem, "visibility") == "hidden");
- };
- var isNestedVisible = function(elem, elemExpand) {
- var outerRect;
- var parent = elem;
- var visible = isVisible(elem);
- eLtop -= elemExpand;
- eLbottom += elemExpand;
- eLleft -= elemExpand;
- eLright += elemExpand;
- while (visible && (parent = parent.offsetParent) && parent != document2.body && parent != docElem) {
- visible = (getCSS(parent, "opacity") || 1) > 0;
- if (visible && getCSS(parent, "overflow") != "visible") {
- outerRect = parent.getBoundingClientRect();
- visible = eLright > outerRect.left && eLleft < outerRect.right && eLbottom > outerRect.top - 1 && eLtop < outerRect.bottom + 1;
- }
- }
- return visible;
- };
- var checkElements = function() {
- var eLlen, i3, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal, defaultExpand, preloadExpand, hFac;
- var lazyloadElems = lazysizes.elements;
- if ((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)) {
- i3 = 0;
- lowRuns++;
- for (; i3 < eLlen; i3++) {
- if (!lazyloadElems[i3] || lazyloadElems[i3]._lazyRace) {
- continue;
- }
- if (!supportScroll || lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i3])) {
- unveilElement(lazyloadElems[i3]);
- continue;
- }
- if (!(elemExpandVal = lazyloadElems[i3][_getAttribute]("data-expand")) || !(elemExpand = elemExpandVal * 1)) {
- elemExpand = currentExpand;
- }
- if (!defaultExpand) {
- defaultExpand = !lazySizesCfg.expand || lazySizesCfg.expand < 1 ? docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 : lazySizesCfg.expand;
- lazysizes._defEx = defaultExpand;
- preloadExpand = defaultExpand * lazySizesCfg.expFactor;
- hFac = lazySizesCfg.hFac;
- isBodyHidden = null;
- if (currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document2.hidden) {
- currentExpand = preloadExpand;
- lowRuns = 0;
- } else if (loadMode > 1 && lowRuns > 1 && isLoading < 6) {
- currentExpand = defaultExpand;
- } else {
- currentExpand = shrinkExpand;
- }
- }
- if (beforeExpandVal !== elemExpand) {
- eLvW = innerWidth + elemExpand * hFac;
- elvH = innerHeight + elemExpand;
- elemNegativeExpand = elemExpand * -1;
- beforeExpandVal = elemExpand;
- }
- rect = lazyloadElems[i3].getBoundingClientRect();
- if ((eLbottom = rect.bottom) >= elemNegativeExpand && (eLtop = rect.top) <= elvH && (eLright = rect.right) >= elemNegativeExpand * hFac && (eLleft = rect.left) <= eLvW && (eLbottom || eLright || eLleft || eLtop) && (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i3])) && (isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4) || isNestedVisible(lazyloadElems[i3], elemExpand))) {
- unveilElement(lazyloadElems[i3]);
- loadedSomething = true;
- if (isLoading > 9) {
- break;
- }
- } else if (!loadedSomething && isCompleted && !autoLoadElem && isLoading < 4 && lowRuns < 4 && loadMode > 2 && (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && (preloadElems[0] || !elemExpandVal && (eLbottom || eLright || eLleft || eLtop || lazyloadElems[i3][_getAttribute](lazySizesCfg.sizesAttr) != "auto"))) {
- autoLoadElem = preloadElems[0] || lazyloadElems[i3];
- }
- }
- if (autoLoadElem && !loadedSomething) {
- unveilElement(autoLoadElem);
- }
- }
- };
- var throttledCheckElements = throttle(checkElements);
- var switchLoadingClass = function(e2) {
- var elem = e2.target;
- if (elem._lazyCache) {
- delete elem._lazyCache;
- return;
- }
- resetPreloading(e2);
- addClass(elem, lazySizesCfg.loadedClass);
- removeClass(elem, lazySizesCfg.loadingClass);
- addRemoveLoadEvents(elem, rafSwitchLoadingClass);
- triggerEvent(elem, "lazyloaded");
- };
- var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);
- var rafSwitchLoadingClass = function(e2) {
- rafedSwitchLoadingClass({ target: e2.target });
- };
- var changeIframeSrc = function(elem, src) {
- var loadMode2 = elem.getAttribute("data-load-mode") || lazySizesCfg.iframeLoadMode;
- if (loadMode2 == 0) {
- elem.contentWindow.location.replace(src);
- } else if (loadMode2 == 1) {
- elem.src = src;
- }
- };
- var handleSources = function(source) {
- var customMedia;
- var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);
- if (customMedia = lazySizesCfg.customMedia[source[_getAttribute]("data-media") || source[_getAttribute]("media")]) {
- source.setAttribute("media", customMedia);
- }
- if (sourceSrcset) {
- source.setAttribute("srcset", sourceSrcset);
- }
- };
- var lazyUnveil = rAFIt(function(elem, detail, isAuto, sizes, isImg) {
- var src, srcset, parent, isPicture, event, firesLoad;
- if (!(event = triggerEvent(elem, "lazybeforeunveil", detail)).defaultPrevented) {
- if (sizes) {
- if (isAuto) {
- addClass(elem, lazySizesCfg.autosizesClass);
- } else {
- elem.setAttribute("sizes", sizes);
- }
- }
- srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);
- src = elem[_getAttribute](lazySizesCfg.srcAttr);
- if (isImg) {
- parent = elem.parentNode;
- isPicture = parent && regPicture.test(parent.nodeName || "");
- }
- firesLoad = detail.firesLoad || "src" in elem && (srcset || src || isPicture);
- event = { target: elem };
- addClass(elem, lazySizesCfg.loadingClass);
- if (firesLoad) {
- clearTimeout(resetPreloadingTimer);
- resetPreloadingTimer = setTimeout2(resetPreloading, 2500);
- addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);
- }
- if (isPicture) {
- forEach.call(parent.getElementsByTagName("source"), handleSources);
- }
- if (srcset) {
- elem.setAttribute("srcset", srcset);
- } else if (src && !isPicture) {
- if (regIframe.test(elem.nodeName)) {
- changeIframeSrc(elem, src);
- } else {
- elem.src = src;
- }
- }
- if (isImg && (srcset || isPicture)) {
- updatePolyfill(elem, { src });
- }
- }
- if (elem._lazyRace) {
- delete elem._lazyRace;
- }
- removeClass(elem, lazySizesCfg.lazyClass);
- rAF(function() {
- var isLoaded = elem.complete && elem.naturalWidth > 1;
- if (!firesLoad || isLoaded) {
- if (isLoaded) {
- addClass(elem, lazySizesCfg.fastLoadedClass);
- }
- switchLoadingClass(event);
- elem._lazyCache = true;
- setTimeout2(function() {
- if ("_lazyCache" in elem) {
- delete elem._lazyCache;
- }
- }, 9);
- }
- if (elem.loading == "lazy") {
- isLoading--;
- }
- }, true);
- });
- var unveilElement = function(elem) {
- if (elem._lazyRace) {
- return;
- }
- var detail;
- var isImg = regImg.test(elem.nodeName);
- var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]("sizes"));
- var isAuto = sizes == "auto";
- if ((isAuto || !isCompleted) && isImg && (elem[_getAttribute]("src") || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)) {
- return;
- }
- detail = triggerEvent(elem, "lazyunveilread").detail;
- if (isAuto) {
- autoSizer.updateElem(elem, true, elem.offsetWidth);
- }
- elem._lazyRace = true;
- isLoading++;
- lazyUnveil(elem, detail, isAuto, sizes, isImg);
- };
- var afterScroll = debounce(function() {
- lazySizesCfg.loadMode = 3;
- throttledCheckElements();
- });
- var altLoadmodeScrollListner = function() {
- if (lazySizesCfg.loadMode == 3) {
- lazySizesCfg.loadMode = 2;
- }
- afterScroll();
- };
- var onload = function() {
- if (isCompleted) {
- return;
- }
- if (Date2.now() - started < 999) {
- setTimeout2(onload, 999);
- return;
- }
- isCompleted = true;
- lazySizesCfg.loadMode = 3;
- throttledCheckElements();
- addEventListener("scroll", altLoadmodeScrollListner, true);
- };
- return {
- _: function() {
- started = Date2.now();
- lazysizes.elements = document2.getElementsByClassName(lazySizesCfg.lazyClass);
- preloadElems = document2.getElementsByClassName(lazySizesCfg.lazyClass + " " + lazySizesCfg.preloadClass);
- addEventListener("scroll", throttledCheckElements, true);
- addEventListener("resize", throttledCheckElements, true);
- addEventListener("pageshow", function(e2) {
- if (e2.persisted) {
- var loadingElements = document2.querySelectorAll("." + lazySizesCfg.loadingClass);
- if (loadingElements.length && loadingElements.forEach) {
- requestAnimationFrame(function() {
- loadingElements.forEach(function(img) {
- if (img.complete) {
- unveilElement(img);
- }
- });
- });
- }
- }
- });
- if (window2.MutationObserver) {
- new MutationObserver(throttledCheckElements).observe(docElem, { childList: true, subtree: true, attributes: true });
- } else {
- docElem[_addEventListener]("DOMNodeInserted", throttledCheckElements, true);
- docElem[_addEventListener]("DOMAttrModified", throttledCheckElements, true);
- setInterval(throttledCheckElements, 999);
- }
- addEventListener("hashchange", throttledCheckElements, true);
- ["focus", "mouseover", "click", "load", "transitionend", "animationend"].forEach(function(name) {
- document2[_addEventListener](name, throttledCheckElements, true);
- });
- if (/d$|^c/.test(document2.readyState)) {
- onload();
- } else {
- addEventListener("load", onload);
- document2[_addEventListener]("DOMContentLoaded", throttledCheckElements);
- setTimeout2(onload, 2e4);
- }
- if (lazysizes.elements.length) {
- checkElements();
- rAF._lsFlush();
- } else {
- throttledCheckElements();
- }
- },
- checkElems: throttledCheckElements,
- unveil: unveilElement,
- _aLSL: altLoadmodeScrollListner
- };
- }();
- var autoSizer = function() {
- var autosizesElems;
- var sizeElement = rAFIt(function(elem, parent, event, width) {
- var sources, i3, len;
- elem._lazysizesWidth = width;
- width += "px";
- elem.setAttribute("sizes", width);
- if (regPicture.test(parent.nodeName || "")) {
- sources = parent.getElementsByTagName("source");
- for (i3 = 0, len = sources.length; i3 < len; i3++) {
- sources[i3].setAttribute("sizes", width);
- }
- }
- if (!event.detail.dataAttr) {
- updatePolyfill(elem, event.detail);
- }
- });
- var getSizeElement = function(elem, dataAttr, width) {
- var event;
- var parent = elem.parentNode;
- if (parent) {
- width = getWidth(elem, parent, width);
- event = triggerEvent(elem, "lazybeforesizes", { width, dataAttr: !!dataAttr });
- if (!event.defaultPrevented) {
- width = event.detail.width;
- if (width && width !== elem._lazysizesWidth) {
- sizeElement(elem, parent, event, width);
- }
- }
- }
- };
- var updateElementsSizes = function() {
- var i3;
- var len = autosizesElems.length;
- if (len) {
- i3 = 0;
- for (; i3 < len; i3++) {
- getSizeElement(autosizesElems[i3]);
- }
- }
- };
- var debouncedUpdateElementsSizes = debounce(updateElementsSizes);
- return {
- _: function() {
- autosizesElems = document2.getElementsByClassName(lazySizesCfg.autosizesClass);
- addEventListener("resize", debouncedUpdateElementsSizes);
- },
- checkElems: debouncedUpdateElementsSizes,
- updateElem: getSizeElement
- };
- }();
- var init = function() {
- if (!init.i && document2.getElementsByClassName) {
- init.i = true;
- autoSizer._();
- loader._();
- }
- };
- setTimeout2(function() {
- if (lazySizesCfg.init) {
- init();
- }
- });
- lazysizes = {
- /**
- * @type { LazySizesConfigPartial }
- */
- cfg: lazySizesCfg,
- autoSizer,
- loader,
- init,
- uP: updatePolyfill,
- aC: addClass,
- rC: removeClass,
- hC: hasClass,
- fire: triggerEvent,
- gW: getWidth,
- rAF
- };
- return lazysizes;
- }
- );
- }
- });
-
- // node_modules/lazysizes/plugins/native-loading/ls.native-loading.js
- var require_ls_native_loading = __commonJS({
- "node_modules/lazysizes/plugins/native-loading/ls.native-loading.js"(exports, module) {
- (function(window2, factory) {
- var globalInstall = function() {
- factory(window2.lazySizes);
- window2.removeEventListener("lazyunveilread", globalInstall, true);
- };
- factory = factory.bind(null, window2, window2.document);
- if (typeof module == "object" && module.exports) {
- factory(require_lazysizes());
- } else if (typeof define == "function" && define.amd) {
- define(["lazysizes"], factory);
- } else if (window2.lazySizes) {
- globalInstall();
- } else {
- window2.addEventListener("lazyunveilread", globalInstall, true);
- }
- })(window, function(window2, document2, lazySizes2) {
- "use strict";
- var imgSupport = "loading" in HTMLImageElement.prototype;
- var iframeSupport = "loading" in HTMLIFrameElement.prototype;
- var isConfigSet = false;
- var oldPrematureUnveil = lazySizes2.prematureUnveil;
- var cfg = lazySizes2.cfg;
- var listenerMap = {
- focus: 1,
- mouseover: 1,
- click: 1,
- load: 1,
- transitionend: 1,
- animationend: 1,
- scroll: 1,
- resize: 1
- };
- if (!cfg.nativeLoading) {
- cfg.nativeLoading = {};
- }
- if (!window2.addEventListener || !window2.MutationObserver || !imgSupport && !iframeSupport) {
- return;
- }
- function disableEvents() {
- var loader = lazySizes2.loader;
- var throttledCheckElements = loader.checkElems;
- var removeALSL = function() {
- setTimeout(function() {
- window2.removeEventListener("scroll", loader._aLSL, true);
- }, 1e3);
- };
- var currentListenerMap = typeof cfg.nativeLoading.disableListeners == "object" ? cfg.nativeLoading.disableListeners : listenerMap;
- if (currentListenerMap.scroll) {
- window2.addEventListener("load", removeALSL);
- removeALSL();
- window2.removeEventListener("scroll", throttledCheckElements, true);
- }
- if (currentListenerMap.resize) {
- window2.removeEventListener("resize", throttledCheckElements, true);
- }
- Object.keys(currentListenerMap).forEach(function(name) {
- if (currentListenerMap[name]) {
- document2.removeEventListener(name, throttledCheckElements, true);
- }
- });
- }
- function runConfig() {
- if (isConfigSet) {
- return;
- }
- isConfigSet = true;
- if (imgSupport && iframeSupport && cfg.nativeLoading.disableListeners) {
- if (cfg.nativeLoading.disableListeners === true) {
- cfg.nativeLoading.setLoadingAttribute = true;
- }
- disableEvents();
- }
- if (cfg.nativeLoading.setLoadingAttribute) {
- window2.addEventListener("lazybeforeunveil", function(e2) {
- var element = e2.target;
- if ("loading" in element && !element.getAttribute("loading")) {
- element.setAttribute("loading", "lazy");
- }
- }, true);
- }
- }
- lazySizes2.prematureUnveil = function prematureUnveil(element) {
- if (!isConfigSet) {
- runConfig();
- }
- if ("loading" in element && (cfg.nativeLoading.setLoadingAttribute || element.getAttribute("loading")) && (element.getAttribute("data-sizes") != "auto" || element.offsetWidth)) {
- return true;
- }
- if (oldPrematureUnveil) {
- return oldPrematureUnveil(element);
- }
- };
- });
- }
- });
-
- // node_modules/clipboard/dist/clipboard.js
- var require_clipboard = __commonJS({
- "node_modules/clipboard/dist/clipboard.js"(exports, module) {
- (function webpackUniversalModuleDefinition(root, factory) {
- if (typeof exports === "object" && typeof module === "object")
- module.exports = factory();
- else if (typeof define === "function" && define.amd)
- define([], factory);
- else if (typeof exports === "object")
- exports["ClipboardJS"] = factory();
- else
- root["ClipboardJS"] = factory();
- })(exports, function() {
- return (
- /******/
- function() {
- var __webpack_modules__ = {
- /***/
- 686: (
- /***/
- function(__unused_webpack_module, __webpack_exports__, __webpack_require__2) {
- "use strict";
- __webpack_require__2.d(__webpack_exports__, {
- "default": function() {
- return (
- /* binding */
- clipboard
- );
- }
- });
- var tiny_emitter = __webpack_require__2(279);
- var tiny_emitter_default = /* @__PURE__ */ __webpack_require__2.n(tiny_emitter);
- var listen = __webpack_require__2(370);
- var listen_default = /* @__PURE__ */ __webpack_require__2.n(listen);
- var src_select = __webpack_require__2(817);
- var select_default = /* @__PURE__ */ __webpack_require__2.n(src_select);
- ;
- function command(type) {
- try {
- return document.execCommand(type);
- } catch (err) {
- return false;
- }
- }
- ;
- var ClipboardActionCut = function ClipboardActionCut2(target) {
- var selectedText = select_default()(target);
- command("cut");
- return selectedText;
- };
- var actions_cut = ClipboardActionCut;
- ;
- function createFakeElement(value) {
- var isRTL = document.documentElement.getAttribute("dir") === "rtl";
- var fakeElement = document.createElement("textarea");
- fakeElement.style.fontSize = "12pt";
- fakeElement.style.border = "0";
- fakeElement.style.padding = "0";
- fakeElement.style.margin = "0";
- fakeElement.style.position = "absolute";
- fakeElement.style[isRTL ? "right" : "left"] = "-9999px";
- var yPosition = window.pageYOffset || document.documentElement.scrollTop;
- fakeElement.style.top = "".concat(yPosition, "px");
- fakeElement.setAttribute("readonly", "");
- fakeElement.value = value;
- return fakeElement;
- }
- ;
- var fakeCopyAction = function fakeCopyAction2(value, options) {
- var fakeElement = createFakeElement(value);
- options.container.appendChild(fakeElement);
- var selectedText = select_default()(fakeElement);
- command("copy");
- fakeElement.remove();
- return selectedText;
- };
- var ClipboardActionCopy = function ClipboardActionCopy2(target) {
- var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
- container: document.body
- };
- var selectedText = "";
- if (typeof target === "string") {
- selectedText = fakeCopyAction(target, options);
- } else if (target instanceof HTMLInputElement && !["text", "search", "url", "tel", "password"].includes(target === null || target === void 0 ? void 0 : target.type)) {
- selectedText = fakeCopyAction(target.value, options);
- } else {
- selectedText = select_default()(target);
- command("copy");
- }
- return selectedText;
- };
- var actions_copy = ClipboardActionCopy;
- ;
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function _typeof2(obj2) {
- return typeof obj2;
- };
- } else {
- _typeof = function _typeof2(obj2) {
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
- };
- }
- return _typeof(obj);
- }
- var ClipboardActionDefault = function ClipboardActionDefault2() {
- var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
- var _options$action = options.action, action = _options$action === void 0 ? "copy" : _options$action, container = options.container, target = options.target, text = options.text;
- if (action !== "copy" && action !== "cut") {
- throw new Error('Invalid "action" value, use either "copy" or "cut"');
- }
- if (target !== void 0) {
- if (target && _typeof(target) === "object" && target.nodeType === 1) {
- if (action === "copy" && target.hasAttribute("disabled")) {
- throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
- }
- if (action === "cut" && (target.hasAttribute("readonly") || target.hasAttribute("disabled"))) {
- throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);
- }
- } else {
- throw new Error('Invalid "target" value, use a valid Element');
- }
- }
- if (text) {
- return actions_copy(text, {
- container
- });
- }
- if (target) {
- return action === "cut" ? actions_cut(target) : actions_copy(target, {
- container
- });
- }
- };
- var actions_default = ClipboardActionDefault;
- ;
- function clipboard_typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- clipboard_typeof = function _typeof2(obj2) {
- return typeof obj2;
- };
- } else {
- clipboard_typeof = function _typeof2(obj2) {
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
- };
- }
- return clipboard_typeof(obj);
- }
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
- function _defineProperties(target, props) {
- for (var i3 = 0; i3 < props.length; i3++) {
- var descriptor = props[i3];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function");
- }
- subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });
- if (superClass) _setPrototypeOf(subClass, superClass);
- }
- function _setPrototypeOf(o2, p) {
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o3, p2) {
- o3.__proto__ = p2;
- return o3;
- };
- return _setPrototypeOf(o2, p);
- }
- function _createSuper(Derived) {
- var hasNativeReflectConstruct = _isNativeReflectConstruct();
- return function _createSuperInternal() {
- var Super = _getPrototypeOf(Derived), result;
- if (hasNativeReflectConstruct) {
- var NewTarget = _getPrototypeOf(this).constructor;
- result = Reflect.construct(Super, arguments, NewTarget);
- } else {
- result = Super.apply(this, arguments);
- }
- return _possibleConstructorReturn(this, result);
- };
- }
- function _possibleConstructorReturn(self, call) {
- if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) {
- return call;
- }
- return _assertThisInitialized(self);
- }
- function _assertThisInitialized(self) {
- if (self === void 0) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
- return self;
- }
- function _isNativeReflectConstruct() {
- if (typeof Reflect === "undefined" || !Reflect.construct) return false;
- if (Reflect.construct.sham) return false;
- if (typeof Proxy === "function") return true;
- try {
- Date.prototype.toString.call(Reflect.construct(Date, [], function() {
- }));
- return true;
- } catch (e2) {
- return false;
- }
- }
- function _getPrototypeOf(o2) {
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o3) {
- return o3.__proto__ || Object.getPrototypeOf(o3);
- };
- return _getPrototypeOf(o2);
- }
- function getAttributeValue(suffix, element) {
- var attribute = "data-clipboard-".concat(suffix);
- if (!element.hasAttribute(attribute)) {
- return;
- }
- return element.getAttribute(attribute);
- }
- var Clipboard2 = /* @__PURE__ */ function(_Emitter) {
- _inherits(Clipboard3, _Emitter);
- var _super = _createSuper(Clipboard3);
- function Clipboard3(trigger, options) {
- var _this;
- _classCallCheck(this, Clipboard3);
- _this = _super.call(this);
- _this.resolveOptions(options);
- _this.listenClick(trigger);
- return _this;
- }
- _createClass(Clipboard3, [{
- key: "resolveOptions",
- value: function resolveOptions() {
- var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
- this.action = typeof options.action === "function" ? options.action : this.defaultAction;
- this.target = typeof options.target === "function" ? options.target : this.defaultTarget;
- this.text = typeof options.text === "function" ? options.text : this.defaultText;
- this.container = clipboard_typeof(options.container) === "object" ? options.container : document.body;
- }
- /**
- * Adds a click event listener to the passed trigger.
- * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
- */
- }, {
- key: "listenClick",
- value: function listenClick(trigger) {
- var _this2 = this;
- this.listener = listen_default()(trigger, "click", function(e2) {
- return _this2.onClick(e2);
- });
- }
- /**
- * Defines a new `ClipboardAction` on each click event.
- * @param {Event} e
- */
- }, {
- key: "onClick",
- value: function onClick(e2) {
- var trigger = e2.delegateTarget || e2.currentTarget;
- var action = this.action(trigger) || "copy";
- var text = actions_default({
- action,
- container: this.container,
- target: this.target(trigger),
- text: this.text(trigger)
- });
- this.emit(text ? "success" : "error", {
- action,
- text,
- trigger,
- clearSelection: function clearSelection() {
- if (trigger) {
- trigger.focus();
- }
- window.getSelection().removeAllRanges();
- }
- });
- }
- /**
- * Default `action` lookup function.
- * @param {Element} trigger
- */
- }, {
- key: "defaultAction",
- value: function defaultAction(trigger) {
- return getAttributeValue("action", trigger);
- }
- /**
- * Default `target` lookup function.
- * @param {Element} trigger
- */
- }, {
- key: "defaultTarget",
- value: function defaultTarget(trigger) {
- var selector = getAttributeValue("target", trigger);
- if (selector) {
- return document.querySelector(selector);
- }
- }
- /**
- * Allow fire programmatically a copy action
- * @param {String|HTMLElement} target
- * @param {Object} options
- * @returns Text copied.
- */
- }, {
- key: "defaultText",
- /**
- * Default `text` lookup function.
- * @param {Element} trigger
- */
- value: function defaultText(trigger) {
- return getAttributeValue("text", trigger);
- }
- /**
- * Destroy lifecycle.
- */
- }, {
- key: "destroy",
- value: function destroy() {
- this.listener.destroy();
- }
- }], [{
- key: "copy",
- value: function copy(target) {
- var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
- container: document.body
- };
- return actions_copy(target, options);
- }
- /**
- * Allow fire programmatically a cut action
- * @param {String|HTMLElement} target
- * @returns Text cutted.
- */
- }, {
- key: "cut",
- value: function cut(target) {
- return actions_cut(target);
- }
- /**
- * Returns the support of the given action, or all actions if no action is
- * given.
- * @param {String} [action]
- */
- }, {
- key: "isSupported",
- value: function isSupported() {
- var action = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ["copy", "cut"];
- var actions = typeof action === "string" ? [action] : action;
- var support = !!document.queryCommandSupported;
- actions.forEach(function(action2) {
- support = support && !!document.queryCommandSupported(action2);
- });
- return support;
- }
- }]);
- return Clipboard3;
- }(tiny_emitter_default());
- var clipboard = Clipboard2;
- }
- ),
- /***/
- 828: (
- /***/
- function(module2) {
- var DOCUMENT_NODE_TYPE = 9;
- if (typeof Element !== "undefined" && !Element.prototype.matches) {
- var proto = Element.prototype;
- proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector;
- }
- function closest(element, selector) {
- while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
- if (typeof element.matches === "function" && element.matches(selector)) {
- return element;
- }
- element = element.parentNode;
- }
- }
- module2.exports = closest;
- }
- ),
- /***/
- 438: (
- /***/
- function(module2, __unused_webpack_exports, __webpack_require__2) {
- var closest = __webpack_require__2(828);
- function _delegate(element, selector, type, callback, useCapture) {
- var listenerFn = listener.apply(this, arguments);
- element.addEventListener(type, listenerFn, useCapture);
- return {
- destroy: function() {
- element.removeEventListener(type, listenerFn, useCapture);
- }
- };
- }
- function delegate(elements, selector, type, callback, useCapture) {
- if (typeof elements.addEventListener === "function") {
- return _delegate.apply(null, arguments);
- }
- if (typeof type === "function") {
- return _delegate.bind(null, document).apply(null, arguments);
- }
- if (typeof elements === "string") {
- elements = document.querySelectorAll(elements);
- }
- return Array.prototype.map.call(elements, function(element) {
- return _delegate(element, selector, type, callback, useCapture);
- });
- }
- function listener(element, selector, type, callback) {
- return function(e2) {
- e2.delegateTarget = closest(e2.target, selector);
- if (e2.delegateTarget) {
- callback.call(element, e2);
- }
- };
- }
- module2.exports = delegate;
- }
- ),
- /***/
- 879: (
- /***/
- function(__unused_webpack_module, exports2) {
- exports2.node = function(value) {
- return value !== void 0 && value instanceof HTMLElement && value.nodeType === 1;
- };
- exports2.nodeList = function(value) {
- var type = Object.prototype.toString.call(value);
- return value !== void 0 && (type === "[object NodeList]" || type === "[object HTMLCollection]") && "length" in value && (value.length === 0 || exports2.node(value[0]));
- };
- exports2.string = function(value) {
- return typeof value === "string" || value instanceof String;
- };
- exports2.fn = function(value) {
- var type = Object.prototype.toString.call(value);
- return type === "[object Function]";
- };
- }
- ),
- /***/
- 370: (
- /***/
- function(module2, __unused_webpack_exports, __webpack_require__2) {
- var is = __webpack_require__2(879);
- var delegate = __webpack_require__2(438);
- function listen(target, type, callback) {
- if (!target && !type && !callback) {
- throw new Error("Missing required arguments");
- }
- if (!is.string(type)) {
- throw new TypeError("Second argument must be a String");
- }
- if (!is.fn(callback)) {
- throw new TypeError("Third argument must be a Function");
- }
- if (is.node(target)) {
- return listenNode(target, type, callback);
- } else if (is.nodeList(target)) {
- return listenNodeList(target, type, callback);
- } else if (is.string(target)) {
- return listenSelector(target, type, callback);
- } else {
- throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
- }
- }
- function listenNode(node, type, callback) {
- node.addEventListener(type, callback);
- return {
- destroy: function() {
- node.removeEventListener(type, callback);
- }
- };
- }
- function listenNodeList(nodeList, type, callback) {
- Array.prototype.forEach.call(nodeList, function(node) {
- node.addEventListener(type, callback);
- });
- return {
- destroy: function() {
- Array.prototype.forEach.call(nodeList, function(node) {
- node.removeEventListener(type, callback);
- });
- }
- };
- }
- function listenSelector(selector, type, callback) {
- return delegate(document.body, selector, type, callback);
- }
- module2.exports = listen;
- }
- ),
- /***/
- 817: (
- /***/
- function(module2) {
- function select(element) {
- var selectedText;
- if (element.nodeName === "SELECT") {
- element.focus();
- selectedText = element.value;
- } else if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {
- var isReadOnly = element.hasAttribute("readonly");
- if (!isReadOnly) {
- element.setAttribute("readonly", "");
- }
- element.select();
- element.setSelectionRange(0, element.value.length);
- if (!isReadOnly) {
- element.removeAttribute("readonly");
- }
- selectedText = element.value;
- } else {
- if (element.hasAttribute("contenteditable")) {
- element.focus();
- }
- var selection = window.getSelection();
- var range = document.createRange();
- range.selectNodeContents(element);
- selection.removeAllRanges();
- selection.addRange(range);
- selectedText = selection.toString();
- }
- return selectedText;
- }
- module2.exports = select;
- }
- ),
- /***/
- 279: (
- /***/
- function(module2) {
- function E() {
- }
- E.prototype = {
- on: function(name, callback, ctx) {
- var e2 = this.e || (this.e = {});
- (e2[name] || (e2[name] = [])).push({
- fn: callback,
- ctx
- });
- return this;
- },
- once: function(name, callback, ctx) {
- var self = this;
- function listener() {
- self.off(name, listener);
- callback.apply(ctx, arguments);
- }
- ;
- listener._ = callback;
- return this.on(name, listener, ctx);
- },
- emit: function(name) {
- var data = [].slice.call(arguments, 1);
- var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
- var i3 = 0;
- var len = evtArr.length;
- for (i3; i3 < len; i3++) {
- evtArr[i3].fn.apply(evtArr[i3].ctx, data);
- }
- return this;
- },
- off: function(name, callback) {
- var e2 = this.e || (this.e = {});
- var evts = e2[name];
- var liveEvents = [];
- if (evts && callback) {
- for (var i3 = 0, len = evts.length; i3 < len; i3++) {
- if (evts[i3].fn !== callback && evts[i3].fn._ !== callback)
- liveEvents.push(evts[i3]);
- }
- }
- liveEvents.length ? e2[name] = liveEvents : delete e2[name];
- return this;
- }
- };
- module2.exports = E;
- module2.exports.TinyEmitter = E;
- }
- )
- /******/
- };
- var __webpack_module_cache__ = {};
- function __webpack_require__(moduleId) {
- if (__webpack_module_cache__[moduleId]) {
- return __webpack_module_cache__[moduleId].exports;
- }
- var module2 = __webpack_module_cache__[moduleId] = {
- /******/
- // no module.id needed
- /******/
- // no module.loaded needed
- /******/
- exports: {}
- /******/
- };
- __webpack_modules__[moduleId](module2, module2.exports, __webpack_require__);
- return module2.exports;
- }
- !function() {
- __webpack_require__.n = function(module2) {
- var getter = module2 && module2.__esModule ? (
- /******/
- function() {
- return module2["default"];
- }
- ) : (
- /******/
- function() {
- return module2;
- }
- );
- __webpack_require__.d(getter, { a: getter });
- return getter;
- };
- }();
- !function() {
- __webpack_require__.d = function(exports2, definition) {
- for (var key in definition) {
- if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports2, key)) {
- Object.defineProperty(exports2, key, { enumerable: true, get: definition[key] });
- }
- }
- };
- }();
- !function() {
- __webpack_require__.o = function(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
- };
- }();
- return __webpack_require__(686);
- }().default
- );
- });
- }
- });
-
- // node_modules/quicklink/dist/quicklink.mjs
- function e(e2) {
- return new Promise(function(n2, r2, t2) {
- (t2 = new XMLHttpRequest()).open("GET", e2, t2.withCredentials = true), t2.onload = function() {
- 200 === t2.status ? n2() : r2();
- }, t2.send();
- });
- }
- var n;
- var r = (n = document.createElement("link")).relList && n.relList.supports && n.relList.supports("prefetch") ? function(e2) {
- return new Promise(function(n2, r2, t2) {
- (t2 = document.createElement("link")).rel = "prefetch", t2.href = e2, t2.onload = n2, t2.onerror = r2, document.head.appendChild(t2);
- });
- } : e;
- var t = window.requestIdleCallback || function(e2) {
- var n2 = Date.now();
- return setTimeout(function() {
- e2({ didTimeout: false, timeRemaining: function() {
- return Math.max(0, 50 - (Date.now() - n2));
- } });
- }, 1);
- };
- var o = /* @__PURE__ */ new Set();
- var i = /* @__PURE__ */ new Set();
- var c = false;
- function a(e2) {
- if (e2) {
- if (e2.saveData) return new Error("Save-Data is enabled");
- if (/2g/.test(e2.effectiveType)) return new Error("network conditions are poor");
- }
- return true;
- }
- function u(e2) {
- if (e2 || (e2 = {}), window.IntersectionObserver) {
- var n2 = function(e3) {
- e3 = e3 || 1;
- var n3 = [], r3 = 0;
- function t2() {
- r3 < e3 && n3.length > 0 && (n3.shift()(), r3++);
- }
- return [function(e4) {
- n3.push(e4) > 1 || t2();
- }, function() {
- r3--, t2();
- }];
- }(e2.throttle || 1 / 0), r2 = n2[0], a2 = n2[1], u2 = e2.limit || 1 / 0, l = e2.origins || [location.hostname], d = e2.ignores || [], h = e2.delay || 0, p = [], m = e2.timeoutFn || t, w = "function" == typeof e2.hrefFn && e2.hrefFn, g = e2.prerender || false;
- c = e2.prerenderAndPrefetch || false;
- var v = new IntersectionObserver(function(n3) {
- n3.forEach(function(n4) {
- if (n4.isIntersecting) p.push((n4 = n4.target).href), function(e3, n5) {
- n5 ? setTimeout(e3, n5) : e3();
- }(function() {
- -1 !== p.indexOf(n4.href) && (v.unobserve(n4), (c || g) && i.size < 1 ? f(w ? w(n4) : n4.href).catch(function(n5) {
- if (!e2.onError) throw n5;
- e2.onError(n5);
- }) : o.size < u2 && !g && r2(function() {
- s(w ? w(n4) : n4.href, e2.priority).then(a2).catch(function(n5) {
- a2(), e2.onError && e2.onError(n5);
- });
- }));
- }, h);
- else {
- var t2 = p.indexOf((n4 = n4.target).href);
- t2 > -1 && p.splice(t2);
- }
- });
- }, { threshold: e2.threshold || 0 });
- return m(function() {
- (e2.el || document).querySelectorAll("a").forEach(function(e3) {
- l.length && !l.includes(e3.hostname) || function e4(n3, r3) {
- return Array.isArray(r3) ? r3.some(function(r4) {
- return e4(n3, r4);
- }) : (r3.test || r3).call(r3, n3.href, n3);
- }(e3, d) || v.observe(e3);
- });
- }, { timeout: e2.timeout || 2e3 }), function() {
- o.clear(), v.disconnect();
- };
- }
- }
- function s(n2, t2, u2) {
- var s2 = a(navigator.connection);
- return s2 instanceof Error ? Promise.reject(new Error("Cannot prefetch, " + s2.message)) : (i.size > 0 && !c && console.warn("[Warning] You are using both prefetching and prerendering on the same document"), Promise.all([].concat(n2).map(function(n3) {
- if (!o.has(n3)) return o.add(n3), (t2 ? function(n4) {
- return window.fetch ? fetch(n4, { credentials: "include" }) : e(n4);
- } : r)(new URL(n3, location.href).toString());
- })));
- }
- function f(e2, n2) {
- var r2 = a(navigator.connection);
- if (r2 instanceof Error) return Promise.reject(new Error("Cannot prerender, " + r2.message));
- if (!HTMLScriptElement.supports("speculationrules")) return s(e2), Promise.reject(new Error("This browser does not support the speculation rules API. Falling back to prefetch."));
- if (document.querySelector('script[type="speculationrules"]')) return Promise.reject(new Error("Speculation Rules is already defined and cannot be altered."));
- for (var t2 = 0, u2 = [].concat(e2); t2 < u2.length; t2 += 1) {
- var f2 = u2[t2];
- if (window.location.origin !== new URL(f2, window.location.href).origin) return Promise.reject(new Error("Only same origin URLs are allowed: " + f2));
- i.add(f2);
- }
- o.size > 0 && !c && console.warn("[Warning] You are using both prefetching and prerendering on the same document");
- var l = function(e3) {
- var n3 = document.createElement("script");
- n3.type = "speculationrules", n3.text = '{"prerender":[{"source": "list","urls": ["' + Array.from(e3).join('","') + '"]}]}';
- try {
- document.head.appendChild(n3);
- } catch (e4) {
- return e4;
- }
- return true;
- }(i);
- return true === l ? Promise.resolve() : Promise.reject(l);
- }
-
- // node_modules/@thulite/core/assets/js/core.js
- var import_lazysizes = __toESM(require_lazysizes());
- var import_ls = __toESM(require_ls_native_loading());
- u({
- ignores: [
- /\/api\/?/,
- (uri) => uri.includes(".zip"),
- (uri, elem) => elem.hasAttribute("noprefetch"),
- (uri, elem) => elem.hash && elem.pathname === window.location.pathname
- ]
- });
- import_lazysizes.default.cfg.nativeLoading = {
- setLoadingAttribute: true,
- disableListeners: {
- scroll: true
- }
- };
-
- // ns-hugo-imp:/Users/Jimi/Desktop/Personal/wth-docs-lab/node_modules/@thulite/doks-core/assets/js/clipboard.js
- var import_clipboard = __toESM(require_clipboard());
- (() => {
- "use strict";
- var cb = document.getElementsByClassName("highlight");
- for (var i3 = 0; i3 < cb.length; ++i3) {
- var element = cb[i3];
- element.insertAdjacentHTML("afterbegin", '');
- }
- var clipboard = new import_clipboard.default(".btn-copy", {
- target: function(trigger) {
- return trigger.parentNode.nextElementSibling;
- }
- });
- clipboard.on("success", function(e2) {
- e2.clearSelection();
- });
- clipboard.on("error", function(e2) {
- console.error("Action:", e2.action);
- console.error("Trigger:", e2.trigger);
- });
- })();
-
- // ns-hugo-imp:/Users/Jimi/Desktop/Personal/wth-docs-lab/node_modules/@thulite/doks-core/assets/js/to-top.js
- var topButton = document.getElementById("toTop");
- if (topButton !== null) {
- topButton.classList.remove("fade");
- window.onscroll = function() {
- scrollFunction();
- };
- topButton.addEventListener("click", topFunction);
- }
- function scrollFunction() {
- if (document.body.scrollTop > 270 || document.documentElement.scrollTop > 270) {
- topButton.classList.add("fade");
- } else {
- topButton.classList.remove("fade");
- }
- }
- function topFunction() {
- document.body.scrollTop = 0;
- document.documentElement.scrollTop = 0;
- }
-
- // ns-hugo-imp:/Users/Jimi/Desktop/Personal/wth-docs-lab/node_modules/@thulite/doks-core/assets/js/tabs.js
- var i2;
- var allTabs = document.querySelectorAll("[data-toggle-tab]");
- var allPanes = document.querySelectorAll("[data-pane]");
- function toggleTabs(event) {
- if (event.target) {
- event.preventDefault();
- var clickedTab = event.currentTarget;
- var targetKey = clickedTab.getAttribute("data-toggle-tab");
- } else {
- var targetKey = event;
- }
- if (window.localStorage) {
- window.localStorage.setItem("configLangPref", targetKey);
- }
- var selectedTabs = document.querySelectorAll("[data-toggle-tab=" + targetKey + "]");
- var selectedPanes = document.querySelectorAll("[data-pane=" + targetKey + "]");
- for (var i3 = 0; i3 < allTabs.length; i3++) {
- allTabs[i3].classList.remove("active");
- allPanes[i3].classList.remove("active");
- }
- for (var i3 = 0; i3 < selectedTabs.length; i3++) {
- selectedTabs[i3].classList.add("active");
- selectedPanes[i3].classList.add("show", "active");
- }
- }
- for (i2 = 0; i2 < allTabs.length; i2++) {
- allTabs[i2].addEventListener("click", toggleTabs);
- }
- if (window.localStorage.getItem("configLangPref")) {
- toggleTabs(window.localStorage.getItem("configLangPref"));
- }
-})();
-/*! Bundled license information:
-
-clipboard/dist/clipboard.js:
- (*!
- * clipboard.js v2.0.11
- * https://clipboardjs.com/
- *
- * Licensed MIT © Zeno Rocha
- *)
-
-@thulite/doks-core/assets/js/clipboard.js:
- (*!
- * clipboard.js for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- *)
-*/
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9sYXp5c2l6ZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9wbHVnaW5zL25hdGl2ZS1sb2FkaW5nL2xzLm5hdGl2ZS1sb2FkaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3F1aWNrbGluay9kaXN0L3F1aWNrbGluay5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL0B0aHVsaXRlL2NvcmUvYXNzZXRzL2pzL2NvcmUuanMiLCAibnMtaHVnby1pbXA6L1VzZXJzL0ppbWkvRGVza3RvcC9QZXJzb25hbC93dGgtZG9jcy1sYWIvbm9kZV9tb2R1bGVzL0B0aHVsaXRlL2Rva3MtY29yZS9hc3NldHMvanMvY2xpcGJvYXJkLmpzIiwgIm5zLWh1Z28taW1wOi9Vc2Vycy9KaW1pL0Rlc2t0b3AvUGVyc29uYWwvd3RoLWRvY3MtbGFiL25vZGVfbW9kdWxlcy9AdGh1bGl0ZS9kb2tzLWNvcmUvYXNzZXRzL2pzL3RvLXRvcC5qcyIsICJucy1odWdvLWltcDovVXNlcnMvSmltaS9EZXNrdG9wL1BlcnNvbmFsL3d0aC1kb2NzLWxhYi9ub2RlX21vZHVsZXMvQHRodWxpdGUvZG9rcy1jb3JlL2Fzc2V0cy9qcy90YWJzLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24od2luZG93LCBmYWN0b3J5KSB7XG5cdHZhciBsYXp5U2l6ZXMgPSBmYWN0b3J5KHdpbmRvdywgd2luZG93LmRvY3VtZW50LCBEYXRlKTtcblx0d2luZG93LmxhenlTaXplcyA9IGxhenlTaXplcztcblx0aWYodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyl7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBsYXp5U2l6ZXM7XG5cdH1cbn0odHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/XG4gICAgICB3aW5kb3cgOiB7fSwgXG4vKipcbiAqIGltcG9ydChcIi4vdHlwZXMvZ2xvYmFsXCIpXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vdHlwZXMvbGF6eXNpemVzLWNvbmZpZ1wiKS5MYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH0gTGF6eVNpemVzQ29uZmlnUGFydGlhbFxuICovXG5mdW5jdGlvbiBsKHdpbmRvdywgZG9jdW1lbnQsIERhdGUpIHsgLy8gUGFzcyBpbiB0aGUgd2luZG93IERhdGUgZnVuY3Rpb24gYWxzbyBmb3IgU1NSIGJlY2F1c2UgdGhlIERhdGUgY2xhc3MgY2FuIGJlIGxvc3Rcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuXG5cdHZhciBsYXp5c2l6ZXMsXG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRsYXp5U2l6ZXNDZmc7XG5cblx0KGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHByb3A7XG5cblx0XHR2YXIgbGF6eVNpemVzRGVmYXVsdHMgPSB7XG5cdFx0XHRsYXp5Q2xhc3M6ICdsYXp5bG9hZCcsXG5cdFx0XHRsb2FkZWRDbGFzczogJ2xhenlsb2FkZWQnLFxuXHRcdFx0bG9hZGluZ0NsYXNzOiAnbGF6eWxvYWRpbmcnLFxuXHRcdFx0cHJlbG9hZENsYXNzOiAnbGF6eXByZWxvYWQnLFxuXHRcdFx0ZXJyb3JDbGFzczogJ2xhenllcnJvcicsXG5cdFx0XHQvL3N0cmljdENsYXNzOiAnbGF6eXN0cmljdCcsXG5cdFx0XHRhdXRvc2l6ZXNDbGFzczogJ2xhenlhdXRvc2l6ZXMnLFxuXHRcdFx0ZmFzdExvYWRlZENsYXNzOiAnbHMtaXMtY2FjaGVkJyxcblx0XHRcdGlmcmFtZUxvYWRNb2RlOiAwLFxuXHRcdFx0c3JjQXR0cjogJ2RhdGEtc3JjJyxcblx0XHRcdHNyY3NldEF0dHI6ICdkYXRhLXNyY3NldCcsXG5cdFx0XHRzaXplc0F0dHI6ICdkYXRhLXNpemVzJyxcblx0XHRcdC8vcHJlbG9hZEFmdGVyTG9hZDogZmFsc2UsXG5cdFx0XHRtaW5TaXplOiA0MCxcblx0XHRcdGN1c3RvbU1lZGlhOiB7fSxcblx0XHRcdGluaXQ6IHRydWUsXG5cdFx0XHRleHBGYWN0b3I6IDEuNSxcblx0XHRcdGhGYWM6IDAuOCxcblx0XHRcdGxvYWRNb2RlOiAyLFxuXHRcdFx0bG9hZEhpZGRlbjogdHJ1ZSxcblx0XHRcdHJpY1RpbWVvdXQ6IDAsXG5cdFx0XHR0aHJvdHRsZURlbGF5OiAxMjUsXG5cdFx0fTtcblxuXHRcdGxhenlTaXplc0NmZyA9IHdpbmRvdy5sYXp5U2l6ZXNDb25maWcgfHwgd2luZG93LmxhenlzaXplc0NvbmZpZyB8fCB7fTtcblxuXHRcdGZvcihwcm9wIGluIGxhenlTaXplc0RlZmF1bHRzKXtcblx0XHRcdGlmKCEocHJvcCBpbiBsYXp5U2l6ZXNDZmcpKXtcblx0XHRcdFx0bGF6eVNpemVzQ2ZnW3Byb3BdID0gbGF6eVNpemVzRGVmYXVsdHNbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KSgpO1xuXG5cdGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW5pdDogZnVuY3Rpb24gKCkge30sXG5cdFx0XHQvKipcblx0XHRcdCAqIEB0eXBlIHsgTGF6eVNpemVzQ29uZmlnUGFydGlhbCB9XG5cdFx0XHQgKi9cblx0XHRcdGNmZzogbGF6eVNpemVzQ2ZnLFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAdHlwZSB7IHRydWUgfVxuXHRcdFx0ICovXG5cdFx0XHRub1N1cHBvcnQ6IHRydWUsXG5cdFx0fTtcblx0fVxuXG5cdHZhciBkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdHZhciBzdXBwb3J0UGljdHVyZSA9IHdpbmRvdy5IVE1MUGljdHVyZUVsZW1lbnQ7XG5cblx0dmFyIF9hZGRFdmVudExpc3RlbmVyID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xuXG5cdHZhciBfZ2V0QXR0cmlidXRlID0gJ2dldEF0dHJpYnV0ZSc7XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0byBiaW5kIHRvIHdpbmRvdyBiZWNhdXNlICd0aGlzJyBiZWNvbWVzIG51bGwgZHVyaW5nIFNTUlxuXHQgKiBidWlsZHMuXG5cdCAqL1xuXHR2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IHdpbmRvd1tfYWRkRXZlbnRMaXN0ZW5lcl0uYmluZCh3aW5kb3cpO1xuXG5cdHZhciBzZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQ7XG5cblx0dmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2V0VGltZW91dDtcblxuXHR2YXIgcmVxdWVzdElkbGVDYWxsYmFjayA9IHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrO1xuXG5cdHZhciByZWdQaWN0dXJlID0gL15waWN0dXJlJC9pO1xuXG5cdHZhciBsb2FkRXZlbnRzID0gWydsb2FkJywgJ2Vycm9yJywgJ2xhenlpbmNsdWRlZCcsICdfbGF6eWxvYWRlZCddO1xuXG5cdHZhciByZWdDbGFzc0NhY2hlID0ge307XG5cblx0dmFyIGZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDtcblxuXHQvKipcblx0ICogQHBhcmFtIGVsZSB7RWxlbWVudH1cblx0ICogQHBhcmFtIGNscyB7c3RyaW5nfVxuXHQgKi9cblx0dmFyIGhhc0NsYXNzID0gZnVuY3Rpb24oZWxlLCBjbHMpIHtcblx0XHRpZighcmVnQ2xhc3NDYWNoZVtjbHNdKXtcblx0XHRcdHJlZ0NsYXNzQ2FjaGVbY2xzXSA9IG5ldyBSZWdFeHAoJyhcXFxcc3xeKScrY2xzKycoXFxcXHN8JCknKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ0NsYXNzQ2FjaGVbY2xzXS50ZXN0KGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykgJiYgcmVnQ2xhc3NDYWNoZVtjbHNdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gZWxlIHtFbGVtZW50fVxuXHQgKiBAcGFyYW0gY2xzIHtzdHJpbmd9XG5cdCAqL1xuXHR2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbihlbGUsIGNscykge1xuXHRcdGlmICghaGFzQ2xhc3MoZWxlLCBjbHMpKXtcblx0XHRcdGVsZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykudHJpbSgpICsgJyAnICsgY2xzKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGUge0VsZW1lbnR9XG5cdCAqIEBwYXJhbSBjbHMge3N0cmluZ31cblx0ICovXG5cdHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGVsZSwgY2xzKSB7XG5cdFx0dmFyIHJlZztcblx0XHRpZiAoKHJlZyA9IGhhc0NsYXNzKGVsZSxjbHMpKSkge1xuXHRcdFx0ZWxlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAoZWxlW19nZXRBdHRyaWJ1dGVdKCdjbGFzcycpIHx8ICcnKS5yZXBsYWNlKHJlZywgJyAnKSk7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhZGRSZW1vdmVMb2FkRXZlbnRzID0gZnVuY3Rpb24oZG9tLCBmbiwgYWRkKXtcblx0XHR2YXIgYWN0aW9uID0gYWRkID8gX2FkZEV2ZW50TGlzdGVuZXIgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cdFx0aWYoYWRkKXtcblx0XHRcdGFkZFJlbW92ZUxvYWRFdmVudHMoZG9tLCBmbik7XG5cdFx0fVxuXHRcdGxvYWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldnQpe1xuXHRcdFx0ZG9tW2FjdGlvbl0oZXZ0LCBmbik7XG5cdFx0fSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGVtIHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBuYW1lIHsgc3RyaW5nIH1cblx0ICogQHBhcmFtIGRldGFpbCB7IGFueSB9XG5cdCAqIEBwYXJhbSBub0J1YmJsZXMgeyBib29sZWFuIH1cblx0ICogQHBhcmFtIG5vQ2FuY2VsYWJsZSB7IGJvb2xlYW4gfVxuXHQgKiBAcmV0dXJucyB7IEN1c3RvbUV2ZW50IH1cblx0ICovXG5cdHZhciB0cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbihlbGVtLCBuYW1lLCBkZXRhaWwsIG5vQnViYmxlcywgbm9DYW5jZWxhYmxlKXtcblx0XHR2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblxuXHRcdGlmKCFkZXRhaWwpe1xuXHRcdFx0ZGV0YWlsID0ge307XG5cdFx0fVxuXG5cdFx0ZGV0YWlsLmluc3RhbmNlID0gbGF6eXNpemVzO1xuXG5cdFx0ZXZlbnQuaW5pdEV2ZW50KG5hbWUsICFub0J1YmJsZXMsICFub0NhbmNlbGFibGUpO1xuXG5cdFx0ZXZlbnQuZGV0YWlsID0gZGV0YWlsO1xuXG5cdFx0ZWxlbS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH07XG5cblx0dmFyIHVwZGF0ZVBvbHlmaWxsID0gZnVuY3Rpb24gKGVsLCBmdWxsKXtcblx0XHR2YXIgcG9seWZpbGw7XG5cdFx0aWYoICFzdXBwb3J0UGljdHVyZSAmJiAoIHBvbHlmaWxsID0gKHdpbmRvdy5waWN0dXJlZmlsbCB8fCBsYXp5U2l6ZXNDZmcucGYpICkgKXtcblx0XHRcdGlmKGZ1bGwgJiYgZnVsbC5zcmMgJiYgIWVsW19nZXRBdHRyaWJ1dGVdKCdzcmNzZXQnKSl7XG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZnVsbC5zcmMpO1xuXHRcdFx0fVxuXHRcdFx0cG9seWZpbGwoe3JlZXZhbHVhdGU6IHRydWUsIGVsZW1lbnRzOiBbZWxdfSk7XG5cdFx0fSBlbHNlIGlmKGZ1bGwgJiYgZnVsbC5zcmMpe1xuXHRcdFx0ZWwuc3JjID0gZnVsbC5zcmM7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBnZXRDU1MgPSBmdW5jdGlvbiAoZWxlbSwgc3R5bGUpe1xuXHRcdHJldHVybiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSB8fCB7fSlbc3R5bGVdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbSB7IEVsZW1lbnQgfVxuXHQgKiBAcGFyYW0gcGFyZW50IHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBbd2lkdGhdIHtudW1iZXJ9XG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHR2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbihlbGVtLCBwYXJlbnQsIHdpZHRoKXtcblx0XHR3aWR0aCA9IHdpZHRoIHx8IGVsZW0ub2Zmc2V0V2lkdGg7XG5cblx0XHR3aGlsZSh3aWR0aCA8IGxhenlTaXplc0NmZy5taW5TaXplICYmIHBhcmVudCAmJiAhZWxlbS5fbGF6eXNpemVzV2lkdGgpe1xuXHRcdFx0d2lkdGggPSAgcGFyZW50Lm9mZnNldFdpZHRoO1xuXHRcdFx0cGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpZHRoO1xuXHR9O1xuXG5cdHZhciByQUYgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcnVubmluZywgd2FpdGluZztcblx0XHR2YXIgZmlyc3RGbnMgPSBbXTtcblx0XHR2YXIgc2Vjb25kRm5zID0gW107XG5cdFx0dmFyIGZucyA9IGZpcnN0Rm5zO1xuXG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgcnVuRm5zID0gZm5zO1xuXG5cdFx0XHRmbnMgPSBmaXJzdEZucy5sZW5ndGggPyBzZWNvbmRGbnMgOiBmaXJzdEZucztcblxuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cdFx0XHR3YWl0aW5nID0gZmFsc2U7XG5cblx0XHRcdHdoaWxlKHJ1bkZucy5sZW5ndGgpe1xuXHRcdFx0XHRydW5GbnMuc2hpZnQoKSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHZhciByYWZCYXRjaCA9IGZ1bmN0aW9uKGZuLCBxdWV1ZSl7XG5cdFx0XHRpZihydW5uaW5nICYmICFxdWV1ZSl7XG5cdFx0XHRcdGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbnMucHVzaChmbik7XG5cblx0XHRcdFx0aWYoIXdhaXRpbmcpe1xuXHRcdFx0XHRcdHdhaXRpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdChkb2N1bWVudC5oaWRkZW4gPyBzZXRUaW1lb3V0IDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lKShydW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJhZkJhdGNoLl9sc0ZsdXNoID0gcnVuO1xuXG5cdFx0cmV0dXJuIHJhZkJhdGNoO1xuXHR9KSgpO1xuXG5cdHZhciByQUZJdCA9IGZ1bmN0aW9uKGZuLCBzaW1wbGUpe1xuXHRcdHJldHVybiBzaW1wbGUgP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJBRihmbik7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHZhciB0aGF0ID0gdGhpcztcblx0XHRcdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHRcdGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHQ7XG5cdH07XG5cblx0dmFyIHRocm90dGxlID0gZnVuY3Rpb24oZm4pe1xuXHRcdHZhciBydW5uaW5nO1xuXHRcdHZhciBsYXN0VGltZSA9IDA7XG5cdFx0dmFyIGdEZWxheSA9IGxhenlTaXplc0NmZy50aHJvdHRsZURlbGF5O1xuXHRcdHZhciBySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0XHRsYXN0VGltZSA9IERhdGUubm93KCk7XG5cdFx0XHRmbigpO1xuXHRcdH07XG5cdFx0dmFyIGlkbGVDYWxsYmFjayA9IHJlcXVlc3RJZGxlQ2FsbGJhY2sgJiYgcklDVGltZW91dCA+IDQ5ID9cblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHJlcXVlc3RJZGxlQ2FsbGJhY2socnVuLCB7dGltZW91dDogcklDVGltZW91dH0pO1xuXG5cdFx0XHRcdGlmKHJJQ1RpbWVvdXQgIT09IGxhenlTaXplc0NmZy5yaWNUaW1lb3V0KXtcblx0XHRcdFx0XHRySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gOlxuXHRcdFx0ckFGSXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0c2V0VGltZW91dChydW4pO1xuXHRcdFx0fSwgdHJ1ZSlcblx0XHQ7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oaXNQcmlvcml0eSl7XG5cdFx0XHR2YXIgZGVsYXk7XG5cblx0XHRcdGlmKChpc1ByaW9yaXR5ID0gaXNQcmlvcml0eSA9PT0gdHJ1ZSkpe1xuXHRcdFx0XHRySUNUaW1lb3V0ID0gMzM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHJ1bm5pbmcpe1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJ1bm5pbmcgPSAgdHJ1ZTtcblxuXHRcdFx0ZGVsYXkgPSBnRGVsYXkgLSAoRGF0ZS5ub3coKSAtIGxhc3RUaW1lKTtcblxuXHRcdFx0aWYoZGVsYXkgPCAwKXtcblx0XHRcdFx0ZGVsYXkgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihpc1ByaW9yaXR5IHx8IGRlbGF5IDwgOSl7XG5cdFx0XHRcdGlkbGVDYWxsYmFjaygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0VGltZW91dChpZGxlQ2FsbGJhY2ssIGRlbGF5KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8vYmFzZWQgb24gaHR0cDovL21vZGVybmphdmFzY3JpcHQuYmxvZ3Nwb3QuZGUvMjAxMy8wOC9idWlsZGluZy1iZXR0ZXItZGVib3VuY2UuaHRtbFxuXHR2YXIgZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jKSB7XG5cdFx0dmFyIHRpbWVvdXQsIHRpbWVzdGFtcDtcblx0XHR2YXIgd2FpdCA9IDk5O1xuXHRcdHZhciBydW4gPSBmdW5jdGlvbigpe1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRmdW5jKCk7XG5cdFx0fTtcblx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBsYXN0ID0gRGF0ZS5ub3coKSAtIHRpbWVzdGFtcDtcblxuXHRcdFx0aWYgKGxhc3QgPCB3YWl0KSB7XG5cdFx0XHRcdHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChyZXF1ZXN0SWRsZUNhbGxiYWNrIHx8IHJ1bikocnVuKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0dGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuXHRcdFx0aWYgKCF0aW1lb3V0KSB7XG5cdFx0XHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBsb2FkZXIgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcHJlbG9hZEVsZW1zLCBpc0NvbXBsZXRlZCwgcmVzZXRQcmVsb2FkaW5nVGltZXIsIGxvYWRNb2RlLCBzdGFydGVkO1xuXG5cdFx0dmFyIGVMdlcsIGVsdkgsIGVMdG9wLCBlTGxlZnQsIGVMcmlnaHQsIGVMYm90dG9tLCBpc0JvZHlIaWRkZW47XG5cblx0XHR2YXIgcmVnSW1nID0gL15pbWckL2k7XG5cdFx0dmFyIHJlZ0lmcmFtZSA9IC9eaWZyYW1lJC9pO1xuXG5cdFx0dmFyIHN1cHBvcnRTY3JvbGwgPSAoJ29uc2Nyb2xsJyBpbiB3aW5kb3cpICYmICEoLyhnbGV8aW5nKWJvdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSk7XG5cblx0XHR2YXIgc2hyaW5rRXhwYW5kID0gMDtcblx0XHR2YXIgY3VycmVudEV4cGFuZCA9IDA7XG5cblx0XHR2YXIgaXNMb2FkaW5nID0gMDtcblx0XHR2YXIgbG93UnVucyA9IC0xO1xuXG5cdFx0dmFyIHJlc2V0UHJlbG9hZGluZyA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0aXNMb2FkaW5nLS07XG5cdFx0XHRpZighZSB8fCBpc0xvYWRpbmcgPCAwIHx8ICFlLnRhcmdldCl7XG5cdFx0XHRcdGlzTG9hZGluZyA9IDA7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBpc1Zpc2libGUgPSBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0aWYgKGlzQm9keUhpZGRlbiA9PSBudWxsKSB7XG5cdFx0XHRcdGlzQm9keUhpZGRlbiA9IGdldENTUyhkb2N1bWVudC5ib2R5LCAndmlzaWJpbGl0eScpID09ICdoaWRkZW4nO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaXNCb2R5SGlkZGVuIHx8ICEoZ2V0Q1NTKGVsZW0ucGFyZW50Tm9kZSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyAmJiBnZXRDU1MoZWxlbSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyk7XG5cdFx0fTtcblxuXHRcdHZhciBpc05lc3RlZFZpc2libGUgPSBmdW5jdGlvbihlbGVtLCBlbGVtRXhwYW5kKXtcblx0XHRcdHZhciBvdXRlclJlY3Q7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbTtcblx0XHRcdHZhciB2aXNpYmxlID0gaXNWaXNpYmxlKGVsZW0pO1xuXG5cdFx0XHRlTHRvcCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxib3R0b20gKz0gZWxlbUV4cGFuZDtcblx0XHRcdGVMbGVmdCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxyaWdodCArPSBlbGVtRXhwYW5kO1xuXG5cdFx0XHR3aGlsZSh2aXNpYmxlICYmIChwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50KSAmJiBwYXJlbnQgIT0gZG9jdW1lbnQuYm9keSAmJiBwYXJlbnQgIT0gZG9jRWxlbSl7XG5cdFx0XHRcdHZpc2libGUgPSAoKGdldENTUyhwYXJlbnQsICdvcGFjaXR5JykgfHwgMSkgPiAwKTtcblxuXHRcdFx0XHRpZih2aXNpYmxlICYmIGdldENTUyhwYXJlbnQsICdvdmVyZmxvdycpICE9ICd2aXNpYmxlJyl7XG5cdFx0XHRcdFx0b3V0ZXJSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHZpc2libGUgPSBlTHJpZ2h0ID4gb3V0ZXJSZWN0LmxlZnQgJiZcblx0XHRcdFx0XHRcdGVMbGVmdCA8IG91dGVyUmVjdC5yaWdodCAmJlxuXHRcdFx0XHRcdFx0ZUxib3R0b20gPiBvdXRlclJlY3QudG9wIC0gMSAmJlxuXHRcdFx0XHRcdFx0ZUx0b3AgPCBvdXRlclJlY3QuYm90dG9tICsgMVxuXHRcdFx0XHRcdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmlzaWJsZTtcblx0XHR9O1xuXG5cdFx0dmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBlTGxlbiwgaSwgcmVjdCwgYXV0b0xvYWRFbGVtLCBsb2FkZWRTb21ldGhpbmcsIGVsZW1FeHBhbmQsIGVsZW1OZWdhdGl2ZUV4cGFuZCwgZWxlbUV4cGFuZFZhbCxcblx0XHRcdFx0YmVmb3JlRXhwYW5kVmFsLCBkZWZhdWx0RXhwYW5kLCBwcmVsb2FkRXhwYW5kLCBoRmFjO1xuXHRcdFx0dmFyIGxhenlsb2FkRWxlbXMgPSBsYXp5c2l6ZXMuZWxlbWVudHM7XG5cblx0XHRcdGlmKChsb2FkTW9kZSA9IGxhenlTaXplc0NmZy5sb2FkTW9kZSkgJiYgaXNMb2FkaW5nIDwgOCAmJiAoZUxsZW4gPSBsYXp5bG9hZEVsZW1zLmxlbmd0aCkpe1xuXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGxvd1J1bnMrKztcblxuXHRcdFx0XHRmb3IoOyBpIDwgZUxsZW47IGkrKyl7XG5cblx0XHRcdFx0XHRpZighbGF6eWxvYWRFbGVtc1tpXSB8fCBsYXp5bG9hZEVsZW1zW2ldLl9sYXp5UmFjZSl7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIXN1cHBvcnRTY3JvbGwgfHwgKGxhenlzaXplcy5wcmVtYXR1cmVVbnZlaWwgJiYgbGF6eXNpemVzLnByZW1hdHVyZVVudmVpbChsYXp5bG9hZEVsZW1zW2ldKSkpe3VudmVpbEVsZW1lbnQobGF6eWxvYWRFbGVtc1tpXSk7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIShlbGVtRXhwYW5kVmFsID0gbGF6eWxvYWRFbGVtc1tpXVtfZ2V0QXR0cmlidXRlXSgnZGF0YS1leHBhbmQnKSkgfHwgIShlbGVtRXhwYW5kID0gZWxlbUV4cGFuZFZhbCAqIDEpKXtcblx0XHRcdFx0XHRcdGVsZW1FeHBhbmQgPSBjdXJyZW50RXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghZGVmYXVsdEV4cGFuZCkge1xuXHRcdFx0XHRcdFx0ZGVmYXVsdEV4cGFuZCA9ICghbGF6eVNpemVzQ2ZnLmV4cGFuZCB8fCBsYXp5U2l6ZXNDZmcuZXhwYW5kIDwgMSkgP1xuXHRcdFx0XHRcdFx0XHRkb2NFbGVtLmNsaWVudEhlaWdodCA+IDUwMCAmJiBkb2NFbGVtLmNsaWVudFdpZHRoID4gNTAwID8gNTAwIDogMzcwIDpcblx0XHRcdFx0XHRcdFx0bGF6eVNpemVzQ2ZnLmV4cGFuZDtcblxuXHRcdFx0XHRcdFx0bGF6eXNpemVzLl9kZWZFeCA9IGRlZmF1bHRFeHBhbmQ7XG5cblx0XHRcdFx0XHRcdHByZWxvYWRFeHBhbmQgPSBkZWZhdWx0RXhwYW5kICogbGF6eVNpemVzQ2ZnLmV4cEZhY3Rvcjtcblx0XHRcdFx0XHRcdGhGYWMgPSBsYXp5U2l6ZXNDZmcuaEZhYztcblx0XHRcdFx0XHRcdGlzQm9keUhpZGRlbiA9IG51bGw7XG5cblx0XHRcdFx0XHRcdGlmKGN1cnJlbnRFeHBhbmQgPCBwcmVsb2FkRXhwYW5kICYmIGlzTG9hZGluZyA8IDEgJiYgbG93UnVucyA+IDIgJiYgbG9hZE1vZGUgPiAyICYmICFkb2N1bWVudC5oaWRkZW4pe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gcHJlbG9hZEV4cGFuZDtcblx0XHRcdFx0XHRcdFx0bG93UnVucyA9IDA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYobG9hZE1vZGUgPiAxICYmIGxvd1J1bnMgPiAxICYmIGlzTG9hZGluZyA8IDYpe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gZGVmYXVsdEV4cGFuZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRFeHBhbmQgPSBzaHJpbmtFeHBhbmQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoYmVmb3JlRXhwYW5kVmFsICE9PSBlbGVtRXhwYW5kKXtcblx0XHRcdFx0XHRcdGVMdlcgPSBpbm5lcldpZHRoICsgKGVsZW1FeHBhbmQgKiBoRmFjKTtcblx0XHRcdFx0XHRcdGVsdkggPSBpbm5lckhlaWdodCArIGVsZW1FeHBhbmQ7XG5cdFx0XHRcdFx0XHRlbGVtTmVnYXRpdmVFeHBhbmQgPSBlbGVtRXhwYW5kICogLTE7XG5cdFx0XHRcdFx0XHRiZWZvcmVFeHBhbmRWYWwgPSBlbGVtRXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlY3QgPSBsYXp5bG9hZEVsZW1zW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0XHRcdFx0aWYgKChlTGJvdHRvbSA9IHJlY3QuYm90dG9tKSA+PSBlbGVtTmVnYXRpdmVFeHBhbmQgJiZcblx0XHRcdFx0XHRcdChlTHRvcCA9IHJlY3QudG9wKSA8PSBlbHZIICYmXG5cdFx0XHRcdFx0XHQoZUxyaWdodCA9IHJlY3QucmlnaHQpID49IGVsZW1OZWdhdGl2ZUV4cGFuZCAqIGhGYWMgJiZcblx0XHRcdFx0XHRcdChlTGxlZnQgPSByZWN0LmxlZnQpIDw9IGVMdlcgJiZcblx0XHRcdFx0XHRcdChlTGJvdHRvbSB8fCBlTHJpZ2h0IHx8IGVMbGVmdCB8fCBlTHRvcCkgJiZcblx0XHRcdFx0XHRcdChsYXp5U2l6ZXNDZmcubG9hZEhpZGRlbiB8fCBpc1Zpc2libGUobGF6eWxvYWRFbGVtc1tpXSkpICYmXG5cdFx0XHRcdFx0XHQoKGlzQ29tcGxldGVkICYmIGlzTG9hZGluZyA8IDMgJiYgIWVsZW1FeHBhbmRWYWwgJiYgKGxvYWRNb2RlIDwgMyB8fCBsb3dSdW5zIDwgNCkpIHx8IGlzTmVzdGVkVmlzaWJsZShsYXp5bG9hZEVsZW1zW2ldLCBlbGVtRXhwYW5kKSkpe1xuXHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChsYXp5bG9hZEVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdGxvYWRlZFNvbWV0aGluZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRpZihpc0xvYWRpbmcgPiA5KXticmVhazt9XG5cdFx0XHRcdFx0fSBlbHNlIGlmKCFsb2FkZWRTb21ldGhpbmcgJiYgaXNDb21wbGV0ZWQgJiYgIWF1dG9Mb2FkRWxlbSAmJlxuXHRcdFx0XHRcdFx0aXNMb2FkaW5nIDwgNCAmJiBsb3dSdW5zIDwgNCAmJiBsb2FkTW9kZSA+IDIgJiZcblx0XHRcdFx0XHRcdChwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eVNpemVzQ2ZnLnByZWxvYWRBZnRlckxvYWQpICYmXG5cdFx0XHRcdFx0XHQocHJlbG9hZEVsZW1zWzBdIHx8ICghZWxlbUV4cGFuZFZhbCAmJiAoKGVMYm90dG9tIHx8IGVMcmlnaHQgfHwgZUxsZWZ0IHx8IGVMdG9wKSB8fCBsYXp5bG9hZEVsZW1zW2ldW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpICE9ICdhdXRvJykpKSl7XG5cdFx0XHRcdFx0XHRhdXRvTG9hZEVsZW0gPSBwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eWxvYWRFbGVtc1tpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihhdXRvTG9hZEVsZW0gJiYgIWxvYWRlZFNvbWV0aGluZyl7XG5cdFx0XHRcdFx0dW52ZWlsRWxlbWVudChhdXRvTG9hZEVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0aHJvdHRsZWRDaGVja0VsZW1lbnRzID0gdGhyb3R0bGUoY2hlY2tFbGVtZW50cyk7XG5cblx0XHR2YXIgc3dpdGNoTG9hZGluZ0NsYXNzID0gZnVuY3Rpb24oZSl7XG5cdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xuXG5cdFx0XHRpZiAoZWxlbS5fbGF6eUNhY2hlKSB7XG5cdFx0XHRcdGRlbGV0ZSBlbGVtLl9sYXp5Q2FjaGU7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzZXRQcmVsb2FkaW5nKGUpO1xuXHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxvYWRlZENsYXNzKTtcblx0XHRcdHJlbW92ZUNsYXNzKGVsZW0sIGxhenlTaXplc0NmZy5sb2FkaW5nQ2xhc3MpO1xuXHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdFx0dHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5bG9hZGVkJyk7XG5cdFx0fTtcblx0XHR2YXIgcmFmZWRTd2l0Y2hMb2FkaW5nQ2xhc3MgPSByQUZJdChzd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdHZhciByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MgPSBmdW5jdGlvbihlKXtcblx0XHRcdHJhZmVkU3dpdGNoTG9hZGluZ0NsYXNzKHt0YXJnZXQ6IGUudGFyZ2V0fSk7XG5cdFx0fTtcblxuXHRcdHZhciBjaGFuZ2VJZnJhbWVTcmMgPSBmdW5jdGlvbihlbGVtLCBzcmMpe1xuXHRcdFx0dmFyIGxvYWRNb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9hZC1tb2RlJykgfHwgbGF6eVNpemVzQ2ZnLmlmcmFtZUxvYWRNb2RlO1xuXG5cdFx0XHQvLyBsb2FkTW9kZSBjYW4gYmUgYWxzbyBhIHN0cmluZyFcblx0XHRcdGlmIChsb2FkTW9kZSA9PSAwKSB7XG5cdFx0XHRcdGVsZW0uY29udGVudFdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHNyYyk7XG5cdFx0XHR9IGVsc2UgaWYgKGxvYWRNb2RlID09IDEpIHtcblx0XHRcdFx0ZWxlbS5zcmMgPSBzcmM7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoYW5kbGVTb3VyY2VzID0gZnVuY3Rpb24oc291cmNlKXtcblx0XHRcdHZhciBjdXN0b21NZWRpYTtcblxuXHRcdFx0dmFyIHNvdXJjZVNyY3NldCA9IHNvdXJjZVtfZ2V0QXR0cmlidXRlXShsYXp5U2l6ZXNDZmcuc3Jjc2V0QXR0cik7XG5cblx0XHRcdGlmKCAoY3VzdG9tTWVkaWEgPSBsYXp5U2l6ZXNDZmcuY3VzdG9tTWVkaWFbc291cmNlW19nZXRBdHRyaWJ1dGVdKCdkYXRhLW1lZGlhJykgfHwgc291cmNlW19nZXRBdHRyaWJ1dGVdKCdtZWRpYScpXSkgKXtcblx0XHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBjdXN0b21NZWRpYSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHNvdXJjZVNyY3NldCl7XG5cdFx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIHNvdXJjZVNyY3NldCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBsYXp5VW52ZWlsID0gckFGSXQoZnVuY3Rpb24gKGVsZW0sIGRldGFpbCwgaXNBdXRvLCBzaXplcywgaXNJbWcpe1xuXHRcdFx0dmFyIHNyYywgc3Jjc2V0LCBwYXJlbnQsIGlzUGljdHVyZSwgZXZlbnQsIGZpcmVzTG9hZDtcblxuXHRcdFx0aWYoIShldmVudCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eWJlZm9yZXVudmVpbCcsIGRldGFpbCkpLmRlZmF1bHRQcmV2ZW50ZWQpe1xuXG5cdFx0XHRcdGlmKHNpemVzKXtcblx0XHRcdFx0XHRpZihpc0F1dG8pe1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmF1dG9zaXplc0NsYXNzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgc2l6ZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNyY3NldCA9IGVsZW1bX2dldEF0dHJpYnV0ZV0obGF6eVNpemVzQ2ZnLnNyY3NldEF0dHIpO1xuXHRcdFx0XHRzcmMgPSBlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zcmNBdHRyKTtcblxuXHRcdFx0XHRpZihpc0ltZykge1xuXHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRpc1BpY3R1cmUgPSBwYXJlbnQgJiYgcmVnUGljdHVyZS50ZXN0KHBhcmVudC5ub2RlTmFtZSB8fCAnJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaXJlc0xvYWQgPSBkZXRhaWwuZmlyZXNMb2FkIHx8ICgoJ3NyYycgaW4gZWxlbSkgJiYgKHNyY3NldCB8fCBzcmMgfHwgaXNQaWN0dXJlKSk7XG5cblx0XHRcdFx0ZXZlbnQgPSB7dGFyZ2V0OiBlbGVtfTtcblxuXHRcdFx0XHRhZGRDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcubG9hZGluZ0NsYXNzKTtcblxuXHRcdFx0XHRpZihmaXJlc0xvYWQpe1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dChyZXNldFByZWxvYWRpbmdUaW1lcik7XG5cdFx0XHRcdFx0cmVzZXRQcmVsb2FkaW5nVGltZXIgPSBzZXRUaW1lb3V0KHJlc2V0UHJlbG9hZGluZywgMjUwMCk7XG5cdFx0XHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYoaXNQaWN0dXJlKXtcblx0XHRcdFx0XHRmb3JFYWNoLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzb3VyY2UnKSwgaGFuZGxlU291cmNlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihzcmNzZXQpe1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBzcmNzZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYoc3JjICYmICFpc1BpY3R1cmUpe1xuXHRcdFx0XHRcdGlmKHJlZ0lmcmFtZS50ZXN0KGVsZW0ubm9kZU5hbWUpKXtcblx0XHRcdFx0XHRcdGNoYW5nZUlmcmFtZVNyYyhlbGVtLCBzcmMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNyYyA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihpc0ltZyAmJiAoc3Jjc2V0IHx8IGlzUGljdHVyZSkpe1xuXHRcdFx0XHRcdHVwZGF0ZVBvbHlmaWxsKGVsZW0sIHtzcmM6IHNyY30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmKGVsZW0uX2xhenlSYWNlKXtcblx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlSYWNlO1xuXHRcdFx0fVxuXHRcdFx0cmVtb3ZlQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcyk7XG5cblx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHQvLyBQYXJ0IG9mIHRoaXMgY2FuIGJlIHJlbW92ZWQgYXMgc29vbiBhcyB0aGlzIGZpeCBpcyBvbGRlcjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzczMSAoMjAxNSlcblx0XHRcdFx0dmFyIGlzTG9hZGVkID0gZWxlbS5jb21wbGV0ZSAmJiBlbGVtLm5hdHVyYWxXaWR0aCA+IDE7XG5cblx0XHRcdFx0aWYoICFmaXJlc0xvYWQgfHwgaXNMb2FkZWQpe1xuXHRcdFx0XHRcdGlmIChpc0xvYWRlZCkge1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmZhc3RMb2FkZWRDbGFzcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN3aXRjaExvYWRpbmdDbGFzcyhldmVudCk7XG5cdFx0XHRcdFx0ZWxlbS5fbGF6eUNhY2hlID0gdHJ1ZTtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHRpZiAoJ19sYXp5Q2FjaGUnIGluIGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlDYWNoZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCA5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZWxlbS5sb2FkaW5nID09ICdsYXp5Jykge1xuXHRcdFx0XHRcdGlzTG9hZGluZy0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIGVsZW0geyBFbGVtZW50IH1cblx0XHQgKi9cblx0XHR2YXIgdW52ZWlsRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtKXtcblx0XHRcdGlmIChlbGVtLl9sYXp5UmFjZSkge3JldHVybjt9XG5cdFx0XHR2YXIgZGV0YWlsO1xuXG5cdFx0XHR2YXIgaXNJbWcgPSByZWdJbWcudGVzdChlbGVtLm5vZGVOYW1lKTtcblxuXHRcdFx0Ly9hbGxvdyB1c2luZyBzaXplcz1cImF1dG9cIiwgYnV0IGRvbid0IHVzZS4gaXQncyBpbnZhbGlkLiBVc2UgZGF0YS1zaXplcz1cImF1dG9cIiBvciBhIHZhbGlkIHZhbHVlIGZvciBzaXplcyBpbnN0ZWFkIChpLmUuOiBzaXplcz1cIjgwdndcIilcblx0XHRcdHZhciBzaXplcyA9IGlzSW1nICYmIChlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpIHx8IGVsZW1bX2dldEF0dHJpYnV0ZV0oJ3NpemVzJykpO1xuXHRcdFx0dmFyIGlzQXV0byA9IHNpemVzID09ICdhdXRvJztcblxuXHRcdFx0aWYoIChpc0F1dG8gfHwgIWlzQ29tcGxldGVkKSAmJiBpc0ltZyAmJiAoZWxlbVtfZ2V0QXR0cmlidXRlXSgnc3JjJykgfHwgZWxlbS5zcmNzZXQpICYmICFlbGVtLmNvbXBsZXRlICYmICFoYXNDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcuZXJyb3JDbGFzcykgJiYgaGFzQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcykpe3JldHVybjt9XG5cblx0XHRcdGRldGFpbCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eXVudmVpbHJlYWQnKS5kZXRhaWw7XG5cblx0XHRcdGlmKGlzQXV0byl7XG5cdFx0XHRcdCBhdXRvU2l6ZXIudXBkYXRlRWxlbShlbGVtLCB0cnVlLCBlbGVtLm9mZnNldFdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5fbGF6eVJhY2UgPSB0cnVlO1xuXHRcdFx0aXNMb2FkaW5nKys7XG5cblx0XHRcdGxhenlVbnZlaWwoZWxlbSwgZGV0YWlsLCBpc0F1dG8sIHNpemVzLCBpc0ltZyk7XG5cdFx0fTtcblxuXHRcdHZhciBhZnRlclNjcm9sbCA9IGRlYm91bmNlKGZ1bmN0aW9uKCl7XG5cdFx0XHRsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPSAzO1xuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXHRcdH0pO1xuXG5cdFx0dmFyIGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lciA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRpZihsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPT0gMyl7XG5cdFx0XHRcdGxhenlTaXplc0NmZy5sb2FkTW9kZSA9IDI7XG5cdFx0XHR9XG5cdFx0XHRhZnRlclNjcm9sbCgpO1xuXHRcdH07XG5cblx0XHR2YXIgb25sb2FkID0gZnVuY3Rpb24oKXtcblx0XHRcdGlmKGlzQ29tcGxldGVkKXtyZXR1cm47fVxuXHRcdFx0aWYoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPCA5OTkpe1xuXHRcdFx0XHRzZXRUaW1lb3V0KG9ubG9hZCwgOTk5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cblx0XHRcdGlzQ29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0bGF6eVNpemVzQ2ZnLmxvYWRNb2RlID0gMztcblxuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBhbHRMb2FkbW9kZVNjcm9sbExpc3RuZXIsIHRydWUpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0c3RhcnRlZCA9IERhdGUubm93KCk7XG5cblx0XHRcdFx0bGF6eXNpemVzLmVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzKTtcblx0XHRcdFx0cHJlbG9hZEVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzICsgJyAnICsgbGF6eVNpemVzQ2ZnLnByZWxvYWRDbGFzcyk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncGFnZXNob3cnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGlmIChlLnBlcnNpc3RlZCkge1xuXHRcdFx0XHRcdFx0dmFyIGxvYWRpbmdFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbGF6eVNpemVzQ2ZnLmxvYWRpbmdDbGFzcyk7XG5cblx0XHRcdFx0XHRcdGlmIChsb2FkaW5nRWxlbWVudHMubGVuZ3RoICYmIGxvYWRpbmdFbGVtZW50cy5mb3JFYWNoKSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0bG9hZGluZ0VsZW1lbnRzLmZvckVhY2goIGZ1bmN0aW9uIChpbWcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChpbWcuY29tcGxldGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChpbWcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKXtcblx0XHRcdFx0XHRuZXcgTXV0YXRpb25PYnNlcnZlciggdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyApLm9ic2VydmUoIGRvY0VsZW0sIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWV9ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9jRWxlbVtfYWRkRXZlbnRMaXN0ZW5lcl0oJ0RPTU5vZGVJbnNlcnRlZCcsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHRcdGRvY0VsZW1bX2FkZEV2ZW50TGlzdGVuZXJdKCdET01BdHRyTW9kaWZpZWQnLCB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCB0cnVlKTtcblx0XHRcdFx0XHRzZXRJbnRlcnZhbCh0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCA5OTkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXG5cdFx0XHRcdC8vLCAnZnVsbHNjcmVlbmNoYW5nZSdcblx0XHRcdFx0Wydmb2N1cycsICdtb3VzZW92ZXInLCAnY2xpY2snLCAnbG9hZCcsICd0cmFuc2l0aW9uZW5kJywgJ2FuaW1hdGlvbmVuZCddLmZvckVhY2goZnVuY3Rpb24obmFtZSl7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKG5hbWUsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZigoL2QkfF5jLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKSl7XG5cdFx0XHRcdFx0b25sb2FkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9ubG9hZCk7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKCdET01Db250ZW50TG9hZGVkJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyk7XG5cdFx0XHRcdFx0c2V0VGltZW91dChvbmxvYWQsIDIwMDAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmKGxhenlzaXplcy5lbGVtZW50cy5sZW5ndGgpe1xuXHRcdFx0XHRcdGNoZWNrRWxlbWVudHMoKTtcblx0XHRcdFx0XHRyQUYuX2xzRmx1c2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdHRsZWRDaGVja0VsZW1lbnRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjaGVja0VsZW1zOiB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLFxuXHRcdFx0dW52ZWlsOiB1bnZlaWxFbGVtZW50LFxuXHRcdFx0X2FMU0w6IGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lcixcblx0XHR9O1xuXHR9KSgpO1xuXG5cblx0dmFyIGF1dG9TaXplciA9IChmdW5jdGlvbigpe1xuXHRcdHZhciBhdXRvc2l6ZXNFbGVtcztcblxuXHRcdHZhciBzaXplRWxlbWVudCA9IHJBRkl0KGZ1bmN0aW9uKGVsZW0sIHBhcmVudCwgZXZlbnQsIHdpZHRoKXtcblx0XHRcdHZhciBzb3VyY2VzLCBpLCBsZW47XG5cdFx0XHRlbGVtLl9sYXp5c2l6ZXNXaWR0aCA9IHdpZHRoO1xuXHRcdFx0d2lkdGggKz0gJ3B4JztcblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgd2lkdGgpO1xuXG5cdFx0XHRpZihyZWdQaWN0dXJlLnRlc3QocGFyZW50Lm5vZGVOYW1lIHx8ICcnKSl7XG5cdFx0XHRcdHNvdXJjZXMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NvdXJjZScpO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuXHRcdFx0XHRcdHNvdXJjZXNbaV0uc2V0QXR0cmlidXRlKCdzaXplcycsIHdpZHRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZighZXZlbnQuZGV0YWlsLmRhdGFBdHRyKXtcblx0XHRcdFx0dXBkYXRlUG9seWZpbGwoZWxlbSwgZXZlbnQuZGV0YWlsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBlbGVtIHtFbGVtZW50fVxuXHRcdCAqIEBwYXJhbSBkYXRhQXR0clxuXHRcdCAqIEBwYXJhbSBbd2lkdGhdIHsgbnVtYmVyIH1cblx0XHQgKi9cblx0XHR2YXIgZ2V0U2l6ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbSwgZGF0YUF0dHIsIHdpZHRoKXtcblx0XHRcdHZhciBldmVudDtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmKHBhcmVudCl7XG5cdFx0XHRcdHdpZHRoID0gZ2V0V2lkdGgoZWxlbSwgcGFyZW50LCB3aWR0aCk7XG5cdFx0XHRcdGV2ZW50ID0gdHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5YmVmb3Jlc2l6ZXMnLCB7d2lkdGg6IHdpZHRoLCBkYXRhQXR0cjogISFkYXRhQXR0cn0pO1xuXG5cdFx0XHRcdGlmKCFldmVudC5kZWZhdWx0UHJldmVudGVkKXtcblx0XHRcdFx0XHR3aWR0aCA9IGV2ZW50LmRldGFpbC53aWR0aDtcblxuXHRcdFx0XHRcdGlmKHdpZHRoICYmIHdpZHRoICE9PSBlbGVtLl9sYXp5c2l6ZXNXaWR0aCl7XG5cdFx0XHRcdFx0XHRzaXplRWxlbWVudChlbGVtLCBwYXJlbnQsIGV2ZW50LCB3aWR0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB1cGRhdGVFbGVtZW50c1NpemVzID0gZnVuY3Rpb24oKXtcblx0XHRcdHZhciBpO1xuXHRcdFx0dmFyIGxlbiA9IGF1dG9zaXplc0VsZW1zLmxlbmd0aDtcblx0XHRcdGlmKGxlbil7XG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGZvcig7IGkgPCBsZW47IGkrKyl7XG5cdFx0XHRcdFx0Z2V0U2l6ZUVsZW1lbnQoYXV0b3NpemVzRWxlbXNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBkZWJvdW5jZWRVcGRhdGVFbGVtZW50c1NpemVzID0gZGVib3VuY2UodXBkYXRlRWxlbWVudHNTaXplcyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0YXV0b3NpemVzRWxlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGxhenlTaXplc0NmZy5hdXRvc2l6ZXNDbGFzcyk7XG5cdFx0XHRcdGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMpO1xuXHRcdFx0fSxcblx0XHRcdGNoZWNrRWxlbXM6IGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMsXG5cdFx0XHR1cGRhdGVFbGVtOiBnZXRTaXplRWxlbWVudFxuXHRcdH07XG5cdH0pKCk7XG5cblx0dmFyIGluaXQgPSBmdW5jdGlvbigpe1xuXHRcdGlmKCFpbml0LmkgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSl7XG5cdFx0XHRpbml0LmkgPSB0cnVlO1xuXHRcdFx0YXV0b1NpemVyLl8oKTtcblx0XHRcdGxvYWRlci5fKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRpZihsYXp5U2l6ZXNDZmcuaW5pdCl7XG5cdFx0XHRpbml0KCk7XG5cdFx0fVxuXHR9KTtcblxuXHRsYXp5c2l6ZXMgPSB7XG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRjZmc6IGxhenlTaXplc0NmZyxcblx0XHRhdXRvU2l6ZXI6IGF1dG9TaXplcixcblx0XHRsb2FkZXI6IGxvYWRlcixcblx0XHRpbml0OiBpbml0LFxuXHRcdHVQOiB1cGRhdGVQb2x5ZmlsbCxcblx0XHRhQzogYWRkQ2xhc3MsXG5cdFx0ckM6IHJlbW92ZUNsYXNzLFxuXHRcdGhDOiBoYXNDbGFzcyxcblx0XHRmaXJlOiB0cmlnZ2VyRXZlbnQsXG5cdFx0Z1c6IGdldFdpZHRoLFxuXHRcdHJBRjogckFGLFxuXHR9O1xuXG5cdHJldHVybiBsYXp5c2l6ZXM7XG59XG4pKTtcbiIsICIoZnVuY3Rpb24od2luZG93LCBmYWN0b3J5KSB7XG5cdHZhciBnbG9iYWxJbnN0YWxsID0gZnVuY3Rpb24oKXtcblx0XHRmYWN0b3J5KHdpbmRvdy5sYXp5U2l6ZXMpO1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsYXp5dW52ZWlscmVhZCcsIGdsb2JhbEluc3RhbGwsIHRydWUpO1xuXHR9O1xuXG5cdGZhY3RvcnkgPSBmYWN0b3J5LmJpbmQobnVsbCwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuXG5cdGlmKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpe1xuXHRcdGZhY3RvcnkocmVxdWlyZSgnbGF6eXNpemVzJykpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKFsnbGF6eXNpemVzJ10sIGZhY3RvcnkpO1xuXHR9IGVsc2UgaWYod2luZG93LmxhenlTaXplcykge1xuXHRcdGdsb2JhbEluc3RhbGwoKTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbGF6eXVudmVpbHJlYWQnLCBnbG9iYWxJbnN0YWxsLCB0cnVlKTtcblx0fVxufSh3aW5kb3csIGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGxhenlTaXplcykge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGltZ1N1cHBvcnQgPSAnbG9hZGluZycgaW4gSFRNTEltYWdlRWxlbWVudC5wcm90b3R5cGU7XG5cdHZhciBpZnJhbWVTdXBwb3J0ID0gJ2xvYWRpbmcnIGluIEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZTtcblx0dmFyIGlzQ29uZmlnU2V0ID0gZmFsc2U7XG5cdHZhciBvbGRQcmVtYXR1cmVVbnZlaWwgPSBsYXp5U2l6ZXMucHJlbWF0dXJlVW52ZWlsO1xuXHR2YXIgY2ZnID0gbGF6eVNpemVzLmNmZztcblx0dmFyIGxpc3RlbmVyTWFwID0ge1xuXHRcdGZvY3VzOiAxLFxuXHRcdG1vdXNlb3ZlcjogMSxcblx0XHRjbGljazogMSxcblx0XHRsb2FkOiAxLFxuXHRcdHRyYW5zaXRpb25lbmQ6IDEsXG5cdFx0YW5pbWF0aW9uZW5kOiAxLFxuXHRcdHNjcm9sbDogMSxcblx0XHRyZXNpemU6IDEsXG5cdH07XG5cblx0aWYgKCFjZmcubmF0aXZlTG9hZGluZykge1xuXHRcdGNmZy5uYXRpdmVMb2FkaW5nID0ge307XG5cdH1cblxuXHRpZiAoIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8ICF3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCAoIWltZ1N1cHBvcnQgJiYgIWlmcmFtZVN1cHBvcnQpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZUV2ZW50cygpIHtcblx0XHR2YXIgbG9hZGVyID0gbGF6eVNpemVzLmxvYWRlcjtcblx0XHR2YXIgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyA9IGxvYWRlci5jaGVja0VsZW1zO1xuXHRcdHZhciByZW1vdmVBTFNMID0gZnVuY3Rpb24oKXtcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGxvYWRlci5fYUxTTCwgdHJ1ZSk7XG5cdFx0XHR9LCAxMDAwKTtcblx0XHR9O1xuXHRcdHZhciBjdXJyZW50TGlzdGVuZXJNYXAgPSB0eXBlb2YgY2ZnLm5hdGl2ZUxvYWRpbmcuZGlzYWJsZUxpc3RlbmVycyA9PSAnb2JqZWN0JyA/XG5cdFx0XHRjZmcubmF0aXZlTG9hZGluZy5kaXNhYmxlTGlzdGVuZXJzIDpcblx0XHRcdGxpc3RlbmVyTWFwO1xuXG5cdFx0aWYgKGN1cnJlbnRMaXN0ZW5lck1hcC5zY3JvbGwpIHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVtb3ZlQUxTTCk7XG5cdFx0XHRyZW1vdmVBTFNMKCk7XG5cblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoY3VycmVudExpc3RlbmVyTWFwLnJlc2l6ZSkge1xuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdH1cblxuXHRcdE9iamVjdC5rZXlzKGN1cnJlbnRMaXN0ZW5lck1hcCkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG5cdFx0XHRpZiAoY3VycmVudExpc3RlbmVyTWFwW25hbWVdKSB7XG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBydW5Db25maWcoKSB7XG5cdFx0aWYgKGlzQ29uZmlnU2V0KSB7cmV0dXJuO31cblx0XHRpc0NvbmZpZ1NldCA9IHRydWU7XG5cblx0XHRpZiAoaW1nU3VwcG9ydCAmJiBpZnJhbWVTdXBwb3J0ICYmIGNmZy5uYXRpdmVMb2FkaW5nLmRpc2FibGVMaXN0ZW5lcnMpIHtcblx0XHRcdGlmIChjZmcubmF0aXZlTG9hZGluZy5kaXNhYmxlTGlzdGVuZXJzID09PSB0cnVlKSB7XG5cdFx0XHRcdGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRkaXNhYmxlRXZlbnRzKCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUpIHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsYXp5YmVmb3JldW52ZWlsJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdHZhciBlbGVtZW50ID0gZS50YXJnZXQ7XG5cblx0XHRcdFx0aWYgKCdsb2FkaW5nJyBpbiBlbGVtZW50ICYmICFlbGVtZW50LmdldEF0dHJpYnV0ZSgnbG9hZGluZycpKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnLCAnbGF6eScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRsYXp5U2l6ZXMucHJlbWF0dXJlVW52ZWlsID0gZnVuY3Rpb24gcHJlbWF0dXJlVW52ZWlsKGVsZW1lbnQpIHtcblxuXHRcdGlmICghaXNDb25maWdTZXQpIHtcblx0XHRcdHJ1bkNvbmZpZygpO1xuXHRcdH1cblxuXHRcdGlmICgnbG9hZGluZycgaW4gZWxlbWVudCAmJlxuXHRcdFx0KGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnKSkgJiZcblx0XHRcdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplcycpICE9ICdhdXRvJyB8fCBlbGVtZW50Lm9mZnNldFdpZHRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKG9sZFByZW1hdHVyZVVudmVpbCkge1xuXHRcdFx0cmV0dXJuIG9sZFByZW1hdHVyZVVudmVpbChlbGVtZW50KTtcblx0XHR9XG5cdH07XG5cbn0pKTtcbiIsICIvKiFcbiAqIGNsaXBib2FyZC5qcyB2Mi4wLjExXG4gKiBodHRwczovL2NsaXBib2FyZGpzLmNvbS9cbiAqXG4gKiBMaWNlbnNlZCBNSVQgXHUwMEE5IFplbm8gUm9jaGFcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA2ODY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2xpcGJvYXJkOyB9XG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy90aW55LWVtaXR0ZXIvaW5kZXguanNcbnZhciB0aW55X2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3OSk7XG52YXIgdGlueV9lbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHRpbnlfZW1pdHRlcik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2dvb2QtbGlzdGVuZXIvc3JjL2xpc3Rlbi5qc1xudmFyIGxpc3RlbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcwKTtcbnZhciBsaXN0ZW5fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obGlzdGVuKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc2VsZWN0L3NyYy9zZWxlY3QuanNcbnZhciBzcmNfc2VsZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTcpO1xudmFyIHNlbGVjdF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzcmNfc2VsZWN0KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vY29tbWFuZC5qc1xuLyoqXG4gKiBFeGVjdXRlcyBhIGdpdmVuIG9wZXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmQodHlwZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZCh0eXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9jdXQuanNcblxuXG4vKipcbiAqIEN1dCBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ3V0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uQ3V0KHRhcmdldCkge1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICBjb21tYW5kKCdjdXQnKTtcbiAgcmV0dXJuIHNlbGVjdGVkVGV4dDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGFjdGlvbnNfY3V0ID0gKENsaXBib2FyZEFjdGlvbkN1dCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NyZWF0ZS1mYWtlLWVsZW1lbnQuanNcbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgdGV4dGFyZWEgZWxlbWVudCB3aXRoIGEgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSkge1xuICB2YXIgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7XG4gIHZhciBmYWtlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IC8vIFByZXZlbnQgem9vbWluZyBvbiBpT1NcblxuICBmYWtlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUmVzZXQgYm94IG1vZGVsXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7IC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuXG4gIGZha2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgZmFrZUVsZW1lbnQuc3R5bGVbaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICctOTk5OXB4JzsgLy8gTW92ZSBlbGVtZW50IHRvIHRoZSBzYW1lIHBvc2l0aW9uIHZlcnRpY2FsbHlcblxuICB2YXIgeVBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gIGZha2VFbGVtZW50LnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHlQb3NpdGlvbiwgXCJweFwiKTtcbiAgZmFrZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgZmFrZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIGZha2VFbGVtZW50O1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY29weS5qc1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgZmFrZSBjb3B5IGFjdGlvbiB3cmFwcGVyIHVzaW5nIGEgZmFrZSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgZmFrZUNvcHlBY3Rpb24gPSBmdW5jdGlvbiBmYWtlQ29weUFjdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgZmFrZUVsZW1lbnQgPSBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSk7XG4gIG9wdGlvbnMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZha2VFbGVtZW50KTtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkoZmFrZUVsZW1lbnQpO1xuICBjb21tYW5kKCdjb3B5Jyk7XG4gIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ29weSA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkNvcHkodGFyZ2V0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgY29udGFpbmVyOiBkb2N1bWVudC5ib2R5XG4gIH07XG4gIHZhciBzZWxlY3RlZFRleHQgPSAnJztcblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWxlY3RlZFRleHQgPSBmYWtlQ29weUFjdGlvbih0YXJnZXQsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgIVsndGV4dCcsICdzZWFyY2gnLCAndXJsJywgJ3RlbCcsICdwYXNzd29yZCddLmluY2x1ZGVzKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC50eXBlKSkge1xuICAgIC8vIElmIGlucHV0IHR5cGUgZG9lc24ndCBzdXBwb3J0IGBzZXRTZWxlY3Rpb25SYW5nZWAuIFNpbXVsYXRlIGl0LiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC9zZXRTZWxlY3Rpb25SYW5nZVxuICAgIHNlbGVjdGVkVGV4dCA9IGZha2VDb3B5QWN0aW9uKHRhcmdldC52YWx1ZSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICAgIGNvbW1hbmQoJ2NvcHknKTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2NvcHkgPSAoQ2xpcGJvYXJkQWN0aW9uQ29weSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9kZWZhdWx0LmpzXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKipcbiAqIElubmVyIGZ1bmN0aW9uIHdoaWNoIHBlcmZvcm1zIHNlbGVjdGlvbiBmcm9tIGVpdGhlciBgdGV4dGAgb3IgYHRhcmdldGBcbiAqIHByb3BlcnRpZXMgYW5kIHRoZW4gZXhlY3V0ZXMgY29weSBvciBjdXQgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkRlZmF1bHQgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0KCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIC8vIERlZmluZXMgYmFzZSBwcm9wZXJ0aWVzIHBhc3NlZCBmcm9tIGNvbnN0cnVjdG9yLlxuICB2YXIgX29wdGlvbnMkYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24sXG4gICAgICBhY3Rpb24gPSBfb3B0aW9ucyRhY3Rpb24gPT09IHZvaWQgMCA/ICdjb3B5JyA6IF9vcHRpb25zJGFjdGlvbixcbiAgICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQsXG4gICAgICB0ZXh0ID0gb3B0aW9ucy50ZXh0OyAvLyBTZXRzIHRoZSBgYWN0aW9uYCB0byBiZSBwZXJmb3JtZWQgd2hpY2ggY2FuIGJlIGVpdGhlciAnY29weScgb3IgJ2N1dCcuXG5cbiAgaWYgKGFjdGlvbiAhPT0gJ2NvcHknICYmIGFjdGlvbiAhPT0gJ2N1dCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJhY3Rpb25cIiB2YWx1ZSwgdXNlIGVpdGhlciBcImNvcHlcIiBvciBcImN1dFwiJyk7XG4gIH0gLy8gU2V0cyB0aGUgYHRhcmdldGAgcHJvcGVydHkgdXNpbmcgYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaGF2ZSBpdHMgY29udGVudCBjb3BpZWQuXG5cblxuICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGFyZ2V0ICYmIF90eXBlb2YodGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBpZiAoYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFBsZWFzZSB1c2UgXCJyZWFkb25seVwiIGluc3RlYWQgb2YgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uID09PSAnY3V0JyAmJiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSB8fCB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFlvdSBjYW5cXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCBcInJlYWRvbmx5XCIgb3IgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtcbiAgICB9XG4gIH0gLy8gRGVmaW5lIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGV4dGAgcHJvcGVydHkuXG5cblxuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGV4dCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfSAvLyBEZWZpbmVzIHdoaWNoIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGFyZ2V0YCBwcm9wZXJ0eS5cblxuXG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gYWN0aW9uID09PSAnY3V0JyA/IGFjdGlvbnNfY3V0KHRhcmdldCkgOiBhY3Rpb25zX2NvcHkodGFyZ2V0LCB7XG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2RlZmF1bHQgPSAoQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY2xpcGJvYXJkLmpzXG5mdW5jdGlvbiBjbGlwYm9hcmRfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IGNsaXBib2FyZF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gY2xpcGJvYXJkX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoY2xpcGJvYXJkX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cblxuXG5cblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHtcbiAgdmFyIGF0dHJpYnV0ZSA9IFwiZGF0YS1jbGlwYm9hcmQtXCIuY29uY2F0KHN1ZmZpeCk7XG5cbiAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb25lIG9yIG1vcmUgZWxlbWVudHMsIGFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZW0sXG4gKiBhbmQgaW5zdGFudGlhdGVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2suXG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRW1pdHRlcikge1xuICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDbGlwYm9hcmQpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfdGhpcy5yZXNvbHZlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIF90aGlzLmxpc3RlbkNsaWNrKHRyaWdnZXIpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBEZWZpbmVzIGlmIGF0dHJpYnV0ZXMgd291bGQgYmUgcmVzb2x2ZWQgdXNpbmcgaW50ZXJuYWwgc2V0dGVyIGZ1bmN0aW9uc1xuICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDbGlwYm9hcmQsIFt7XG4gICAga2V5OiBcInJlc29sdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5hY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFjdGlvbiA6IHRoaXMuZGVmYXVsdEFjdGlvbjtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50YXJnZXQgOiB0aGlzLmRlZmF1bHRUYXJnZXQ7XG4gICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gY2xpcGJvYXJkX3R5cGVvZihvcHRpb25zLmNvbnRhaW5lcikgPT09ICdvYmplY3QnID8gb3B0aW9ucy5jb250YWluZXIgOiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHBhc3NlZCB0cmlnZ2VyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW5DbGljayh0cmlnZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3Rlbl9kZWZhdWx0KCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vbkNsaWNrKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBuZXcgYENsaXBib2FyZEFjdGlvbmAgb24gZWFjaCBjbGljayBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvbkNsaWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBlLmRlbGVnYXRlVGFyZ2V0IHx8IGUuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbih0cmlnZ2VyKSB8fCAnY29weSc7XG4gICAgICB2YXIgdGV4dCA9IGFjdGlvbnNfZGVmYXVsdCh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0KHRyaWdnZXIpLFxuICAgICAgICB0ZXh0OiB0aGlzLnRleHQodHJpZ2dlcilcbiAgICAgIH0pOyAvLyBGaXJlcyBhbiBldmVudCBiYXNlZCBvbiB0aGUgY29weSBvcGVyYXRpb24gcmVzdWx0LlxuXG4gICAgICB0aGlzLmVtaXQodGV4dCA/ICdzdWNjZXNzJyA6ICdlcnJvcicsIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uOiBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYGFjdGlvbmAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdEFjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0QWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgnYWN0aW9uJywgdHJpZ2dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYHRhcmdldGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFRhcmdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGFyZ2V0KHRyaWdnZXIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGdldEF0dHJpYnV0ZVZhbHVlKCd0YXJnZXQnLCB0cmlnZ2VyKTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY29weSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyBUZXh0IGNvcGllZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0XCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0ZXh0YCBsb29rdXAgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0cmlnZ2VyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0KHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGxpZmVjeWNsZS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSh0YXJnZXQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICAgICAgfTtcbiAgICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICAgKiBAcmV0dXJucyBUZXh0IGN1dHRlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImN1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXQodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gYWN0aW9uc19jdXQodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VwcG9ydCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBvciBhbGwgYWN0aW9ucyBpZiBubyBhY3Rpb24gaXNcbiAgICAgKiBnaXZlbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FjdGlvbl1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzU3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICAgICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWydjb3B5JywgJ2N1dCddO1xuICAgICAgdmFyIGFjdGlvbnMgPSB0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJyA/IFthY3Rpb25dIDogYWN0aW9uO1xuICAgICAgdmFyIHN1cHBvcnQgPSAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtcbiAgICAgIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ICYmICEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdXBwb3J0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDbGlwYm9hcmQ7XG59KCh0aW55X2VtaXR0ZXJfZGVmYXVsdCgpKSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNsaXBib2FyZCA9IChDbGlwYm9hcmQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODI4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgRE9DVU1FTlRfTk9ERV9UWVBFID0gOTtcblxuLyoqXG4gKiBBIHBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKVxuICovXG5pZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgdmFyIHByb3RvID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5tYXRjaGVzID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5vTWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBtYXRjaGVzIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjbG9zZXN0IChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IERPQ1VNRU5UX05PREVfVFlQRSkge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb3Nlc3Q7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgY2xvc2VzdCA9IF9fd2VicGFja19yZXF1aXJlX18oODI4KTtcblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lckZuID0gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERlbGVnYXRlcyBldmVudCB0byBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd8QXJyYXl9IFtlbGVtZW50c11cbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudHMsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIC8vIEhhbmRsZSB0aGUgcmVndWxhciBFbGVtZW50IHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cy5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRWxlbWVudC1sZXNzIHVzYWdlLCBpdCBkZWZhdWx0cyB0byBnbG9iYWwgZGVsZWdhdGlvblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgYGRvY3VtZW50YCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCB0aGVuIGFwcGx5IGFyZ3VtZW50c1xuICAgICAgICAvLyBUaGlzIGlzIGEgc2hvcnQgd2F5IHRvIC51bnNoaWZ0IGBhcmd1bWVudHNgIHdpdGhvdXQgcnVubmluZyBpbnRvIGRlb3B0aW1pemF0aW9uc1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmJpbmQobnVsbCwgZG9jdW1lbnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFNlbGVjdG9yLWJhc2VkIHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQXJyYXktbGlrZSBiYXNlZCB1c2FnZVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBsaXN0ZW5lcihlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgICBlLmRlbGVnYXRlVGFyZ2V0ID0gY2xvc2VzdChlLnRhcmdldCwgc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsZW1lbnQsIGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Nzk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBsaXN0IG9mIEhUTUwgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAodHlwZSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nKVxuICAgICAgICAmJiAoJ2xlbmd0aCcgaW4gdmFsdWUpXG4gICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzkpO1xudmFyIGRlbGVnYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzgpO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhbGwgcGFyYW1zIGFuZCBjYWxscyB0aGUgcmlnaHRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRhcmdldCAmJiAhdHlwZSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpcy5mbihjYWxsYmFjaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzLm5vZGUodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMubm9kZUxpc3QodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIEhUTUwgZWxlbWVudFxuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbk5vZGUobm9kZSwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50c1xuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlTGlzdChub2RlTGlzdCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc2VsZWN0b3JcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3RlblNlbGVjdG9yKHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBkZWxlZ2F0ZShkb2N1bWVudC5ib2R5LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RlbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODE3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkge1xuICAgIHZhciBzZWxlY3RlZFRleHQ7XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICB2YXIgaXNSZWFkT25seSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBlbGVtZW50LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RlZFRleHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsZWN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbmZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xubW9kdWxlLmV4cG9ydHMuVGlueUVtaXR0ZXIgPSBFO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH1cbi8qKioqKiovIFx0fSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4Nik7XG4vKioqKioqLyB9KSgpXG4uZGVmYXVsdDtcbn0pOyIsICJmdW5jdGlvbiBlKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHIsdCl7KHQ9bmV3IFhNTEh0dHBSZXF1ZXN0KS5vcGVuKFwiR0VUXCIsZSx0LndpdGhDcmVkZW50aWFscz0hMCksdC5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT10LnN0YXR1cz9uKCk6cigpfSx0LnNlbmQoKX0pfXZhciBuLHI9KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLnJlbExpc3QmJm4ucmVsTGlzdC5zdXBwb3J0cyYmbi5yZWxMaXN0LnN1cHBvcnRzKFwicHJlZmV0Y2hcIik/ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scix0KXsodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKSkucmVsPVwicHJlZmV0Y2hcIix0LmhyZWY9ZSx0Lm9ubG9hZD1uLHQub25lcnJvcj1yLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9KX06ZSx0PXdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrfHxmdW5jdGlvbihlKXt2YXIgbj1EYXRlLm5vdygpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh7ZGlkVGltZW91dDohMSx0aW1lUmVtYWluaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsNTAtKERhdGUubm93KCktbikpfX0pfSwxKX0sbz1uZXcgU2V0LGk9bmV3IFNldCxjPSExO2Z1bmN0aW9uIGEoZSl7aWYoZSl7aWYoZS5zYXZlRGF0YSlyZXR1cm4gbmV3IEVycm9yKFwiU2F2ZS1EYXRhIGlzIGVuYWJsZWRcIik7aWYoLzJnLy50ZXN0KGUuZWZmZWN0aXZlVHlwZSkpcmV0dXJuIG5ldyBFcnJvcihcIm5ldHdvcmsgY29uZGl0aW9ucyBhcmUgcG9vclwiKX1yZXR1cm4hMH1mdW5jdGlvbiB1KGUpe2lmKGV8fChlPXt9KSx3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpe3ZhciBuPWZ1bmN0aW9uKGUpe2U9ZXx8MTt2YXIgbj1bXSxyPTA7ZnVuY3Rpb24gdCgpe3I8ZSYmbi5sZW5ndGg+MCYmKG4uc2hpZnQoKSgpLHIrKyl9cmV0dXJuW2Z1bmN0aW9uKGUpe24ucHVzaChlKT4xfHx0KCl9LGZ1bmN0aW9uKCl7ci0tLHQoKX1dfShlLnRocm90dGxlfHwxLzApLHI9blswXSxhPW5bMV0sdT1lLmxpbWl0fHwxLzAsbD1lLm9yaWdpbnN8fFtsb2NhdGlvbi5ob3N0bmFtZV0sZD1lLmlnbm9yZXN8fFtdLGg9ZS5kZWxheXx8MCxwPVtdLG09ZS50aW1lb3V0Rm58fHQsdz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmhyZWZGbiYmZS5ocmVmRm4sZz1lLnByZXJlbmRlcnx8ITE7Yz1lLnByZXJlbmRlckFuZFByZWZldGNofHwhMTt2YXIgdj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKG4uaXNJbnRlcnNlY3RpbmcpcC5wdXNoKChuPW4udGFyZ2V0KS5ocmVmKSxmdW5jdGlvbihlLG4pe24/c2V0VGltZW91dChlLG4pOmUoKX0oZnVuY3Rpb24oKXstMSE9PXAuaW5kZXhPZihuLmhyZWYpJiYodi51bm9ic2VydmUobiksKGN8fGcpJiZpLnNpemU8MT9mKHc/dyhuKTpuLmhyZWYpLmNhdGNoKGZ1bmN0aW9uKG4pe2lmKCFlLm9uRXJyb3IpdGhyb3cgbjtlLm9uRXJyb3Iobil9KTpvLnNpemU8dSYmIWcmJnIoZnVuY3Rpb24oKXtzKHc/dyhuKTpuLmhyZWYsZS5wcmlvcml0eSkudGhlbihhKS5jYXRjaChmdW5jdGlvbihuKXthKCksZS5vbkVycm9yJiZlLm9uRXJyb3Iobil9KX0pKX0saCk7ZWxzZXt2YXIgdD1wLmluZGV4T2YoKG49bi50YXJnZXQpLmhyZWYpO3Q+LTEmJnAuc3BsaWNlKHQpfX0pfSx7dGhyZXNob2xkOmUudGhyZXNob2xkfHwwfSk7cmV0dXJuIG0oZnVuY3Rpb24oKXsoZS5lbHx8ZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZnVuY3Rpb24oZSl7bC5sZW5ndGgmJiFsLmluY2x1ZGVzKGUuaG9zdG5hbWUpfHxmdW5jdGlvbiBlKG4scil7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/ci5zb21lKGZ1bmN0aW9uKHIpe3JldHVybiBlKG4scil9KTooci50ZXN0fHxyKS5jYWxsKHIsbi5ocmVmLG4pfShlLGQpfHx2Lm9ic2VydmUoZSl9KX0se3RpbWVvdXQ6ZS50aW1lb3V0fHwyZTN9KSxmdW5jdGlvbigpe28uY2xlYXIoKSx2LmRpc2Nvbm5lY3QoKX19fWZ1bmN0aW9uIHMobix0LHUpe3ZhciBzPWEobmF2aWdhdG9yLmNvbm5lY3Rpb24pO3JldHVybiBzIGluc3RhbmNlb2YgRXJyb3I/UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ2Fubm90IHByZWZldGNoLCBcIitzLm1lc3NhZ2UpKTooaS5zaXplPjAmJiFjJiZjb25zb2xlLndhcm4oXCJbV2FybmluZ10gWW91IGFyZSB1c2luZyBib3RoIHByZWZldGNoaW5nIGFuZCBwcmVyZW5kZXJpbmcgb24gdGhlIHNhbWUgZG9jdW1lbnRcIiksUHJvbWlzZS5hbGwoW10uY29uY2F0KG4pLm1hcChmdW5jdGlvbihuKXtpZighby5oYXMobikpcmV0dXJuIG8uYWRkKG4pLCh0P2Z1bmN0aW9uKG4pe3JldHVybiB3aW5kb3cuZmV0Y2g/ZmV0Y2gobix7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCJ9KTplKG4pfTpyKShuZXcgVVJMKG4sbG9jYXRpb24uaHJlZikudG9TdHJpbmcoKSl9KSkpfWZ1bmN0aW9uIGYoZSxuKXt2YXIgcj1hKG5hdmlnYXRvci5jb25uZWN0aW9uKTtpZihyIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCBwcmVyZW5kZXIsIFwiK3IubWVzc2FnZSkpO2lmKCFIVE1MU2NyaXB0RWxlbWVudC5zdXBwb3J0cyhcInNwZWN1bGF0aW9ucnVsZXNcIikpcmV0dXJuIHMoZSksUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWN1bGF0aW9uIHJ1bGVzIEFQSS4gRmFsbGluZyBiYWNrIHRvIHByZWZldGNoLlwiKSk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3R5cGU9XCJzcGVjdWxhdGlvbnJ1bGVzXCJdJykpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlNwZWN1bGF0aW9uIFJ1bGVzIGlzIGFscmVhZHkgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGFsdGVyZWQuXCIpKTtmb3IodmFyIHQ9MCx1PVtdLmNvbmNhdChlKTt0PHUubGVuZ3RoO3QrPTEpe3ZhciBmPXVbdF07aWYod2luZG93LmxvY2F0aW9uLm9yaWdpbiE9PW5ldyBVUkwoZix3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJPbmx5IHNhbWUgb3JpZ2luIFVSTHMgYXJlIGFsbG93ZWQ6IFwiK2YpKTtpLmFkZChmKX1vLnNpemU+MCYmIWMmJmNvbnNvbGUud2FybihcIltXYXJuaW5nXSBZb3UgYXJlIHVzaW5nIGJvdGggcHJlZmV0Y2hpbmcgYW5kIHByZXJlbmRlcmluZyBvbiB0aGUgc2FtZSBkb2N1bWVudFwiKTt2YXIgbD1mdW5jdGlvbihlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO24udHlwZT1cInNwZWN1bGF0aW9ucnVsZXNcIixuLnRleHQ9J3tcInByZXJlbmRlclwiOlt7XCJzb3VyY2VcIjogXCJsaXN0XCIsXCJ1cmxzXCI6IFtcIicrQXJyYXkuZnJvbShlKS5qb2luKCdcIixcIicpKydcIl19XX0nO3RyeXtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG4pfWNhdGNoKGUpe3JldHVybiBlfXJldHVybiEwfShpKTtyZXR1cm4hMD09PWw/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZWplY3QobCl9ZXhwb3J0e3UgYXMgbGlzdGVuLHMgYXMgcHJlZmV0Y2gsZiBhcyBwcmVyZW5kZXJ9O1xuIiwgIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3F1aWNrbGlua1xuaW1wb3J0IHsgbGlzdGVuIH0gZnJvbSAncXVpY2tsaW5rL2Rpc3QvcXVpY2tsaW5rLm1qcyc7XG5saXN0ZW4oe1xuICAgIGlnbm9yZXM6IFtcbiAgICAgICAgL1xcL2FwaVxcLz8vLFxuICAgICAgICB1cmkgPT4gdXJpLmluY2x1ZGVzKCcuemlwJyksXG4gICAgICAgICh1cmksIGVsZW0pID0+IGVsZW0uaGFzQXR0cmlidXRlKCdub3ByZWZldGNoJyksXG4gICAgICAgICh1cmksIGVsZW0pID0+IGVsZW0uaGFzaCAmJiBlbGVtLnBhdGhuYW1lID09PSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgXVxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hRmFya2FzL2xhenlzaXplcy90cmVlL2doLXBhZ2VzL3BsdWdpbnMvbmF0aXZlLWxvYWRpbmdcbmltcG9ydCBsYXp5U2l6ZXMgZnJvbSAnbGF6eXNpemVzJztcbmltcG9ydCAnbGF6eXNpemVzL3BsdWdpbnMvbmF0aXZlLWxvYWRpbmcvbHMubmF0aXZlLWxvYWRpbmcnO1xuXG5sYXp5U2l6ZXMuY2ZnLm5hdGl2ZUxvYWRpbmcgPSB7XG4gICAgc2V0TG9hZGluZ0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICBkaXNhYmxlTGlzdGVuZXJzOiB7XG4gICAgICAgIHNjcm9sbDogdHJ1ZVxuICAgIH1cbn07XG4iLCAiLyohXG4gKiBjbGlwYm9hcmQuanMgZm9yIEJvb3RzdHJhcCBiYXNlZCBUaHVsaXRlIHNpdGVzXG4gKiBDb3B5cmlnaHQgMjAyMS0yMDI0IFRodWxpdGVcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbmltcG9ydCBDbGlwYm9hcmQgZnJvbSAnY2xpcGJvYXJkJztcblxuKCgpID0+IHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHQnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2IubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBjYltpXTtcbiAgICAgICAgZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCAnPGRpdiBjbGFzcz1cImNvcHlcIj48YnV0dG9uIHRpdGxlPVwiQ29weSB0byBjbGlwYm9hcmRcIiBjbGFzcz1cImJ0bi1jb3B5XCIgYXJpYS1sYWJlbD1cIkNsaXBib2FyZCBidXR0b25cIj48ZGl2PjwvZGl2PjwvYnV0dG9uPjwvZGl2PicpO1xuICAgIH1cblxuICAgIHZhciBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKCcuYnRuLWNvcHknLCB7XG4gICAgICAgIHRhcmdldDogZnVuY3Rpb24gKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjbGlwYm9hcmQub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvKlxuICAgICAgY29uc29sZS5pbmZvKCdBY3Rpb246JywgZS5hY3Rpb24pO1xuICAgICAgY29uc29sZS5pbmZvKCdUZXh0OicsIGUudGV4dCk7XG4gICAgICBjb25zb2xlLmluZm8oJ1RyaWdnZXI6JywgZS50cmlnZ2VyKTtcbiAgICAgICovXG5cbiAgICAgICAgZS5jbGVhclNlbGVjdGlvbigpO1xuICAgIH0pO1xuXG4gICAgY2xpcGJvYXJkLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGlvbjonLCBlLmFjdGlvbik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyaWdnZXI6JywgZS50cmlnZ2VyKTtcbiAgICB9KTtcbn0pKCk7XG4iLCAiY29uc3QgdG9wQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvVG9wJyk7XG5cbmlmICh0b3BCdXR0b24gIT09IG51bGwpIHtcbiAgICB0b3BCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZmFkZScpO1xuICAgIHdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2Nyb2xsRnVuY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgdG9wQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9wRnVuY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxGdW5jdGlvbigpIHtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPiAyNzAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDI3MCkge1xuICAgICAgICB0b3BCdXR0b24uY2xhc3NMaXN0LmFkZCgnZmFkZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b3BGdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG59XG4iLCAiLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9nb2h1Z29pby9odWdvRG9jcy9ibG9iL21hc3Rlci9fdmVuZG9yL2dpdGh1Yi5jb20vZ29odWdvaW8vZ29odWdvaW9UaGVtZS9hc3NldHMvanMvdGFicy5qc1xuXG4vKipcbiAqIFNjcmlwdHMgd2hpY2ggbWFuYWdlcyBDb2RlIFRvZ2dsZSB0YWJzLlxuICovXG52YXIgaTtcbi8vIHN0b3JlIHRhYnMgdmFyaWFibGVcbnZhciBhbGxUYWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlLXRhYl0nKTtcbnZhciBhbGxQYW5lcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBhbmVdJyk7XG5cbmZ1bmN0aW9uIHRvZ2dsZVRhYnMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZhciBjbGlja2VkVGFiID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgdmFyIHRhcmdldEtleSA9IGNsaWNrZWRUYWIuZ2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZS10YWInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFyZ2V0S2V5ID0gZXZlbnQ7XG4gICAgfVxuICAgIC8vIFdlIHN0b3JlIHRoZSBjb25maWcgbGFuZ3VhZ2Ugc2VsZWN0ZWQgaW4gdXNlcnMnIGxvY2FsU3RvcmFnZVxuICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29uZmlnTGFuZ1ByZWYnLCB0YXJnZXRLZXkpO1xuICAgIH1cbiAgICB2YXIgc2VsZWN0ZWRUYWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlLXRhYj0nICsgdGFyZ2V0S2V5ICsgJ10nKTtcbiAgICB2YXIgc2VsZWN0ZWRQYW5lcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBhbmU9JyArIHRhcmdldEtleSArICddJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWxsVGFic1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgYWxsUGFuZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZWN0ZWRUYWJzW2ldLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICBzZWxlY3RlZFBhbmVzW2ldLmNsYXNzTGlzdC5hZGQoJ3Nob3cnLCAnYWN0aXZlJyk7XG4gICAgfVxufVxuXG5mb3IgKGkgPSAwOyBpIDwgYWxsVGFicy5sZW5ndGg7IGkrKykge1xuICAgIGFsbFRhYnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVUYWJzKTtcbn1cbi8vIFVwb24gcGFnZSBsb2FkLCBpZiB1c2VyIGhhcyBhIHByZWZlcnJlZCBsYW5ndWFnZSBpbiBpdHMgbG9jYWxTdG9yYWdlLCB0YWJzIGFyZSBzZXQgdG8gaXQuXG5pZiAod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjb25maWdMYW5nUHJlZicpKSB7XG4gICAgdG9nZ2xlVGFicyh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NvbmZpZ0xhbmdQcmVmJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUEsT0FBQyxTQUFTQSxTQUFRLFNBQVM7QUFDMUIsWUFBSUMsYUFBWSxRQUFRRCxTQUFRQSxRQUFPLFVBQVUsSUFBSTtBQUNyRCxRQUFBQSxRQUFPLFlBQVlDO0FBQ25CLFlBQUcsT0FBTyxVQUFVLFlBQVksT0FBTyxTQUFRO0FBQzlDLGlCQUFPLFVBQVVBO0FBQUEsUUFDbEI7QUFBQSxNQUNEO0FBQUEsUUFBRSxPQUFPLFVBQVUsY0FDYixTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS2hCLFNBQVMsRUFBRUQsU0FBUUUsV0FBVUMsT0FBTTtBQUNsQztBQUdBLGNBQUksV0FJSDtBQUVELFdBQUMsV0FBVTtBQUNWLGdCQUFJO0FBRUosZ0JBQUksb0JBQW9CO0FBQUEsY0FDdkIsV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsY0FBYztBQUFBLGNBQ2QsY0FBYztBQUFBLGNBQ2QsWUFBWTtBQUFBO0FBQUEsY0FFWixnQkFBZ0I7QUFBQSxjQUNoQixpQkFBaUI7QUFBQSxjQUNqQixnQkFBZ0I7QUFBQSxjQUNoQixTQUFTO0FBQUEsY0FDVCxZQUFZO0FBQUEsY0FDWixXQUFXO0FBQUE7QUFBQSxjQUVYLFNBQVM7QUFBQSxjQUNULGFBQWEsQ0FBQztBQUFBLGNBQ2QsTUFBTTtBQUFBLGNBQ04sV0FBVztBQUFBLGNBQ1gsTUFBTTtBQUFBLGNBQ04sVUFBVTtBQUFBLGNBQ1YsWUFBWTtBQUFBLGNBQ1osWUFBWTtBQUFBLGNBQ1osZUFBZTtBQUFBLFlBQ2hCO0FBRUEsMkJBQWVILFFBQU8sbUJBQW1CQSxRQUFPLG1CQUFtQixDQUFDO0FBRXBFLGlCQUFJLFFBQVEsbUJBQWtCO0FBQzdCLGtCQUFHLEVBQUUsUUFBUSxlQUFj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QyxZQUFRQSxFQUFDLEVBQUUsaUJBQWlCLFNBQVMsVUFBVTtBQUFBLEVBQ25EO0FBRUEsTUFBSSxPQUFPLGFBQWEsUUFBUSxnQkFBZ0IsR0FBRztBQUMvQyxlQUFXLE9BQU8sYUFBYSxRQUFRLGdCQUFnQixDQUFDO0FBQUEsRUFDNUQ7IiwKICAibmFtZXMiOiBbIndpbmRvdyIsICJsYXp5U2l6ZXMiLCAiZG9jdW1lbnQiLCAiRGF0ZSIsICJzZXRUaW1lb3V0IiwgImUiLCAiaSIsICJsb2FkTW9kZSIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAibGF6eVNpemVzIiwgImUiLCAiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJDbGlwYm9hcmRBY3Rpb25DdXQiLCAiZmFrZUNvcHlBY3Rpb24iLCAiQ2xpcGJvYXJkQWN0aW9uQ29weSIsICJfdHlwZW9mIiwgIm9iaiIsICJDbGlwYm9hcmRBY3Rpb25EZWZhdWx0IiwgImkiLCAibyIsICJfc2V0UHJvdG90eXBlT2YiLCAicCIsICJlIiwgIl9nZXRQcm90b3R5cGVPZiIsICJDbGlwYm9hcmQiLCAiYWN0aW9uIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgImUiLCAibiIsICJyIiwgInQiLCAiYSIsICJ1IiwgInMiLCAiZiIsICJsYXp5U2l6ZXMiLCAiaSIsICJDbGlwYm9hcmQiLCAiZSIsICJpIl0KfQo=
diff --git a/public/js/app.ee8a7e9ea9261e1c2412ce2ae47b5cf8e085982e0f246d504f91942676a6171b.js b/public/js/app.ee8a7e9ea9261e1c2412ce2ae47b5cf8e085982e0f246d504f91942676a6171b.js
deleted file mode 100644
index 4a7abb6b..00000000
--- a/public/js/app.ee8a7e9ea9261e1c2412ce2ae47b5cf8e085982e0f246d504f91942676a6171b.js
+++ /dev/null
@@ -1,1610 +0,0 @@
-"use strict";
-(() => {
- var __create = Object.create;
- var __defProp = Object.defineProperty;
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __getProtoOf = Object.getPrototypeOf;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __commonJS = (cb, mod) => function __require() {
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
- };
- var __copyProps = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
- }
- return to;
- };
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
- // If the importer is in node compatibility mode or this is not an ESM
- // file that has been converted to a CommonJS file using a Babel-
- // compatible transform (i.e. "__esModule" has not been set), then set
- // "default" to the CommonJS "module.exports" for node compatibility.
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
- mod
- ));
-
- // node_modules/lazysizes/lazysizes.js
- var require_lazysizes = __commonJS({
- "node_modules/lazysizes/lazysizes.js"(exports, module) {
- (function(window2, factory) {
- var lazySizes2 = factory(window2, window2.document, Date);
- window2.lazySizes = lazySizes2;
- if (typeof module == "object" && module.exports) {
- module.exports = lazySizes2;
- }
- })(
- typeof window != "undefined" ? window : {},
- /**
- * import("./types/global")
- * @typedef { import("./types/lazysizes-config").LazySizesConfigPartial } LazySizesConfigPartial
- */
- function l(window2, document2, Date2) {
- "use strict";
- var lazysizes, lazySizesCfg;
- (function() {
- var prop;
- var lazySizesDefaults = {
- lazyClass: "lazyload",
- loadedClass: "lazyloaded",
- loadingClass: "lazyloading",
- preloadClass: "lazypreload",
- errorClass: "lazyerror",
- //strictClass: 'lazystrict',
- autosizesClass: "lazyautosizes",
- fastLoadedClass: "ls-is-cached",
- iframeLoadMode: 0,
- srcAttr: "data-src",
- srcsetAttr: "data-srcset",
- sizesAttr: "data-sizes",
- //preloadAfterLoad: false,
- minSize: 40,
- customMedia: {},
- init: true,
- expFactor: 1.5,
- hFac: 0.8,
- loadMode: 2,
- loadHidden: true,
- ricTimeout: 0,
- throttleDelay: 125
- };
- lazySizesCfg = window2.lazySizesConfig || window2.lazysizesConfig || {};
- for (prop in lazySizesDefaults) {
- if (!(prop in lazySizesCfg)) {
- lazySizesCfg[prop] = lazySizesDefaults[prop];
- }
- }
- })();
- if (!document2 || !document2.getElementsByClassName) {
- return {
- init: function() {
- },
- /**
- * @type { LazySizesConfigPartial }
- */
- cfg: lazySizesCfg,
- /**
- * @type { true }
- */
- noSupport: true
- };
- }
- var docElem = document2.documentElement;
- var supportPicture = window2.HTMLPictureElement;
- var _addEventListener = "addEventListener";
- var _getAttribute = "getAttribute";
- var addEventListener = window2[_addEventListener].bind(window2);
- var setTimeout2 = window2.setTimeout;
- var requestAnimationFrame = window2.requestAnimationFrame || setTimeout2;
- var requestIdleCallback = window2.requestIdleCallback;
- var regPicture = /^picture$/i;
- var loadEvents = ["load", "error", "lazyincluded", "_lazyloaded"];
- var regClassCache = {};
- var forEach = Array.prototype.forEach;
- var hasClass = function(ele, cls) {
- if (!regClassCache[cls]) {
- regClassCache[cls] = new RegExp("(\\s|^)" + cls + "(\\s|$)");
- }
- return regClassCache[cls].test(ele[_getAttribute]("class") || "") && regClassCache[cls];
- };
- var addClass = function(ele, cls) {
- if (!hasClass(ele, cls)) {
- ele.setAttribute("class", (ele[_getAttribute]("class") || "").trim() + " " + cls);
- }
- };
- var removeClass = function(ele, cls) {
- var reg;
- if (reg = hasClass(ele, cls)) {
- ele.setAttribute("class", (ele[_getAttribute]("class") || "").replace(reg, " "));
- }
- };
- var addRemoveLoadEvents = function(dom, fn, add) {
- var action = add ? _addEventListener : "removeEventListener";
- if (add) {
- addRemoveLoadEvents(dom, fn);
- }
- loadEvents.forEach(function(evt) {
- dom[action](evt, fn);
- });
- };
- var triggerEvent = function(elem, name, detail, noBubbles, noCancelable) {
- var event = document2.createEvent("Event");
- if (!detail) {
- detail = {};
- }
- detail.instance = lazysizes;
- event.initEvent(name, !noBubbles, !noCancelable);
- event.detail = detail;
- elem.dispatchEvent(event);
- return event;
- };
- var updatePolyfill = function(el, full) {
- var polyfill;
- if (!supportPicture && (polyfill = window2.picturefill || lazySizesCfg.pf)) {
- if (full && full.src && !el[_getAttribute]("srcset")) {
- el.setAttribute("srcset", full.src);
- }
- polyfill({ reevaluate: true, elements: [el] });
- } else if (full && full.src) {
- el.src = full.src;
- }
- };
- var getCSS = function(elem, style) {
- return (getComputedStyle(elem, null) || {})[style];
- };
- var getWidth = function(elem, parent, width) {
- width = width || elem.offsetWidth;
- while (width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth) {
- width = parent.offsetWidth;
- parent = parent.parentNode;
- }
- return width;
- };
- var rAF = function() {
- var running, waiting;
- var firstFns = [];
- var secondFns = [];
- var fns = firstFns;
- var run = function() {
- var runFns = fns;
- fns = firstFns.length ? secondFns : firstFns;
- running = true;
- waiting = false;
- while (runFns.length) {
- runFns.shift()();
- }
- running = false;
- };
- var rafBatch = function(fn, queue) {
- if (running && !queue) {
- fn.apply(this, arguments);
- } else {
- fns.push(fn);
- if (!waiting) {
- waiting = true;
- (document2.hidden ? setTimeout2 : requestAnimationFrame)(run);
- }
- }
- };
- rafBatch._lsFlush = run;
- return rafBatch;
- }();
- var rAFIt = function(fn, simple) {
- return simple ? function() {
- rAF(fn);
- } : function() {
- var that = this;
- var args = arguments;
- rAF(function() {
- fn.apply(that, args);
- });
- };
- };
- var throttle = function(fn) {
- var running;
- var lastTime = 0;
- var gDelay = lazySizesCfg.throttleDelay;
- var rICTimeout = lazySizesCfg.ricTimeout;
- var run = function() {
- running = false;
- lastTime = Date2.now();
- fn();
- };
- var idleCallback = requestIdleCallback && rICTimeout > 49 ? function() {
- requestIdleCallback(run, { timeout: rICTimeout });
- if (rICTimeout !== lazySizesCfg.ricTimeout) {
- rICTimeout = lazySizesCfg.ricTimeout;
- }
- } : rAFIt(function() {
- setTimeout2(run);
- }, true);
- return function(isPriority) {
- var delay;
- if (isPriority = isPriority === true) {
- rICTimeout = 33;
- }
- if (running) {
- return;
- }
- running = true;
- delay = gDelay - (Date2.now() - lastTime);
- if (delay < 0) {
- delay = 0;
- }
- if (isPriority || delay < 9) {
- idleCallback();
- } else {
- setTimeout2(idleCallback, delay);
- }
- };
- };
- var debounce = function(func) {
- var timeout, timestamp;
- var wait = 99;
- var run = function() {
- timeout = null;
- func();
- };
- var later = function() {
- var last = Date2.now() - timestamp;
- if (last < wait) {
- setTimeout2(later, wait - last);
- } else {
- (requestIdleCallback || run)(run);
- }
- };
- return function() {
- timestamp = Date2.now();
- if (!timeout) {
- timeout = setTimeout2(later, wait);
- }
- };
- };
- var loader = function() {
- var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;
- var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;
- var regImg = /^img$/i;
- var regIframe = /^iframe$/i;
- var supportScroll = "onscroll" in window2 && !/(gle|ing)bot/.test(navigator.userAgent);
- var shrinkExpand = 0;
- var currentExpand = 0;
- var isLoading = 0;
- var lowRuns = -1;
- var resetPreloading = function(e2) {
- isLoading--;
- if (!e2 || isLoading < 0 || !e2.target) {
- isLoading = 0;
- }
- };
- var isVisible = function(elem) {
- if (isBodyHidden == null) {
- isBodyHidden = getCSS(document2.body, "visibility") == "hidden";
- }
- return isBodyHidden || !(getCSS(elem.parentNode, "visibility") == "hidden" && getCSS(elem, "visibility") == "hidden");
- };
- var isNestedVisible = function(elem, elemExpand) {
- var outerRect;
- var parent = elem;
- var visible = isVisible(elem);
- eLtop -= elemExpand;
- eLbottom += elemExpand;
- eLleft -= elemExpand;
- eLright += elemExpand;
- while (visible && (parent = parent.offsetParent) && parent != document2.body && parent != docElem) {
- visible = (getCSS(parent, "opacity") || 1) > 0;
- if (visible && getCSS(parent, "overflow") != "visible") {
- outerRect = parent.getBoundingClientRect();
- visible = eLright > outerRect.left && eLleft < outerRect.right && eLbottom > outerRect.top - 1 && eLtop < outerRect.bottom + 1;
- }
- }
- return visible;
- };
- var checkElements = function() {
- var eLlen, i3, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal, defaultExpand, preloadExpand, hFac;
- var lazyloadElems = lazysizes.elements;
- if ((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)) {
- i3 = 0;
- lowRuns++;
- for (; i3 < eLlen; i3++) {
- if (!lazyloadElems[i3] || lazyloadElems[i3]._lazyRace) {
- continue;
- }
- if (!supportScroll || lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i3])) {
- unveilElement(lazyloadElems[i3]);
- continue;
- }
- if (!(elemExpandVal = lazyloadElems[i3][_getAttribute]("data-expand")) || !(elemExpand = elemExpandVal * 1)) {
- elemExpand = currentExpand;
- }
- if (!defaultExpand) {
- defaultExpand = !lazySizesCfg.expand || lazySizesCfg.expand < 1 ? docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 : lazySizesCfg.expand;
- lazysizes._defEx = defaultExpand;
- preloadExpand = defaultExpand * lazySizesCfg.expFactor;
- hFac = lazySizesCfg.hFac;
- isBodyHidden = null;
- if (currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document2.hidden) {
- currentExpand = preloadExpand;
- lowRuns = 0;
- } else if (loadMode > 1 && lowRuns > 1 && isLoading < 6) {
- currentExpand = defaultExpand;
- } else {
- currentExpand = shrinkExpand;
- }
- }
- if (beforeExpandVal !== elemExpand) {
- eLvW = innerWidth + elemExpand * hFac;
- elvH = innerHeight + elemExpand;
- elemNegativeExpand = elemExpand * -1;
- beforeExpandVal = elemExpand;
- }
- rect = lazyloadElems[i3].getBoundingClientRect();
- if ((eLbottom = rect.bottom) >= elemNegativeExpand && (eLtop = rect.top) <= elvH && (eLright = rect.right) >= elemNegativeExpand * hFac && (eLleft = rect.left) <= eLvW && (eLbottom || eLright || eLleft || eLtop) && (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i3])) && (isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4) || isNestedVisible(lazyloadElems[i3], elemExpand))) {
- unveilElement(lazyloadElems[i3]);
- loadedSomething = true;
- if (isLoading > 9) {
- break;
- }
- } else if (!loadedSomething && isCompleted && !autoLoadElem && isLoading < 4 && lowRuns < 4 && loadMode > 2 && (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && (preloadElems[0] || !elemExpandVal && (eLbottom || eLright || eLleft || eLtop || lazyloadElems[i3][_getAttribute](lazySizesCfg.sizesAttr) != "auto"))) {
- autoLoadElem = preloadElems[0] || lazyloadElems[i3];
- }
- }
- if (autoLoadElem && !loadedSomething) {
- unveilElement(autoLoadElem);
- }
- }
- };
- var throttledCheckElements = throttle(checkElements);
- var switchLoadingClass = function(e2) {
- var elem = e2.target;
- if (elem._lazyCache) {
- delete elem._lazyCache;
- return;
- }
- resetPreloading(e2);
- addClass(elem, lazySizesCfg.loadedClass);
- removeClass(elem, lazySizesCfg.loadingClass);
- addRemoveLoadEvents(elem, rafSwitchLoadingClass);
- triggerEvent(elem, "lazyloaded");
- };
- var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);
- var rafSwitchLoadingClass = function(e2) {
- rafedSwitchLoadingClass({ target: e2.target });
- };
- var changeIframeSrc = function(elem, src) {
- var loadMode2 = elem.getAttribute("data-load-mode") || lazySizesCfg.iframeLoadMode;
- if (loadMode2 == 0) {
- elem.contentWindow.location.replace(src);
- } else if (loadMode2 == 1) {
- elem.src = src;
- }
- };
- var handleSources = function(source) {
- var customMedia;
- var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);
- if (customMedia = lazySizesCfg.customMedia[source[_getAttribute]("data-media") || source[_getAttribute]("media")]) {
- source.setAttribute("media", customMedia);
- }
- if (sourceSrcset) {
- source.setAttribute("srcset", sourceSrcset);
- }
- };
- var lazyUnveil = rAFIt(function(elem, detail, isAuto, sizes, isImg) {
- var src, srcset, parent, isPicture, event, firesLoad;
- if (!(event = triggerEvent(elem, "lazybeforeunveil", detail)).defaultPrevented) {
- if (sizes) {
- if (isAuto) {
- addClass(elem, lazySizesCfg.autosizesClass);
- } else {
- elem.setAttribute("sizes", sizes);
- }
- }
- srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);
- src = elem[_getAttribute](lazySizesCfg.srcAttr);
- if (isImg) {
- parent = elem.parentNode;
- isPicture = parent && regPicture.test(parent.nodeName || "");
- }
- firesLoad = detail.firesLoad || "src" in elem && (srcset || src || isPicture);
- event = { target: elem };
- addClass(elem, lazySizesCfg.loadingClass);
- if (firesLoad) {
- clearTimeout(resetPreloadingTimer);
- resetPreloadingTimer = setTimeout2(resetPreloading, 2500);
- addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);
- }
- if (isPicture) {
- forEach.call(parent.getElementsByTagName("source"), handleSources);
- }
- if (srcset) {
- elem.setAttribute("srcset", srcset);
- } else if (src && !isPicture) {
- if (regIframe.test(elem.nodeName)) {
- changeIframeSrc(elem, src);
- } else {
- elem.src = src;
- }
- }
- if (isImg && (srcset || isPicture)) {
- updatePolyfill(elem, { src });
- }
- }
- if (elem._lazyRace) {
- delete elem._lazyRace;
- }
- removeClass(elem, lazySizesCfg.lazyClass);
- rAF(function() {
- var isLoaded = elem.complete && elem.naturalWidth > 1;
- if (!firesLoad || isLoaded) {
- if (isLoaded) {
- addClass(elem, lazySizesCfg.fastLoadedClass);
- }
- switchLoadingClass(event);
- elem._lazyCache = true;
- setTimeout2(function() {
- if ("_lazyCache" in elem) {
- delete elem._lazyCache;
- }
- }, 9);
- }
- if (elem.loading == "lazy") {
- isLoading--;
- }
- }, true);
- });
- var unveilElement = function(elem) {
- if (elem._lazyRace) {
- return;
- }
- var detail;
- var isImg = regImg.test(elem.nodeName);
- var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]("sizes"));
- var isAuto = sizes == "auto";
- if ((isAuto || !isCompleted) && isImg && (elem[_getAttribute]("src") || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)) {
- return;
- }
- detail = triggerEvent(elem, "lazyunveilread").detail;
- if (isAuto) {
- autoSizer.updateElem(elem, true, elem.offsetWidth);
- }
- elem._lazyRace = true;
- isLoading++;
- lazyUnveil(elem, detail, isAuto, sizes, isImg);
- };
- var afterScroll = debounce(function() {
- lazySizesCfg.loadMode = 3;
- throttledCheckElements();
- });
- var altLoadmodeScrollListner = function() {
- if (lazySizesCfg.loadMode == 3) {
- lazySizesCfg.loadMode = 2;
- }
- afterScroll();
- };
- var onload = function() {
- if (isCompleted) {
- return;
- }
- if (Date2.now() - started < 999) {
- setTimeout2(onload, 999);
- return;
- }
- isCompleted = true;
- lazySizesCfg.loadMode = 3;
- throttledCheckElements();
- addEventListener("scroll", altLoadmodeScrollListner, true);
- };
- return {
- _: function() {
- started = Date2.now();
- lazysizes.elements = document2.getElementsByClassName(lazySizesCfg.lazyClass);
- preloadElems = document2.getElementsByClassName(lazySizesCfg.lazyClass + " " + lazySizesCfg.preloadClass);
- addEventListener("scroll", throttledCheckElements, true);
- addEventListener("resize", throttledCheckElements, true);
- addEventListener("pageshow", function(e2) {
- if (e2.persisted) {
- var loadingElements = document2.querySelectorAll("." + lazySizesCfg.loadingClass);
- if (loadingElements.length && loadingElements.forEach) {
- requestAnimationFrame(function() {
- loadingElements.forEach(function(img) {
- if (img.complete) {
- unveilElement(img);
- }
- });
- });
- }
- }
- });
- if (window2.MutationObserver) {
- new MutationObserver(throttledCheckElements).observe(docElem, { childList: true, subtree: true, attributes: true });
- } else {
- docElem[_addEventListener]("DOMNodeInserted", throttledCheckElements, true);
- docElem[_addEventListener]("DOMAttrModified", throttledCheckElements, true);
- setInterval(throttledCheckElements, 999);
- }
- addEventListener("hashchange", throttledCheckElements, true);
- ["focus", "mouseover", "click", "load", "transitionend", "animationend"].forEach(function(name) {
- document2[_addEventListener](name, throttledCheckElements, true);
- });
- if (/d$|^c/.test(document2.readyState)) {
- onload();
- } else {
- addEventListener("load", onload);
- document2[_addEventListener]("DOMContentLoaded", throttledCheckElements);
- setTimeout2(onload, 2e4);
- }
- if (lazysizes.elements.length) {
- checkElements();
- rAF._lsFlush();
- } else {
- throttledCheckElements();
- }
- },
- checkElems: throttledCheckElements,
- unveil: unveilElement,
- _aLSL: altLoadmodeScrollListner
- };
- }();
- var autoSizer = function() {
- var autosizesElems;
- var sizeElement = rAFIt(function(elem, parent, event, width) {
- var sources, i3, len;
- elem._lazysizesWidth = width;
- width += "px";
- elem.setAttribute("sizes", width);
- if (regPicture.test(parent.nodeName || "")) {
- sources = parent.getElementsByTagName("source");
- for (i3 = 0, len = sources.length; i3 < len; i3++) {
- sources[i3].setAttribute("sizes", width);
- }
- }
- if (!event.detail.dataAttr) {
- updatePolyfill(elem, event.detail);
- }
- });
- var getSizeElement = function(elem, dataAttr, width) {
- var event;
- var parent = elem.parentNode;
- if (parent) {
- width = getWidth(elem, parent, width);
- event = triggerEvent(elem, "lazybeforesizes", { width, dataAttr: !!dataAttr });
- if (!event.defaultPrevented) {
- width = event.detail.width;
- if (width && width !== elem._lazysizesWidth) {
- sizeElement(elem, parent, event, width);
- }
- }
- }
- };
- var updateElementsSizes = function() {
- var i3;
- var len = autosizesElems.length;
- if (len) {
- i3 = 0;
- for (; i3 < len; i3++) {
- getSizeElement(autosizesElems[i3]);
- }
- }
- };
- var debouncedUpdateElementsSizes = debounce(updateElementsSizes);
- return {
- _: function() {
- autosizesElems = document2.getElementsByClassName(lazySizesCfg.autosizesClass);
- addEventListener("resize", debouncedUpdateElementsSizes);
- },
- checkElems: debouncedUpdateElementsSizes,
- updateElem: getSizeElement
- };
- }();
- var init = function() {
- if (!init.i && document2.getElementsByClassName) {
- init.i = true;
- autoSizer._();
- loader._();
- }
- };
- setTimeout2(function() {
- if (lazySizesCfg.init) {
- init();
- }
- });
- lazysizes = {
- /**
- * @type { LazySizesConfigPartial }
- */
- cfg: lazySizesCfg,
- autoSizer,
- loader,
- init,
- uP: updatePolyfill,
- aC: addClass,
- rC: removeClass,
- hC: hasClass,
- fire: triggerEvent,
- gW: getWidth,
- rAF
- };
- return lazysizes;
- }
- );
- }
- });
-
- // node_modules/lazysizes/plugins/native-loading/ls.native-loading.js
- var require_ls_native_loading = __commonJS({
- "node_modules/lazysizes/plugins/native-loading/ls.native-loading.js"(exports, module) {
- (function(window2, factory) {
- var globalInstall = function() {
- factory(window2.lazySizes);
- window2.removeEventListener("lazyunveilread", globalInstall, true);
- };
- factory = factory.bind(null, window2, window2.document);
- if (typeof module == "object" && module.exports) {
- factory(require_lazysizes());
- } else if (typeof define == "function" && define.amd) {
- define(["lazysizes"], factory);
- } else if (window2.lazySizes) {
- globalInstall();
- } else {
- window2.addEventListener("lazyunveilread", globalInstall, true);
- }
- })(window, function(window2, document2, lazySizes2) {
- "use strict";
- var imgSupport = "loading" in HTMLImageElement.prototype;
- var iframeSupport = "loading" in HTMLIFrameElement.prototype;
- var isConfigSet = false;
- var oldPrematureUnveil = lazySizes2.prematureUnveil;
- var cfg = lazySizes2.cfg;
- var listenerMap = {
- focus: 1,
- mouseover: 1,
- click: 1,
- load: 1,
- transitionend: 1,
- animationend: 1,
- scroll: 1,
- resize: 1
- };
- if (!cfg.nativeLoading) {
- cfg.nativeLoading = {};
- }
- if (!window2.addEventListener || !window2.MutationObserver || !imgSupport && !iframeSupport) {
- return;
- }
- function disableEvents() {
- var loader = lazySizes2.loader;
- var throttledCheckElements = loader.checkElems;
- var removeALSL = function() {
- setTimeout(function() {
- window2.removeEventListener("scroll", loader._aLSL, true);
- }, 1e3);
- };
- var currentListenerMap = typeof cfg.nativeLoading.disableListeners == "object" ? cfg.nativeLoading.disableListeners : listenerMap;
- if (currentListenerMap.scroll) {
- window2.addEventListener("load", removeALSL);
- removeALSL();
- window2.removeEventListener("scroll", throttledCheckElements, true);
- }
- if (currentListenerMap.resize) {
- window2.removeEventListener("resize", throttledCheckElements, true);
- }
- Object.keys(currentListenerMap).forEach(function(name) {
- if (currentListenerMap[name]) {
- document2.removeEventListener(name, throttledCheckElements, true);
- }
- });
- }
- function runConfig() {
- if (isConfigSet) {
- return;
- }
- isConfigSet = true;
- if (imgSupport && iframeSupport && cfg.nativeLoading.disableListeners) {
- if (cfg.nativeLoading.disableListeners === true) {
- cfg.nativeLoading.setLoadingAttribute = true;
- }
- disableEvents();
- }
- if (cfg.nativeLoading.setLoadingAttribute) {
- window2.addEventListener("lazybeforeunveil", function(e2) {
- var element = e2.target;
- if ("loading" in element && !element.getAttribute("loading")) {
- element.setAttribute("loading", "lazy");
- }
- }, true);
- }
- }
- lazySizes2.prematureUnveil = function prematureUnveil(element) {
- if (!isConfigSet) {
- runConfig();
- }
- if ("loading" in element && (cfg.nativeLoading.setLoadingAttribute || element.getAttribute("loading")) && (element.getAttribute("data-sizes") != "auto" || element.offsetWidth)) {
- return true;
- }
- if (oldPrematureUnveil) {
- return oldPrematureUnveil(element);
- }
- };
- });
- }
- });
-
- // node_modules/clipboard/dist/clipboard.js
- var require_clipboard = __commonJS({
- "node_modules/clipboard/dist/clipboard.js"(exports, module) {
- (function webpackUniversalModuleDefinition(root, factory) {
- if (typeof exports === "object" && typeof module === "object")
- module.exports = factory();
- else if (typeof define === "function" && define.amd)
- define([], factory);
- else if (typeof exports === "object")
- exports["ClipboardJS"] = factory();
- else
- root["ClipboardJS"] = factory();
- })(exports, function() {
- return (
- /******/
- function() {
- var __webpack_modules__ = {
- /***/
- 686: (
- /***/
- function(__unused_webpack_module, __webpack_exports__, __webpack_require__2) {
- "use strict";
- __webpack_require__2.d(__webpack_exports__, {
- "default": function() {
- return (
- /* binding */
- clipboard
- );
- }
- });
- var tiny_emitter = __webpack_require__2(279);
- var tiny_emitter_default = /* @__PURE__ */ __webpack_require__2.n(tiny_emitter);
- var listen = __webpack_require__2(370);
- var listen_default = /* @__PURE__ */ __webpack_require__2.n(listen);
- var src_select = __webpack_require__2(817);
- var select_default = /* @__PURE__ */ __webpack_require__2.n(src_select);
- ;
- function command(type) {
- try {
- return document.execCommand(type);
- } catch (err) {
- return false;
- }
- }
- ;
- var ClipboardActionCut = function ClipboardActionCut2(target) {
- var selectedText = select_default()(target);
- command("cut");
- return selectedText;
- };
- var actions_cut = ClipboardActionCut;
- ;
- function createFakeElement(value) {
- var isRTL = document.documentElement.getAttribute("dir") === "rtl";
- var fakeElement = document.createElement("textarea");
- fakeElement.style.fontSize = "12pt";
- fakeElement.style.border = "0";
- fakeElement.style.padding = "0";
- fakeElement.style.margin = "0";
- fakeElement.style.position = "absolute";
- fakeElement.style[isRTL ? "right" : "left"] = "-9999px";
- var yPosition = window.pageYOffset || document.documentElement.scrollTop;
- fakeElement.style.top = "".concat(yPosition, "px");
- fakeElement.setAttribute("readonly", "");
- fakeElement.value = value;
- return fakeElement;
- }
- ;
- var fakeCopyAction = function fakeCopyAction2(value, options) {
- var fakeElement = createFakeElement(value);
- options.container.appendChild(fakeElement);
- var selectedText = select_default()(fakeElement);
- command("copy");
- fakeElement.remove();
- return selectedText;
- };
- var ClipboardActionCopy = function ClipboardActionCopy2(target) {
- var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
- container: document.body
- };
- var selectedText = "";
- if (typeof target === "string") {
- selectedText = fakeCopyAction(target, options);
- } else if (target instanceof HTMLInputElement && !["text", "search", "url", "tel", "password"].includes(target === null || target === void 0 ? void 0 : target.type)) {
- selectedText = fakeCopyAction(target.value, options);
- } else {
- selectedText = select_default()(target);
- command("copy");
- }
- return selectedText;
- };
- var actions_copy = ClipboardActionCopy;
- ;
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function _typeof2(obj2) {
- return typeof obj2;
- };
- } else {
- _typeof = function _typeof2(obj2) {
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
- };
- }
- return _typeof(obj);
- }
- var ClipboardActionDefault = function ClipboardActionDefault2() {
- var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
- var _options$action = options.action, action = _options$action === void 0 ? "copy" : _options$action, container = options.container, target = options.target, text = options.text;
- if (action !== "copy" && action !== "cut") {
- throw new Error('Invalid "action" value, use either "copy" or "cut"');
- }
- if (target !== void 0) {
- if (target && _typeof(target) === "object" && target.nodeType === 1) {
- if (action === "copy" && target.hasAttribute("disabled")) {
- throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
- }
- if (action === "cut" && (target.hasAttribute("readonly") || target.hasAttribute("disabled"))) {
- throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);
- }
- } else {
- throw new Error('Invalid "target" value, use a valid Element');
- }
- }
- if (text) {
- return actions_copy(text, {
- container
- });
- }
- if (target) {
- return action === "cut" ? actions_cut(target) : actions_copy(target, {
- container
- });
- }
- };
- var actions_default = ClipboardActionDefault;
- ;
- function clipboard_typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- clipboard_typeof = function _typeof2(obj2) {
- return typeof obj2;
- };
- } else {
- clipboard_typeof = function _typeof2(obj2) {
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
- };
- }
- return clipboard_typeof(obj);
- }
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
- function _defineProperties(target, props) {
- for (var i3 = 0; i3 < props.length; i3++) {
- var descriptor = props[i3];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function");
- }
- subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });
- if (superClass) _setPrototypeOf(subClass, superClass);
- }
- function _setPrototypeOf(o2, p) {
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o3, p2) {
- o3.__proto__ = p2;
- return o3;
- };
- return _setPrototypeOf(o2, p);
- }
- function _createSuper(Derived) {
- var hasNativeReflectConstruct = _isNativeReflectConstruct();
- return function _createSuperInternal() {
- var Super = _getPrototypeOf(Derived), result;
- if (hasNativeReflectConstruct) {
- var NewTarget = _getPrototypeOf(this).constructor;
- result = Reflect.construct(Super, arguments, NewTarget);
- } else {
- result = Super.apply(this, arguments);
- }
- return _possibleConstructorReturn(this, result);
- };
- }
- function _possibleConstructorReturn(self, call) {
- if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) {
- return call;
- }
- return _assertThisInitialized(self);
- }
- function _assertThisInitialized(self) {
- if (self === void 0) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
- return self;
- }
- function _isNativeReflectConstruct() {
- if (typeof Reflect === "undefined" || !Reflect.construct) return false;
- if (Reflect.construct.sham) return false;
- if (typeof Proxy === "function") return true;
- try {
- Date.prototype.toString.call(Reflect.construct(Date, [], function() {
- }));
- return true;
- } catch (e2) {
- return false;
- }
- }
- function _getPrototypeOf(o2) {
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o3) {
- return o3.__proto__ || Object.getPrototypeOf(o3);
- };
- return _getPrototypeOf(o2);
- }
- function getAttributeValue(suffix, element) {
- var attribute = "data-clipboard-".concat(suffix);
- if (!element.hasAttribute(attribute)) {
- return;
- }
- return element.getAttribute(attribute);
- }
- var Clipboard2 = /* @__PURE__ */ function(_Emitter) {
- _inherits(Clipboard3, _Emitter);
- var _super = _createSuper(Clipboard3);
- function Clipboard3(trigger, options) {
- var _this;
- _classCallCheck(this, Clipboard3);
- _this = _super.call(this);
- _this.resolveOptions(options);
- _this.listenClick(trigger);
- return _this;
- }
- _createClass(Clipboard3, [{
- key: "resolveOptions",
- value: function resolveOptions() {
- var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
- this.action = typeof options.action === "function" ? options.action : this.defaultAction;
- this.target = typeof options.target === "function" ? options.target : this.defaultTarget;
- this.text = typeof options.text === "function" ? options.text : this.defaultText;
- this.container = clipboard_typeof(options.container) === "object" ? options.container : document.body;
- }
- /**
- * Adds a click event listener to the passed trigger.
- * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
- */
- }, {
- key: "listenClick",
- value: function listenClick(trigger) {
- var _this2 = this;
- this.listener = listen_default()(trigger, "click", function(e2) {
- return _this2.onClick(e2);
- });
- }
- /**
- * Defines a new `ClipboardAction` on each click event.
- * @param {Event} e
- */
- }, {
- key: "onClick",
- value: function onClick(e2) {
- var trigger = e2.delegateTarget || e2.currentTarget;
- var action = this.action(trigger) || "copy";
- var text = actions_default({
- action,
- container: this.container,
- target: this.target(trigger),
- text: this.text(trigger)
- });
- this.emit(text ? "success" : "error", {
- action,
- text,
- trigger,
- clearSelection: function clearSelection() {
- if (trigger) {
- trigger.focus();
- }
- window.getSelection().removeAllRanges();
- }
- });
- }
- /**
- * Default `action` lookup function.
- * @param {Element} trigger
- */
- }, {
- key: "defaultAction",
- value: function defaultAction(trigger) {
- return getAttributeValue("action", trigger);
- }
- /**
- * Default `target` lookup function.
- * @param {Element} trigger
- */
- }, {
- key: "defaultTarget",
- value: function defaultTarget(trigger) {
- var selector = getAttributeValue("target", trigger);
- if (selector) {
- return document.querySelector(selector);
- }
- }
- /**
- * Allow fire programmatically a copy action
- * @param {String|HTMLElement} target
- * @param {Object} options
- * @returns Text copied.
- */
- }, {
- key: "defaultText",
- /**
- * Default `text` lookup function.
- * @param {Element} trigger
- */
- value: function defaultText(trigger) {
- return getAttributeValue("text", trigger);
- }
- /**
- * Destroy lifecycle.
- */
- }, {
- key: "destroy",
- value: function destroy() {
- this.listener.destroy();
- }
- }], [{
- key: "copy",
- value: function copy(target) {
- var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
- container: document.body
- };
- return actions_copy(target, options);
- }
- /**
- * Allow fire programmatically a cut action
- * @param {String|HTMLElement} target
- * @returns Text cutted.
- */
- }, {
- key: "cut",
- value: function cut(target) {
- return actions_cut(target);
- }
- /**
- * Returns the support of the given action, or all actions if no action is
- * given.
- * @param {String} [action]
- */
- }, {
- key: "isSupported",
- value: function isSupported() {
- var action = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ["copy", "cut"];
- var actions = typeof action === "string" ? [action] : action;
- var support = !!document.queryCommandSupported;
- actions.forEach(function(action2) {
- support = support && !!document.queryCommandSupported(action2);
- });
- return support;
- }
- }]);
- return Clipboard3;
- }(tiny_emitter_default());
- var clipboard = Clipboard2;
- }
- ),
- /***/
- 828: (
- /***/
- function(module2) {
- var DOCUMENT_NODE_TYPE = 9;
- if (typeof Element !== "undefined" && !Element.prototype.matches) {
- var proto = Element.prototype;
- proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector;
- }
- function closest(element, selector) {
- while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
- if (typeof element.matches === "function" && element.matches(selector)) {
- return element;
- }
- element = element.parentNode;
- }
- }
- module2.exports = closest;
- }
- ),
- /***/
- 438: (
- /***/
- function(module2, __unused_webpack_exports, __webpack_require__2) {
- var closest = __webpack_require__2(828);
- function _delegate(element, selector, type, callback, useCapture) {
- var listenerFn = listener.apply(this, arguments);
- element.addEventListener(type, listenerFn, useCapture);
- return {
- destroy: function() {
- element.removeEventListener(type, listenerFn, useCapture);
- }
- };
- }
- function delegate(elements, selector, type, callback, useCapture) {
- if (typeof elements.addEventListener === "function") {
- return _delegate.apply(null, arguments);
- }
- if (typeof type === "function") {
- return _delegate.bind(null, document).apply(null, arguments);
- }
- if (typeof elements === "string") {
- elements = document.querySelectorAll(elements);
- }
- return Array.prototype.map.call(elements, function(element) {
- return _delegate(element, selector, type, callback, useCapture);
- });
- }
- function listener(element, selector, type, callback) {
- return function(e2) {
- e2.delegateTarget = closest(e2.target, selector);
- if (e2.delegateTarget) {
- callback.call(element, e2);
- }
- };
- }
- module2.exports = delegate;
- }
- ),
- /***/
- 879: (
- /***/
- function(__unused_webpack_module, exports2) {
- exports2.node = function(value) {
- return value !== void 0 && value instanceof HTMLElement && value.nodeType === 1;
- };
- exports2.nodeList = function(value) {
- var type = Object.prototype.toString.call(value);
- return value !== void 0 && (type === "[object NodeList]" || type === "[object HTMLCollection]") && "length" in value && (value.length === 0 || exports2.node(value[0]));
- };
- exports2.string = function(value) {
- return typeof value === "string" || value instanceof String;
- };
- exports2.fn = function(value) {
- var type = Object.prototype.toString.call(value);
- return type === "[object Function]";
- };
- }
- ),
- /***/
- 370: (
- /***/
- function(module2, __unused_webpack_exports, __webpack_require__2) {
- var is = __webpack_require__2(879);
- var delegate = __webpack_require__2(438);
- function listen(target, type, callback) {
- if (!target && !type && !callback) {
- throw new Error("Missing required arguments");
- }
- if (!is.string(type)) {
- throw new TypeError("Second argument must be a String");
- }
- if (!is.fn(callback)) {
- throw new TypeError("Third argument must be a Function");
- }
- if (is.node(target)) {
- return listenNode(target, type, callback);
- } else if (is.nodeList(target)) {
- return listenNodeList(target, type, callback);
- } else if (is.string(target)) {
- return listenSelector(target, type, callback);
- } else {
- throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
- }
- }
- function listenNode(node, type, callback) {
- node.addEventListener(type, callback);
- return {
- destroy: function() {
- node.removeEventListener(type, callback);
- }
- };
- }
- function listenNodeList(nodeList, type, callback) {
- Array.prototype.forEach.call(nodeList, function(node) {
- node.addEventListener(type, callback);
- });
- return {
- destroy: function() {
- Array.prototype.forEach.call(nodeList, function(node) {
- node.removeEventListener(type, callback);
- });
- }
- };
- }
- function listenSelector(selector, type, callback) {
- return delegate(document.body, selector, type, callback);
- }
- module2.exports = listen;
- }
- ),
- /***/
- 817: (
- /***/
- function(module2) {
- function select(element) {
- var selectedText;
- if (element.nodeName === "SELECT") {
- element.focus();
- selectedText = element.value;
- } else if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {
- var isReadOnly = element.hasAttribute("readonly");
- if (!isReadOnly) {
- element.setAttribute("readonly", "");
- }
- element.select();
- element.setSelectionRange(0, element.value.length);
- if (!isReadOnly) {
- element.removeAttribute("readonly");
- }
- selectedText = element.value;
- } else {
- if (element.hasAttribute("contenteditable")) {
- element.focus();
- }
- var selection = window.getSelection();
- var range = document.createRange();
- range.selectNodeContents(element);
- selection.removeAllRanges();
- selection.addRange(range);
- selectedText = selection.toString();
- }
- return selectedText;
- }
- module2.exports = select;
- }
- ),
- /***/
- 279: (
- /***/
- function(module2) {
- function E() {
- }
- E.prototype = {
- on: function(name, callback, ctx) {
- var e2 = this.e || (this.e = {});
- (e2[name] || (e2[name] = [])).push({
- fn: callback,
- ctx
- });
- return this;
- },
- once: function(name, callback, ctx) {
- var self = this;
- function listener() {
- self.off(name, listener);
- callback.apply(ctx, arguments);
- }
- ;
- listener._ = callback;
- return this.on(name, listener, ctx);
- },
- emit: function(name) {
- var data = [].slice.call(arguments, 1);
- var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
- var i3 = 0;
- var len = evtArr.length;
- for (i3; i3 < len; i3++) {
- evtArr[i3].fn.apply(evtArr[i3].ctx, data);
- }
- return this;
- },
- off: function(name, callback) {
- var e2 = this.e || (this.e = {});
- var evts = e2[name];
- var liveEvents = [];
- if (evts && callback) {
- for (var i3 = 0, len = evts.length; i3 < len; i3++) {
- if (evts[i3].fn !== callback && evts[i3].fn._ !== callback)
- liveEvents.push(evts[i3]);
- }
- }
- liveEvents.length ? e2[name] = liveEvents : delete e2[name];
- return this;
- }
- };
- module2.exports = E;
- module2.exports.TinyEmitter = E;
- }
- )
- /******/
- };
- var __webpack_module_cache__ = {};
- function __webpack_require__(moduleId) {
- if (__webpack_module_cache__[moduleId]) {
- return __webpack_module_cache__[moduleId].exports;
- }
- var module2 = __webpack_module_cache__[moduleId] = {
- /******/
- // no module.id needed
- /******/
- // no module.loaded needed
- /******/
- exports: {}
- /******/
- };
- __webpack_modules__[moduleId](module2, module2.exports, __webpack_require__);
- return module2.exports;
- }
- !function() {
- __webpack_require__.n = function(module2) {
- var getter = module2 && module2.__esModule ? (
- /******/
- function() {
- return module2["default"];
- }
- ) : (
- /******/
- function() {
- return module2;
- }
- );
- __webpack_require__.d(getter, { a: getter });
- return getter;
- };
- }();
- !function() {
- __webpack_require__.d = function(exports2, definition) {
- for (var key in definition) {
- if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports2, key)) {
- Object.defineProperty(exports2, key, { enumerable: true, get: definition[key] });
- }
- }
- };
- }();
- !function() {
- __webpack_require__.o = function(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
- };
- }();
- return __webpack_require__(686);
- }().default
- );
- });
- }
- });
-
- // node_modules/quicklink/dist/quicklink.mjs
- function e(e2) {
- return new Promise(function(n2, r2, t2) {
- (t2 = new XMLHttpRequest()).open("GET", e2, t2.withCredentials = true), t2.onload = function() {
- 200 === t2.status ? n2() : r2();
- }, t2.send();
- });
- }
- var n;
- var r = (n = document.createElement("link")).relList && n.relList.supports && n.relList.supports("prefetch") ? function(e2) {
- return new Promise(function(n2, r2, t2) {
- (t2 = document.createElement("link")).rel = "prefetch", t2.href = e2, t2.onload = n2, t2.onerror = r2, document.head.appendChild(t2);
- });
- } : e;
- var t = window.requestIdleCallback || function(e2) {
- var n2 = Date.now();
- return setTimeout(function() {
- e2({ didTimeout: false, timeRemaining: function() {
- return Math.max(0, 50 - (Date.now() - n2));
- } });
- }, 1);
- };
- var o = /* @__PURE__ */ new Set();
- var i = /* @__PURE__ */ new Set();
- var c = false;
- function a(e2) {
- if (e2) {
- if (e2.saveData) return new Error("Save-Data is enabled");
- if (/2g/.test(e2.effectiveType)) return new Error("network conditions are poor");
- }
- return true;
- }
- function u(e2) {
- if (e2 || (e2 = {}), window.IntersectionObserver) {
- var n2 = function(e3) {
- e3 = e3 || 1;
- var n3 = [], r3 = 0;
- function t2() {
- r3 < e3 && n3.length > 0 && (n3.shift()(), r3++);
- }
- return [function(e4) {
- n3.push(e4) > 1 || t2();
- }, function() {
- r3--, t2();
- }];
- }(e2.throttle || 1 / 0), r2 = n2[0], a2 = n2[1], u2 = e2.limit || 1 / 0, l = e2.origins || [location.hostname], d = e2.ignores || [], h = e2.delay || 0, p = [], m = e2.timeoutFn || t, w = "function" == typeof e2.hrefFn && e2.hrefFn, g = e2.prerender || false;
- c = e2.prerenderAndPrefetch || false;
- var v = new IntersectionObserver(function(n3) {
- n3.forEach(function(n4) {
- if (n4.isIntersecting) p.push((n4 = n4.target).href), function(e3, n5) {
- n5 ? setTimeout(e3, n5) : e3();
- }(function() {
- -1 !== p.indexOf(n4.href) && (v.unobserve(n4), (c || g) && i.size < 1 ? f(w ? w(n4) : n4.href).catch(function(n5) {
- if (!e2.onError) throw n5;
- e2.onError(n5);
- }) : o.size < u2 && !g && r2(function() {
- s(w ? w(n4) : n4.href, e2.priority).then(a2).catch(function(n5) {
- a2(), e2.onError && e2.onError(n5);
- });
- }));
- }, h);
- else {
- var t2 = p.indexOf((n4 = n4.target).href);
- t2 > -1 && p.splice(t2);
- }
- });
- }, { threshold: e2.threshold || 0 });
- return m(function() {
- (e2.el || document).querySelectorAll("a").forEach(function(e3) {
- l.length && !l.includes(e3.hostname) || function e4(n3, r3) {
- return Array.isArray(r3) ? r3.some(function(r4) {
- return e4(n3, r4);
- }) : (r3.test || r3).call(r3, n3.href, n3);
- }(e3, d) || v.observe(e3);
- });
- }, { timeout: e2.timeout || 2e3 }), function() {
- o.clear(), v.disconnect();
- };
- }
- }
- function s(n2, t2, u2) {
- var s2 = a(navigator.connection);
- return s2 instanceof Error ? Promise.reject(new Error("Cannot prefetch, " + s2.message)) : (i.size > 0 && !c && console.warn("[Warning] You are using both prefetching and prerendering on the same document"), Promise.all([].concat(n2).map(function(n3) {
- if (!o.has(n3)) return o.add(n3), (t2 ? function(n4) {
- return window.fetch ? fetch(n4, { credentials: "include" }) : e(n4);
- } : r)(new URL(n3, location.href).toString());
- })));
- }
- function f(e2, n2) {
- var r2 = a(navigator.connection);
- if (r2 instanceof Error) return Promise.reject(new Error("Cannot prerender, " + r2.message));
- if (!HTMLScriptElement.supports("speculationrules")) return s(e2), Promise.reject(new Error("This browser does not support the speculation rules API. Falling back to prefetch."));
- if (document.querySelector('script[type="speculationrules"]')) return Promise.reject(new Error("Speculation Rules is already defined and cannot be altered."));
- for (var t2 = 0, u2 = [].concat(e2); t2 < u2.length; t2 += 1) {
- var f2 = u2[t2];
- if (window.location.origin !== new URL(f2, window.location.href).origin) return Promise.reject(new Error("Only same origin URLs are allowed: " + f2));
- i.add(f2);
- }
- o.size > 0 && !c && console.warn("[Warning] You are using both prefetching and prerendering on the same document");
- var l = function(e3) {
- var n3 = document.createElement("script");
- n3.type = "speculationrules", n3.text = '{"prerender":[{"source": "list","urls": ["' + Array.from(e3).join('","') + '"]}]}';
- try {
- document.head.appendChild(n3);
- } catch (e4) {
- return e4;
- }
- return true;
- }(i);
- return true === l ? Promise.resolve() : Promise.reject(l);
- }
-
- // node_modules/@thulite/core/assets/js/core.js
- var import_lazysizes = __toESM(require_lazysizes());
- var import_ls = __toESM(require_ls_native_loading());
- u({
- ignores: [
- /\/api\/?/,
- (uri) => uri.includes(".zip"),
- (uri, elem) => elem.hasAttribute("noprefetch"),
- (uri, elem) => elem.hash && elem.pathname === window.location.pathname
- ]
- });
- import_lazysizes.default.cfg.nativeLoading = {
- setLoadingAttribute: true,
- disableListeners: {
- scroll: true
- }
- };
-
- // ns-hugo-imp:C:\Users\abuza\projects\wth-docs-lab\node_modules\@thulite\doks-core\assets\js\clipboard.js
- var import_clipboard = __toESM(require_clipboard());
- (() => {
- "use strict";
- var cb = document.getElementsByClassName("highlight");
- for (var i3 = 0; i3 < cb.length; ++i3) {
- var element = cb[i3];
- element.insertAdjacentHTML("afterbegin", '');
- }
- var clipboard = new import_clipboard.default(".btn-copy", {
- target: function(trigger) {
- return trigger.parentNode.nextElementSibling;
- }
- });
- clipboard.on("success", function(e2) {
- e2.clearSelection();
- });
- clipboard.on("error", function(e2) {
- console.error("Action:", e2.action);
- console.error("Trigger:", e2.trigger);
- });
- })();
-
- // ns-hugo-imp:C:\Users\abuza\projects\wth-docs-lab\node_modules\@thulite\doks-core\assets\js\to-top.js
- var topButton = document.getElementById("toTop");
- if (topButton !== null) {
- topButton.classList.remove("fade");
- window.onscroll = function() {
- scrollFunction();
- };
- topButton.addEventListener("click", topFunction);
- }
- function scrollFunction() {
- if (document.body.scrollTop > 270 || document.documentElement.scrollTop > 270) {
- topButton.classList.add("fade");
- } else {
- topButton.classList.remove("fade");
- }
- }
- function topFunction() {
- document.body.scrollTop = 0;
- document.documentElement.scrollTop = 0;
- }
-
- // ns-hugo-imp:C:\Users\abuza\projects\wth-docs-lab\node_modules\@thulite\doks-core\assets\js\tabs.js
- var i2;
- var allTabs = document.querySelectorAll("[data-toggle-tab]");
- var allPanes = document.querySelectorAll("[data-pane]");
- function toggleTabs(event) {
- if (event.target) {
- event.preventDefault();
- var clickedTab = event.currentTarget;
- var targetKey = clickedTab.getAttribute("data-toggle-tab");
- } else {
- var targetKey = event;
- }
- if (window.localStorage) {
- window.localStorage.setItem("configLangPref", targetKey);
- }
- var selectedTabs = document.querySelectorAll("[data-toggle-tab=" + targetKey + "]");
- var selectedPanes = document.querySelectorAll("[data-pane=" + targetKey + "]");
- for (var i3 = 0; i3 < allTabs.length; i3++) {
- allTabs[i3].classList.remove("active");
- allPanes[i3].classList.remove("active");
- }
- for (var i3 = 0; i3 < selectedTabs.length; i3++) {
- selectedTabs[i3].classList.add("active");
- selectedPanes[i3].classList.add("show", "active");
- }
- }
- for (i2 = 0; i2 < allTabs.length; i2++) {
- allTabs[i2].addEventListener("click", toggleTabs);
- }
- if (window.localStorage.getItem("configLangPref")) {
- toggleTabs(window.localStorage.getItem("configLangPref"));
- }
-})();
-/*! Bundled license information:
-
-clipboard/dist/clipboard.js:
- (*!
- * clipboard.js v2.0.11
- * https://clipboardjs.com/
- *
- * Licensed MIT © Zeno Rocha
- *)
-
-@thulite/doks-core/assets/js/clipboard.js:
- (*!
- * clipboard.js for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- *)
-*/
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9sYXp5c2l6ZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9wbHVnaW5zL25hdGl2ZS1sb2FkaW5nL2xzLm5hdGl2ZS1sb2FkaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3F1aWNrbGluay9kaXN0L3F1aWNrbGluay5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL0B0aHVsaXRlL2NvcmUvYXNzZXRzL2pzL2NvcmUuanMiLCAibnMtaHVnby1pbXA6QzpcXFVzZXJzXFxhYnV6YVxccHJvamVjdHNcXHd0aC1kb2NzLWxhYlxcbm9kZV9tb2R1bGVzXFxAdGh1bGl0ZVxcZG9rcy1jb3JlXFxhc3NldHNcXGpzXFxjbGlwYm9hcmQuanMiLCAibnMtaHVnby1pbXA6QzpcXFVzZXJzXFxhYnV6YVxccHJvamVjdHNcXHd0aC1kb2NzLWxhYlxcbm9kZV9tb2R1bGVzXFxAdGh1bGl0ZVxcZG9rcy1jb3JlXFxhc3NldHNcXGpzXFx0by10b3AuanMiLCAibnMtaHVnby1pbXA6QzpcXFVzZXJzXFxhYnV6YVxccHJvamVjdHNcXHd0aC1kb2NzLWxhYlxcbm9kZV9tb2R1bGVzXFxAdGh1bGl0ZVxcZG9rcy1jb3JlXFxhc3NldHNcXGpzXFx0YWJzLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24od2luZG93LCBmYWN0b3J5KSB7XG5cdHZhciBsYXp5U2l6ZXMgPSBmYWN0b3J5KHdpbmRvdywgd2luZG93LmRvY3VtZW50LCBEYXRlKTtcblx0d2luZG93LmxhenlTaXplcyA9IGxhenlTaXplcztcblx0aWYodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyl7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBsYXp5U2l6ZXM7XG5cdH1cbn0odHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/XG4gICAgICB3aW5kb3cgOiB7fSwgXG4vKipcbiAqIGltcG9ydChcIi4vdHlwZXMvZ2xvYmFsXCIpXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vdHlwZXMvbGF6eXNpemVzLWNvbmZpZ1wiKS5MYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH0gTGF6eVNpemVzQ29uZmlnUGFydGlhbFxuICovXG5mdW5jdGlvbiBsKHdpbmRvdywgZG9jdW1lbnQsIERhdGUpIHsgLy8gUGFzcyBpbiB0aGUgd2luZG93IERhdGUgZnVuY3Rpb24gYWxzbyBmb3IgU1NSIGJlY2F1c2UgdGhlIERhdGUgY2xhc3MgY2FuIGJlIGxvc3Rcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuXG5cdHZhciBsYXp5c2l6ZXMsXG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRsYXp5U2l6ZXNDZmc7XG5cblx0KGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHByb3A7XG5cblx0XHR2YXIgbGF6eVNpemVzRGVmYXVsdHMgPSB7XG5cdFx0XHRsYXp5Q2xhc3M6ICdsYXp5bG9hZCcsXG5cdFx0XHRsb2FkZWRDbGFzczogJ2xhenlsb2FkZWQnLFxuXHRcdFx0bG9hZGluZ0NsYXNzOiAnbGF6eWxvYWRpbmcnLFxuXHRcdFx0cHJlbG9hZENsYXNzOiAnbGF6eXByZWxvYWQnLFxuXHRcdFx0ZXJyb3JDbGFzczogJ2xhenllcnJvcicsXG5cdFx0XHQvL3N0cmljdENsYXNzOiAnbGF6eXN0cmljdCcsXG5cdFx0XHRhdXRvc2l6ZXNDbGFzczogJ2xhenlhdXRvc2l6ZXMnLFxuXHRcdFx0ZmFzdExvYWRlZENsYXNzOiAnbHMtaXMtY2FjaGVkJyxcblx0XHRcdGlmcmFtZUxvYWRNb2RlOiAwLFxuXHRcdFx0c3JjQXR0cjogJ2RhdGEtc3JjJyxcblx0XHRcdHNyY3NldEF0dHI6ICdkYXRhLXNyY3NldCcsXG5cdFx0XHRzaXplc0F0dHI6ICdkYXRhLXNpemVzJyxcblx0XHRcdC8vcHJlbG9hZEFmdGVyTG9hZDogZmFsc2UsXG5cdFx0XHRtaW5TaXplOiA0MCxcblx0XHRcdGN1c3RvbU1lZGlhOiB7fSxcblx0XHRcdGluaXQ6IHRydWUsXG5cdFx0XHRleHBGYWN0b3I6IDEuNSxcblx0XHRcdGhGYWM6IDAuOCxcblx0XHRcdGxvYWRNb2RlOiAyLFxuXHRcdFx0bG9hZEhpZGRlbjogdHJ1ZSxcblx0XHRcdHJpY1RpbWVvdXQ6IDAsXG5cdFx0XHR0aHJvdHRsZURlbGF5OiAxMjUsXG5cdFx0fTtcblxuXHRcdGxhenlTaXplc0NmZyA9IHdpbmRvdy5sYXp5U2l6ZXNDb25maWcgfHwgd2luZG93LmxhenlzaXplc0NvbmZpZyB8fCB7fTtcblxuXHRcdGZvcihwcm9wIGluIGxhenlTaXplc0RlZmF1bHRzKXtcblx0XHRcdGlmKCEocHJvcCBpbiBsYXp5U2l6ZXNDZmcpKXtcblx0XHRcdFx0bGF6eVNpemVzQ2ZnW3Byb3BdID0gbGF6eVNpemVzRGVmYXVsdHNbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KSgpO1xuXG5cdGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW5pdDogZnVuY3Rpb24gKCkge30sXG5cdFx0XHQvKipcblx0XHRcdCAqIEB0eXBlIHsgTGF6eVNpemVzQ29uZmlnUGFydGlhbCB9XG5cdFx0XHQgKi9cblx0XHRcdGNmZzogbGF6eVNpemVzQ2ZnLFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAdHlwZSB7IHRydWUgfVxuXHRcdFx0ICovXG5cdFx0XHRub1N1cHBvcnQ6IHRydWUsXG5cdFx0fTtcblx0fVxuXG5cdHZhciBkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdHZhciBzdXBwb3J0UGljdHVyZSA9IHdpbmRvdy5IVE1MUGljdHVyZUVsZW1lbnQ7XG5cblx0dmFyIF9hZGRFdmVudExpc3RlbmVyID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xuXG5cdHZhciBfZ2V0QXR0cmlidXRlID0gJ2dldEF0dHJpYnV0ZSc7XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0byBiaW5kIHRvIHdpbmRvdyBiZWNhdXNlICd0aGlzJyBiZWNvbWVzIG51bGwgZHVyaW5nIFNTUlxuXHQgKiBidWlsZHMuXG5cdCAqL1xuXHR2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IHdpbmRvd1tfYWRkRXZlbnRMaXN0ZW5lcl0uYmluZCh3aW5kb3cpO1xuXG5cdHZhciBzZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQ7XG5cblx0dmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2V0VGltZW91dDtcblxuXHR2YXIgcmVxdWVzdElkbGVDYWxsYmFjayA9IHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrO1xuXG5cdHZhciByZWdQaWN0dXJlID0gL15waWN0dXJlJC9pO1xuXG5cdHZhciBsb2FkRXZlbnRzID0gWydsb2FkJywgJ2Vycm9yJywgJ2xhenlpbmNsdWRlZCcsICdfbGF6eWxvYWRlZCddO1xuXG5cdHZhciByZWdDbGFzc0NhY2hlID0ge307XG5cblx0dmFyIGZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDtcblxuXHQvKipcblx0ICogQHBhcmFtIGVsZSB7RWxlbWVudH1cblx0ICogQHBhcmFtIGNscyB7c3RyaW5nfVxuXHQgKi9cblx0dmFyIGhhc0NsYXNzID0gZnVuY3Rpb24oZWxlLCBjbHMpIHtcblx0XHRpZighcmVnQ2xhc3NDYWNoZVtjbHNdKXtcblx0XHRcdHJlZ0NsYXNzQ2FjaGVbY2xzXSA9IG5ldyBSZWdFeHAoJyhcXFxcc3xeKScrY2xzKycoXFxcXHN8JCknKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ0NsYXNzQ2FjaGVbY2xzXS50ZXN0KGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykgJiYgcmVnQ2xhc3NDYWNoZVtjbHNdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gZWxlIHtFbGVtZW50fVxuXHQgKiBAcGFyYW0gY2xzIHtzdHJpbmd9XG5cdCAqL1xuXHR2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbihlbGUsIGNscykge1xuXHRcdGlmICghaGFzQ2xhc3MoZWxlLCBjbHMpKXtcblx0XHRcdGVsZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykudHJpbSgpICsgJyAnICsgY2xzKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGUge0VsZW1lbnR9XG5cdCAqIEBwYXJhbSBjbHMge3N0cmluZ31cblx0ICovXG5cdHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGVsZSwgY2xzKSB7XG5cdFx0dmFyIHJlZztcblx0XHRpZiAoKHJlZyA9IGhhc0NsYXNzKGVsZSxjbHMpKSkge1xuXHRcdFx0ZWxlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAoZWxlW19nZXRBdHRyaWJ1dGVdKCdjbGFzcycpIHx8ICcnKS5yZXBsYWNlKHJlZywgJyAnKSk7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhZGRSZW1vdmVMb2FkRXZlbnRzID0gZnVuY3Rpb24oZG9tLCBmbiwgYWRkKXtcblx0XHR2YXIgYWN0aW9uID0gYWRkID8gX2FkZEV2ZW50TGlzdGVuZXIgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cdFx0aWYoYWRkKXtcblx0XHRcdGFkZFJlbW92ZUxvYWRFdmVudHMoZG9tLCBmbik7XG5cdFx0fVxuXHRcdGxvYWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldnQpe1xuXHRcdFx0ZG9tW2FjdGlvbl0oZXZ0LCBmbik7XG5cdFx0fSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGVtIHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBuYW1lIHsgc3RyaW5nIH1cblx0ICogQHBhcmFtIGRldGFpbCB7IGFueSB9XG5cdCAqIEBwYXJhbSBub0J1YmJsZXMgeyBib29sZWFuIH1cblx0ICogQHBhcmFtIG5vQ2FuY2VsYWJsZSB7IGJvb2xlYW4gfVxuXHQgKiBAcmV0dXJucyB7IEN1c3RvbUV2ZW50IH1cblx0ICovXG5cdHZhciB0cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbihlbGVtLCBuYW1lLCBkZXRhaWwsIG5vQnViYmxlcywgbm9DYW5jZWxhYmxlKXtcblx0XHR2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblxuXHRcdGlmKCFkZXRhaWwpe1xuXHRcdFx0ZGV0YWlsID0ge307XG5cdFx0fVxuXG5cdFx0ZGV0YWlsLmluc3RhbmNlID0gbGF6eXNpemVzO1xuXG5cdFx0ZXZlbnQuaW5pdEV2ZW50KG5hbWUsICFub0J1YmJsZXMsICFub0NhbmNlbGFibGUpO1xuXG5cdFx0ZXZlbnQuZGV0YWlsID0gZGV0YWlsO1xuXG5cdFx0ZWxlbS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH07XG5cblx0dmFyIHVwZGF0ZVBvbHlmaWxsID0gZnVuY3Rpb24gKGVsLCBmdWxsKXtcblx0XHR2YXIgcG9seWZpbGw7XG5cdFx0aWYoICFzdXBwb3J0UGljdHVyZSAmJiAoIHBvbHlmaWxsID0gKHdpbmRvdy5waWN0dXJlZmlsbCB8fCBsYXp5U2l6ZXNDZmcucGYpICkgKXtcblx0XHRcdGlmKGZ1bGwgJiYgZnVsbC5zcmMgJiYgIWVsW19nZXRBdHRyaWJ1dGVdKCdzcmNzZXQnKSl7XG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZnVsbC5zcmMpO1xuXHRcdFx0fVxuXHRcdFx0cG9seWZpbGwoe3JlZXZhbHVhdGU6IHRydWUsIGVsZW1lbnRzOiBbZWxdfSk7XG5cdFx0fSBlbHNlIGlmKGZ1bGwgJiYgZnVsbC5zcmMpe1xuXHRcdFx0ZWwuc3JjID0gZnVsbC5zcmM7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBnZXRDU1MgPSBmdW5jdGlvbiAoZWxlbSwgc3R5bGUpe1xuXHRcdHJldHVybiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSB8fCB7fSlbc3R5bGVdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbSB7IEVsZW1lbnQgfVxuXHQgKiBAcGFyYW0gcGFyZW50IHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBbd2lkdGhdIHtudW1iZXJ9XG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHR2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbihlbGVtLCBwYXJlbnQsIHdpZHRoKXtcblx0XHR3aWR0aCA9IHdpZHRoIHx8IGVsZW0ub2Zmc2V0V2lkdGg7XG5cblx0XHR3aGlsZSh3aWR0aCA8IGxhenlTaXplc0NmZy5taW5TaXplICYmIHBhcmVudCAmJiAhZWxlbS5fbGF6eXNpemVzV2lkdGgpe1xuXHRcdFx0d2lkdGggPSAgcGFyZW50Lm9mZnNldFdpZHRoO1xuXHRcdFx0cGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpZHRoO1xuXHR9O1xuXG5cdHZhciByQUYgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcnVubmluZywgd2FpdGluZztcblx0XHR2YXIgZmlyc3RGbnMgPSBbXTtcblx0XHR2YXIgc2Vjb25kRm5zID0gW107XG5cdFx0dmFyIGZucyA9IGZpcnN0Rm5zO1xuXG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgcnVuRm5zID0gZm5zO1xuXG5cdFx0XHRmbnMgPSBmaXJzdEZucy5sZW5ndGggPyBzZWNvbmRGbnMgOiBmaXJzdEZucztcblxuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cdFx0XHR3YWl0aW5nID0gZmFsc2U7XG5cblx0XHRcdHdoaWxlKHJ1bkZucy5sZW5ndGgpe1xuXHRcdFx0XHRydW5GbnMuc2hpZnQoKSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHZhciByYWZCYXRjaCA9IGZ1bmN0aW9uKGZuLCBxdWV1ZSl7XG5cdFx0XHRpZihydW5uaW5nICYmICFxdWV1ZSl7XG5cdFx0XHRcdGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbnMucHVzaChmbik7XG5cblx0XHRcdFx0aWYoIXdhaXRpbmcpe1xuXHRcdFx0XHRcdHdhaXRpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdChkb2N1bWVudC5oaWRkZW4gPyBzZXRUaW1lb3V0IDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lKShydW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJhZkJhdGNoLl9sc0ZsdXNoID0gcnVuO1xuXG5cdFx0cmV0dXJuIHJhZkJhdGNoO1xuXHR9KSgpO1xuXG5cdHZhciByQUZJdCA9IGZ1bmN0aW9uKGZuLCBzaW1wbGUpe1xuXHRcdHJldHVybiBzaW1wbGUgP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJBRihmbik7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHZhciB0aGF0ID0gdGhpcztcblx0XHRcdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHRcdGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHQ7XG5cdH07XG5cblx0dmFyIHRocm90dGxlID0gZnVuY3Rpb24oZm4pe1xuXHRcdHZhciBydW5uaW5nO1xuXHRcdHZhciBsYXN0VGltZSA9IDA7XG5cdFx0dmFyIGdEZWxheSA9IGxhenlTaXplc0NmZy50aHJvdHRsZURlbGF5O1xuXHRcdHZhciBySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0XHRsYXN0VGltZSA9IERhdGUubm93KCk7XG5cdFx0XHRmbigpO1xuXHRcdH07XG5cdFx0dmFyIGlkbGVDYWxsYmFjayA9IHJlcXVlc3RJZGxlQ2FsbGJhY2sgJiYgcklDVGltZW91dCA+IDQ5ID9cblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHJlcXVlc3RJZGxlQ2FsbGJhY2socnVuLCB7dGltZW91dDogcklDVGltZW91dH0pO1xuXG5cdFx0XHRcdGlmKHJJQ1RpbWVvdXQgIT09IGxhenlTaXplc0NmZy5yaWNUaW1lb3V0KXtcblx0XHRcdFx0XHRySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gOlxuXHRcdFx0ckFGSXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0c2V0VGltZW91dChydW4pO1xuXHRcdFx0fSwgdHJ1ZSlcblx0XHQ7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oaXNQcmlvcml0eSl7XG5cdFx0XHR2YXIgZGVsYXk7XG5cblx0XHRcdGlmKChpc1ByaW9yaXR5ID0gaXNQcmlvcml0eSA9PT0gdHJ1ZSkpe1xuXHRcdFx0XHRySUNUaW1lb3V0ID0gMzM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHJ1bm5pbmcpe1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJ1bm5pbmcgPSAgdHJ1ZTtcblxuXHRcdFx0ZGVsYXkgPSBnRGVsYXkgLSAoRGF0ZS5ub3coKSAtIGxhc3RUaW1lKTtcblxuXHRcdFx0aWYoZGVsYXkgPCAwKXtcblx0XHRcdFx0ZGVsYXkgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihpc1ByaW9yaXR5IHx8IGRlbGF5IDwgOSl7XG5cdFx0XHRcdGlkbGVDYWxsYmFjaygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0VGltZW91dChpZGxlQ2FsbGJhY2ssIGRlbGF5KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8vYmFzZWQgb24gaHR0cDovL21vZGVybmphdmFzY3JpcHQuYmxvZ3Nwb3QuZGUvMjAxMy8wOC9idWlsZGluZy1iZXR0ZXItZGVib3VuY2UuaHRtbFxuXHR2YXIgZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jKSB7XG5cdFx0dmFyIHRpbWVvdXQsIHRpbWVzdGFtcDtcblx0XHR2YXIgd2FpdCA9IDk5O1xuXHRcdHZhciBydW4gPSBmdW5jdGlvbigpe1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRmdW5jKCk7XG5cdFx0fTtcblx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBsYXN0ID0gRGF0ZS5ub3coKSAtIHRpbWVzdGFtcDtcblxuXHRcdFx0aWYgKGxhc3QgPCB3YWl0KSB7XG5cdFx0XHRcdHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChyZXF1ZXN0SWRsZUNhbGxiYWNrIHx8IHJ1bikocnVuKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0dGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuXHRcdFx0aWYgKCF0aW1lb3V0KSB7XG5cdFx0XHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBsb2FkZXIgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcHJlbG9hZEVsZW1zLCBpc0NvbXBsZXRlZCwgcmVzZXRQcmVsb2FkaW5nVGltZXIsIGxvYWRNb2RlLCBzdGFydGVkO1xuXG5cdFx0dmFyIGVMdlcsIGVsdkgsIGVMdG9wLCBlTGxlZnQsIGVMcmlnaHQsIGVMYm90dG9tLCBpc0JvZHlIaWRkZW47XG5cblx0XHR2YXIgcmVnSW1nID0gL15pbWckL2k7XG5cdFx0dmFyIHJlZ0lmcmFtZSA9IC9eaWZyYW1lJC9pO1xuXG5cdFx0dmFyIHN1cHBvcnRTY3JvbGwgPSAoJ29uc2Nyb2xsJyBpbiB3aW5kb3cpICYmICEoLyhnbGV8aW5nKWJvdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSk7XG5cblx0XHR2YXIgc2hyaW5rRXhwYW5kID0gMDtcblx0XHR2YXIgY3VycmVudEV4cGFuZCA9IDA7XG5cblx0XHR2YXIgaXNMb2FkaW5nID0gMDtcblx0XHR2YXIgbG93UnVucyA9IC0xO1xuXG5cdFx0dmFyIHJlc2V0UHJlbG9hZGluZyA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0aXNMb2FkaW5nLS07XG5cdFx0XHRpZighZSB8fCBpc0xvYWRpbmcgPCAwIHx8ICFlLnRhcmdldCl7XG5cdFx0XHRcdGlzTG9hZGluZyA9IDA7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBpc1Zpc2libGUgPSBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0aWYgKGlzQm9keUhpZGRlbiA9PSBudWxsKSB7XG5cdFx0XHRcdGlzQm9keUhpZGRlbiA9IGdldENTUyhkb2N1bWVudC5ib2R5LCAndmlzaWJpbGl0eScpID09ICdoaWRkZW4nO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaXNCb2R5SGlkZGVuIHx8ICEoZ2V0Q1NTKGVsZW0ucGFyZW50Tm9kZSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyAmJiBnZXRDU1MoZWxlbSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyk7XG5cdFx0fTtcblxuXHRcdHZhciBpc05lc3RlZFZpc2libGUgPSBmdW5jdGlvbihlbGVtLCBlbGVtRXhwYW5kKXtcblx0XHRcdHZhciBvdXRlclJlY3Q7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbTtcblx0XHRcdHZhciB2aXNpYmxlID0gaXNWaXNpYmxlKGVsZW0pO1xuXG5cdFx0XHRlTHRvcCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxib3R0b20gKz0gZWxlbUV4cGFuZDtcblx0XHRcdGVMbGVmdCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxyaWdodCArPSBlbGVtRXhwYW5kO1xuXG5cdFx0XHR3aGlsZSh2aXNpYmxlICYmIChwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50KSAmJiBwYXJlbnQgIT0gZG9jdW1lbnQuYm9keSAmJiBwYXJlbnQgIT0gZG9jRWxlbSl7XG5cdFx0XHRcdHZpc2libGUgPSAoKGdldENTUyhwYXJlbnQsICdvcGFjaXR5JykgfHwgMSkgPiAwKTtcblxuXHRcdFx0XHRpZih2aXNpYmxlICYmIGdldENTUyhwYXJlbnQsICdvdmVyZmxvdycpICE9ICd2aXNpYmxlJyl7XG5cdFx0XHRcdFx0b3V0ZXJSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHZpc2libGUgPSBlTHJpZ2h0ID4gb3V0ZXJSZWN0LmxlZnQgJiZcblx0XHRcdFx0XHRcdGVMbGVmdCA8IG91dGVyUmVjdC5yaWdodCAmJlxuXHRcdFx0XHRcdFx0ZUxib3R0b20gPiBvdXRlclJlY3QudG9wIC0gMSAmJlxuXHRcdFx0XHRcdFx0ZUx0b3AgPCBvdXRlclJlY3QuYm90dG9tICsgMVxuXHRcdFx0XHRcdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmlzaWJsZTtcblx0XHR9O1xuXG5cdFx0dmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBlTGxlbiwgaSwgcmVjdCwgYXV0b0xvYWRFbGVtLCBsb2FkZWRTb21ldGhpbmcsIGVsZW1FeHBhbmQsIGVsZW1OZWdhdGl2ZUV4cGFuZCwgZWxlbUV4cGFuZFZhbCxcblx0XHRcdFx0YmVmb3JlRXhwYW5kVmFsLCBkZWZhdWx0RXhwYW5kLCBwcmVsb2FkRXhwYW5kLCBoRmFjO1xuXHRcdFx0dmFyIGxhenlsb2FkRWxlbXMgPSBsYXp5c2l6ZXMuZWxlbWVudHM7XG5cblx0XHRcdGlmKChsb2FkTW9kZSA9IGxhenlTaXplc0NmZy5sb2FkTW9kZSkgJiYgaXNMb2FkaW5nIDwgOCAmJiAoZUxsZW4gPSBsYXp5bG9hZEVsZW1zLmxlbmd0aCkpe1xuXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGxvd1J1bnMrKztcblxuXHRcdFx0XHRmb3IoOyBpIDwgZUxsZW47IGkrKyl7XG5cblx0XHRcdFx0XHRpZighbGF6eWxvYWRFbGVtc1tpXSB8fCBsYXp5bG9hZEVsZW1zW2ldLl9sYXp5UmFjZSl7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIXN1cHBvcnRTY3JvbGwgfHwgKGxhenlzaXplcy5wcmVtYXR1cmVVbnZlaWwgJiYgbGF6eXNpemVzLnByZW1hdHVyZVVudmVpbChsYXp5bG9hZEVsZW1zW2ldKSkpe3VudmVpbEVsZW1lbnQobGF6eWxvYWRFbGVtc1tpXSk7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIShlbGVtRXhwYW5kVmFsID0gbGF6eWxvYWRFbGVtc1tpXVtfZ2V0QXR0cmlidXRlXSgnZGF0YS1leHBhbmQnKSkgfHwgIShlbGVtRXhwYW5kID0gZWxlbUV4cGFuZFZhbCAqIDEpKXtcblx0XHRcdFx0XHRcdGVsZW1FeHBhbmQgPSBjdXJyZW50RXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghZGVmYXVsdEV4cGFuZCkge1xuXHRcdFx0XHRcdFx0ZGVmYXVsdEV4cGFuZCA9ICghbGF6eVNpemVzQ2ZnLmV4cGFuZCB8fCBsYXp5U2l6ZXNDZmcuZXhwYW5kIDwgMSkgP1xuXHRcdFx0XHRcdFx0XHRkb2NFbGVtLmNsaWVudEhlaWdodCA+IDUwMCAmJiBkb2NFbGVtLmNsaWVudFdpZHRoID4gNTAwID8gNTAwIDogMzcwIDpcblx0XHRcdFx0XHRcdFx0bGF6eVNpemVzQ2ZnLmV4cGFuZDtcblxuXHRcdFx0XHRcdFx0bGF6eXNpemVzLl9kZWZFeCA9IGRlZmF1bHRFeHBhbmQ7XG5cblx0XHRcdFx0XHRcdHByZWxvYWRFeHBhbmQgPSBkZWZhdWx0RXhwYW5kICogbGF6eVNpemVzQ2ZnLmV4cEZhY3Rvcjtcblx0XHRcdFx0XHRcdGhGYWMgPSBsYXp5U2l6ZXNDZmcuaEZhYztcblx0XHRcdFx0XHRcdGlzQm9keUhpZGRlbiA9IG51bGw7XG5cblx0XHRcdFx0XHRcdGlmKGN1cnJlbnRFeHBhbmQgPCBwcmVsb2FkRXhwYW5kICYmIGlzTG9hZGluZyA8IDEgJiYgbG93UnVucyA+IDIgJiYgbG9hZE1vZGUgPiAyICYmICFkb2N1bWVudC5oaWRkZW4pe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gcHJlbG9hZEV4cGFuZDtcblx0XHRcdFx0XHRcdFx0bG93UnVucyA9IDA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYobG9hZE1vZGUgPiAxICYmIGxvd1J1bnMgPiAxICYmIGlzTG9hZGluZyA8IDYpe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gZGVmYXVsdEV4cGFuZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRFeHBhbmQgPSBzaHJpbmtFeHBhbmQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoYmVmb3JlRXhwYW5kVmFsICE9PSBlbGVtRXhwYW5kKXtcblx0XHRcdFx0XHRcdGVMdlcgPSBpbm5lcldpZHRoICsgKGVsZW1FeHBhbmQgKiBoRmFjKTtcblx0XHRcdFx0XHRcdGVsdkggPSBpbm5lckhlaWdodCArIGVsZW1FeHBhbmQ7XG5cdFx0XHRcdFx0XHRlbGVtTmVnYXRpdmVFeHBhbmQgPSBlbGVtRXhwYW5kICogLTE7XG5cdFx0XHRcdFx0XHRiZWZvcmVFeHBhbmRWYWwgPSBlbGVtRXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlY3QgPSBsYXp5bG9hZEVsZW1zW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0XHRcdFx0aWYgKChlTGJvdHRvbSA9IHJlY3QuYm90dG9tKSA+PSBlbGVtTmVnYXRpdmVFeHBhbmQgJiZcblx0XHRcdFx0XHRcdChlTHRvcCA9IHJlY3QudG9wKSA8PSBlbHZIICYmXG5cdFx0XHRcdFx0XHQoZUxyaWdodCA9IHJlY3QucmlnaHQpID49IGVsZW1OZWdhdGl2ZUV4cGFuZCAqIGhGYWMgJiZcblx0XHRcdFx0XHRcdChlTGxlZnQgPSByZWN0LmxlZnQpIDw9IGVMdlcgJiZcblx0XHRcdFx0XHRcdChlTGJvdHRvbSB8fCBlTHJpZ2h0IHx8IGVMbGVmdCB8fCBlTHRvcCkgJiZcblx0XHRcdFx0XHRcdChsYXp5U2l6ZXNDZmcubG9hZEhpZGRlbiB8fCBpc1Zpc2libGUobGF6eWxvYWRFbGVtc1tpXSkpICYmXG5cdFx0XHRcdFx0XHQoKGlzQ29tcGxldGVkICYmIGlzTG9hZGluZyA8IDMgJiYgIWVsZW1FeHBhbmRWYWwgJiYgKGxvYWRNb2RlIDwgMyB8fCBsb3dSdW5zIDwgNCkpIHx8IGlzTmVzdGVkVmlzaWJsZShsYXp5bG9hZEVsZW1zW2ldLCBlbGVtRXhwYW5kKSkpe1xuXHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChsYXp5bG9hZEVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdGxvYWRlZFNvbWV0aGluZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRpZihpc0xvYWRpbmcgPiA5KXticmVhazt9XG5cdFx0XHRcdFx0fSBlbHNlIGlmKCFsb2FkZWRTb21ldGhpbmcgJiYgaXNDb21wbGV0ZWQgJiYgIWF1dG9Mb2FkRWxlbSAmJlxuXHRcdFx0XHRcdFx0aXNMb2FkaW5nIDwgNCAmJiBsb3dSdW5zIDwgNCAmJiBsb2FkTW9kZSA+IDIgJiZcblx0XHRcdFx0XHRcdChwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eVNpemVzQ2ZnLnByZWxvYWRBZnRlckxvYWQpICYmXG5cdFx0XHRcdFx0XHQocHJlbG9hZEVsZW1zWzBdIHx8ICghZWxlbUV4cGFuZFZhbCAmJiAoKGVMYm90dG9tIHx8IGVMcmlnaHQgfHwgZUxsZWZ0IHx8IGVMdG9wKSB8fCBsYXp5bG9hZEVsZW1zW2ldW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpICE9ICdhdXRvJykpKSl7XG5cdFx0XHRcdFx0XHRhdXRvTG9hZEVsZW0gPSBwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eWxvYWRFbGVtc1tpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihhdXRvTG9hZEVsZW0gJiYgIWxvYWRlZFNvbWV0aGluZyl7XG5cdFx0XHRcdFx0dW52ZWlsRWxlbWVudChhdXRvTG9hZEVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0aHJvdHRsZWRDaGVja0VsZW1lbnRzID0gdGhyb3R0bGUoY2hlY2tFbGVtZW50cyk7XG5cblx0XHR2YXIgc3dpdGNoTG9hZGluZ0NsYXNzID0gZnVuY3Rpb24oZSl7XG5cdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xuXG5cdFx0XHRpZiAoZWxlbS5fbGF6eUNhY2hlKSB7XG5cdFx0XHRcdGRlbGV0ZSBlbGVtLl9sYXp5Q2FjaGU7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzZXRQcmVsb2FkaW5nKGUpO1xuXHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxvYWRlZENsYXNzKTtcblx0XHRcdHJlbW92ZUNsYXNzKGVsZW0sIGxhenlTaXplc0NmZy5sb2FkaW5nQ2xhc3MpO1xuXHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdFx0dHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5bG9hZGVkJyk7XG5cdFx0fTtcblx0XHR2YXIgcmFmZWRTd2l0Y2hMb2FkaW5nQ2xhc3MgPSByQUZJdChzd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdHZhciByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MgPSBmdW5jdGlvbihlKXtcblx0XHRcdHJhZmVkU3dpdGNoTG9hZGluZ0NsYXNzKHt0YXJnZXQ6IGUudGFyZ2V0fSk7XG5cdFx0fTtcblxuXHRcdHZhciBjaGFuZ2VJZnJhbWVTcmMgPSBmdW5jdGlvbihlbGVtLCBzcmMpe1xuXHRcdFx0dmFyIGxvYWRNb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9hZC1tb2RlJykgfHwgbGF6eVNpemVzQ2ZnLmlmcmFtZUxvYWRNb2RlO1xuXG5cdFx0XHQvLyBsb2FkTW9kZSBjYW4gYmUgYWxzbyBhIHN0cmluZyFcblx0XHRcdGlmIChsb2FkTW9kZSA9PSAwKSB7XG5cdFx0XHRcdGVsZW0uY29udGVudFdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHNyYyk7XG5cdFx0XHR9IGVsc2UgaWYgKGxvYWRNb2RlID09IDEpIHtcblx0XHRcdFx0ZWxlbS5zcmMgPSBzcmM7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoYW5kbGVTb3VyY2VzID0gZnVuY3Rpb24oc291cmNlKXtcblx0XHRcdHZhciBjdXN0b21NZWRpYTtcblxuXHRcdFx0dmFyIHNvdXJjZVNyY3NldCA9IHNvdXJjZVtfZ2V0QXR0cmlidXRlXShsYXp5U2l6ZXNDZmcuc3Jjc2V0QXR0cik7XG5cblx0XHRcdGlmKCAoY3VzdG9tTWVkaWEgPSBsYXp5U2l6ZXNDZmcuY3VzdG9tTWVkaWFbc291cmNlW19nZXRBdHRyaWJ1dGVdKCdkYXRhLW1lZGlhJykgfHwgc291cmNlW19nZXRBdHRyaWJ1dGVdKCdtZWRpYScpXSkgKXtcblx0XHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBjdXN0b21NZWRpYSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHNvdXJjZVNyY3NldCl7XG5cdFx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIHNvdXJjZVNyY3NldCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBsYXp5VW52ZWlsID0gckFGSXQoZnVuY3Rpb24gKGVsZW0sIGRldGFpbCwgaXNBdXRvLCBzaXplcywgaXNJbWcpe1xuXHRcdFx0dmFyIHNyYywgc3Jjc2V0LCBwYXJlbnQsIGlzUGljdHVyZSwgZXZlbnQsIGZpcmVzTG9hZDtcblxuXHRcdFx0aWYoIShldmVudCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eWJlZm9yZXVudmVpbCcsIGRldGFpbCkpLmRlZmF1bHRQcmV2ZW50ZWQpe1xuXG5cdFx0XHRcdGlmKHNpemVzKXtcblx0XHRcdFx0XHRpZihpc0F1dG8pe1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmF1dG9zaXplc0NsYXNzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgc2l6ZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNyY3NldCA9IGVsZW1bX2dldEF0dHJpYnV0ZV0obGF6eVNpemVzQ2ZnLnNyY3NldEF0dHIpO1xuXHRcdFx0XHRzcmMgPSBlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zcmNBdHRyKTtcblxuXHRcdFx0XHRpZihpc0ltZykge1xuXHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRpc1BpY3R1cmUgPSBwYXJlbnQgJiYgcmVnUGljdHVyZS50ZXN0KHBhcmVudC5ub2RlTmFtZSB8fCAnJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaXJlc0xvYWQgPSBkZXRhaWwuZmlyZXNMb2FkIHx8ICgoJ3NyYycgaW4gZWxlbSkgJiYgKHNyY3NldCB8fCBzcmMgfHwgaXNQaWN0dXJlKSk7XG5cblx0XHRcdFx0ZXZlbnQgPSB7dGFyZ2V0OiBlbGVtfTtcblxuXHRcdFx0XHRhZGRDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcubG9hZGluZ0NsYXNzKTtcblxuXHRcdFx0XHRpZihmaXJlc0xvYWQpe1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dChyZXNldFByZWxvYWRpbmdUaW1lcik7XG5cdFx0XHRcdFx0cmVzZXRQcmVsb2FkaW5nVGltZXIgPSBzZXRUaW1lb3V0KHJlc2V0UHJlbG9hZGluZywgMjUwMCk7XG5cdFx0XHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYoaXNQaWN0dXJlKXtcblx0XHRcdFx0XHRmb3JFYWNoLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzb3VyY2UnKSwgaGFuZGxlU291cmNlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihzcmNzZXQpe1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBzcmNzZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYoc3JjICYmICFpc1BpY3R1cmUpe1xuXHRcdFx0XHRcdGlmKHJlZ0lmcmFtZS50ZXN0KGVsZW0ubm9kZU5hbWUpKXtcblx0XHRcdFx0XHRcdGNoYW5nZUlmcmFtZVNyYyhlbGVtLCBzcmMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNyYyA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihpc0ltZyAmJiAoc3Jjc2V0IHx8IGlzUGljdHVyZSkpe1xuXHRcdFx0XHRcdHVwZGF0ZVBvbHlmaWxsKGVsZW0sIHtzcmM6IHNyY30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmKGVsZW0uX2xhenlSYWNlKXtcblx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlSYWNlO1xuXHRcdFx0fVxuXHRcdFx0cmVtb3ZlQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcyk7XG5cblx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHQvLyBQYXJ0IG9mIHRoaXMgY2FuIGJlIHJlbW92ZWQgYXMgc29vbiBhcyB0aGlzIGZpeCBpcyBvbGRlcjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzczMSAoMjAxNSlcblx0XHRcdFx0dmFyIGlzTG9hZGVkID0gZWxlbS5jb21wbGV0ZSAmJiBlbGVtLm5hdHVyYWxXaWR0aCA+IDE7XG5cblx0XHRcdFx0aWYoICFmaXJlc0xvYWQgfHwgaXNMb2FkZWQpe1xuXHRcdFx0XHRcdGlmIChpc0xvYWRlZCkge1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmZhc3RMb2FkZWRDbGFzcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN3aXRjaExvYWRpbmdDbGFzcyhldmVudCk7XG5cdFx0XHRcdFx0ZWxlbS5fbGF6eUNhY2hlID0gdHJ1ZTtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHRpZiAoJ19sYXp5Q2FjaGUnIGluIGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlDYWNoZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCA5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZWxlbS5sb2FkaW5nID09ICdsYXp5Jykge1xuXHRcdFx0XHRcdGlzTG9hZGluZy0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIGVsZW0geyBFbGVtZW50IH1cblx0XHQgKi9cblx0XHR2YXIgdW52ZWlsRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtKXtcblx0XHRcdGlmIChlbGVtLl9sYXp5UmFjZSkge3JldHVybjt9XG5cdFx0XHR2YXIgZGV0YWlsO1xuXG5cdFx0XHR2YXIgaXNJbWcgPSByZWdJbWcudGVzdChlbGVtLm5vZGVOYW1lKTtcblxuXHRcdFx0Ly9hbGxvdyB1c2luZyBzaXplcz1cImF1dG9cIiwgYnV0IGRvbid0IHVzZS4gaXQncyBpbnZhbGlkLiBVc2UgZGF0YS1zaXplcz1cImF1dG9cIiBvciBhIHZhbGlkIHZhbHVlIGZvciBzaXplcyBpbnN0ZWFkIChpLmUuOiBzaXplcz1cIjgwdndcIilcblx0XHRcdHZhciBzaXplcyA9IGlzSW1nICYmIChlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpIHx8IGVsZW1bX2dldEF0dHJpYnV0ZV0oJ3NpemVzJykpO1xuXHRcdFx0dmFyIGlzQXV0byA9IHNpemVzID09ICdhdXRvJztcblxuXHRcdFx0aWYoIChpc0F1dG8gfHwgIWlzQ29tcGxldGVkKSAmJiBpc0ltZyAmJiAoZWxlbVtfZ2V0QXR0cmlidXRlXSgnc3JjJykgfHwgZWxlbS5zcmNzZXQpICYmICFlbGVtLmNvbXBsZXRlICYmICFoYXNDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcuZXJyb3JDbGFzcykgJiYgaGFzQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcykpe3JldHVybjt9XG5cblx0XHRcdGRldGFpbCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eXVudmVpbHJlYWQnKS5kZXRhaWw7XG5cblx0XHRcdGlmKGlzQXV0byl7XG5cdFx0XHRcdCBhdXRvU2l6ZXIudXBkYXRlRWxlbShlbGVtLCB0cnVlLCBlbGVtLm9mZnNldFdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5fbGF6eVJhY2UgPSB0cnVlO1xuXHRcdFx0aXNMb2FkaW5nKys7XG5cblx0XHRcdGxhenlVbnZlaWwoZWxlbSwgZGV0YWlsLCBpc0F1dG8sIHNpemVzLCBpc0ltZyk7XG5cdFx0fTtcblxuXHRcdHZhciBhZnRlclNjcm9sbCA9IGRlYm91bmNlKGZ1bmN0aW9uKCl7XG5cdFx0XHRsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPSAzO1xuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXHRcdH0pO1xuXG5cdFx0dmFyIGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lciA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRpZihsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPT0gMyl7XG5cdFx0XHRcdGxhenlTaXplc0NmZy5sb2FkTW9kZSA9IDI7XG5cdFx0XHR9XG5cdFx0XHRhZnRlclNjcm9sbCgpO1xuXHRcdH07XG5cblx0XHR2YXIgb25sb2FkID0gZnVuY3Rpb24oKXtcblx0XHRcdGlmKGlzQ29tcGxldGVkKXtyZXR1cm47fVxuXHRcdFx0aWYoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPCA5OTkpe1xuXHRcdFx0XHRzZXRUaW1lb3V0KG9ubG9hZCwgOTk5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cblx0XHRcdGlzQ29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0bGF6eVNpemVzQ2ZnLmxvYWRNb2RlID0gMztcblxuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBhbHRMb2FkbW9kZVNjcm9sbExpc3RuZXIsIHRydWUpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0c3RhcnRlZCA9IERhdGUubm93KCk7XG5cblx0XHRcdFx0bGF6eXNpemVzLmVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzKTtcblx0XHRcdFx0cHJlbG9hZEVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzICsgJyAnICsgbGF6eVNpemVzQ2ZnLnByZWxvYWRDbGFzcyk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncGFnZXNob3cnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGlmIChlLnBlcnNpc3RlZCkge1xuXHRcdFx0XHRcdFx0dmFyIGxvYWRpbmdFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbGF6eVNpemVzQ2ZnLmxvYWRpbmdDbGFzcyk7XG5cblx0XHRcdFx0XHRcdGlmIChsb2FkaW5nRWxlbWVudHMubGVuZ3RoICYmIGxvYWRpbmdFbGVtZW50cy5mb3JFYWNoKSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0bG9hZGluZ0VsZW1lbnRzLmZvckVhY2goIGZ1bmN0aW9uIChpbWcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChpbWcuY29tcGxldGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChpbWcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKXtcblx0XHRcdFx0XHRuZXcgTXV0YXRpb25PYnNlcnZlciggdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyApLm9ic2VydmUoIGRvY0VsZW0sIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWV9ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9jRWxlbVtfYWRkRXZlbnRMaXN0ZW5lcl0oJ0RPTU5vZGVJbnNlcnRlZCcsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHRcdGRvY0VsZW1bX2FkZEV2ZW50TGlzdGVuZXJdKCdET01BdHRyTW9kaWZpZWQnLCB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCB0cnVlKTtcblx0XHRcdFx0XHRzZXRJbnRlcnZhbCh0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCA5OTkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXG5cdFx0XHRcdC8vLCAnZnVsbHNjcmVlbmNoYW5nZSdcblx0XHRcdFx0Wydmb2N1cycsICdtb3VzZW92ZXInLCAnY2xpY2snLCAnbG9hZCcsICd0cmFuc2l0aW9uZW5kJywgJ2FuaW1hdGlvbmVuZCddLmZvckVhY2goZnVuY3Rpb24obmFtZSl7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKG5hbWUsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZigoL2QkfF5jLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKSl7XG5cdFx0XHRcdFx0b25sb2FkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9ubG9hZCk7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKCdET01Db250ZW50TG9hZGVkJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyk7XG5cdFx0XHRcdFx0c2V0VGltZW91dChvbmxvYWQsIDIwMDAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmKGxhenlzaXplcy5lbGVtZW50cy5sZW5ndGgpe1xuXHRcdFx0XHRcdGNoZWNrRWxlbWVudHMoKTtcblx0XHRcdFx0XHRyQUYuX2xzRmx1c2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdHRsZWRDaGVja0VsZW1lbnRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjaGVja0VsZW1zOiB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLFxuXHRcdFx0dW52ZWlsOiB1bnZlaWxFbGVtZW50LFxuXHRcdFx0X2FMU0w6IGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lcixcblx0XHR9O1xuXHR9KSgpO1xuXG5cblx0dmFyIGF1dG9TaXplciA9IChmdW5jdGlvbigpe1xuXHRcdHZhciBhdXRvc2l6ZXNFbGVtcztcblxuXHRcdHZhciBzaXplRWxlbWVudCA9IHJBRkl0KGZ1bmN0aW9uKGVsZW0sIHBhcmVudCwgZXZlbnQsIHdpZHRoKXtcblx0XHRcdHZhciBzb3VyY2VzLCBpLCBsZW47XG5cdFx0XHRlbGVtLl9sYXp5c2l6ZXNXaWR0aCA9IHdpZHRoO1xuXHRcdFx0d2lkdGggKz0gJ3B4JztcblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgd2lkdGgpO1xuXG5cdFx0XHRpZihyZWdQaWN0dXJlLnRlc3QocGFyZW50Lm5vZGVOYW1lIHx8ICcnKSl7XG5cdFx0XHRcdHNvdXJjZXMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NvdXJjZScpO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuXHRcdFx0XHRcdHNvdXJjZXNbaV0uc2V0QXR0cmlidXRlKCdzaXplcycsIHdpZHRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZighZXZlbnQuZGV0YWlsLmRhdGFBdHRyKXtcblx0XHRcdFx0dXBkYXRlUG9seWZpbGwoZWxlbSwgZXZlbnQuZGV0YWlsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBlbGVtIHtFbGVtZW50fVxuXHRcdCAqIEBwYXJhbSBkYXRhQXR0clxuXHRcdCAqIEBwYXJhbSBbd2lkdGhdIHsgbnVtYmVyIH1cblx0XHQgKi9cblx0XHR2YXIgZ2V0U2l6ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbSwgZGF0YUF0dHIsIHdpZHRoKXtcblx0XHRcdHZhciBldmVudDtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmKHBhcmVudCl7XG5cdFx0XHRcdHdpZHRoID0gZ2V0V2lkdGgoZWxlbSwgcGFyZW50LCB3aWR0aCk7XG5cdFx0XHRcdGV2ZW50ID0gdHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5YmVmb3Jlc2l6ZXMnLCB7d2lkdGg6IHdpZHRoLCBkYXRhQXR0cjogISFkYXRhQXR0cn0pO1xuXG5cdFx0XHRcdGlmKCFldmVudC5kZWZhdWx0UHJldmVudGVkKXtcblx0XHRcdFx0XHR3aWR0aCA9IGV2ZW50LmRldGFpbC53aWR0aDtcblxuXHRcdFx0XHRcdGlmKHdpZHRoICYmIHdpZHRoICE9PSBlbGVtLl9sYXp5c2l6ZXNXaWR0aCl7XG5cdFx0XHRcdFx0XHRzaXplRWxlbWVudChlbGVtLCBwYXJlbnQsIGV2ZW50LCB3aWR0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB1cGRhdGVFbGVtZW50c1NpemVzID0gZnVuY3Rpb24oKXtcblx0XHRcdHZhciBpO1xuXHRcdFx0dmFyIGxlbiA9IGF1dG9zaXplc0VsZW1zLmxlbmd0aDtcblx0XHRcdGlmKGxlbil7XG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGZvcig7IGkgPCBsZW47IGkrKyl7XG5cdFx0XHRcdFx0Z2V0U2l6ZUVsZW1lbnQoYXV0b3NpemVzRWxlbXNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBkZWJvdW5jZWRVcGRhdGVFbGVtZW50c1NpemVzID0gZGVib3VuY2UodXBkYXRlRWxlbWVudHNTaXplcyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0YXV0b3NpemVzRWxlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGxhenlTaXplc0NmZy5hdXRvc2l6ZXNDbGFzcyk7XG5cdFx0XHRcdGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMpO1xuXHRcdFx0fSxcblx0XHRcdGNoZWNrRWxlbXM6IGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMsXG5cdFx0XHR1cGRhdGVFbGVtOiBnZXRTaXplRWxlbWVudFxuXHRcdH07XG5cdH0pKCk7XG5cblx0dmFyIGluaXQgPSBmdW5jdGlvbigpe1xuXHRcdGlmKCFpbml0LmkgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSl7XG5cdFx0XHRpbml0LmkgPSB0cnVlO1xuXHRcdFx0YXV0b1NpemVyLl8oKTtcblx0XHRcdGxvYWRlci5fKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRpZihsYXp5U2l6ZXNDZmcuaW5pdCl7XG5cdFx0XHRpbml0KCk7XG5cdFx0fVxuXHR9KTtcblxuXHRsYXp5c2l6ZXMgPSB7XG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRjZmc6IGxhenlTaXplc0NmZyxcblx0XHRhdXRvU2l6ZXI6IGF1dG9TaXplcixcblx0XHRsb2FkZXI6IGxvYWRlcixcblx0XHRpbml0OiBpbml0LFxuXHRcdHVQOiB1cGRhdGVQb2x5ZmlsbCxcblx0XHRhQzogYWRkQ2xhc3MsXG5cdFx0ckM6IHJlbW92ZUNsYXNzLFxuXHRcdGhDOiBoYXNDbGFzcyxcblx0XHRmaXJlOiB0cmlnZ2VyRXZlbnQsXG5cdFx0Z1c6IGdldFdpZHRoLFxuXHRcdHJBRjogckFGLFxuXHR9O1xuXG5cdHJldHVybiBsYXp5c2l6ZXM7XG59XG4pKTtcbiIsICIoZnVuY3Rpb24od2luZG93LCBmYWN0b3J5KSB7XG5cdHZhciBnbG9iYWxJbnN0YWxsID0gZnVuY3Rpb24oKXtcblx0XHRmYWN0b3J5KHdpbmRvdy5sYXp5U2l6ZXMpO1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsYXp5dW52ZWlscmVhZCcsIGdsb2JhbEluc3RhbGwsIHRydWUpO1xuXHR9O1xuXG5cdGZhY3RvcnkgPSBmYWN0b3J5LmJpbmQobnVsbCwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuXG5cdGlmKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpe1xuXHRcdGZhY3RvcnkocmVxdWlyZSgnbGF6eXNpemVzJykpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKFsnbGF6eXNpemVzJ10sIGZhY3RvcnkpO1xuXHR9IGVsc2UgaWYod2luZG93LmxhenlTaXplcykge1xuXHRcdGdsb2JhbEluc3RhbGwoKTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbGF6eXVudmVpbHJlYWQnLCBnbG9iYWxJbnN0YWxsLCB0cnVlKTtcblx0fVxufSh3aW5kb3csIGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGxhenlTaXplcykge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGltZ1N1cHBvcnQgPSAnbG9hZGluZycgaW4gSFRNTEltYWdlRWxlbWVudC5wcm90b3R5cGU7XG5cdHZhciBpZnJhbWVTdXBwb3J0ID0gJ2xvYWRpbmcnIGluIEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZTtcblx0dmFyIGlzQ29uZmlnU2V0ID0gZmFsc2U7XG5cdHZhciBvbGRQcmVtYXR1cmVVbnZlaWwgPSBsYXp5U2l6ZXMucHJlbWF0dXJlVW52ZWlsO1xuXHR2YXIgY2ZnID0gbGF6eVNpemVzLmNmZztcblx0dmFyIGxpc3RlbmVyTWFwID0ge1xuXHRcdGZvY3VzOiAxLFxuXHRcdG1vdXNlb3ZlcjogMSxcblx0XHRjbGljazogMSxcblx0XHRsb2FkOiAxLFxuXHRcdHRyYW5zaXRpb25lbmQ6IDEsXG5cdFx0YW5pbWF0aW9uZW5kOiAxLFxuXHRcdHNjcm9sbDogMSxcblx0XHRyZXNpemU6IDEsXG5cdH07XG5cblx0aWYgKCFjZmcubmF0aXZlTG9hZGluZykge1xuXHRcdGNmZy5uYXRpdmVMb2FkaW5nID0ge307XG5cdH1cblxuXHRpZiAoIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8ICF3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCAoIWltZ1N1cHBvcnQgJiYgIWlmcmFtZVN1cHBvcnQpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZUV2ZW50cygpIHtcblx0XHR2YXIgbG9hZGVyID0gbGF6eVNpemVzLmxvYWRlcjtcblx0XHR2YXIgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyA9IGxvYWRlci5jaGVja0VsZW1zO1xuXHRcdHZhciByZW1vdmVBTFNMID0gZnVuY3Rpb24oKXtcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGxvYWRlci5fYUxTTCwgdHJ1ZSk7XG5cdFx0XHR9LCAxMDAwKTtcblx0XHR9O1xuXHRcdHZhciBjdXJyZW50TGlzdGVuZXJNYXAgPSB0eXBlb2YgY2ZnLm5hdGl2ZUxvYWRpbmcuZGlzYWJsZUxpc3RlbmVycyA9PSAnb2JqZWN0JyA/XG5cdFx0XHRjZmcubmF0aXZlTG9hZGluZy5kaXNhYmxlTGlzdGVuZXJzIDpcblx0XHRcdGxpc3RlbmVyTWFwO1xuXG5cdFx0aWYgKGN1cnJlbnRMaXN0ZW5lck1hcC5zY3JvbGwpIHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVtb3ZlQUxTTCk7XG5cdFx0XHRyZW1vdmVBTFNMKCk7XG5cblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoY3VycmVudExpc3RlbmVyTWFwLnJlc2l6ZSkge1xuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdH1cblxuXHRcdE9iamVjdC5rZXlzKGN1cnJlbnRMaXN0ZW5lck1hcCkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG5cdFx0XHRpZiAoY3VycmVudExpc3RlbmVyTWFwW25hbWVdKSB7XG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBydW5Db25maWcoKSB7XG5cdFx0aWYgKGlzQ29uZmlnU2V0KSB7cmV0dXJuO31cblx0XHRpc0NvbmZpZ1NldCA9IHRydWU7XG5cblx0XHRpZiAoaW1nU3VwcG9ydCAmJiBpZnJhbWVTdXBwb3J0ICYmIGNmZy5uYXRpdmVMb2FkaW5nLmRpc2FibGVMaXN0ZW5lcnMpIHtcblx0XHRcdGlmIChjZmcubmF0aXZlTG9hZGluZy5kaXNhYmxlTGlzdGVuZXJzID09PSB0cnVlKSB7XG5cdFx0XHRcdGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRkaXNhYmxlRXZlbnRzKCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUpIHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsYXp5YmVmb3JldW52ZWlsJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdHZhciBlbGVtZW50ID0gZS50YXJnZXQ7XG5cblx0XHRcdFx0aWYgKCdsb2FkaW5nJyBpbiBlbGVtZW50ICYmICFlbGVtZW50LmdldEF0dHJpYnV0ZSgnbG9hZGluZycpKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnLCAnbGF6eScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRsYXp5U2l6ZXMucHJlbWF0dXJlVW52ZWlsID0gZnVuY3Rpb24gcHJlbWF0dXJlVW52ZWlsKGVsZW1lbnQpIHtcblxuXHRcdGlmICghaXNDb25maWdTZXQpIHtcblx0XHRcdHJ1bkNvbmZpZygpO1xuXHRcdH1cblxuXHRcdGlmICgnbG9hZGluZycgaW4gZWxlbWVudCAmJlxuXHRcdFx0KGNmZy5uYXRpdmVMb2FkaW5nLnNldExvYWRpbmdBdHRyaWJ1dGUgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnKSkgJiZcblx0XHRcdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplcycpICE9ICdhdXRvJyB8fCBlbGVtZW50Lm9mZnNldFdpZHRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKG9sZFByZW1hdHVyZVVudmVpbCkge1xuXHRcdFx0cmV0dXJuIG9sZFByZW1hdHVyZVVudmVpbChlbGVtZW50KTtcblx0XHR9XG5cdH07XG5cbn0pKTtcbiIsICIvKiFcbiAqIGNsaXBib2FyZC5qcyB2Mi4wLjExXG4gKiBodHRwczovL2NsaXBib2FyZGpzLmNvbS9cbiAqXG4gKiBMaWNlbnNlZCBNSVQgXHUwMEE5IFplbm8gUm9jaGFcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA2ODY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2xpcGJvYXJkOyB9XG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy90aW55LWVtaXR0ZXIvaW5kZXguanNcbnZhciB0aW55X2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3OSk7XG52YXIgdGlueV9lbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHRpbnlfZW1pdHRlcik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2dvb2QtbGlzdGVuZXIvc3JjL2xpc3Rlbi5qc1xudmFyIGxpc3RlbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcwKTtcbnZhciBsaXN0ZW5fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obGlzdGVuKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc2VsZWN0L3NyYy9zZWxlY3QuanNcbnZhciBzcmNfc2VsZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTcpO1xudmFyIHNlbGVjdF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzcmNfc2VsZWN0KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vY29tbWFuZC5qc1xuLyoqXG4gKiBFeGVjdXRlcyBhIGdpdmVuIG9wZXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmQodHlwZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZCh0eXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9jdXQuanNcblxuXG4vKipcbiAqIEN1dCBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ3V0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uQ3V0KHRhcmdldCkge1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICBjb21tYW5kKCdjdXQnKTtcbiAgcmV0dXJuIHNlbGVjdGVkVGV4dDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGFjdGlvbnNfY3V0ID0gKENsaXBib2FyZEFjdGlvbkN1dCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NyZWF0ZS1mYWtlLWVsZW1lbnQuanNcbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgdGV4dGFyZWEgZWxlbWVudCB3aXRoIGEgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSkge1xuICB2YXIgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7XG4gIHZhciBmYWtlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IC8vIFByZXZlbnQgem9vbWluZyBvbiBpT1NcblxuICBmYWtlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUmVzZXQgYm94IG1vZGVsXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7IC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuXG4gIGZha2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgZmFrZUVsZW1lbnQuc3R5bGVbaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICctOTk5OXB4JzsgLy8gTW92ZSBlbGVtZW50IHRvIHRoZSBzYW1lIHBvc2l0aW9uIHZlcnRpY2FsbHlcblxuICB2YXIgeVBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gIGZha2VFbGVtZW50LnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHlQb3NpdGlvbiwgXCJweFwiKTtcbiAgZmFrZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgZmFrZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIGZha2VFbGVtZW50O1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY29weS5qc1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgZmFrZSBjb3B5IGFjdGlvbiB3cmFwcGVyIHVzaW5nIGEgZmFrZSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgZmFrZUNvcHlBY3Rpb24gPSBmdW5jdGlvbiBmYWtlQ29weUFjdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgZmFrZUVsZW1lbnQgPSBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSk7XG4gIG9wdGlvbnMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZha2VFbGVtZW50KTtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkoZmFrZUVsZW1lbnQpO1xuICBjb21tYW5kKCdjb3B5Jyk7XG4gIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ29weSA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkNvcHkodGFyZ2V0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgY29udGFpbmVyOiBkb2N1bWVudC5ib2R5XG4gIH07XG4gIHZhciBzZWxlY3RlZFRleHQgPSAnJztcblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWxlY3RlZFRleHQgPSBmYWtlQ29weUFjdGlvbih0YXJnZXQsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgIVsndGV4dCcsICdzZWFyY2gnLCAndXJsJywgJ3RlbCcsICdwYXNzd29yZCddLmluY2x1ZGVzKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC50eXBlKSkge1xuICAgIC8vIElmIGlucHV0IHR5cGUgZG9lc24ndCBzdXBwb3J0IGBzZXRTZWxlY3Rpb25SYW5nZWAuIFNpbXVsYXRlIGl0LiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC9zZXRTZWxlY3Rpb25SYW5nZVxuICAgIHNlbGVjdGVkVGV4dCA9IGZha2VDb3B5QWN0aW9uKHRhcmdldC52YWx1ZSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICAgIGNvbW1hbmQoJ2NvcHknKTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2NvcHkgPSAoQ2xpcGJvYXJkQWN0aW9uQ29weSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9kZWZhdWx0LmpzXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKipcbiAqIElubmVyIGZ1bmN0aW9uIHdoaWNoIHBlcmZvcm1zIHNlbGVjdGlvbiBmcm9tIGVpdGhlciBgdGV4dGAgb3IgYHRhcmdldGBcbiAqIHByb3BlcnRpZXMgYW5kIHRoZW4gZXhlY3V0ZXMgY29weSBvciBjdXQgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkRlZmF1bHQgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0KCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIC8vIERlZmluZXMgYmFzZSBwcm9wZXJ0aWVzIHBhc3NlZCBmcm9tIGNvbnN0cnVjdG9yLlxuICB2YXIgX29wdGlvbnMkYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24sXG4gICAgICBhY3Rpb24gPSBfb3B0aW9ucyRhY3Rpb24gPT09IHZvaWQgMCA/ICdjb3B5JyA6IF9vcHRpb25zJGFjdGlvbixcbiAgICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQsXG4gICAgICB0ZXh0ID0gb3B0aW9ucy50ZXh0OyAvLyBTZXRzIHRoZSBgYWN0aW9uYCB0byBiZSBwZXJmb3JtZWQgd2hpY2ggY2FuIGJlIGVpdGhlciAnY29weScgb3IgJ2N1dCcuXG5cbiAgaWYgKGFjdGlvbiAhPT0gJ2NvcHknICYmIGFjdGlvbiAhPT0gJ2N1dCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJhY3Rpb25cIiB2YWx1ZSwgdXNlIGVpdGhlciBcImNvcHlcIiBvciBcImN1dFwiJyk7XG4gIH0gLy8gU2V0cyB0aGUgYHRhcmdldGAgcHJvcGVydHkgdXNpbmcgYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaGF2ZSBpdHMgY29udGVudCBjb3BpZWQuXG5cblxuICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGFyZ2V0ICYmIF90eXBlb2YodGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBpZiAoYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFBsZWFzZSB1c2UgXCJyZWFkb25seVwiIGluc3RlYWQgb2YgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uID09PSAnY3V0JyAmJiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSB8fCB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFlvdSBjYW5cXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCBcInJlYWRvbmx5XCIgb3IgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtcbiAgICB9XG4gIH0gLy8gRGVmaW5lIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGV4dGAgcHJvcGVydHkuXG5cblxuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGV4dCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfSAvLyBEZWZpbmVzIHdoaWNoIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGFyZ2V0YCBwcm9wZXJ0eS5cblxuXG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gYWN0aW9uID09PSAnY3V0JyA/IGFjdGlvbnNfY3V0KHRhcmdldCkgOiBhY3Rpb25zX2NvcHkodGFyZ2V0LCB7XG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2RlZmF1bHQgPSAoQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY2xpcGJvYXJkLmpzXG5mdW5jdGlvbiBjbGlwYm9hcmRfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IGNsaXBib2FyZF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gY2xpcGJvYXJkX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoY2xpcGJvYXJkX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cblxuXG5cblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHtcbiAgdmFyIGF0dHJpYnV0ZSA9IFwiZGF0YS1jbGlwYm9hcmQtXCIuY29uY2F0KHN1ZmZpeCk7XG5cbiAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb25lIG9yIG1vcmUgZWxlbWVudHMsIGFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZW0sXG4gKiBhbmQgaW5zdGFudGlhdGVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2suXG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRW1pdHRlcikge1xuICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDbGlwYm9hcmQpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfdGhpcy5yZXNvbHZlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIF90aGlzLmxpc3RlbkNsaWNrKHRyaWdnZXIpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBEZWZpbmVzIGlmIGF0dHJpYnV0ZXMgd291bGQgYmUgcmVzb2x2ZWQgdXNpbmcgaW50ZXJuYWwgc2V0dGVyIGZ1bmN0aW9uc1xuICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDbGlwYm9hcmQsIFt7XG4gICAga2V5OiBcInJlc29sdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5hY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFjdGlvbiA6IHRoaXMuZGVmYXVsdEFjdGlvbjtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50YXJnZXQgOiB0aGlzLmRlZmF1bHRUYXJnZXQ7XG4gICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gY2xpcGJvYXJkX3R5cGVvZihvcHRpb25zLmNvbnRhaW5lcikgPT09ICdvYmplY3QnID8gb3B0aW9ucy5jb250YWluZXIgOiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHBhc3NlZCB0cmlnZ2VyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW5DbGljayh0cmlnZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3Rlbl9kZWZhdWx0KCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vbkNsaWNrKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBuZXcgYENsaXBib2FyZEFjdGlvbmAgb24gZWFjaCBjbGljayBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvbkNsaWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBlLmRlbGVnYXRlVGFyZ2V0IHx8IGUuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbih0cmlnZ2VyKSB8fCAnY29weSc7XG4gICAgICB2YXIgdGV4dCA9IGFjdGlvbnNfZGVmYXVsdCh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0KHRyaWdnZXIpLFxuICAgICAgICB0ZXh0OiB0aGlzLnRleHQodHJpZ2dlcilcbiAgICAgIH0pOyAvLyBGaXJlcyBhbiBldmVudCBiYXNlZCBvbiB0aGUgY29weSBvcGVyYXRpb24gcmVzdWx0LlxuXG4gICAgICB0aGlzLmVtaXQodGV4dCA/ICdzdWNjZXNzJyA6ICdlcnJvcicsIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uOiBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYGFjdGlvbmAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdEFjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0QWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgnYWN0aW9uJywgdHJpZ2dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYHRhcmdldGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFRhcmdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGFyZ2V0KHRyaWdnZXIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGdldEF0dHJpYnV0ZVZhbHVlKCd0YXJnZXQnLCB0cmlnZ2VyKTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY29weSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyBUZXh0IGNvcGllZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0XCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0ZXh0YCBsb29rdXAgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0cmlnZ2VyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0KHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGxpZmVjeWNsZS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSh0YXJnZXQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICAgICAgfTtcbiAgICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICAgKiBAcmV0dXJucyBUZXh0IGN1dHRlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImN1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXQodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gYWN0aW9uc19jdXQodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VwcG9ydCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBvciBhbGwgYWN0aW9ucyBpZiBubyBhY3Rpb24gaXNcbiAgICAgKiBnaXZlbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FjdGlvbl1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzU3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICAgICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWydjb3B5JywgJ2N1dCddO1xuICAgICAgdmFyIGFjdGlvbnMgPSB0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJyA/IFthY3Rpb25dIDogYWN0aW9uO1xuICAgICAgdmFyIHN1cHBvcnQgPSAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtcbiAgICAgIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ICYmICEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdXBwb3J0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDbGlwYm9hcmQ7XG59KCh0aW55X2VtaXR0ZXJfZGVmYXVsdCgpKSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNsaXBib2FyZCA9IChDbGlwYm9hcmQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODI4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgRE9DVU1FTlRfTk9ERV9UWVBFID0gOTtcblxuLyoqXG4gKiBBIHBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKVxuICovXG5pZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgdmFyIHByb3RvID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5tYXRjaGVzID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5vTWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBtYXRjaGVzIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjbG9zZXN0IChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IERPQ1VNRU5UX05PREVfVFlQRSkge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb3Nlc3Q7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgY2xvc2VzdCA9IF9fd2VicGFja19yZXF1aXJlX18oODI4KTtcblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lckZuID0gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERlbGVnYXRlcyBldmVudCB0byBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd8QXJyYXl9IFtlbGVtZW50c11cbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudHMsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIC8vIEhhbmRsZSB0aGUgcmVndWxhciBFbGVtZW50IHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cy5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRWxlbWVudC1sZXNzIHVzYWdlLCBpdCBkZWZhdWx0cyB0byBnbG9iYWwgZGVsZWdhdGlvblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgYGRvY3VtZW50YCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCB0aGVuIGFwcGx5IGFyZ3VtZW50c1xuICAgICAgICAvLyBUaGlzIGlzIGEgc2hvcnQgd2F5IHRvIC51bnNoaWZ0IGBhcmd1bWVudHNgIHdpdGhvdXQgcnVubmluZyBpbnRvIGRlb3B0aW1pemF0aW9uc1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmJpbmQobnVsbCwgZG9jdW1lbnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFNlbGVjdG9yLWJhc2VkIHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQXJyYXktbGlrZSBiYXNlZCB1c2FnZVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBsaXN0ZW5lcihlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgICBlLmRlbGVnYXRlVGFyZ2V0ID0gY2xvc2VzdChlLnRhcmdldCwgc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsZW1lbnQsIGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Nzk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBsaXN0IG9mIEhUTUwgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAodHlwZSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nKVxuICAgICAgICAmJiAoJ2xlbmd0aCcgaW4gdmFsdWUpXG4gICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzkpO1xudmFyIGRlbGVnYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzgpO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhbGwgcGFyYW1zIGFuZCBjYWxscyB0aGUgcmlnaHRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRhcmdldCAmJiAhdHlwZSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpcy5mbihjYWxsYmFjaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzLm5vZGUodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMubm9kZUxpc3QodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIEhUTUwgZWxlbWVudFxuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbk5vZGUobm9kZSwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50c1xuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlTGlzdChub2RlTGlzdCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc2VsZWN0b3JcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3RlblNlbGVjdG9yKHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBkZWxlZ2F0ZShkb2N1bWVudC5ib2R5LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RlbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODE3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkge1xuICAgIHZhciBzZWxlY3RlZFRleHQ7XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICB2YXIgaXNSZWFkT25seSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBlbGVtZW50LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RlZFRleHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsZWN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbmZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xubW9kdWxlLmV4cG9ydHMuVGlueUVtaXR0ZXIgPSBFO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH1cbi8qKioqKiovIFx0fSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4Nik7XG4vKioqKioqLyB9KSgpXG4uZGVmYXVsdDtcbn0pOyIsICJmdW5jdGlvbiBlKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHIsdCl7KHQ9bmV3IFhNTEh0dHBSZXF1ZXN0KS5vcGVuKFwiR0VUXCIsZSx0LndpdGhDcmVkZW50aWFscz0hMCksdC5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT10LnN0YXR1cz9uKCk6cigpfSx0LnNlbmQoKX0pfXZhciBuLHI9KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLnJlbExpc3QmJm4ucmVsTGlzdC5zdXBwb3J0cyYmbi5yZWxMaXN0LnN1cHBvcnRzKFwicHJlZmV0Y2hcIik/ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scix0KXsodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKSkucmVsPVwicHJlZmV0Y2hcIix0LmhyZWY9ZSx0Lm9ubG9hZD1uLHQub25lcnJvcj1yLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9KX06ZSx0PXdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrfHxmdW5jdGlvbihlKXt2YXIgbj1EYXRlLm5vdygpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh7ZGlkVGltZW91dDohMSx0aW1lUmVtYWluaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsNTAtKERhdGUubm93KCktbikpfX0pfSwxKX0sbz1uZXcgU2V0LGk9bmV3IFNldCxjPSExO2Z1bmN0aW9uIGEoZSl7aWYoZSl7aWYoZS5zYXZlRGF0YSlyZXR1cm4gbmV3IEVycm9yKFwiU2F2ZS1EYXRhIGlzIGVuYWJsZWRcIik7aWYoLzJnLy50ZXN0KGUuZWZmZWN0aXZlVHlwZSkpcmV0dXJuIG5ldyBFcnJvcihcIm5ldHdvcmsgY29uZGl0aW9ucyBhcmUgcG9vclwiKX1yZXR1cm4hMH1mdW5jdGlvbiB1KGUpe2lmKGV8fChlPXt9KSx3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpe3ZhciBuPWZ1bmN0aW9uKGUpe2U9ZXx8MTt2YXIgbj1bXSxyPTA7ZnVuY3Rpb24gdCgpe3I8ZSYmbi5sZW5ndGg+MCYmKG4uc2hpZnQoKSgpLHIrKyl9cmV0dXJuW2Z1bmN0aW9uKGUpe24ucHVzaChlKT4xfHx0KCl9LGZ1bmN0aW9uKCl7ci0tLHQoKX1dfShlLnRocm90dGxlfHwxLzApLHI9blswXSxhPW5bMV0sdT1lLmxpbWl0fHwxLzAsbD1lLm9yaWdpbnN8fFtsb2NhdGlvbi5ob3N0bmFtZV0sZD1lLmlnbm9yZXN8fFtdLGg9ZS5kZWxheXx8MCxwPVtdLG09ZS50aW1lb3V0Rm58fHQsdz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmhyZWZGbiYmZS5ocmVmRm4sZz1lLnByZXJlbmRlcnx8ITE7Yz1lLnByZXJlbmRlckFuZFByZWZldGNofHwhMTt2YXIgdj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKG4uaXNJbnRlcnNlY3RpbmcpcC5wdXNoKChuPW4udGFyZ2V0KS5ocmVmKSxmdW5jdGlvbihlLG4pe24/c2V0VGltZW91dChlLG4pOmUoKX0oZnVuY3Rpb24oKXstMSE9PXAuaW5kZXhPZihuLmhyZWYpJiYodi51bm9ic2VydmUobiksKGN8fGcpJiZpLnNpemU8MT9mKHc/dyhuKTpuLmhyZWYpLmNhdGNoKGZ1bmN0aW9uKG4pe2lmKCFlLm9uRXJyb3IpdGhyb3cgbjtlLm9uRXJyb3Iobil9KTpvLnNpemU8dSYmIWcmJnIoZnVuY3Rpb24oKXtzKHc/dyhuKTpuLmhyZWYsZS5wcmlvcml0eSkudGhlbihhKS5jYXRjaChmdW5jdGlvbihuKXthKCksZS5vbkVycm9yJiZlLm9uRXJyb3Iobil9KX0pKX0saCk7ZWxzZXt2YXIgdD1wLmluZGV4T2YoKG49bi50YXJnZXQpLmhyZWYpO3Q+LTEmJnAuc3BsaWNlKHQpfX0pfSx7dGhyZXNob2xkOmUudGhyZXNob2xkfHwwfSk7cmV0dXJuIG0oZnVuY3Rpb24oKXsoZS5lbHx8ZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZnVuY3Rpb24oZSl7bC5sZW5ndGgmJiFsLmluY2x1ZGVzKGUuaG9zdG5hbWUpfHxmdW5jdGlvbiBlKG4scil7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/ci5zb21lKGZ1bmN0aW9uKHIpe3JldHVybiBlKG4scil9KTooci50ZXN0fHxyKS5jYWxsKHIsbi5ocmVmLG4pfShlLGQpfHx2Lm9ic2VydmUoZSl9KX0se3RpbWVvdXQ6ZS50aW1lb3V0fHwyZTN9KSxmdW5jdGlvbigpe28uY2xlYXIoKSx2LmRpc2Nvbm5lY3QoKX19fWZ1bmN0aW9uIHMobix0LHUpe3ZhciBzPWEobmF2aWdhdG9yLmNvbm5lY3Rpb24pO3JldHVybiBzIGluc3RhbmNlb2YgRXJyb3I/UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ2Fubm90IHByZWZldGNoLCBcIitzLm1lc3NhZ2UpKTooaS5zaXplPjAmJiFjJiZjb25zb2xlLndhcm4oXCJbV2FybmluZ10gWW91IGFyZSB1c2luZyBib3RoIHByZWZldGNoaW5nIGFuZCBwcmVyZW5kZXJpbmcgb24gdGhlIHNhbWUgZG9jdW1lbnRcIiksUHJvbWlzZS5hbGwoW10uY29uY2F0KG4pLm1hcChmdW5jdGlvbihuKXtpZighby5oYXMobikpcmV0dXJuIG8uYWRkKG4pLCh0P2Z1bmN0aW9uKG4pe3JldHVybiB3aW5kb3cuZmV0Y2g/ZmV0Y2gobix7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCJ9KTplKG4pfTpyKShuZXcgVVJMKG4sbG9jYXRpb24uaHJlZikudG9TdHJpbmcoKSl9KSkpfWZ1bmN0aW9uIGYoZSxuKXt2YXIgcj1hKG5hdmlnYXRvci5jb25uZWN0aW9uKTtpZihyIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCBwcmVyZW5kZXIsIFwiK3IubWVzc2FnZSkpO2lmKCFIVE1MU2NyaXB0RWxlbWVudC5zdXBwb3J0cyhcInNwZWN1bGF0aW9ucnVsZXNcIikpcmV0dXJuIHMoZSksUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWN1bGF0aW9uIHJ1bGVzIEFQSS4gRmFsbGluZyBiYWNrIHRvIHByZWZldGNoLlwiKSk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3R5cGU9XCJzcGVjdWxhdGlvbnJ1bGVzXCJdJykpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlNwZWN1bGF0aW9uIFJ1bGVzIGlzIGFscmVhZHkgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGFsdGVyZWQuXCIpKTtmb3IodmFyIHQ9MCx1PVtdLmNvbmNhdChlKTt0PHUubGVuZ3RoO3QrPTEpe3ZhciBmPXVbdF07aWYod2luZG93LmxvY2F0aW9uLm9yaWdpbiE9PW5ldyBVUkwoZix3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJPbmx5IHNhbWUgb3JpZ2luIFVSTHMgYXJlIGFsbG93ZWQ6IFwiK2YpKTtpLmFkZChmKX1vLnNpemU+MCYmIWMmJmNvbnNvbGUud2FybihcIltXYXJuaW5nXSBZb3UgYXJlIHVzaW5nIGJvdGggcHJlZmV0Y2hpbmcgYW5kIHByZXJlbmRlcmluZyBvbiB0aGUgc2FtZSBkb2N1bWVudFwiKTt2YXIgbD1mdW5jdGlvbihlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO24udHlwZT1cInNwZWN1bGF0aW9ucnVsZXNcIixuLnRleHQ9J3tcInByZXJlbmRlclwiOlt7XCJzb3VyY2VcIjogXCJsaXN0XCIsXCJ1cmxzXCI6IFtcIicrQXJyYXkuZnJvbShlKS5qb2luKCdcIixcIicpKydcIl19XX0nO3RyeXtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG4pfWNhdGNoKGUpe3JldHVybiBlfXJldHVybiEwfShpKTtyZXR1cm4hMD09PWw/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZWplY3QobCl9ZXhwb3J0e3UgYXMgbGlzdGVuLHMgYXMgcHJlZmV0Y2gsZiBhcyBwcmVyZW5kZXJ9O1xuIiwgIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3F1aWNrbGlua1xyXG5pbXBvcnQgeyBsaXN0ZW4gfSBmcm9tICdxdWlja2xpbmsvZGlzdC9xdWlja2xpbmsubWpzJztcclxubGlzdGVuKHtcclxuICAgIGlnbm9yZXM6IFtcclxuICAgICAgICAvXFwvYXBpXFwvPy8sXHJcbiAgICAgICAgdXJpID0+IHVyaS5pbmNsdWRlcygnLnppcCcpLFxyXG4gICAgICAgICh1cmksIGVsZW0pID0+IGVsZW0uaGFzQXR0cmlidXRlKCdub3ByZWZldGNoJyksXHJcbiAgICAgICAgKHVyaSwgZWxlbSkgPT4gZWxlbS5oYXNoICYmIGVsZW0ucGF0aG5hbWUgPT09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxcclxuICAgIF1cclxufSk7XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYUZhcmthcy9sYXp5c2l6ZXMvdHJlZS9naC1wYWdlcy9wbHVnaW5zL25hdGl2ZS1sb2FkaW5nXHJcbmltcG9ydCBsYXp5U2l6ZXMgZnJvbSAnbGF6eXNpemVzJztcclxuaW1wb3J0ICdsYXp5c2l6ZXMvcGx1Z2lucy9uYXRpdmUtbG9hZGluZy9scy5uYXRpdmUtbG9hZGluZyc7XHJcblxyXG5sYXp5U2l6ZXMuY2ZnLm5hdGl2ZUxvYWRpbmcgPSB7XHJcbiAgICBzZXRMb2FkaW5nQXR0cmlidXRlOiB0cnVlLFxyXG4gICAgZGlzYWJsZUxpc3RlbmVyczoge1xyXG4gICAgICAgIHNjcm9sbDogdHJ1ZVxyXG4gICAgfVxyXG59O1xyXG4iLCAiLyohXHJcbiAqIGNsaXBib2FyZC5qcyBmb3IgQm9vdHN0cmFwIGJhc2VkIFRodWxpdGUgc2l0ZXNcclxuICogQ29weXJpZ2h0IDIwMjEtMjAyNCBUaHVsaXRlXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCBDbGlwYm9hcmQgZnJvbSAnY2xpcGJvYXJkJztcclxuXHJcbigoKSA9PiB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgdmFyIGNiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0Jyk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYi5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gY2JbaV07XHJcbiAgICAgICAgZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCAnPGRpdiBjbGFzcz1cImNvcHlcIj48YnV0dG9uIHRpdGxlPVwiQ29weSB0byBjbGlwYm9hcmRcIiBjbGFzcz1cImJ0bi1jb3B5XCIgYXJpYS1sYWJlbD1cIkNsaXBib2FyZCBidXR0b25cIj48ZGl2PjwvZGl2PjwvYnV0dG9uPjwvZGl2PicpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKCcuYnRuLWNvcHknLCB7XHJcbiAgICAgICAgdGFyZ2V0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlci5wYXJlbnROb2RlLm5leHRFbGVtZW50U2libGluZztcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjbGlwYm9hcmQub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8qXHJcbiAgICAgIGNvbnNvbGUuaW5mbygnQWN0aW9uOicsIGUuYWN0aW9uKTtcclxuICAgICAgY29uc29sZS5pbmZvKCdUZXh0OicsIGUudGV4dCk7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnVHJpZ2dlcjonLCBlLnRyaWdnZXIpO1xyXG4gICAgICAqL1xyXG5cclxuICAgICAgICBlLmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjbGlwYm9hcmQub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdBY3Rpb246JywgZS5hY3Rpb24pO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyaWdnZXI6JywgZS50cmlnZ2VyKTtcclxuICAgIH0pO1xyXG59KSgpO1xyXG4iLCAiY29uc3QgdG9wQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvVG9wJyk7XHJcblxyXG5pZiAodG9wQnV0dG9uICE9PSBudWxsKSB7XHJcbiAgICB0b3BCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZmFkZScpO1xyXG4gICAgd2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHNjcm9sbEZ1bmN0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRvcEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvcEZ1bmN0aW9uKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2Nyb2xsRnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPiAyNzAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDI3MCkge1xyXG4gICAgICAgIHRvcEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdmYWRlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvcEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvcEZ1bmN0aW9uKCkge1xyXG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbn1cclxuIiwgIi8vIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ29odWdvaW8vaHVnb0RvY3MvYmxvYi9tYXN0ZXIvX3ZlbmRvci9naXRodWIuY29tL2dvaHVnb2lvL2dvaHVnb2lvVGhlbWUvYXNzZXRzL2pzL3RhYnMuanNcclxuXHJcbi8qKlxyXG4gKiBTY3JpcHRzIHdoaWNoIG1hbmFnZXMgQ29kZSBUb2dnbGUgdGFicy5cclxuICovXHJcbnZhciBpO1xyXG4vLyBzdG9yZSB0YWJzIHZhcmlhYmxlXHJcbnZhciBhbGxUYWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlLXRhYl0nKTtcclxudmFyIGFsbFBhbmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGFuZV0nKTtcclxuXHJcbmZ1bmN0aW9uIHRvZ2dsZVRhYnMoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHZhciBjbGlja2VkVGFiID0gZXZlbnQuY3VycmVudFRhcmdldDtcclxuICAgICAgICB2YXIgdGFyZ2V0S2V5ID0gY2xpY2tlZFRhYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlLXRhYicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgdGFyZ2V0S2V5ID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgICAvLyBXZSBzdG9yZSB0aGUgY29uZmlnIGxhbmd1YWdlIHNlbGVjdGVkIGluIHVzZXJzJyBsb2NhbFN0b3JhZ2VcclxuICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjb25maWdMYW5nUHJlZicsIHRhcmdldEtleSk7XHJcbiAgICB9XHJcbiAgICB2YXIgc2VsZWN0ZWRUYWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdG9nZ2xlLXRhYj0nICsgdGFyZ2V0S2V5ICsgJ10nKTtcclxuICAgIHZhciBzZWxlY3RlZFBhbmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGFuZT0nICsgdGFyZ2V0S2V5ICsgJ10nKTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBhbGxUYWJzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICAgIGFsbFBhbmVzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRUYWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRUYWJzW2ldLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICAgIHNlbGVjdGVkUGFuZXNbaV0uY2xhc3NMaXN0LmFkZCgnc2hvdycsICdhY3RpdmUnKTtcclxuICAgIH1cclxufVxyXG5cclxuZm9yIChpID0gMDsgaSA8IGFsbFRhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgIGFsbFRhYnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVUYWJzKTtcclxufVxyXG4vLyBVcG9uIHBhZ2UgbG9hZCwgaWYgdXNlciBoYXMgYSBwcmVmZXJyZWQgbGFuZ3VhZ2UgaW4gaXRzIGxvY2FsU3RvcmFnZSwgdGFicyBhcmUgc2V0IHRvIGl0LlxyXG5pZiAod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjb25maWdMYW5nUHJlZicpKSB7XHJcbiAgICB0b2dnbGVUYWJzKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY29uZmlnTGFuZ1ByZWYnKSk7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUEsT0FBQyxTQUFTQSxTQUFRLFNBQVM7QUFDMUIsWUFBSUMsYUFBWSxRQUFRRCxTQUFRQSxRQUFPLFVBQVUsSUFBSTtBQUNyRCxRQUFBQSxRQUFPLFlBQVlDO0FBQ25CLFlBQUcsT0FBTyxVQUFVLFlBQVksT0FBTyxTQUFRO0FBQzlDLGlCQUFPLFVBQVVBO0FBQUEsUUFDbEI7QUFBQSxNQUNEO0FBQUEsUUFBRSxPQUFPLFVBQVUsY0FDYixTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS2hCLFNBQVMsRUFBRUQsU0FBUUUsV0FBVUMsT0FBTTtBQUNsQztBQUdBLGNBQUksV0FJSDtBQUVELFdBQUMsV0FBVTtBQUNWLGdCQUFJO0FBRUosZ0JBQUksb0JBQW9CO0FBQUEsY0FDdkIsV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsY0FBYztBQUFBLGNBQ2QsY0FBYztBQUFBLGNBQ2QsWUFBWTtBQUFBO0FBQUEsY0FFWixnQkFBZ0I7QUFBQSxjQUNoQixpQkFBaUI7QUFBQSxjQUNqQixnQkFBZ0I7QUFBQSxjQUNoQixTQUFTO0FBQUEsY0FDVCxZ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QSxFQUFDLEVBQUUsVUFBVSxPQUFPLFFBQVE7QUFDcEMsZUFBU0EsRUFBQyxFQUFFLFVBQVUsT0FBTyxRQUFRO0FBQUEsSUFDekM7QUFFQSxhQUFTQSxLQUFJLEdBQUdBLEtBQUksYUFBYSxRQUFRQSxNQUFLO0FBQzFDLG1CQUFhQSxFQUFDLEVBQUUsVUFBVSxJQUFJLFFBQVE7QUFDdEMsb0JBQWNBLEVBQUMsRUFBRSxVQUFVLElBQUksUUFBUSxRQUFRO0FBQUEsSUFDbkQ7QUFBQSxFQUNKO0FBRUEsT0FBS0EsS0FBSSxHQUFHQSxLQUFJLFFBQVEsUUFBUUEsTUFBSztBQUNqQyxZQUFRQSxFQUFDLEVBQUUsaUJBQWlCLFNBQVMsVUFBVTtBQUFBLEVBQ25EO0FBRUEsTUFBSSxPQUFPLGFBQWEsUUFBUSxnQkFBZ0IsR0FBRztBQUMvQyxlQUFXLE9BQU8sYUFBYSxRQUFRLGdCQUFnQixDQUFDO0FBQUEsRUFDNUQ7IiwKICAibmFtZXMiOiBbIndpbmRvdyIsICJsYXp5U2l6ZXMiLCAiZG9jdW1lbnQiLCAiRGF0ZSIsICJzZXRUaW1lb3V0IiwgImUiLCAiaSIsICJsb2FkTW9kZSIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAibGF6eVNpemVzIiwgImUiLCAiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJDbGlwYm9hcmRBY3Rpb25DdXQiLCAiZmFrZUNvcHlBY3Rpb24iLCAiQ2xpcGJvYXJkQWN0aW9uQ29weSIsICJfdHlwZW9mIiwgIm9iaiIsICJDbGlwYm9hcmRBY3Rpb25EZWZhdWx0IiwgImkiLCAibyIsICJfc2V0UHJvdG90eXBlT2YiLCAicCIsICJlIiwgIl9nZXRQcm90b3R5cGVPZiIsICJDbGlwYm9hcmQiLCAiYWN0aW9uIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgImUiLCAibiIsICJyIiwgInQiLCAiYSIsICJ1IiwgInMiLCAiZiIsICJsYXp5U2l6ZXMiLCAiaSIsICJDbGlwYm9hcmQiLCAiZSIsICJpIl0KfQo=
diff --git a/public/js/color-mode.ac7cbc2b00064a1459ac914c23f4f76ffa9cbd73bca63c9032b8a844f9e2e31d.js b/public/js/color-mode.ac7cbc2b00064a1459ac914c23f4f76ffa9cbd73bca63c9032b8a844f9e2e31d.js
deleted file mode 100644
index a85a9a5d..00000000
--- a/public/js/color-mode.ac7cbc2b00064a1459ac914c23f4f76ffa9cbd73bca63c9032b8a844f9e2e31d.js
+++ /dev/null
@@ -1,42 +0,0 @@
-(() => {
- //
- (() => {
- "use strict";
- const storedTheme = localStorage.getItem("theme");
- const getPreferredTheme = () => {
- if (storedTheme) {
- return storedTheme;
- }
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
- };
- const setTheme = function(theme) {
- if (theme === "auto" && window.matchMedia("(prefers-color-scheme: dark)").matches) {
- document.documentElement.setAttribute("data-bs-theme", "dark");
- } else {
- document.documentElement.setAttribute("data-bs-theme", theme);
- }
- };
- setTheme(getPreferredTheme());
- window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
- if (storedTheme !== "light" || storedTheme !== "dark") {
- setTheme(getPreferredTheme());
- }
- });
- window.addEventListener("DOMContentLoaded", () => {
- document.querySelectorAll("[data-bs-theme-value]").forEach((toggle) => {
- toggle.addEventListener("click", () => {
- const theme = toggle.getAttribute("data-bs-theme-value");
- localStorage.setItem("theme", theme);
- setTheme(theme);
- });
- });
- });
- })();
-})();
-/*!
- * Modified from
- * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
- * Copyright 2011-2022 The Bootstrap Authors
- * Licensed under the Creative Commons Attribution 3.0 Unported License.
- */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBNb2RpZmllZCBmcm9tXG4gKiBDb2xvciBtb2RlIHRvZ2dsZXIgZm9yIEJvb3RzdHJhcCdzIGRvY3MgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDIyIFRoZSBCb290c3RyYXAgQXV0aG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIFVucG9ydGVkIExpY2Vuc2UuXG4gKi9cblxuKCgpID0+IHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBjb25zdCBzdG9yZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlbWUgaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgZ2V0IE9TL2Jyb3dzZXIgc2V0dGluZyBpZiBicm93c2VyIHN1cHBvcnRzXG4gICAgY29uc3QgZ2V0UHJlZmVycmVkVGhlbWUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzdG9yZWRUaGVtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlZFRoZW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gICAgfTtcblxuICAgIC8vIENoZWNrIGlmIHRoZW1lIGhhcyBiZWVuIHNldCwgYW5kIGFkZCB0aGVtZSB0byBkYXRhLWJzLXRoZW1lXG4gICAgY29uc3Qgc2V0VGhlbWUgPSBmdW5jdGlvbiAodGhlbWUpIHtcbiAgICAgICAgaWYgKHRoZW1lID09PSAnYXV0bycgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXRoZW1lJywgJ2RhcmsnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGhlbWUnLCB0aGVtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0VGhlbWUoZ2V0UHJlZmVycmVkVGhlbWUoKSk7XG5cbiAgICAvKlxuICBjb25zdCBzaG93QWN0aXZlVGhlbWUgPSAodGhlbWUsIGZvY3VzID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB0aGVtZVN3aXRjaGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JkLXRoZW1lJylcblxuICAgIGlmICghdGhlbWVTd2l0Y2hlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGhlbWVTd2l0Y2hlclRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmQtdGhlbWUtdGV4dCcpXG4gICAgY29uc3QgYWN0aXZlVGhlbWVJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRoZW1lLWljb24tYWN0aXZlIHVzZScpXG4gICAgY29uc3QgYnRuVG9BY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1icy10aGVtZS12YWx1ZT1cIiR7dGhlbWV9XCJdYClcbiAgICBjb25zdCBzdmdPZkFjdGl2ZUJ0biA9IGJ0blRvQWN0aXZlLnF1ZXJ5U2VsZWN0b3IoJ3N2ZyB1c2UnKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKVxuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdGhlbWUtdmFsdWVdJykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKVxuICAgIH0pXG5cbiAgICBidG5Ub0FjdGl2ZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKVxuICAgIGJ0blRvQWN0aXZlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKVxuICAgIGFjdGl2ZVRoZW1lSWNvbi5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBzdmdPZkFjdGl2ZUJ0bilcbiAgICBjb25zdCB0aGVtZVN3aXRjaGVyTGFiZWwgPSBgJHt0aGVtZVN3aXRjaGVyVGV4dC50ZXh0Q29udGVudH0gKCR7YnRuVG9BY3RpdmUuZGF0YXNldC5ic1RoZW1lVmFsdWV9KWBcbiAgICB0aGVtZVN3aXRjaGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoZW1lU3dpdGNoZXJMYWJlbClcblxuICAgIGlmIChmb2N1cykge1xuICAgICAgdGhlbWVTd2l0Y2hlci5mb2N1cygpXG4gICAgfVxuICB9XG4gICovXG5cbiAgICAvLyBVcGRhdGUgdGhlbWUgaWYgYnJvd3Nlci9PUyBzZXR0aW5nIGlzIGNoYW5nZWRcbiAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgaWYgKHN0b3JlZFRoZW1lICE9PSAnbGlnaHQnIHx8IHN0b3JlZFRoZW1lICE9PSAnZGFyaycpIHtcbiAgICAgICAgICAgIHNldFRoZW1lKGdldFByZWZlcnJlZFRoZW1lKCkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFbmFibGUgdGhlbWUgc3dpdGNoaW5nLCBvbiBET01Db250ZW50TG9hZGVkXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNob3dBY3RpdmVUaGVtZShnZXRQcmVmZXJyZWRUaGVtZSgpKVxuXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWJzLXRoZW1lLXZhbHVlXScpLmZvckVhY2goKHRvZ2dsZSkgPT4ge1xuICAgICAgICAgICAgdG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoZW1lID0gdG9nZ2xlLmdldEF0dHJpYnV0ZSgnZGF0YS1icy10aGVtZS12YWx1ZScpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsIHRoZW1lKTtcbiAgICAgICAgICAgICAgICBzZXRUaGVtZSh0aGVtZSk7XG4gICAgICAgICAgICAgICAgLy8gc2hvd0FjdGl2ZVRoZW1lKHRoZW1lKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7O0FBT0EsR0FBQyxNQUFNO0FBQ0g7QUFFQSxVQUFNLGNBQWMsYUFBYSxRQUFRLE9BQU87QUFHaEQsVUFBTSxvQkFBb0IsTUFBTTtBQUM1QixVQUFJLGFBQWE7QUFDYixlQUFPO0FBQUEsTUFDWDtBQUVBLGFBQU8sT0FBTyxXQUFXLDhCQUE4QixFQUFFLFVBQVUsU0FBUztBQUFBLElBQ2hGO0FBR0EsVUFBTSxXQUFXLFNBQVUsT0FBTztBQUM5QixVQUFJLFVBQVUsVUFBVSxPQUFPLFdBQVcsOEJBQThCLEVBQUUsU0FBUztBQUMvRSxpQkFBUyxnQkFBZ0IsYUFBYSxpQkFBaUIsTUFBTTtBQUFBLE1BQ2pFLE9BQU87QUFDSCxpQkFBUyxnQkFBZ0IsYUFBYSxpQkFBaUIsS0FBSztBQUFBLE1BQ2hFO0FBQUEsSUFDSjtBQUVBLGFBQVMsa0JBQWtCLENBQUM7QUFpQzVCLFdBQU8sV0FBVyw4QkFBOEIsRUFBRSxpQkFBaUIsVUFBVSxNQUFNO0FBQy9FLFVBQUksZ0JBQWdCLFdBQVcsZ0JBQWdCLFFBQVE7QUFDbkQsaUJBQVMsa0JBQWtCLENBQUM7QUFBQSxNQUNoQztBQUFBLElBQ0osQ0FBQztBQUdELFdBQU8saUJBQWlCLG9CQUFvQixNQUFNO0FBRzlDLGVBQVMsaUJBQWlCLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxXQUFXO0FBQ25FLGVBQU8saUJBQWlCLFNBQVMsTUFBTTtBQUNuQyxnQkFBTSxRQUFRLE9BQU8sYUFBYSxxQkFBcUI7QUFDdkQsdUJBQWEsUUFBUSxTQUFTLEtBQUs7QUFDbkMsbUJBQVMsS0FBSztBQUFBLFFBRWxCLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMLENBQUM7QUFBQSxFQUNMLEdBQUc7IiwKICAibmFtZXMiOiBbXQp9Cg==
diff --git a/public/js/color-mode.f14b3e296de1d0b69e75af684b62a4a912a2cadab04e36123407cd8388204f1d.js b/public/js/color-mode.f14b3e296de1d0b69e75af684b62a4a912a2cadab04e36123407cd8388204f1d.js
deleted file mode 100644
index 15b84d52..00000000
--- a/public/js/color-mode.f14b3e296de1d0b69e75af684b62a4a912a2cadab04e36123407cd8388204f1d.js
+++ /dev/null
@@ -1,42 +0,0 @@
-(() => {
- //
- (() => {
- "use strict";
- const storedTheme = localStorage.getItem("theme");
- const getPreferredTheme = () => {
- if (storedTheme) {
- return storedTheme;
- }
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
- };
- const setTheme = function(theme) {
- if (theme === "auto" && window.matchMedia("(prefers-color-scheme: dark)").matches) {
- document.documentElement.setAttribute("data-bs-theme", "dark");
- } else {
- document.documentElement.setAttribute("data-bs-theme", theme);
- }
- };
- setTheme(getPreferredTheme());
- window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
- if (storedTheme !== "light" || storedTheme !== "dark") {
- setTheme(getPreferredTheme());
- }
- });
- window.addEventListener("DOMContentLoaded", () => {
- document.querySelectorAll("[data-bs-theme-value]").forEach((toggle) => {
- toggle.addEventListener("click", () => {
- const theme = toggle.getAttribute("data-bs-theme-value");
- localStorage.setItem("theme", theme);
- setTheme(theme);
- });
- });
- });
- })();
-})();
-/*!
- * Modified from
- * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
- * Copyright 2011-2022 The Bootstrap Authors
- * Licensed under the Creative Commons Attribution 3.0 Unported License.
- */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXHJcbiAqIE1vZGlmaWVkIGZyb21cclxuICogQ29sb3IgbW9kZSB0b2dnbGVyIGZvciBCb290c3RyYXAncyBkb2NzIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxyXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDIyIFRoZSBCb290c3RyYXAgQXV0aG9yc1xyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQgTGljZW5zZS5cclxuICovXHJcblxyXG4oKCkgPT4ge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGNvbnN0IHN0b3JlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJyk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlbWUgaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgZ2V0IE9TL2Jyb3dzZXIgc2V0dGluZyBpZiBicm93c2VyIHN1cHBvcnRzXHJcbiAgICBjb25zdCBnZXRQcmVmZXJyZWRUaGVtZSA9ICgpID0+IHtcclxuICAgICAgICBpZiAoc3RvcmVkVGhlbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN0b3JlZFRoZW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZW1lIGhhcyBiZWVuIHNldCwgYW5kIGFkZCB0aGVtZSB0byBkYXRhLWJzLXRoZW1lXHJcbiAgICBjb25zdCBzZXRUaGVtZSA9IGZ1bmN0aW9uICh0aGVtZSkge1xyXG4gICAgICAgIGlmICh0aGVtZSA9PT0gJ2F1dG8nICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcykge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXRoZW1lJywgJ2RhcmsnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLXRoZW1lJywgdGhlbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgc2V0VGhlbWUoZ2V0UHJlZmVycmVkVGhlbWUoKSk7XHJcblxyXG4gICAgLypcclxuICBjb25zdCBzaG93QWN0aXZlVGhlbWUgPSAodGhlbWUsIGZvY3VzID0gZmFsc2UpID0+IHtcclxuICAgIGNvbnN0IHRoZW1lU3dpdGNoZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmQtdGhlbWUnKVxyXG5cclxuICAgIGlmICghdGhlbWVTd2l0Y2hlcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGVtZVN3aXRjaGVyVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZC10aGVtZS10ZXh0JylcclxuICAgIGNvbnN0IGFjdGl2ZVRoZW1lSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50aGVtZS1pY29uLWFjdGl2ZSB1c2UnKVxyXG4gICAgY29uc3QgYnRuVG9BY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1icy10aGVtZS12YWx1ZT1cIiR7dGhlbWV9XCJdYClcclxuICAgIGNvbnN0IHN2Z09mQWN0aXZlQnRuID0gYnRuVG9BY3RpdmUucXVlcnlTZWxlY3Rvcignc3ZnIHVzZScpLmdldEF0dHJpYnV0ZSgnaHJlZicpXHJcblxyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdGhlbWUtdmFsdWVdJykuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKVxyXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJylcclxuICAgIH0pXHJcblxyXG4gICAgYnRuVG9BY3RpdmUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcclxuICAgIGJ0blRvQWN0aXZlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKVxyXG4gICAgYWN0aXZlVGhlbWVJY29uLnNldEF0dHJpYnV0ZSgnaHJlZicsIHN2Z09mQWN0aXZlQnRuKVxyXG4gICAgY29uc3QgdGhlbWVTd2l0Y2hlckxhYmVsID0gYCR7dGhlbWVTd2l0Y2hlclRleHQudGV4dENvbnRlbnR9ICgke2J0blRvQWN0aXZlLmRhdGFzZXQuYnNUaGVtZVZhbHVlfSlgXHJcbiAgICB0aGVtZVN3aXRjaGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoZW1lU3dpdGNoZXJMYWJlbClcclxuXHJcbiAgICBpZiAoZm9jdXMpIHtcclxuICAgICAgdGhlbWVTd2l0Y2hlci5mb2N1cygpXHJcbiAgICB9XHJcbiAgfVxyXG4gICovXHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZW1lIGlmIGJyb3dzZXIvT1Mgc2V0dGluZyBpcyBjaGFuZ2VkXHJcbiAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgICBpZiAoc3RvcmVkVGhlbWUgIT09ICdsaWdodCcgfHwgc3RvcmVkVGhlbWUgIT09ICdkYXJrJykge1xyXG4gICAgICAgICAgICBzZXRUaGVtZShnZXRQcmVmZXJyZWRUaGVtZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBFbmFibGUgdGhlbWUgc3dpdGNoaW5nLCBvbiBET01Db250ZW50TG9hZGVkXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcclxuICAgICAgICAvLyBzaG93QWN0aXZlVGhlbWUoZ2V0UHJlZmVycmVkVGhlbWUoKSlcclxuXHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYnMtdGhlbWUtdmFsdWVdJykuZm9yRWFjaCgodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgICAgIHRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRoZW1lID0gdG9nZ2xlLmdldEF0dHJpYnV0ZSgnZGF0YS1icy10aGVtZS12YWx1ZScpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RoZW1lJywgdGhlbWUpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGhlbWUodGhlbWUpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2hvd0FjdGl2ZVRoZW1lKHRoZW1lKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59KSgpO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOztBQU9BLEdBQUMsTUFBTTtBQUNIO0FBRUEsVUFBTSxjQUFjLGFBQWEsUUFBUSxPQUFPO0FBR2hELFVBQU0sb0JBQW9CLE1BQU07QUFDNUIsVUFBSSxhQUFhO0FBQ2IsZUFBTztBQUFBLE1BQ1g7QUFFQSxhQUFPLE9BQU8sV0FBVyw4QkFBOEIsRUFBRSxVQUFVLFNBQVM7QUFBQSxJQUNoRjtBQUdBLFVBQU0sV0FBVyxTQUFVLE9BQU87QUFDOUIsVUFBSSxVQUFVLFVBQVUsT0FBTyxXQUFXLDhCQUE4QixFQUFFLFNBQVM7QUFDL0UsaUJBQVMsZ0JBQWdCLGFBQWEsaUJBQWlCLE1BQU07QUFBQSxNQUNqRSxPQUFPO0FBQ0gsaUJBQVMsZ0JBQWdCLGFBQWEsaUJBQWlCLEtBQUs7QUFBQSxNQUNoRTtBQUFBLElBQ0o7QUFFQSxhQUFTLGtCQUFrQixDQUFDO0FBaUM1QixXQUFPLFdBQVcsOEJBQThCLEVBQUUsaUJBQWlCLFVBQVUsTUFBTTtBQUMvRSxVQUFJLGdCQUFnQixXQUFXLGdCQUFnQixRQUFRO0FBQ25ELGlCQUFTLGtCQUFrQixDQUFDO0FBQUEsTUFDaEM7QUFBQSxJQUNKLENBQUM7QUFHRCxXQUFPLGlCQUFpQixvQkFBb0IsTUFBTTtBQUc5QyxlQUFTLGlCQUFpQix1QkFBdUIsRUFBRSxRQUFRLENBQUMsV0FBVztBQUNuRSxlQUFPLGlCQUFpQixTQUFTLE1BQU07QUFDbkMsZ0JBQU0sUUFBUSxPQUFPLGFBQWEscUJBQXFCO0FBQ3ZELHVCQUFhLFFBQVEsU0FBUyxLQUFLO0FBQ25DLG1CQUFTLEtBQUs7QUFBQSxRQUVsQixDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFDTCxHQUFHOyIsCiAgIm5hbWVzIjogW10KfQo=
diff --git a/public/js/flexsearch.8350d2f520e131f8552ed57c1eadd05c50eccf0427267781442dd8ddf8fdcdf7.js b/public/js/flexsearch.8350d2f520e131f8552ed57c1eadd05c50eccf0427267781442dd8ddf8fdcdf7.js
deleted file mode 100644
index 6a417ba4..00000000
--- a/public/js/flexsearch.8350d2f520e131f8552ed57c1eadd05c50eccf0427267781442dd8ddf8fdcdf7.js
+++ /dev/null
@@ -1,922 +0,0 @@
-(() => {
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __commonJS = (cb, mod) => function __require() {
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
- };
-
- // (disabled):worker_threads
- var require_worker_threads = __commonJS({
- "(disabled):worker_threads"() {
- }
- });
-
- // node_modules/flexsearch/dist/flexsearch.bundle.module.min.js
- var t;
- function u(a) {
- return "undefined" !== typeof a ? a : true;
- }
- function v(a) {
- const b = Array(a);
- for (let c = 0; c < a; c++) b[c] = x();
- return b;
- }
- function x() {
- return /* @__PURE__ */ Object.create(null);
- }
- function aa(a, b) {
- return b.length - a.length;
- }
- function C(a) {
- return "string" === typeof a;
- }
- function D(a) {
- return "object" === typeof a;
- }
- function E(a) {
- return "function" === typeof a;
- }
- function F(a, b) {
- var c = ba;
- if (a && (b && (a = G(a, b)), this.H && (a = G(a, this.H)), this.J && 1 < a.length && (a = G(a, this.J)), c || "" === c)) {
- b = a.split(c);
- if (this.filter) {
- a = this.filter;
- c = b.length;
- const d = [];
- for (let e = 0, f = 0; e < c; e++) {
- const h = b[e];
- h && !a[h] && (d[f++] = h);
- }
- a = d;
- } else a = b;
- return a;
- }
- return a;
- }
- var ba = /[\p{Z}\p{S}\p{P}\p{C}]+/u;
- var ca = /[\u0300-\u036f]/g;
- function I(a, b) {
- const c = Object.keys(a), d = c.length, e = [];
- let f = "", h = 0;
- for (let g = 0, k, m; g < d; g++) k = c[g], (m = a[k]) ? (e[h++] = J(b ? "(?!\\b)" + k + "(\\b|_)" : k), e[h++] = m) : f += (f ? "|" : "") + k;
- f && (e[h++] = J(b ? "(?!\\b)(" + f + ")(\\b|_)" : "(" + f + ")"), e[h] = "");
- return e;
- }
- function G(a, b) {
- for (let c = 0, d = b.length; c < d && (a = a.replace(b[c], b[c + 1]), a); c += 2) ;
- return a;
- }
- function J(a) {
- return new RegExp(a, "g");
- }
- function da(a) {
- let b = "", c = "";
- for (let d = 0, e = a.length, f; d < e; d++) (f = a[d]) !== c && (b += c = f);
- return b;
- }
- var fa = { encode: ea, F: false, G: "" };
- function ea(a) {
- return F.call(this, ("" + a).toLowerCase(), false);
- }
- var ha = {};
- var K = {};
- function ia(a) {
- L(a, "add");
- L(a, "append");
- L(a, "search");
- L(a, "update");
- L(a, "remove");
- }
- function L(a, b) {
- a[b + "Async"] = function() {
- const c = this, d = arguments;
- var e = d[d.length - 1];
- let f;
- E(e) && (f = e, delete d[d.length - 1]);
- e = new Promise(function(h) {
- setTimeout(function() {
- c.async = true;
- const g = c[b].apply(c, d);
- c.async = false;
- h(g);
- });
- });
- return f ? (e.then(f), this) : e;
- };
- }
- function ja(a, b, c, d) {
- const e = a.length;
- let f = [], h, g, k = 0;
- d && (d = []);
- for (let m = e - 1; 0 <= m; m--) {
- const n = a[m], w = n.length, q = x();
- let r = !h;
- for (let l = 0; l < w; l++) {
- const p = n[l], A = p.length;
- if (A) for (let B = 0, z, y; B < A; B++) if (y = p[B], h) {
- if (h[y]) {
- if (!m) {
- if (c) c--;
- else if (f[k++] = y, k === b) return f;
- }
- if (m || d) q[y] = 1;
- r = true;
- }
- if (d && (z = (g[y] || 0) + 1, g[y] = z, z < e)) {
- const H = d[z - 2] || (d[z - 2] = []);
- H[H.length] = y;
- }
- } else q[y] = 1;
- }
- if (d) h || (g = q);
- else if (!r) return [];
- h = q;
- }
- if (d) for (let m = d.length - 1, n, w; 0 <= m; m--) {
- n = d[m];
- w = n.length;
- for (let q = 0, r; q < w; q++) if (r = n[q], !h[r]) {
- if (c) c--;
- else if (f[k++] = r, k === b) return f;
- h[r] = 1;
- }
- }
- return f;
- }
- function ka(a, b) {
- const c = x(), d = x(), e = [];
- for (let f = 0; f < a.length; f++) c[a[f]] = 1;
- for (let f = 0, h; f < b.length; f++) {
- h = b[f];
- for (let g = 0, k; g < h.length; g++) k = h[g], c[k] && !d[k] && (d[k] = 1, e[e.length] = k);
- }
- return e;
- }
- function M(a) {
- this.l = true !== a && a;
- this.cache = x();
- this.h = [];
- }
- function la(a, b, c) {
- D(a) && (a = a.query);
- let d = this.cache.get(a);
- d || (d = this.search(a, b, c), this.cache.set(a, d));
- return d;
- }
- M.prototype.set = function(a, b) {
- if (!this.cache[a]) {
- var c = this.h.length;
- c === this.l ? delete this.cache[this.h[c - 1]] : c++;
- for (--c; 0 < c; c--) this.h[c] = this.h[c - 1];
- this.h[0] = a;
- }
- this.cache[a] = b;
- };
- M.prototype.get = function(a) {
- const b = this.cache[a];
- if (this.l && b && (a = this.h.indexOf(a))) {
- const c = this.h[a - 1];
- this.h[a - 1] = this.h[a];
- this.h[a] = c;
- }
- return b;
- };
- var na = { memory: { charset: "latin:extra", D: 3, B: 4, m: false }, performance: { D: 3, B: 3, s: false, context: { depth: 2, D: 1 } }, match: { charset: "latin:extra", G: "reverse" }, score: { charset: "latin:advanced", D: 20, B: 3, context: { depth: 3, D: 9 } }, "default": {} };
- function oa(a, b, c, d, e, f, h, g) {
- setTimeout(function() {
- const k = a(c ? c + "." + d : d, JSON.stringify(h));
- k && k.then ? k.then(function() {
- b.export(a, b, c, e, f + 1, g);
- }) : b.export(a, b, c, e, f + 1, g);
- });
- }
- function N(a, b) {
- if (!(this instanceof N)) return new N(a);
- var c;
- if (a) {
- C(a) ? a = na[a] : (c = a.preset) && (a = Object.assign({}, c[c], a));
- c = a.charset;
- var d = a.lang;
- C(c) && (-1 === c.indexOf(":") && (c += ":default"), c = K[c]);
- C(d) && (d = ha[d]);
- } else a = {};
- let e, f, h = a.context || {};
- this.encode = a.encode || c && c.encode || ea;
- this.register = b || x();
- this.D = e = a.resolution || 9;
- this.G = b = c && c.G || a.tokenize || "strict";
- this.depth = "strict" === b && h.depth;
- this.l = u(h.bidirectional);
- this.s = f = u(a.optimize);
- this.m = u(a.fastupdate);
- this.B = a.minlength || 1;
- this.C = a.boost;
- this.map = f ? v(e) : x();
- this.A = e = h.resolution || 1;
- this.h = f ? v(e) : x();
- this.F = c && c.F || a.rtl;
- this.H = (b = a.matcher || d && d.H) && I(b, false);
- this.J = (b = a.stemmer || d && d.J) && I(b, true);
- if (c = b = a.filter || d && d.filter) {
- c = b;
- d = x();
- for (let g = 0, k = c.length; g < k; g++) d[c[g]] = 1;
- c = d;
- }
- this.filter = c;
- this.cache = (b = a.cache) && new M(b);
- }
- t = N.prototype;
- t.append = function(a, b) {
- return this.add(a, b, true);
- };
- t.add = function(a, b, c, d) {
- if (b && (a || 0 === a)) {
- if (!d && !c && this.register[a]) return this.update(a, b);
- b = this.encode(b);
- if (d = b.length) {
- const m = x(), n = x(), w = this.depth, q = this.D;
- for (let r = 0; r < d; r++) {
- let l = b[this.F ? d - 1 - r : r];
- var e = l.length;
- if (l && e >= this.B && (w || !n[l])) {
- var f = O(q, d, r), h = "";
- switch (this.G) {
- case "full":
- if (2 < e) {
- for (f = 0; f < e; f++) for (var g = e; g > f; g--) if (g - f >= this.B) {
- var k = O(q, d, r, e, f);
- h = l.substring(f, g);
- P(this, n, h, k, a, c);
- }
- break;
- }
- case "reverse":
- if (1 < e) {
- for (g = e - 1; 0 < g; g--) h = l[g] + h, h.length >= this.B && P(
- this,
- n,
- h,
- O(q, d, r, e, g),
- a,
- c
- );
- h = "";
- }
- case "forward":
- if (1 < e) {
- for (g = 0; g < e; g++) h += l[g], h.length >= this.B && P(this, n, h, f, a, c);
- break;
- }
- default:
- if (this.C && (f = Math.min(f / this.C(b, l, r) | 0, q - 1)), P(this, n, l, f, a, c), w && 1 < d && r < d - 1) {
- for (e = x(), h = this.A, f = l, g = Math.min(w + 1, d - r), e[f] = 1, k = 1; k < g; k++) if ((l = b[this.F ? d - 1 - r - k : r + k]) && l.length >= this.B && !e[l]) {
- e[l] = 1;
- const p = this.l && l > f;
- P(this, m, p ? f : l, O(h + (d / 2 > h ? 0 : 1), d, r, g - 1, k - 1), a, c, p ? l : f);
- }
- }
- }
- }
- }
- this.m || (this.register[a] = 1);
- }
- }
- return this;
- };
- function O(a, b, c, d, e) {
- return c && 1 < a ? b + (d || 0) <= a ? c + (e || 0) : (a - 1) / (b + (d || 0)) * (c + (e || 0)) + 1 | 0 : 0;
- }
- function P(a, b, c, d, e, f, h) {
- let g = h ? a.h : a.map;
- if (!b[c] || h && !b[c][h]) a.s && (g = g[d]), h ? (b = b[c] || (b[c] = x()), b[h] = 1, g = g[h] || (g[h] = x())) : b[c] = 1, g = g[c] || (g[c] = []), a.s || (g = g[d] || (g[d] = [])), f && g.includes(e) || (g[g.length] = e, a.m && (a = a.register[e] || (a.register[e] = []), a[a.length] = g));
- }
- t.search = function(a, b, c) {
- c || (!b && D(a) ? (c = a, a = c.query) : D(b) && (c = b));
- let d = [], e;
- let f, h = 0;
- if (c) {
- a = c.query || a;
- b = c.limit;
- h = c.offset || 0;
- var g = c.context;
- f = c.suggest;
- }
- if (a && (a = this.encode("" + a), e = a.length, 1 < e)) {
- c = x();
- var k = [];
- for (let n = 0, w = 0, q; n < e; n++) if ((q = a[n]) && q.length >= this.B && !c[q]) if (this.s || f || this.map[q]) k[w++] = q, c[q] = 1;
- else return d;
- a = k;
- e = a.length;
- }
- if (!e) return d;
- b || (b = 100);
- g = this.depth && 1 < e && false !== g;
- c = 0;
- let m;
- g ? (m = a[0], c = 1) : 1 < e && a.sort(aa);
- for (let n, w; c < e; c++) {
- w = a[c];
- g ? (n = pa(
- this,
- d,
- f,
- b,
- h,
- 2 === e,
- w,
- m
- ), f && false === n && d.length || (m = w)) : n = pa(this, d, f, b, h, 1 === e, w);
- if (n) return n;
- if (f && c === e - 1) {
- k = d.length;
- if (!k) {
- if (g) {
- g = 0;
- c = -1;
- continue;
- }
- return d;
- }
- if (1 === k) return qa(d[0], b, h);
- }
- }
- return ja(d, b, h, f);
- };
- function pa(a, b, c, d, e, f, h, g) {
- let k = [], m = g ? a.h : a.map;
- a.s || (m = ra(m, h, g, a.l));
- if (m) {
- let n = 0;
- const w = Math.min(m.length, g ? a.A : a.D);
- for (let q = 0, r = 0, l, p; q < w; q++) if (l = m[q]) {
- if (a.s && (l = ra(l, h, g, a.l)), e && l && f && (p = l.length, p <= e ? (e -= p, l = null) : (l = l.slice(e), e = 0)), l && (k[n++] = l, f && (r += l.length, r >= d))) break;
- }
- if (n) {
- if (f) return qa(k, d, 0);
- b[b.length] = k;
- return;
- }
- }
- return !c && k;
- }
- function qa(a, b, c) {
- a = 1 === a.length ? a[0] : [].concat.apply([], a);
- return c || a.length > b ? a.slice(c, c + b) : a;
- }
- function ra(a, b, c, d) {
- c ? (d = d && b > c, a = (a = a[d ? b : c]) && a[d ? c : b]) : a = a[b];
- return a;
- }
- t.contain = function(a) {
- return !!this.register[a];
- };
- t.update = function(a, b) {
- return this.remove(a).add(a, b);
- };
- t.remove = function(a, b) {
- const c = this.register[a];
- if (c) {
- if (this.m) for (let d = 0, e; d < c.length; d++) e = c[d], e.splice(e.indexOf(a), 1);
- else Q(this.map, a, this.D, this.s), this.depth && Q(this.h, a, this.A, this.s);
- b || delete this.register[a];
- if (this.cache) {
- b = this.cache;
- for (let d = 0, e, f; d < b.h.length; d++) f = b.h[d], e = b.cache[f], e.includes(a) && (b.h.splice(d--, 1), delete b.cache[f]);
- }
- }
- return this;
- };
- function Q(a, b, c, d, e) {
- let f = 0;
- if (a.constructor === Array) if (e) b = a.indexOf(b), -1 !== b ? 1 < a.length && (a.splice(b, 1), f++) : f++;
- else {
- e = Math.min(a.length, c);
- for (let h = 0, g; h < e; h++) if (g = a[h]) f = Q(g, b, c, d, e), d || f || delete a[h];
- }
- else for (let h in a) (f = Q(a[h], b, c, d, e)) || delete a[h];
- return f;
- }
- t.searchCache = la;
- t.export = function(a, b, c, d, e, f) {
- let h = true;
- "undefined" === typeof f && (h = new Promise((m) => {
- f = m;
- }));
- let g, k;
- switch (e || (e = 0)) {
- case 0:
- g = "reg";
- if (this.m) {
- k = x();
- for (let m in this.register) k[m] = 1;
- } else k = this.register;
- break;
- case 1:
- g = "cfg";
- k = { doc: 0, opt: this.s ? 1 : 0 };
- break;
- case 2:
- g = "map";
- k = this.map;
- break;
- case 3:
- g = "ctx";
- k = this.h;
- break;
- default:
- "undefined" === typeof c && f && f();
- return;
- }
- oa(a, b || this, c, g, d, e, k, f);
- return h;
- };
- t.import = function(a, b) {
- if (b) switch (C(b) && (b = JSON.parse(b)), a) {
- case "cfg":
- this.s = !!b.opt;
- break;
- case "reg":
- this.m = false;
- this.register = b;
- break;
- case "map":
- this.map = b;
- break;
- case "ctx":
- this.h = b;
- }
- };
- ia(N.prototype);
- function sa(a) {
- a = a.data;
- var b = self._index;
- const c = a.args;
- var d = a.task;
- switch (d) {
- case "init":
- d = a.options || {};
- a = a.factory;
- b = d.encode;
- d.cache = false;
- b && 0 === b.indexOf("function") && (d.encode = Function("return " + b)());
- a ? (Function("return " + a)()(self), self._index = new self.FlexSearch.Index(d), delete self.FlexSearch) : self._index = new N(d);
- break;
- default:
- a = a.id, b = b[d].apply(b, c), postMessage("search" === d ? { id: a, msg: b } : { id: a });
- }
- }
- var ta = 0;
- function S(a) {
- if (!(this instanceof S)) return new S(a);
- var b;
- a ? E(b = a.encode) && (a.encode = b.toString()) : a = {};
- (b = (self || window)._factory) && (b = b.toString());
- const c = "undefined" === typeof window && self.exports, d = this;
- this.o = ua(b, c, a.worker);
- this.h = x();
- if (this.o) {
- if (c) this.o.on("message", function(e) {
- d.h[e.id](e.msg);
- delete d.h[e.id];
- });
- else this.o.onmessage = function(e) {
- e = e.data;
- d.h[e.id](e.msg);
- delete d.h[e.id];
- };
- this.o.postMessage({ task: "init", factory: b, options: a });
- }
- }
- T("add");
- T("append");
- T("search");
- T("update");
- T("remove");
- function T(a) {
- S.prototype[a] = S.prototype[a + "Async"] = function() {
- const b = this, c = [].slice.call(arguments);
- var d = c[c.length - 1];
- let e;
- E(d) && (e = d, c.splice(c.length - 1, 1));
- d = new Promise(function(f) {
- setTimeout(function() {
- b.h[++ta] = f;
- b.o.postMessage({ task: a, id: ta, args: c });
- });
- });
- return e ? (d.then(e), this) : d;
- };
- }
- function ua(a, b, c) {
- let d;
- try {
- d = b ? new (require_worker_threads())["Worker"](__dirname + "/node/node.js") : a ? new Worker(URL.createObjectURL(new Blob(["onmessage=" + sa.toString()], { type: "text/javascript" }))) : new Worker(C(c) ? c : "worker/worker.js", { type: "module" });
- } catch (e) {
- }
- return d;
- }
- function U(a) {
- if (!(this instanceof U)) return new U(a);
- var b = a.document || a.doc || a, c;
- this.K = [];
- this.h = [];
- this.A = [];
- this.register = x();
- this.key = (c = b.key || b.id) && V(c, this.A) || "id";
- this.m = u(a.fastupdate);
- this.C = (c = b.store) && true !== c && [];
- this.store = c && x();
- this.I = (c = b.tag) && V(c, this.A);
- this.l = c && x();
- this.cache = (c = a.cache) && new M(c);
- a.cache = false;
- this.o = a.worker;
- this.async = false;
- c = x();
- let d = b.index || b.field || b;
- C(d) && (d = [d]);
- for (let e = 0, f, h; e < d.length; e++) f = d[e], C(f) || (h = f, f = f.field), h = D(h) ? Object.assign({}, a, h) : a, this.o && (c[f] = new S(h), c[f].o || (this.o = false)), this.o || (c[f] = new N(h, this.register)), this.K[e] = V(f, this.A), this.h[e] = f;
- if (this.C) for (a = b.store, C(a) && (a = [a]), b = 0; b < a.length; b++) this.C[b] = V(a[b], this.A);
- this.index = c;
- }
- function V(a, b) {
- const c = a.split(":");
- let d = 0;
- for (let e = 0; e < c.length; e++) a = c[e], 0 <= a.indexOf("[]") && (a = a.substring(0, a.length - 2)) && (b[d] = true), a && (c[d++] = a);
- d < c.length && (c.length = d);
- return 1 < d ? c : c[0];
- }
- function X(a, b) {
- if (C(b)) a = a[b];
- else for (let c = 0; a && c < b.length; c++) a = a[b[c]];
- return a;
- }
- function Y(a, b, c, d, e) {
- a = a[e];
- if (d === c.length - 1) b[e] = a;
- else if (a) if (a.constructor === Array) for (b = b[e] = Array(a.length), e = 0; e < a.length; e++) Y(a, b, c, d, e);
- else b = b[e] || (b[e] = x()), e = c[++d], Y(a, b, c, d, e);
- }
- function Z(a, b, c, d, e, f, h, g) {
- if (a = a[h]) if (d === b.length - 1) {
- if (a.constructor === Array) {
- if (c[d]) {
- for (b = 0; b < a.length; b++) e.add(f, a[b], true, true);
- return;
- }
- a = a.join(" ");
- }
- e.add(f, a, g, true);
- } else if (a.constructor === Array) for (h = 0; h < a.length; h++) Z(a, b, c, d, e, f, h, g);
- else h = b[++d], Z(a, b, c, d, e, f, h, g);
- }
- t = U.prototype;
- t.add = function(a, b, c) {
- D(a) && (b = a, a = X(b, this.key));
- if (b && (a || 0 === a)) {
- if (!c && this.register[a]) return this.update(a, b);
- for (let d = 0, e, f; d < this.h.length; d++) f = this.h[d], e = this.K[d], C(e) && (e = [e]), Z(b, e, this.A, 0, this.index[f], a, e[0], c);
- if (this.I) {
- let d = X(b, this.I), e = x();
- C(d) && (d = [d]);
- for (let f = 0, h, g; f < d.length; f++) if (h = d[f], !e[h] && (e[h] = 1, g = this.l[h] || (this.l[h] = []), !c || !g.includes(a))) {
- if (g[g.length] = a, this.m) {
- const k = this.register[a] || (this.register[a] = []);
- k[k.length] = g;
- }
- }
- }
- if (this.store && (!c || !this.store[a])) {
- let d;
- if (this.C) {
- d = x();
- for (let e = 0, f; e < this.C.length; e++) f = this.C[e], C(f) ? d[f] = b[f] : Y(b, d, f, 0, f[0]);
- }
- this.store[a] = d || b;
- }
- }
- return this;
- };
- t.append = function(a, b) {
- return this.add(a, b, true);
- };
- t.update = function(a, b) {
- return this.remove(a).add(a, b);
- };
- t.remove = function(a) {
- D(a) && (a = X(a, this.key));
- if (this.register[a]) {
- for (var b = 0; b < this.h.length && (this.index[this.h[b]].remove(a, !this.o), !this.m); b++) ;
- if (this.I && !this.m) for (let c in this.l) {
- b = this.l[c];
- const d = b.indexOf(a);
- -1 !== d && (1 < b.length ? b.splice(d, 1) : delete this.l[c]);
- }
- this.store && delete this.store[a];
- delete this.register[a];
- }
- return this;
- };
- t.search = function(a, b, c, d) {
- c || (!b && D(a) ? (c = a, a = "") : D(b) && (c = b, b = 0));
- let e = [], f = [], h, g, k, m, n, w, q = 0;
- if (c) if (c.constructor === Array) k = c, c = null;
- else {
- a = c.query || a;
- k = (h = c.pluck) || c.index || c.field;
- m = c.tag;
- g = this.store && c.enrich;
- n = "and" === c.bool;
- b = c.limit || b || 100;
- w = c.offset || 0;
- if (m && (C(m) && (m = [m]), !a)) {
- for (let l = 0, p; l < m.length; l++) if (p = va.call(this, m[l], b, w, g)) e[e.length] = p, q++;
- return q ? e : [];
- }
- C(k) && (k = [k]);
- }
- k || (k = this.h);
- n = n && (1 < k.length || m && 1 < m.length);
- const r = !d && (this.o || this.async) && [];
- for (let l = 0, p, A, B; l < k.length; l++) {
- let z;
- A = k[l];
- C(A) || (z = A, A = z.field, a = z.query || a, b = z.limit || b, g = z.enrich || g);
- if (r) r[l] = this.index[A].searchAsync(a, b, z || c);
- else {
- d ? p = d[l] : p = this.index[A].search(a, b, z || c);
- B = p && p.length;
- if (m && B) {
- const y = [];
- let H = 0;
- n && (y[0] = [p]);
- for (let W = 0, ma, R; W < m.length; W++) if (ma = m[W], B = (R = this.l[ma]) && R.length) H++, y[y.length] = n ? [R] : R;
- H && (p = n ? ja(y, b || 100, w || 0) : ka(p, y), B = p.length);
- }
- if (B) f[q] = A, e[q++] = p;
- else if (n) return [];
- }
- }
- if (r) {
- const l = this;
- return new Promise(function(p) {
- Promise.all(r).then(function(A) {
- p(l.search(
- a,
- b,
- c,
- A
- ));
- });
- });
- }
- if (!q) return [];
- if (h && (!g || !this.store)) return e[0];
- for (let l = 0, p; l < f.length; l++) {
- p = e[l];
- p.length && g && (p = wa.call(this, p));
- if (h) return p;
- e[l] = { field: f[l], result: p };
- }
- return e;
- };
- function va(a, b, c, d) {
- let e = this.l[a], f = e && e.length - c;
- if (f && 0 < f) {
- if (f > b || c) e = e.slice(c, c + b);
- d && (e = wa.call(this, e));
- return { tag: a, result: e };
- }
- }
- function wa(a) {
- const b = Array(a.length);
- for (let c = 0, d; c < a.length; c++) d = a[c], b[c] = { id: d, doc: this.store[d] };
- return b;
- }
- t.contain = function(a) {
- return !!this.register[a];
- };
- t.get = function(a) {
- return this.store[a];
- };
- t.set = function(a, b) {
- this.store[a] = b;
- return this;
- };
- t.searchCache = la;
- t.export = function(a, b, c, d, e, f) {
- let h;
- "undefined" === typeof f && (h = new Promise((g) => {
- f = g;
- }));
- e || (e = 0);
- d || (d = 0);
- if (d < this.h.length) {
- const g = this.h[d], k = this.index[g];
- b = this;
- setTimeout(function() {
- k.export(a, b, e ? g : "", d, e++, f) || (d++, e = 1, b.export(a, b, g, d, e, f));
- });
- } else {
- let g, k;
- switch (e) {
- case 1:
- g = "tag";
- k = this.l;
- c = null;
- break;
- case 2:
- g = "store";
- k = this.store;
- c = null;
- break;
- default:
- f();
- return;
- }
- oa(a, this, c, g, d, e, k, f);
- }
- return h;
- };
- t.import = function(a, b) {
- if (b) switch (C(b) && (b = JSON.parse(b)), a) {
- case "tag":
- this.l = b;
- break;
- case "reg":
- this.m = false;
- this.register = b;
- for (let d = 0, e; d < this.h.length; d++) e = this.index[this.h[d]], e.register = b, e.m = false;
- break;
- case "store":
- this.store = b;
- break;
- default:
- a = a.split(".");
- const c = a[0];
- a = a[1];
- c && a && this.index[c].import(a, b);
- }
- };
- ia(U.prototype);
- var ya = { encode: xa, F: false, G: "" };
- var za = [J("[\xE0\xE1\xE2\xE3\xE4\xE5]"), "a", J("[\xE8\xE9\xEA\xEB]"), "e", J("[\xEC\xED\xEE\xEF]"), "i", J("[\xF2\xF3\xF4\xF5\xF6\u0151]"), "o", J("[\xF9\xFA\xFB\xFC\u0171]"), "u", J("[\xFD\u0177\xFF]"), "y", J("\xF1"), "n", J("[\xE7c]"), "k", J("\xDF"), "s", J(" & "), " and "];
- function xa(a) {
- var b = a = "" + a;
- b.normalize && (b = b.normalize("NFD").replace(ca, ""));
- return F.call(this, b.toLowerCase(), !a.normalize && za);
- }
- var Ba = { encode: Aa, F: false, G: "strict" };
- var Ca = /[^a-z0-9]+/;
- var Da = { b: "p", v: "f", w: "f", z: "s", x: "s", "\xDF": "s", d: "t", n: "m", c: "k", g: "k", j: "k", q: "k", i: "e", y: "e", u: "o" };
- function Aa(a) {
- a = xa.call(this, a).join(" ");
- const b = [];
- if (a) {
- const c = a.split(Ca), d = c.length;
- for (let e = 0, f, h = 0; e < d; e++) if ((a = c[e]) && (!this.filter || !this.filter[a])) {
- f = a[0];
- let g = Da[f] || f, k = g;
- for (let m = 1; m < a.length; m++) {
- f = a[m];
- const n = Da[f] || f;
- n && n !== k && (g += n, k = n);
- }
- b[h++] = g;
- }
- }
- return b;
- }
- var Fa = { encode: Ea, F: false, G: "" };
- var Ga = [J("ae"), "a", J("oe"), "o", J("sh"), "s", J("th"), "t", J("ph"), "f", J("pf"), "f", J("(?![aeo])h(?![aeo])"), "", J("(?!^[aeo])h(?!^[aeo])"), ""];
- function Ea(a, b) {
- a && (a = Aa.call(this, a).join(" "), 2 < a.length && (a = G(a, Ga)), b || (1 < a.length && (a = da(a)), a && (a = a.split(" "))));
- return a || [];
- }
- var Ia = { encode: Ha, F: false, G: "" };
- var Ja = J("(?!\\b)[aeo]");
- function Ha(a) {
- a && (a = Ea.call(this, a, true), 1 < a.length && (a = a.replace(Ja, "")), 1 < a.length && (a = da(a)), a && (a = a.split(" ")));
- return a || [];
- }
- K["latin:default"] = fa;
- K["latin:simple"] = ya;
- K["latin:balance"] = Ba;
- K["latin:advanced"] = Fa;
- K["latin:extra"] = Ia;
- var flexsearch_bundle_module_min_default = { Index: N, Document: U, Worker: S, registerCharset: function(a, b) {
- K[a] = b;
- }, registerLanguage: function(a, b) {
- ha[a] = b;
- } };
-
- //
- (function() {
- "use strict";
- const index = new flexsearch_bundle_module_min_default.Document({
- tokenize: "forward",
- document: {
- id: "id",
- index: [
- {
- field: "title"
- },
- {
- field: "tags"
- },
- {
- field: "content"
- },
- {
- field: "date",
- tokenize: "strict",
- encode: false
- }
- ],
- store: ["title", "summary", "date", "permalink"]
- }
- });
- function showResults(items) {
- const template = document.querySelector("template").content;
- const fragment = document.createDocumentFragment();
- const results = document.querySelector(".search-results");
- results.textContent = "";
- const itemsLength = Object.keys(items).length;
- if (itemsLength === 0 && query.value === "") {
- document.querySelector(".search-no-results").classList.add("d-none");
- document.querySelector(".search-no-recent").classList.remove("d-none");
- } else if (itemsLength === 0 && query.value !== "") {
- document.querySelector(".search-no-recent").classList.add("d-none");
- const queryNoResults = document.querySelector(".query-no-results");
- queryNoResults.innerText = query.value;
- document.querySelector(".search-no-results").classList.remove("d-none");
- } else {
- document.querySelector(".search-no-recent").classList.add("d-none");
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- for (const id in items) {
- const item = items[id];
- const result = template.cloneNode(true);
- const a = result.querySelector("a");
- const time = result.querySelector("time");
- const content = result.querySelector(".content");
- a.innerHTML = item.title;
- a.href = item.permalink;
- time.innerText = item.date;
- content.innerHTML = item.summary;
- fragment.appendChild(result);
- }
- results.appendChild(fragment);
- }
- function doSearch() {
- const query2 = document.querySelector(".search-text").value.trim();
- const limit = 99;
- const results = index.search({
- query: query2,
- enrich: true,
- limit
- });
- const items = {};
- results.forEach(function(result) {
- result.result.forEach(function(r) {
- items[r.id] = r.doc;
- });
- });
- showResults(items);
- }
- function enableUI() {
- const searchform = document.querySelector(".search-form");
- searchform.addEventListener("submit", function(e) {
- e.preventDefault();
- doSearch();
- });
- searchform.addEventListener("input", function() {
- doSearch();
- });
- document.querySelector(".search-loading").classList.add("d-none");
- document.querySelector(".search-input").classList.remove("d-none");
- document.querySelector(".search-text").focus();
- }
- function buildIndex() {
- document.querySelector(".search-loading").classList.remove("d-none");
- fetch("/search-index.json").then(function(response) {
- return response.json();
- }).then(function(data) {
- data.forEach(function(item) {
- index.add(item);
- });
- });
- }
- buildIndex();
- enableUI();
- })();
-})();
-/*!
- * FlexSearch for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- * Based on https://github.com/frjo/hugo-theme-zen/blob/main/assets/js/search.js
- */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2ZsZXhzZWFyY2gvZGlzdC9mbGV4c2VhcmNoLmJ1bmRsZS5tb2R1bGUubWluLmpzIiwgIjxzdGRpbj4iXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKiFcclxuICogRmxleFNlYXJjaC5qcyB2MC43LjQxIChCdW5kbGUubW9kdWxlKVxyXG4gKiBBdXRob3IgYW5kIENvcHlyaWdodDogVGhvbWFzIFdpbGtlcmxpbmdcclxuICogTGljZW5jZTogQXBhY2hlLTIuMFxyXG4gKiBIb3N0ZWQgYnkgTmV4dGFwcHMgR21iSFxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmV4dGFwcHMtZGUvZmxleHNlYXJjaFxyXG4gKi9cbnZhciB0O2Z1bmN0aW9uIHUoYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6ITB9ZnVuY3Rpb24gdihhKXtjb25zdCBiPUFycmF5KGEpO2ZvcihsZXQgYz0wO2M8YTtjKyspYltjXT14KCk7cmV0dXJuIGJ9ZnVuY3Rpb24geCgpe3JldHVybiBPYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGFhKGEsYil7cmV0dXJuIGIubGVuZ3RoLWEubGVuZ3RofWZ1bmN0aW9uIEMoYSl7cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBhfWZ1bmN0aW9uIEQoYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhfWZ1bmN0aW9uIEUoYSl7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGF9O2Z1bmN0aW9uIEYoYSxiKXt2YXIgYz1iYTtpZihhJiYoYiYmKGE9RyhhLGIpKSx0aGlzLkgmJihhPUcoYSx0aGlzLkgpKSx0aGlzLkomJjE8YS5sZW5ndGgmJihhPUcoYSx0aGlzLkopKSxjfHxcIlwiPT09Yykpe2I9YS5zcGxpdChjKTtpZih0aGlzLmZpbHRlcil7YT10aGlzLmZpbHRlcjtjPWIubGVuZ3RoO2NvbnN0IGQ9W107Zm9yKGxldCBlPTAsZj0wO2U8YztlKyspe2NvbnN0IGg9YltlXTtoJiYhYVtoXSYmKGRbZisrXT1oKX1hPWR9ZWxzZSBhPWI7cmV0dXJuIGF9cmV0dXJuIGF9Y29uc3QgYmE9L1tcXHB7Wn1cXHB7U31cXHB7UH1cXHB7Q31dKy91LGNhPS9bXFx1MDMwMC1cXHUwMzZmXS9nO1xuZnVuY3Rpb24gSShhLGIpe2NvbnN0IGM9T2JqZWN0LmtleXMoYSksZD1jLmxlbmd0aCxlPVtdO2xldCBmPVwiXCIsaD0wO2ZvcihsZXQgZz0wLGssbTtnPGQ7ZysrKWs9Y1tnXSwobT1hW2tdKT8oZVtoKytdPUooYj9cIig/IVxcXFxiKVwiK2srXCIoXFxcXGJ8XylcIjprKSxlW2grK109bSk6Zis9KGY/XCJ8XCI6XCJcIikraztmJiYoZVtoKytdPUooYj9cIig/IVxcXFxiKShcIitmK1wiKShcXFxcYnxfKVwiOlwiKFwiK2YrXCIpXCIpLGVbaF09XCJcIik7cmV0dXJuIGV9ZnVuY3Rpb24gRyhhLGIpe2ZvcihsZXQgYz0wLGQ9Yi5sZW5ndGg7YzxkJiYoYT1hLnJlcGxhY2UoYltjXSxiW2MrMV0pLGEpO2MrPTIpO3JldHVybiBhfWZ1bmN0aW9uIEooYSl7cmV0dXJuIG5ldyBSZWdFeHAoYSxcImdcIil9ZnVuY3Rpb24gZGEoYSl7bGV0IGI9XCJcIixjPVwiXCI7Zm9yKGxldCBkPTAsZT1hLmxlbmd0aCxmO2Q8ZTtkKyspKGY9YVtkXSkhPT1jJiYoYis9Yz1mKTtyZXR1cm4gYn07dmFyIGZhPXtlbmNvZGU6ZWEsRjohMSxHOlwiXCJ9O2Z1bmN0aW9uIGVhKGEpe3JldHVybiBGLmNhbGwodGhpcywoXCJcIithKS50b0xvd2VyQ2FzZSgpLCExKX07Y29uc3QgaGE9e30sSz17fTtmdW5jdGlvbiBpYShhKXtMKGEsXCJhZGRcIik7TChhLFwiYXBwZW5kXCIpO0woYSxcInNlYXJjaFwiKTtMKGEsXCJ1cGRhdGVcIik7TChhLFwicmVtb3ZlXCIpfWZ1bmN0aW9uIEwoYSxiKXthW2IrXCJBc3luY1wiXT1mdW5jdGlvbigpe2NvbnN0IGM9dGhpcyxkPWFyZ3VtZW50czt2YXIgZT1kW2QubGVuZ3RoLTFdO2xldCBmO0UoZSkmJihmPWUsZGVsZXRlIGRbZC5sZW5ndGgtMV0pO2U9bmV3IFByb21pc2UoZnVuY3Rpb24oaCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MuYXN5bmM9ITA7Y29uc3QgZz1jW2JdLmFwcGx5KGMsZCk7Yy5hc3luYz0hMTtoKGcpfSl9KTtyZXR1cm4gZj8oZS50aGVuKGYpLHRoaXMpOmV9fTtmdW5jdGlvbiBqYShhLGIsYyxkKXtjb25zdCBlPWEubGVuZ3RoO2xldCBmPVtdLGgsZyxrPTA7ZCYmKGQ9W10pO2ZvcihsZXQgbT1lLTE7MDw9bTttLS0pe2NvbnN0IG49YVttXSx3PW4ubGVuZ3RoLHE9eCgpO2xldCByPSFoO2ZvcihsZXQgbD0wO2w8dztsKyspe2NvbnN0IHA9bltsXSxBPXAubGVuZ3RoO2lmKEEpZm9yKGxldCBCPTAseix5O0I8QTtCKyspaWYoeT1wW0JdLGgpe2lmKGhbeV0pe2lmKCFtKWlmKGMpYy0tO2Vsc2UgaWYoZltrKytdPXksaz09PWIpcmV0dXJuIGY7aWYobXx8ZClxW3ldPTE7cj0hMH1pZihkJiYoej0oZ1t5XXx8MCkrMSxnW3ldPXosejxlKSl7Y29uc3QgSD1kW3otMl18fChkW3otMl09W10pO0hbSC5sZW5ndGhdPXl9fWVsc2UgcVt5XT0xfWlmKGQpaHx8KGc9cSk7ZWxzZSBpZighcilyZXR1cm5bXTtoPXF9aWYoZClmb3IobGV0IG09ZC5sZW5ndGgtMSxuLHc7MDw9bTttLS0pe249ZFttXTt3PW4ubGVuZ3RoO2ZvcihsZXQgcT0wLHI7cTx3O3ErKylpZihyPVxubltxXSwhaFtyXSl7aWYoYyljLS07ZWxzZSBpZihmW2srK109cixrPT09YilyZXR1cm4gZjtoW3JdPTF9fXJldHVybiBmfWZ1bmN0aW9uIGthKGEsYil7Y29uc3QgYz14KCksZD14KCksZT1bXTtmb3IobGV0IGY9MDtmPGEubGVuZ3RoO2YrKyljW2FbZl1dPTE7Zm9yKGxldCBmPTAsaDtmPGIubGVuZ3RoO2YrKyl7aD1iW2ZdO2ZvcihsZXQgZz0wLGs7ZzxoLmxlbmd0aDtnKyspaz1oW2ddLGNba10mJiFkW2tdJiYoZFtrXT0xLGVbZS5sZW5ndGhdPWspfXJldHVybiBlfTtmdW5jdGlvbiBNKGEpe3RoaXMubD0hMCE9PWEmJmE7dGhpcy5jYWNoZT14KCk7dGhpcy5oPVtdfWZ1bmN0aW9uIGxhKGEsYixjKXtEKGEpJiYoYT1hLnF1ZXJ5KTtsZXQgZD10aGlzLmNhY2hlLmdldChhKTtkfHwoZD10aGlzLnNlYXJjaChhLGIsYyksdGhpcy5jYWNoZS5zZXQoYSxkKSk7cmV0dXJuIGR9TS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuY2FjaGVbYV0pe3ZhciBjPXRoaXMuaC5sZW5ndGg7Yz09PXRoaXMubD9kZWxldGUgdGhpcy5jYWNoZVt0aGlzLmhbYy0xXV06YysrO2ZvcigtLWM7MDxjO2MtLSl0aGlzLmhbY109dGhpcy5oW2MtMV07dGhpcy5oWzBdPWF9dGhpcy5jYWNoZVthXT1ifTtNLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7Y29uc3QgYj10aGlzLmNhY2hlW2FdO2lmKHRoaXMubCYmYiYmKGE9dGhpcy5oLmluZGV4T2YoYSkpKXtjb25zdCBjPXRoaXMuaFthLTFdO3RoaXMuaFthLTFdPXRoaXMuaFthXTt0aGlzLmhbYV09Y31yZXR1cm4gYn07Y29uc3QgbmE9e21lbW9yeTp7Y2hhcnNldDpcImxhdGluOmV4dHJhXCIsRDozLEI6NCxtOiExfSxwZXJmb3JtYW5jZTp7RDozLEI6MyxzOiExLGNvbnRleHQ6e2RlcHRoOjIsRDoxfX0sbWF0Y2g6e2NoYXJzZXQ6XCJsYXRpbjpleHRyYVwiLEc6XCJyZXZlcnNlXCJ9LHNjb3JlOntjaGFyc2V0OlwibGF0aW46YWR2YW5jZWRcIixEOjIwLEI6Myxjb250ZXh0OntkZXB0aDozLEQ6OX19LFwiZGVmYXVsdFwiOnt9fTtmdW5jdGlvbiBvYShhLGIsYyxkLGUsZixoLGcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjb25zdCBrPWEoYz9jK1wiLlwiK2Q6ZCxKU09OLnN0cmluZ2lmeShoKSk7ayYmay50aGVuP2sudGhlbihmdW5jdGlvbigpe2IuZXhwb3J0KGEsYixjLGUsZisxLGcpfSk6Yi5leHBvcnQoYSxiLGMsZSxmKzEsZyl9KX07ZnVuY3Rpb24gTihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE4pKXJldHVybiBuZXcgTihhKTt2YXIgYztpZihhKXtDKGEpP2E9bmFbYV06KGM9YS5wcmVzZXQpJiYoYT1PYmplY3QuYXNzaWduKHt9LGNbY10sYSkpO2M9YS5jaGFyc2V0O3ZhciBkPWEubGFuZztDKGMpJiYoLTE9PT1jLmluZGV4T2YoXCI6XCIpJiYoYys9XCI6ZGVmYXVsdFwiKSxjPUtbY10pO0MoZCkmJihkPWhhW2RdKX1lbHNlIGE9e307bGV0IGUsZixoPWEuY29udGV4dHx8e307dGhpcy5lbmNvZGU9YS5lbmNvZGV8fGMmJmMuZW5jb2RlfHxlYTt0aGlzLnJlZ2lzdGVyPWJ8fHgoKTt0aGlzLkQ9ZT1hLnJlc29sdXRpb258fDk7dGhpcy5HPWI9YyYmYy5HfHxhLnRva2VuaXplfHxcInN0cmljdFwiO3RoaXMuZGVwdGg9XCJzdHJpY3RcIj09PWImJmguZGVwdGg7dGhpcy5sPXUoaC5iaWRpcmVjdGlvbmFsKTt0aGlzLnM9Zj11KGEub3B0aW1pemUpO3RoaXMubT11KGEuZmFzdHVwZGF0ZSk7dGhpcy5CPWEubWlubGVuZ3RofHwxO3RoaXMuQz1cbmEuYm9vc3Q7dGhpcy5tYXA9Zj92KGUpOngoKTt0aGlzLkE9ZT1oLnJlc29sdXRpb258fDE7dGhpcy5oPWY/dihlKTp4KCk7dGhpcy5GPWMmJmMuRnx8YS5ydGw7dGhpcy5IPShiPWEubWF0Y2hlcnx8ZCYmZC5IKSYmSShiLCExKTt0aGlzLko9KGI9YS5zdGVtbWVyfHxkJiZkLkopJiZJKGIsITApO2lmKGM9Yj1hLmZpbHRlcnx8ZCYmZC5maWx0ZXIpe2M9YjtkPXgoKTtmb3IobGV0IGc9MCxrPWMubGVuZ3RoO2c8aztnKyspZFtjW2ddXT0xO2M9ZH10aGlzLmZpbHRlcj1jO3RoaXMuY2FjaGU9KGI9YS5jYWNoZSkmJm5ldyBNKGIpfXQ9Ti5wcm90b3R5cGU7dC5hcHBlbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hZGQoYSxiLCEwKX07XG50LmFkZD1mdW5jdGlvbihhLGIsYyxkKXtpZihiJiYoYXx8MD09PWEpKXtpZighZCYmIWMmJnRoaXMucmVnaXN0ZXJbYV0pcmV0dXJuIHRoaXMudXBkYXRlKGEsYik7Yj10aGlzLmVuY29kZShiKTtpZihkPWIubGVuZ3RoKXtjb25zdCBtPXgoKSxuPXgoKSx3PXRoaXMuZGVwdGgscT10aGlzLkQ7Zm9yKGxldCByPTA7cjxkO3IrKyl7bGV0IGw9Ylt0aGlzLkY/ZC0xLXI6cl07dmFyIGU9bC5sZW5ndGg7aWYobCYmZT49dGhpcy5CJiYod3x8IW5bbF0pKXt2YXIgZj1PKHEsZCxyKSxoPVwiXCI7c3dpdGNoKHRoaXMuRyl7Y2FzZSBcImZ1bGxcIjppZigyPGUpe2ZvcihmPTA7ZjxlO2YrKylmb3IodmFyIGc9ZTtnPmY7Zy0tKWlmKGctZj49dGhpcy5CKXt2YXIgaz1PKHEsZCxyLGUsZik7aD1sLnN1YnN0cmluZyhmLGcpO1AodGhpcyxuLGgsayxhLGMpfWJyZWFrfWNhc2UgXCJyZXZlcnNlXCI6aWYoMTxlKXtmb3IoZz1lLTE7MDxnO2ctLSloPWxbZ10raCxoLmxlbmd0aD49dGhpcy5CJiZQKHRoaXMsbixcbmgsTyhxLGQscixlLGcpLGEsYyk7aD1cIlwifWNhc2UgXCJmb3J3YXJkXCI6aWYoMTxlKXtmb3IoZz0wO2c8ZTtnKyspaCs9bFtnXSxoLmxlbmd0aD49dGhpcy5CJiZQKHRoaXMsbixoLGYsYSxjKTticmVha31kZWZhdWx0OmlmKHRoaXMuQyYmKGY9TWF0aC5taW4oZi90aGlzLkMoYixsLHIpfDAscS0xKSksUCh0aGlzLG4sbCxmLGEsYyksdyYmMTxkJiZyPGQtMSlmb3IoZT14KCksaD10aGlzLkEsZj1sLGc9TWF0aC5taW4odysxLGQtciksZVtmXT0xLGs9MTtrPGc7aysrKWlmKChsPWJbdGhpcy5GP2QtMS1yLWs6citrXSkmJmwubGVuZ3RoPj10aGlzLkImJiFlW2xdKXtlW2xdPTE7Y29uc3QgcD10aGlzLmwmJmw+ZjtQKHRoaXMsbSxwP2Y6bCxPKGgrKGQvMj5oPzA6MSksZCxyLGctMSxrLTEpLGEsYyxwP2w6Zil9fX19dGhpcy5tfHwodGhpcy5yZWdpc3RlclthXT0xKX19cmV0dXJuIHRoaXN9O1xuZnVuY3Rpb24gTyhhLGIsYyxkLGUpe3JldHVybiBjJiYxPGE/YisoZHx8MCk8PWE/YysoZXx8MCk6KGEtMSkvKGIrKGR8fDApKSooYysoZXx8MCkpKzF8MDowfWZ1bmN0aW9uIFAoYSxiLGMsZCxlLGYsaCl7bGV0IGc9aD9hLmg6YS5tYXA7aWYoIWJbY118fGgmJiFiW2NdW2hdKWEucyYmKGc9Z1tkXSksaD8oYj1iW2NdfHwoYltjXT14KCkpLGJbaF09MSxnPWdbaF18fChnW2hdPXgoKSkpOmJbY109MSxnPWdbY118fChnW2NdPVtdKSxhLnN8fChnPWdbZF18fChnW2RdPVtdKSksZiYmZy5pbmNsdWRlcyhlKXx8KGdbZy5sZW5ndGhdPWUsYS5tJiYoYT1hLnJlZ2lzdGVyW2VdfHwoYS5yZWdpc3RlcltlXT1bXSksYVthLmxlbmd0aF09ZykpfVxudC5zZWFyY2g9ZnVuY3Rpb24oYSxiLGMpe2N8fCghYiYmRChhKT8oYz1hLGE9Yy5xdWVyeSk6RChiKSYmKGM9YikpO2xldCBkPVtdLGU7bGV0IGYsaD0wO2lmKGMpe2E9Yy5xdWVyeXx8YTtiPWMubGltaXQ7aD1jLm9mZnNldHx8MDt2YXIgZz1jLmNvbnRleHQ7Zj1jLnN1Z2dlc3R9aWYoYSYmKGE9dGhpcy5lbmNvZGUoXCJcIithKSxlPWEubGVuZ3RoLDE8ZSkpe2M9eCgpO3ZhciBrPVtdO2ZvcihsZXQgbj0wLHc9MCxxO248ZTtuKyspaWYoKHE9YVtuXSkmJnEubGVuZ3RoPj10aGlzLkImJiFjW3FdKWlmKHRoaXMuc3x8Znx8dGhpcy5tYXBbcV0pa1t3KytdPXEsY1txXT0xO2Vsc2UgcmV0dXJuIGQ7YT1rO2U9YS5sZW5ndGh9aWYoIWUpcmV0dXJuIGQ7Ynx8KGI9MTAwKTtnPXRoaXMuZGVwdGgmJjE8ZSYmITEhPT1nO2M9MDtsZXQgbTtnPyhtPWFbMF0sYz0xKToxPGUmJmEuc29ydChhYSk7Zm9yKGxldCBuLHc7YzxlO2MrKyl7dz1hW2NdO2c/KG49cGEodGhpcyxkLGYsYixoLDI9PT1lLHcsXG5tKSxmJiYhMT09PW4mJmQubGVuZ3RofHwobT13KSk6bj1wYSh0aGlzLGQsZixiLGgsMT09PWUsdyk7aWYobilyZXR1cm4gbjtpZihmJiZjPT09ZS0xKXtrPWQubGVuZ3RoO2lmKCFrKXtpZihnKXtnPTA7Yz0tMTtjb250aW51ZX1yZXR1cm4gZH1pZigxPT09aylyZXR1cm4gcWEoZFswXSxiLGgpfX1yZXR1cm4gamEoZCxiLGgsZil9O1xuZnVuY3Rpb24gcGEoYSxiLGMsZCxlLGYsaCxnKXtsZXQgaz1bXSxtPWc/YS5oOmEubWFwO2Euc3x8KG09cmEobSxoLGcsYS5sKSk7aWYobSl7bGV0IG49MDtjb25zdCB3PU1hdGgubWluKG0ubGVuZ3RoLGc/YS5BOmEuRCk7Zm9yKGxldCBxPTAscj0wLGwscDtxPHc7cSsrKWlmKGw9bVtxXSlpZihhLnMmJihsPXJhKGwsaCxnLGEubCkpLGUmJmwmJmYmJihwPWwubGVuZ3RoLHA8PWU/KGUtPXAsbD1udWxsKToobD1sLnNsaWNlKGUpLGU9MCkpLGwmJihrW24rK109bCxmJiYocis9bC5sZW5ndGgscj49ZCkpKWJyZWFrO2lmKG4pe2lmKGYpcmV0dXJuIHFhKGssZCwwKTtiW2IubGVuZ3RoXT1rO3JldHVybn19cmV0dXJuIWMmJmt9ZnVuY3Rpb24gcWEoYSxiLGMpe2E9MT09PWEubGVuZ3RoP2FbMF06W10uY29uY2F0LmFwcGx5KFtdLGEpO3JldHVybiBjfHxhLmxlbmd0aD5iP2Euc2xpY2UoYyxjK2IpOmF9XG5mdW5jdGlvbiByYShhLGIsYyxkKXtjPyhkPWQmJmI+YyxhPShhPWFbZD9iOmNdKSYmYVtkP2M6Yl0pOmE9YVtiXTtyZXR1cm4gYX10LmNvbnRhaW49ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnJlZ2lzdGVyW2FdfTt0LnVwZGF0ZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnJlbW92ZShhKS5hZGQoYSxiKX07XG50LnJlbW92ZT1mdW5jdGlvbihhLGIpe2NvbnN0IGM9dGhpcy5yZWdpc3RlclthXTtpZihjKXtpZih0aGlzLm0pZm9yKGxldCBkPTAsZTtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZS5zcGxpY2UoZS5pbmRleE9mKGEpLDEpO2Vsc2UgUSh0aGlzLm1hcCxhLHRoaXMuRCx0aGlzLnMpLHRoaXMuZGVwdGgmJlEodGhpcy5oLGEsdGhpcy5BLHRoaXMucyk7Ynx8ZGVsZXRlIHRoaXMucmVnaXN0ZXJbYV07aWYodGhpcy5jYWNoZSl7Yj10aGlzLmNhY2hlO2ZvcihsZXQgZD0wLGUsZjtkPGIuaC5sZW5ndGg7ZCsrKWY9Yi5oW2RdLGU9Yi5jYWNoZVtmXSxlLmluY2x1ZGVzKGEpJiYoYi5oLnNwbGljZShkLS0sMSksZGVsZXRlIGIuY2FjaGVbZl0pfX1yZXR1cm4gdGhpc307XG5mdW5jdGlvbiBRKGEsYixjLGQsZSl7bGV0IGY9MDtpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpaWYoZSliPWEuaW5kZXhPZihiKSwtMSE9PWI/MTxhLmxlbmd0aCYmKGEuc3BsaWNlKGIsMSksZisrKTpmKys7ZWxzZXtlPU1hdGgubWluKGEubGVuZ3RoLGMpO2ZvcihsZXQgaD0wLGc7aDxlO2grKylpZihnPWFbaF0pZj1RKGcsYixjLGQsZSksZHx8Znx8ZGVsZXRlIGFbaF19ZWxzZSBmb3IobGV0IGggaW4gYSkoZj1RKGFbaF0sYixjLGQsZSkpfHxkZWxldGUgYVtoXTtyZXR1cm4gZn10LnNlYXJjaENhY2hlPWxhO1xudC5leHBvcnQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2xldCBoPSEwO1widW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmKGg9bmV3IFByb21pc2UobT0+e2Y9bX0pKTtsZXQgZyxrO3N3aXRjaChlfHwoZT0wKSl7Y2FzZSAwOmc9XCJyZWdcIjtpZih0aGlzLm0pe2s9eCgpO2ZvcihsZXQgbSBpbiB0aGlzLnJlZ2lzdGVyKWtbbV09MX1lbHNlIGs9dGhpcy5yZWdpc3RlcjticmVhaztjYXNlIDE6Zz1cImNmZ1wiO2s9e2RvYzowLG9wdDp0aGlzLnM/MTowfTticmVhaztjYXNlIDI6Zz1cIm1hcFwiO2s9dGhpcy5tYXA7YnJlYWs7Y2FzZSAzOmc9XCJjdHhcIjtrPXRoaXMuaDticmVhaztkZWZhdWx0OlwidW5kZWZpbmVkXCI9PT10eXBlb2YgYyYmZiYmZigpO3JldHVybn1vYShhLGJ8fHRoaXMsYyxnLGQsZSxrLGYpO3JldHVybiBofTtcbnQuaW1wb3J0PWZ1bmN0aW9uKGEsYil7aWYoYilzd2l0Y2goQyhiKSYmKGI9SlNPTi5wYXJzZShiKSksYSl7Y2FzZSBcImNmZ1wiOnRoaXMucz0hIWIub3B0O2JyZWFrO2Nhc2UgXCJyZWdcIjp0aGlzLm09ITE7dGhpcy5yZWdpc3Rlcj1iO2JyZWFrO2Nhc2UgXCJtYXBcIjp0aGlzLm1hcD1iO2JyZWFrO2Nhc2UgXCJjdHhcIjp0aGlzLmg9Yn19O2lhKE4ucHJvdG90eXBlKTtmdW5jdGlvbiBzYShhKXthPWEuZGF0YTt2YXIgYj1zZWxmLl9pbmRleDtjb25zdCBjPWEuYXJnczt2YXIgZD1hLnRhc2s7c3dpdGNoKGQpe2Nhc2UgXCJpbml0XCI6ZD1hLm9wdGlvbnN8fHt9O2E9YS5mYWN0b3J5O2I9ZC5lbmNvZGU7ZC5jYWNoZT0hMTtiJiYwPT09Yi5pbmRleE9mKFwiZnVuY3Rpb25cIikmJihkLmVuY29kZT1GdW5jdGlvbihcInJldHVybiBcIitiKSgpKTthPyhGdW5jdGlvbihcInJldHVybiBcIithKSgpKHNlbGYpLHNlbGYuX2luZGV4PW5ldyBzZWxmLkZsZXhTZWFyY2guSW5kZXgoZCksZGVsZXRlIHNlbGYuRmxleFNlYXJjaCk6c2VsZi5faW5kZXg9bmV3IE4oZCk7YnJlYWs7ZGVmYXVsdDphPWEuaWQsYj1iW2RdLmFwcGx5KGIsYykscG9zdE1lc3NhZ2UoXCJzZWFyY2hcIj09PWQ/e2lkOmEsbXNnOmJ9OntpZDphfSl9fTtsZXQgdGE9MDtmdW5jdGlvbiBTKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMpKXJldHVybiBuZXcgUyhhKTt2YXIgYjthP0UoYj1hLmVuY29kZSkmJihhLmVuY29kZT1iLnRvU3RyaW5nKCkpOmE9e307KGI9KHNlbGZ8fHdpbmRvdykuX2ZhY3RvcnkpJiYoYj1iLnRvU3RyaW5nKCkpO2NvbnN0IGM9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cmJnNlbGYuZXhwb3J0cyxkPXRoaXM7dGhpcy5vPXVhKGIsYyxhLndvcmtlcik7dGhpcy5oPXgoKTtpZih0aGlzLm8pe2lmKGMpdGhpcy5vLm9uKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGUpe2QuaFtlLmlkXShlLm1zZyk7ZGVsZXRlIGQuaFtlLmlkXX0pO2Vsc2UgdGhpcy5vLm9ubWVzc2FnZT1mdW5jdGlvbihlKXtlPWUuZGF0YTtkLmhbZS5pZF0oZS5tc2cpO2RlbGV0ZSBkLmhbZS5pZF19O3RoaXMuby5wb3N0TWVzc2FnZSh7dGFzazpcImluaXRcIixmYWN0b3J5OmIsb3B0aW9uczphfSl9fVQoXCJhZGRcIik7VChcImFwcGVuZFwiKTtUKFwic2VhcmNoXCIpO1xuVChcInVwZGF0ZVwiKTtUKFwicmVtb3ZlXCIpO2Z1bmN0aW9uIFQoYSl7Uy5wcm90b3R5cGVbYV09Uy5wcm90b3R5cGVbYStcIkFzeW5jXCJdPWZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLGM9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO3ZhciBkPWNbYy5sZW5ndGgtMV07bGV0IGU7RShkKSYmKGU9ZCxjLnNwbGljZShjLmxlbmd0aC0xLDEpKTtkPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGYpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLmhbKyt0YV09ZjtiLm8ucG9zdE1lc3NhZ2Uoe3Rhc2s6YSxpZDp0YSxhcmdzOmN9KX0pfSk7cmV0dXJuIGU/KGQudGhlbihlKSx0aGlzKTpkfX1cbmZ1bmN0aW9uIHVhKGEsYixjKXtsZXQgZDt0cnl7ZD1iP25ldyAocmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpW1wiV29ya2VyXCJdKShfX2Rpcm5hbWUgKyBcIi9ub2RlL25vZGUuanNcIik6YT9uZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1wib25tZXNzYWdlPVwiK3NhLnRvU3RyaW5nKCldLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpOm5ldyBXb3JrZXIoQyhjKT9jOlwid29ya2VyL3dvcmtlci5qc1wiLHt0eXBlOlwibW9kdWxlXCJ9KX1jYXRjaChlKXt9cmV0dXJuIGR9O2Z1bmN0aW9uIFUoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVSkpcmV0dXJuIG5ldyBVKGEpO3ZhciBiPWEuZG9jdW1lbnR8fGEuZG9jfHxhLGM7dGhpcy5LPVtdO3RoaXMuaD1bXTt0aGlzLkE9W107dGhpcy5yZWdpc3Rlcj14KCk7dGhpcy5rZXk9KGM9Yi5rZXl8fGIuaWQpJiZWKGMsdGhpcy5BKXx8XCJpZFwiO3RoaXMubT11KGEuZmFzdHVwZGF0ZSk7dGhpcy5DPShjPWIuc3RvcmUpJiYhMCE9PWMmJltdO3RoaXMuc3RvcmU9YyYmeCgpO3RoaXMuST0oYz1iLnRhZykmJlYoYyx0aGlzLkEpO3RoaXMubD1jJiZ4KCk7dGhpcy5jYWNoZT0oYz1hLmNhY2hlKSYmbmV3IE0oYyk7YS5jYWNoZT0hMTt0aGlzLm89YS53b3JrZXI7dGhpcy5hc3luYz0hMTtjPXgoKTtsZXQgZD1iLmluZGV4fHxiLmZpZWxkfHxiO0MoZCkmJihkPVtkXSk7Zm9yKGxldCBlPTAsZixoO2U8ZC5sZW5ndGg7ZSsrKWY9ZFtlXSxDKGYpfHwoaD1mLGY9Zi5maWVsZCksaD1EKGgpP09iamVjdC5hc3NpZ24oe30sYSxoKTphLFxudGhpcy5vJiYoY1tmXT1uZXcgUyhoKSxjW2ZdLm98fCh0aGlzLm89ITEpKSx0aGlzLm98fChjW2ZdPW5ldyBOKGgsdGhpcy5yZWdpc3RlcikpLHRoaXMuS1tlXT1WKGYsdGhpcy5BKSx0aGlzLmhbZV09ZjtpZih0aGlzLkMpZm9yKGE9Yi5zdG9yZSxDKGEpJiYoYT1bYV0pLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLkNbYl09VihhW2JdLHRoaXMuQSk7dGhpcy5pbmRleD1jfWZ1bmN0aW9uIFYoYSxiKXtjb25zdCBjPWEuc3BsaXQoXCI6XCIpO2xldCBkPTA7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKyspYT1jW2VdLDA8PWEuaW5kZXhPZihcIltdXCIpJiYoYT1hLnN1YnN0cmluZygwLGEubGVuZ3RoLTIpKSYmKGJbZF09ITApLGEmJihjW2QrK109YSk7ZDxjLmxlbmd0aCYmKGMubGVuZ3RoPWQpO3JldHVybiAxPGQ/YzpjWzBdfWZ1bmN0aW9uIFgoYSxiKXtpZihDKGIpKWE9YVtiXTtlbHNlIGZvcihsZXQgYz0wO2EmJmM8Yi5sZW5ndGg7YysrKWE9YVtiW2NdXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIFkoYSxiLGMsZCxlKXthPWFbZV07aWYoZD09PWMubGVuZ3RoLTEpYltlXT1hO2Vsc2UgaWYoYSlpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKGI9YltlXT1BcnJheShhLmxlbmd0aCksZT0wO2U8YS5sZW5ndGg7ZSsrKVkoYSxiLGMsZCxlKTtlbHNlIGI9YltlXXx8KGJbZV09eCgpKSxlPWNbKytkXSxZKGEsYixjLGQsZSl9ZnVuY3Rpb24gWihhLGIsYyxkLGUsZixoLGcpe2lmKGE9YVtoXSlpZihkPT09Yi5sZW5ndGgtMSl7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtpZihjW2RdKXtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWUuYWRkKGYsYVtiXSwhMCwhMCk7cmV0dXJufWE9YS5qb2luKFwiIFwiKX1lLmFkZChmLGEsZywhMCl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKGg9MDtoPGEubGVuZ3RoO2grKylaKGEsYixjLGQsZSxmLGgsZyk7ZWxzZSBoPWJbKytkXSxaKGEsYixjLGQsZSxmLGgsZyl9dD1VLnByb3RvdHlwZTtcbnQuYWRkPWZ1bmN0aW9uKGEsYixjKXtEKGEpJiYoYj1hLGE9WChiLHRoaXMua2V5KSk7aWYoYiYmKGF8fDA9PT1hKSl7aWYoIWMmJnRoaXMucmVnaXN0ZXJbYV0pcmV0dXJuIHRoaXMudXBkYXRlKGEsYik7Zm9yKGxldCBkPTAsZSxmO2Q8dGhpcy5oLmxlbmd0aDtkKyspZj10aGlzLmhbZF0sZT10aGlzLktbZF0sQyhlKSYmKGU9W2VdKSxaKGIsZSx0aGlzLkEsMCx0aGlzLmluZGV4W2ZdLGEsZVswXSxjKTtpZih0aGlzLkkpe2xldCBkPVgoYix0aGlzLkkpLGU9eCgpO0MoZCkmJihkPVtkXSk7Zm9yKGxldCBmPTAsaCxnO2Y8ZC5sZW5ndGg7ZisrKWlmKGg9ZFtmXSwhZVtoXSYmKGVbaF09MSxnPXRoaXMubFtoXXx8KHRoaXMubFtoXT1bXSksIWN8fCFnLmluY2x1ZGVzKGEpKSlpZihnW2cubGVuZ3RoXT1hLHRoaXMubSl7Y29uc3Qgaz10aGlzLnJlZ2lzdGVyW2FdfHwodGhpcy5yZWdpc3RlclthXT1bXSk7a1trLmxlbmd0aF09Z319aWYodGhpcy5zdG9yZSYmKCFjfHwhdGhpcy5zdG9yZVthXSkpe2xldCBkO1xuaWYodGhpcy5DKXtkPXgoKTtmb3IobGV0IGU9MCxmO2U8dGhpcy5DLmxlbmd0aDtlKyspZj10aGlzLkNbZV0sQyhmKT9kW2ZdPWJbZl06WShiLGQsZiwwLGZbMF0pfXRoaXMuc3RvcmVbYV09ZHx8Yn19cmV0dXJuIHRoaXN9O3QuYXBwZW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYWRkKGEsYiwhMCl9O3QudXBkYXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucmVtb3ZlKGEpLmFkZChhLGIpfTtcbnQucmVtb3ZlPWZ1bmN0aW9uKGEpe0QoYSkmJihhPVgoYSx0aGlzLmtleSkpO2lmKHRoaXMucmVnaXN0ZXJbYV0pe2Zvcih2YXIgYj0wO2I8dGhpcy5oLmxlbmd0aCYmKHRoaXMuaW5kZXhbdGhpcy5oW2JdXS5yZW1vdmUoYSwhdGhpcy5vKSwhdGhpcy5tKTtiKyspO2lmKHRoaXMuSSYmIXRoaXMubSlmb3IobGV0IGMgaW4gdGhpcy5sKXtiPXRoaXMubFtjXTtjb25zdCBkPWIuaW5kZXhPZihhKTstMSE9PWQmJigxPGIubGVuZ3RoP2Iuc3BsaWNlKGQsMSk6ZGVsZXRlIHRoaXMubFtjXSl9dGhpcy5zdG9yZSYmZGVsZXRlIHRoaXMuc3RvcmVbYV07ZGVsZXRlIHRoaXMucmVnaXN0ZXJbYV19cmV0dXJuIHRoaXN9O1xudC5zZWFyY2g9ZnVuY3Rpb24oYSxiLGMsZCl7Y3x8KCFiJiZEKGEpPyhjPWEsYT1cIlwiKTpEKGIpJiYoYz1iLGI9MCkpO2xldCBlPVtdLGY9W10saCxnLGssbSxuLHcscT0wO2lmKGMpaWYoYy5jb25zdHJ1Y3Rvcj09PUFycmF5KWs9YyxjPW51bGw7ZWxzZXthPWMucXVlcnl8fGE7az0oaD1jLnBsdWNrKXx8Yy5pbmRleHx8Yy5maWVsZDttPWMudGFnO2c9dGhpcy5zdG9yZSYmYy5lbnJpY2g7bj1cImFuZFwiPT09Yy5ib29sO2I9Yy5saW1pdHx8Ynx8MTAwO3c9Yy5vZmZzZXR8fDA7aWYobSYmKEMobSkmJihtPVttXSksIWEpKXtmb3IobGV0IGw9MCxwO2w8bS5sZW5ndGg7bCsrKWlmKHA9dmEuY2FsbCh0aGlzLG1bbF0sYix3LGcpKWVbZS5sZW5ndGhdPXAscSsrO3JldHVybiBxP2U6W119QyhrKSYmKGs9W2tdKX1rfHwoaz10aGlzLmgpO249biYmKDE8ay5sZW5ndGh8fG0mJjE8bS5sZW5ndGgpO2NvbnN0IHI9IWQmJih0aGlzLm98fHRoaXMuYXN5bmMpJiZbXTtmb3IobGV0IGw9MCxwLEEsQjtsPFxuay5sZW5ndGg7bCsrKXtsZXQgejtBPWtbbF07QyhBKXx8KHo9QSxBPXouZmllbGQsYT16LnF1ZXJ5fHxhLGI9ei5saW1pdHx8YixnPXouZW5yaWNofHxnKTtpZihyKXJbbF09dGhpcy5pbmRleFtBXS5zZWFyY2hBc3luYyhhLGIsenx8Yyk7ZWxzZXtkP3A9ZFtsXTpwPXRoaXMuaW5kZXhbQV0uc2VhcmNoKGEsYix6fHxjKTtCPXAmJnAubGVuZ3RoO2lmKG0mJkIpe2NvbnN0IHk9W107bGV0IEg9MDtuJiYoeVswXT1bcF0pO2ZvcihsZXQgVz0wLG1hLFI7VzxtLmxlbmd0aDtXKyspaWYobWE9bVtXXSxCPShSPXRoaXMubFttYV0pJiZSLmxlbmd0aClIKysseVt5Lmxlbmd0aF09bj9bUl06UjtIJiYocD1uP2phKHksYnx8MTAwLHd8fDApOmthKHAseSksQj1wLmxlbmd0aCl9aWYoQilmW3FdPUEsZVtxKytdPXA7ZWxzZSBpZihuKXJldHVybltdfX1pZihyKXtjb25zdCBsPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHApe1Byb21pc2UuYWxsKHIpLnRoZW4oZnVuY3Rpb24oQSl7cChsLnNlYXJjaChhLFxuYixjLEEpKX0pfSl9aWYoIXEpcmV0dXJuW107aWYoaCYmKCFnfHwhdGhpcy5zdG9yZSkpcmV0dXJuIGVbMF07Zm9yKGxldCBsPTAscDtsPGYubGVuZ3RoO2wrKyl7cD1lW2xdO3AubGVuZ3RoJiZnJiYocD13YS5jYWxsKHRoaXMscCkpO2lmKGgpcmV0dXJuIHA7ZVtsXT17ZmllbGQ6ZltsXSxyZXN1bHQ6cH19cmV0dXJuIGV9O2Z1bmN0aW9uIHZhKGEsYixjLGQpe2xldCBlPXRoaXMubFthXSxmPWUmJmUubGVuZ3RoLWM7aWYoZiYmMDxmKXtpZihmPmJ8fGMpZT1lLnNsaWNlKGMsYytiKTtkJiYoZT13YS5jYWxsKHRoaXMsZSkpO3JldHVybnt0YWc6YSxyZXN1bHQ6ZX19fWZ1bmN0aW9uIHdhKGEpe2NvbnN0IGI9QXJyYXkoYS5sZW5ndGgpO2ZvcihsZXQgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGJbY109e2lkOmQsZG9jOnRoaXMuc3RvcmVbZF19O3JldHVybiBifXQuY29udGFpbj1mdW5jdGlvbihhKXtyZXR1cm4hIXRoaXMucmVnaXN0ZXJbYV19O3QuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0b3JlW2FdfTtcbnQuc2V0PWZ1bmN0aW9uKGEsYil7dGhpcy5zdG9yZVthXT1iO3JldHVybiB0aGlzfTt0LnNlYXJjaENhY2hlPWxhO3QuZXhwb3J0PWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtsZXQgaDtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGYmJihoPW5ldyBQcm9taXNlKGc9PntmPWd9KSk7ZXx8KGU9MCk7ZHx8KGQ9MCk7aWYoZDx0aGlzLmgubGVuZ3RoKXtjb25zdCBnPXRoaXMuaFtkXSxrPXRoaXMuaW5kZXhbZ107Yj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLmV4cG9ydChhLGIsZT9nOlwiXCIsZCxlKyssZil8fChkKyssZT0xLGIuZXhwb3J0KGEsYixnLGQsZSxmKSl9KX1lbHNle2xldCBnLGs7c3dpdGNoKGUpe2Nhc2UgMTpnPVwidGFnXCI7az10aGlzLmw7Yz1udWxsO2JyZWFrO2Nhc2UgMjpnPVwic3RvcmVcIjtrPXRoaXMuc3RvcmU7Yz1udWxsO2JyZWFrO2RlZmF1bHQ6ZigpO3JldHVybn1vYShhLHRoaXMsYyxnLGQsZSxrLGYpfXJldHVybiBofTtcbnQuaW1wb3J0PWZ1bmN0aW9uKGEsYil7aWYoYilzd2l0Y2goQyhiKSYmKGI9SlNPTi5wYXJzZShiKSksYSl7Y2FzZSBcInRhZ1wiOnRoaXMubD1iO2JyZWFrO2Nhc2UgXCJyZWdcIjp0aGlzLm09ITE7dGhpcy5yZWdpc3Rlcj1iO2ZvcihsZXQgZD0wLGU7ZDx0aGlzLmgubGVuZ3RoO2QrKyllPXRoaXMuaW5kZXhbdGhpcy5oW2RdXSxlLnJlZ2lzdGVyPWIsZS5tPSExO2JyZWFrO2Nhc2UgXCJzdG9yZVwiOnRoaXMuc3RvcmU9YjticmVhaztkZWZhdWx0OmE9YS5zcGxpdChcIi5cIik7Y29uc3QgYz1hWzBdO2E9YVsxXTtjJiZhJiZ0aGlzLmluZGV4W2NdLmltcG9ydChhLGIpfX07aWEoVS5wcm90b3R5cGUpO3ZhciB5YT17ZW5jb2RlOnhhLEY6ITEsRzpcIlwifTtjb25zdCB6YT1bSihcIltcXHUwMGUwXFx1MDBlMVxcdTAwZTJcXHUwMGUzXFx1MDBlNFxcdTAwZTVdXCIpLFwiYVwiLEooXCJbXFx1MDBlOFxcdTAwZTlcXHUwMGVhXFx1MDBlYl1cIiksXCJlXCIsSihcIltcXHUwMGVjXFx1MDBlZFxcdTAwZWVcXHUwMGVmXVwiKSxcImlcIixKKFwiW1xcdTAwZjJcXHUwMGYzXFx1MDBmNFxcdTAwZjVcXHUwMGY2XFx1MDE1MV1cIiksXCJvXCIsSihcIltcXHUwMGY5XFx1MDBmYVxcdTAwZmJcXHUwMGZjXFx1MDE3MV1cIiksXCJ1XCIsSihcIltcXHUwMGZkXFx1MDE3N1xcdTAwZmZdXCIpLFwieVwiLEooXCJcXHUwMGYxXCIpLFwiblwiLEooXCJbXFx1MDBlN2NdXCIpLFwia1wiLEooXCJcXHUwMGRmXCIpLFwic1wiLEooXCIgJiBcIiksXCIgYW5kIFwiXTtmdW5jdGlvbiB4YShhKXt2YXIgYj1hPVwiXCIrYTtiLm5vcm1hbGl6ZSYmKGI9Yi5ub3JtYWxpemUoXCJORkRcIikucmVwbGFjZShjYSxcIlwiKSk7cmV0dXJuIEYuY2FsbCh0aGlzLGIudG9Mb3dlckNhc2UoKSwhYS5ub3JtYWxpemUmJnphKX07dmFyIEJhPXtlbmNvZGU6QWEsRjohMSxHOlwic3RyaWN0XCJ9O2NvbnN0IENhPS9bXmEtejAtOV0rLyxEYT17YjpcInBcIix2OlwiZlwiLHc6XCJmXCIsejpcInNcIix4Olwic1wiLFwiXFx1MDBkZlwiOlwic1wiLGQ6XCJ0XCIsbjpcIm1cIixjOlwia1wiLGc6XCJrXCIsajpcImtcIixxOlwia1wiLGk6XCJlXCIseTpcImVcIix1Olwib1wifTtmdW5jdGlvbiBBYShhKXthPXhhLmNhbGwodGhpcyxhKS5qb2luKFwiIFwiKTtjb25zdCBiPVtdO2lmKGEpe2NvbnN0IGM9YS5zcGxpdChDYSksZD1jLmxlbmd0aDtmb3IobGV0IGU9MCxmLGg9MDtlPGQ7ZSsrKWlmKChhPWNbZV0pJiYoIXRoaXMuZmlsdGVyfHwhdGhpcy5maWx0ZXJbYV0pKXtmPWFbMF07bGV0IGc9RGFbZl18fGYsaz1nO2ZvcihsZXQgbT0xO208YS5sZW5ndGg7bSsrKXtmPWFbbV07Y29uc3Qgbj1EYVtmXXx8ZjtuJiZuIT09ayYmKGcrPW4saz1uKX1iW2grK109Z319cmV0dXJuIGJ9O3ZhciBGYT17ZW5jb2RlOkVhLEY6ITEsRzpcIlwifTtjb25zdCBHYT1bSihcImFlXCIpLFwiYVwiLEooXCJvZVwiKSxcIm9cIixKKFwic2hcIiksXCJzXCIsSihcInRoXCIpLFwidFwiLEooXCJwaFwiKSxcImZcIixKKFwicGZcIiksXCJmXCIsSihcIig/IVthZW9dKWgoPyFbYWVvXSlcIiksXCJcIixKKFwiKD8hXlthZW9dKWgoPyFeW2Flb10pXCIpLFwiXCJdO2Z1bmN0aW9uIEVhKGEsYil7YSYmKGE9QWEuY2FsbCh0aGlzLGEpLmpvaW4oXCIgXCIpLDI8YS5sZW5ndGgmJihhPUcoYSxHYSkpLGJ8fCgxPGEubGVuZ3RoJiYoYT1kYShhKSksYSYmKGE9YS5zcGxpdChcIiBcIikpKSk7cmV0dXJuIGF8fFtdfTt2YXIgSWE9e2VuY29kZTpIYSxGOiExLEc6XCJcIn07Y29uc3QgSmE9SihcIig/IVxcXFxiKVthZW9dXCIpO2Z1bmN0aW9uIEhhKGEpe2EmJihhPUVhLmNhbGwodGhpcyxhLCEwKSwxPGEubGVuZ3RoJiYoYT1hLnJlcGxhY2UoSmEsXCJcIikpLDE8YS5sZW5ndGgmJihhPWRhKGEpKSxhJiYoYT1hLnNwbGl0KFwiIFwiKSkpO3JldHVybiBhfHxbXX07S1tcImxhdGluOmRlZmF1bHRcIl09ZmE7S1tcImxhdGluOnNpbXBsZVwiXT15YTtLW1wibGF0aW46YmFsYW5jZVwiXT1CYTtLW1wibGF0aW46YWR2YW5jZWRcIl09RmE7S1tcImxhdGluOmV4dHJhXCJdPUlhO2V4cG9ydCBkZWZhdWx0IHtJbmRleDpOLERvY3VtZW50OlUsV29ya2VyOlMscmVnaXN0ZXJDaGFyc2V0OmZ1bmN0aW9uKGEsYil7S1thXT1ifSxyZWdpc3Rlckxhbmd1YWdlOmZ1bmN0aW9uKGEsYil7aGFbYV09Yn19O1xuIiwgIi8qIVxyXG4gKiBGbGV4U2VhcmNoIGZvciBCb290c3RyYXAgYmFzZWQgVGh1bGl0ZSBzaXRlc1xyXG4gKiBDb3B5cmlnaHQgMjAyMS0yMDI0IFRodWxpdGVcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXHJcbiAqIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmpvL2h1Z28tdGhlbWUtemVuL2Jsb2IvbWFpbi9hc3NldHMvanMvc2VhcmNoLmpzXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYsIGd1YXJkLWZvci1pbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBmaWxlXHJcbiAqIEEgSmF2YVNjcmlwdCBmaWxlIGZvciBmbGV4c2VhcmNoLlxyXG4gKi9cclxuXHJcbi8vIGltcG9ydCAqIGFzIEZsZXhTZWFyY2ggZnJvbSAnZmxleHNlYXJjaCc7XHJcbmltcG9ydCBJbmRleCBmcm9tICdmbGV4c2VhcmNoJztcclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gY29uc3QgaW5kZXggPSBuZXcgRmxleFNlYXJjaC5Eb2N1bWVudCh7XHJcbiAgY29uc3QgaW5kZXggPSBuZXcgSW5kZXguRG9jdW1lbnQoe1xyXG4gICAgdG9rZW5pemU6ICdmb3J3YXJkJyxcclxuICAgIGRvY3VtZW50OiB7XHJcbiAgICAgIGlkOiAnaWQnLFxyXG4gICAgICBpbmRleDogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiAndGl0bGUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJ3RhZ3MnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJ2NvbnRlbnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogICdkYXRlJyxcclxuICAgICAgICAgIHRva2VuaXplOiAnc3RyaWN0JyxcclxuICAgICAgICAgIGVuY29kZTogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICAgIHN0b3JlOiBbJ3RpdGxlJywnc3VtbWFyeScsJ2RhdGUnLCdwZXJtYWxpbmsnXVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiBzaG93UmVzdWx0cyhpdGVtcykge1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQ7XHJcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1yZXN1bHRzJyk7XHJcbiAgICByZXN1bHRzLnRleHRDb250ZW50ID0gJyc7XHJcblxyXG4gICAgY29uc3QgaXRlbXNMZW5ndGggPSBPYmplY3Qua2V5cyhpdGVtcykubGVuZ3RoO1xyXG5cclxuICAgIC8vIFNob3cvaGlkZSBcIk5vIHJlY2VudCBzZWFyY2hlc1wiIGFuZCBcIk5vIHNlYXJjaCByZXN1bHRzXCIgbWVzc2FnZXNcclxuICAgIGlmICgoaXRlbXNMZW5ndGggPT09IDApICYmIChxdWVyeS52YWx1ZSA9PT0gJycpKSB7XHJcbiAgICAgIC8vIEhpZGUgXCJObyBzZWFyY2ggcmVzdWx0c1wiIG1lc3NhZ2VcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZXN1bHRzJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XHJcbiAgICAgIC8vIFNob3cgXCJObyByZWNlbnQgc2VhcmNoZXNcIiBtZXNzYWdlXHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVjZW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcbiAgICB9IGVsc2UgaWYgKChpdGVtc0xlbmd0aCA9PT0gMCkgJiYgKHF1ZXJ5LnZhbHVlICE9PSAnJykpIHtcclxuICAgICAgLy8gSGlkZSBcIk5vIHJlY2VudCBzZWFyY2hlc1wiIG1lc3NhZ2VcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZWNlbnQnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgICAgLy8gU2hvdyBcIk5vIHNlYXJjaCByZXN1bHRzXCIgbWVzc2FnZVxyXG4gICAgICBjb25zdCBxdWVyeU5vUmVzdWx0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdWVyeS1uby1yZXN1bHRzJyk7XHJcbiAgICAgIHF1ZXJ5Tm9SZXN1bHRzLmlubmVyVGV4dCA9IHF1ZXJ5LnZhbHVlO1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLW5vLXJlc3VsdHMnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEhpZGUgYm90aCBcIk5vIHJlY2VudCBzZWFyY2hlc1wiIGFuZCBcIk5vIHNlYXJjaCByZXN1bHRzXCIgbWVzc2FnZXNcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZWNlbnQnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZXN1bHRzJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBpZCBpbiBpdGVtcykge1xyXG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbaWRdO1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IGEgPSByZXN1bHQucXVlcnlTZWxlY3RvcignYScpO1xyXG4gICAgICBjb25zdCB0aW1lID0gcmVzdWx0LnF1ZXJ5U2VsZWN0b3IoJ3RpbWUnKTtcclxuICAgICAgY29uc3QgY29udGVudCA9IHJlc3VsdC5xdWVyeVNlbGVjdG9yKCcuY29udGVudCcpO1xyXG4gICAgICBhLmlubmVySFRNTCA9IGl0ZW0udGl0bGU7XHJcbiAgICAgIGEuaHJlZiA9IGl0ZW0ucGVybWFsaW5rO1xyXG4gICAgICB0aW1lLmlubmVyVGV4dCA9IGl0ZW0uZGF0ZTtcclxuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBpdGVtLnN1bW1hcnk7XHJcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0cy5hcHBlbmRDaGlsZChmcmFnbWVudCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC10ZXh0JykudmFsdWUudHJpbSgpO1xyXG4gICAgY29uc3QgbGltaXQgPSA5OTtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBpbmRleC5zZWFyY2goe1xyXG4gICAgICBxdWVyeTogcXVlcnksXHJcbiAgICAgIGVucmljaDogdHJ1ZSxcclxuICAgICAgbGltaXQ6IGxpbWl0LFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBpdGVtcyA9IHt9O1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdC5yZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocikge1xyXG4gICAgICAgIGl0ZW1zW3IuaWRdID0gci5kb2M7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2hvd1Jlc3VsdHMoaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZW5hYmxlVUkoKSB7XHJcbiAgICBjb25zdCBzZWFyY2hmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1mb3JtJyk7XHJcbiAgICBzZWFyY2hmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZG9TZWFyY2goKTtcclxuICAgIH0pO1xyXG4gICAgc2VhcmNoZm9ybS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgZG9TZWFyY2goKTtcclxuICAgIH0pO1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1sb2FkaW5nJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWlucHV0JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLXRleHQnKS5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYnVpbGRJbmRleCgpIHtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbG9hZGluZycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgZmV0Y2goXCIvc2VhcmNoLWluZGV4Lmpzb25cIilcclxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgIGluZGV4LmFkZChpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBidWlsZEluZGV4KCk7XHJcbiAgZW5hYmxlVUkoKTtcclxufSkoKTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7OztBQU9BLE1BQUk7QUFBRSxXQUFTLEVBQUUsR0FBRTtBQUFDLFdBQU0sZ0JBQWMsT0FBTyxJQUFFLElBQUU7QUFBQSxFQUFFO0FBQUMsV0FBUyxFQUFFLEdBQUU7QUFBQyxVQUFNLElBQUUsTUFBTSxDQUFDO0FBQUUsYUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRTtBQUFFLFdBQU87QUFBQSxFQUFDO0FBQUMsV0FBUyxJQUFHO0FBQUMsV0FBTyx1QkFBTyxPQUFPLElBQUk7QUFBQSxFQUFDO0FBQUMsV0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFdBQU8sRUFBRSxTQUFPLEVBQUU7QUFBQSxFQUFNO0FBQUMsV0FBUyxFQUFFLEdBQUU7QUFBQyxXQUFNLGFBQVcsT0FBTztBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRTtBQUFDLFdBQU0sYUFBVyxPQUFPO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFO0FBQUMsV0FBTSxlQUFhLE9BQU87QUFBQSxFQUFDO0FBQUUsV0FBUyxFQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRTtBQUFHLFFBQUcsTUFBSSxNQUFJLElBQUUsRUFBRSxHQUFFLENBQUMsSUFBRyxLQUFLLE1BQUksSUFBRSxFQUFFLEdBQUUsS0FBSyxDQUFDLElBQUcsS0FBSyxLQUFHLElBQUUsRUFBRSxXQUFTLElBQUUsRUFBRSxHQUFFLEtBQUssQ0FBQyxJQUFHLEtBQUcsT0FBSyxJQUFHO0FBQUMsVUFBRSxFQUFFLE1BQU0sQ0FBQztBQUFFLFVBQUcsS0FBSyxRQUFPO0FBQUMsWUFBRSxLQUFLO0FBQU8sWUFBRSxFQUFFO0FBQU8sY0FBTSxJQUFFLENBQUM7QUFBRSxpQkFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxLQUFJO0FBQUMsZ0JBQU0sSUFBRSxFQUFFLENBQUM7QUFBRSxlQUFHLENBQUMsRUFBRSxDQUFDLE1BQUksRUFBRSxHQUFHLElBQUU7QUFBQSxRQUFFO0FBQUMsWUFBRTtBQUFBLE1BQUMsTUFBTSxLQUFFO0FBQUUsYUFBTztBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBQztBQUFDLE1BQU0sS0FBRztBQUFULE1BQW9DLEtBQUc7QUFDaG9CLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxVQUFNLElBQUUsT0FBTyxLQUFLLENBQUMsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLENBQUM7QUFBRSxRQUFJLElBQUUsSUFBRyxJQUFFO0FBQUUsYUFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUUsRUFBRSxDQUFDLElBQUcsSUFBRSxFQUFFLENBQUMsTUFBSSxFQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsWUFBVSxJQUFFLFlBQVUsQ0FBQyxHQUFFLEVBQUUsR0FBRyxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksTUFBSTtBQUFFLFVBQUksRUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLGFBQVcsSUFBRSxhQUFXLE1BQUksSUFBRSxHQUFHLEdBQUUsRUFBRSxDQUFDLElBQUU7QUFBSSxXQUFPO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxhQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLE1BQUksSUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsQ0FBQyxHQUFFLElBQUcsS0FBRyxFQUFFO0FBQUMsV0FBTztBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRTtBQUFDLFdBQU8sSUFBSSxPQUFPLEdBQUUsR0FBRztBQUFBLEVBQUM7QUFBQyxXQUFTLEdBQUcsR0FBRTtBQUFDLFFBQUksSUFBRSxJQUFHLElBQUU7QUFBRyxhQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxHQUFFLElBQUUsR0FBRSxJQUFJLEVBQUMsSUFBRSxFQUFFLENBQUMsT0FBSyxNQUFJLEtBQUcsSUFBRTtBQUFHLFdBQU87QUFBQSxFQUFDO0FBQUUsTUFBSSxLQUFHLEVBQUMsUUFBTyxJQUFHLEdBQUUsT0FBRyxHQUFFLEdBQUU7QUFBRSxXQUFTLEdBQUcsR0FBRTtBQUFDLFdBQU8sRUFBRSxLQUFLLE9BQU0sS0FBRyxHQUFHLFlBQVksR0FBRSxLQUFFO0FBQUEsRUFBQztBQUFFLE1BQU0sS0FBRyxDQUFDO0FBQVYsTUFBWSxJQUFFLENBQUM7QUFBRSxXQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUUsR0FBRSxLQUFLO0FBQUUsTUFBRSxHQUFFLFFBQVE7QUFBRSxNQUFFLEdBQUUsUUFBUTtBQUFFLE1BQUUsR0FBRSxRQUFRO0FBQUUsTUFBRSxHQUFFLFFBQVE7QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsSUFBRSxPQUFPLElBQUUsV0FBVTtBQUFDLFlBQU0sSUFBRSxNQUFLLElBQUU7QUFBVSxVQUFJLElBQUUsRUFBRSxFQUFFLFNBQU8sQ0FBQztBQUFFLFVBQUk7QUFBRSxRQUFFLENBQUMsTUFBSSxJQUFFLEdBQUUsT0FBTyxFQUFFLEVBQUUsU0FBTyxDQUFDO0FBQUcsVUFBRSxJQUFJLFFBQVEsU0FBUyxHQUFFO0FBQUMsbUJBQVcsV0FBVTtBQUFDLFlBQUUsUUFBTTtBQUFHLGdCQUFNLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBRSxZQUFFLFFBQU07QUFBRyxZQUFFLENBQUM7QUFBQSxRQUFDLENBQUM7QUFBQSxNQUFDLENBQUM7QUFBRSxhQUFPLEtBQUcsRUFBRSxLQUFLLENBQUMsR0FBRSxRQUFNO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBRSxXQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQU0sSUFBRSxFQUFFO0FBQU8sUUFBSSxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsSUFBRTtBQUFFLFVBQUksSUFBRSxDQUFDO0FBQUcsYUFBUSxJQUFFLElBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQU0sSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLEVBQUU7QUFBRSxVQUFJLElBQUUsQ0FBQztBQUFFLGVBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxLQUFJO0FBQUMsY0FBTSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRTtBQUFPLFlBQUcsRUFBRSxVQUFRLElBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxjQUFHLEVBQUUsQ0FBQyxHQUFFO0FBQUMsZ0JBQUcsQ0FBQztBQUFFLGtCQUFHLEVBQUU7QUFBQSx1QkFBWSxFQUFFLEdBQUcsSUFBRSxHQUFFLE1BQUksRUFBRSxRQUFPO0FBQUE7QUFBRSxnQkFBRyxLQUFHLEVBQUUsR0FBRSxDQUFDLElBQUU7QUFBRSxnQkFBRTtBQUFBLFVBQUU7QUFBQyxjQUFHLE1BQUksS0FBRyxFQUFFLENBQUMsS0FBRyxLQUFHLEdBQUUsRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLElBQUc7QUFBQyxrQkFBTSxJQUFFLEVBQUUsSUFBRSxDQUFDLE1BQUksRUFBRSxJQUFFLENBQUMsSUFBRSxDQUFDO0FBQUcsY0FBRSxFQUFFLE1BQU0sSUFBRTtBQUFBLFVBQUM7QUFBQSxRQUFDLE1BQU0sR0FBRSxDQUFDLElBQUU7QUFBQSxNQUFDO0FBQUMsVUFBRyxFQUFFLE9BQUksSUFBRTtBQUFBLGVBQVcsQ0FBQyxFQUFFLFFBQU0sQ0FBQztBQUFFLFVBQUU7QUFBQSxJQUFDO0FBQUMsUUFBRyxFQUFFLFVBQVEsSUFBRSxFQUFFLFNBQU8sR0FBRSxHQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxVQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUUsRUFBRTtBQUFPLGVBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRyxJQUMvM0MsRUFBRSxDQUFDLEdBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRTtBQUFDLFlBQUcsRUFBRTtBQUFBLGlCQUFZLEVBQUUsR0FBRyxJQUFFLEdBQUUsTUFBSSxFQUFFLFFBQU87QUFBRSxVQUFFLENBQUMsSUFBRTtBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBLEVBQUM7QUFBQyxXQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsVUFBTSxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsR0FBRSxJQUFFLENBQUM7QUFBRSxhQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsRUFBRSxDQUFDLENBQUMsSUFBRTtBQUFFLGFBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBSTtBQUFDLFVBQUUsRUFBRSxDQUFDO0FBQUUsZUFBUSxJQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLEtBQUcsQ0FBQyxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxHQUFFLEVBQUUsRUFBRSxNQUFNLElBQUU7QUFBQSxJQUFFO0FBQUMsV0FBTztBQUFBLEVBQUM7QUFBRSxXQUFTLEVBQUUsR0FBRTtBQUFDLFNBQUssSUFBRSxTQUFLLEtBQUc7QUFBRSxTQUFLLFFBQU0sRUFBRTtBQUFFLFNBQUssSUFBRSxDQUFDO0FBQUEsRUFBQztBQUFDLFdBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsQ0FBQyxNQUFJLElBQUUsRUFBRTtBQUFPLFFBQUksSUFBRSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUUsVUFBSSxJQUFFLEtBQUssT0FBTyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEtBQUssTUFBTSxJQUFJLEdBQUUsQ0FBQztBQUFHLFdBQU87QUFBQSxFQUFDO0FBQUMsSUFBRSxVQUFVLE1BQUksU0FBUyxHQUFFLEdBQUU7QUFBQyxRQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsR0FBRTtBQUFDLFVBQUksSUFBRSxLQUFLLEVBQUU7QUFBTyxZQUFJLEtBQUssSUFBRSxPQUFPLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBRSxDQUFDLENBQUMsSUFBRTtBQUFJLFdBQUksRUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLE1BQUssRUFBRSxDQUFDLElBQUUsS0FBSyxFQUFFLElBQUUsQ0FBQztBQUFFLFdBQUssRUFBRSxDQUFDLElBQUU7QUFBQSxJQUFDO0FBQUMsU0FBSyxNQUFNLENBQUMsSUFBRTtBQUFBLEVBQUM7QUFBRSxJQUFFLFVBQVUsTUFBSSxTQUFTLEdBQUU7QUFBQyxVQUFNLElBQUUsS0FBSyxNQUFNLENBQUM7QUFBRSxRQUFHLEtBQUssS0FBRyxNQUFJLElBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFHO0FBQUMsWUFBTSxJQUFFLEtBQUssRUFBRSxJQUFFLENBQUM7QUFBRSxXQUFLLEVBQUUsSUFBRSxDQUFDLElBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxXQUFLLEVBQUUsQ0FBQyxJQUFFO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUUsTUFBTSxLQUFHLEVBQUMsUUFBTyxFQUFDLFNBQVEsZUFBYyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsTUFBRSxHQUFFLGFBQVksRUFBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsT0FBRyxTQUFRLEVBQUMsT0FBTSxHQUFFLEdBQUUsRUFBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFNBQVEsZUFBYyxHQUFFLFVBQVMsR0FBRSxPQUFNLEVBQUMsU0FBUSxrQkFBaUIsR0FBRSxJQUFHLEdBQUUsR0FBRSxTQUFRLEVBQUMsT0FBTSxHQUFFLEdBQUUsRUFBQyxFQUFDLEdBQUUsV0FBVSxDQUFDLEVBQUM7QUFBRSxXQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsZUFBVyxXQUFVO0FBQUMsWUFBTSxJQUFFLEVBQUUsSUFBRSxJQUFFLE1BQUksSUFBRSxHQUFFLEtBQUssVUFBVSxDQUFDLENBQUM7QUFBRSxXQUFHLEVBQUUsT0FBSyxFQUFFLEtBQUssV0FBVTtBQUFDLFVBQUUsT0FBTyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxDQUFDO0FBQUEsTUFBQyxDQUFDLElBQUUsRUFBRSxPQUFPLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLENBQUM7QUFBQSxJQUFDLENBQUM7QUFBQSxFQUFDO0FBQUUsV0FBUyxFQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUcsRUFBRSxnQkFBZ0IsR0FBRyxRQUFPLElBQUksRUFBRSxDQUFDO0FBQUUsUUFBSTtBQUFFLFFBQUcsR0FBRTtBQUFDLFFBQUUsQ0FBQyxJQUFFLElBQUUsR0FBRyxDQUFDLEtBQUcsSUFBRSxFQUFFLFlBQVUsSUFBRSxPQUFPLE9BQU8sQ0FBQyxHQUFFLEVBQUUsQ0FBQyxHQUFFLENBQUM7QUFBRyxVQUFFLEVBQUU7QUFBUSxVQUFJLElBQUUsRUFBRTtBQUFLLFFBQUUsQ0FBQyxNQUFJLE9BQUssRUFBRSxRQUFRLEdBQUcsTUFBSSxLQUFHLGFBQVksSUFBRSxFQUFFLENBQUM7QUFBRyxRQUFFLENBQUMsTUFBSSxJQUFFLEdBQUcsQ0FBQztBQUFBLElBQUUsTUFBTSxLQUFFLENBQUM7QUFBRSxRQUFJLEdBQUUsR0FBRSxJQUFFLEVBQUUsV0FBUyxDQUFDO0FBQUUsU0FBSyxTQUFPLEVBQUUsVUFBUSxLQUFHLEVBQUUsVUFBUTtBQUFHLFNBQUssV0FBUyxLQUFHLEVBQUU7QUFBRSxTQUFLLElBQUUsSUFBRSxFQUFFLGNBQVk7QUFBRSxTQUFLLElBQUUsSUFBRSxLQUFHLEVBQUUsS0FBRyxFQUFFLFlBQVU7QUFBUyxTQUFLLFFBQU0sYUFBVyxLQUFHLEVBQUU7QUFBTSxTQUFLLElBQUUsRUFBRSxFQUFFLGFBQWE7QUFBRSxTQUFLLElBQUUsSUFBRSxFQUFFLEVBQUUsUUFBUTtBQUFFLFNBQUssSUFBRSxFQUFFLEVBQUUsVUFBVTtBQUFFLFNBQUssSUFBRSxFQUFFLGFBQVc7QUFBRSxTQUFLLElBQ3hvRCxFQUFFO0FBQU0sU0FBSyxNQUFJLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRTtBQUFFLFNBQUssSUFBRSxJQUFFLEVBQUUsY0FBWTtBQUFFLFNBQUssSUFBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUU7QUFBRSxTQUFLLElBQUUsS0FBRyxFQUFFLEtBQUcsRUFBRTtBQUFJLFNBQUssS0FBRyxJQUFFLEVBQUUsV0FBUyxLQUFHLEVBQUUsTUFBSSxFQUFFLEdBQUUsS0FBRTtBQUFFLFNBQUssS0FBRyxJQUFFLEVBQUUsV0FBUyxLQUFHLEVBQUUsTUFBSSxFQUFFLEdBQUUsSUFBRTtBQUFFLFFBQUcsSUFBRSxJQUFFLEVBQUUsVUFBUSxLQUFHLEVBQUUsUUFBTztBQUFDLFVBQUU7QUFBRSxVQUFFLEVBQUU7QUFBRSxlQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLEdBQUUsSUFBSSxHQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUU7QUFBRSxVQUFFO0FBQUEsSUFBQztBQUFDLFNBQUssU0FBTztBQUFFLFNBQUssU0FBTyxJQUFFLEVBQUUsVUFBUSxJQUFJLEVBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxNQUFFLEVBQUU7QUFBVSxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssSUFBSSxHQUFFLEdBQUUsSUFBRTtBQUFBLEVBQUM7QUFDeFcsSUFBRSxNQUFJLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUcsTUFBSSxLQUFHLE1BQUksSUFBRztBQUFDLFVBQUcsQ0FBQyxLQUFHLENBQUMsS0FBRyxLQUFLLFNBQVMsQ0FBQyxFQUFFLFFBQU8sS0FBSyxPQUFPLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSyxPQUFPLENBQUM7QUFBRSxVQUFHLElBQUUsRUFBRSxRQUFPO0FBQUMsY0FBTSxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsR0FBRSxJQUFFLEtBQUssT0FBTSxJQUFFLEtBQUs7QUFBRSxpQkFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEtBQUk7QUFBQyxjQUFJLElBQUUsRUFBRSxLQUFLLElBQUUsSUFBRSxJQUFFLElBQUUsQ0FBQztBQUFFLGNBQUksSUFBRSxFQUFFO0FBQU8sY0FBRyxLQUFHLEtBQUcsS0FBSyxNQUFJLEtBQUcsQ0FBQyxFQUFFLENBQUMsSUFBRztBQUFDLGdCQUFJLElBQUUsRUFBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFLElBQUU7QUFBRyxvQkFBTyxLQUFLLEdBQUU7QUFBQSxjQUFDLEtBQUs7QUFBTyxvQkFBRyxJQUFFLEdBQUU7QUFBQyx1QkFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksVUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRyxJQUFFLEtBQUcsS0FBSyxHQUFFO0FBQUMsd0JBQUksSUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLHdCQUFFLEVBQUUsVUFBVSxHQUFFLENBQUM7QUFBRSxzQkFBRSxNQUFLLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLGtCQUFDO0FBQUM7QUFBQSxnQkFBSztBQUFBLGNBQUMsS0FBSztBQUFVLG9CQUFHLElBQUUsR0FBRTtBQUFDLHVCQUFJLElBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUUsRUFBRSxDQUFDLElBQUUsR0FBRSxFQUFFLFVBQVEsS0FBSyxLQUFHO0FBQUEsb0JBQUU7QUFBQSxvQkFBSztBQUFBLG9CQUNuZjtBQUFBLG9CQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsb0JBQUU7QUFBQSxvQkFBRTtBQUFBLGtCQUFDO0FBQUUsc0JBQUU7QUFBQSxnQkFBRTtBQUFBLGNBQUMsS0FBSztBQUFVLG9CQUFHLElBQUUsR0FBRTtBQUFDLHVCQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxNQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsVUFBUSxLQUFLLEtBQUcsRUFBRSxNQUFLLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFO0FBQUEsZ0JBQUs7QUFBQSxjQUFDO0FBQVEsb0JBQUcsS0FBSyxNQUFJLElBQUUsS0FBSyxJQUFJLElBQUUsS0FBSyxFQUFFLEdBQUUsR0FBRSxDQUFDLElBQUUsR0FBRSxJQUFFLENBQUMsSUFBRyxFQUFFLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxJQUFFO0FBQUUsdUJBQUksSUFBRSxFQUFFLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxHQUFFLElBQUUsS0FBSyxJQUFJLElBQUUsR0FBRSxJQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxNQUFJLElBQUUsRUFBRSxLQUFLLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLENBQUMsTUFBSSxFQUFFLFVBQVEsS0FBSyxLQUFHLENBQUMsRUFBRSxDQUFDLEdBQUU7QUFBQyxzQkFBRSxDQUFDLElBQUU7QUFBRSwwQkFBTSxJQUFFLEtBQUssS0FBRyxJQUFFO0FBQUUsc0JBQUUsTUFBSyxHQUFFLElBQUUsSUFBRSxHQUFFLEVBQUUsS0FBRyxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUcsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsSUFBRSxJQUFFLENBQUM7QUFBQSxrQkFBQztBQUFBO0FBQUEsWUFBQztBQUFBLFVBQUM7QUFBQSxRQUFDO0FBQUMsYUFBSyxNQUFJLEtBQUssU0FBUyxDQUFDLElBQUU7QUFBQSxNQUFFO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFJO0FBQzViLFdBQVMsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUcsSUFBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLEtBQUcsS0FBRyxPQUFLLEtBQUcsS0FBRyxNQUFJLElBQUUsSUFBRTtBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFO0FBQUksUUFBRyxDQUFDLEVBQUUsQ0FBQyxLQUFHLEtBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRSxNQUFJLElBQUUsRUFBRSxDQUFDLElBQUcsS0FBRyxJQUFFLEVBQUUsQ0FBQyxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsSUFBRyxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsRUFBRSxNQUFJLEVBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxDQUFDLElBQUcsRUFBRSxNQUFJLElBQUUsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsQ0FBQyxLQUFJLEtBQUcsRUFBRSxTQUFTLENBQUMsTUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFFLEdBQUUsRUFBRSxNQUFJLElBQUUsRUFBRSxTQUFTLENBQUMsTUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFFLENBQUMsSUFBRyxFQUFFLEVBQUUsTUFBTSxJQUFFO0FBQUEsRUFBRztBQUN4VyxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUksQ0FBQyxLQUFHLEVBQUUsQ0FBQyxLQUFHLElBQUUsR0FBRSxJQUFFLEVBQUUsU0FBTyxFQUFFLENBQUMsTUFBSSxJQUFFO0FBQUksUUFBSSxJQUFFLENBQUMsR0FBRTtBQUFFLFFBQUksR0FBRSxJQUFFO0FBQUUsUUFBRyxHQUFFO0FBQUMsVUFBRSxFQUFFLFNBQU87QUFBRSxVQUFFLEVBQUU7QUFBTSxVQUFFLEVBQUUsVUFBUTtBQUFFLFVBQUksSUFBRSxFQUFFO0FBQVEsVUFBRSxFQUFFO0FBQUEsSUFBTztBQUFDLFFBQUcsTUFBSSxJQUFFLEtBQUssT0FBTyxLQUFHLENBQUMsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLElBQUc7QUFBQyxVQUFFLEVBQUU7QUFBRSxVQUFJLElBQUUsQ0FBQztBQUFFLGVBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLE1BQUksSUFBRSxFQUFFLENBQUMsTUFBSSxFQUFFLFVBQVEsS0FBSyxLQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBRyxLQUFLLEtBQUcsS0FBRyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUUsR0FBRyxJQUFFLEdBQUUsRUFBRSxDQUFDLElBQUU7QUFBQSxVQUFPLFFBQU87QUFBRSxVQUFFO0FBQUUsVUFBRSxFQUFFO0FBQUEsSUFBTTtBQUFDLFFBQUcsQ0FBQyxFQUFFLFFBQU87QUFBRSxVQUFJLElBQUU7QUFBSyxRQUFFLEtBQUssU0FBTyxJQUFFLEtBQUcsVUFBSztBQUFFLFFBQUU7QUFBRSxRQUFJO0FBQUUsU0FBRyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBRyxJQUFFLEtBQUcsRUFBRSxLQUFLLEVBQUU7QUFBRSxhQUFRLEdBQUUsR0FBRSxJQUFFLEdBQUUsS0FBSTtBQUFDLFVBQUUsRUFBRSxDQUFDO0FBQUUsV0FBRyxJQUFFO0FBQUEsUUFBRztBQUFBLFFBQUs7QUFBQSxRQUFFO0FBQUEsUUFBRTtBQUFBLFFBQUU7QUFBQSxRQUFFLE1BQUk7QUFBQSxRQUFFO0FBQUEsUUFDcGY7QUFBQSxNQUFDLEdBQUUsS0FBRyxVQUFLLEtBQUcsRUFBRSxXQUFTLElBQUUsTUFBSSxJQUFFLEdBQUcsTUFBSyxHQUFFLEdBQUUsR0FBRSxHQUFFLE1BQUksR0FBRSxDQUFDO0FBQUUsVUFBRyxFQUFFLFFBQU87QUFBRSxVQUFHLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxZQUFFLEVBQUU7QUFBTyxZQUFHLENBQUMsR0FBRTtBQUFDLGNBQUcsR0FBRTtBQUFDLGdCQUFFO0FBQUUsZ0JBQUU7QUFBRztBQUFBLFVBQVE7QUFBQyxpQkFBTztBQUFBLFFBQUM7QUFBQyxZQUFHLE1BQUksRUFBRSxRQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBQztBQUFBLElBQUM7QUFBQyxXQUFPLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFDMUwsV0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxDQUFDLEdBQUUsSUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFO0FBQUksTUFBRSxNQUFJLElBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxFQUFFLENBQUM7QUFBRyxRQUFHLEdBQUU7QUFBQyxVQUFJLElBQUU7QUFBRSxZQUFNLElBQUUsS0FBSyxJQUFJLEVBQUUsUUFBTyxJQUFFLEVBQUUsSUFBRSxFQUFFLENBQUM7QUFBRSxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUcsSUFBRSxFQUFFLENBQUM7QUFBRSxZQUFHLEVBQUUsTUFBSSxJQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsRUFBRSxDQUFDLElBQUcsS0FBRyxLQUFHLE1BQUksSUFBRSxFQUFFLFFBQU8sS0FBRyxLQUFHLEtBQUcsR0FBRSxJQUFFLFNBQU8sSUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLElBQUUsS0FBSSxNQUFJLEVBQUUsR0FBRyxJQUFFLEdBQUUsTUFBSSxLQUFHLEVBQUUsUUFBTyxLQUFHLElBQUk7QUFBQTtBQUFNLFVBQUcsR0FBRTtBQUFDLFlBQUcsRUFBRSxRQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsTUFBTSxJQUFFO0FBQUU7QUFBQSxNQUFNO0FBQUEsSUFBQztBQUFDLFdBQU0sQ0FBQyxLQUFHO0FBQUEsRUFBQztBQUFDLFdBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUUsTUFBSSxFQUFFLFNBQU8sRUFBRSxDQUFDLElBQUUsQ0FBQyxFQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUUsQ0FBQztBQUFFLFdBQU8sS0FBRyxFQUFFLFNBQU8sSUFBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUMsSUFBRTtBQUFBLEVBQUM7QUFDcGMsV0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxTQUFHLElBQUUsS0FBRyxJQUFFLEdBQUUsS0FBRyxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUMsTUFBSSxFQUFFLElBQUUsSUFBRSxDQUFDLEtBQUcsSUFBRSxFQUFFLENBQUM7QUFBRSxXQUFPO0FBQUEsRUFBQztBQUFDLElBQUUsVUFBUSxTQUFTLEdBQUU7QUFBQyxXQUFNLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQUM7QUFBRSxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsSUFBSSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQ2hMLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRTtBQUFDLFVBQU0sSUFBRSxLQUFLLFNBQVMsQ0FBQztBQUFFLFFBQUcsR0FBRTtBQUFDLFVBQUcsS0FBSyxFQUFFLFVBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFFLENBQUM7QUFBQSxVQUFPLEdBQUUsS0FBSyxLQUFJLEdBQUUsS0FBSyxHQUFFLEtBQUssQ0FBQyxHQUFFLEtBQUssU0FBTyxFQUFFLEtBQUssR0FBRSxHQUFFLEtBQUssR0FBRSxLQUFLLENBQUM7QUFBRSxXQUFHLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFBRSxVQUFHLEtBQUssT0FBTTtBQUFDLFlBQUUsS0FBSztBQUFNLGlCQUFRLElBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsRUFBRSxTQUFTLENBQUMsTUFBSSxFQUFFLEVBQUUsT0FBTyxLQUFJLENBQUMsR0FBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBSTtBQUNuWCxXQUFTLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFO0FBQUUsUUFBRyxFQUFFLGdCQUFjLE1BQU0sS0FBRyxFQUFFLEtBQUUsRUFBRSxRQUFRLENBQUMsR0FBRSxPQUFLLElBQUUsSUFBRSxFQUFFLFdBQVMsRUFBRSxPQUFPLEdBQUUsQ0FBQyxHQUFFLE9BQUs7QUFBQSxTQUFRO0FBQUMsVUFBRSxLQUFLLElBQUksRUFBRSxRQUFPLENBQUM7QUFBRSxlQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUcsSUFBRSxFQUFFLENBQUMsRUFBRSxLQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsS0FBRyxLQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsSUFBQztBQUFBLFFBQU0sVUFBUSxLQUFLLEVBQUUsRUFBQyxJQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQyxNQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUUsV0FBTztBQUFBLEVBQUM7QUFBQyxJQUFFLGNBQVk7QUFDL1IsSUFBRSxTQUFPLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUU7QUFBRyxvQkFBYyxPQUFPLE1BQUksSUFBRSxJQUFJLFFBQVEsT0FBRztBQUFDLFVBQUU7QUFBQSxJQUFDLENBQUM7QUFBRyxRQUFJLEdBQUU7QUFBRSxZQUFPLE1BQUksSUFBRSxJQUFHO0FBQUEsTUFBQyxLQUFLO0FBQUUsWUFBRTtBQUFNLFlBQUcsS0FBSyxHQUFFO0FBQUMsY0FBRSxFQUFFO0FBQUUsbUJBQVEsS0FBSyxLQUFLLFNBQVMsR0FBRSxDQUFDLElBQUU7QUFBQSxRQUFDLE1BQU0sS0FBRSxLQUFLO0FBQVM7QUFBQSxNQUFNLEtBQUs7QUFBRSxZQUFFO0FBQU0sWUFBRSxFQUFDLEtBQUksR0FBRSxLQUFJLEtBQUssSUFBRSxJQUFFLEVBQUM7QUFBRTtBQUFBLE1BQU0sS0FBSztBQUFFLFlBQUU7QUFBTSxZQUFFLEtBQUs7QUFBSTtBQUFBLE1BQU0sS0FBSztBQUFFLFlBQUU7QUFBTSxZQUFFLEtBQUs7QUFBRTtBQUFBLE1BQU07QUFBUSx3QkFBYyxPQUFPLEtBQUcsS0FBRyxFQUFFO0FBQUU7QUFBQSxJQUFNO0FBQUMsT0FBRyxHQUFFLEtBQUcsTUFBSyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFdBQU87QUFBQSxFQUFDO0FBQzVZLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRTtBQUFDLFFBQUcsRUFBRSxTQUFPLEVBQUUsQ0FBQyxNQUFJLElBQUUsS0FBSyxNQUFNLENBQUMsSUFBRyxHQUFFO0FBQUEsTUFBQyxLQUFLO0FBQU0sYUFBSyxJQUFFLENBQUMsQ0FBQyxFQUFFO0FBQUk7QUFBQSxNQUFNLEtBQUs7QUFBTSxhQUFLLElBQUU7QUFBRyxhQUFLLFdBQVM7QUFBRTtBQUFBLE1BQU0sS0FBSztBQUFNLGFBQUssTUFBSTtBQUFFO0FBQUEsTUFBTSxLQUFLO0FBQU0sYUFBSyxJQUFFO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBRSxLQUFHLEVBQUUsU0FBUztBQUFFLFdBQVMsR0FBRyxHQUFFO0FBQUMsUUFBRSxFQUFFO0FBQUssUUFBSSxJQUFFLEtBQUs7QUFBTyxVQUFNLElBQUUsRUFBRTtBQUFLLFFBQUksSUFBRSxFQUFFO0FBQUssWUFBTyxHQUFFO0FBQUEsTUFBQyxLQUFLO0FBQU8sWUFBRSxFQUFFLFdBQVMsQ0FBQztBQUFFLFlBQUUsRUFBRTtBQUFRLFlBQUUsRUFBRTtBQUFPLFVBQUUsUUFBTTtBQUFHLGFBQUcsTUFBSSxFQUFFLFFBQVEsVUFBVSxNQUFJLEVBQUUsU0FBTyxTQUFTLFlBQVUsQ0FBQyxFQUFFO0FBQUcsYUFBRyxTQUFTLFlBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFFLEtBQUssU0FBTyxJQUFJLEtBQUssV0FBVyxNQUFNLENBQUMsR0FBRSxPQUFPLEtBQUssY0FBWSxLQUFLLFNBQU8sSUFBSSxFQUFFLENBQUM7QUFBRTtBQUFBLE1BQU07QUFBUSxZQUFFLEVBQUUsSUFBRyxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRSxDQUFDLEdBQUUsWUFBWSxhQUFXLElBQUUsRUFBQyxJQUFHLEdBQUUsS0FBSSxFQUFDLElBQUUsRUFBQyxJQUFHLEVBQUMsQ0FBQztBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUUsTUFBSSxLQUFHO0FBQUUsV0FBUyxFQUFFLEdBQUU7QUFBQyxRQUFHLEVBQUUsZ0JBQWdCLEdBQUcsUUFBTyxJQUFJLEVBQUUsQ0FBQztBQUFFLFFBQUk7QUFBRSxRQUFFLEVBQUUsSUFBRSxFQUFFLE1BQU0sTUFBSSxFQUFFLFNBQU8sRUFBRSxTQUFTLEtBQUcsSUFBRSxDQUFDO0FBQUUsS0FBQyxLQUFHLFFBQU0sUUFBUSxjQUFZLElBQUUsRUFBRSxTQUFTO0FBQUcsVUFBTSxJQUFFLGdCQUFjLE9BQU8sVUFBUSxLQUFLLFNBQVEsSUFBRTtBQUFLLFNBQUssSUFBRSxHQUFHLEdBQUUsR0FBRSxFQUFFLE1BQU07QUFBRSxTQUFLLElBQUUsRUFBRTtBQUFFLFFBQUcsS0FBSyxHQUFFO0FBQUMsVUFBRyxFQUFFLE1BQUssRUFBRSxHQUFHLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRztBQUFFLGVBQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUFBLE1BQUMsQ0FBQztBQUFB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Q0FBQyxHQUFFLEdBQUUsQ0FBQyxJQUFFLEdBQ3p3QixLQUFLLE1BQUksRUFBRSxDQUFDLElBQUUsSUFBSSxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsRUFBRSxNQUFJLEtBQUssSUFBRSxTQUFLLEtBQUssTUFBSSxFQUFFLENBQUMsSUFBRSxJQUFJLEVBQUUsR0FBRSxLQUFLLFFBQVEsSUFBRyxLQUFLLEVBQUUsQ0FBQyxJQUFFLEVBQUUsR0FBRSxLQUFLLENBQUMsR0FBRSxLQUFLLEVBQUUsQ0FBQyxJQUFFO0FBQUUsUUFBRyxLQUFLLEVBQUUsTUFBSSxJQUFFLEVBQUUsT0FBTSxFQUFFLENBQUMsTUFBSSxJQUFFLENBQUMsQ0FBQyxJQUFHLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLE1BQUssRUFBRSxDQUFDLElBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxLQUFLLENBQUM7QUFBRSxTQUFLLFFBQU07QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUUsR0FBRTtBQUFDLFVBQU0sSUFBRSxFQUFFLE1BQU0sR0FBRztBQUFFLFFBQUksSUFBRTtBQUFFLGFBQVEsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRSxFQUFFLENBQUMsR0FBRSxLQUFHLEVBQUUsUUFBUSxJQUFJLE1BQUksSUFBRSxFQUFFLFVBQVUsR0FBRSxFQUFFLFNBQU8sQ0FBQyxPQUFLLEVBQUUsQ0FBQyxJQUFFLE9BQUksTUFBSSxFQUFFLEdBQUcsSUFBRTtBQUFHLFFBQUUsRUFBRSxXQUFTLEVBQUUsU0FBTztBQUFHLFdBQU8sSUFBRSxJQUFFLElBQUUsRUFBRSxDQUFDO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxRQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUUsRUFBRSxDQUFDO0FBQUEsUUFBTyxVQUFRLElBQUUsR0FBRSxLQUFHLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBTztBQUFBLEVBQUM7QUFDNWUsV0FBUyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUUsRUFBRSxDQUFDO0FBQUUsUUFBRyxNQUFJLEVBQUUsU0FBTyxFQUFFLEdBQUUsQ0FBQyxJQUFFO0FBQUEsYUFBVSxFQUFFLEtBQUcsRUFBRSxnQkFBYyxNQUFNLE1BQUksSUFBRSxFQUFFLENBQUMsSUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsUUFBTyxLQUFFLEVBQUUsQ0FBQyxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsSUFBRyxJQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUcsSUFBRSxFQUFFLENBQUMsRUFBRSxLQUFHLE1BQUksRUFBRSxTQUFPLEdBQUU7QUFBQyxVQUFHLEVBQUUsZ0JBQWMsT0FBTTtBQUFDLFlBQUcsRUFBRSxDQUFDLEdBQUU7QUFBQyxlQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsSUFBSSxHQUFFLEVBQUUsQ0FBQyxHQUFFLE1BQUcsSUFBRTtBQUFFO0FBQUEsUUFBTTtBQUFDLFlBQUUsRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUFDO0FBQUMsUUFBRSxJQUFJLEdBQUUsR0FBRSxHQUFFLElBQUU7QUFBQSxJQUFDLFdBQVMsRUFBRSxnQkFBYyxNQUFNLE1BQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxRQUFPLEtBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxNQUFFLEVBQUU7QUFDM2QsSUFBRSxNQUFJLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLENBQUMsTUFBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLEdBQUUsS0FBSyxHQUFHO0FBQUcsUUFBRyxNQUFJLEtBQUcsTUFBSSxJQUFHO0FBQUMsVUFBRyxDQUFDLEtBQUcsS0FBSyxTQUFTLENBQUMsRUFBRSxRQUFPLEtBQUssT0FBTyxHQUFFLENBQUM7QUFBRSxlQUFRLElBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEVBQUUsUUFBTyxJQUFJLEtBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLE1BQUksSUFBRSxDQUFDLENBQUMsSUFBRyxFQUFFLEdBQUUsR0FBRSxLQUFLLEdBQUUsR0FBRSxLQUFLLE1BQU0sQ0FBQyxHQUFFLEdBQUUsRUFBRSxDQUFDLEdBQUUsQ0FBQztBQUFFLFVBQUcsS0FBSyxHQUFFO0FBQUMsWUFBSSxJQUFFLEVBQUUsR0FBRSxLQUFLLENBQUMsR0FBRSxJQUFFLEVBQUU7QUFBRSxVQUFFLENBQUMsTUFBSSxJQUFFLENBQUMsQ0FBQztBQUFHLGlCQUFRLElBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFHLElBQUUsRUFBRSxDQUFDLEdBQUUsQ0FBQyxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsS0FBSyxFQUFFLENBQUMsTUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFFLENBQUMsSUFBRyxDQUFDLEtBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUFHLGNBQUcsRUFBRSxFQUFFLE1BQU0sSUFBRSxHQUFFLEtBQUssR0FBRTtBQUFDLGtCQUFNLElBQUUsS0FBSyxTQUFTLENBQUMsTUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFFLENBQUM7QUFBRyxjQUFFLEVBQUUsTUFBTSxJQUFFO0FBQUEsVUFBQztBQUFBO0FBQUEsTUFBQztBQUFDLFVBQUcsS0FBSyxVQUFRLENBQUMsS0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUc7QUFBQyxZQUFJO0FBQy9mLFlBQUcsS0FBSyxHQUFFO0FBQUMsY0FBRSxFQUFFO0FBQUUsbUJBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEVBQUUsUUFBTyxJQUFJLEtBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxDQUFDLENBQUM7QUFBQSxRQUFDO0FBQUMsYUFBSyxNQUFNLENBQUMsSUFBRSxLQUFHO0FBQUEsTUFBQztBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBSTtBQUFFLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxJQUFJLEdBQUUsR0FBRSxJQUFFO0FBQUEsRUFBQztBQUFFLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFDcE8sSUFBRSxTQUFPLFNBQVMsR0FBRTtBQUFDLE1BQUUsQ0FBQyxNQUFJLElBQUUsRUFBRSxHQUFFLEtBQUssR0FBRztBQUFHLFFBQUcsS0FBSyxTQUFTLENBQUMsR0FBRTtBQUFDLGVBQVEsSUFBRSxHQUFFLElBQUUsS0FBSyxFQUFFLFdBQVMsS0FBSyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRSxDQUFDLEtBQUssSUFBRyxJQUFJO0FBQUMsVUFBRyxLQUFLLEtBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBUSxLQUFLLEtBQUssR0FBRTtBQUFDLFlBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxjQUFNLElBQUUsRUFBRSxRQUFRLENBQUM7QUFBRSxlQUFLLE1BQUksSUFBRSxFQUFFLFNBQU8sRUFBRSxPQUFPLEdBQUUsQ0FBQyxJQUFFLE9BQU8sS0FBSyxFQUFFLENBQUM7QUFBQSxNQUFFO0FBQUMsV0FBSyxTQUFPLE9BQU8sS0FBSyxNQUFNLENBQUM7QUFBRSxhQUFPLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFJO0FBQ3ZWLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLENBQUMsS0FBRyxFQUFFLENBQUMsS0FBRyxJQUFFLEdBQUUsSUFBRSxNQUFJLEVBQUUsQ0FBQyxNQUFJLElBQUUsR0FBRSxJQUFFO0FBQUksUUFBSSxJQUFFLENBQUMsR0FBRSxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFO0FBQUUsUUFBRyxFQUFFLEtBQUcsRUFBRSxnQkFBYyxNQUFNLEtBQUUsR0FBRSxJQUFFO0FBQUEsU0FBUztBQUFDLFVBQUUsRUFBRSxTQUFPO0FBQUUsV0FBRyxJQUFFLEVBQUUsVUFBUSxFQUFFLFNBQU8sRUFBRTtBQUFNLFVBQUUsRUFBRTtBQUFJLFVBQUUsS0FBSyxTQUFPLEVBQUU7QUFBTyxVQUFFLFVBQVEsRUFBRTtBQUFLLFVBQUUsRUFBRSxTQUFPLEtBQUc7QUFBSSxVQUFFLEVBQUUsVUFBUTtBQUFFLFVBQUcsTUFBSSxFQUFFLENBQUMsTUFBSSxJQUFFLENBQUMsQ0FBQyxJQUFHLENBQUMsSUFBRztBQUFDLGlCQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRyxJQUFFLEdBQUcsS0FBSyxNQUFLLEVBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLE1BQU0sSUFBRSxHQUFFO0FBQUksZUFBTyxJQUFFLElBQUUsQ0FBQztBQUFBLE1BQUM7QUFBQyxRQUFFLENBQUMsTUFBSSxJQUFFLENBQUMsQ0FBQztBQUFBLElBQUU7QUFBQyxVQUFJLElBQUUsS0FBSztBQUFHLFFBQUUsTUFBSSxJQUFFLEVBQUUsVUFBUSxLQUFHLElBQUUsRUFBRTtBQUFRLFVBQU0sSUFBRSxDQUFDLE1BQUksS0FBSyxLQUFHLEtBQUssVUFBUSxDQUFDO0FBQUUsYUFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFDdGYsRUFBRSxRQUFPLEtBQUk7QUFBQyxVQUFJO0FBQUUsVUFBRSxFQUFFLENBQUM7QUFBRSxRQUFFLENBQUMsTUFBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLE9BQU0sSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLEVBQUUsU0FBTyxHQUFFLElBQUUsRUFBRSxVQUFRO0FBQUcsVUFBRyxFQUFFLEdBQUUsQ0FBQyxJQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsWUFBWSxHQUFFLEdBQUUsS0FBRyxDQUFDO0FBQUEsV0FBTTtBQUFDLFlBQUUsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFFLEdBQUUsS0FBRyxDQUFDO0FBQUUsWUFBRSxLQUFHLEVBQUU7QUFBTyxZQUFHLEtBQUcsR0FBRTtBQUFDLGdCQUFNLElBQUUsQ0FBQztBQUFFLGNBQUksSUFBRTtBQUFFLGdCQUFJLEVBQUUsQ0FBQyxJQUFFLENBQUMsQ0FBQztBQUFHLG1CQUFRLElBQUUsR0FBRSxJQUFHLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFHLEtBQUcsRUFBRSxDQUFDLEdBQUUsS0FBRyxJQUFFLEtBQUssRUFBRSxFQUFFLE1BQUksRUFBRSxPQUFPLE1BQUksRUFBRSxFQUFFLE1BQU0sSUFBRSxJQUFFLENBQUMsQ0FBQyxJQUFFO0FBQUUsZ0JBQUksSUFBRSxJQUFFLEdBQUcsR0FBRSxLQUFHLEtBQUksS0FBRyxDQUFDLElBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxJQUFFLEVBQUU7QUFBQSxRQUFPO0FBQUMsWUFBRyxFQUFFLEdBQUUsQ0FBQyxJQUFFLEdBQUUsRUFBRSxHQUFHLElBQUU7QUFBQSxpQkFBVSxFQUFFLFFBQU0sQ0FBQztBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUMsUUFBRyxHQUFFO0FBQUMsWUFBTSxJQUFFO0FBQUssYUFBTyxJQUFJLFFBQVEsU0FBUyxHQUFFO0FBQUMsZ0JBQVEsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTLEdBQUU7QUFBQyxZQUFFLEVBQUU7QUFBQSxZQUFPO0FBQUEsWUFDaGdCO0FBQUEsWUFBRTtBQUFBLFlBQUU7QUFBQSxVQUFDLENBQUM7QUFBQSxRQUFDLENBQUM7QUFBQSxNQUFDLENBQUM7QUFBQSxJQUFDO0FBQUMsUUFBRyxDQUFDLEVBQUUsUUFBTSxDQUFDO0FBQUUsUUFBRyxNQUFJLENBQUMsS0FBRyxDQUFDLEtBQUssT0FBTyxRQUFPLEVBQUUsQ0FBQztBQUFFLGFBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBSTtBQUFDLFVBQUUsRUFBRSxDQUFDO0FBQUUsUUFBRSxVQUFRLE1BQUksSUFBRSxHQUFHLEtBQUssTUFBSyxDQUFDO0FBQUcsVUFBRyxFQUFFLFFBQU87QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFDLE9BQU0sRUFBRSxDQUFDLEdBQUUsUUFBTyxFQUFDO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUUsV0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUcsRUFBRSxTQUFPO0FBQUUsUUFBRyxLQUFHLElBQUUsR0FBRTtBQUFDLFVBQUcsSUFBRSxLQUFHLEVBQUUsS0FBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBRSxZQUFJLElBQUUsR0FBRyxLQUFLLE1BQUssQ0FBQztBQUFHLGFBQU0sRUFBQyxLQUFJLEdBQUUsUUFBTyxFQUFDO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBQyxXQUFTLEdBQUcsR0FBRTtBQUFDLFVBQU0sSUFBRSxNQUFNLEVBQUUsTUFBTTtBQUFFLGFBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUMsSUFBRyxHQUFFLEtBQUksS0FBSyxNQUFNLENBQUMsRUFBQztBQUFFLFdBQU87QUFBQSxFQUFDO0FBQUMsSUFBRSxVQUFRLFNBQVMsR0FBRTtBQUFDLFdBQU0sQ0FBQyxD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QztBQUFFLE1BQUksS0FBRyxFQUFDLFFBQU8sSUFBRyxHQUFFLE9BQUcsR0FBRSxTQUFRO0FBQUUsTUFBTSxLQUFHO0FBQVQsTUFBc0IsS0FBRyxFQUFDLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksUUFBUyxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxLQUFJLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxJQUFHO0FBQUUsV0FBUyxHQUFHLEdBQUU7QUFBQyxRQUFFLEdBQUcsS0FBSyxNQUFLLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBRSxVQUFNLElBQUUsQ0FBQztBQUFFLFFBQUcsR0FBRTtBQUFDLFlBQU0sSUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFFLElBQUUsRUFBRTtBQUFPLGVBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLE1BQUksSUFBRSxFQUFFLENBQUMsT0FBSyxDQUFDLEtBQUssVUFBUSxDQUFDLEtBQUssT0FBTyxDQUFDLElBQUc7QUFBQyxZQUFFLEVBQUUsQ0FBQztBQUFFLFlBQUksSUFBRSxHQUFHLENBQUMsS0FBRyxHQUFFLElBQUU7QUFBRSxpQkFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBSTtBQUFDLGNBQUUsRUFBRSxDQUFDO0FBQUUsZ0JBQU0sSUFBRSxHQUFHLENBQUMsS0FBRztBQUFFLGVBQUcsTUFBSSxNQUFJLEtBQUcsR0FBRSxJQUFFO0FBQUEsUUFBRTtBQUFDLFVBQUUsR0FBRyxJQUFFO0FBQUEsTUFBQztBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBQztBQUFFLE1BQUksS0FBRyxFQUFDLFFBQU8sSUFBRyxHQUFFLE9BQUcsR0FBRSxHQUFFO0FBQUUsTUFBTSxLQUFHLENBQUMsRUFBRSxJQUFJLEdBQUUsS0FBSSxFQUFFLElBQUksR0FBRSxLQUFJLEVBQUUsSUFBSSxHQUFFLEtBQUksRUFBRSxJQUFJLEdBQUUs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
diff --git a/public/js/flexsearch.cd0c42b0086b330604834f393b0397fd9a28ad9abb27659c5dfd9bd363d6179c.js b/public/js/flexsearch.cd0c42b0086b330604834f393b0397fd9a28ad9abb27659c5dfd9bd363d6179c.js
deleted file mode 100644
index fcca9ae2..00000000
--- a/public/js/flexsearch.cd0c42b0086b330604834f393b0397fd9a28ad9abb27659c5dfd9bd363d6179c.js
+++ /dev/null
@@ -1,922 +0,0 @@
-(() => {
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __commonJS = (cb, mod) => function __require() {
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
- };
-
- // (disabled):worker_threads
- var require_worker_threads = __commonJS({
- "(disabled):worker_threads"() {
- }
- });
-
- // node_modules/flexsearch/dist/flexsearch.bundle.module.min.js
- var t;
- function u(a) {
- return "undefined" !== typeof a ? a : true;
- }
- function v(a) {
- const b = Array(a);
- for (let c = 0; c < a; c++) b[c] = x();
- return b;
- }
- function x() {
- return /* @__PURE__ */ Object.create(null);
- }
- function aa(a, b) {
- return b.length - a.length;
- }
- function C(a) {
- return "string" === typeof a;
- }
- function D(a) {
- return "object" === typeof a;
- }
- function E(a) {
- return "function" === typeof a;
- }
- function F(a, b) {
- var c = ba;
- if (a && (b && (a = G(a, b)), this.H && (a = G(a, this.H)), this.J && 1 < a.length && (a = G(a, this.J)), c || "" === c)) {
- b = a.split(c);
- if (this.filter) {
- a = this.filter;
- c = b.length;
- const d = [];
- for (let e = 0, f = 0; e < c; e++) {
- const h = b[e];
- h && !a[h] && (d[f++] = h);
- }
- a = d;
- } else a = b;
- return a;
- }
- return a;
- }
- var ba = /[\p{Z}\p{S}\p{P}\p{C}]+/u;
- var ca = /[\u0300-\u036f]/g;
- function I(a, b) {
- const c = Object.keys(a), d = c.length, e = [];
- let f = "", h = 0;
- for (let g = 0, k, m; g < d; g++) k = c[g], (m = a[k]) ? (e[h++] = J(b ? "(?!\\b)" + k + "(\\b|_)" : k), e[h++] = m) : f += (f ? "|" : "") + k;
- f && (e[h++] = J(b ? "(?!\\b)(" + f + ")(\\b|_)" : "(" + f + ")"), e[h] = "");
- return e;
- }
- function G(a, b) {
- for (let c = 0, d = b.length; c < d && (a = a.replace(b[c], b[c + 1]), a); c += 2) ;
- return a;
- }
- function J(a) {
- return new RegExp(a, "g");
- }
- function da(a) {
- let b = "", c = "";
- for (let d = 0, e = a.length, f; d < e; d++) (f = a[d]) !== c && (b += c = f);
- return b;
- }
- var fa = { encode: ea, F: false, G: "" };
- function ea(a) {
- return F.call(this, ("" + a).toLowerCase(), false);
- }
- var ha = {};
- var K = {};
- function ia(a) {
- L(a, "add");
- L(a, "append");
- L(a, "search");
- L(a, "update");
- L(a, "remove");
- }
- function L(a, b) {
- a[b + "Async"] = function() {
- const c = this, d = arguments;
- var e = d[d.length - 1];
- let f;
- E(e) && (f = e, delete d[d.length - 1]);
- e = new Promise(function(h) {
- setTimeout(function() {
- c.async = true;
- const g = c[b].apply(c, d);
- c.async = false;
- h(g);
- });
- });
- return f ? (e.then(f), this) : e;
- };
- }
- function ja(a, b, c, d) {
- const e = a.length;
- let f = [], h, g, k = 0;
- d && (d = []);
- for (let m = e - 1; 0 <= m; m--) {
- const n = a[m], w = n.length, q = x();
- let r = !h;
- for (let l = 0; l < w; l++) {
- const p = n[l], A = p.length;
- if (A) for (let B = 0, z, y; B < A; B++) if (y = p[B], h) {
- if (h[y]) {
- if (!m) {
- if (c) c--;
- else if (f[k++] = y, k === b) return f;
- }
- if (m || d) q[y] = 1;
- r = true;
- }
- if (d && (z = (g[y] || 0) + 1, g[y] = z, z < e)) {
- const H = d[z - 2] || (d[z - 2] = []);
- H[H.length] = y;
- }
- } else q[y] = 1;
- }
- if (d) h || (g = q);
- else if (!r) return [];
- h = q;
- }
- if (d) for (let m = d.length - 1, n, w; 0 <= m; m--) {
- n = d[m];
- w = n.length;
- for (let q = 0, r; q < w; q++) if (r = n[q], !h[r]) {
- if (c) c--;
- else if (f[k++] = r, k === b) return f;
- h[r] = 1;
- }
- }
- return f;
- }
- function ka(a, b) {
- const c = x(), d = x(), e = [];
- for (let f = 0; f < a.length; f++) c[a[f]] = 1;
- for (let f = 0, h; f < b.length; f++) {
- h = b[f];
- for (let g = 0, k; g < h.length; g++) k = h[g], c[k] && !d[k] && (d[k] = 1, e[e.length] = k);
- }
- return e;
- }
- function M(a) {
- this.l = true !== a && a;
- this.cache = x();
- this.h = [];
- }
- function la(a, b, c) {
- D(a) && (a = a.query);
- let d = this.cache.get(a);
- d || (d = this.search(a, b, c), this.cache.set(a, d));
- return d;
- }
- M.prototype.set = function(a, b) {
- if (!this.cache[a]) {
- var c = this.h.length;
- c === this.l ? delete this.cache[this.h[c - 1]] : c++;
- for (--c; 0 < c; c--) this.h[c] = this.h[c - 1];
- this.h[0] = a;
- }
- this.cache[a] = b;
- };
- M.prototype.get = function(a) {
- const b = this.cache[a];
- if (this.l && b && (a = this.h.indexOf(a))) {
- const c = this.h[a - 1];
- this.h[a - 1] = this.h[a];
- this.h[a] = c;
- }
- return b;
- };
- var na = { memory: { charset: "latin:extra", D: 3, B: 4, m: false }, performance: { D: 3, B: 3, s: false, context: { depth: 2, D: 1 } }, match: { charset: "latin:extra", G: "reverse" }, score: { charset: "latin:advanced", D: 20, B: 3, context: { depth: 3, D: 9 } }, "default": {} };
- function oa(a, b, c, d, e, f, h, g) {
- setTimeout(function() {
- const k = a(c ? c + "." + d : d, JSON.stringify(h));
- k && k.then ? k.then(function() {
- b.export(a, b, c, e, f + 1, g);
- }) : b.export(a, b, c, e, f + 1, g);
- });
- }
- function N(a, b) {
- if (!(this instanceof N)) return new N(a);
- var c;
- if (a) {
- C(a) ? a = na[a] : (c = a.preset) && (a = Object.assign({}, c[c], a));
- c = a.charset;
- var d = a.lang;
- C(c) && (-1 === c.indexOf(":") && (c += ":default"), c = K[c]);
- C(d) && (d = ha[d]);
- } else a = {};
- let e, f, h = a.context || {};
- this.encode = a.encode || c && c.encode || ea;
- this.register = b || x();
- this.D = e = a.resolution || 9;
- this.G = b = c && c.G || a.tokenize || "strict";
- this.depth = "strict" === b && h.depth;
- this.l = u(h.bidirectional);
- this.s = f = u(a.optimize);
- this.m = u(a.fastupdate);
- this.B = a.minlength || 1;
- this.C = a.boost;
- this.map = f ? v(e) : x();
- this.A = e = h.resolution || 1;
- this.h = f ? v(e) : x();
- this.F = c && c.F || a.rtl;
- this.H = (b = a.matcher || d && d.H) && I(b, false);
- this.J = (b = a.stemmer || d && d.J) && I(b, true);
- if (c = b = a.filter || d && d.filter) {
- c = b;
- d = x();
- for (let g = 0, k = c.length; g < k; g++) d[c[g]] = 1;
- c = d;
- }
- this.filter = c;
- this.cache = (b = a.cache) && new M(b);
- }
- t = N.prototype;
- t.append = function(a, b) {
- return this.add(a, b, true);
- };
- t.add = function(a, b, c, d) {
- if (b && (a || 0 === a)) {
- if (!d && !c && this.register[a]) return this.update(a, b);
- b = this.encode(b);
- if (d = b.length) {
- const m = x(), n = x(), w = this.depth, q = this.D;
- for (let r = 0; r < d; r++) {
- let l = b[this.F ? d - 1 - r : r];
- var e = l.length;
- if (l && e >= this.B && (w || !n[l])) {
- var f = O(q, d, r), h = "";
- switch (this.G) {
- case "full":
- if (2 < e) {
- for (f = 0; f < e; f++) for (var g = e; g > f; g--) if (g - f >= this.B) {
- var k = O(q, d, r, e, f);
- h = l.substring(f, g);
- P(this, n, h, k, a, c);
- }
- break;
- }
- case "reverse":
- if (1 < e) {
- for (g = e - 1; 0 < g; g--) h = l[g] + h, h.length >= this.B && P(
- this,
- n,
- h,
- O(q, d, r, e, g),
- a,
- c
- );
- h = "";
- }
- case "forward":
- if (1 < e) {
- for (g = 0; g < e; g++) h += l[g], h.length >= this.B && P(this, n, h, f, a, c);
- break;
- }
- default:
- if (this.C && (f = Math.min(f / this.C(b, l, r) | 0, q - 1)), P(this, n, l, f, a, c), w && 1 < d && r < d - 1) {
- for (e = x(), h = this.A, f = l, g = Math.min(w + 1, d - r), e[f] = 1, k = 1; k < g; k++) if ((l = b[this.F ? d - 1 - r - k : r + k]) && l.length >= this.B && !e[l]) {
- e[l] = 1;
- const p = this.l && l > f;
- P(this, m, p ? f : l, O(h + (d / 2 > h ? 0 : 1), d, r, g - 1, k - 1), a, c, p ? l : f);
- }
- }
- }
- }
- }
- this.m || (this.register[a] = 1);
- }
- }
- return this;
- };
- function O(a, b, c, d, e) {
- return c && 1 < a ? b + (d || 0) <= a ? c + (e || 0) : (a - 1) / (b + (d || 0)) * (c + (e || 0)) + 1 | 0 : 0;
- }
- function P(a, b, c, d, e, f, h) {
- let g = h ? a.h : a.map;
- if (!b[c] || h && !b[c][h]) a.s && (g = g[d]), h ? (b = b[c] || (b[c] = x()), b[h] = 1, g = g[h] || (g[h] = x())) : b[c] = 1, g = g[c] || (g[c] = []), a.s || (g = g[d] || (g[d] = [])), f && g.includes(e) || (g[g.length] = e, a.m && (a = a.register[e] || (a.register[e] = []), a[a.length] = g));
- }
- t.search = function(a, b, c) {
- c || (!b && D(a) ? (c = a, a = c.query) : D(b) && (c = b));
- let d = [], e;
- let f, h = 0;
- if (c) {
- a = c.query || a;
- b = c.limit;
- h = c.offset || 0;
- var g = c.context;
- f = c.suggest;
- }
- if (a && (a = this.encode("" + a), e = a.length, 1 < e)) {
- c = x();
- var k = [];
- for (let n = 0, w = 0, q; n < e; n++) if ((q = a[n]) && q.length >= this.B && !c[q]) if (this.s || f || this.map[q]) k[w++] = q, c[q] = 1;
- else return d;
- a = k;
- e = a.length;
- }
- if (!e) return d;
- b || (b = 100);
- g = this.depth && 1 < e && false !== g;
- c = 0;
- let m;
- g ? (m = a[0], c = 1) : 1 < e && a.sort(aa);
- for (let n, w; c < e; c++) {
- w = a[c];
- g ? (n = pa(
- this,
- d,
- f,
- b,
- h,
- 2 === e,
- w,
- m
- ), f && false === n && d.length || (m = w)) : n = pa(this, d, f, b, h, 1 === e, w);
- if (n) return n;
- if (f && c === e - 1) {
- k = d.length;
- if (!k) {
- if (g) {
- g = 0;
- c = -1;
- continue;
- }
- return d;
- }
- if (1 === k) return qa(d[0], b, h);
- }
- }
- return ja(d, b, h, f);
- };
- function pa(a, b, c, d, e, f, h, g) {
- let k = [], m = g ? a.h : a.map;
- a.s || (m = ra(m, h, g, a.l));
- if (m) {
- let n = 0;
- const w = Math.min(m.length, g ? a.A : a.D);
- for (let q = 0, r = 0, l, p; q < w; q++) if (l = m[q]) {
- if (a.s && (l = ra(l, h, g, a.l)), e && l && f && (p = l.length, p <= e ? (e -= p, l = null) : (l = l.slice(e), e = 0)), l && (k[n++] = l, f && (r += l.length, r >= d))) break;
- }
- if (n) {
- if (f) return qa(k, d, 0);
- b[b.length] = k;
- return;
- }
- }
- return !c && k;
- }
- function qa(a, b, c) {
- a = 1 === a.length ? a[0] : [].concat.apply([], a);
- return c || a.length > b ? a.slice(c, c + b) : a;
- }
- function ra(a, b, c, d) {
- c ? (d = d && b > c, a = (a = a[d ? b : c]) && a[d ? c : b]) : a = a[b];
- return a;
- }
- t.contain = function(a) {
- return !!this.register[a];
- };
- t.update = function(a, b) {
- return this.remove(a).add(a, b);
- };
- t.remove = function(a, b) {
- const c = this.register[a];
- if (c) {
- if (this.m) for (let d = 0, e; d < c.length; d++) e = c[d], e.splice(e.indexOf(a), 1);
- else Q(this.map, a, this.D, this.s), this.depth && Q(this.h, a, this.A, this.s);
- b || delete this.register[a];
- if (this.cache) {
- b = this.cache;
- for (let d = 0, e, f; d < b.h.length; d++) f = b.h[d], e = b.cache[f], e.includes(a) && (b.h.splice(d--, 1), delete b.cache[f]);
- }
- }
- return this;
- };
- function Q(a, b, c, d, e) {
- let f = 0;
- if (a.constructor === Array) if (e) b = a.indexOf(b), -1 !== b ? 1 < a.length && (a.splice(b, 1), f++) : f++;
- else {
- e = Math.min(a.length, c);
- for (let h = 0, g; h < e; h++) if (g = a[h]) f = Q(g, b, c, d, e), d || f || delete a[h];
- }
- else for (let h in a) (f = Q(a[h], b, c, d, e)) || delete a[h];
- return f;
- }
- t.searchCache = la;
- t.export = function(a, b, c, d, e, f) {
- let h = true;
- "undefined" === typeof f && (h = new Promise((m) => {
- f = m;
- }));
- let g, k;
- switch (e || (e = 0)) {
- case 0:
- g = "reg";
- if (this.m) {
- k = x();
- for (let m in this.register) k[m] = 1;
- } else k = this.register;
- break;
- case 1:
- g = "cfg";
- k = { doc: 0, opt: this.s ? 1 : 0 };
- break;
- case 2:
- g = "map";
- k = this.map;
- break;
- case 3:
- g = "ctx";
- k = this.h;
- break;
- default:
- "undefined" === typeof c && f && f();
- return;
- }
- oa(a, b || this, c, g, d, e, k, f);
- return h;
- };
- t.import = function(a, b) {
- if (b) switch (C(b) && (b = JSON.parse(b)), a) {
- case "cfg":
- this.s = !!b.opt;
- break;
- case "reg":
- this.m = false;
- this.register = b;
- break;
- case "map":
- this.map = b;
- break;
- case "ctx":
- this.h = b;
- }
- };
- ia(N.prototype);
- function sa(a) {
- a = a.data;
- var b = self._index;
- const c = a.args;
- var d = a.task;
- switch (d) {
- case "init":
- d = a.options || {};
- a = a.factory;
- b = d.encode;
- d.cache = false;
- b && 0 === b.indexOf("function") && (d.encode = Function("return " + b)());
- a ? (Function("return " + a)()(self), self._index = new self.FlexSearch.Index(d), delete self.FlexSearch) : self._index = new N(d);
- break;
- default:
- a = a.id, b = b[d].apply(b, c), postMessage("search" === d ? { id: a, msg: b } : { id: a });
- }
- }
- var ta = 0;
- function S(a) {
- if (!(this instanceof S)) return new S(a);
- var b;
- a ? E(b = a.encode) && (a.encode = b.toString()) : a = {};
- (b = (self || window)._factory) && (b = b.toString());
- const c = "undefined" === typeof window && self.exports, d = this;
- this.o = ua(b, c, a.worker);
- this.h = x();
- if (this.o) {
- if (c) this.o.on("message", function(e) {
- d.h[e.id](e.msg);
- delete d.h[e.id];
- });
- else this.o.onmessage = function(e) {
- e = e.data;
- d.h[e.id](e.msg);
- delete d.h[e.id];
- };
- this.o.postMessage({ task: "init", factory: b, options: a });
- }
- }
- T("add");
- T("append");
- T("search");
- T("update");
- T("remove");
- function T(a) {
- S.prototype[a] = S.prototype[a + "Async"] = function() {
- const b = this, c = [].slice.call(arguments);
- var d = c[c.length - 1];
- let e;
- E(d) && (e = d, c.splice(c.length - 1, 1));
- d = new Promise(function(f) {
- setTimeout(function() {
- b.h[++ta] = f;
- b.o.postMessage({ task: a, id: ta, args: c });
- });
- });
- return e ? (d.then(e), this) : d;
- };
- }
- function ua(a, b, c) {
- let d;
- try {
- d = b ? new (require_worker_threads())["Worker"](__dirname + "/node/node.js") : a ? new Worker(URL.createObjectURL(new Blob(["onmessage=" + sa.toString()], { type: "text/javascript" }))) : new Worker(C(c) ? c : "worker/worker.js", { type: "module" });
- } catch (e) {
- }
- return d;
- }
- function U(a) {
- if (!(this instanceof U)) return new U(a);
- var b = a.document || a.doc || a, c;
- this.K = [];
- this.h = [];
- this.A = [];
- this.register = x();
- this.key = (c = b.key || b.id) && V(c, this.A) || "id";
- this.m = u(a.fastupdate);
- this.C = (c = b.store) && true !== c && [];
- this.store = c && x();
- this.I = (c = b.tag) && V(c, this.A);
- this.l = c && x();
- this.cache = (c = a.cache) && new M(c);
- a.cache = false;
- this.o = a.worker;
- this.async = false;
- c = x();
- let d = b.index || b.field || b;
- C(d) && (d = [d]);
- for (let e = 0, f, h; e < d.length; e++) f = d[e], C(f) || (h = f, f = f.field), h = D(h) ? Object.assign({}, a, h) : a, this.o && (c[f] = new S(h), c[f].o || (this.o = false)), this.o || (c[f] = new N(h, this.register)), this.K[e] = V(f, this.A), this.h[e] = f;
- if (this.C) for (a = b.store, C(a) && (a = [a]), b = 0; b < a.length; b++) this.C[b] = V(a[b], this.A);
- this.index = c;
- }
- function V(a, b) {
- const c = a.split(":");
- let d = 0;
- for (let e = 0; e < c.length; e++) a = c[e], 0 <= a.indexOf("[]") && (a = a.substring(0, a.length - 2)) && (b[d] = true), a && (c[d++] = a);
- d < c.length && (c.length = d);
- return 1 < d ? c : c[0];
- }
- function X(a, b) {
- if (C(b)) a = a[b];
- else for (let c = 0; a && c < b.length; c++) a = a[b[c]];
- return a;
- }
- function Y(a, b, c, d, e) {
- a = a[e];
- if (d === c.length - 1) b[e] = a;
- else if (a) if (a.constructor === Array) for (b = b[e] = Array(a.length), e = 0; e < a.length; e++) Y(a, b, c, d, e);
- else b = b[e] || (b[e] = x()), e = c[++d], Y(a, b, c, d, e);
- }
- function Z(a, b, c, d, e, f, h, g) {
- if (a = a[h]) if (d === b.length - 1) {
- if (a.constructor === Array) {
- if (c[d]) {
- for (b = 0; b < a.length; b++) e.add(f, a[b], true, true);
- return;
- }
- a = a.join(" ");
- }
- e.add(f, a, g, true);
- } else if (a.constructor === Array) for (h = 0; h < a.length; h++) Z(a, b, c, d, e, f, h, g);
- else h = b[++d], Z(a, b, c, d, e, f, h, g);
- }
- t = U.prototype;
- t.add = function(a, b, c) {
- D(a) && (b = a, a = X(b, this.key));
- if (b && (a || 0 === a)) {
- if (!c && this.register[a]) return this.update(a, b);
- for (let d = 0, e, f; d < this.h.length; d++) f = this.h[d], e = this.K[d], C(e) && (e = [e]), Z(b, e, this.A, 0, this.index[f], a, e[0], c);
- if (this.I) {
- let d = X(b, this.I), e = x();
- C(d) && (d = [d]);
- for (let f = 0, h, g; f < d.length; f++) if (h = d[f], !e[h] && (e[h] = 1, g = this.l[h] || (this.l[h] = []), !c || !g.includes(a))) {
- if (g[g.length] = a, this.m) {
- const k = this.register[a] || (this.register[a] = []);
- k[k.length] = g;
- }
- }
- }
- if (this.store && (!c || !this.store[a])) {
- let d;
- if (this.C) {
- d = x();
- for (let e = 0, f; e < this.C.length; e++) f = this.C[e], C(f) ? d[f] = b[f] : Y(b, d, f, 0, f[0]);
- }
- this.store[a] = d || b;
- }
- }
- return this;
- };
- t.append = function(a, b) {
- return this.add(a, b, true);
- };
- t.update = function(a, b) {
- return this.remove(a).add(a, b);
- };
- t.remove = function(a) {
- D(a) && (a = X(a, this.key));
- if (this.register[a]) {
- for (var b = 0; b < this.h.length && (this.index[this.h[b]].remove(a, !this.o), !this.m); b++) ;
- if (this.I && !this.m) for (let c in this.l) {
- b = this.l[c];
- const d = b.indexOf(a);
- -1 !== d && (1 < b.length ? b.splice(d, 1) : delete this.l[c]);
- }
- this.store && delete this.store[a];
- delete this.register[a];
- }
- return this;
- };
- t.search = function(a, b, c, d) {
- c || (!b && D(a) ? (c = a, a = "") : D(b) && (c = b, b = 0));
- let e = [], f = [], h, g, k, m, n, w, q = 0;
- if (c) if (c.constructor === Array) k = c, c = null;
- else {
- a = c.query || a;
- k = (h = c.pluck) || c.index || c.field;
- m = c.tag;
- g = this.store && c.enrich;
- n = "and" === c.bool;
- b = c.limit || b || 100;
- w = c.offset || 0;
- if (m && (C(m) && (m = [m]), !a)) {
- for (let l = 0, p; l < m.length; l++) if (p = va.call(this, m[l], b, w, g)) e[e.length] = p, q++;
- return q ? e : [];
- }
- C(k) && (k = [k]);
- }
- k || (k = this.h);
- n = n && (1 < k.length || m && 1 < m.length);
- const r = !d && (this.o || this.async) && [];
- for (let l = 0, p, A, B; l < k.length; l++) {
- let z;
- A = k[l];
- C(A) || (z = A, A = z.field, a = z.query || a, b = z.limit || b, g = z.enrich || g);
- if (r) r[l] = this.index[A].searchAsync(a, b, z || c);
- else {
- d ? p = d[l] : p = this.index[A].search(a, b, z || c);
- B = p && p.length;
- if (m && B) {
- const y = [];
- let H = 0;
- n && (y[0] = [p]);
- for (let W = 0, ma, R; W < m.length; W++) if (ma = m[W], B = (R = this.l[ma]) && R.length) H++, y[y.length] = n ? [R] : R;
- H && (p = n ? ja(y, b || 100, w || 0) : ka(p, y), B = p.length);
- }
- if (B) f[q] = A, e[q++] = p;
- else if (n) return [];
- }
- }
- if (r) {
- const l = this;
- return new Promise(function(p) {
- Promise.all(r).then(function(A) {
- p(l.search(
- a,
- b,
- c,
- A
- ));
- });
- });
- }
- if (!q) return [];
- if (h && (!g || !this.store)) return e[0];
- for (let l = 0, p; l < f.length; l++) {
- p = e[l];
- p.length && g && (p = wa.call(this, p));
- if (h) return p;
- e[l] = { field: f[l], result: p };
- }
- return e;
- };
- function va(a, b, c, d) {
- let e = this.l[a], f = e && e.length - c;
- if (f && 0 < f) {
- if (f > b || c) e = e.slice(c, c + b);
- d && (e = wa.call(this, e));
- return { tag: a, result: e };
- }
- }
- function wa(a) {
- const b = Array(a.length);
- for (let c = 0, d; c < a.length; c++) d = a[c], b[c] = { id: d, doc: this.store[d] };
- return b;
- }
- t.contain = function(a) {
- return !!this.register[a];
- };
- t.get = function(a) {
- return this.store[a];
- };
- t.set = function(a, b) {
- this.store[a] = b;
- return this;
- };
- t.searchCache = la;
- t.export = function(a, b, c, d, e, f) {
- let h;
- "undefined" === typeof f && (h = new Promise((g) => {
- f = g;
- }));
- e || (e = 0);
- d || (d = 0);
- if (d < this.h.length) {
- const g = this.h[d], k = this.index[g];
- b = this;
- setTimeout(function() {
- k.export(a, b, e ? g : "", d, e++, f) || (d++, e = 1, b.export(a, b, g, d, e, f));
- });
- } else {
- let g, k;
- switch (e) {
- case 1:
- g = "tag";
- k = this.l;
- c = null;
- break;
- case 2:
- g = "store";
- k = this.store;
- c = null;
- break;
- default:
- f();
- return;
- }
- oa(a, this, c, g, d, e, k, f);
- }
- return h;
- };
- t.import = function(a, b) {
- if (b) switch (C(b) && (b = JSON.parse(b)), a) {
- case "tag":
- this.l = b;
- break;
- case "reg":
- this.m = false;
- this.register = b;
- for (let d = 0, e; d < this.h.length; d++) e = this.index[this.h[d]], e.register = b, e.m = false;
- break;
- case "store":
- this.store = b;
- break;
- default:
- a = a.split(".");
- const c = a[0];
- a = a[1];
- c && a && this.index[c].import(a, b);
- }
- };
- ia(U.prototype);
- var ya = { encode: xa, F: false, G: "" };
- var za = [J("[\xE0\xE1\xE2\xE3\xE4\xE5]"), "a", J("[\xE8\xE9\xEA\xEB]"), "e", J("[\xEC\xED\xEE\xEF]"), "i", J("[\xF2\xF3\xF4\xF5\xF6\u0151]"), "o", J("[\xF9\xFA\xFB\xFC\u0171]"), "u", J("[\xFD\u0177\xFF]"), "y", J("\xF1"), "n", J("[\xE7c]"), "k", J("\xDF"), "s", J(" & "), " and "];
- function xa(a) {
- var b = a = "" + a;
- b.normalize && (b = b.normalize("NFD").replace(ca, ""));
- return F.call(this, b.toLowerCase(), !a.normalize && za);
- }
- var Ba = { encode: Aa, F: false, G: "strict" };
- var Ca = /[^a-z0-9]+/;
- var Da = { b: "p", v: "f", w: "f", z: "s", x: "s", "\xDF": "s", d: "t", n: "m", c: "k", g: "k", j: "k", q: "k", i: "e", y: "e", u: "o" };
- function Aa(a) {
- a = xa.call(this, a).join(" ");
- const b = [];
- if (a) {
- const c = a.split(Ca), d = c.length;
- for (let e = 0, f, h = 0; e < d; e++) if ((a = c[e]) && (!this.filter || !this.filter[a])) {
- f = a[0];
- let g = Da[f] || f, k = g;
- for (let m = 1; m < a.length; m++) {
- f = a[m];
- const n = Da[f] || f;
- n && n !== k && (g += n, k = n);
- }
- b[h++] = g;
- }
- }
- return b;
- }
- var Fa = { encode: Ea, F: false, G: "" };
- var Ga = [J("ae"), "a", J("oe"), "o", J("sh"), "s", J("th"), "t", J("ph"), "f", J("pf"), "f", J("(?![aeo])h(?![aeo])"), "", J("(?!^[aeo])h(?!^[aeo])"), ""];
- function Ea(a, b) {
- a && (a = Aa.call(this, a).join(" "), 2 < a.length && (a = G(a, Ga)), b || (1 < a.length && (a = da(a)), a && (a = a.split(" "))));
- return a || [];
- }
- var Ia = { encode: Ha, F: false, G: "" };
- var Ja = J("(?!\\b)[aeo]");
- function Ha(a) {
- a && (a = Ea.call(this, a, true), 1 < a.length && (a = a.replace(Ja, "")), 1 < a.length && (a = da(a)), a && (a = a.split(" ")));
- return a || [];
- }
- K["latin:default"] = fa;
- K["latin:simple"] = ya;
- K["latin:balance"] = Ba;
- K["latin:advanced"] = Fa;
- K["latin:extra"] = Ia;
- var flexsearch_bundle_module_min_default = { Index: N, Document: U, Worker: S, registerCharset: function(a, b) {
- K[a] = b;
- }, registerLanguage: function(a, b) {
- ha[a] = b;
- } };
-
- //
- (function() {
- "use strict";
- const index = new flexsearch_bundle_module_min_default.Document({
- tokenize: "forward",
- document: {
- id: "id",
- index: [
- {
- field: "title"
- },
- {
- field: "tags"
- },
- {
- field: "content"
- },
- {
- field: "date",
- tokenize: "strict",
- encode: false
- }
- ],
- store: ["title", "summary", "date", "permalink"]
- }
- });
- function showResults(items) {
- const template = document.querySelector("template").content;
- const fragment = document.createDocumentFragment();
- const results = document.querySelector(".search-results");
- results.textContent = "";
- const itemsLength = Object.keys(items).length;
- if (itemsLength === 0 && query.value === "") {
- document.querySelector(".search-no-results").classList.add("d-none");
- document.querySelector(".search-no-recent").classList.remove("d-none");
- } else if (itemsLength === 0 && query.value !== "") {
- document.querySelector(".search-no-recent").classList.add("d-none");
- const queryNoResults = document.querySelector(".query-no-results");
- queryNoResults.innerText = query.value;
- document.querySelector(".search-no-results").classList.remove("d-none");
- } else {
- document.querySelector(".search-no-recent").classList.add("d-none");
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- for (const id in items) {
- const item = items[id];
- const result = template.cloneNode(true);
- const a = result.querySelector("a");
- const time = result.querySelector("time");
- const content = result.querySelector(".content");
- a.innerHTML = item.title;
- a.href = item.permalink;
- time.innerText = item.date;
- content.innerHTML = item.summary;
- fragment.appendChild(result);
- }
- results.appendChild(fragment);
- }
- function doSearch() {
- const query2 = document.querySelector(".search-text").value.trim();
- const limit = 99;
- const results = index.search({
- query: query2,
- enrich: true,
- limit
- });
- const items = {};
- results.forEach(function(result) {
- result.result.forEach(function(r) {
- items[r.id] = r.doc;
- });
- });
- showResults(items);
- }
- function enableUI() {
- const searchform = document.querySelector(".search-form");
- searchform.addEventListener("submit", function(e) {
- e.preventDefault();
- doSearch();
- });
- searchform.addEventListener("input", function() {
- doSearch();
- });
- document.querySelector(".search-loading").classList.add("d-none");
- document.querySelector(".search-input").classList.remove("d-none");
- document.querySelector(".search-text").focus();
- }
- function buildIndex() {
- document.querySelector(".search-loading").classList.remove("d-none");
- fetch("/search-index.json").then(function(response) {
- return response.json();
- }).then(function(data) {
- data.forEach(function(item) {
- index.add(item);
- });
- });
- }
- buildIndex();
- enableUI();
- })();
-})();
-/*!
- * FlexSearch for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- * Based on https://github.com/frjo/hugo-theme-zen/blob/main/assets/js/search.js
- */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2ZsZXhzZWFyY2gvZGlzdC9mbGV4c2VhcmNoLmJ1bmRsZS5tb2R1bGUubWluLmpzIiwgIjxzdGRpbj4iXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKiFcbiAqIEZsZXhTZWFyY2guanMgdjAuNy40MSAoQnVuZGxlLm1vZHVsZSlcbiAqIEF1dGhvciBhbmQgQ29weXJpZ2h0OiBUaG9tYXMgV2lsa2VybGluZ1xuICogTGljZW5jZTogQXBhY2hlLTIuMFxuICogSG9zdGVkIGJ5IE5leHRhcHBzIEdtYkhcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXh0YXBwcy1kZS9mbGV4c2VhcmNoXG4gKi9cbnZhciB0O2Z1bmN0aW9uIHUoYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6ITB9ZnVuY3Rpb24gdihhKXtjb25zdCBiPUFycmF5KGEpO2ZvcihsZXQgYz0wO2M8YTtjKyspYltjXT14KCk7cmV0dXJuIGJ9ZnVuY3Rpb24geCgpe3JldHVybiBPYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGFhKGEsYil7cmV0dXJuIGIubGVuZ3RoLWEubGVuZ3RofWZ1bmN0aW9uIEMoYSl7cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBhfWZ1bmN0aW9uIEQoYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhfWZ1bmN0aW9uIEUoYSl7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGF9O2Z1bmN0aW9uIEYoYSxiKXt2YXIgYz1iYTtpZihhJiYoYiYmKGE9RyhhLGIpKSx0aGlzLkgmJihhPUcoYSx0aGlzLkgpKSx0aGlzLkomJjE8YS5sZW5ndGgmJihhPUcoYSx0aGlzLkopKSxjfHxcIlwiPT09Yykpe2I9YS5zcGxpdChjKTtpZih0aGlzLmZpbHRlcil7YT10aGlzLmZpbHRlcjtjPWIubGVuZ3RoO2NvbnN0IGQ9W107Zm9yKGxldCBlPTAsZj0wO2U8YztlKyspe2NvbnN0IGg9YltlXTtoJiYhYVtoXSYmKGRbZisrXT1oKX1hPWR9ZWxzZSBhPWI7cmV0dXJuIGF9cmV0dXJuIGF9Y29uc3QgYmE9L1tcXHB7Wn1cXHB7U31cXHB7UH1cXHB7Q31dKy91LGNhPS9bXFx1MDMwMC1cXHUwMzZmXS9nO1xuZnVuY3Rpb24gSShhLGIpe2NvbnN0IGM9T2JqZWN0LmtleXMoYSksZD1jLmxlbmd0aCxlPVtdO2xldCBmPVwiXCIsaD0wO2ZvcihsZXQgZz0wLGssbTtnPGQ7ZysrKWs9Y1tnXSwobT1hW2tdKT8oZVtoKytdPUooYj9cIig/IVxcXFxiKVwiK2srXCIoXFxcXGJ8XylcIjprKSxlW2grK109bSk6Zis9KGY/XCJ8XCI6XCJcIikraztmJiYoZVtoKytdPUooYj9cIig/IVxcXFxiKShcIitmK1wiKShcXFxcYnxfKVwiOlwiKFwiK2YrXCIpXCIpLGVbaF09XCJcIik7cmV0dXJuIGV9ZnVuY3Rpb24gRyhhLGIpe2ZvcihsZXQgYz0wLGQ9Yi5sZW5ndGg7YzxkJiYoYT1hLnJlcGxhY2UoYltjXSxiW2MrMV0pLGEpO2MrPTIpO3JldHVybiBhfWZ1bmN0aW9uIEooYSl7cmV0dXJuIG5ldyBSZWdFeHAoYSxcImdcIil9ZnVuY3Rpb24gZGEoYSl7bGV0IGI9XCJcIixjPVwiXCI7Zm9yKGxldCBkPTAsZT1hLmxlbmd0aCxmO2Q8ZTtkKyspKGY9YVtkXSkhPT1jJiYoYis9Yz1mKTtyZXR1cm4gYn07dmFyIGZhPXtlbmNvZGU6ZWEsRjohMSxHOlwiXCJ9O2Z1bmN0aW9uIGVhKGEpe3JldHVybiBGLmNhbGwodGhpcywoXCJcIithKS50b0xvd2VyQ2FzZSgpLCExKX07Y29uc3QgaGE9e30sSz17fTtmdW5jdGlvbiBpYShhKXtMKGEsXCJhZGRcIik7TChhLFwiYXBwZW5kXCIpO0woYSxcInNlYXJjaFwiKTtMKGEsXCJ1cGRhdGVcIik7TChhLFwicmVtb3ZlXCIpfWZ1bmN0aW9uIEwoYSxiKXthW2IrXCJBc3luY1wiXT1mdW5jdGlvbigpe2NvbnN0IGM9dGhpcyxkPWFyZ3VtZW50czt2YXIgZT1kW2QubGVuZ3RoLTFdO2xldCBmO0UoZSkmJihmPWUsZGVsZXRlIGRbZC5sZW5ndGgtMV0pO2U9bmV3IFByb21pc2UoZnVuY3Rpb24oaCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MuYXN5bmM9ITA7Y29uc3QgZz1jW2JdLmFwcGx5KGMsZCk7Yy5hc3luYz0hMTtoKGcpfSl9KTtyZXR1cm4gZj8oZS50aGVuKGYpLHRoaXMpOmV9fTtmdW5jdGlvbiBqYShhLGIsYyxkKXtjb25zdCBlPWEubGVuZ3RoO2xldCBmPVtdLGgsZyxrPTA7ZCYmKGQ9W10pO2ZvcihsZXQgbT1lLTE7MDw9bTttLS0pe2NvbnN0IG49YVttXSx3PW4ubGVuZ3RoLHE9eCgpO2xldCByPSFoO2ZvcihsZXQgbD0wO2w8dztsKyspe2NvbnN0IHA9bltsXSxBPXAubGVuZ3RoO2lmKEEpZm9yKGxldCBCPTAseix5O0I8QTtCKyspaWYoeT1wW0JdLGgpe2lmKGhbeV0pe2lmKCFtKWlmKGMpYy0tO2Vsc2UgaWYoZltrKytdPXksaz09PWIpcmV0dXJuIGY7aWYobXx8ZClxW3ldPTE7cj0hMH1pZihkJiYoej0oZ1t5XXx8MCkrMSxnW3ldPXosejxlKSl7Y29uc3QgSD1kW3otMl18fChkW3otMl09W10pO0hbSC5sZW5ndGhdPXl9fWVsc2UgcVt5XT0xfWlmKGQpaHx8KGc9cSk7ZWxzZSBpZighcilyZXR1cm5bXTtoPXF9aWYoZClmb3IobGV0IG09ZC5sZW5ndGgtMSxuLHc7MDw9bTttLS0pe249ZFttXTt3PW4ubGVuZ3RoO2ZvcihsZXQgcT0wLHI7cTx3O3ErKylpZihyPVxubltxXSwhaFtyXSl7aWYoYyljLS07ZWxzZSBpZihmW2srK109cixrPT09YilyZXR1cm4gZjtoW3JdPTF9fXJldHVybiBmfWZ1bmN0aW9uIGthKGEsYil7Y29uc3QgYz14KCksZD14KCksZT1bXTtmb3IobGV0IGY9MDtmPGEubGVuZ3RoO2YrKyljW2FbZl1dPTE7Zm9yKGxldCBmPTAsaDtmPGIubGVuZ3RoO2YrKyl7aD1iW2ZdO2ZvcihsZXQgZz0wLGs7ZzxoLmxlbmd0aDtnKyspaz1oW2ddLGNba10mJiFkW2tdJiYoZFtrXT0xLGVbZS5sZW5ndGhdPWspfXJldHVybiBlfTtmdW5jdGlvbiBNKGEpe3RoaXMubD0hMCE9PWEmJmE7dGhpcy5jYWNoZT14KCk7dGhpcy5oPVtdfWZ1bmN0aW9uIGxhKGEsYixjKXtEKGEpJiYoYT1hLnF1ZXJ5KTtsZXQgZD10aGlzLmNhY2hlLmdldChhKTtkfHwoZD10aGlzLnNlYXJjaChhLGIsYyksdGhpcy5jYWNoZS5zZXQoYSxkKSk7cmV0dXJuIGR9TS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuY2FjaGVbYV0pe3ZhciBjPXRoaXMuaC5sZW5ndGg7Yz09PXRoaXMubD9kZWxldGUgdGhpcy5jYWNoZVt0aGlzLmhbYy0xXV06YysrO2ZvcigtLWM7MDxjO2MtLSl0aGlzLmhbY109dGhpcy5oW2MtMV07dGhpcy5oWzBdPWF9dGhpcy5jYWNoZVthXT1ifTtNLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7Y29uc3QgYj10aGlzLmNhY2hlW2FdO2lmKHRoaXMubCYmYiYmKGE9dGhpcy5oLmluZGV4T2YoYSkpKXtjb25zdCBjPXRoaXMuaFthLTFdO3RoaXMuaFthLTFdPXRoaXMuaFthXTt0aGlzLmhbYV09Y31yZXR1cm4gYn07Y29uc3QgbmE9e21lbW9yeTp7Y2hhcnNldDpcImxhdGluOmV4dHJhXCIsRDozLEI6NCxtOiExfSxwZXJmb3JtYW5jZTp7RDozLEI6MyxzOiExLGNvbnRleHQ6e2RlcHRoOjIsRDoxfX0sbWF0Y2g6e2NoYXJzZXQ6XCJsYXRpbjpleHRyYVwiLEc6XCJyZXZlcnNlXCJ9LHNjb3JlOntjaGFyc2V0OlwibGF0aW46YWR2YW5jZWRcIixEOjIwLEI6Myxjb250ZXh0OntkZXB0aDozLEQ6OX19LFwiZGVmYXVsdFwiOnt9fTtmdW5jdGlvbiBvYShhLGIsYyxkLGUsZixoLGcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjb25zdCBrPWEoYz9jK1wiLlwiK2Q6ZCxKU09OLnN0cmluZ2lmeShoKSk7ayYmay50aGVuP2sudGhlbihmdW5jdGlvbigpe2IuZXhwb3J0KGEsYixjLGUsZisxLGcpfSk6Yi5leHBvcnQoYSxiLGMsZSxmKzEsZyl9KX07ZnVuY3Rpb24gTihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE4pKXJldHVybiBuZXcgTihhKTt2YXIgYztpZihhKXtDKGEpP2E9bmFbYV06KGM9YS5wcmVzZXQpJiYoYT1PYmplY3QuYXNzaWduKHt9LGNbY10sYSkpO2M9YS5jaGFyc2V0O3ZhciBkPWEubGFuZztDKGMpJiYoLTE9PT1jLmluZGV4T2YoXCI6XCIpJiYoYys9XCI6ZGVmYXVsdFwiKSxjPUtbY10pO0MoZCkmJihkPWhhW2RdKX1lbHNlIGE9e307bGV0IGUsZixoPWEuY29udGV4dHx8e307dGhpcy5lbmNvZGU9YS5lbmNvZGV8fGMmJmMuZW5jb2RlfHxlYTt0aGlzLnJlZ2lzdGVyPWJ8fHgoKTt0aGlzLkQ9ZT1hLnJlc29sdXRpb258fDk7dGhpcy5HPWI9YyYmYy5HfHxhLnRva2VuaXplfHxcInN0cmljdFwiO3RoaXMuZGVwdGg9XCJzdHJpY3RcIj09PWImJmguZGVwdGg7dGhpcy5sPXUoaC5iaWRpcmVjdGlvbmFsKTt0aGlzLnM9Zj11KGEub3B0aW1pemUpO3RoaXMubT11KGEuZmFzdHVwZGF0ZSk7dGhpcy5CPWEubWlubGVuZ3RofHwxO3RoaXMuQz1cbmEuYm9vc3Q7dGhpcy5tYXA9Zj92KGUpOngoKTt0aGlzLkE9ZT1oLnJlc29sdXRpb258fDE7dGhpcy5oPWY/dihlKTp4KCk7dGhpcy5GPWMmJmMuRnx8YS5ydGw7dGhpcy5IPShiPWEubWF0Y2hlcnx8ZCYmZC5IKSYmSShiLCExKTt0aGlzLko9KGI9YS5zdGVtbWVyfHxkJiZkLkopJiZJKGIsITApO2lmKGM9Yj1hLmZpbHRlcnx8ZCYmZC5maWx0ZXIpe2M9YjtkPXgoKTtmb3IobGV0IGc9MCxrPWMubGVuZ3RoO2c8aztnKyspZFtjW2ddXT0xO2M9ZH10aGlzLmZpbHRlcj1jO3RoaXMuY2FjaGU9KGI9YS5jYWNoZSkmJm5ldyBNKGIpfXQ9Ti5wcm90b3R5cGU7dC5hcHBlbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hZGQoYSxiLCEwKX07XG50LmFkZD1mdW5jdGlvbihhLGIsYyxkKXtpZihiJiYoYXx8MD09PWEpKXtpZighZCYmIWMmJnRoaXMucmVnaXN0ZXJbYV0pcmV0dXJuIHRoaXMudXBkYXRlKGEsYik7Yj10aGlzLmVuY29kZShiKTtpZihkPWIubGVuZ3RoKXtjb25zdCBtPXgoKSxuPXgoKSx3PXRoaXMuZGVwdGgscT10aGlzLkQ7Zm9yKGxldCByPTA7cjxkO3IrKyl7bGV0IGw9Ylt0aGlzLkY/ZC0xLXI6cl07dmFyIGU9bC5sZW5ndGg7aWYobCYmZT49dGhpcy5CJiYod3x8IW5bbF0pKXt2YXIgZj1PKHEsZCxyKSxoPVwiXCI7c3dpdGNoKHRoaXMuRyl7Y2FzZSBcImZ1bGxcIjppZigyPGUpe2ZvcihmPTA7ZjxlO2YrKylmb3IodmFyIGc9ZTtnPmY7Zy0tKWlmKGctZj49dGhpcy5CKXt2YXIgaz1PKHEsZCxyLGUsZik7aD1sLnN1YnN0cmluZyhmLGcpO1AodGhpcyxuLGgsayxhLGMpfWJyZWFrfWNhc2UgXCJyZXZlcnNlXCI6aWYoMTxlKXtmb3IoZz1lLTE7MDxnO2ctLSloPWxbZ10raCxoLmxlbmd0aD49dGhpcy5CJiZQKHRoaXMsbixcbmgsTyhxLGQscixlLGcpLGEsYyk7aD1cIlwifWNhc2UgXCJmb3J3YXJkXCI6aWYoMTxlKXtmb3IoZz0wO2c8ZTtnKyspaCs9bFtnXSxoLmxlbmd0aD49dGhpcy5CJiZQKHRoaXMsbixoLGYsYSxjKTticmVha31kZWZhdWx0OmlmKHRoaXMuQyYmKGY9TWF0aC5taW4oZi90aGlzLkMoYixsLHIpfDAscS0xKSksUCh0aGlzLG4sbCxmLGEsYyksdyYmMTxkJiZyPGQtMSlmb3IoZT14KCksaD10aGlzLkEsZj1sLGc9TWF0aC5taW4odysxLGQtciksZVtmXT0xLGs9MTtrPGc7aysrKWlmKChsPWJbdGhpcy5GP2QtMS1yLWs6citrXSkmJmwubGVuZ3RoPj10aGlzLkImJiFlW2xdKXtlW2xdPTE7Y29uc3QgcD10aGlzLmwmJmw+ZjtQKHRoaXMsbSxwP2Y6bCxPKGgrKGQvMj5oPzA6MSksZCxyLGctMSxrLTEpLGEsYyxwP2w6Zil9fX19dGhpcy5tfHwodGhpcy5yZWdpc3RlclthXT0xKX19cmV0dXJuIHRoaXN9O1xuZnVuY3Rpb24gTyhhLGIsYyxkLGUpe3JldHVybiBjJiYxPGE/YisoZHx8MCk8PWE/YysoZXx8MCk6KGEtMSkvKGIrKGR8fDApKSooYysoZXx8MCkpKzF8MDowfWZ1bmN0aW9uIFAoYSxiLGMsZCxlLGYsaCl7bGV0IGc9aD9hLmg6YS5tYXA7aWYoIWJbY118fGgmJiFiW2NdW2hdKWEucyYmKGc9Z1tkXSksaD8oYj1iW2NdfHwoYltjXT14KCkpLGJbaF09MSxnPWdbaF18fChnW2hdPXgoKSkpOmJbY109MSxnPWdbY118fChnW2NdPVtdKSxhLnN8fChnPWdbZF18fChnW2RdPVtdKSksZiYmZy5pbmNsdWRlcyhlKXx8KGdbZy5sZW5ndGhdPWUsYS5tJiYoYT1hLnJlZ2lzdGVyW2VdfHwoYS5yZWdpc3RlcltlXT1bXSksYVthLmxlbmd0aF09ZykpfVxudC5zZWFyY2g9ZnVuY3Rpb24oYSxiLGMpe2N8fCghYiYmRChhKT8oYz1hLGE9Yy5xdWVyeSk6RChiKSYmKGM9YikpO2xldCBkPVtdLGU7bGV0IGYsaD0wO2lmKGMpe2E9Yy5xdWVyeXx8YTtiPWMubGltaXQ7aD1jLm9mZnNldHx8MDt2YXIgZz1jLmNvbnRleHQ7Zj1jLnN1Z2dlc3R9aWYoYSYmKGE9dGhpcy5lbmNvZGUoXCJcIithKSxlPWEubGVuZ3RoLDE8ZSkpe2M9eCgpO3ZhciBrPVtdO2ZvcihsZXQgbj0wLHc9MCxxO248ZTtuKyspaWYoKHE9YVtuXSkmJnEubGVuZ3RoPj10aGlzLkImJiFjW3FdKWlmKHRoaXMuc3x8Znx8dGhpcy5tYXBbcV0pa1t3KytdPXEsY1txXT0xO2Vsc2UgcmV0dXJuIGQ7YT1rO2U9YS5sZW5ndGh9aWYoIWUpcmV0dXJuIGQ7Ynx8KGI9MTAwKTtnPXRoaXMuZGVwdGgmJjE8ZSYmITEhPT1nO2M9MDtsZXQgbTtnPyhtPWFbMF0sYz0xKToxPGUmJmEuc29ydChhYSk7Zm9yKGxldCBuLHc7YzxlO2MrKyl7dz1hW2NdO2c/KG49cGEodGhpcyxkLGYsYixoLDI9PT1lLHcsXG5tKSxmJiYhMT09PW4mJmQubGVuZ3RofHwobT13KSk6bj1wYSh0aGlzLGQsZixiLGgsMT09PWUsdyk7aWYobilyZXR1cm4gbjtpZihmJiZjPT09ZS0xKXtrPWQubGVuZ3RoO2lmKCFrKXtpZihnKXtnPTA7Yz0tMTtjb250aW51ZX1yZXR1cm4gZH1pZigxPT09aylyZXR1cm4gcWEoZFswXSxiLGgpfX1yZXR1cm4gamEoZCxiLGgsZil9O1xuZnVuY3Rpb24gcGEoYSxiLGMsZCxlLGYsaCxnKXtsZXQgaz1bXSxtPWc/YS5oOmEubWFwO2Euc3x8KG09cmEobSxoLGcsYS5sKSk7aWYobSl7bGV0IG49MDtjb25zdCB3PU1hdGgubWluKG0ubGVuZ3RoLGc/YS5BOmEuRCk7Zm9yKGxldCBxPTAscj0wLGwscDtxPHc7cSsrKWlmKGw9bVtxXSlpZihhLnMmJihsPXJhKGwsaCxnLGEubCkpLGUmJmwmJmYmJihwPWwubGVuZ3RoLHA8PWU/KGUtPXAsbD1udWxsKToobD1sLnNsaWNlKGUpLGU9MCkpLGwmJihrW24rK109bCxmJiYocis9bC5sZW5ndGgscj49ZCkpKWJyZWFrO2lmKG4pe2lmKGYpcmV0dXJuIHFhKGssZCwwKTtiW2IubGVuZ3RoXT1rO3JldHVybn19cmV0dXJuIWMmJmt9ZnVuY3Rpb24gcWEoYSxiLGMpe2E9MT09PWEubGVuZ3RoP2FbMF06W10uY29uY2F0LmFwcGx5KFtdLGEpO3JldHVybiBjfHxhLmxlbmd0aD5iP2Euc2xpY2UoYyxjK2IpOmF9XG5mdW5jdGlvbiByYShhLGIsYyxkKXtjPyhkPWQmJmI+YyxhPShhPWFbZD9iOmNdKSYmYVtkP2M6Yl0pOmE9YVtiXTtyZXR1cm4gYX10LmNvbnRhaW49ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnJlZ2lzdGVyW2FdfTt0LnVwZGF0ZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnJlbW92ZShhKS5hZGQoYSxiKX07XG50LnJlbW92ZT1mdW5jdGlvbihhLGIpe2NvbnN0IGM9dGhpcy5yZWdpc3RlclthXTtpZihjKXtpZih0aGlzLm0pZm9yKGxldCBkPTAsZTtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZS5zcGxpY2UoZS5pbmRleE9mKGEpLDEpO2Vsc2UgUSh0aGlzLm1hcCxhLHRoaXMuRCx0aGlzLnMpLHRoaXMuZGVwdGgmJlEodGhpcy5oLGEsdGhpcy5BLHRoaXMucyk7Ynx8ZGVsZXRlIHRoaXMucmVnaXN0ZXJbYV07aWYodGhpcy5jYWNoZSl7Yj10aGlzLmNhY2hlO2ZvcihsZXQgZD0wLGUsZjtkPGIuaC5sZW5ndGg7ZCsrKWY9Yi5oW2RdLGU9Yi5jYWNoZVtmXSxlLmluY2x1ZGVzKGEpJiYoYi5oLnNwbGljZShkLS0sMSksZGVsZXRlIGIuY2FjaGVbZl0pfX1yZXR1cm4gdGhpc307XG5mdW5jdGlvbiBRKGEsYixjLGQsZSl7bGV0IGY9MDtpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpaWYoZSliPWEuaW5kZXhPZihiKSwtMSE9PWI/MTxhLmxlbmd0aCYmKGEuc3BsaWNlKGIsMSksZisrKTpmKys7ZWxzZXtlPU1hdGgubWluKGEubGVuZ3RoLGMpO2ZvcihsZXQgaD0wLGc7aDxlO2grKylpZihnPWFbaF0pZj1RKGcsYixjLGQsZSksZHx8Znx8ZGVsZXRlIGFbaF19ZWxzZSBmb3IobGV0IGggaW4gYSkoZj1RKGFbaF0sYixjLGQsZSkpfHxkZWxldGUgYVtoXTtyZXR1cm4gZn10LnNlYXJjaENhY2hlPWxhO1xudC5leHBvcnQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2xldCBoPSEwO1widW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmKGg9bmV3IFByb21pc2UobT0+e2Y9bX0pKTtsZXQgZyxrO3N3aXRjaChlfHwoZT0wKSl7Y2FzZSAwOmc9XCJyZWdcIjtpZih0aGlzLm0pe2s9eCgpO2ZvcihsZXQgbSBpbiB0aGlzLnJlZ2lzdGVyKWtbbV09MX1lbHNlIGs9dGhpcy5yZWdpc3RlcjticmVhaztjYXNlIDE6Zz1cImNmZ1wiO2s9e2RvYzowLG9wdDp0aGlzLnM/MTowfTticmVhaztjYXNlIDI6Zz1cIm1hcFwiO2s9dGhpcy5tYXA7YnJlYWs7Y2FzZSAzOmc9XCJjdHhcIjtrPXRoaXMuaDticmVhaztkZWZhdWx0OlwidW5kZWZpbmVkXCI9PT10eXBlb2YgYyYmZiYmZigpO3JldHVybn1vYShhLGJ8fHRoaXMsYyxnLGQsZSxrLGYpO3JldHVybiBofTtcbnQuaW1wb3J0PWZ1bmN0aW9uKGEsYil7aWYoYilzd2l0Y2goQyhiKSYmKGI9SlNPTi5wYXJzZShiKSksYSl7Y2FzZSBcImNmZ1wiOnRoaXMucz0hIWIub3B0O2JyZWFrO2Nhc2UgXCJyZWdcIjp0aGlzLm09ITE7dGhpcy5yZWdpc3Rlcj1iO2JyZWFrO2Nhc2UgXCJtYXBcIjp0aGlzLm1hcD1iO2JyZWFrO2Nhc2UgXCJjdHhcIjp0aGlzLmg9Yn19O2lhKE4ucHJvdG90eXBlKTtmdW5jdGlvbiBzYShhKXthPWEuZGF0YTt2YXIgYj1zZWxmLl9pbmRleDtjb25zdCBjPWEuYXJnczt2YXIgZD1hLnRhc2s7c3dpdGNoKGQpe2Nhc2UgXCJpbml0XCI6ZD1hLm9wdGlvbnN8fHt9O2E9YS5mYWN0b3J5O2I9ZC5lbmNvZGU7ZC5jYWNoZT0hMTtiJiYwPT09Yi5pbmRleE9mKFwiZnVuY3Rpb25cIikmJihkLmVuY29kZT1GdW5jdGlvbihcInJldHVybiBcIitiKSgpKTthPyhGdW5jdGlvbihcInJldHVybiBcIithKSgpKHNlbGYpLHNlbGYuX2luZGV4PW5ldyBzZWxmLkZsZXhTZWFyY2guSW5kZXgoZCksZGVsZXRlIHNlbGYuRmxleFNlYXJjaCk6c2VsZi5faW5kZXg9bmV3IE4oZCk7YnJlYWs7ZGVmYXVsdDphPWEuaWQsYj1iW2RdLmFwcGx5KGIsYykscG9zdE1lc3NhZ2UoXCJzZWFyY2hcIj09PWQ/e2lkOmEsbXNnOmJ9OntpZDphfSl9fTtsZXQgdGE9MDtmdW5jdGlvbiBTKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMpKXJldHVybiBuZXcgUyhhKTt2YXIgYjthP0UoYj1hLmVuY29kZSkmJihhLmVuY29kZT1iLnRvU3RyaW5nKCkpOmE9e307KGI9KHNlbGZ8fHdpbmRvdykuX2ZhY3RvcnkpJiYoYj1iLnRvU3RyaW5nKCkpO2NvbnN0IGM9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cmJnNlbGYuZXhwb3J0cyxkPXRoaXM7dGhpcy5vPXVhKGIsYyxhLndvcmtlcik7dGhpcy5oPXgoKTtpZih0aGlzLm8pe2lmKGMpdGhpcy5vLm9uKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGUpe2QuaFtlLmlkXShlLm1zZyk7ZGVsZXRlIGQuaFtlLmlkXX0pO2Vsc2UgdGhpcy5vLm9ubWVzc2FnZT1mdW5jdGlvbihlKXtlPWUuZGF0YTtkLmhbZS5pZF0oZS5tc2cpO2RlbGV0ZSBkLmhbZS5pZF19O3RoaXMuby5wb3N0TWVzc2FnZSh7dGFzazpcImluaXRcIixmYWN0b3J5OmIsb3B0aW9uczphfSl9fVQoXCJhZGRcIik7VChcImFwcGVuZFwiKTtUKFwic2VhcmNoXCIpO1xuVChcInVwZGF0ZVwiKTtUKFwicmVtb3ZlXCIpO2Z1bmN0aW9uIFQoYSl7Uy5wcm90b3R5cGVbYV09Uy5wcm90b3R5cGVbYStcIkFzeW5jXCJdPWZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLGM9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO3ZhciBkPWNbYy5sZW5ndGgtMV07bGV0IGU7RShkKSYmKGU9ZCxjLnNwbGljZShjLmxlbmd0aC0xLDEpKTtkPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGYpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLmhbKyt0YV09ZjtiLm8ucG9zdE1lc3NhZ2Uoe3Rhc2s6YSxpZDp0YSxhcmdzOmN9KX0pfSk7cmV0dXJuIGU/KGQudGhlbihlKSx0aGlzKTpkfX1cbmZ1bmN0aW9uIHVhKGEsYixjKXtsZXQgZDt0cnl7ZD1iP25ldyAocmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpW1wiV29ya2VyXCJdKShfX2Rpcm5hbWUgKyBcIi9ub2RlL25vZGUuanNcIik6YT9uZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1wib25tZXNzYWdlPVwiK3NhLnRvU3RyaW5nKCldLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpOm5ldyBXb3JrZXIoQyhjKT9jOlwid29ya2VyL3dvcmtlci5qc1wiLHt0eXBlOlwibW9kdWxlXCJ9KX1jYXRjaChlKXt9cmV0dXJuIGR9O2Z1bmN0aW9uIFUoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVSkpcmV0dXJuIG5ldyBVKGEpO3ZhciBiPWEuZG9jdW1lbnR8fGEuZG9jfHxhLGM7dGhpcy5LPVtdO3RoaXMuaD1bXTt0aGlzLkE9W107dGhpcy5yZWdpc3Rlcj14KCk7dGhpcy5rZXk9KGM9Yi5rZXl8fGIuaWQpJiZWKGMsdGhpcy5BKXx8XCJpZFwiO3RoaXMubT11KGEuZmFzdHVwZGF0ZSk7dGhpcy5DPShjPWIuc3RvcmUpJiYhMCE9PWMmJltdO3RoaXMuc3RvcmU9YyYmeCgpO3RoaXMuST0oYz1iLnRhZykmJlYoYyx0aGlzLkEpO3RoaXMubD1jJiZ4KCk7dGhpcy5jYWNoZT0oYz1hLmNhY2hlKSYmbmV3IE0oYyk7YS5jYWNoZT0hMTt0aGlzLm89YS53b3JrZXI7dGhpcy5hc3luYz0hMTtjPXgoKTtsZXQgZD1iLmluZGV4fHxiLmZpZWxkfHxiO0MoZCkmJihkPVtkXSk7Zm9yKGxldCBlPTAsZixoO2U8ZC5sZW5ndGg7ZSsrKWY9ZFtlXSxDKGYpfHwoaD1mLGY9Zi5maWVsZCksaD1EKGgpP09iamVjdC5hc3NpZ24oe30sYSxoKTphLFxudGhpcy5vJiYoY1tmXT1uZXcgUyhoKSxjW2ZdLm98fCh0aGlzLm89ITEpKSx0aGlzLm98fChjW2ZdPW5ldyBOKGgsdGhpcy5yZWdpc3RlcikpLHRoaXMuS1tlXT1WKGYsdGhpcy5BKSx0aGlzLmhbZV09ZjtpZih0aGlzLkMpZm9yKGE9Yi5zdG9yZSxDKGEpJiYoYT1bYV0pLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLkNbYl09VihhW2JdLHRoaXMuQSk7dGhpcy5pbmRleD1jfWZ1bmN0aW9uIFYoYSxiKXtjb25zdCBjPWEuc3BsaXQoXCI6XCIpO2xldCBkPTA7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKyspYT1jW2VdLDA8PWEuaW5kZXhPZihcIltdXCIpJiYoYT1hLnN1YnN0cmluZygwLGEubGVuZ3RoLTIpKSYmKGJbZF09ITApLGEmJihjW2QrK109YSk7ZDxjLmxlbmd0aCYmKGMubGVuZ3RoPWQpO3JldHVybiAxPGQ/YzpjWzBdfWZ1bmN0aW9uIFgoYSxiKXtpZihDKGIpKWE9YVtiXTtlbHNlIGZvcihsZXQgYz0wO2EmJmM8Yi5sZW5ndGg7YysrKWE9YVtiW2NdXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIFkoYSxiLGMsZCxlKXthPWFbZV07aWYoZD09PWMubGVuZ3RoLTEpYltlXT1hO2Vsc2UgaWYoYSlpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKGI9YltlXT1BcnJheShhLmxlbmd0aCksZT0wO2U8YS5sZW5ndGg7ZSsrKVkoYSxiLGMsZCxlKTtlbHNlIGI9YltlXXx8KGJbZV09eCgpKSxlPWNbKytkXSxZKGEsYixjLGQsZSl9ZnVuY3Rpb24gWihhLGIsYyxkLGUsZixoLGcpe2lmKGE9YVtoXSlpZihkPT09Yi5sZW5ndGgtMSl7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtpZihjW2RdKXtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWUuYWRkKGYsYVtiXSwhMCwhMCk7cmV0dXJufWE9YS5qb2luKFwiIFwiKX1lLmFkZChmLGEsZywhMCl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKGg9MDtoPGEubGVuZ3RoO2grKylaKGEsYixjLGQsZSxmLGgsZyk7ZWxzZSBoPWJbKytkXSxaKGEsYixjLGQsZSxmLGgsZyl9dD1VLnByb3RvdHlwZTtcbnQuYWRkPWZ1bmN0aW9uKGEsYixjKXtEKGEpJiYoYj1hLGE9WChiLHRoaXMua2V5KSk7aWYoYiYmKGF8fDA9PT1hKSl7aWYoIWMmJnRoaXMucmVnaXN0ZXJbYV0pcmV0dXJuIHRoaXMudXBkYXRlKGEsYik7Zm9yKGxldCBkPTAsZSxmO2Q8dGhpcy5oLmxlbmd0aDtkKyspZj10aGlzLmhbZF0sZT10aGlzLktbZF0sQyhlKSYmKGU9W2VdKSxaKGIsZSx0aGlzLkEsMCx0aGlzLmluZGV4W2ZdLGEsZVswXSxjKTtpZih0aGlzLkkpe2xldCBkPVgoYix0aGlzLkkpLGU9eCgpO0MoZCkmJihkPVtkXSk7Zm9yKGxldCBmPTAsaCxnO2Y8ZC5sZW5ndGg7ZisrKWlmKGg9ZFtmXSwhZVtoXSYmKGVbaF09MSxnPXRoaXMubFtoXXx8KHRoaXMubFtoXT1bXSksIWN8fCFnLmluY2x1ZGVzKGEpKSlpZihnW2cubGVuZ3RoXT1hLHRoaXMubSl7Y29uc3Qgaz10aGlzLnJlZ2lzdGVyW2FdfHwodGhpcy5yZWdpc3RlclthXT1bXSk7a1trLmxlbmd0aF09Z319aWYodGhpcy5zdG9yZSYmKCFjfHwhdGhpcy5zdG9yZVthXSkpe2xldCBkO1xuaWYodGhpcy5DKXtkPXgoKTtmb3IobGV0IGU9MCxmO2U8dGhpcy5DLmxlbmd0aDtlKyspZj10aGlzLkNbZV0sQyhmKT9kW2ZdPWJbZl06WShiLGQsZiwwLGZbMF0pfXRoaXMuc3RvcmVbYV09ZHx8Yn19cmV0dXJuIHRoaXN9O3QuYXBwZW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYWRkKGEsYiwhMCl9O3QudXBkYXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucmVtb3ZlKGEpLmFkZChhLGIpfTtcbnQucmVtb3ZlPWZ1bmN0aW9uKGEpe0QoYSkmJihhPVgoYSx0aGlzLmtleSkpO2lmKHRoaXMucmVnaXN0ZXJbYV0pe2Zvcih2YXIgYj0wO2I8dGhpcy5oLmxlbmd0aCYmKHRoaXMuaW5kZXhbdGhpcy5oW2JdXS5yZW1vdmUoYSwhdGhpcy5vKSwhdGhpcy5tKTtiKyspO2lmKHRoaXMuSSYmIXRoaXMubSlmb3IobGV0IGMgaW4gdGhpcy5sKXtiPXRoaXMubFtjXTtjb25zdCBkPWIuaW5kZXhPZihhKTstMSE9PWQmJigxPGIubGVuZ3RoP2Iuc3BsaWNlKGQsMSk6ZGVsZXRlIHRoaXMubFtjXSl9dGhpcy5zdG9yZSYmZGVsZXRlIHRoaXMuc3RvcmVbYV07ZGVsZXRlIHRoaXMucmVnaXN0ZXJbYV19cmV0dXJuIHRoaXN9O1xudC5zZWFyY2g9ZnVuY3Rpb24oYSxiLGMsZCl7Y3x8KCFiJiZEKGEpPyhjPWEsYT1cIlwiKTpEKGIpJiYoYz1iLGI9MCkpO2xldCBlPVtdLGY9W10saCxnLGssbSxuLHcscT0wO2lmKGMpaWYoYy5jb25zdHJ1Y3Rvcj09PUFycmF5KWs9YyxjPW51bGw7ZWxzZXthPWMucXVlcnl8fGE7az0oaD1jLnBsdWNrKXx8Yy5pbmRleHx8Yy5maWVsZDttPWMudGFnO2c9dGhpcy5zdG9yZSYmYy5lbnJpY2g7bj1cImFuZFwiPT09Yy5ib29sO2I9Yy5saW1pdHx8Ynx8MTAwO3c9Yy5vZmZzZXR8fDA7aWYobSYmKEMobSkmJihtPVttXSksIWEpKXtmb3IobGV0IGw9MCxwO2w8bS5sZW5ndGg7bCsrKWlmKHA9dmEuY2FsbCh0aGlzLG1bbF0sYix3LGcpKWVbZS5sZW5ndGhdPXAscSsrO3JldHVybiBxP2U6W119QyhrKSYmKGs9W2tdKX1rfHwoaz10aGlzLmgpO249biYmKDE8ay5sZW5ndGh8fG0mJjE8bS5sZW5ndGgpO2NvbnN0IHI9IWQmJih0aGlzLm98fHRoaXMuYXN5bmMpJiZbXTtmb3IobGV0IGw9MCxwLEEsQjtsPFxuay5sZW5ndGg7bCsrKXtsZXQgejtBPWtbbF07QyhBKXx8KHo9QSxBPXouZmllbGQsYT16LnF1ZXJ5fHxhLGI9ei5saW1pdHx8YixnPXouZW5yaWNofHxnKTtpZihyKXJbbF09dGhpcy5pbmRleFtBXS5zZWFyY2hBc3luYyhhLGIsenx8Yyk7ZWxzZXtkP3A9ZFtsXTpwPXRoaXMuaW5kZXhbQV0uc2VhcmNoKGEsYix6fHxjKTtCPXAmJnAubGVuZ3RoO2lmKG0mJkIpe2NvbnN0IHk9W107bGV0IEg9MDtuJiYoeVswXT1bcF0pO2ZvcihsZXQgVz0wLG1hLFI7VzxtLmxlbmd0aDtXKyspaWYobWE9bVtXXSxCPShSPXRoaXMubFttYV0pJiZSLmxlbmd0aClIKysseVt5Lmxlbmd0aF09bj9bUl06UjtIJiYocD1uP2phKHksYnx8MTAwLHd8fDApOmthKHAseSksQj1wLmxlbmd0aCl9aWYoQilmW3FdPUEsZVtxKytdPXA7ZWxzZSBpZihuKXJldHVybltdfX1pZihyKXtjb25zdCBsPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHApe1Byb21pc2UuYWxsKHIpLnRoZW4oZnVuY3Rpb24oQSl7cChsLnNlYXJjaChhLFxuYixjLEEpKX0pfSl9aWYoIXEpcmV0dXJuW107aWYoaCYmKCFnfHwhdGhpcy5zdG9yZSkpcmV0dXJuIGVbMF07Zm9yKGxldCBsPTAscDtsPGYubGVuZ3RoO2wrKyl7cD1lW2xdO3AubGVuZ3RoJiZnJiYocD13YS5jYWxsKHRoaXMscCkpO2lmKGgpcmV0dXJuIHA7ZVtsXT17ZmllbGQ6ZltsXSxyZXN1bHQ6cH19cmV0dXJuIGV9O2Z1bmN0aW9uIHZhKGEsYixjLGQpe2xldCBlPXRoaXMubFthXSxmPWUmJmUubGVuZ3RoLWM7aWYoZiYmMDxmKXtpZihmPmJ8fGMpZT1lLnNsaWNlKGMsYytiKTtkJiYoZT13YS5jYWxsKHRoaXMsZSkpO3JldHVybnt0YWc6YSxyZXN1bHQ6ZX19fWZ1bmN0aW9uIHdhKGEpe2NvbnN0IGI9QXJyYXkoYS5sZW5ndGgpO2ZvcihsZXQgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGJbY109e2lkOmQsZG9jOnRoaXMuc3RvcmVbZF19O3JldHVybiBifXQuY29udGFpbj1mdW5jdGlvbihhKXtyZXR1cm4hIXRoaXMucmVnaXN0ZXJbYV19O3QuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0b3JlW2FdfTtcbnQuc2V0PWZ1bmN0aW9uKGEsYil7dGhpcy5zdG9yZVthXT1iO3JldHVybiB0aGlzfTt0LnNlYXJjaENhY2hlPWxhO3QuZXhwb3J0PWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtsZXQgaDtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGYmJihoPW5ldyBQcm9taXNlKGc9PntmPWd9KSk7ZXx8KGU9MCk7ZHx8KGQ9MCk7aWYoZDx0aGlzLmgubGVuZ3RoKXtjb25zdCBnPXRoaXMuaFtkXSxrPXRoaXMuaW5kZXhbZ107Yj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLmV4cG9ydChhLGIsZT9nOlwiXCIsZCxlKyssZil8fChkKyssZT0xLGIuZXhwb3J0KGEsYixnLGQsZSxmKSl9KX1lbHNle2xldCBnLGs7c3dpdGNoKGUpe2Nhc2UgMTpnPVwidGFnXCI7az10aGlzLmw7Yz1udWxsO2JyZWFrO2Nhc2UgMjpnPVwic3RvcmVcIjtrPXRoaXMuc3RvcmU7Yz1udWxsO2JyZWFrO2RlZmF1bHQ6ZigpO3JldHVybn1vYShhLHRoaXMsYyxnLGQsZSxrLGYpfXJldHVybiBofTtcbnQuaW1wb3J0PWZ1bmN0aW9uKGEsYil7aWYoYilzd2l0Y2goQyhiKSYmKGI9SlNPTi5wYXJzZShiKSksYSl7Y2FzZSBcInRhZ1wiOnRoaXMubD1iO2JyZWFrO2Nhc2UgXCJyZWdcIjp0aGlzLm09ITE7dGhpcy5yZWdpc3Rlcj1iO2ZvcihsZXQgZD0wLGU7ZDx0aGlzLmgubGVuZ3RoO2QrKyllPXRoaXMuaW5kZXhbdGhpcy5oW2RdXSxlLnJlZ2lzdGVyPWIsZS5tPSExO2JyZWFrO2Nhc2UgXCJzdG9yZVwiOnRoaXMuc3RvcmU9YjticmVhaztkZWZhdWx0OmE9YS5zcGxpdChcIi5cIik7Y29uc3QgYz1hWzBdO2E9YVsxXTtjJiZhJiZ0aGlzLmluZGV4W2NdLmltcG9ydChhLGIpfX07aWEoVS5wcm90b3R5cGUpO3ZhciB5YT17ZW5jb2RlOnhhLEY6ITEsRzpcIlwifTtjb25zdCB6YT1bSihcIltcXHUwMGUwXFx1MDBlMVxcdTAwZTJcXHUwMGUzXFx1MDBlNFxcdTAwZTVdXCIpLFwiYVwiLEooXCJbXFx1MDBlOFxcdTAwZTlcXHUwMGVhXFx1MDBlYl1cIiksXCJlXCIsSihcIltcXHUwMGVjXFx1MDBlZFxcdTAwZWVcXHUwMGVmXVwiKSxcImlcIixKKFwiW1xcdTAwZjJcXHUwMGYzXFx1MDBmNFxcdTAwZjVcXHUwMGY2XFx1MDE1MV1cIiksXCJvXCIsSihcIltcXHUwMGY5XFx1MDBmYVxcdTAwZmJcXHUwMGZjXFx1MDE3MV1cIiksXCJ1XCIsSihcIltcXHUwMGZkXFx1MDE3N1xcdTAwZmZdXCIpLFwieVwiLEooXCJcXHUwMGYxXCIpLFwiblwiLEooXCJbXFx1MDBlN2NdXCIpLFwia1wiLEooXCJcXHUwMGRmXCIpLFwic1wiLEooXCIgJiBcIiksXCIgYW5kIFwiXTtmdW5jdGlvbiB4YShhKXt2YXIgYj1hPVwiXCIrYTtiLm5vcm1hbGl6ZSYmKGI9Yi5ub3JtYWxpemUoXCJORkRcIikucmVwbGFjZShjYSxcIlwiKSk7cmV0dXJuIEYuY2FsbCh0aGlzLGIudG9Mb3dlckNhc2UoKSwhYS5ub3JtYWxpemUmJnphKX07dmFyIEJhPXtlbmNvZGU6QWEsRjohMSxHOlwic3RyaWN0XCJ9O2NvbnN0IENhPS9bXmEtejAtOV0rLyxEYT17YjpcInBcIix2OlwiZlwiLHc6XCJmXCIsejpcInNcIix4Olwic1wiLFwiXFx1MDBkZlwiOlwic1wiLGQ6XCJ0XCIsbjpcIm1cIixjOlwia1wiLGc6XCJrXCIsajpcImtcIixxOlwia1wiLGk6XCJlXCIseTpcImVcIix1Olwib1wifTtmdW5jdGlvbiBBYShhKXthPXhhLmNhbGwodGhpcyxhKS5qb2luKFwiIFwiKTtjb25zdCBiPVtdO2lmKGEpe2NvbnN0IGM9YS5zcGxpdChDYSksZD1jLmxlbmd0aDtmb3IobGV0IGU9MCxmLGg9MDtlPGQ7ZSsrKWlmKChhPWNbZV0pJiYoIXRoaXMuZmlsdGVyfHwhdGhpcy5maWx0ZXJbYV0pKXtmPWFbMF07bGV0IGc9RGFbZl18fGYsaz1nO2ZvcihsZXQgbT0xO208YS5sZW5ndGg7bSsrKXtmPWFbbV07Y29uc3Qgbj1EYVtmXXx8ZjtuJiZuIT09ayYmKGcrPW4saz1uKX1iW2grK109Z319cmV0dXJuIGJ9O3ZhciBGYT17ZW5jb2RlOkVhLEY6ITEsRzpcIlwifTtjb25zdCBHYT1bSihcImFlXCIpLFwiYVwiLEooXCJvZVwiKSxcIm9cIixKKFwic2hcIiksXCJzXCIsSihcInRoXCIpLFwidFwiLEooXCJwaFwiKSxcImZcIixKKFwicGZcIiksXCJmXCIsSihcIig/IVthZW9dKWgoPyFbYWVvXSlcIiksXCJcIixKKFwiKD8hXlthZW9dKWgoPyFeW2Flb10pXCIpLFwiXCJdO2Z1bmN0aW9uIEVhKGEsYil7YSYmKGE9QWEuY2FsbCh0aGlzLGEpLmpvaW4oXCIgXCIpLDI8YS5sZW5ndGgmJihhPUcoYSxHYSkpLGJ8fCgxPGEubGVuZ3RoJiYoYT1kYShhKSksYSYmKGE9YS5zcGxpdChcIiBcIikpKSk7cmV0dXJuIGF8fFtdfTt2YXIgSWE9e2VuY29kZTpIYSxGOiExLEc6XCJcIn07Y29uc3QgSmE9SihcIig/IVxcXFxiKVthZW9dXCIpO2Z1bmN0aW9uIEhhKGEpe2EmJihhPUVhLmNhbGwodGhpcyxhLCEwKSwxPGEubGVuZ3RoJiYoYT1hLnJlcGxhY2UoSmEsXCJcIikpLDE8YS5sZW5ndGgmJihhPWRhKGEpKSxhJiYoYT1hLnNwbGl0KFwiIFwiKSkpO3JldHVybiBhfHxbXX07S1tcImxhdGluOmRlZmF1bHRcIl09ZmE7S1tcImxhdGluOnNpbXBsZVwiXT15YTtLW1wibGF0aW46YmFsYW5jZVwiXT1CYTtLW1wibGF0aW46YWR2YW5jZWRcIl09RmE7S1tcImxhdGluOmV4dHJhXCJdPUlhO2V4cG9ydCBkZWZhdWx0IHtJbmRleDpOLERvY3VtZW50OlUsV29ya2VyOlMscmVnaXN0ZXJDaGFyc2V0OmZ1bmN0aW9uKGEsYil7S1thXT1ifSxyZWdpc3Rlckxhbmd1YWdlOmZ1bmN0aW9uKGEsYil7aGFbYV09Yn19O1xuIiwgIi8qIVxuICogRmxleFNlYXJjaCBmb3IgQm9vdHN0cmFwIGJhc2VkIFRodWxpdGUgc2l0ZXNcbiAqIENvcHlyaWdodCAyMDIxLTIwMjQgVGh1bGl0ZVxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKiBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZnJqby9odWdvLXRoZW1lLXplbi9ibG9iL21haW4vYXNzZXRzL2pzL3NlYXJjaC5qc1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmLCBndWFyZC1mb3ItaW4gKi9cblxuLyoqXG4gKiBAZmlsZVxuICogQSBKYXZhU2NyaXB0IGZpbGUgZm9yIGZsZXhzZWFyY2guXG4gKi9cblxuLy8gaW1wb3J0ICogYXMgRmxleFNlYXJjaCBmcm9tICdmbGV4c2VhcmNoJztcbmltcG9ydCBJbmRleCBmcm9tICdmbGV4c2VhcmNoJztcblxuKGZ1bmN0aW9uICgpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gY29uc3QgaW5kZXggPSBuZXcgRmxleFNlYXJjaC5Eb2N1bWVudCh7XG4gIGNvbnN0IGluZGV4ID0gbmV3IEluZGV4LkRvY3VtZW50KHtcbiAgICB0b2tlbml6ZTogJ2ZvcndhcmQnLFxuICAgIGRvY3VtZW50OiB7XG4gICAgICBpZDogJ2lkJyxcbiAgICAgIGluZGV4OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWVsZDogJ3RpdGxlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGQ6ICd0YWdzJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGQ6ICdjb250ZW50J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGQ6ICAnZGF0ZScsXG4gICAgICAgICAgdG9rZW5pemU6ICdzdHJpY3QnLFxuICAgICAgICAgIGVuY29kZTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0b3JlOiBbJ3RpdGxlJywnc3VtbWFyeScsJ2RhdGUnLCdwZXJtYWxpbmsnXVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoaXRlbXMpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudDtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLXJlc3VsdHMnKTtcbiAgICByZXN1bHRzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE9iamVjdC5rZXlzKGl0ZW1zKS5sZW5ndGg7XG5cbiAgICAvLyBTaG93L2hpZGUgXCJObyByZWNlbnQgc2VhcmNoZXNcIiBhbmQgXCJObyBzZWFyY2ggcmVzdWx0c1wiIG1lc3NhZ2VzXG4gICAgaWYgKChpdGVtc0xlbmd0aCA9PT0gMCkgJiYgKHF1ZXJ5LnZhbHVlID09PSAnJykpIHtcbiAgICAgIC8vIEhpZGUgXCJObyBzZWFyY2ggcmVzdWx0c1wiIG1lc3NhZ2VcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVzdWx0cycpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgLy8gU2hvdyBcIk5vIHJlY2VudCBzZWFyY2hlc1wiIG1lc3NhZ2VcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVjZW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgfSBlbHNlIGlmICgoaXRlbXNMZW5ndGggPT09IDApICYmIChxdWVyeS52YWx1ZSAhPT0gJycpKSB7XG4gICAgICAvLyBIaWRlIFwiTm8gcmVjZW50IHNlYXJjaGVzXCIgbWVzc2FnZVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZWNlbnQnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgIC8vIFNob3cgXCJObyBzZWFyY2ggcmVzdWx0c1wiIG1lc3NhZ2VcbiAgICAgIGNvbnN0IHF1ZXJ5Tm9SZXN1bHRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnF1ZXJ5LW5vLXJlc3VsdHMnKTtcbiAgICAgIHF1ZXJ5Tm9SZXN1bHRzLmlubmVyVGV4dCA9IHF1ZXJ5LnZhbHVlO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZXN1bHRzJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGUgYm90aCBcIk5vIHJlY2VudCBzZWFyY2hlc1wiIGFuZCBcIk5vIHNlYXJjaCByZXN1bHRzXCIgbWVzc2FnZXNcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVjZW50JykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLW5vLXJlc3VsdHMnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGlkIGluIGl0ZW1zKSB7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbaWRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgY29uc3QgYSA9IHJlc3VsdC5xdWVyeVNlbGVjdG9yKCdhJyk7XG4gICAgICBjb25zdCB0aW1lID0gcmVzdWx0LnF1ZXJ5U2VsZWN0b3IoJ3RpbWUnKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZXN1bHQucXVlcnlTZWxlY3RvcignLmNvbnRlbnQnKTtcbiAgICAgIGEuaW5uZXJIVE1MID0gaXRlbS50aXRsZTtcbiAgICAgIGEuaHJlZiA9IGl0ZW0ucGVybWFsaW5rO1xuICAgICAgdGltZS5pbm5lclRleHQgPSBpdGVtLmRhdGU7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGl0ZW0uc3VtbWFyeTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmVzdWx0cy5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtdGV4dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBsaW1pdCA9IDk5O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBpbmRleC5zZWFyY2goe1xuICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgZW5yaWNoOiB0cnVlLFxuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgIH0pO1xuICAgIGNvbnN0IGl0ZW1zID0ge307XG5cbiAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LnJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIGl0ZW1zW3IuaWRdID0gci5kb2M7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNob3dSZXN1bHRzKGl0ZW1zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuYWJsZVVJKCkge1xuICAgIGNvbnN0IHNlYXJjaGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWZvcm0nKTtcbiAgICBzZWFyY2hmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkb1NlYXJjaCgpO1xuICAgIH0pO1xuICAgIHNlYXJjaGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkb1NlYXJjaCgpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbG9hZGluZycpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtaW5wdXQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLXRleHQnKS5mb2N1cygpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRJbmRleCgpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWxvYWRpbmcnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICBmZXRjaChcIi9zZWFyY2gtaW5kZXguanNvblwiKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgaW5kZXguYWRkKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYnVpbGRJbmRleCgpO1xuICBlbmFibGVVSSgpO1xufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFPQSxNQUFJO0FBQUUsV0FBUyxFQUFFLEdBQUU7QUFBQyxXQUFNLGdCQUFjLE9BQU8sSUFBRSxJQUFFO0FBQUEsRUFBRTtBQUFDLFdBQVMsRUFBRSxHQUFFO0FBQUMsVUFBTSxJQUFFLE1BQU0sQ0FBQztBQUFFLGFBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxJQUFFLEVBQUU7QUFBRSxXQUFPO0FBQUEsRUFBQztBQUFDLFdBQVMsSUFBRztBQUFDLFdBQU8sdUJBQU8sT0FBTyxJQUFJO0FBQUEsRUFBQztBQUFDLFdBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxXQUFPLEVBQUUsU0FBTyxFQUFFO0FBQUEsRUFBTTtBQUFDLFdBQVMsRUFBRSxHQUFFO0FBQUMsV0FBTSxhQUFXLE9BQU87QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUU7QUFBQyxXQUFNLGFBQVcsT0FBTztBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRTtBQUFDLFdBQU0sZUFBYSxPQUFPO0FBQUEsRUFBQztBQUFFLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUU7QUFBRyxRQUFHLE1BQUksTUFBSSxJQUFFLEVBQUUsR0FBRSxDQUFDLElBQUcsS0FBSyxNQUFJLElBQUUsRUFBRSxHQUFFLEtBQUssQ0FBQyxJQUFHLEtBQUssS0FBRyxJQUFFLEVBQUUsV0FBUyxJQUFFLEVBQUUsR0FBRSxLQUFLLENBQUMsSUFBRyxLQUFHLE9BQUssSUFBRztBQUFDLFVBQUUsRUFBRSxNQUFNLENBQUM7QUFBRSxVQUFHLEtBQUssUUFBTztBQUFDLFlBQUUsS0FBSztBQUFPLFlBQUUsRUFBRTtBQUFPLGNBQU0sSUFBRSxDQUFDO0FBQUUsaUJBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsS0FBSTtBQUFDLGdCQUFNLElBQUUsRUFBRSxDQUFDO0FBQUUsZUFBRyxDQUFDLEVBQUUsQ0FBQyxNQUFJLEVBQUUsR0FBRyxJQUFFO0FBQUEsUUFBRTtBQUFDLFlBQUU7QUFBQSxNQUFDLE1BQU0sS0FBRTtBQUFFLGFBQU87QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBLEVBQUM7QUFBQyxNQUFNLEtBQUc7QUFBVCxNQUFvQyxLQUFHO0FBQ2hvQixXQUFTLEVBQUUsR0FBRSxHQUFFO0FBQUMsVUFBTSxJQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxDQUFDO0FBQUUsUUFBSSxJQUFFLElBQUcsSUFBRTtBQUFFLGFBQVEsSUFBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxLQUFFLEVBQUUsQ0FBQyxJQUFHLElBQUUsRUFBRSxDQUFDLE1BQUksRUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLFlBQVUsSUFBRSxZQUFVLENBQUMsR0FBRSxFQUFFLEdBQUcsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLE1BQUk7QUFBRSxVQUFJLEVBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxhQUFXLElBQUUsYUFBVyxNQUFJLElBQUUsR0FBRyxHQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQUksV0FBTztBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRSxHQUFFO0FBQUMsYUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxNQUFJLElBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLENBQUMsR0FBRSxJQUFHLEtBQUcsRUFBRTtBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUU7QUFBQyxXQUFPLElBQUksT0FBTyxHQUFFLEdBQUc7QUFBQSxFQUFDO0FBQUMsV0FBUyxHQUFHLEdBQUU7QUFBQyxRQUFJLElBQUUsSUFBRyxJQUFFO0FBQUcsYUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sR0FBRSxJQUFFLEdBQUUsSUFBSSxFQUFDLElBQUUsRUFBRSxDQUFDLE9BQUssTUFBSSxLQUFHLElBQUU7QUFBRyxXQUFPO0FBQUEsRUFBQztBQUFFLE1BQUksS0FBRyxFQUFDLFFBQU8sSUFBRyxHQUFFLE9BQUcsR0FBRSxHQUFFO0FBQUUsV0FBUyxHQUFHLEdBQUU7QUFBQyxXQUFPLEVBQUUsS0FBSyxPQUFNLEtBQUcsR0FBRyxZQUFZLEdBQUUsS0FBRTtBQUFBLEVBQUM7QUFBRSxNQUFNLEtBQUcsQ0FBQztBQUFWLE1BQVksSUFBRSxDQUFDO0FBQUUsV0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFFLEdBQUUsS0FBSztBQUFFLE1BQUUsR0FBRSxRQUFRO0FBQUUsTUFBRSxHQUFFLFFBQVE7QUFBRSxNQUFFLEdBQUUsUUFBUTtBQUFFLE1BQUUsR0FBRSxRQUFRO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLElBQUUsT0FBTyxJQUFFLFdBQVU7QUFBQyxZQUFNLElBQUUsTUFBSyxJQUFFO0FBQVUsVUFBSSxJQUFFLEVBQUUsRUFBRSxTQUFPLENBQUM7QUFBRSxVQUFJO0FBQUUsUUFBRSxDQUFDLE1BQUksSUFBRSxHQUFFLE9BQU8sRUFBRSxFQUFFLFNBQU8sQ0FBQztBQUFHLFVBQUUsSUFBSSxRQUFRLFNBQVMsR0FBRTtBQUFDLG1CQUFXLFdBQVU7QUFBQyxZQUFFLFFBQU07QUFBRyxnQkFBTSxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUUsWUFBRSxRQUFNO0FBQUcsWUFBRSxDQUFDO0FBQUEsUUFBQyxDQUFDO0FBQUEsTUFBQyxDQUFDO0FBQUUsYUFBTyxLQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUUsUUFBTTtBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUUsV0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFNLElBQUUsRUFBRTtBQUFPLFFBQUksSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLElBQUU7QUFBRSxVQUFJLElBQUUsQ0FBQztBQUFHLGFBQVEsSUFBRSxJQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxZQUFNLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxFQUFFO0FBQUUsVUFBSSxJQUFFLENBQUM7QUFBRSxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsS0FBSTtBQUFDLGNBQU0sSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUU7QUFBTyxZQUFHLEVBQUUsVUFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUcsSUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUMsY0FBRyxFQUFFLENBQUMsR0FBRTtBQUFDLGdCQUFHLENBQUM7QUFBRSxrQkFBRyxFQUFFO0FBQUEsdUJBQVksRUFBRSxHQUFHLElBQUUsR0FBRSxNQUFJLEVBQUUsUUFBTztBQUFBO0FBQUUsZ0JBQUcsS0FBRyxFQUFFLEdBQUUsQ0FBQyxJQUFFO0FBQUUsZ0JBQUU7QUFBQSxVQUFFO0FBQUMsY0FBRyxNQUFJLEtBQUcsRUFBRSxDQUFDLEtBQUcsS0FBRyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFHO0FBQUMsa0JBQU0sSUFBRSxFQUFFLElBQUUsQ0FBQyxNQUFJLEVBQUUsSUFBRSxDQUFDLElBQUUsQ0FBQztBQUFHLGNBQUUsRUFBRSxNQUFNLElBQUU7QUFBQSxVQUFDO0FBQUEsUUFBQyxNQUFNLEdBQUUsQ0FBQyxJQUFFO0FBQUEsTUFBQztBQUFDLFVBQUcsRUFBRSxPQUFJLElBQUU7QUFBQSxlQUFXLENBQUMsRUFBRSxRQUFNLENBQUM7QUFBRSxVQUFFO0FBQUEsSUFBQztBQUFDLFFBQUcsRUFBRSxVQUFRLElBQUUsRUFBRSxTQUFPLEdBQUUsR0FBRSxHQUFFLEtBQUcsR0FBRSxLQUFJO0FBQUMsVUFBRSxFQUFFLENBQUM7QUFBRSxVQUFFLEVBQUU7QUFBTyxlQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUcsSUFDLzNDLEVBQUUsQ0FBQyxHQUFFLENBQUMsRUFBRSxDQUFDLEdBQUU7QUFBQyxZQUFHLEVBQUU7QUFBQSxpQkFBWSxFQUFFLEdBQUcsSUFBRSxHQUFFLE1BQUksRUFBRSxRQUFPO0FBQUUsVUFBRSxDQUFDLElBQUU7QUFBQSxNQUFDO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUMsV0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFVBQU0sSUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEdBQUUsSUFBRSxDQUFDO0FBQUUsYUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUU7QUFBRSxhQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxVQUFFLEVBQUUsQ0FBQztBQUFFLGVBQVEsSUFBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxLQUFHLENBQUMsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsR0FBRSxFQUFFLEVBQUUsTUFBTSxJQUFFO0FBQUEsSUFBRTtBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUUsV0FBUyxFQUFFLEdBQUU7QUFBQyxTQUFLLElBQUUsU0FBSyxLQUFHO0FBQUUsU0FBSyxRQUFNLEVBQUU7QUFBRSxTQUFLLElBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxXQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLENBQUMsTUFBSSxJQUFFLEVBQUU7QUFBTyxRQUFJLElBQUUsS0FBSyxNQUFNLElBQUksQ0FBQztBQUFFLFVBQUksSUFBRSxLQUFLLE9BQU8sR0FBRSxHQUFFLENBQUMsR0FBRSxLQUFLLE1BQU0sSUFBSSxHQUFFLENBQUM7QUFBRyxXQUFPO0FBQUEsRUFBQztBQUFDLElBQUUsVUFBVSxNQUFJLFNBQVMsR0FBRSxHQUFFO0FBQUMsUUFBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBSyxFQUFFO0FBQU8sWUFBSSxLQUFLLElBQUUsT0FBTyxLQUFLLE1BQU0sS0FBSyxFQUFFLElBQUUsQ0FBQyxDQUFDLElBQUU7QUFBSSxXQUFJLEVBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxNQUFLLEVBQUUsQ0FBQyxJQUFFLEtBQUssRUFBRSxJQUFFLENBQUM7QUFBRSxXQUFLLEVBQUUsQ0FBQyxJQUFFO0FBQUEsSUFBQztBQUFDLFNBQUssTUFBTSxDQUFDLElBQUU7QUFBQSxFQUFDO0FBQUUsSUFBRSxVQUFVLE1BQUksU0FBUyxHQUFFO0FBQUMsVUFBTSxJQUFFLEtBQUssTUFBTSxDQUFDO0FBQUUsUUFBRyxLQUFLLEtBQUcsTUFBSSxJQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBRztBQUFDLFlBQU0sSUFBRSxLQUFLLEVBQUUsSUFBRSxDQUFDO0FBQUUsV0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEtBQUssRUFBRSxDQUFDO0FBQUUsV0FBSyxFQUFFLENBQUMsSUFBRTtBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBQztBQUFFLE1BQU0sS0FBRyxFQUFDLFFBQU8sRUFBQyxTQUFRLGVBQWMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLE1BQUUsR0FBRSxhQUFZLEVBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLE9BQUcsU0FBUSxFQUFDLE9BQU0sR0FBRSxHQUFFLEVBQUMsRUFBQyxHQUFFLE9BQU0sRUFBQyxTQUFRLGVBQWMsR0FBRSxVQUFTLEdBQUUsT0FBTSxFQUFDLFNBQVEsa0JBQWlCLEdBQUUsSUFBRyxHQUFFLEdBQUUsU0FBUSxFQUFDLE9BQU0sR0FBRSxHQUFFLEVBQUMsRUFBQyxHQUFFLFdBQVUsQ0FBQyxFQUFDO0FBQUUsV0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLGVBQVcsV0FBVTtBQUFDLFlBQU0sSUFBRSxFQUFFLElBQUUsSUFBRSxNQUFJLElBQUUsR0FBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQUUsV0FBRyxFQUFFLE9BQUssRUFBRSxLQUFLLFdBQVU7QUFBQyxVQUFFLE9BQU8sR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsQ0FBQztBQUFBLE1BQUMsQ0FBQyxJQUFFLEVBQUUsT0FBTyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxDQUFDO0FBQUEsSUFBQyxDQUFDO0FBQUEsRUFBQztBQUFFLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxRQUFHLEVBQUUsZ0JBQWdCLEdBQUcsUUFBTyxJQUFJLEVBQUUsQ0FBQztBQUFFLFFBQUk7QUFBRSxRQUFHLEdBQUU7QUFBQyxRQUFFLENBQUMsSUFBRSxJQUFFLEdBQUcsQ0FBQyxLQUFHLElBQUUsRUFBRSxZQUFVLElBQUUsT0FBTyxPQUFPLENBQUMsR0FBRSxFQUFFLENBQUMsR0FBRSxDQUFDO0FBQUcsVUFBRSxFQUFFO0FBQVEsVUFBSSxJQUFFLEVBQUU7QUFBSyxRQUFFLENBQUMsTUFBSSxPQUFLLEVBQUUsUUFBUSxHQUFHLE1BQUksS0FBRyxhQUFZLElBQUUsRUFBRSxDQUFDO0FBQUcsUUFBRSxDQUFDLE1BQUksSUFBRSxHQUFHLENBQUM7QUFBQSxJQUFFLE1BQU0sS0FBRSxDQUFDO0FBQUUsUUFBSSxHQUFFLEdBQUUsSUFBRSxFQUFFLFdBQVMsQ0FBQztBQUFFLFNBQUssU0FBTyxFQUFFLFVBQVEsS0FBRyxFQUFFLFVBQVE7QUFBRyxTQUFLLFdBQVMsS0FBRyxFQUFFO0FBQUUsU0FBSyxJQUFFLElBQUUsRUFBRSxjQUFZO0FBQUUsU0FBSyxJQUFFLElBQUUsS0FBRyxFQUFFLEtBQUcsRUFBRSxZQUFVO0FBQVMsU0FBSyxRQUFNLGFBQVcsS0FBRyxFQUFFO0FBQU0sU0FBSyxJQUFFLEVBQUUsRUFBRSxhQUFhO0FBQUUsU0FBSyxJQUFFLElBQUUsRUFBRSxFQUFFLFFBQVE7QUFBRSxTQUFLLElBQUUsRUFBRSxFQUFFLFVBQVU7QUFBRSxTQUFLLElBQUUsRUFBRSxhQUFXO0FBQUUsU0FBSyxJQUN4b0QsRUFBRTtBQUFNLFNBQUssTUFBSSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUU7QUFBRSxTQUFLLElBQUUsSUFBRSxFQUFFLGNBQVk7QUFBRSxTQUFLLElBQUUsSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFO0FBQUUsU0FBSyxJQUFFLEtBQUcsRUFBRSxLQUFHLEVBQUU7QUFBSSxTQUFLLEtBQUcsSUFBRSxFQUFFLFdBQVMsS0FBRyxFQUFFLE1BQUksRUFBRSxHQUFFLEtBQUU7QUFBRSxTQUFLLEtBQUcsSUFBRSxFQUFFLFdBQVMsS0FBRyxFQUFFLE1BQUksRUFBRSxHQUFFLElBQUU7QUFBRSxRQUFHLElBQUUsSUFBRSxFQUFFLFVBQVEsS0FBRyxFQUFFLFFBQU87QUFBQyxVQUFFO0FBQUUsVUFBRSxFQUFFO0FBQUUsZUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxHQUFFLElBQUksR0FBRSxFQUFFLENBQUMsQ0FBQyxJQUFFO0FBQUUsVUFBRTtBQUFBLElBQUM7QUFBQyxTQUFLLFNBQU87QUFBRSxTQUFLLFNBQU8sSUFBRSxFQUFFLFVBQVEsSUFBSSxFQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsTUFBRSxFQUFFO0FBQVUsSUFBRSxTQUFPLFNBQVMsR0FBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLElBQUksR0FBRSxHQUFFLElBQUU7QUFBQSxFQUFDO0FBQ3hXLElBQUUsTUFBSSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFHLE1BQUksS0FBRyxNQUFJLElBQUc7QUFBQyxVQUFHLENBQUMsS0FBRyxDQUFDLEtBQUcsS0FBSyxTQUFTLENBQUMsRUFBRSxRQUFPLEtBQUssT0FBTyxHQUFFLENBQUM7QUFBRSxVQUFFLEtBQUssT0FBTyxDQUFDO0FBQUUsVUFBRyxJQUFFLEVBQUUsUUFBTztBQUFDLGNBQU0sSUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEdBQUUsSUFBRSxLQUFLLE9BQU0sSUFBRSxLQUFLO0FBQUUsaUJBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxLQUFJO0FBQUMsY0FBSSxJQUFFLEVBQUUsS0FBSyxJQUFFLElBQUUsSUFBRSxJQUFFLENBQUM7QUFBRSxjQUFJLElBQUUsRUFBRTtBQUFPLGNBQUcsS0FBRyxLQUFHLEtBQUssTUFBSSxLQUFHLENBQUMsRUFBRSxDQUFDLElBQUc7QUFBQyxnQkFBSSxJQUFFLEVBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxJQUFFO0FBQUcsb0JBQU8sS0FBSyxHQUFFO0FBQUEsY0FBQyxLQUFLO0FBQU8sb0JBQUcsSUFBRSxHQUFFO0FBQUMsdUJBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLFVBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUcsSUFBRSxLQUFHLEtBQUssR0FBRTtBQUFDLHdCQUFJLElBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSx3QkFBRSxFQUFFLFVBQVUsR0FBRSxDQUFDO0FBQUUsc0JBQUUsTUFBSyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxrQkFBQztBQUFDO0FBQUEsZ0JBQUs7QUFBQSxjQUFDLEtBQUs7QUFBVSxvQkFBRyxJQUFFLEdBQUU7QUFBQyx1QkFBSSxJQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxLQUFFLEVBQUUsQ0FBQyxJQUFFLEdBQUUsRUFBRSxVQUFRLEtBQUssS0FBRztBQUFBLG9CQUFFO0FBQUEsb0JBQUs7QUFBQSxvQkFDbmY7QUFBQSxvQkFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLG9CQUFFO0FBQUEsb0JBQUU7QUFBQSxrQkFBQztBQUFFLHNCQUFFO0FBQUEsZ0JBQUU7QUFBQSxjQUFDLEtBQUs7QUFBVSxvQkFBRyxJQUFFLEdBQUU7QUFBQyx1QkFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksTUFBRyxFQUFFLENBQUMsR0FBRSxFQUFFLFVBQVEsS0FBSyxLQUFHLEVBQUUsTUFBSyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRTtBQUFBLGdCQUFLO0FBQUEsY0FBQztBQUFRLG9CQUFHLEtBQUssTUFBSSxJQUFFLEtBQUssSUFBSSxJQUFFLEtBQUssRUFBRSxHQUFFLEdBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxDQUFDLElBQUcsRUFBRSxNQUFLLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFLEtBQUcsSUFBRSxLQUFHLElBQUUsSUFBRTtBQUFFLHVCQUFJLElBQUUsRUFBRSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsR0FBRSxJQUFFLEtBQUssSUFBSSxJQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksTUFBSSxJQUFFLEVBQUUsS0FBSyxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxDQUFDLE1BQUksRUFBRSxVQUFRLEtBQUssS0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFFO0FBQUMsc0JBQUUsQ0FBQyxJQUFFO0FBQUUsMEJBQU0sSUFBRSxLQUFLLEtBQUcsSUFBRTtBQUFFLHNCQUFFLE1BQUssR0FBRSxJQUFFLElBQUUsR0FBRSxFQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFHLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLElBQUUsSUFBRSxDQUFDO0FBQUEsa0JBQUM7QUFBQTtBQUFBLFlBQUM7QUFBQSxVQUFDO0FBQUEsUUFBQztBQUFDLGFBQUssTUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFFO0FBQUEsTUFBRTtBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBSTtBQUM1YixXQUFTLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsV0FBTyxLQUFHLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLEtBQUcsT0FBSyxLQUFHLEtBQUcsTUFBSSxJQUFFLElBQUU7QUFBQSxFQUFDO0FBQUMsV0FBUyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsSUFBRSxFQUFFLElBQUUsRUFBRTtBQUFJLFFBQUcsQ0FBQyxFQUFFLENBQUMsS0FBRyxLQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUUsTUFBSSxJQUFFLEVBQUUsQ0FBQyxJQUFHLEtBQUcsSUFBRSxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLElBQUcsRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLEVBQUUsQ0FBQyxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsTUFBSSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsQ0FBQyxJQUFHLEVBQUUsTUFBSSxJQUFFLEVBQUUsQ0FBQyxNQUFJLEVBQUUsQ0FBQyxJQUFFLENBQUMsS0FBSSxLQUFHLEVBQUUsU0FBUyxDQUFDLE1BQUksRUFBRSxFQUFFLE1BQU0sSUFBRSxHQUFFLEVBQUUsTUFBSSxJQUFFLEVBQUUsU0FBUyxDQUFDLE1BQUksRUFBRSxTQUFTLENBQUMsSUFBRSxDQUFDLElBQUcsRUFBRSxFQUFFLE1BQU0sSUFBRTtBQUFBLEVBQUc7QUFDeFcsSUFBRSxTQUFPLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLENBQUMsS0FBRyxFQUFFLENBQUMsS0FBRyxJQUFFLEdBQUUsSUFBRSxFQUFFLFNBQU8sRUFBRSxDQUFDLE1BQUksSUFBRTtBQUFJLFFBQUksSUFBRSxDQUFDLEdBQUU7QUFBRSxRQUFJLEdBQUUsSUFBRTtBQUFFLFFBQUcsR0FBRTtBQUFDLFVBQUUsRUFBRSxTQUFPO0FBQUUsVUFBRSxFQUFFO0FBQU0sVUFBRSxFQUFFLFVBQVE7QUFBRSxVQUFJLElBQUUsRUFBRTtBQUFRLFVBQUUsRUFBRTtBQUFBLElBQU87QUFBQyxRQUFHLE1BQUksSUFBRSxLQUFLLE9BQU8sS0FBRyxDQUFDLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxJQUFHO0FBQUMsVUFBRSxFQUFFO0FBQUUsVUFBSSxJQUFFLENBQUM7QUFBRSxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxNQUFJLElBQUUsRUFBRSxDQUFDLE1BQUksRUFBRSxVQUFRLEtBQUssS0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUcsS0FBSyxLQUFHLEtBQUcsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFFLEdBQUcsSUFBRSxHQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQUEsVUFBTyxRQUFPO0FBQUUsVUFBRTtBQUFFLFVBQUUsRUFBRTtBQUFBLElBQU07QUFBQyxRQUFHLENBQUMsRUFBRSxRQUFPO0FBQUUsVUFBSSxJQUFFO0FBQUssUUFBRSxLQUFLLFNBQU8sSUFBRSxLQUFHLFVBQUs7QUFBRSxRQUFFO0FBQUUsUUFBSTtBQUFFLFNBQUcsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUcsSUFBRSxLQUFHLEVBQUUsS0FBSyxFQUFFO0FBQUUsYUFBUSxHQUFFLEdBQUUsSUFBRSxHQUFFLEtBQUk7QUFBQyxVQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUcsSUFBRTtBQUFBLFFBQUc7QUFBQSxRQUFLO0FBQUEsUUFBRTtBQUFBLFFBQUU7QUFBQSxRQUFFO0FBQUEsUUFBRSxNQUFJO0FBQUEsUUFBRTtBQUFBLFFBQ3BmO0FBQUEsTUFBQyxHQUFFLEtBQUcsVUFBSyxLQUFHLEVBQUUsV0FBUyxJQUFFLE1BQUksSUFBRSxHQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxNQUFJLEdBQUUsQ0FBQztBQUFFLFVBQUcsRUFBRSxRQUFPO0FBQUUsVUFBRyxLQUFHLE1BQUksSUFBRSxHQUFFO0FBQUMsWUFBRSxFQUFFO0FBQU8sWUFBRyxDQUFDLEdBQUU7QUFBQyxjQUFHLEdBQUU7QUFBQyxnQkFBRTtBQUFFLGdCQUFFO0FBQUc7QUFBQSxVQUFRO0FBQUMsaUJBQU87QUFBQSxRQUFDO0FBQUMsWUFBRyxNQUFJLEVBQUUsUUFBTyxHQUFHLEVBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQztBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUMsV0FBTyxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQzFMLFdBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsQ0FBQyxHQUFFLElBQUUsSUFBRSxFQUFFLElBQUUsRUFBRTtBQUFJLE1BQUUsTUFBSSxJQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsRUFBRSxDQUFDO0FBQUcsUUFBRyxHQUFFO0FBQUMsVUFBSSxJQUFFO0FBQUUsWUFBTSxJQUFFLEtBQUssSUFBSSxFQUFFLFFBQU8sSUFBRSxFQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxLQUFHLElBQUUsRUFBRSxDQUFDO0FBQUUsWUFBRyxFQUFFLE1BQUksSUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEVBQUUsQ0FBQyxJQUFHLEtBQUcsS0FBRyxNQUFJLElBQUUsRUFBRSxRQUFPLEtBQUcsS0FBRyxLQUFHLEdBQUUsSUFBRSxTQUFPLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFLEtBQUksTUFBSSxFQUFFLEdBQUcsSUFBRSxHQUFFLE1BQUksS0FBRyxFQUFFLFFBQU8sS0FBRyxJQUFJO0FBQUE7QUFBTSxVQUFHLEdBQUU7QUFBQyxZQUFHLEVBQUUsUUFBTyxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLE1BQU0sSUFBRTtBQUFFO0FBQUEsTUFBTTtBQUFBLElBQUM7QUFBQyxXQUFNLENBQUMsS0FBRztBQUFBLEVBQUM7QUFBQyxXQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFFLE1BQUksRUFBRSxTQUFPLEVBQUUsQ0FBQyxJQUFFLENBQUMsRUFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFFLENBQUM7QUFBRSxXQUFPLEtBQUcsRUFBRSxTQUFPLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLElBQUU7QUFBQSxFQUFDO0FBQ3BjLFdBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsU0FBRyxJQUFFLEtBQUcsSUFBRSxHQUFFLEtBQUcsSUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDLE1BQUksRUFBRSxJQUFFLElBQUUsQ0FBQyxLQUFHLElBQUUsRUFBRSxDQUFDO0FBQUUsV0FBTztBQUFBLEVBQUM7QUFBQyxJQUFFLFVBQVEsU0FBUyxHQUFFO0FBQUMsV0FBTSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7QUFBQSxFQUFDO0FBQUUsSUFBRSxTQUFPLFNBQVMsR0FBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRSxDQUFDO0FBQUEsRUFBQztBQUNoTCxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFNLElBQUUsS0FBSyxTQUFTLENBQUM7QUFBRSxRQUFHLEdBQUU7QUFBQyxVQUFHLEtBQUssRUFBRSxVQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRSxDQUFDO0FBQUEsVUFBTyxHQUFFLEtBQUssS0FBSSxHQUFFLEtBQUssR0FBRSxLQUFLLENBQUMsR0FBRSxLQUFLLFNBQU8sRUFBRSxLQUFLLEdBQUUsR0FBRSxLQUFLLEdBQUUsS0FBSyxDQUFDO0FBQUUsV0FBRyxPQUFPLEtBQUssU0FBUyxDQUFDO0FBQUUsVUFBRyxLQUFLLE9BQU07QUFBQyxZQUFFLEtBQUs7QUFBTSxpQkFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEVBQUUsU0FBUyxDQUFDLE1BQUksRUFBRSxFQUFFLE9BQU8sS0FBSSxDQUFDLEdBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztBQUFBLE1BQUU7QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBLEVBQUk7QUFDblgsV0FBUyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRTtBQUFFLFFBQUcsRUFBRSxnQkFBYyxNQUFNLEtBQUcsRUFBRSxLQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsT0FBSyxJQUFFLElBQUUsRUFBRSxXQUFTLEVBQUUsT0FBTyxHQUFFLENBQUMsR0FBRSxPQUFLO0FBQUEsU0FBUTtBQUFDLFVBQUUsS0FBSyxJQUFJLEVBQUUsUUFBTyxDQUFDO0FBQUUsZUFBUSxJQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxLQUFHLElBQUUsRUFBRSxDQUFDLEVBQUUsS0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFLEtBQUcsS0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLElBQUM7QUFBQSxRQUFNLFVBQVEsS0FBSyxFQUFFLEVBQUMsSUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUMsTUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFFLFdBQU87QUFBQSxFQUFDO0FBQUMsSUFBRSxjQUFZO0FBQy9SLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFO0FBQUcsb0JBQWMsT0FBTyxNQUFJLElBQUUsSUFBSSxRQUFRLE9BQUc7QUFBQyxVQUFFO0FBQUEsSUFBQyxDQUFDO0FBQUcsUUFBSSxHQUFFO0FBQUUsWUFBTyxNQUFJLElBQUUsSUFBRztBQUFBLE1BQUMsS0FBSztBQUFFLFlBQUU7QUFBTSxZQUFHLEtBQUssR0FBRTtBQUFDLGNBQUUsRUFBRTtBQUFFLG1CQUFRLEtBQUssS0FBSyxTQUFTLEdBQUUsQ0FBQyxJQUFFO0FBQUEsUUFBQyxNQUFNLEtBQUUsS0FBSztBQUFTO0FBQUEsTUFBTSxLQUFLO0FBQUUsWUFBRTtBQUFNLFlBQUUsRUFBQyxLQUFJLEdBQUUsS0FBSSxLQUFLLElBQUUsSUFBRSxFQUFDO0FBQUU7QUFBQSxNQUFNLEtBQUs7QUFBRSxZQUFFO0FBQU0sWUFBRSxLQUFLO0FBQUk7QUFBQSxNQUFNLEtBQUs7QUFBRSxZQUFFO0FBQU0sWUFBRSxLQUFLO0FBQUU7QUFBQSxNQUFNO0FBQVEsd0JBQWMsT0FBTyxLQUFHLEtBQUcsRUFBRTtBQUFFO0FBQUEsSUFBTTtBQUFDLE9BQUcsR0FBRSxLQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxXQUFPO0FBQUEsRUFBQztBQUM1WSxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxRQUFHLEVBQUUsU0FBTyxFQUFFLENBQUMsTUFBSSxJQUFFLEtBQUssTUFBTSxDQUFDLElBQUcsR0FBRTtBQUFBLE1BQUMsS0FBSztBQUFNLGFBQUssSUFBRSxDQUFDLENBQUMsRUFBRTtBQUFJO0FBQUEsTUFBTSxLQUFLO0FBQU0sYUFBSyxJQUFFO0FBQUcsYUFBSyxXQUFTO0FBQUU7QUFBQSxNQUFNLEtBQUs7QUFBTSxhQUFLLE1BQUk7QUFBRTtBQUFBLE1BQU0sS0FBSztBQUFNLGFBQUssSUFBRTtBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUUsS0FBRyxFQUFFLFNBQVM7QUFBRSxXQUFTLEdBQUcsR0FBRTtBQUFDLFFBQUUsRUFBRTtBQUFLLFFBQUksSUFBRSxLQUFLO0FBQU8sVUFBTSxJQUFFLEVBQUU7QUFBSyxRQUFJLElBQUUsRUFBRTtBQUFLLFlBQU8sR0FBRTtBQUFBLE1BQUMsS0FBSztBQUFPLFlBQUUsRUFBRSxXQUFTLENBQUM7QUFBRSxZQUFFLEVBQUU7QUFBUSxZQUFFLEVBQUU7QUFBTyxVQUFFLFFBQU07QUFBRyxhQUFHLE1BQUksRUFBRSxRQUFRLFVBQVUsTUFBSSxFQUFFLFNBQU8sU0FBUyxZQUFVLENBQUMsRUFBRTtBQUFHLGFBQUcsU0FBUyxZQUFVLENBQUMsRUFBRSxFQUFFLElBQUksR0FBRSxLQUFLLFNBQU8sSUFBSSxLQUFLLFdBQVcsTUFBTSxDQUFDLEdBQUUsT0FBTyxLQUFLLGNBQVksS0FBSyxTQUFPLElBQUksRUFBRSxDQUFDO0FBQUU7QUFBQSxNQUFNO0FBQVEsWUFBRSxFQUFFLElBQUcsSUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUUsQ0FBQyxHQUFFLFlBQVksYUFBVyxJQUFFLEVBQUMsSUFBRyxHQUFFLEtBQUksRUFBQyxJQUFFLEVBQUMsSUFBRyxFQUFDLENBQUM7QUFBQSxJQUFDO0FBQUEsRUFBQztBQUFFLE1BQUksS0FBRztBQUFFLFdBQVMsRUFBRSxHQUFFO0FBQUMsUUFBRyxFQUFFLGdCQUFnQixHQUFHLFFBQU8sSUFBSSxFQUFFLENBQUM7QUFBRSxRQUFJO0FBQUUsUUFBRSxFQUFFLElBQUUsRUFBRSxNQUFNLE1BQUksRUFBRSxTQUFPLEVBQUUsU0FBUyxLQUFHLElBQUUsQ0FBQztBQUFFLEtBQUMsS0FBRyxRQUFNLFFBQVEsY0FBWSxJQUFFLEVBQUUsU0FBUztBQUFHLFVBQU0sSUFBRSxnQkFBYyxPQUFPLFVBQVEsS0FBSyxTQUFRLElBQUU7QUFBSyxTQUFLLElBQUUsR0FBRyxHQUFFLEdBQUUsRUFBRSxNQUFNO0FBQUUsU0FBSyxJQUFFLEVBQUU7QUFBRSxRQUFHLEtBQUssR0FBRTtBQUFDLFVBQUcsRUFBRSxNQUFLLEVBQUUsR0FBRyxXQUFVLFNBQVMsR0FBRTtBQUFDLFVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7QUFBRSxlQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFBQSxNQUFDLENBQUM7QUFBQSxVQUFPLE1BQUssRUFBRSxZQUFVLFNBQVMsR0FBRTtBQUFDLFlBQUUsRUFBRTtBQUFLLFVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7QUFBRSxlQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFBQSxNQUFDO0FBQUUsV0FBSyxFQUFFLFlBQVksRUFBQyxNQUFLLFFBQU8sU0FBUSxHQUFFLFNBQVEsRUFBQyxDQUFDO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBQyxJQUFFLEtBQUs7QUFBRSxJQUFFLFFBQVE7QUFBRSxJQUFFLFFBQVE7QUFDN2xDLElBQUUsUUFBUTtBQUFFLElBQUUsUUFBUTtBQUFFLFdBQVMsRUFBRSxHQUFFO0FBQUMsTUFBRSxVQUFVLENBQUMsSUFBRSxFQUFFLFVBQVUsSUFBRSxPQUFPLElBQUUsV0FBVTtBQUFDLFlBQU0sSUFBRSxNQUFLLElBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxTQUFTO0FBQUUsVUFBSSxJQUFFLEVBQUUsRUFBRSxTQUFPLENBQUM7QUFBRSxVQUFJO0FBQUUsUUFBRSxDQUFDLE1BQUksSUFBRSxHQUFFLEVBQUUsT0FBTyxFQUFFLFNBQU8sR0FBRSxDQUFDO0FBQUcsVUFBRSxJQUFJLFFBQVEsU0FBUyxHQUFFO0FBQUMsbUJBQVcsV0FBVTtBQUFDLFlBQUUsRUFBRSxFQUFFLEVBQUUsSUFBRTtBQUFFLFlBQUUsRUFBRSxZQUFZLEVBQUMsTUFBSyxHQUFFLElBQUcsSUFBRyxNQUFLLEVBQUMsQ0FBQztBQUFBLFFBQUMsQ0FBQztBQUFBLE1BQUMsQ0FBQztBQUFFLGFBQU8sS0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFFLFFBQU07QUFBQSxJQUFDO0FBQUEsRUFBQztBQUMvVCxXQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFJO0FBQUUsUUFBRztBQUFDLFVBQUUsSUFBRSxJQUFLLDJCQUEwQixRQUFRLEVBQUcsWUFBWSxlQUFlLElBQUUsSUFBRSxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsZUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFFLEVBQUMsTUFBSyxrQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLElBQUUsSUFBRSxvQkFBbUIsRUFBQyxNQUFLLFNBQVEsQ0FBQztBQUFBLElBQUMsU0FBTyxHQUFFO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFDO0FBQUUsV0FBUyxFQUFFLEdBQUU7QUFBQyxRQUFHLEVBQUUsZ0JBQWdCLEdBQUcsUUFBTyxJQUFJLEVBQUUsQ0FBQztBQUFFLFFBQUksSUFBRSxFQUFFLFlBQVUsRUFBRSxPQUFLLEdBQUU7QUFBRSxTQUFLLElBQUUsQ0FBQztBQUFFLFNBQUssSUFBRSxDQUFDO0FBQUUsU0FBSyxJQUFFLENBQUM7QUFBRSxTQUFLLFdBQVMsRUFBRTtBQUFFLFNBQUssT0FBSyxJQUFFLEVBQUUsT0FBSyxFQUFFLE9BQUssRUFBRSxHQUFFLEtBQUssQ0FBQyxLQUFHO0FBQUssU0FBSyxJQUFFLEVBQUUsRUFBRSxVQUFVO0FBQUUsU0FBSyxLQUFHLElBQUUsRUFBRSxVQUFRLFNBQUssS0FBRyxDQUFDO0FBQUUsU0FBSyxRQUFNLEtBQUcsRUFBRTtBQUFFLFNBQUssS0FBRyxJQUFFLEVBQUUsUUFBTSxFQUFFLEdBQUUsS0FBSyxDQUFDO0FBQUUsU0FBSyxJQUFFLEtBQUcsRUFBRTtBQUFFLFNBQUssU0FBTyxJQUFFLEVBQUUsVUFBUSxJQUFJLEVBQUUsQ0FBQztBQUFFLE1BQUUsUUFBTTtBQUFHLFNBQUssSUFBRSxFQUFFO0FBQU8sU0FBSyxRQUFNO0FBQUcsUUFBRSxFQUFFO0FBQUUsUUFBSSxJQUFFLEVBQUUsU0FBTyxFQUFFLFNBQU87QUFBRSxNQUFFLENBQUMsTUFBSSxJQUFFLENBQUMsQ0FBQztBQUFHLGFBQVEsSUFBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLE1BQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUUsRUFBRSxDQUFDLElBQUUsT0FBTyxPQUFPLENBQUMsR0FBRSxHQUFFLENBQUMsSUFBRSxHQUN6d0IsS0FBSyxNQUFJLEVBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLEVBQUUsTUFBSSxLQUFLLElBQUUsU0FBSyxLQUFLLE1BQUksRUFBRSxDQUFDLElBQUUsSUFBSSxFQUFFLEdBQUUsS0FBSyxRQUFRLElBQUcsS0FBSyxFQUFFLENBQUMsSUFBRSxFQUFFLEdBQUUsS0FBSyxDQUFDLEdBQUUsS0FBSyxFQUFFLENBQUMsSUFBRTtBQUFFLFFBQUcsS0FBSyxFQUFFLE1BQUksSUFBRSxFQUFFLE9BQU0sRUFBRSxDQUFDLE1BQUksSUFBRSxDQUFDLENBQUMsSUFBRyxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxNQUFLLEVBQUUsQ0FBQyxJQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsS0FBSyxDQUFDO0FBQUUsU0FBSyxRQUFNO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxVQUFNLElBQUUsRUFBRSxNQUFNLEdBQUc7QUFBRSxRQUFJLElBQUU7QUFBRSxhQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsRUFBRSxDQUFDLEdBQUUsS0FBRyxFQUFFLFFBQVEsSUFBSSxNQUFJLElBQUUsRUFBRSxVQUFVLEdBQUUsRUFBRSxTQUFPLENBQUMsT0FBSyxFQUFFLENBQUMsSUFBRSxPQUFJLE1BQUksRUFBRSxHQUFHLElBQUU7QUFBRyxRQUFFLEVBQUUsV0FBUyxFQUFFLFNBQU87QUFBRyxXQUFPLElBQUUsSUFBRSxJQUFFLEVBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxXQUFTLEVBQUUsR0FBRSxHQUFFO0FBQUMsUUFBRyxFQUFFLENBQUMsRUFBRSxLQUFFLEVBQUUsQ0FBQztBQUFBLFFBQU8sVUFBUSxJQUFFLEdBQUUsS0FBRyxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQU87QUFBQSxFQUFDO0FBQzVlLFdBQVMsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFFLEVBQUUsQ0FBQztBQUFFLFFBQUcsTUFBSSxFQUFFLFNBQU8sRUFBRSxHQUFFLENBQUMsSUFBRTtBQUFBLGFBQVUsRUFBRSxLQUFHLEVBQUUsZ0JBQWMsTUFBTSxNQUFJLElBQUUsRUFBRSxDQUFDLElBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLFFBQU8sS0FBRSxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLElBQUcsSUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxRQUFHLElBQUUsRUFBRSxDQUFDLEVBQUUsS0FBRyxNQUFJLEVBQUUsU0FBTyxHQUFFO0FBQUMsVUFBRyxFQUFFLGdCQUFjLE9BQU07QUFBQyxZQUFHLEVBQUUsQ0FBQyxHQUFFO0FBQUMsZUFBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLElBQUksR0FBRSxFQUFFLENBQUMsR0FBRSxNQUFHLElBQUU7QUFBRTtBQUFBLFFBQU07QUFBQyxZQUFFLEVBQUUsS0FBSyxHQUFHO0FBQUEsTUFBQztBQUFDLFFBQUUsSUFBSSxHQUFFLEdBQUUsR0FBRSxJQUFFO0FBQUEsSUFBQyxXQUFTLEVBQUUsZ0JBQWMsTUFBTSxNQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsUUFBTyxLQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsTUFBRSxFQUFFO0FBQzNkLElBQUUsTUFBSSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxDQUFDLE1BQUksSUFBRSxHQUFFLElBQUUsRUFBRSxHQUFFLEtBQUssR0FBRztBQUFHLFFBQUcsTUFBSSxLQUFHLE1BQUksSUFBRztBQUFDLFVBQUcsQ0FBQyxLQUFHLEtBQUssU0FBUyxDQUFDLEVBQUUsUUFBTyxLQUFLLE9BQU8sR0FBRSxDQUFDO0FBQUUsZUFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsS0FBSyxFQUFFLFFBQU8sSUFBSSxLQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxNQUFJLElBQUUsQ0FBQyxDQUFDLElBQUcsRUFBRSxHQUFFLEdBQUUsS0FBSyxHQUFFLEdBQUUsS0FBSyxNQUFNLENBQUMsR0FBRSxHQUFFLEVBQUUsQ0FBQyxHQUFFLENBQUM7QUFBRSxVQUFHLEtBQUssR0FBRTtBQUFDLFlBQUksSUFBRSxFQUFFLEdBQUUsS0FBSyxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQUUsVUFBRSxDQUFDLE1BQUksSUFBRSxDQUFDLENBQUM7QUFBRyxpQkFBUSxJQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRyxJQUFFLEVBQUUsQ0FBQyxHQUFFLENBQUMsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLE1BQUksS0FBSyxFQUFFLENBQUMsSUFBRSxDQUFDLElBQUcsQ0FBQyxLQUFHLENBQUMsRUFBRSxTQUFTLENBQUM7QUFBRyxjQUFHLEVBQUUsRUFBRSxNQUFNLElBQUUsR0FBRSxLQUFLLEdBQUU7QUFBQyxrQkFBTSxJQUFFLEtBQUssU0FBUyxDQUFDLE1BQUksS0FBSyxTQUFTLENBQUMsSUFBRSxDQUFDO0FBQUcsY0FBRSxFQUFFLE1BQU0sSUFBRTtBQUFBLFVBQUM7QUFBQTtBQUFBLE1BQUM7QUFBQyxVQUFHLEtBQUssVUFBUSxDQUFDLEtBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFHO0FBQUMsWUFBSTtBQUMvZixZQUFHLEtBQUssR0FBRTtBQUFDLGNBQUUsRUFBRTtBQUFFLG1CQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsS0FBSyxFQUFFLFFBQU8sSUFBSSxLQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUEsUUFBQztBQUFDLGFBQUssTUFBTSxDQUFDLElBQUUsS0FBRztBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBLEVBQUk7QUFBRSxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssSUFBSSxHQUFFLEdBQUUsSUFBRTtBQUFBLEVBQUM7QUFBRSxJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsSUFBSSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQ3BPLElBQUUsU0FBTyxTQUFTLEdBQUU7QUFBQyxNQUFFLENBQUMsTUFBSSxJQUFFLEVBQUUsR0FBRSxLQUFLLEdBQUc7QUFBRyxRQUFHLEtBQUssU0FBUyxDQUFDLEdBQUU7QUFBQyxlQUFRLElBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxXQUFTLEtBQUssTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFFLENBQUMsS0FBSyxDQUFDLEdBQUUsQ0FBQyxLQUFLLElBQUcsSUFBSTtBQUFDLFVBQUcsS0FBSyxLQUFHLENBQUMsS0FBSyxFQUFFLFVBQVEsS0FBSyxLQUFLLEdBQUU7QUFBQyxZQUFFLEtBQUssRUFBRSxDQUFDO0FBQUUsY0FBTSxJQUFFLEVBQUUsUUFBUSxDQUFDO0FBQUUsZUFBSyxNQUFJLElBQUUsRUFBRSxTQUFPLEVBQUUsT0FBTyxHQUFFLENBQUMsSUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQUEsTUFBRTtBQUFDLFdBQUssU0FBTyxPQUFPLEtBQUssTUFBTSxDQUFDO0FBQUUsYUFBTyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBSTtBQUN2VixJQUFFLFNBQU8sU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxDQUFDLEtBQUcsRUFBRSxDQUFDLEtBQUcsSUFBRSxHQUFFLElBQUUsTUFBSSxFQUFFLENBQUMsTUFBSSxJQUFFLEdBQUUsSUFBRTtBQUFJLFFBQUksSUFBRSxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRTtBQUFFLFFBQUcsRUFBRSxLQUFHLEVBQUUsZ0JBQWMsTUFBTSxLQUFFLEdBQUUsSUFBRTtBQUFBLFNBQVM7QUFBQyxVQUFFLEVBQUUsU0FBTztBQUFFLFdBQUcsSUFBRSxFQUFFLFVBQVEsRUFBRSxTQUFPLEVBQUU7QUFBTSxVQUFFLEVBQUU7QUFBSSxVQUFFLEtBQUssU0FBTyxFQUFFO0FBQU8sVUFBRSxVQUFRLEVBQUU7QUFBSyxVQUFFLEVBQUUsU0FBTyxLQUFHO0FBQUksVUFBRSxFQUFFLFVBQVE7QUFBRSxVQUFHLE1BQUksRUFBRSxDQUFDLE1BQUksSUFBRSxDQUFDLENBQUMsSUFBRyxDQUFDLElBQUc7QUFBQyxpQkFBUSxJQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUcsSUFBRSxHQUFHLEtBQUssTUFBSyxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxNQUFNLElBQUUsR0FBRTtBQUFJLGVBQU8sSUFBRSxJQUFFLENBQUM7QUFBQSxNQUFDO0FBQUMsUUFBRSxDQUFDLE1BQUksSUFBRSxDQUFDLENBQUM7QUFBQSxJQUFFO0FBQUMsVUFBSSxJQUFFLEtBQUs7QUFBRyxRQUFFLE1BQUksSUFBRSxFQUFFLFVBQVEsS0FBRyxJQUFFLEVBQUU7QUFBUSxVQUFNLElBQUUsQ0FBQyxNQUFJLEtBQUssS0FBRyxLQUFLLFVBQVEsQ0FBQztBQUFFLGFBQVEsSUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQ3RmLEVBQUUsUUFBTyxLQUFJO0FBQUMsVUFBSTtBQUFFLFVBQUUsRUFBRSxDQUFDO0FBQUUsUUFBRSxDQUFDLE1BQUksSUFBRSxHQUFFLElBQUUsRUFBRSxPQUFNLElBQUUsRUFBRSxTQUFPLEdBQUUsSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLEVBQUUsVUFBUTtBQUFHLFVBQUcsRUFBRSxHQUFFLENBQUMsSUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLFlBQVksR0FBRSxHQUFFLEtBQUcsQ0FBQztBQUFBLFdBQU07QUFBQyxZQUFFLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLE9BQU8sR0FBRSxHQUFFLEtBQUcsQ0FBQztBQUFFLFlBQUUsS0FBRyxFQUFFO0FBQU8sWUFBRyxLQUFHLEdBQUU7QUFBQyxnQkFBTSxJQUFFLENBQUM7QUFBRSxjQUFJLElBQUU7QUFBRSxnQkFBSSxFQUFFLENBQUMsSUFBRSxDQUFDLENBQUM7QUFBRyxtQkFBUSxJQUFFLEdBQUUsSUFBRyxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEtBQUcsSUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFJLEVBQUUsT0FBTyxNQUFJLEVBQUUsRUFBRSxNQUFNLElBQUUsSUFBRSxDQUFDLENBQUMsSUFBRTtBQUFFLGdCQUFJLElBQUUsSUFBRSxHQUFHLEdBQUUsS0FBRyxLQUFJLEtBQUcsQ0FBQyxJQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQUEsUUFBTztBQUFDLFlBQUcsRUFBRSxHQUFFLENBQUMsSUFBRSxHQUFFLEVBQUUsR0FBRyxJQUFFO0FBQUEsaUJBQVUsRUFBRSxRQUFNLENBQUM7QUFBQSxNQUFDO0FBQUEsSUFBQztBQUFDLFFBQUcsR0FBRTtBQUFDLFlBQU0sSUFBRTtBQUFLLGFBQU8sSUFBSSxRQUFRLFNBQVMsR0FBRTtBQUFDLGdCQUFRLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxHQUFFO0FBQUMsWUFBRSxFQUFFO0FBQUEsWUFBTztBQUFBLFlBQ2hnQjtBQUFBLFlBQUU7QUFBQSxZQUFFO0FBQUEsVUFBQyxDQUFDO0FBQUEsUUFBQyxDQUFDO0FBQUEsTUFBQyxDQUFDO0FBQUEsSUFBQztBQUFDLFFBQUcsQ0FBQyxFQUFFLFFBQU0sQ0FBQztBQUFFLFFBQUcsTUFBSSxDQUFDLEtBQUcsQ0FBQyxLQUFLLE9BQU8sUUFBTyxFQUFFLENBQUM7QUFBRSxhQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxVQUFFLEVBQUUsQ0FBQztBQUFFLFFBQUUsVUFBUSxNQUFJLElBQUUsR0FBRyxLQUFLLE1BQUssQ0FBQztBQUFHLFVBQUcsRUFBRSxRQUFPO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBQyxPQUFNLEVBQUUsQ0FBQyxHQUFFLFFBQU8sRUFBQztBQUFBLElBQUM7QUFBQyxXQUFPO0FBQUEsRUFBQztBQUFFLFdBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFHLEVBQUUsU0FBTztBQUFFLFFBQUcsS0FBRyxJQUFFLEdBQUU7QUFBQyxVQUFHLElBQUUsS0FBRyxFQUFFLEtBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDO0FBQUUsWUFBSSxJQUFFLEdBQUcsS0FBSyxNQUFLLENBQUM7QUFBRyxhQUFNLEVBQUMsS0FBSSxHQUFFLFFBQU8sRUFBQztBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUMsV0FBUyxHQUFHLEdBQUU7QUFBQyxVQUFNLElBQUUsTUFBTSxFQUFFLE1BQU07QUFBRSxhQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxFQUFDLElBQUcsR0FBRSxLQUFJLEtBQUssTUFBTSxDQUFDLEVBQUM7QUFBRSxXQUFPO0FBQUEsRUFBQztBQUFDLElBQUUsVUFBUSxTQUFTLEdBQUU7QUFBQyxXQUFNLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQUM7QUFBRSxJQUFFLE1BQUksU0FBUyxHQUFFO0FBQUMsV0FBTyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQUM7QUFDMWdCLElBQUUsTUFBSSxTQUFTLEdBQUUsR0FBRTtBQUFDLFNBQUssTUFBTSxDQUFDLElBQUU7QUFBRSxXQUFPO0FBQUEsRUFBSTtBQUFFLElBQUUsY0FBWTtBQUFHLElBQUUsU0FBTyxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBSTtBQUFFLG9CQUFjLE9BQU8sTUFBSSxJQUFFLElBQUksUUFBUSxPQUFHO0FBQUMsVUFB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QUUsS0FBSyxHQUFHO0FBQUUsVUFBTSxJQUFFLENBQUM7QUFBRSxRQUFHLEdBQUU7QUFBQyxZQUFNLElBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRSxJQUFFLEVBQUU7QUFBTyxlQUFRLElBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBSSxNQUFJLElBQUUsRUFBRSxDQUFDLE9BQUssQ0FBQyxLQUFLLFVBQVEsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFHO0FBQUMsWUFBRSxFQUFFLENBQUM7QUFBRSxZQUFJLElBQUUsR0FBRyxDQUFDLEtBQUcsR0FBRSxJQUFFO0FBQUUsaUJBQVEsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxjQUFFLEVBQUUsQ0FBQztBQUFFLGdCQUFNLElBQUUsR0FBRyxDQUFDLEtBQUc7QUFBRSxlQUFHLE1BQUksTUFBSSxLQUFHLEdBQUUsSUFBRTtBQUFBLFFBQUU7QUFBQyxVQUFFLEdBQUcsSUFBRTtBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBLEVBQUM7QUFBRSxNQUFJLEtBQUcsRUFBQyxRQUFPLElBQUcsR0FBRSxPQUFHLEdBQUUsR0FBRTtBQUFFLE1BQU0sS0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFFLEtBQUksRUFBRSxJQUFJLEdBQUUsS0FBSSxFQUFFLElBQUksR0FBRSxLQUFJLEVBQUUsSUFBSSxHQUFFLEtBQUksRUFBRSxJQUFJLEdBQUUsS0FBSSxFQUFFLElBQUksR0FBRSxLQUFJLEVBQUUscUJBQXFCLEdBQUUsSUFBRyxFQUFFLHVCQUF1QixHQUFFLEVBQUU7QUFBRSxXQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLEdBQUcsS0FBSyxNQUFLLENBQUMsRUFBRSxLQUFLLEdBQUcsR0FBRSxJQUFFLEVBQUUsV0FBUyxJQUFFLEVBQUUsR0FBRSxFQUFFLElBQUcsTUFBSSxJQUFFLEVBQUUsV0FBUyxJQUFFLEdBQUcsQ0FBQyxJQUFHLE1BQUksSUFBRSxFQUFFLE1BQU0sR0FBRztBQUFLLFdBQU8sS0FBRyxD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
diff --git a/public/js/search-modal.7fa0b6cbbf4fe4c0c4818ea97eebb5e56fe6f14a0b6efde6fcc1b19d93d70ea2.js b/public/js/search-modal.7fa0b6cbbf4fe4c0c4818ea97eebb5e56fe6f14a0b6efde6fcc1b19d93d70ea2.js
deleted file mode 100644
index 0138d220..00000000
--- a/public/js/search-modal.7fa0b6cbbf4fe4c0c4818ea97eebb5e56fe6f14a0b6efde6fcc1b19d93d70ea2.js
+++ /dev/null
@@ -1,5301 +0,0 @@
-(() => {
- var __defProp = Object.defineProperty;
- var __defProps = Object.defineProperties;
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
- var __spreadValues = (a, b) => {
- for (var prop in b || (b = {}))
- if (__hasOwnProp.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- if (__getOwnPropSymbols)
- for (var prop of __getOwnPropSymbols(b)) {
- if (__propIsEnum.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- }
- return a;
- };
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
- var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
- };
-
- // node_modules/@popperjs/core/lib/index.js
- var lib_exports = {};
- __export(lib_exports, {
- afterMain: () => afterMain,
- afterRead: () => afterRead,
- afterWrite: () => afterWrite,
- applyStyles: () => applyStyles_default,
- arrow: () => arrow_default,
- auto: () => auto,
- basePlacements: () => basePlacements,
- beforeMain: () => beforeMain,
- beforeRead: () => beforeRead,
- beforeWrite: () => beforeWrite,
- bottom: () => bottom,
- clippingParents: () => clippingParents,
- computeStyles: () => computeStyles_default,
- createPopper: () => createPopper3,
- createPopperBase: () => createPopper,
- createPopperLite: () => createPopper2,
- detectOverflow: () => detectOverflow,
- end: () => end,
- eventListeners: () => eventListeners_default,
- flip: () => flip_default,
- hide: () => hide_default,
- left: () => left,
- main: () => main,
- modifierPhases: () => modifierPhases,
- offset: () => offset_default,
- placements: () => placements,
- popper: () => popper,
- popperGenerator: () => popperGenerator,
- popperOffsets: () => popperOffsets_default,
- preventOverflow: () => preventOverflow_default,
- read: () => read,
- reference: () => reference,
- right: () => right,
- start: () => start,
- top: () => top,
- variationPlacements: () => variationPlacements,
- viewport: () => viewport,
- write: () => write
- });
-
- // node_modules/@popperjs/core/lib/enums.js
- var top = "top";
- var bottom = "bottom";
- var right = "right";
- var left = "left";
- var auto = "auto";
- var basePlacements = [top, bottom, right, left];
- var start = "start";
- var end = "end";
- var clippingParents = "clippingParents";
- var viewport = "viewport";
- var popper = "popper";
- var reference = "reference";
- var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
- return acc.concat([placement + "-" + start, placement + "-" + end]);
- }, []);
- var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
- return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
- }, []);
- var beforeRead = "beforeRead";
- var read = "read";
- var afterRead = "afterRead";
- var beforeMain = "beforeMain";
- var main = "main";
- var afterMain = "afterMain";
- var beforeWrite = "beforeWrite";
- var write = "write";
- var afterWrite = "afterWrite";
- var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
-
- // node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
- function getNodeName(element) {
- return element ? (element.nodeName || "").toLowerCase() : null;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindow.js
- function getWindow(node) {
- if (node == null) {
- return window;
- }
- if (node.toString() !== "[object Window]") {
- var ownerDocument = node.ownerDocument;
- return ownerDocument ? ownerDocument.defaultView || window : window;
- }
- return node;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
- function isElement(node) {
- var OwnElement = getWindow(node).Element;
- return node instanceof OwnElement || node instanceof Element;
- }
- function isHTMLElement(node) {
- var OwnElement = getWindow(node).HTMLElement;
- return node instanceof OwnElement || node instanceof HTMLElement;
- }
- function isShadowRoot(node) {
- if (typeof ShadowRoot === "undefined") {
- return false;
- }
- var OwnElement = getWindow(node).ShadowRoot;
- return node instanceof OwnElement || node instanceof ShadowRoot;
- }
-
- // node_modules/@popperjs/core/lib/modifiers/applyStyles.js
- function applyStyles(_ref) {
- var state = _ref.state;
- Object.keys(state.elements).forEach(function(name) {
- var style = state.styles[name] || {};
- var attributes = state.attributes[name] || {};
- var element = state.elements[name];
- if (!isHTMLElement(element) || !getNodeName(element)) {
- return;
- }
- Object.assign(element.style, style);
- Object.keys(attributes).forEach(function(name2) {
- var value = attributes[name2];
- if (value === false) {
- element.removeAttribute(name2);
- } else {
- element.setAttribute(name2, value === true ? "" : value);
- }
- });
- });
- }
- function effect(_ref2) {
- var state = _ref2.state;
- var initialStyles = {
- popper: {
- position: state.options.strategy,
- left: "0",
- top: "0",
- margin: "0"
- },
- arrow: {
- position: "absolute"
- },
- reference: {}
- };
- Object.assign(state.elements.popper.style, initialStyles.popper);
- state.styles = initialStyles;
- if (state.elements.arrow) {
- Object.assign(state.elements.arrow.style, initialStyles.arrow);
- }
- return function() {
- Object.keys(state.elements).forEach(function(name) {
- var element = state.elements[name];
- var attributes = state.attributes[name] || {};
- var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
- var style = styleProperties.reduce(function(style2, property) {
- style2[property] = "";
- return style2;
- }, {});
- if (!isHTMLElement(element) || !getNodeName(element)) {
- return;
- }
- Object.assign(element.style, style);
- Object.keys(attributes).forEach(function(attribute) {
- element.removeAttribute(attribute);
- });
- });
- };
- }
- var applyStyles_default = {
- name: "applyStyles",
- enabled: true,
- phase: "write",
- fn: applyStyles,
- effect,
- requires: ["computeStyles"]
- };
-
- // node_modules/@popperjs/core/lib/utils/getBasePlacement.js
- function getBasePlacement(placement) {
- return placement.split("-")[0];
- }
-
- // node_modules/@popperjs/core/lib/utils/math.js
- var max = Math.max;
- var min = Math.min;
- var round = Math.round;
-
- // node_modules/@popperjs/core/lib/utils/userAgent.js
- function getUAString() {
- var uaData = navigator.userAgentData;
- if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
- return uaData.brands.map(function(item) {
- return item.brand + "/" + item.version;
- }).join(" ");
- }
- return navigator.userAgent;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js
- function isLayoutViewport() {
- return !/^((?!chrome|android).)*safari/i.test(getUAString());
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
- function getBoundingClientRect(element, includeScale, isFixedStrategy) {
- if (includeScale === void 0) {
- includeScale = false;
- }
- if (isFixedStrategy === void 0) {
- isFixedStrategy = false;
- }
- var clientRect = element.getBoundingClientRect();
- var scaleX = 1;
- var scaleY = 1;
- if (includeScale && isHTMLElement(element)) {
- scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
- scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
- }
- var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport;
- var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
- var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
- var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
- var width = clientRect.width / scaleX;
- var height = clientRect.height / scaleY;
- return {
- width,
- height,
- top: y,
- right: x + width,
- bottom: y + height,
- left: x,
- x,
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
- function getLayoutRect(element) {
- var clientRect = getBoundingClientRect(element);
- var width = element.offsetWidth;
- var height = element.offsetHeight;
- if (Math.abs(clientRect.width - width) <= 1) {
- width = clientRect.width;
- }
- if (Math.abs(clientRect.height - height) <= 1) {
- height = clientRect.height;
- }
- return {
- x: element.offsetLeft,
- y: element.offsetTop,
- width,
- height
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/contains.js
- function contains(parent, child) {
- var rootNode = child.getRootNode && child.getRootNode();
- if (parent.contains(child)) {
- return true;
- } else if (rootNode && isShadowRoot(rootNode)) {
- var next = child;
- do {
- if (next && parent.isSameNode(next)) {
- return true;
- }
- next = next.parentNode || next.host;
- } while (next);
- }
- return false;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
- function getComputedStyle2(element) {
- return getWindow(element).getComputedStyle(element);
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
- function isTableElement(element) {
- return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
- function getDocumentElement(element) {
- return ((isElement(element) ? element.ownerDocument : (
- // $FlowFixMe[prop-missing]
- element.document
- )) || window.document).documentElement;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
- function getParentNode(element) {
- if (getNodeName(element) === "html") {
- return element;
- }
- return (
- // this is a quicker (but less type safe) way to save quite some bytes from the bundle
- // $FlowFixMe[incompatible-return]
- // $FlowFixMe[prop-missing]
- element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
- element.parentNode || // DOM Element detected
- (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
- // $FlowFixMe[incompatible-call]: HTMLElement is a Node
- getDocumentElement(element)
- );
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
- function getTrueOffsetParent(element) {
- if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
- getComputedStyle2(element).position === "fixed") {
- return null;
- }
- return element.offsetParent;
- }
- function getContainingBlock(element) {
- var isFirefox = /firefox/i.test(getUAString());
- var isIE = /Trident/i.test(getUAString());
- if (isIE && isHTMLElement(element)) {
- var elementCss = getComputedStyle2(element);
- if (elementCss.position === "fixed") {
- return null;
- }
- }
- var currentNode = getParentNode(element);
- if (isShadowRoot(currentNode)) {
- currentNode = currentNode.host;
- }
- while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
- var css = getComputedStyle2(currentNode);
- if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
- return currentNode;
- } else {
- currentNode = currentNode.parentNode;
- }
- }
- return null;
- }
- function getOffsetParent(element) {
- var window2 = getWindow(element);
- var offsetParent = getTrueOffsetParent(element);
- while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") {
- offsetParent = getTrueOffsetParent(offsetParent);
- }
- if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) {
- return window2;
- }
- return offsetParent || getContainingBlock(element) || window2;
- }
-
- // node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
- function getMainAxisFromPlacement(placement) {
- return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
- }
-
- // node_modules/@popperjs/core/lib/utils/within.js
- function within(min2, value, max2) {
- return max(min2, min(value, max2));
- }
- function withinMaxClamp(min2, value, max2) {
- var v = within(min2, value, max2);
- return v > max2 ? max2 : v;
- }
-
- // node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
- function getFreshSideObject() {
- return {
- top: 0,
- right: 0,
- bottom: 0,
- left: 0
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
- function mergePaddingObject(paddingObject) {
- return Object.assign({}, getFreshSideObject(), paddingObject);
- }
-
- // node_modules/@popperjs/core/lib/utils/expandToHashMap.js
- function expandToHashMap(value, keys) {
- return keys.reduce(function(hashMap, key) {
- hashMap[key] = value;
- return hashMap;
- }, {});
- }
-
- // node_modules/@popperjs/core/lib/modifiers/arrow.js
- var toPaddingObject = function toPaddingObject2(padding, state) {
- padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
- placement: state.placement
- })) : padding;
- return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
- };
- function arrow(_ref) {
- var _state$modifiersData$;
- var state = _ref.state, name = _ref.name, options = _ref.options;
- var arrowElement = state.elements.arrow;
- var popperOffsets2 = state.modifiersData.popperOffsets;
- var basePlacement = getBasePlacement(state.placement);
- var axis = getMainAxisFromPlacement(basePlacement);
- var isVertical = [left, right].indexOf(basePlacement) >= 0;
- var len = isVertical ? "height" : "width";
- if (!arrowElement || !popperOffsets2) {
- return;
- }
- var paddingObject = toPaddingObject(options.padding, state);
- var arrowRect = getLayoutRect(arrowElement);
- var minProp = axis === "y" ? top : left;
- var maxProp = axis === "y" ? bottom : right;
- var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
- var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
- var arrowOffsetParent = getOffsetParent(arrowElement);
- var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
- var centerToReference = endDiff / 2 - startDiff / 2;
- var min2 = paddingObject[minProp];
- var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
- var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
- var offset2 = within(min2, center, max2);
- var axisProp = axis;
- state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
- }
- function effect2(_ref2) {
- var state = _ref2.state, options = _ref2.options;
- var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
- if (arrowElement == null) {
- return;
- }
- if (typeof arrowElement === "string") {
- arrowElement = state.elements.popper.querySelector(arrowElement);
- if (!arrowElement) {
- return;
- }
- }
- if (!contains(state.elements.popper, arrowElement)) {
- return;
- }
- state.elements.arrow = arrowElement;
- }
- var arrow_default = {
- name: "arrow",
- enabled: true,
- phase: "main",
- fn: arrow,
- effect: effect2,
- requires: ["popperOffsets"],
- requiresIfExists: ["preventOverflow"]
- };
-
- // node_modules/@popperjs/core/lib/utils/getVariation.js
- function getVariation(placement) {
- return placement.split("-")[1];
- }
-
- // node_modules/@popperjs/core/lib/modifiers/computeStyles.js
- var unsetSides = {
- top: "auto",
- right: "auto",
- bottom: "auto",
- left: "auto"
- };
- function roundOffsetsByDPR(_ref, win) {
- var x = _ref.x, y = _ref.y;
- var dpr = win.devicePixelRatio || 1;
- return {
- x: round(x * dpr) / dpr || 0,
- y: round(y * dpr) / dpr || 0
- };
- }
- function mapToStyles(_ref2) {
- var _Object$assign2;
- var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
- var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y;
- var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
- x,
- y
- }) : {
- x,
- y
- };
- x = _ref3.x;
- y = _ref3.y;
- var hasX = offsets.hasOwnProperty("x");
- var hasY = offsets.hasOwnProperty("y");
- var sideX = left;
- var sideY = top;
- var win = window;
- if (adaptive) {
- var offsetParent = getOffsetParent(popper2);
- var heightProp = "clientHeight";
- var widthProp = "clientWidth";
- if (offsetParent === getWindow(popper2)) {
- offsetParent = getDocumentElement(popper2);
- if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") {
- heightProp = "scrollHeight";
- widthProp = "scrollWidth";
- }
- }
- offsetParent = offsetParent;
- if (placement === top || (placement === left || placement === right) && variation === end) {
- sideY = bottom;
- var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : (
- // $FlowFixMe[prop-missing]
- offsetParent[heightProp]
- );
- y -= offsetY - popperRect.height;
- y *= gpuAcceleration ? 1 : -1;
- }
- if (placement === left || (placement === top || placement === bottom) && variation === end) {
- sideX = right;
- var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : (
- // $FlowFixMe[prop-missing]
- offsetParent[widthProp]
- );
- x -= offsetX - popperRect.width;
- x *= gpuAcceleration ? 1 : -1;
- }
- }
- var commonStyles = Object.assign({
- position
- }, adaptive && unsetSides);
- var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
- x,
- y
- }, getWindow(popper2)) : {
- x,
- y
- };
- x = _ref4.x;
- y = _ref4.y;
- if (gpuAcceleration) {
- var _Object$assign;
- return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
- }
- return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
- }
- function computeStyles(_ref5) {
- var state = _ref5.state, options = _ref5.options;
- var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
- var commonStyles = {
- placement: getBasePlacement(state.placement),
- variation: getVariation(state.placement),
- popper: state.elements.popper,
- popperRect: state.rects.popper,
- gpuAcceleration,
- isFixed: state.options.strategy === "fixed"
- };
- if (state.modifiersData.popperOffsets != null) {
- state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
- offsets: state.modifiersData.popperOffsets,
- position: state.options.strategy,
- adaptive,
- roundOffsets
- })));
- }
- if (state.modifiersData.arrow != null) {
- state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
- offsets: state.modifiersData.arrow,
- position: "absolute",
- adaptive: false,
- roundOffsets
- })));
- }
- state.attributes.popper = Object.assign({}, state.attributes.popper, {
- "data-popper-placement": state.placement
- });
- }
- var computeStyles_default = {
- name: "computeStyles",
- enabled: true,
- phase: "beforeWrite",
- fn: computeStyles,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/modifiers/eventListeners.js
- var passive = {
- passive: true
- };
- function effect3(_ref) {
- var state = _ref.state, instance = _ref.instance, options = _ref.options;
- var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
- var window2 = getWindow(state.elements.popper);
- var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
- if (scroll) {
- scrollParents.forEach(function(scrollParent) {
- scrollParent.addEventListener("scroll", instance.update, passive);
- });
- }
- if (resize) {
- window2.addEventListener("resize", instance.update, passive);
- }
- return function() {
- if (scroll) {
- scrollParents.forEach(function(scrollParent) {
- scrollParent.removeEventListener("scroll", instance.update, passive);
- });
- }
- if (resize) {
- window2.removeEventListener("resize", instance.update, passive);
- }
- };
- }
- var eventListeners_default = {
- name: "eventListeners",
- enabled: true,
- phase: "write",
- fn: function fn() {
- },
- effect: effect3,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
- var hash = {
- left: "right",
- right: "left",
- bottom: "top",
- top: "bottom"
- };
- function getOppositePlacement(placement) {
- return placement.replace(/left|right|bottom|top/g, function(matched) {
- return hash[matched];
- });
- }
-
- // node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
- var hash2 = {
- start: "end",
- end: "start"
- };
- function getOppositeVariationPlacement(placement) {
- return placement.replace(/start|end/g, function(matched) {
- return hash2[matched];
- });
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
- function getWindowScroll(node) {
- var win = getWindow(node);
- var scrollLeft = win.pageXOffset;
- var scrollTop = win.pageYOffset;
- return {
- scrollLeft,
- scrollTop
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
- function getWindowScrollBarX(element) {
- return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
- function getViewportRect(element, strategy) {
- var win = getWindow(element);
- var html = getDocumentElement(element);
- var visualViewport = win.visualViewport;
- var width = html.clientWidth;
- var height = html.clientHeight;
- var x = 0;
- var y = 0;
- if (visualViewport) {
- width = visualViewport.width;
- height = visualViewport.height;
- var layoutViewport = isLayoutViewport();
- if (layoutViewport || !layoutViewport && strategy === "fixed") {
- x = visualViewport.offsetLeft;
- y = visualViewport.offsetTop;
- }
- }
- return {
- width,
- height,
- x: x + getWindowScrollBarX(element),
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
- function getDocumentRect(element) {
- var _element$ownerDocumen;
- var html = getDocumentElement(element);
- var winScroll = getWindowScroll(element);
- var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
- var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
- var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
- var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
- var y = -winScroll.scrollTop;
- if (getComputedStyle2(body || html).direction === "rtl") {
- x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
- }
- return {
- width,
- height,
- x,
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
- function isScrollParent(element) {
- var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
- return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
- function getScrollParent(node) {
- if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
- return node.ownerDocument.body;
- }
- if (isHTMLElement(node) && isScrollParent(node)) {
- return node;
- }
- return getScrollParent(getParentNode(node));
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
- function listScrollParents(element, list) {
- var _element$ownerDocumen;
- if (list === void 0) {
- list = [];
- }
- var scrollParent = getScrollParent(element);
- var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
- var win = getWindow(scrollParent);
- var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
- var updatedList = list.concat(target);
- return isBody ? updatedList : (
- // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
- updatedList.concat(listScrollParents(getParentNode(target)))
- );
- }
-
- // node_modules/@popperjs/core/lib/utils/rectToClientRect.js
- function rectToClientRect(rect) {
- return Object.assign({}, rect, {
- left: rect.x,
- top: rect.y,
- right: rect.x + rect.width,
- bottom: rect.y + rect.height
- });
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
- function getInnerBoundingClientRect(element, strategy) {
- var rect = getBoundingClientRect(element, false, strategy === "fixed");
- rect.top = rect.top + element.clientTop;
- rect.left = rect.left + element.clientLeft;
- rect.bottom = rect.top + element.clientHeight;
- rect.right = rect.left + element.clientWidth;
- rect.width = element.clientWidth;
- rect.height = element.clientHeight;
- rect.x = rect.left;
- rect.y = rect.top;
- return rect;
- }
- function getClientRectFromMixedType(element, clippingParent, strategy) {
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
- }
- function getClippingParents(element) {
- var clippingParents2 = listScrollParents(getParentNode(element));
- var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0;
- var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
- if (!isElement(clipperElement)) {
- return [];
- }
- return clippingParents2.filter(function(clippingParent) {
- return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
- });
- }
- function getClippingRect(element, boundary, rootBoundary, strategy) {
- var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
- var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
- var firstClippingParent = clippingParents2[0];
- var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
- var rect = getClientRectFromMixedType(element, clippingParent, strategy);
- accRect.top = max(rect.top, accRect.top);
- accRect.right = min(rect.right, accRect.right);
- accRect.bottom = min(rect.bottom, accRect.bottom);
- accRect.left = max(rect.left, accRect.left);
- return accRect;
- }, getClientRectFromMixedType(element, firstClippingParent, strategy));
- clippingRect.width = clippingRect.right - clippingRect.left;
- clippingRect.height = clippingRect.bottom - clippingRect.top;
- clippingRect.x = clippingRect.left;
- clippingRect.y = clippingRect.top;
- return clippingRect;
- }
-
- // node_modules/@popperjs/core/lib/utils/computeOffsets.js
- function computeOffsets(_ref) {
- var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
- var basePlacement = placement ? getBasePlacement(placement) : null;
- var variation = placement ? getVariation(placement) : null;
- var commonX = reference2.x + reference2.width / 2 - element.width / 2;
- var commonY = reference2.y + reference2.height / 2 - element.height / 2;
- var offsets;
- switch (basePlacement) {
- case top:
- offsets = {
- x: commonX,
- y: reference2.y - element.height
- };
- break;
- case bottom:
- offsets = {
- x: commonX,
- y: reference2.y + reference2.height
- };
- break;
- case right:
- offsets = {
- x: reference2.x + reference2.width,
- y: commonY
- };
- break;
- case left:
- offsets = {
- x: reference2.x - element.width,
- y: commonY
- };
- break;
- default:
- offsets = {
- x: reference2.x,
- y: reference2.y
- };
- }
- var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
- if (mainAxis != null) {
- var len = mainAxis === "y" ? "height" : "width";
- switch (variation) {
- case start:
- offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
- break;
- case end:
- offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
- break;
- default:
- }
- }
- return offsets;
- }
-
- // node_modules/@popperjs/core/lib/utils/detectOverflow.js
- function detectOverflow(state, options) {
- if (options === void 0) {
- options = {};
- }
- var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
- var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
- var altContext = elementContext === popper ? reference : popper;
- var popperRect = state.rects.popper;
- var element = state.elements[altBoundary ? altContext : elementContext];
- var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
- var referenceClientRect = getBoundingClientRect(state.elements.reference);
- var popperOffsets2 = computeOffsets({
- reference: referenceClientRect,
- element: popperRect,
- strategy: "absolute",
- placement
- });
- var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
- var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
- var overflowOffsets = {
- top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
- bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
- left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
- right: elementClientRect.right - clippingClientRect.right + paddingObject.right
- };
- var offsetData = state.modifiersData.offset;
- if (elementContext === popper && offsetData) {
- var offset2 = offsetData[placement];
- Object.keys(overflowOffsets).forEach(function(key) {
- var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
- var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
- overflowOffsets[key] += offset2[axis] * multiply;
- });
- }
- return overflowOffsets;
- }
-
- // node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
- function computeAutoPlacement(state, options) {
- if (options === void 0) {
- options = {};
- }
- var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
- var variation = getVariation(placement);
- var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
- return getVariation(placement2) === variation;
- }) : basePlacements;
- var allowedPlacements = placements2.filter(function(placement2) {
- return allowedAutoPlacements.indexOf(placement2) >= 0;
- });
- if (allowedPlacements.length === 0) {
- allowedPlacements = placements2;
- }
- var overflows = allowedPlacements.reduce(function(acc, placement2) {
- acc[placement2] = detectOverflow(state, {
- placement: placement2,
- boundary,
- rootBoundary,
- padding
- })[getBasePlacement(placement2)];
- return acc;
- }, {});
- return Object.keys(overflows).sort(function(a, b) {
- return overflows[a] - overflows[b];
- });
- }
-
- // node_modules/@popperjs/core/lib/modifiers/flip.js
- function getExpandedFallbackPlacements(placement) {
- if (getBasePlacement(placement) === auto) {
- return [];
- }
- var oppositePlacement = getOppositePlacement(placement);
- return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
- }
- function flip(_ref) {
- var state = _ref.state, options = _ref.options, name = _ref.name;
- if (state.modifiersData[name]._skip) {
- return;
- }
- var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
- var preferredPlacement = state.options.placement;
- var basePlacement = getBasePlacement(preferredPlacement);
- var isBasePlacement = basePlacement === preferredPlacement;
- var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
- var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
- return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
- placement: placement2,
- boundary,
- rootBoundary,
- padding,
- flipVariations,
- allowedAutoPlacements
- }) : placement2);
- }, []);
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var checksMap = /* @__PURE__ */ new Map();
- var makeFallbackChecks = true;
- var firstFittingPlacement = placements2[0];
- for (var i = 0; i < placements2.length; i++) {
- var placement = placements2[i];
- var _basePlacement = getBasePlacement(placement);
- var isStartVariation = getVariation(placement) === start;
- var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
- var len = isVertical ? "width" : "height";
- var overflow = detectOverflow(state, {
- placement,
- boundary,
- rootBoundary,
- altBoundary,
- padding
- });
- var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
- if (referenceRect[len] > popperRect[len]) {
- mainVariationSide = getOppositePlacement(mainVariationSide);
- }
- var altVariationSide = getOppositePlacement(mainVariationSide);
- var checks = [];
- if (checkMainAxis) {
- checks.push(overflow[_basePlacement] <= 0);
- }
- if (checkAltAxis) {
- checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
- }
- if (checks.every(function(check) {
- return check;
- })) {
- firstFittingPlacement = placement;
- makeFallbackChecks = false;
- break;
- }
- checksMap.set(placement, checks);
- }
- if (makeFallbackChecks) {
- var numberOfChecks = flipVariations ? 3 : 1;
- var _loop = function _loop2(_i2) {
- var fittingPlacement = placements2.find(function(placement2) {
- var checks2 = checksMap.get(placement2);
- if (checks2) {
- return checks2.slice(0, _i2).every(function(check) {
- return check;
- });
- }
- });
- if (fittingPlacement) {
- firstFittingPlacement = fittingPlacement;
- return "break";
- }
- };
- for (var _i = numberOfChecks; _i > 0; _i--) {
- var _ret = _loop(_i);
- if (_ret === "break") break;
- }
- }
- if (state.placement !== firstFittingPlacement) {
- state.modifiersData[name]._skip = true;
- state.placement = firstFittingPlacement;
- state.reset = true;
- }
- }
- var flip_default = {
- name: "flip",
- enabled: true,
- phase: "main",
- fn: flip,
- requiresIfExists: ["offset"],
- data: {
- _skip: false
- }
- };
-
- // node_modules/@popperjs/core/lib/modifiers/hide.js
- function getSideOffsets(overflow, rect, preventedOffsets) {
- if (preventedOffsets === void 0) {
- preventedOffsets = {
- x: 0,
- y: 0
- };
- }
- return {
- top: overflow.top - rect.height - preventedOffsets.y,
- right: overflow.right - rect.width + preventedOffsets.x,
- bottom: overflow.bottom - rect.height + preventedOffsets.y,
- left: overflow.left - rect.width - preventedOffsets.x
- };
- }
- function isAnySideFullyClipped(overflow) {
- return [top, right, bottom, left].some(function(side) {
- return overflow[side] >= 0;
- });
- }
- function hide(_ref) {
- var state = _ref.state, name = _ref.name;
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var preventedOffsets = state.modifiersData.preventOverflow;
- var referenceOverflow = detectOverflow(state, {
- elementContext: "reference"
- });
- var popperAltOverflow = detectOverflow(state, {
- altBoundary: true
- });
- var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
- var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
- var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
- var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
- state.modifiersData[name] = {
- referenceClippingOffsets,
- popperEscapeOffsets,
- isReferenceHidden,
- hasPopperEscaped
- };
- state.attributes.popper = Object.assign({}, state.attributes.popper, {
- "data-popper-reference-hidden": isReferenceHidden,
- "data-popper-escaped": hasPopperEscaped
- });
- }
- var hide_default = {
- name: "hide",
- enabled: true,
- phase: "main",
- requiresIfExists: ["preventOverflow"],
- fn: hide
- };
-
- // node_modules/@popperjs/core/lib/modifiers/offset.js
- function distanceAndSkiddingToXY(placement, rects, offset2) {
- var basePlacement = getBasePlacement(placement);
- var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
- var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
- placement
- })) : offset2, skidding = _ref[0], distance = _ref[1];
- skidding = skidding || 0;
- distance = (distance || 0) * invertDistance;
- return [left, right].indexOf(basePlacement) >= 0 ? {
- x: distance,
- y: skidding
- } : {
- x: skidding,
- y: distance
- };
- }
- function offset(_ref2) {
- var state = _ref2.state, options = _ref2.options, name = _ref2.name;
- var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
- var data = placements.reduce(function(acc, placement) {
- acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
- return acc;
- }, {});
- var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
- if (state.modifiersData.popperOffsets != null) {
- state.modifiersData.popperOffsets.x += x;
- state.modifiersData.popperOffsets.y += y;
- }
- state.modifiersData[name] = data;
- }
- var offset_default = {
- name: "offset",
- enabled: true,
- phase: "main",
- requires: ["popperOffsets"],
- fn: offset
- };
-
- // node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
- function popperOffsets(_ref) {
- var state = _ref.state, name = _ref.name;
- state.modifiersData[name] = computeOffsets({
- reference: state.rects.reference,
- element: state.rects.popper,
- strategy: "absolute",
- placement: state.placement
- });
- }
- var popperOffsets_default = {
- name: "popperOffsets",
- enabled: true,
- phase: "read",
- fn: popperOffsets,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/utils/getAltAxis.js
- function getAltAxis(axis) {
- return axis === "x" ? "y" : "x";
- }
-
- // node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
- function preventOverflow(_ref) {
- var state = _ref.state, options = _ref.options, name = _ref.name;
- var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
- var overflow = detectOverflow(state, {
- boundary,
- rootBoundary,
- padding,
- altBoundary
- });
- var basePlacement = getBasePlacement(state.placement);
- var variation = getVariation(state.placement);
- var isBasePlacement = !variation;
- var mainAxis = getMainAxisFromPlacement(basePlacement);
- var altAxis = getAltAxis(mainAxis);
- var popperOffsets2 = state.modifiersData.popperOffsets;
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
- placement: state.placement
- })) : tetherOffset;
- var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
- mainAxis: tetherOffsetValue,
- altAxis: tetherOffsetValue
- } : Object.assign({
- mainAxis: 0,
- altAxis: 0
- }, tetherOffsetValue);
- var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
- var data = {
- x: 0,
- y: 0
- };
- if (!popperOffsets2) {
- return;
- }
- if (checkMainAxis) {
- var _offsetModifierState$;
- var mainSide = mainAxis === "y" ? top : left;
- var altSide = mainAxis === "y" ? bottom : right;
- var len = mainAxis === "y" ? "height" : "width";
- var offset2 = popperOffsets2[mainAxis];
- var min2 = offset2 + overflow[mainSide];
- var max2 = offset2 - overflow[altSide];
- var additive = tether ? -popperRect[len] / 2 : 0;
- var minLen = variation === start ? referenceRect[len] : popperRect[len];
- var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
- var arrowElement = state.elements.arrow;
- var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
- width: 0,
- height: 0
- };
- var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
- var arrowPaddingMin = arrowPaddingObject[mainSide];
- var arrowPaddingMax = arrowPaddingObject[altSide];
- var arrowLen = within(0, referenceRect[len], arrowRect[len]);
- var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
- var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
- var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
- var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
- var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
- var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
- var tetherMax = offset2 + maxOffset - offsetModifierValue;
- var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
- popperOffsets2[mainAxis] = preventedOffset;
- data[mainAxis] = preventedOffset - offset2;
- }
- if (checkAltAxis) {
- var _offsetModifierState$2;
- var _mainSide = mainAxis === "x" ? top : left;
- var _altSide = mainAxis === "x" ? bottom : right;
- var _offset = popperOffsets2[altAxis];
- var _len = altAxis === "y" ? "height" : "width";
- var _min = _offset + overflow[_mainSide];
- var _max = _offset - overflow[_altSide];
- var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
- var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
- var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
- var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
- var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
- popperOffsets2[altAxis] = _preventedOffset;
- data[altAxis] = _preventedOffset - _offset;
- }
- state.modifiersData[name] = data;
- }
- var preventOverflow_default = {
- name: "preventOverflow",
- enabled: true,
- phase: "main",
- fn: preventOverflow,
- requiresIfExists: ["offset"]
- };
-
- // node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
- function getHTMLElementScroll(element) {
- return {
- scrollLeft: element.scrollLeft,
- scrollTop: element.scrollTop
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
- function getNodeScroll(node) {
- if (node === getWindow(node) || !isHTMLElement(node)) {
- return getWindowScroll(node);
- } else {
- return getHTMLElementScroll(node);
- }
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
- function isElementScaled(element) {
- var rect = element.getBoundingClientRect();
- var scaleX = round(rect.width) / element.offsetWidth || 1;
- var scaleY = round(rect.height) / element.offsetHeight || 1;
- return scaleX !== 1 || scaleY !== 1;
- }
- function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
- if (isFixed === void 0) {
- isFixed = false;
- }
- var isOffsetParentAnElement = isHTMLElement(offsetParent);
- var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
- var documentElement = getDocumentElement(offsetParent);
- var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
- var scroll = {
- scrollLeft: 0,
- scrollTop: 0
- };
- var offsets = {
- x: 0,
- y: 0
- };
- if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
- if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078
- isScrollParent(documentElement)) {
- scroll = getNodeScroll(offsetParent);
- }
- if (isHTMLElement(offsetParent)) {
- offsets = getBoundingClientRect(offsetParent, true);
- offsets.x += offsetParent.clientLeft;
- offsets.y += offsetParent.clientTop;
- } else if (documentElement) {
- offsets.x = getWindowScrollBarX(documentElement);
- }
- }
- return {
- x: rect.left + scroll.scrollLeft - offsets.x,
- y: rect.top + scroll.scrollTop - offsets.y,
- width: rect.width,
- height: rect.height
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/orderModifiers.js
- function order(modifiers) {
- var map = /* @__PURE__ */ new Map();
- var visited = /* @__PURE__ */ new Set();
- var result = [];
- modifiers.forEach(function(modifier) {
- map.set(modifier.name, modifier);
- });
- function sort(modifier) {
- visited.add(modifier.name);
- var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
- requires.forEach(function(dep) {
- if (!visited.has(dep)) {
- var depModifier = map.get(dep);
- if (depModifier) {
- sort(depModifier);
- }
- }
- });
- result.push(modifier);
- }
- modifiers.forEach(function(modifier) {
- if (!visited.has(modifier.name)) {
- sort(modifier);
- }
- });
- return result;
- }
- function orderModifiers(modifiers) {
- var orderedModifiers = order(modifiers);
- return modifierPhases.reduce(function(acc, phase) {
- return acc.concat(orderedModifiers.filter(function(modifier) {
- return modifier.phase === phase;
- }));
- }, []);
- }
-
- // node_modules/@popperjs/core/lib/utils/debounce.js
- function debounce(fn2) {
- var pending;
- return function() {
- if (!pending) {
- pending = new Promise(function(resolve) {
- Promise.resolve().then(function() {
- pending = void 0;
- resolve(fn2());
- });
- });
- }
- return pending;
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/mergeByName.js
- function mergeByName(modifiers) {
- var merged = modifiers.reduce(function(merged2, current) {
- var existing = merged2[current.name];
- merged2[current.name] = existing ? Object.assign({}, existing, current, {
- options: Object.assign({}, existing.options, current.options),
- data: Object.assign({}, existing.data, current.data)
- }) : current;
- return merged2;
- }, {});
- return Object.keys(merged).map(function(key) {
- return merged[key];
- });
- }
-
- // node_modules/@popperjs/core/lib/createPopper.js
- var DEFAULT_OPTIONS = {
- placement: "bottom",
- modifiers: [],
- strategy: "absolute"
- };
- function areValidElements() {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- return !args.some(function(element) {
- return !(element && typeof element.getBoundingClientRect === "function");
- });
- }
- function popperGenerator(generatorOptions) {
- if (generatorOptions === void 0) {
- generatorOptions = {};
- }
- var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
- return function createPopper4(reference2, popper2, options) {
- if (options === void 0) {
- options = defaultOptions;
- }
- var state = {
- placement: "bottom",
- orderedModifiers: [],
- options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
- modifiersData: {},
- elements: {
- reference: reference2,
- popper: popper2
- },
- attributes: {},
- styles: {}
- };
- var effectCleanupFns = [];
- var isDestroyed = false;
- var instance = {
- state,
- setOptions: function setOptions(setOptionsAction) {
- var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
- cleanupModifierEffects();
- state.options = Object.assign({}, defaultOptions, state.options, options2);
- state.scrollParents = {
- reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
- popper: listScrollParents(popper2)
- };
- var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers)));
- state.orderedModifiers = orderedModifiers.filter(function(m) {
- return m.enabled;
- });
- runModifierEffects();
- return instance.update();
- },
- // Sync update – it will always be executed, even if not necessary. This
- // is useful for low frequency updates where sync behavior simplifies the
- // logic.
- // For high frequency updates (e.g. `resize` and `scroll` events), always
- // prefer the async Popper#update method
- forceUpdate: function forceUpdate() {
- if (isDestroyed) {
- return;
- }
- var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
- if (!areValidElements(reference3, popper3)) {
- return;
- }
- state.rects = {
- reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
- popper: getLayoutRect(popper3)
- };
- state.reset = false;
- state.placement = state.options.placement;
- state.orderedModifiers.forEach(function(modifier) {
- return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
- });
- for (var index = 0; index < state.orderedModifiers.length; index++) {
- if (state.reset === true) {
- state.reset = false;
- index = -1;
- continue;
- }
- var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
- if (typeof fn2 === "function") {
- state = fn2({
- state,
- options: _options,
- name,
- instance
- }) || state;
- }
- }
- },
- // Async and optimistically optimized update – it will not be executed if
- // not necessary (debounced to run at most once-per-tick)
- update: debounce(function() {
- return new Promise(function(resolve) {
- instance.forceUpdate();
- resolve(state);
- });
- }),
- destroy: function destroy() {
- cleanupModifierEffects();
- isDestroyed = true;
- }
- };
- if (!areValidElements(reference2, popper2)) {
- return instance;
- }
- instance.setOptions(options).then(function(state2) {
- if (!isDestroyed && options.onFirstUpdate) {
- options.onFirstUpdate(state2);
- }
- });
- function runModifierEffects() {
- state.orderedModifiers.forEach(function(_ref) {
- var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect;
- if (typeof effect4 === "function") {
- var cleanupFn = effect4({
- state,
- name,
- instance,
- options: options2
- });
- var noopFn = function noopFn2() {
- };
- effectCleanupFns.push(cleanupFn || noopFn);
- }
- });
- }
- function cleanupModifierEffects() {
- effectCleanupFns.forEach(function(fn2) {
- return fn2();
- });
- effectCleanupFns = [];
- }
- return instance;
- };
- }
- var createPopper = /* @__PURE__ */ popperGenerator();
-
- // node_modules/@popperjs/core/lib/popper-lite.js
- var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default];
- var createPopper2 = /* @__PURE__ */ popperGenerator({
- defaultModifiers
- });
-
- // node_modules/@popperjs/core/lib/popper.js
- var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
- var createPopper3 = /* @__PURE__ */ popperGenerator({
- defaultModifiers: defaultModifiers2
- });
-
- // node_modules/bootstrap/dist/js/bootstrap.esm.js
- var elementMap = /* @__PURE__ */ new Map();
- var Data = {
- set(element, key, instance) {
- if (!elementMap.has(element)) {
- elementMap.set(element, /* @__PURE__ */ new Map());
- }
- const instanceMap = elementMap.get(element);
- if (!instanceMap.has(key) && instanceMap.size !== 0) {
- console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
- return;
- }
- instanceMap.set(key, instance);
- },
- get(element, key) {
- if (elementMap.has(element)) {
- return elementMap.get(element).get(key) || null;
- }
- return null;
- },
- remove(element, key) {
- if (!elementMap.has(element)) {
- return;
- }
- const instanceMap = elementMap.get(element);
- instanceMap.delete(key);
- if (instanceMap.size === 0) {
- elementMap.delete(element);
- }
- }
- };
- var MAX_UID = 1e6;
- var MILLISECONDS_MULTIPLIER = 1e3;
- var TRANSITION_END = "transitionend";
- var parseSelector = (selector) => {
- if (selector && window.CSS && window.CSS.escape) {
- selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
- }
- return selector;
- };
- var toType = (object) => {
- if (object === null || object === void 0) {
- return `${object}`;
- }
- return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
- };
- var getUID = (prefix) => {
- do {
- prefix += Math.floor(Math.random() * MAX_UID);
- } while (document.getElementById(prefix));
- return prefix;
- };
- var getTransitionDurationFromElement = (element) => {
- if (!element) {
- return 0;
- }
- let {
- transitionDuration,
- transitionDelay
- } = window.getComputedStyle(element);
- const floatTransitionDuration = Number.parseFloat(transitionDuration);
- const floatTransitionDelay = Number.parseFloat(transitionDelay);
- if (!floatTransitionDuration && !floatTransitionDelay) {
- return 0;
- }
- transitionDuration = transitionDuration.split(",")[0];
- transitionDelay = transitionDelay.split(",")[0];
- return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
- };
- var triggerTransitionEnd = (element) => {
- element.dispatchEvent(new Event(TRANSITION_END));
- };
- var isElement2 = (object) => {
- if (!object || typeof object !== "object") {
- return false;
- }
- if (typeof object.jquery !== "undefined") {
- object = object[0];
- }
- return typeof object.nodeType !== "undefined";
- };
- var getElement = (object) => {
- if (isElement2(object)) {
- return object.jquery ? object[0] : object;
- }
- if (typeof object === "string" && object.length > 0) {
- return document.querySelector(parseSelector(object));
- }
- return null;
- };
- var isVisible = (element) => {
- if (!isElement2(element) || element.getClientRects().length === 0) {
- return false;
- }
- const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible";
- const closedDetails = element.closest("details:not([open])");
- if (!closedDetails) {
- return elementIsVisible;
- }
- if (closedDetails !== element) {
- const summary = element.closest("summary");
- if (summary && summary.parentNode !== closedDetails) {
- return false;
- }
- if (summary === null) {
- return false;
- }
- }
- return elementIsVisible;
- };
- var isDisabled = (element) => {
- if (!element || element.nodeType !== Node.ELEMENT_NODE) {
- return true;
- }
- if (element.classList.contains("disabled")) {
- return true;
- }
- if (typeof element.disabled !== "undefined") {
- return element.disabled;
- }
- return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false";
- };
- var findShadowRoot = (element) => {
- if (!document.documentElement.attachShadow) {
- return null;
- }
- if (typeof element.getRootNode === "function") {
- const root = element.getRootNode();
- return root instanceof ShadowRoot ? root : null;
- }
- if (element instanceof ShadowRoot) {
- return element;
- }
- if (!element.parentNode) {
- return null;
- }
- return findShadowRoot(element.parentNode);
- };
- var noop = () => {
- };
- var reflow = (element) => {
- element.offsetHeight;
- };
- var getjQuery = () => {
- if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) {
- return window.jQuery;
- }
- return null;
- };
- var DOMContentLoadedCallbacks = [];
- var onDOMContentLoaded = (callback) => {
- if (document.readyState === "loading") {
- if (!DOMContentLoadedCallbacks.length) {
- document.addEventListener("DOMContentLoaded", () => {
- for (const callback2 of DOMContentLoadedCallbacks) {
- callback2();
- }
- });
- }
- DOMContentLoadedCallbacks.push(callback);
- } else {
- callback();
- }
- };
- var isRTL = () => document.documentElement.dir === "rtl";
- var defineJQueryPlugin = (plugin) => {
- onDOMContentLoaded(() => {
- const $ = getjQuery();
- if ($) {
- const name = plugin.NAME;
- const JQUERY_NO_CONFLICT = $.fn[name];
- $.fn[name] = plugin.jQueryInterface;
- $.fn[name].Constructor = plugin;
- $.fn[name].noConflict = () => {
- $.fn[name] = JQUERY_NO_CONFLICT;
- return plugin.jQueryInterface;
- };
- }
- });
- };
- var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
- return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue;
- };
- var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
- if (!waitForTransition) {
- execute(callback);
- return;
- }
- const durationPadding = 5;
- const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
- let called = false;
- const handler = ({
- target
- }) => {
- if (target !== transitionElement) {
- return;
- }
- called = true;
- transitionElement.removeEventListener(TRANSITION_END, handler);
- execute(callback);
- };
- transitionElement.addEventListener(TRANSITION_END, handler);
- setTimeout(() => {
- if (!called) {
- triggerTransitionEnd(transitionElement);
- }
- }, emulatedDuration);
- };
- var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
- const listLength = list.length;
- let index = list.indexOf(activeElement);
- if (index === -1) {
- return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
- }
- index += shouldGetNext ? 1 : -1;
- if (isCycleAllowed) {
- index = (index + listLength) % listLength;
- }
- return list[Math.max(0, Math.min(index, listLength - 1))];
- };
- var namespaceRegex = /[^.]*(?=\..*)\.|.*/;
- var stripNameRegex = /\..*/;
- var stripUidRegex = /::\d+$/;
- var eventRegistry = {};
- var uidEvent = 1;
- var customEvents = {
- mouseenter: "mouseover",
- mouseleave: "mouseout"
- };
- var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
- function makeEventUid(element, uid) {
- return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
- }
- function getElementEvents(element) {
- const uid = makeEventUid(element);
- element.uidEvent = uid;
- eventRegistry[uid] = eventRegistry[uid] || {};
- return eventRegistry[uid];
- }
- function bootstrapHandler(element, fn2) {
- return function handler(event) {
- hydrateObj(event, {
- delegateTarget: element
- });
- if (handler.oneOff) {
- EventHandler.off(element, event.type, fn2);
- }
- return fn2.apply(element, [event]);
- };
- }
- function bootstrapDelegationHandler(element, selector, fn2) {
- return function handler(event) {
- const domElements = element.querySelectorAll(selector);
- for (let {
- target
- } = event; target && target !== this; target = target.parentNode) {
- for (const domElement of domElements) {
- if (domElement !== target) {
- continue;
- }
- hydrateObj(event, {
- delegateTarget: target
- });
- if (handler.oneOff) {
- EventHandler.off(element, event.type, selector, fn2);
- }
- return fn2.apply(target, [event]);
- }
- }
- };
- }
- function findHandler(events, callable, delegationSelector = null) {
- return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector);
- }
- function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
- const isDelegated = typeof handler === "string";
- const callable = isDelegated ? delegationFunction : handler || delegationFunction;
- let typeEvent = getTypeEvent(originalTypeEvent);
- if (!nativeEvents.has(typeEvent)) {
- typeEvent = originalTypeEvent;
- }
- return [isDelegated, callable, typeEvent];
- }
- function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
- if (typeof originalTypeEvent !== "string" || !element) {
- return;
- }
- let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
- if (originalTypeEvent in customEvents) {
- const wrapFunction = (fn3) => {
- return function(event) {
- if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
- return fn3.call(this, event);
- }
- };
- };
- callable = wrapFunction(callable);
- }
- const events = getElementEvents(element);
- const handlers = events[typeEvent] || (events[typeEvent] = {});
- const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
- if (previousFunction) {
- previousFunction.oneOff = previousFunction.oneOff && oneOff;
- return;
- }
- const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ""));
- const fn2 = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
- fn2.delegationSelector = isDelegated ? handler : null;
- fn2.callable = callable;
- fn2.oneOff = oneOff;
- fn2.uidEvent = uid;
- handlers[uid] = fn2;
- element.addEventListener(typeEvent, fn2, isDelegated);
- }
- function removeHandler(element, events, typeEvent, handler, delegationSelector) {
- const fn2 = findHandler(events[typeEvent], handler, delegationSelector);
- if (!fn2) {
- return;
- }
- element.removeEventListener(typeEvent, fn2, Boolean(delegationSelector));
- delete events[typeEvent][fn2.uidEvent];
- }
- function removeNamespacedHandlers(element, events, typeEvent, namespace) {
- const storeElementEvent = events[typeEvent] || {};
- for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
- if (handlerKey.includes(namespace)) {
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
- }
- }
- }
- function getTypeEvent(event) {
- event = event.replace(stripNameRegex, "");
- return customEvents[event] || event;
- }
- var EventHandler = {
- on(element, event, handler, delegationFunction) {
- addHandler(element, event, handler, delegationFunction, false);
- },
- one(element, event, handler, delegationFunction) {
- addHandler(element, event, handler, delegationFunction, true);
- },
- off(element, originalTypeEvent, handler, delegationFunction) {
- if (typeof originalTypeEvent !== "string" || !element) {
- return;
- }
- const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
- const inNamespace = typeEvent !== originalTypeEvent;
- const events = getElementEvents(element);
- const storeElementEvent = events[typeEvent] || {};
- const isNamespace = originalTypeEvent.startsWith(".");
- if (typeof callable !== "undefined") {
- if (!Object.keys(storeElementEvent).length) {
- return;
- }
- removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
- return;
- }
- if (isNamespace) {
- for (const elementEvent of Object.keys(events)) {
- removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
- }
- }
- for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
- const handlerKey = keyHandlers.replace(stripUidRegex, "");
- if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
- }
- }
- },
- trigger(element, event, args) {
- if (typeof event !== "string" || !element) {
- return null;
- }
- const $ = getjQuery();
- const typeEvent = getTypeEvent(event);
- const inNamespace = event !== typeEvent;
- let jQueryEvent = null;
- let bubbles = true;
- let nativeDispatch = true;
- let defaultPrevented = false;
- if (inNamespace && $) {
- jQueryEvent = $.Event(event, args);
- $(element).trigger(jQueryEvent);
- bubbles = !jQueryEvent.isPropagationStopped();
- nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
- defaultPrevented = jQueryEvent.isDefaultPrevented();
- }
- const evt = hydrateObj(new Event(event, {
- bubbles,
- cancelable: true
- }), args);
- if (defaultPrevented) {
- evt.preventDefault();
- }
- if (nativeDispatch) {
- element.dispatchEvent(evt);
- }
- if (evt.defaultPrevented && jQueryEvent) {
- jQueryEvent.preventDefault();
- }
- return evt;
- }
- };
- function hydrateObj(obj, meta = {}) {
- for (const [key, value] of Object.entries(meta)) {
- try {
- obj[key] = value;
- } catch (_unused) {
- Object.defineProperty(obj, key, {
- configurable: true,
- get() {
- return value;
- }
- });
- }
- }
- return obj;
- }
- function normalizeData(value) {
- if (value === "true") {
- return true;
- }
- if (value === "false") {
- return false;
- }
- if (value === Number(value).toString()) {
- return Number(value);
- }
- if (value === "" || value === "null") {
- return null;
- }
- if (typeof value !== "string") {
- return value;
- }
- try {
- return JSON.parse(decodeURIComponent(value));
- } catch (_unused) {
- return value;
- }
- }
- function normalizeDataKey(key) {
- return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
- }
- var Manipulator = {
- setDataAttribute(element, key, value) {
- element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
- },
- removeDataAttribute(element, key) {
- element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
- },
- getDataAttributes(element) {
- if (!element) {
- return {};
- }
- const attributes = {};
- const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig"));
- for (const key of bsKeys) {
- let pureKey = key.replace(/^bs/, "");
- pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
- attributes[pureKey] = normalizeData(element.dataset[key]);
- }
- return attributes;
- },
- getDataAttribute(element, key) {
- return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
- }
- };
- var Config = class {
- // Getters
- static get Default() {
- return {};
- }
- static get DefaultType() {
- return {};
- }
- static get NAME() {
- throw new Error('You have to implement the static method "NAME", for each component!');
- }
- _getConfig(config) {
- config = this._mergeConfigObj(config);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- _configAfterMerge(config) {
- return config;
- }
- _mergeConfigObj(config, element) {
- const jsonConfig = isElement2(element) ? Manipulator.getDataAttribute(element, "config") : {};
- return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), typeof jsonConfig === "object" ? jsonConfig : {}), isElement2(element) ? Manipulator.getDataAttributes(element) : {}), typeof config === "object" ? config : {});
- }
- _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
- for (const [property, expectedTypes] of Object.entries(configTypes)) {
- const value = config[property];
- const valueType = isElement2(value) ? "element" : toType(value);
- if (!new RegExp(expectedTypes).test(valueType)) {
- throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
- }
- }
- }
- };
- var VERSION = "5.3.3";
- var BaseComponent = class extends Config {
- constructor(element, config) {
- super();
- element = getElement(element);
- if (!element) {
- return;
- }
- this._element = element;
- this._config = this._getConfig(config);
- Data.set(this._element, this.constructor.DATA_KEY, this);
- }
- // Public
- dispose() {
- Data.remove(this._element, this.constructor.DATA_KEY);
- EventHandler.off(this._element, this.constructor.EVENT_KEY);
- for (const propertyName of Object.getOwnPropertyNames(this)) {
- this[propertyName] = null;
- }
- }
- _queueCallback(callback, element, isAnimated = true) {
- executeAfterTransition(callback, element, isAnimated);
- }
- _getConfig(config) {
- config = this._mergeConfigObj(config, this._element);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- // Static
- static getInstance(element) {
- return Data.get(getElement(element), this.DATA_KEY);
- }
- static getOrCreateInstance(element, config = {}) {
- return this.getInstance(element) || new this(element, typeof config === "object" ? config : null);
- }
- static get VERSION() {
- return VERSION;
- }
- static get DATA_KEY() {
- return `bs.${this.NAME}`;
- }
- static get EVENT_KEY() {
- return `.${this.DATA_KEY}`;
- }
- static eventName(name) {
- return `${name}${this.EVENT_KEY}`;
- }
- };
- var getSelector = (element) => {
- let selector = element.getAttribute("data-bs-target");
- if (!selector || selector === "#") {
- let hrefAttribute = element.getAttribute("href");
- if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) {
- return null;
- }
- if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) {
- hrefAttribute = `#${hrefAttribute.split("#")[1]}`;
- }
- selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null;
- }
- return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null;
- };
- var SelectorEngine = {
- find(selector, element = document.documentElement) {
- return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
- },
- findOne(selector, element = document.documentElement) {
- return Element.prototype.querySelector.call(element, selector);
- },
- children(element, selector) {
- return [].concat(...element.children).filter((child) => child.matches(selector));
- },
- parents(element, selector) {
- const parents = [];
- let ancestor = element.parentNode.closest(selector);
- while (ancestor) {
- parents.push(ancestor);
- ancestor = ancestor.parentNode.closest(selector);
- }
- return parents;
- },
- prev(element, selector) {
- let previous = element.previousElementSibling;
- while (previous) {
- if (previous.matches(selector)) {
- return [previous];
- }
- previous = previous.previousElementSibling;
- }
- return [];
- },
- // TODO: this is now unused; remove later along with prev()
- next(element, selector) {
- let next = element.nextElementSibling;
- while (next) {
- if (next.matches(selector)) {
- return [next];
- }
- next = next.nextElementSibling;
- }
- return [];
- },
- focusableChildren(element) {
- const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(",");
- return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el));
- },
- getSelectorFromElement(element) {
- const selector = getSelector(element);
- if (selector) {
- return SelectorEngine.findOne(selector) ? selector : null;
- }
- return null;
- },
- getElementFromSelector(element) {
- const selector = getSelector(element);
- return selector ? SelectorEngine.findOne(selector) : null;
- },
- getMultipleElementsFromSelector(element) {
- const selector = getSelector(element);
- return selector ? SelectorEngine.find(selector) : [];
- }
- };
- var enableDismissTrigger = (component, method = "hide") => {
- const clickEvent = `click.dismiss${component.EVENT_KEY}`;
- const name = component.NAME;
- EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event) {
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
- const instance = component.getOrCreateInstance(target);
- instance[method]();
- });
- };
- var NAME$f = "alert";
- var DATA_KEY$a = "bs.alert";
- var EVENT_KEY$b = `.${DATA_KEY$a}`;
- var EVENT_CLOSE = `close${EVENT_KEY$b}`;
- var EVENT_CLOSED = `closed${EVENT_KEY$b}`;
- var CLASS_NAME_FADE$5 = "fade";
- var CLASS_NAME_SHOW$8 = "show";
- var Alert = class _Alert extends BaseComponent {
- // Getters
- static get NAME() {
- return NAME$f;
- }
- // Public
- close() {
- const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
- if (closeEvent.defaultPrevented) {
- return;
- }
- this._element.classList.remove(CLASS_NAME_SHOW$8);
- const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
- this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
- }
- // Private
- _destroyElement() {
- this._element.remove();
- EventHandler.trigger(this._element, EVENT_CLOSED);
- this.dispose();
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Alert.getOrCreateInstance(this);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- });
- }
- };
- enableDismissTrigger(Alert, "close");
- defineJQueryPlugin(Alert);
- var NAME$e = "button";
- var DATA_KEY$9 = "bs.button";
- var EVENT_KEY$a = `.${DATA_KEY$9}`;
- var DATA_API_KEY$6 = ".data-api";
- var CLASS_NAME_ACTIVE$3 = "active";
- var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
- var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
- var Button = class _Button extends BaseComponent {
- // Getters
- static get NAME() {
- return NAME$e;
- }
- // Public
- toggle() {
- this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Button.getOrCreateInstance(this);
- if (config === "toggle") {
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event) => {
- event.preventDefault();
- const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
- const data = Button.getOrCreateInstance(button);
- data.toggle();
- });
- defineJQueryPlugin(Button);
- var NAME$d = "swipe";
- var EVENT_KEY$9 = ".bs.swipe";
- var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
- var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
- var EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
- var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
- var EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
- var POINTER_TYPE_TOUCH = "touch";
- var POINTER_TYPE_PEN = "pen";
- var CLASS_NAME_POINTER_EVENT = "pointer-event";
- var SWIPE_THRESHOLD = 40;
- var Default$c = {
- endCallback: null,
- leftCallback: null,
- rightCallback: null
- };
- var DefaultType$c = {
- endCallback: "(function|null)",
- leftCallback: "(function|null)",
- rightCallback: "(function|null)"
- };
- var Swipe = class _Swipe extends Config {
- constructor(element, config) {
- super();
- this._element = element;
- if (!element || !_Swipe.isSupported()) {
- return;
- }
- this._config = this._getConfig(config);
- this._deltaX = 0;
- this._supportPointerEvents = Boolean(window.PointerEvent);
- this._initEvents();
- }
- // Getters
- static get Default() {
- return Default$c;
- }
- static get DefaultType() {
- return DefaultType$c;
- }
- static get NAME() {
- return NAME$d;
- }
- // Public
- dispose() {
- EventHandler.off(this._element, EVENT_KEY$9);
- }
- // Private
- _start(event) {
- if (!this._supportPointerEvents) {
- this._deltaX = event.touches[0].clientX;
- return;
- }
- if (this._eventIsPointerPenTouch(event)) {
- this._deltaX = event.clientX;
- }
- }
- _end(event) {
- if (this._eventIsPointerPenTouch(event)) {
- this._deltaX = event.clientX - this._deltaX;
- }
- this._handleSwipe();
- execute(this._config.endCallback);
- }
- _move(event) {
- this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
- }
- _handleSwipe() {
- const absDeltaX = Math.abs(this._deltaX);
- if (absDeltaX <= SWIPE_THRESHOLD) {
- return;
- }
- const direction = absDeltaX / this._deltaX;
- this._deltaX = 0;
- if (!direction) {
- return;
- }
- execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
- }
- _initEvents() {
- if (this._supportPointerEvents) {
- EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => this._start(event));
- EventHandler.on(this._element, EVENT_POINTERUP, (event) => this._end(event));
- this._element.classList.add(CLASS_NAME_POINTER_EVENT);
- } else {
- EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => this._start(event));
- EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => this._move(event));
- EventHandler.on(this._element, EVENT_TOUCHEND, (event) => this._end(event));
- }
- }
- _eventIsPointerPenTouch(event) {
- return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
- }
- // Static
- static isSupported() {
- return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
- }
- };
- var NAME$c = "carousel";
- var DATA_KEY$8 = "bs.carousel";
- var EVENT_KEY$8 = `.${DATA_KEY$8}`;
- var DATA_API_KEY$5 = ".data-api";
- var ARROW_LEFT_KEY$1 = "ArrowLeft";
- var ARROW_RIGHT_KEY$1 = "ArrowRight";
- var TOUCHEVENT_COMPAT_WAIT = 500;
- var ORDER_NEXT = "next";
- var ORDER_PREV = "prev";
- var DIRECTION_LEFT = "left";
- var DIRECTION_RIGHT = "right";
- var EVENT_SLIDE = `slide${EVENT_KEY$8}`;
- var EVENT_SLID = `slid${EVENT_KEY$8}`;
- var EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
- var EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
- var EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
- var EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
- var EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
- var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
- var CLASS_NAME_CAROUSEL = "carousel";
- var CLASS_NAME_ACTIVE$2 = "active";
- var CLASS_NAME_SLIDE = "slide";
- var CLASS_NAME_END = "carousel-item-end";
- var CLASS_NAME_START = "carousel-item-start";
- var CLASS_NAME_NEXT = "carousel-item-next";
- var CLASS_NAME_PREV = "carousel-item-prev";
- var SELECTOR_ACTIVE = ".active";
- var SELECTOR_ITEM = ".carousel-item";
- var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
- var SELECTOR_ITEM_IMG = ".carousel-item img";
- var SELECTOR_INDICATORS = ".carousel-indicators";
- var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]";
- var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
- var KEY_TO_DIRECTION = {
- [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
- [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
- };
- var Default$b = {
- interval: 5e3,
- keyboard: true,
- pause: "hover",
- ride: false,
- touch: true,
- wrap: true
- };
- var DefaultType$b = {
- interval: "(number|boolean)",
- // TODO:v6 remove boolean support
- keyboard: "boolean",
- pause: "(string|boolean)",
- ride: "(boolean|string)",
- touch: "boolean",
- wrap: "boolean"
- };
- var Carousel = class _Carousel extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._interval = null;
- this._activeElement = null;
- this._isSliding = false;
- this.touchTimeout = null;
- this._swipeHelper = null;
- this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
- this._addEventListeners();
- if (this._config.ride === CLASS_NAME_CAROUSEL) {
- this.cycle();
- }
- }
- // Getters
- static get Default() {
- return Default$b;
- }
- static get DefaultType() {
- return DefaultType$b;
- }
- static get NAME() {
- return NAME$c;
- }
- // Public
- next() {
- this._slide(ORDER_NEXT);
- }
- nextWhenVisible() {
- if (!document.hidden && isVisible(this._element)) {
- this.next();
- }
- }
- prev() {
- this._slide(ORDER_PREV);
- }
- pause() {
- if (this._isSliding) {
- triggerTransitionEnd(this._element);
- }
- this._clearInterval();
- }
- cycle() {
- this._clearInterval();
- this._updateInterval();
- this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
- }
- _maybeEnableCycle() {
- if (!this._config.ride) {
- return;
- }
- if (this._isSliding) {
- EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
- return;
- }
- this.cycle();
- }
- to(index) {
- const items = this._getItems();
- if (index > items.length - 1 || index < 0) {
- return;
- }
- if (this._isSliding) {
- EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
- return;
- }
- const activeIndex = this._getItemIndex(this._getActive());
- if (activeIndex === index) {
- return;
- }
- const order2 = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
- this._slide(order2, items[index]);
- }
- dispose() {
- if (this._swipeHelper) {
- this._swipeHelper.dispose();
- }
- super.dispose();
- }
- // Private
- _configAfterMerge(config) {
- config.defaultInterval = config.interval;
- return config;
- }
- _addEventListeners() {
- if (this._config.keyboard) {
- EventHandler.on(this._element, EVENT_KEYDOWN$1, (event) => this._keydown(event));
- }
- if (this._config.pause === "hover") {
- EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
- EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
- }
- if (this._config.touch && Swipe.isSupported()) {
- this._addTouchEventListeners();
- }
- }
- _addTouchEventListeners() {
- for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
- EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault());
- }
- const endCallBack = () => {
- if (this._config.pause !== "hover") {
- return;
- }
- this.pause();
- if (this.touchTimeout) {
- clearTimeout(this.touchTimeout);
- }
- this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
- };
- const swipeConfig = {
- leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
- rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
- endCallback: endCallBack
- };
- this._swipeHelper = new Swipe(this._element, swipeConfig);
- }
- _keydown(event) {
- if (/input|textarea/i.test(event.target.tagName)) {
- return;
- }
- const direction = KEY_TO_DIRECTION[event.key];
- if (direction) {
- event.preventDefault();
- this._slide(this._directionToOrder(direction));
- }
- }
- _getItemIndex(element) {
- return this._getItems().indexOf(element);
- }
- _setActiveIndicatorElement(index) {
- if (!this._indicatorsElement) {
- return;
- }
- const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
- activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
- activeIndicator.removeAttribute("aria-current");
- const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
- if (newActiveIndicator) {
- newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
- newActiveIndicator.setAttribute("aria-current", "true");
- }
- }
- _updateInterval() {
- const element = this._activeElement || this._getActive();
- if (!element) {
- return;
- }
- const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10);
- this._config.interval = elementInterval || this._config.defaultInterval;
- }
- _slide(order2, element = null) {
- if (this._isSliding) {
- return;
- }
- const activeElement = this._getActive();
- const isNext = order2 === ORDER_NEXT;
- const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
- if (nextElement === activeElement) {
- return;
- }
- const nextElementIndex = this._getItemIndex(nextElement);
- const triggerEvent = (eventName) => {
- return EventHandler.trigger(this._element, eventName, {
- relatedTarget: nextElement,
- direction: this._orderToDirection(order2),
- from: this._getItemIndex(activeElement),
- to: nextElementIndex
- });
- };
- const slideEvent = triggerEvent(EVENT_SLIDE);
- if (slideEvent.defaultPrevented) {
- return;
- }
- if (!activeElement || !nextElement) {
- return;
- }
- const isCycling = Boolean(this._interval);
- this.pause();
- this._isSliding = true;
- this._setActiveIndicatorElement(nextElementIndex);
- this._activeElement = nextElement;
- const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
- const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
- nextElement.classList.add(orderClassName);
- reflow(nextElement);
- activeElement.classList.add(directionalClassName);
- nextElement.classList.add(directionalClassName);
- const completeCallBack = () => {
- nextElement.classList.remove(directionalClassName, orderClassName);
- nextElement.classList.add(CLASS_NAME_ACTIVE$2);
- activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
- this._isSliding = false;
- triggerEvent(EVENT_SLID);
- };
- this._queueCallback(completeCallBack, activeElement, this._isAnimated());
- if (isCycling) {
- this.cycle();
- }
- }
- _isAnimated() {
- return this._element.classList.contains(CLASS_NAME_SLIDE);
- }
- _getActive() {
- return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
- }
- _getItems() {
- return SelectorEngine.find(SELECTOR_ITEM, this._element);
- }
- _clearInterval() {
- if (this._interval) {
- clearInterval(this._interval);
- this._interval = null;
- }
- }
- _directionToOrder(direction) {
- if (isRTL()) {
- return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
- }
- return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
- }
- _orderToDirection(order2) {
- if (isRTL()) {
- return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
- }
- return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Carousel.getOrCreateInstance(this, config);
- if (typeof config === "number") {
- data.to(config);
- return;
- }
- if (typeof config === "string") {
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
- return;
- }
- event.preventDefault();
- const carousel = Carousel.getOrCreateInstance(target);
- const slideIndex = this.getAttribute("data-bs-slide-to");
- if (slideIndex) {
- carousel.to(slideIndex);
- carousel._maybeEnableCycle();
- return;
- }
- if (Manipulator.getDataAttribute(this, "slide") === "next") {
- carousel.next();
- carousel._maybeEnableCycle();
- return;
- }
- carousel.prev();
- carousel._maybeEnableCycle();
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
- const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
- for (const carousel of carousels) {
- Carousel.getOrCreateInstance(carousel);
- }
- });
- defineJQueryPlugin(Carousel);
- var NAME$b = "collapse";
- var DATA_KEY$7 = "bs.collapse";
- var EVENT_KEY$7 = `.${DATA_KEY$7}`;
- var DATA_API_KEY$4 = ".data-api";
- var EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
- var EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
- var EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
- var EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
- var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
- var CLASS_NAME_SHOW$7 = "show";
- var CLASS_NAME_COLLAPSE = "collapse";
- var CLASS_NAME_COLLAPSING = "collapsing";
- var CLASS_NAME_COLLAPSED = "collapsed";
- var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
- var CLASS_NAME_HORIZONTAL = "collapse-horizontal";
- var WIDTH = "width";
- var HEIGHT = "height";
- var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing";
- var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
- var Default$a = {
- parent: null,
- toggle: true
- };
- var DefaultType$a = {
- parent: "(null|element)",
- toggle: "boolean"
- };
- var Collapse = class _Collapse extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._isTransitioning = false;
- this._triggerArray = [];
- const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
- for (const elem of toggleList) {
- const selector = SelectorEngine.getSelectorFromElement(elem);
- const filterElement = SelectorEngine.find(selector).filter((foundElement) => foundElement === this._element);
- if (selector !== null && filterElement.length) {
- this._triggerArray.push(elem);
- }
- }
- this._initializeChildren();
- if (!this._config.parent) {
- this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
- }
- if (this._config.toggle) {
- this.toggle();
- }
- }
- // Getters
- static get Default() {
- return Default$a;
- }
- static get DefaultType() {
- return DefaultType$a;
- }
- static get NAME() {
- return NAME$b;
- }
- // Public
- toggle() {
- if (this._isShown()) {
- this.hide();
- } else {
- this.show();
- }
- }
- show() {
- if (this._isTransitioning || this._isShown()) {
- return;
- }
- let activeChildren = [];
- if (this._config.parent) {
- activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => _Collapse.getOrCreateInstance(element, {
- toggle: false
- }));
- }
- if (activeChildren.length && activeChildren[0]._isTransitioning) {
- return;
- }
- const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
- if (startEvent.defaultPrevented) {
- return;
- }
- for (const activeInstance of activeChildren) {
- activeInstance.hide();
- }
- const dimension = this._getDimension();
- this._element.classList.remove(CLASS_NAME_COLLAPSE);
- this._element.classList.add(CLASS_NAME_COLLAPSING);
- this._element.style[dimension] = 0;
- this._addAriaAndCollapsedClass(this._triggerArray, true);
- this._isTransitioning = true;
- const complete = () => {
- this._isTransitioning = false;
- this._element.classList.remove(CLASS_NAME_COLLAPSING);
- this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
- this._element.style[dimension] = "";
- EventHandler.trigger(this._element, EVENT_SHOWN$6);
- };
- const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
- const scrollSize = `scroll${capitalizedDimension}`;
- this._queueCallback(complete, this._element, true);
- this._element.style[dimension] = `${this._element[scrollSize]}px`;
- }
- hide() {
- if (this._isTransitioning || !this._isShown()) {
- return;
- }
- const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
- if (startEvent.defaultPrevented) {
- return;
- }
- const dimension = this._getDimension();
- this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_COLLAPSING);
- this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
- for (const trigger of this._triggerArray) {
- const element = SelectorEngine.getElementFromSelector(trigger);
- if (element && !this._isShown(element)) {
- this._addAriaAndCollapsedClass([trigger], false);
- }
- }
- this._isTransitioning = true;
- const complete = () => {
- this._isTransitioning = false;
- this._element.classList.remove(CLASS_NAME_COLLAPSING);
- this._element.classList.add(CLASS_NAME_COLLAPSE);
- EventHandler.trigger(this._element, EVENT_HIDDEN$6);
- };
- this._element.style[dimension] = "";
- this._queueCallback(complete, this._element, true);
- }
- _isShown(element = this._element) {
- return element.classList.contains(CLASS_NAME_SHOW$7);
- }
- // Private
- _configAfterMerge(config) {
- config.toggle = Boolean(config.toggle);
- config.parent = getElement(config.parent);
- return config;
- }
- _getDimension() {
- return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
- }
- _initializeChildren() {
- if (!this._config.parent) {
- return;
- }
- const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
- for (const element of children) {
- const selected = SelectorEngine.getElementFromSelector(element);
- if (selected) {
- this._addAriaAndCollapsedClass([element], this._isShown(selected));
- }
- }
- }
- _getFirstLevelChildren(selector) {
- const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
- return SelectorEngine.find(selector, this._config.parent).filter((element) => !children.includes(element));
- }
- _addAriaAndCollapsedClass(triggerArray, isOpen) {
- if (!triggerArray.length) {
- return;
- }
- for (const element of triggerArray) {
- element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
- element.setAttribute("aria-expanded", isOpen);
- }
- }
- // Static
- static jQueryInterface(config) {
- const _config = {};
- if (typeof config === "string" && /show|hide/.test(config)) {
- _config.toggle = false;
- }
- return this.each(function() {
- const data = _Collapse.getOrCreateInstance(this, _config);
- if (typeof config === "string") {
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event) {
- if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") {
- event.preventDefault();
- }
- for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
- Collapse.getOrCreateInstance(element, {
- toggle: false
- }).toggle();
- }
- });
- defineJQueryPlugin(Collapse);
- var NAME$a = "dropdown";
- var DATA_KEY$6 = "bs.dropdown";
- var EVENT_KEY$6 = `.${DATA_KEY$6}`;
- var DATA_API_KEY$3 = ".data-api";
- var ESCAPE_KEY$2 = "Escape";
- var TAB_KEY$1 = "Tab";
- var ARROW_UP_KEY$1 = "ArrowUp";
- var ARROW_DOWN_KEY$1 = "ArrowDown";
- var RIGHT_MOUSE_BUTTON = 2;
- var EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
- var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
- var EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
- var EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
- var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var CLASS_NAME_SHOW$6 = "show";
- var CLASS_NAME_DROPUP = "dropup";
- var CLASS_NAME_DROPEND = "dropend";
- var CLASS_NAME_DROPSTART = "dropstart";
- var CLASS_NAME_DROPUP_CENTER = "dropup-center";
- var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center";
- var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
- var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
- var SELECTOR_MENU = ".dropdown-menu";
- var SELECTOR_NAVBAR = ".navbar";
- var SELECTOR_NAVBAR_NAV = ".navbar-nav";
- var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)";
- var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start";
- var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end";
- var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start";
- var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end";
- var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start";
- var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start";
- var PLACEMENT_TOPCENTER = "top";
- var PLACEMENT_BOTTOMCENTER = "bottom";
- var Default$9 = {
- autoClose: true,
- boundary: "clippingParents",
- display: "dynamic",
- offset: [0, 2],
- popperConfig: null,
- reference: "toggle"
- };
- var DefaultType$9 = {
- autoClose: "(boolean|string)",
- boundary: "(string|element)",
- display: "string",
- offset: "(array|string|function)",
- popperConfig: "(null|object|function)",
- reference: "(string|element|object)"
- };
- var Dropdown = class _Dropdown extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._popper = null;
- this._parent = this._element.parentNode;
- this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
- this._inNavbar = this._detectNavbar();
- }
- // Getters
- static get Default() {
- return Default$9;
- }
- static get DefaultType() {
- return DefaultType$9;
- }
- static get NAME() {
- return NAME$a;
- }
- // Public
- toggle() {
- return this._isShown() ? this.hide() : this.show();
- }
- show() {
- if (isDisabled(this._element) || this._isShown()) {
- return;
- }
- const relatedTarget = {
- relatedTarget: this._element
- };
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
- if (showEvent.defaultPrevented) {
- return;
- }
- this._createPopper();
- if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.on(element, "mouseover", noop);
- }
- }
- this._element.focus();
- this._element.setAttribute("aria-expanded", true);
- this._menu.classList.add(CLASS_NAME_SHOW$6);
- this._element.classList.add(CLASS_NAME_SHOW$6);
- EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
- }
- hide() {
- if (isDisabled(this._element) || !this._isShown()) {
- return;
- }
- const relatedTarget = {
- relatedTarget: this._element
- };
- this._completeHide(relatedTarget);
- }
- dispose() {
- if (this._popper) {
- this._popper.destroy();
- }
- super.dispose();
- }
- update() {
- this._inNavbar = this._detectNavbar();
- if (this._popper) {
- this._popper.update();
- }
- }
- // Private
- _completeHide(relatedTarget) {
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
- if (hideEvent.defaultPrevented) {
- return;
- }
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.off(element, "mouseover", noop);
- }
- }
- if (this._popper) {
- this._popper.destroy();
- }
- this._menu.classList.remove(CLASS_NAME_SHOW$6);
- this._element.classList.remove(CLASS_NAME_SHOW$6);
- this._element.setAttribute("aria-expanded", "false");
- Manipulator.removeDataAttribute(this._menu, "popper");
- EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
- }
- _getConfig(config) {
- config = super._getConfig(config);
- if (typeof config.reference === "object" && !isElement2(config.reference) && typeof config.reference.getBoundingClientRect !== "function") {
- throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
- }
- return config;
- }
- _createPopper() {
- if (typeof lib_exports === "undefined") {
- throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
- }
- let referenceElement = this._element;
- if (this._config.reference === "parent") {
- referenceElement = this._parent;
- } else if (isElement2(this._config.reference)) {
- referenceElement = getElement(this._config.reference);
- } else if (typeof this._config.reference === "object") {
- referenceElement = this._config.reference;
- }
- const popperConfig = this._getPopperConfig();
- this._popper = createPopper3(referenceElement, this._menu, popperConfig);
- }
- _isShown() {
- return this._menu.classList.contains(CLASS_NAME_SHOW$6);
- }
- _getPlacement() {
- const parentDropdown = this._parent;
- if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
- return PLACEMENT_RIGHT;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
- return PLACEMENT_LEFT;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
- return PLACEMENT_TOPCENTER;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
- return PLACEMENT_BOTTOMCENTER;
- }
- const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end";
- if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
- return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
- }
- return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
- }
- _detectNavbar() {
- return this._element.closest(SELECTOR_NAVBAR) !== null;
- }
- _getOffset() {
- const {
- offset: offset2
- } = this._config;
- if (typeof offset2 === "string") {
- return offset2.split(",").map((value) => Number.parseInt(value, 10));
- }
- if (typeof offset2 === "function") {
- return (popperData) => offset2(popperData, this._element);
- }
- return offset2;
- }
- _getPopperConfig() {
- const defaultBsPopperConfig = {
- placement: this._getPlacement(),
- modifiers: [{
- name: "preventOverflow",
- options: {
- boundary: this._config.boundary
- }
- }, {
- name: "offset",
- options: {
- offset: this._getOffset()
- }
- }]
- };
- if (this._inNavbar || this._config.display === "static") {
- Manipulator.setDataAttribute(this._menu, "popper", "static");
- defaultBsPopperConfig.modifiers = [{
- name: "applyStyles",
- enabled: false
- }];
- }
- return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
- }
- _selectMenuItem({
- key,
- target
- }) {
- const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element));
- if (!items.length) {
- return;
- }
- getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Dropdown.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- static clearMenus(event) {
- if (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY$1) {
- return;
- }
- const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
- for (const toggle of openToggles) {
- const context = _Dropdown.getInstance(toggle);
- if (!context || context._config.autoClose === false) {
- continue;
- }
- const composedPath = event.composedPath();
- const isMenuTarget = composedPath.includes(context._menu);
- if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) {
- continue;
- }
- if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
- continue;
- }
- const relatedTarget = {
- relatedTarget: context._element
- };
- if (event.type === "click") {
- relatedTarget.clickEvent = event;
- }
- context._completeHide(relatedTarget);
- }
- }
- static dataApiKeydownHandler(event) {
- const isInput = /input|textarea/i.test(event.target.tagName);
- const isEscapeEvent = event.key === ESCAPE_KEY$2;
- const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
- if (!isUpOrDownEvent && !isEscapeEvent) {
- return;
- }
- if (isInput && !isEscapeEvent) {
- return;
- }
- event.preventDefault();
- const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
- const instance = _Dropdown.getOrCreateInstance(getToggleButton);
- if (isUpOrDownEvent) {
- event.stopPropagation();
- instance.show();
- instance._selectMenuItem(event);
- return;
- }
- if (instance._isShown()) {
- event.stopPropagation();
- instance.hide();
- getToggleButton.focus();
- }
- }
- };
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
- EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
- EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
- EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event) {
- event.preventDefault();
- Dropdown.getOrCreateInstance(this).toggle();
- });
- defineJQueryPlugin(Dropdown);
- var NAME$9 = "backdrop";
- var CLASS_NAME_FADE$4 = "fade";
- var CLASS_NAME_SHOW$5 = "show";
- var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
- var Default$8 = {
- className: "modal-backdrop",
- clickCallback: null,
- isAnimated: false,
- isVisible: true,
- // if false, we use the backdrop helper without adding any element to the dom
- rootElement: "body"
- // give the choice to place backdrop under different elements
- };
- var DefaultType$8 = {
- className: "string",
- clickCallback: "(function|null)",
- isAnimated: "boolean",
- isVisible: "boolean",
- rootElement: "(element|string)"
- };
- var Backdrop = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- this._isAppended = false;
- this._element = null;
- }
- // Getters
- static get Default() {
- return Default$8;
- }
- static get DefaultType() {
- return DefaultType$8;
- }
- static get NAME() {
- return NAME$9;
- }
- // Public
- show(callback) {
- if (!this._config.isVisible) {
- execute(callback);
- return;
- }
- this._append();
- const element = this._getElement();
- if (this._config.isAnimated) {
- reflow(element);
- }
- element.classList.add(CLASS_NAME_SHOW$5);
- this._emulateAnimation(() => {
- execute(callback);
- });
- }
- hide(callback) {
- if (!this._config.isVisible) {
- execute(callback);
- return;
- }
- this._getElement().classList.remove(CLASS_NAME_SHOW$5);
- this._emulateAnimation(() => {
- this.dispose();
- execute(callback);
- });
- }
- dispose() {
- if (!this._isAppended) {
- return;
- }
- EventHandler.off(this._element, EVENT_MOUSEDOWN);
- this._element.remove();
- this._isAppended = false;
- }
- // Private
- _getElement() {
- if (!this._element) {
- const backdrop = document.createElement("div");
- backdrop.className = this._config.className;
- if (this._config.isAnimated) {
- backdrop.classList.add(CLASS_NAME_FADE$4);
- }
- this._element = backdrop;
- }
- return this._element;
- }
- _configAfterMerge(config) {
- config.rootElement = getElement(config.rootElement);
- return config;
- }
- _append() {
- if (this._isAppended) {
- return;
- }
- const element = this._getElement();
- this._config.rootElement.append(element);
- EventHandler.on(element, EVENT_MOUSEDOWN, () => {
- execute(this._config.clickCallback);
- });
- this._isAppended = true;
- }
- _emulateAnimation(callback) {
- executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
- }
- };
- var NAME$8 = "focustrap";
- var DATA_KEY$5 = "bs.focustrap";
- var EVENT_KEY$5 = `.${DATA_KEY$5}`;
- var EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
- var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
- var TAB_KEY = "Tab";
- var TAB_NAV_FORWARD = "forward";
- var TAB_NAV_BACKWARD = "backward";
- var Default$7 = {
- autofocus: true,
- trapElement: null
- // The element to trap focus inside of
- };
- var DefaultType$7 = {
- autofocus: "boolean",
- trapElement: "element"
- };
- var FocusTrap = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- this._isActive = false;
- this._lastTabNavDirection = null;
- }
- // Getters
- static get Default() {
- return Default$7;
- }
- static get DefaultType() {
- return DefaultType$7;
- }
- static get NAME() {
- return NAME$8;
- }
- // Public
- activate() {
- if (this._isActive) {
- return;
- }
- if (this._config.autofocus) {
- this._config.trapElement.focus();
- }
- EventHandler.off(document, EVENT_KEY$5);
- EventHandler.on(document, EVENT_FOCUSIN$2, (event) => this._handleFocusin(event));
- EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
- this._isActive = true;
- }
- deactivate() {
- if (!this._isActive) {
- return;
- }
- this._isActive = false;
- EventHandler.off(document, EVENT_KEY$5);
- }
- // Private
- _handleFocusin(event) {
- const {
- trapElement
- } = this._config;
- if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
- return;
- }
- const elements = SelectorEngine.focusableChildren(trapElement);
- if (elements.length === 0) {
- trapElement.focus();
- } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
- elements[elements.length - 1].focus();
- } else {
- elements[0].focus();
- }
- }
- _handleKeydown(event) {
- if (event.key !== TAB_KEY) {
- return;
- }
- this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
- }
- };
- var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top";
- var SELECTOR_STICKY_CONTENT = ".sticky-top";
- var PROPERTY_PADDING = "padding-right";
- var PROPERTY_MARGIN = "margin-right";
- var ScrollBarHelper = class {
- constructor() {
- this._element = document.body;
- }
- // Public
- getWidth() {
- const documentWidth = document.documentElement.clientWidth;
- return Math.abs(window.innerWidth - documentWidth);
- }
- hide() {
- const width = this.getWidth();
- this._disableOverFlow();
- this._setElementAttributes(this._element, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
- this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
- this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, (calculatedValue) => calculatedValue - width);
- }
- reset() {
- this._resetElementAttributes(this._element, "overflow");
- this._resetElementAttributes(this._element, PROPERTY_PADDING);
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
- }
- isOverflowing() {
- return this.getWidth() > 0;
- }
- // Private
- _disableOverFlow() {
- this._saveInitialAttribute(this._element, "overflow");
- this._element.style.overflow = "hidden";
- }
- _setElementAttributes(selector, styleProperty, callback) {
- const scrollbarWidth = this.getWidth();
- const manipulationCallBack = (element) => {
- if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
- return;
- }
- this._saveInitialAttribute(element, styleProperty);
- const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
- element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
- };
- this._applyManipulationCallback(selector, manipulationCallBack);
- }
- _saveInitialAttribute(element, styleProperty) {
- const actualValue = element.style.getPropertyValue(styleProperty);
- if (actualValue) {
- Manipulator.setDataAttribute(element, styleProperty, actualValue);
- }
- }
- _resetElementAttributes(selector, styleProperty) {
- const manipulationCallBack = (element) => {
- const value = Manipulator.getDataAttribute(element, styleProperty);
- if (value === null) {
- element.style.removeProperty(styleProperty);
- return;
- }
- Manipulator.removeDataAttribute(element, styleProperty);
- element.style.setProperty(styleProperty, value);
- };
- this._applyManipulationCallback(selector, manipulationCallBack);
- }
- _applyManipulationCallback(selector, callBack) {
- if (isElement2(selector)) {
- callBack(selector);
- return;
- }
- for (const sel of SelectorEngine.find(selector, this._element)) {
- callBack(sel);
- }
- }
- };
- var NAME$7 = "modal";
- var DATA_KEY$4 = "bs.modal";
- var EVENT_KEY$4 = `.${DATA_KEY$4}`;
- var DATA_API_KEY$2 = ".data-api";
- var ESCAPE_KEY$1 = "Escape";
- var EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
- var EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
- var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
- var EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
- var EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
- var EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
- var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
- var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
- var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
- var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
- var CLASS_NAME_OPEN = "modal-open";
- var CLASS_NAME_FADE$3 = "fade";
- var CLASS_NAME_SHOW$4 = "show";
- var CLASS_NAME_STATIC = "modal-static";
- var OPEN_SELECTOR$1 = ".modal.show";
- var SELECTOR_DIALOG = ".modal-dialog";
- var SELECTOR_MODAL_BODY = ".modal-body";
- var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
- var Default$6 = {
- backdrop: true,
- focus: true,
- keyboard: true
- };
- var DefaultType$6 = {
- backdrop: "(boolean|string)",
- focus: "boolean",
- keyboard: "boolean"
- };
- var Modal = class _Modal extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
- this._backdrop = this._initializeBackDrop();
- this._focustrap = this._initializeFocusTrap();
- this._isShown = false;
- this._isTransitioning = false;
- this._scrollBar = new ScrollBarHelper();
- this._addEventListeners();
- }
- // Getters
- static get Default() {
- return Default$6;
- }
- static get DefaultType() {
- return DefaultType$6;
- }
- static get NAME() {
- return NAME$7;
- }
- // Public
- toggle(relatedTarget) {
- return this._isShown ? this.hide() : this.show(relatedTarget);
- }
- show(relatedTarget) {
- if (this._isShown || this._isTransitioning) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
- relatedTarget
- });
- if (showEvent.defaultPrevented) {
- return;
- }
- this._isShown = true;
- this._isTransitioning = true;
- this._scrollBar.hide();
- document.body.classList.add(CLASS_NAME_OPEN);
- this._adjustDialog();
- this._backdrop.show(() => this._showElement(relatedTarget));
- }
- hide() {
- if (!this._isShown || this._isTransitioning) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
- if (hideEvent.defaultPrevented) {
- return;
- }
- this._isShown = false;
- this._isTransitioning = true;
- this._focustrap.deactivate();
- this._element.classList.remove(CLASS_NAME_SHOW$4);
- this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
- }
- dispose() {
- EventHandler.off(window, EVENT_KEY$4);
- EventHandler.off(this._dialog, EVENT_KEY$4);
- this._backdrop.dispose();
- this._focustrap.deactivate();
- super.dispose();
- }
- handleUpdate() {
- this._adjustDialog();
- }
- // Private
- _initializeBackDrop() {
- return new Backdrop({
- isVisible: Boolean(this._config.backdrop),
- // 'static' option will be translated to true, and booleans will keep their value,
- isAnimated: this._isAnimated()
- });
- }
- _initializeFocusTrap() {
- return new FocusTrap({
- trapElement: this._element
- });
- }
- _showElement(relatedTarget) {
- if (!document.body.contains(this._element)) {
- document.body.append(this._element);
- }
- this._element.style.display = "block";
- this._element.removeAttribute("aria-hidden");
- this._element.setAttribute("aria-modal", true);
- this._element.setAttribute("role", "dialog");
- this._element.scrollTop = 0;
- const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
- if (modalBody) {
- modalBody.scrollTop = 0;
- }
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_SHOW$4);
- const transitionComplete = () => {
- if (this._config.focus) {
- this._focustrap.activate();
- }
- this._isTransitioning = false;
- EventHandler.trigger(this._element, EVENT_SHOWN$4, {
- relatedTarget
- });
- };
- this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
- }
- _addEventListeners() {
- EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event) => {
- if (event.key !== ESCAPE_KEY$1) {
- return;
- }
- if (this._config.keyboard) {
- this.hide();
- return;
- }
- this._triggerBackdropTransition();
- });
- EventHandler.on(window, EVENT_RESIZE$1, () => {
- if (this._isShown && !this._isTransitioning) {
- this._adjustDialog();
- }
- });
- EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => {
- EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => {
- if (this._element !== event.target || this._element !== event2.target) {
- return;
- }
- if (this._config.backdrop === "static") {
- this._triggerBackdropTransition();
- return;
- }
- if (this._config.backdrop) {
- this.hide();
- }
- });
- });
- }
- _hideModal() {
- this._element.style.display = "none";
- this._element.setAttribute("aria-hidden", true);
- this._element.removeAttribute("aria-modal");
- this._element.removeAttribute("role");
- this._isTransitioning = false;
- this._backdrop.hide(() => {
- document.body.classList.remove(CLASS_NAME_OPEN);
- this._resetAdjustments();
- this._scrollBar.reset();
- EventHandler.trigger(this._element, EVENT_HIDDEN$4);
- });
- }
- _isAnimated() {
- return this._element.classList.contains(CLASS_NAME_FADE$3);
- }
- _triggerBackdropTransition() {
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
- if (hideEvent.defaultPrevented) {
- return;
- }
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- const initialOverflowY = this._element.style.overflowY;
- if (initialOverflowY === "hidden" || this._element.classList.contains(CLASS_NAME_STATIC)) {
- return;
- }
- if (!isModalOverflowing) {
- this._element.style.overflowY = "hidden";
- }
- this._element.classList.add(CLASS_NAME_STATIC);
- this._queueCallback(() => {
- this._element.classList.remove(CLASS_NAME_STATIC);
- this._queueCallback(() => {
- this._element.style.overflowY = initialOverflowY;
- }, this._dialog);
- }, this._dialog);
- this._element.focus();
- }
- /**
- * The following methods are used to handle overflowing modals
- */
- _adjustDialog() {
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- const scrollbarWidth = this._scrollBar.getWidth();
- const isBodyOverflowing = scrollbarWidth > 0;
- if (isBodyOverflowing && !isModalOverflowing) {
- const property = isRTL() ? "paddingLeft" : "paddingRight";
- this._element.style[property] = `${scrollbarWidth}px`;
- }
- if (!isBodyOverflowing && isModalOverflowing) {
- const property = isRTL() ? "paddingRight" : "paddingLeft";
- this._element.style[property] = `${scrollbarWidth}px`;
- }
- }
- _resetAdjustments() {
- this._element.style.paddingLeft = "";
- this._element.style.paddingRight = "";
- }
- // Static
- static jQueryInterface(config, relatedTarget) {
- return this.each(function() {
- const data = _Modal.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](relatedTarget);
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- EventHandler.one(target, EVENT_SHOW$4, (showEvent) => {
- if (showEvent.defaultPrevented) {
- return;
- }
- EventHandler.one(target, EVENT_HIDDEN$4, () => {
- if (isVisible(this)) {
- this.focus();
- }
- });
- });
- const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
- if (alreadyOpen) {
- Modal.getInstance(alreadyOpen).hide();
- }
- const data = Modal.getOrCreateInstance(target);
- data.toggle(this);
- });
- enableDismissTrigger(Modal);
- defineJQueryPlugin(Modal);
- var NAME$6 = "offcanvas";
- var DATA_KEY$3 = "bs.offcanvas";
- var EVENT_KEY$3 = `.${DATA_KEY$3}`;
- var DATA_API_KEY$1 = ".data-api";
- var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
- var ESCAPE_KEY = "Escape";
- var CLASS_NAME_SHOW$3 = "show";
- var CLASS_NAME_SHOWING$1 = "showing";
- var CLASS_NAME_HIDING = "hiding";
- var CLASS_NAME_BACKDROP = "offcanvas-backdrop";
- var OPEN_SELECTOR = ".offcanvas.show";
- var EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
- var EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
- var EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
- var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
- var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
- var EVENT_RESIZE = `resize${EVENT_KEY$3}`;
- var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
- var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
- var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
- var Default$5 = {
- backdrop: true,
- keyboard: true,
- scroll: false
- };
- var DefaultType$5 = {
- backdrop: "(boolean|string)",
- keyboard: "boolean",
- scroll: "boolean"
- };
- var Offcanvas = class _Offcanvas extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._isShown = false;
- this._backdrop = this._initializeBackDrop();
- this._focustrap = this._initializeFocusTrap();
- this._addEventListeners();
- }
- // Getters
- static get Default() {
- return Default$5;
- }
- static get DefaultType() {
- return DefaultType$5;
- }
- static get NAME() {
- return NAME$6;
- }
- // Public
- toggle(relatedTarget) {
- return this._isShown ? this.hide() : this.show(relatedTarget);
- }
- show(relatedTarget) {
- if (this._isShown) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
- relatedTarget
- });
- if (showEvent.defaultPrevented) {
- return;
- }
- this._isShown = true;
- this._backdrop.show();
- if (!this._config.scroll) {
- new ScrollBarHelper().hide();
- }
- this._element.setAttribute("aria-modal", true);
- this._element.setAttribute("role", "dialog");
- this._element.classList.add(CLASS_NAME_SHOWING$1);
- const completeCallBack = () => {
- if (!this._config.scroll || this._config.backdrop) {
- this._focustrap.activate();
- }
- this._element.classList.add(CLASS_NAME_SHOW$3);
- this._element.classList.remove(CLASS_NAME_SHOWING$1);
- EventHandler.trigger(this._element, EVENT_SHOWN$3, {
- relatedTarget
- });
- };
- this._queueCallback(completeCallBack, this._element, true);
- }
- hide() {
- if (!this._isShown) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
- if (hideEvent.defaultPrevented) {
- return;
- }
- this._focustrap.deactivate();
- this._element.blur();
- this._isShown = false;
- this._element.classList.add(CLASS_NAME_HIDING);
- this._backdrop.hide();
- const completeCallback = () => {
- this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
- this._element.removeAttribute("aria-modal");
- this._element.removeAttribute("role");
- if (!this._config.scroll) {
- new ScrollBarHelper().reset();
- }
- EventHandler.trigger(this._element, EVENT_HIDDEN$3);
- };
- this._queueCallback(completeCallback, this._element, true);
- }
- dispose() {
- this._backdrop.dispose();
- this._focustrap.deactivate();
- super.dispose();
- }
- // Private
- _initializeBackDrop() {
- const clickCallback = () => {
- if (this._config.backdrop === "static") {
- EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
- return;
- }
- this.hide();
- };
- const isVisible2 = Boolean(this._config.backdrop);
- return new Backdrop({
- className: CLASS_NAME_BACKDROP,
- isVisible: isVisible2,
- isAnimated: true,
- rootElement: this._element.parentNode,
- clickCallback: isVisible2 ? clickCallback : null
- });
- }
- _initializeFocusTrap() {
- return new FocusTrap({
- trapElement: this._element
- });
- }
- _addEventListeners() {
- EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
- if (event.key !== ESCAPE_KEY) {
- return;
- }
- if (this._config.keyboard) {
- this.hide();
- return;
- }
- EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
- });
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Offcanvas.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- EventHandler.one(target, EVENT_HIDDEN$3, () => {
- if (isVisible(this)) {
- this.focus();
- }
- });
- const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
- if (alreadyOpen && alreadyOpen !== target) {
- Offcanvas.getInstance(alreadyOpen).hide();
- }
- const data = Offcanvas.getOrCreateInstance(target);
- data.toggle(this);
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
- for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
- Offcanvas.getOrCreateInstance(selector).show();
- }
- });
- EventHandler.on(window, EVENT_RESIZE, () => {
- for (const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]")) {
- if (getComputedStyle(element).position !== "fixed") {
- Offcanvas.getOrCreateInstance(element).hide();
- }
- }
- });
- enableDismissTrigger(Offcanvas);
- defineJQueryPlugin(Offcanvas);
- var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
- var DefaultAllowlist = {
- // Global attributes allowed on any supplied element below.
- "*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN],
- a: ["target", "href", "title", "rel"],
- area: [],
- b: [],
- br: [],
- col: [],
- code: [],
- dd: [],
- div: [],
- dl: [],
- dt: [],
- em: [],
- hr: [],
- h1: [],
- h2: [],
- h3: [],
- h4: [],
- h5: [],
- h6: [],
- i: [],
- img: ["src", "srcset", "alt", "title", "width", "height"],
- li: [],
- ol: [],
- p: [],
- pre: [],
- s: [],
- small: [],
- span: [],
- sub: [],
- sup: [],
- strong: [],
- u: [],
- ul: []
- };
- var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]);
- var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
- var allowedAttribute = (attribute, allowedAttributeList) => {
- const attributeName = attribute.nodeName.toLowerCase();
- if (allowedAttributeList.includes(attributeName)) {
- if (uriAttributes.has(attributeName)) {
- return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
- }
- return true;
- }
- return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName));
- };
- function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
- if (!unsafeHtml.length) {
- return unsafeHtml;
- }
- if (sanitizeFunction && typeof sanitizeFunction === "function") {
- return sanitizeFunction(unsafeHtml);
- }
- const domParser = new window.DOMParser();
- const createdDocument = domParser.parseFromString(unsafeHtml, "text/html");
- const elements = [].concat(...createdDocument.body.querySelectorAll("*"));
- for (const element of elements) {
- const elementName = element.nodeName.toLowerCase();
- if (!Object.keys(allowList).includes(elementName)) {
- element.remove();
- continue;
- }
- const attributeList = [].concat(...element.attributes);
- const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []);
- for (const attribute of attributeList) {
- if (!allowedAttribute(attribute, allowedAttributes)) {
- element.removeAttribute(attribute.nodeName);
- }
- }
- }
- return createdDocument.body.innerHTML;
- }
- var NAME$5 = "TemplateFactory";
- var Default$4 = {
- allowList: DefaultAllowlist,
- content: {},
- // { selector : text , selector2 : text2 , }
- extraClass: "",
- html: false,
- sanitize: true,
- sanitizeFn: null,
- template: "
"
- };
- var DefaultType$4 = {
- allowList: "object",
- content: "object",
- extraClass: "(string|function)",
- html: "boolean",
- sanitize: "boolean",
- sanitizeFn: "(null|function)",
- template: "string"
- };
- var DefaultContentType = {
- entry: "(string|element|function|null)",
- selector: "(string|element)"
- };
- var TemplateFactory = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- }
- // Getters
- static get Default() {
- return Default$4;
- }
- static get DefaultType() {
- return DefaultType$4;
- }
- static get NAME() {
- return NAME$5;
- }
- // Public
- getContent() {
- return Object.values(this._config.content).map((config) => this._resolvePossibleFunction(config)).filter(Boolean);
- }
- hasContent() {
- return this.getContent().length > 0;
- }
- changeContent(content) {
- this._checkContent(content);
- this._config.content = __spreadValues(__spreadValues({}, this._config.content), content);
- return this;
- }
- toHtml() {
- const templateWrapper = document.createElement("div");
- templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
- for (const [selector, text] of Object.entries(this._config.content)) {
- this._setContent(templateWrapper, text, selector);
- }
- const template = templateWrapper.children[0];
- const extraClass = this._resolvePossibleFunction(this._config.extraClass);
- if (extraClass) {
- template.classList.add(...extraClass.split(" "));
- }
- return template;
- }
- // Private
- _typeCheckConfig(config) {
- super._typeCheckConfig(config);
- this._checkContent(config.content);
- }
- _checkContent(arg) {
- for (const [selector, content] of Object.entries(arg)) {
- super._typeCheckConfig({
- selector,
- entry: content
- }, DefaultContentType);
- }
- }
- _setContent(template, content, selector) {
- const templateElement = SelectorEngine.findOne(selector, template);
- if (!templateElement) {
- return;
- }
- content = this._resolvePossibleFunction(content);
- if (!content) {
- templateElement.remove();
- return;
- }
- if (isElement2(content)) {
- this._putElementInTemplate(getElement(content), templateElement);
- return;
- }
- if (this._config.html) {
- templateElement.innerHTML = this._maybeSanitize(content);
- return;
- }
- templateElement.textContent = content;
- }
- _maybeSanitize(arg) {
- return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
- }
- _resolvePossibleFunction(arg) {
- return execute(arg, [this]);
- }
- _putElementInTemplate(element, templateElement) {
- if (this._config.html) {
- templateElement.innerHTML = "";
- templateElement.append(element);
- return;
- }
- templateElement.textContent = element.textContent;
- }
- };
- var NAME$4 = "tooltip";
- var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]);
- var CLASS_NAME_FADE$2 = "fade";
- var CLASS_NAME_MODAL = "modal";
- var CLASS_NAME_SHOW$2 = "show";
- var SELECTOR_TOOLTIP_INNER = ".tooltip-inner";
- var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
- var EVENT_MODAL_HIDE = "hide.bs.modal";
- var TRIGGER_HOVER = "hover";
- var TRIGGER_FOCUS = "focus";
- var TRIGGER_CLICK = "click";
- var TRIGGER_MANUAL = "manual";
- var EVENT_HIDE$2 = "hide";
- var EVENT_HIDDEN$2 = "hidden";
- var EVENT_SHOW$2 = "show";
- var EVENT_SHOWN$2 = "shown";
- var EVENT_INSERTED = "inserted";
- var EVENT_CLICK$1 = "click";
- var EVENT_FOCUSIN$1 = "focusin";
- var EVENT_FOCUSOUT$1 = "focusout";
- var EVENT_MOUSEENTER = "mouseenter";
- var EVENT_MOUSELEAVE = "mouseleave";
- var AttachmentMap = {
- AUTO: "auto",
- TOP: "top",
- RIGHT: isRTL() ? "left" : "right",
- BOTTOM: "bottom",
- LEFT: isRTL() ? "right" : "left"
- };
- var Default$3 = {
- allowList: DefaultAllowlist,
- animation: true,
- boundary: "clippingParents",
- container: false,
- customClass: "",
- delay: 0,
- fallbackPlacements: ["top", "right", "bottom", "left"],
- html: false,
- offset: [0, 6],
- placement: "top",
- popperConfig: null,
- sanitize: true,
- sanitizeFn: null,
- selector: false,
- template: '',
- title: "",
- trigger: "hover focus"
- };
- var DefaultType$3 = {
- allowList: "object",
- animation: "boolean",
- boundary: "(string|element)",
- container: "(string|element|boolean)",
- customClass: "(string|function)",
- delay: "(number|object)",
- fallbackPlacements: "array",
- html: "boolean",
- offset: "(array|string|function)",
- placement: "(string|function)",
- popperConfig: "(null|object|function)",
- sanitize: "boolean",
- sanitizeFn: "(null|function)",
- selector: "(string|boolean)",
- template: "string",
- title: "(string|element|function)",
- trigger: "string"
- };
- var Tooltip = class _Tooltip extends BaseComponent {
- constructor(element, config) {
- if (typeof lib_exports === "undefined") {
- throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
- }
- super(element, config);
- this._isEnabled = true;
- this._timeout = 0;
- this._isHovered = null;
- this._activeTrigger = {};
- this._popper = null;
- this._templateFactory = null;
- this._newContent = null;
- this.tip = null;
- this._setListeners();
- if (!this._config.selector) {
- this._fixTitle();
- }
- }
- // Getters
- static get Default() {
- return Default$3;
- }
- static get DefaultType() {
- return DefaultType$3;
- }
- static get NAME() {
- return NAME$4;
- }
- // Public
- enable() {
- this._isEnabled = true;
- }
- disable() {
- this._isEnabled = false;
- }
- toggleEnabled() {
- this._isEnabled = !this._isEnabled;
- }
- toggle() {
- if (!this._isEnabled) {
- return;
- }
- this._activeTrigger.click = !this._activeTrigger.click;
- if (this._isShown()) {
- this._leave();
- return;
- }
- this._enter();
- }
- dispose() {
- clearTimeout(this._timeout);
- EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
- if (this._element.getAttribute("data-bs-original-title")) {
- this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title"));
- }
- this._disposePopper();
- super.dispose();
- }
- show() {
- if (this._element.style.display === "none") {
- throw new Error("Please use show on visible elements");
- }
- if (!(this._isWithContent() && this._isEnabled)) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
- const shadowRoot = findShadowRoot(this._element);
- const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
- if (showEvent.defaultPrevented || !isInTheDom) {
- return;
- }
- this._disposePopper();
- const tip = this._getTipElement();
- this._element.setAttribute("aria-describedby", tip.getAttribute("id"));
- const {
- container
- } = this._config;
- if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
- container.append(tip);
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
- }
- this._popper = this._createPopper(tip);
- tip.classList.add(CLASS_NAME_SHOW$2);
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.on(element, "mouseover", noop);
- }
- }
- const complete = () => {
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
- if (this._isHovered === false) {
- this._leave();
- }
- this._isHovered = false;
- };
- this._queueCallback(complete, this.tip, this._isAnimated());
- }
- hide() {
- if (!this._isShown()) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
- if (hideEvent.defaultPrevented) {
- return;
- }
- const tip = this._getTipElement();
- tip.classList.remove(CLASS_NAME_SHOW$2);
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.off(element, "mouseover", noop);
- }
- }
- this._activeTrigger[TRIGGER_CLICK] = false;
- this._activeTrigger[TRIGGER_FOCUS] = false;
- this._activeTrigger[TRIGGER_HOVER] = false;
- this._isHovered = null;
- const complete = () => {
- if (this._isWithActiveTrigger()) {
- return;
- }
- if (!this._isHovered) {
- this._disposePopper();
- }
- this._element.removeAttribute("aria-describedby");
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
- };
- this._queueCallback(complete, this.tip, this._isAnimated());
- }
- update() {
- if (this._popper) {
- this._popper.update();
- }
- }
- // Protected
- _isWithContent() {
- return Boolean(this._getTitle());
- }
- _getTipElement() {
- if (!this.tip) {
- this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
- }
- return this.tip;
- }
- _createTipElement(content) {
- const tip = this._getTemplateFactory(content).toHtml();
- if (!tip) {
- return null;
- }
- tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
- tip.classList.add(`bs-${this.constructor.NAME}-auto`);
- const tipId = getUID(this.constructor.NAME).toString();
- tip.setAttribute("id", tipId);
- if (this._isAnimated()) {
- tip.classList.add(CLASS_NAME_FADE$2);
- }
- return tip;
- }
- setContent(content) {
- this._newContent = content;
- if (this._isShown()) {
- this._disposePopper();
- this.show();
- }
- }
- _getTemplateFactory(content) {
- if (this._templateFactory) {
- this._templateFactory.changeContent(content);
- } else {
- this._templateFactory = new TemplateFactory(__spreadProps(__spreadValues({}, this._config), {
- // the `content` var has to be after `this._config`
- // to override config.content in case of popover
- content,
- extraClass: this._resolvePossibleFunction(this._config.customClass)
- }));
- }
- return this._templateFactory;
- }
- _getContentForTemplate() {
- return {
- [SELECTOR_TOOLTIP_INNER]: this._getTitle()
- };
- }
- _getTitle() {
- return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title");
- }
- // Private
- _initializeOnDelegatedTarget(event) {
- return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
- }
- _isAnimated() {
- return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
- }
- _isShown() {
- return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
- }
- _createPopper(tip) {
- const placement = execute(this._config.placement, [this, tip, this._element]);
- const attachment = AttachmentMap[placement.toUpperCase()];
- return createPopper3(this._element, tip, this._getPopperConfig(attachment));
- }
- _getOffset() {
- const {
- offset: offset2
- } = this._config;
- if (typeof offset2 === "string") {
- return offset2.split(",").map((value) => Number.parseInt(value, 10));
- }
- if (typeof offset2 === "function") {
- return (popperData) => offset2(popperData, this._element);
- }
- return offset2;
- }
- _resolvePossibleFunction(arg) {
- return execute(arg, [this._element]);
- }
- _getPopperConfig(attachment) {
- const defaultBsPopperConfig = {
- placement: attachment,
- modifiers: [{
- name: "flip",
- options: {
- fallbackPlacements: this._config.fallbackPlacements
- }
- }, {
- name: "offset",
- options: {
- offset: this._getOffset()
- }
- }, {
- name: "preventOverflow",
- options: {
- boundary: this._config.boundary
- }
- }, {
- name: "arrow",
- options: {
- element: `.${this.constructor.NAME}-arrow`
- }
- }, {
- name: "preSetPlacement",
- enabled: true,
- phase: "beforeMain",
- fn: (data) => {
- this._getTipElement().setAttribute("data-popper-placement", data.state.placement);
- }
- }]
- };
- return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
- }
- _setListeners() {
- const triggers = this._config.trigger.split(" ");
- for (const trigger of triggers) {
- if (trigger === "click") {
- EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context.toggle();
- });
- } else if (trigger !== TRIGGER_MANUAL) {
- const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
- const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
- EventHandler.on(this._element, eventIn, this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
- context._enter();
- });
- EventHandler.on(this._element, eventOut, this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
- context._leave();
- });
- }
- }
- this._hideModalHandler = () => {
- if (this._element) {
- this.hide();
- }
- };
- EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
- }
- _fixTitle() {
- const title = this._element.getAttribute("title");
- if (!title) {
- return;
- }
- if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) {
- this._element.setAttribute("aria-label", title);
- }
- this._element.setAttribute("data-bs-original-title", title);
- this._element.removeAttribute("title");
- }
- _enter() {
- if (this._isShown() || this._isHovered) {
- this._isHovered = true;
- return;
- }
- this._isHovered = true;
- this._setTimeout(() => {
- if (this._isHovered) {
- this.show();
- }
- }, this._config.delay.show);
- }
- _leave() {
- if (this._isWithActiveTrigger()) {
- return;
- }
- this._isHovered = false;
- this._setTimeout(() => {
- if (!this._isHovered) {
- this.hide();
- }
- }, this._config.delay.hide);
- }
- _setTimeout(handler, timeout) {
- clearTimeout(this._timeout);
- this._timeout = setTimeout(handler, timeout);
- }
- _isWithActiveTrigger() {
- return Object.values(this._activeTrigger).includes(true);
- }
- _getConfig(config) {
- const dataAttributes = Manipulator.getDataAttributes(this._element);
- for (const dataAttribute of Object.keys(dataAttributes)) {
- if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
- delete dataAttributes[dataAttribute];
- }
- }
- config = __spreadValues(__spreadValues({}, dataAttributes), typeof config === "object" && config ? config : {});
- config = this._mergeConfigObj(config);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- _configAfterMerge(config) {
- config.container = config.container === false ? document.body : getElement(config.container);
- if (typeof config.delay === "number") {
- config.delay = {
- show: config.delay,
- hide: config.delay
- };
- }
- if (typeof config.title === "number") {
- config.title = config.title.toString();
- }
- if (typeof config.content === "number") {
- config.content = config.content.toString();
- }
- return config;
- }
- _getDelegateConfig() {
- const config = {};
- for (const [key, value] of Object.entries(this._config)) {
- if (this.constructor.Default[key] !== value) {
- config[key] = value;
- }
- }
- config.selector = false;
- config.trigger = "manual";
- return config;
- }
- _disposePopper() {
- if (this._popper) {
- this._popper.destroy();
- this._popper = null;
- }
- if (this.tip) {
- this.tip.remove();
- this.tip = null;
- }
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Tooltip.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- defineJQueryPlugin(Tooltip);
- var NAME$3 = "popover";
- var SELECTOR_TITLE = ".popover-header";
- var SELECTOR_CONTENT = ".popover-body";
- var Default$2 = __spreadProps(__spreadValues({}, Tooltip.Default), {
- content: "",
- offset: [0, 8],
- placement: "right",
- template: '',
- trigger: "click"
- });
- var DefaultType$2 = __spreadProps(__spreadValues({}, Tooltip.DefaultType), {
- content: "(null|string|element|function)"
- });
- var Popover = class _Popover extends Tooltip {
- // Getters
- static get Default() {
- return Default$2;
- }
- static get DefaultType() {
- return DefaultType$2;
- }
- static get NAME() {
- return NAME$3;
- }
- // Overrides
- _isWithContent() {
- return this._getTitle() || this._getContent();
- }
- // Private
- _getContentForTemplate() {
- return {
- [SELECTOR_TITLE]: this._getTitle(),
- [SELECTOR_CONTENT]: this._getContent()
- };
- }
- _getContent() {
- return this._resolvePossibleFunction(this._config.content);
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Popover.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- defineJQueryPlugin(Popover);
- var NAME$2 = "scrollspy";
- var DATA_KEY$2 = "bs.scrollspy";
- var EVENT_KEY$2 = `.${DATA_KEY$2}`;
- var DATA_API_KEY = ".data-api";
- var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
- var EVENT_CLICK = `click${EVENT_KEY$2}`;
- var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
- var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item";
- var CLASS_NAME_ACTIVE$1 = "active";
- var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
- var SELECTOR_TARGET_LINKS = "[href]";
- var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group";
- var SELECTOR_NAV_LINKS = ".nav-link";
- var SELECTOR_NAV_ITEMS = ".nav-item";
- var SELECTOR_LIST_ITEMS = ".list-group-item";
- var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
- var SELECTOR_DROPDOWN = ".dropdown";
- var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle";
- var Default$1 = {
- offset: null,
- // TODO: v6 @deprecated, keep it for backwards compatibility reasons
- rootMargin: "0px 0px -25%",
- smoothScroll: false,
- target: null,
- threshold: [0.1, 0.5, 1]
- };
- var DefaultType$1 = {
- offset: "(number|null)",
- // TODO v6 @deprecated, keep it for backwards compatibility reasons
- rootMargin: "string",
- smoothScroll: "boolean",
- target: "element",
- threshold: "array"
- };
- var ScrollSpy = class _ScrollSpy extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._targetLinks = /* @__PURE__ */ new Map();
- this._observableSections = /* @__PURE__ */ new Map();
- this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element;
- this._activeTarget = null;
- this._observer = null;
- this._previousScrollData = {
- visibleEntryTop: 0,
- parentScrollTop: 0
- };
- this.refresh();
- }
- // Getters
- static get Default() {
- return Default$1;
- }
- static get DefaultType() {
- return DefaultType$1;
- }
- static get NAME() {
- return NAME$2;
- }
- // Public
- refresh() {
- this._initializeTargetsAndObservables();
- this._maybeEnableSmoothScroll();
- if (this._observer) {
- this._observer.disconnect();
- } else {
- this._observer = this._getNewObserver();
- }
- for (const section of this._observableSections.values()) {
- this._observer.observe(section);
- }
- }
- dispose() {
- this._observer.disconnect();
- super.dispose();
- }
- // Private
- _configAfterMerge(config) {
- config.target = getElement(config.target) || document.body;
- config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
- if (typeof config.threshold === "string") {
- config.threshold = config.threshold.split(",").map((value) => Number.parseFloat(value));
- }
- return config;
- }
- _maybeEnableSmoothScroll() {
- if (!this._config.smoothScroll) {
- return;
- }
- EventHandler.off(this._config.target, EVENT_CLICK);
- EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {
- const observableSection = this._observableSections.get(event.target.hash);
- if (observableSection) {
- event.preventDefault();
- const root = this._rootElement || window;
- const height = observableSection.offsetTop - this._element.offsetTop;
- if (root.scrollTo) {
- root.scrollTo({
- top: height,
- behavior: "smooth"
- });
- return;
- }
- root.scrollTop = height;
- }
- });
- }
- _getNewObserver() {
- const options = {
- root: this._rootElement,
- threshold: this._config.threshold,
- rootMargin: this._config.rootMargin
- };
- return new IntersectionObserver((entries) => this._observerCallback(entries), options);
- }
- // The logic of selection
- _observerCallback(entries) {
- const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`);
- const activate = (entry) => {
- this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
- this._process(targetElement(entry));
- };
- const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
- const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
- this._previousScrollData.parentScrollTop = parentScrollTop;
- for (const entry of entries) {
- if (!entry.isIntersecting) {
- this._activeTarget = null;
- this._clearActiveClass(targetElement(entry));
- continue;
- }
- const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
- if (userScrollsDown && entryIsLowerThanPrevious) {
- activate(entry);
- if (!parentScrollTop) {
- return;
- }
- continue;
- }
- if (!userScrollsDown && !entryIsLowerThanPrevious) {
- activate(entry);
- }
- }
- }
- _initializeTargetsAndObservables() {
- this._targetLinks = /* @__PURE__ */ new Map();
- this._observableSections = /* @__PURE__ */ new Map();
- const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
- for (const anchor of targetLinks) {
- if (!anchor.hash || isDisabled(anchor)) {
- continue;
- }
- const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
- if (isVisible(observableSection)) {
- this._targetLinks.set(decodeURI(anchor.hash), anchor);
- this._observableSections.set(anchor.hash, observableSection);
- }
- }
- }
- _process(target) {
- if (this._activeTarget === target) {
- return;
- }
- this._clearActiveClass(this._config.target);
- this._activeTarget = target;
- target.classList.add(CLASS_NAME_ACTIVE$1);
- this._activateParents(target);
- EventHandler.trigger(this._element, EVENT_ACTIVATE, {
- relatedTarget: target
- });
- }
- _activateParents(target) {
- if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
- SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
- return;
- }
- for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
- for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
- item.classList.add(CLASS_NAME_ACTIVE$1);
- }
- }
- }
- _clearActiveClass(parent) {
- parent.classList.remove(CLASS_NAME_ACTIVE$1);
- const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
- for (const node of activeNodes) {
- node.classList.remove(CLASS_NAME_ACTIVE$1);
- }
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _ScrollSpy.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
- for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
- ScrollSpy.getOrCreateInstance(spy);
- }
- });
- defineJQueryPlugin(ScrollSpy);
- var NAME$1 = "tab";
- var DATA_KEY$1 = "bs.tab";
- var EVENT_KEY$1 = `.${DATA_KEY$1}`;
- var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
- var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
- var EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
- var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
- var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
- var EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
- var EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
- var ARROW_LEFT_KEY = "ArrowLeft";
- var ARROW_RIGHT_KEY = "ArrowRight";
- var ARROW_UP_KEY = "ArrowUp";
- var ARROW_DOWN_KEY = "ArrowDown";
- var HOME_KEY = "Home";
- var END_KEY = "End";
- var CLASS_NAME_ACTIVE = "active";
- var CLASS_NAME_FADE$1 = "fade";
- var CLASS_NAME_SHOW$1 = "show";
- var CLASS_DROPDOWN = "dropdown";
- var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle";
- var SELECTOR_DROPDOWN_MENU = ".dropdown-menu";
- var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
- var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
- var SELECTOR_OUTER = ".nav-item, .list-group-item";
- var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
- var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
- var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
- var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
- var Tab = class _Tab extends BaseComponent {
- constructor(element) {
- super(element);
- this._parent = this._element.closest(SELECTOR_TAB_PANEL);
- if (!this._parent) {
- return;
- }
- this._setInitialAttributes(this._parent, this._getChildren());
- EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
- }
- // Getters
- static get NAME() {
- return NAME$1;
- }
- // Public
- show() {
- const innerElem = this._element;
- if (this._elemIsActive(innerElem)) {
- return;
- }
- const active = this._getActiveElem();
- const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
- relatedTarget: innerElem
- }) : null;
- const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
- relatedTarget: active
- });
- if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
- return;
- }
- this._deactivate(active, innerElem);
- this._activate(innerElem, active);
- }
- // Private
- _activate(element, relatedElem) {
- if (!element) {
- return;
- }
- element.classList.add(CLASS_NAME_ACTIVE);
- this._activate(SelectorEngine.getElementFromSelector(element));
- const complete = () => {
- if (element.getAttribute("role") !== "tab") {
- element.classList.add(CLASS_NAME_SHOW$1);
- return;
- }
- element.removeAttribute("tabindex");
- element.setAttribute("aria-selected", true);
- this._toggleDropDown(element, true);
- EventHandler.trigger(element, EVENT_SHOWN$1, {
- relatedTarget: relatedElem
- });
- };
- this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
- }
- _deactivate(element, relatedElem) {
- if (!element) {
- return;
- }
- element.classList.remove(CLASS_NAME_ACTIVE);
- element.blur();
- this._deactivate(SelectorEngine.getElementFromSelector(element));
- const complete = () => {
- if (element.getAttribute("role") !== "tab") {
- element.classList.remove(CLASS_NAME_SHOW$1);
- return;
- }
- element.setAttribute("aria-selected", false);
- element.setAttribute("tabindex", "-1");
- this._toggleDropDown(element, false);
- EventHandler.trigger(element, EVENT_HIDDEN$1, {
- relatedTarget: relatedElem
- });
- };
- this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
- }
- _keydown(event) {
- if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
- return;
- }
- event.stopPropagation();
- event.preventDefault();
- const children = this._getChildren().filter((element) => !isDisabled(element));
- let nextActiveElement;
- if ([HOME_KEY, END_KEY].includes(event.key)) {
- nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
- } else {
- const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
- nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
- }
- if (nextActiveElement) {
- nextActiveElement.focus({
- preventScroll: true
- });
- _Tab.getOrCreateInstance(nextActiveElement).show();
- }
- }
- _getChildren() {
- return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
- }
- _getActiveElem() {
- return this._getChildren().find((child) => this._elemIsActive(child)) || null;
- }
- _setInitialAttributes(parent, children) {
- this._setAttributeIfNotExists(parent, "role", "tablist");
- for (const child of children) {
- this._setInitialAttributesOnChild(child);
- }
- }
- _setInitialAttributesOnChild(child) {
- child = this._getInnerElement(child);
- const isActive = this._elemIsActive(child);
- const outerElem = this._getOuterElement(child);
- child.setAttribute("aria-selected", isActive);
- if (outerElem !== child) {
- this._setAttributeIfNotExists(outerElem, "role", "presentation");
- }
- if (!isActive) {
- child.setAttribute("tabindex", "-1");
- }
- this._setAttributeIfNotExists(child, "role", "tab");
- this._setInitialAttributesOnTargetPanel(child);
- }
- _setInitialAttributesOnTargetPanel(child) {
- const target = SelectorEngine.getElementFromSelector(child);
- if (!target) {
- return;
- }
- this._setAttributeIfNotExists(target, "role", "tabpanel");
- if (child.id) {
- this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`);
- }
- }
- _toggleDropDown(element, open) {
- const outerElem = this._getOuterElement(element);
- if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
- return;
- }
- const toggle = (selector, className) => {
- const element2 = SelectorEngine.findOne(selector, outerElem);
- if (element2) {
- element2.classList.toggle(className, open);
- }
- };
- toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
- toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
- outerElem.setAttribute("aria-expanded", open);
- }
- _setAttributeIfNotExists(element, attribute, value) {
- if (!element.hasAttribute(attribute)) {
- element.setAttribute(attribute, value);
- }
- }
- _elemIsActive(elem) {
- return elem.classList.contains(CLASS_NAME_ACTIVE);
- }
- // Try to get the inner element (usually the .nav-link)
- _getInnerElement(elem) {
- return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
- }
- // Try to get the outer element (usually the .nav-item)
- _getOuterElement(elem) {
- return elem.closest(SELECTOR_OUTER) || elem;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Tab.getOrCreateInstance(this);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) {
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- Tab.getOrCreateInstance(this).show();
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
- for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
- Tab.getOrCreateInstance(element);
- }
- });
- defineJQueryPlugin(Tab);
- var NAME = "toast";
- var DATA_KEY = "bs.toast";
- var EVENT_KEY = `.${DATA_KEY}`;
- var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
- var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
- var EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
- var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
- var EVENT_HIDE = `hide${EVENT_KEY}`;
- var EVENT_HIDDEN = `hidden${EVENT_KEY}`;
- var EVENT_SHOW = `show${EVENT_KEY}`;
- var EVENT_SHOWN = `shown${EVENT_KEY}`;
- var CLASS_NAME_FADE = "fade";
- var CLASS_NAME_HIDE = "hide";
- var CLASS_NAME_SHOW = "show";
- var CLASS_NAME_SHOWING = "showing";
- var DefaultType = {
- animation: "boolean",
- autohide: "boolean",
- delay: "number"
- };
- var Default = {
- animation: true,
- autohide: true,
- delay: 5e3
- };
- var Toast = class _Toast extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._timeout = null;
- this._hasMouseInteraction = false;
- this._hasKeyboardInteraction = false;
- this._setListeners();
- }
- // Getters
- static get Default() {
- return Default;
- }
- static get DefaultType() {
- return DefaultType;
- }
- static get NAME() {
- return NAME;
- }
- // Public
- show() {
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
- if (showEvent.defaultPrevented) {
- return;
- }
- this._clearTimeout();
- if (this._config.animation) {
- this._element.classList.add(CLASS_NAME_FADE);
- }
- const complete = () => {
- this._element.classList.remove(CLASS_NAME_SHOWING);
- EventHandler.trigger(this._element, EVENT_SHOWN);
- this._maybeScheduleHide();
- };
- this._element.classList.remove(CLASS_NAME_HIDE);
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
- this._queueCallback(complete, this._element, this._config.animation);
- }
- hide() {
- if (!this.isShown()) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
- if (hideEvent.defaultPrevented) {
- return;
- }
- const complete = () => {
- this._element.classList.add(CLASS_NAME_HIDE);
- this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
- EventHandler.trigger(this._element, EVENT_HIDDEN);
- };
- this._element.classList.add(CLASS_NAME_SHOWING);
- this._queueCallback(complete, this._element, this._config.animation);
- }
- dispose() {
- this._clearTimeout();
- if (this.isShown()) {
- this._element.classList.remove(CLASS_NAME_SHOW);
- }
- super.dispose();
- }
- isShown() {
- return this._element.classList.contains(CLASS_NAME_SHOW);
- }
- // Private
- _maybeScheduleHide() {
- if (!this._config.autohide) {
- return;
- }
- if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
- return;
- }
- this._timeout = setTimeout(() => {
- this.hide();
- }, this._config.delay);
- }
- _onInteraction(event, isInteracting) {
- switch (event.type) {
- case "mouseover":
- case "mouseout": {
- this._hasMouseInteraction = isInteracting;
- break;
- }
- case "focusin":
- case "focusout": {
- this._hasKeyboardInteraction = isInteracting;
- break;
- }
- }
- if (isInteracting) {
- this._clearTimeout();
- return;
- }
- const nextElement = event.relatedTarget;
- if (this._element === nextElement || this._element.contains(nextElement)) {
- return;
- }
- this._maybeScheduleHide();
- }
- _setListeners() {
- EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
- EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
- EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
- EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
- }
- _clearTimeout() {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Toast.getOrCreateInstance(this, config);
- if (typeof config === "string") {
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- }
- });
- }
- };
- enableDismissTrigger(Toast);
- defineJQueryPlugin(Toast);
-
- //
- (() => {
- "use strict";
- const searchToggleMobile = document.getElementById("searchToggleMobile");
- const searchToggleDesktop = document.getElementById("searchToggleDesktop");
- const searchModal = document.getElementById("searchModal");
- const searchForm = document.getElementById("search-form");
- const searchInput = document.getElementById("query");
- const searchResults = document.getElementById("searchResults");
- const flexSearchModal = new Modal(searchModal, {
- focus: true
- });
- searchToggleMobile.addEventListener("click", showModalOnClick);
- searchToggleDesktop.addEventListener("click", showModalOnClick);
- function showModalOnClick() {
- flexSearchModal.toggle();
- document.querySelector(".search-no-recent").classList.remove("d-none");
- }
- document.addEventListener("keydown", onKeyDownHandler);
- function onKeyDownHandler(event) {
- if (event.ctrlKey && event.key === "k") {
- event.preventDefault();
- flexSearchModal.show();
- searchForm.reset();
- searchResults.textContent = "";
- document.querySelector(".search-no-recent").classList.remove("d-none");
- }
- if (event.key === "Escape") {
- searchForm.reset();
- searchResults.textContent = "";
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index = -1;
- }
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- }
- document.addEventListener("click", function(event) {
- var modalElement = searchModal.contains(event.target);
- if (!modalElement) {
- searchForm.reset();
- searchResults.textContent = "";
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index = -1;
- }
- });
- searchModal.addEventListener("shown.bs.modal", () => {
- searchInput.focus();
- });
- var searchResultSelected;
- var index = -1;
- document.addEventListener(
- "keydown",
- function(event) {
- var len = searchResults.getElementsByTagName("article").length - 1;
- if (event.key === "ArrowDown") {
- index++;
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- const next = searchResults.getElementsByTagName("article")[index];
- if (typeof next !== "undefined" && index <= len) {
- searchResultSelected = next;
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[0];
- }
- addClass(searchResultSelected, "selected");
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[0];
- addClass(searchResultSelected, "selected");
- }
- } else if (event.key === "ArrowUp") {
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index--;
- const next = searchResults.getElementsByTagName("article")[index];
- if (typeof next !== "undefined" && index >= 0) {
- searchResultSelected = next;
- } else {
- index = len;
- searchResultSelected = searchResults.getElementsByTagName("article")[len];
- }
- addClass(searchResultSelected, "selected");
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[len];
- addClass(searchResultSelected, "selected");
- }
- }
- },
- false
- );
- function removeClass(el, className) {
- if (el.classList) {
- el.classList.remove(className);
- } else {
- el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " ");
- }
- searchResultSelected.querySelector("a").blur();
- }
- function addClass(el, className) {
- if (el.classList) {
- el.classList.add(className);
- } else {
- el.className += " " + className;
- }
- searchResultSelected.querySelector("a").focus();
- }
- searchResults.addEventListener(
- "mouseover",
- () => {
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- }
- },
- false
- );
- })();
-})();
-/*!
- * Search modal for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- */
-/*! Bundled license information:
-
-bootstrap/dist/js/bootstrap.esm.js:
- (*!
- * Bootstrap v5.3.3 (https://getbootstrap.com/)
- * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- *)
-*/
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1saXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9kYXRhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL21hbmlwdWxhdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvY29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Jhc2UtY29tcG9uZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2FsZXJ0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2J1dHRvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3N3aXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Nhcm91c2VsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2NvbGxhcHNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Ryb3Bkb3duLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9mb2N1c3RyYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9zY3JvbGxiYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvbW9kYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvb2ZmY2FudmFzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc2FuaXRpemVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b29sdGlwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3BvcG92ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3RhYi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b2FzdC5qcyIsICI8c3RkaW4+Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdywgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckJhc2UgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tIFwiLi9wb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IiwgImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9OyIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwgImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCAiZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VUFTdHJpbmcoKSB7XG4gIHZhciB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcblxuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLmJyYW5kcyAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5icmFuZCArIFwiL1wiICsgaXRlbS52ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufSIsICJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsICJpbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSwgaXNGaXhlZFN0cmF0ZWd5KSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRml4ZWRTdHJhdGVneSA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZFN0cmF0ZWd5ID0gZmFsc2U7XG4gIH1cblxuICB2YXIgY2xpZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSAxO1xuICB2YXIgc2NhbGVZID0gMTtcblxuICBpZiAoaW5jbHVkZVNjYWxlICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBzY2FsZVggPSBlbGVtZW50Lm9mZnNldFdpZHRoID4gMCA/IHJvdW5kKGNsaWVudFJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxIDogMTtcbiAgICBzY2FsZVkgPSBlbGVtZW50Lm9mZnNldEhlaWdodCA+IDAgPyByb3VuZChjbGllbnRSZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxIDogMTtcbiAgfVxuXG4gIHZhciBfcmVmID0gaXNFbGVtZW50KGVsZW1lbnQpID8gZ2V0V2luZG93KGVsZW1lbnQpIDogd2luZG93LFxuICAgICAgdmlzdWFsVmlld3BvcnQgPSBfcmVmLnZpc3VhbFZpZXdwb3J0O1xuXG4gIHZhciBhZGRWaXN1YWxPZmZzZXRzID0gIWlzTGF5b3V0Vmlld3BvcnQoKSAmJiBpc0ZpeGVkU3RyYXRlZ3k7XG4gIHZhciB4ID0gKGNsaWVudFJlY3QubGVmdCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCA6IDApKSAvIHNjYWxlWDtcbiAgdmFyIHkgPSAoY2xpZW50UmVjdC50b3AgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcCA6IDApKSAvIHNjYWxlWTtcbiAgdmFyIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aCAvIHNjYWxlWDtcbiAgdmFyIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0IC8gc2NhbGVZO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB0b3A6IHksXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgbGVmdDogeCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsICJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn0iLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudCkge1xuICBpZiAoZ2V0Tm9kZU5hbWUoZWxlbWVudCkgPT09ICdodG1sJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuICgvLyB0aGlzIGlzIGEgcXVpY2tlciAoYnV0IGxlc3MgdHlwZSBzYWZlKSB3YXkgdG8gc2F2ZSBxdWl0ZSBzb21lIGJ5dGVzIGZyb20gdGhlIGJ1bmRsZVxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl1cbiAgICAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICBlbGVtZW50LmFzc2lnbmVkU2xvdCB8fCAvLyBzdGVwIGludG8gdGhlIHNoYWRvdyBET00gb2YgdGhlIHBhcmVudCBvZiBhIHNsb3R0ZWQgbm9kZVxuICAgIGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoIC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgaXNTaGFkb3dSb290KGVsZW1lbnQpID8gZWxlbWVudC5ob3N0IDogbnVsbCkgfHwgLy8gU2hhZG93Um9vdCBkZXRlY3RlZFxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBIVE1MRWxlbWVudCBpcyBhIE5vZGVcbiAgICBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkgLy8gZmFsbGJhY2tcblxuICApO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsICJpbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbk1heENsYW1wKG1pbiwgdmFsdWUsIG1heCkge1xuICB2YXIgdiA9IHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpO1xuICByZXR1cm4gdiA+IG1heCA/IG1heCA6IHY7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4cGFuZFRvSGFzaE1hcCh2YWx1ZSwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGhhc2hNYXAsIGtleSkge1xuICAgIGhhc2hNYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBoYXNoTWFwO1xuICB9LCB7fSk7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsICJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmLCB3aW4pIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55O1xuICB2YXIgZHByID0gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZCh4ICogZHByKSAvIGRwciB8fCAwLFxuICAgIHk6IHJvdW5kKHkgKiBkcHIpIC8gZHByIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgdmFyaWF0aW9uID0gX3JlZjIudmFyaWF0aW9uLFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cyxcbiAgICAgIGlzRml4ZWQgPSBfcmVmMi5pc0ZpeGVkO1xuICB2YXIgX29mZnNldHMkeCA9IG9mZnNldHMueCxcbiAgICAgIHggPSBfb2Zmc2V0cyR4ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeCxcbiAgICAgIF9vZmZzZXRzJHkgPSBvZmZzZXRzLnksXG4gICAgICB5ID0gX29mZnNldHMkeSA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHk7XG5cbiAgdmFyIF9yZWYzID0gdHlwZW9mIHJvdW5kT2Zmc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHJvdW5kT2Zmc2V0cyh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmMy54O1xuICB5ID0gX3JlZjMueTtcbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIHZhciBfcmVmNCA9IHJvdW5kT2Zmc2V0cyA9PT0gdHJ1ZSA/IHJvdW5kT2Zmc2V0c0J5RFBSKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSwgZ2V0V2luZG93KHBvcHBlcikpIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsICJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgdmFyIGxheW91dFZpZXdwb3J0ID0gaXNMYXlvdXRWaWV3cG9ydCgpO1xuXG4gICAgaWYgKGxheW91dFZpZXdwb3J0IHx8ICFsYXlvdXRWaWV3cG9ydCAmJiBzdHJhdGVneSA9PT0gJ2ZpeGVkJykge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsICJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsICJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsICJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBmYWxzZSwgc3RyYXRlZ3kgPT09ICdmaXhlZCcpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSkgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpID8gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwgImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMgXHUyMDEzIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwgImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07IiwgImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxO1xuICB2YXIgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcbiAgcmV0dXJuIHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDE7XG59IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudElzU2NhbGVkID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzRWxlbWVudFNjYWxlZChvZmZzZXRQYXJlbnQpO1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnRJc1NjYWxlZCwgaXNGaXhlZCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsICJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwgImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUgXHUyMDEzIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsICJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlc107XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyIsICJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbmltcG9ydCBvZmZzZXQgZnJvbSBcIi4vbW9kaWZpZXJzL29mZnNldC5qc1wiO1xuaW1wb3J0IGZsaXAgZnJvbSBcIi4vbW9kaWZpZXJzL2ZsaXAuanNcIjtcbmltcG9ydCBwcmV2ZW50T3ZlcmZsb3cgZnJvbSBcIi4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGFycm93IGZyb20gXCIuL21vZGlmaWVycy9hcnJvdy5qc1wiO1xuaW1wb3J0IGhpZGUgZnJvbSBcIi4vbW9kaWZpZXJzL2hpZGUuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlcywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93LCBoaWRlXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKVxuICB9LFxuXG4gIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TWFwLmdldChlbGVtZW50KS5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSlcblxuICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgIGlmIChpbnN0YW5jZU1hcC5zaXplID09PSAwKSB7XG4gICAgICBlbGVtZW50TWFwLmRlbGV0ZShlbGVtZW50KVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2luZGV4LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTUFYX1VJRCA9IDFfMDAwXzAwMFxuY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwXG5jb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJ1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApXG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuLy8gU2hvdXQtb3V0IEFuZ3VzIENyb2xsIChodHRwczovL2dvby5nbC9weHdRR3ApXG5jb25zdCB0b1R5cGUgPSBvYmplY3QgPT4ge1xuICBpZiAob2JqZWN0ID09PSBudWxsIHx8IG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGAke29iamVjdH1gXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKClcbn1cblxuLyoqXG4gKiBQdWJsaWMgVXRpbCBBUElcbiAqL1xuXG5jb25zdCBnZXRVSUQgPSBwcmVmaXggPT4ge1xuICBkbyB7XG4gICAgcHJlZml4ICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpXG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpXG5cbiAgcmV0dXJuIHByZWZpeFxufVxuXG5jb25zdCBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHsgdHJhbnNpdGlvbkR1cmF0aW9uLCB0cmFuc2l0aW9uRGVsYXkgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG5cbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkRlbGF5ID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KVxuXG4gIC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcbiAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXVxuICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXVxuXG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVJcbn1cblxuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpXG59XG5cbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdC5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0WzBdXG4gIH1cblxuICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCdcbn1cblxuY29uc3QgZ2V0RWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gIGlmIChpc0VsZW1lbnQob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3QuanF1ZXJ5ID8gb2JqZWN0WzBdIDogb2JqZWN0XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBpc1Zpc2libGUgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgZWxlbWVudElzVmlzaWJsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAndmlzaWJsZSdcbiAgLy8gSGFuZGxlIGBkZXRhaWxzYCBlbGVtZW50IGFzIGl0cyBjb250ZW50IG1heSBmYWxzaWUgYXBwZWFyIHZpc2libGUgd2hlbiBpdCBpcyBjbG9zZWRcbiAgY29uc3QgY2xvc2VkRGV0YWlscyA9IGVsZW1lbnQuY2xvc2VzdCgnZGV0YWlsczpub3QoW29wZW5dKScpXG5cbiAgaWYgKCFjbG9zZWREZXRhaWxzKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbiAgfVxuXG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpXG4gICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbn1cblxuY29uc3QgaXNEaXNhYmxlZCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZFxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnXG59XG5cbmNvbnN0IGZpbmRTaGFkb3dSb290ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKVxuICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsXG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSlcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbi8qKlxuICogVHJpY2sgdG8gcmVzdGFydCBhbiBlbGVtZW50J3MgYW5pbWF0aW9uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB2b2lkXG4gKlxuICogQHNlZSBodHRwczovL3d3dy5jaGFyaXN0aGVvLmlvL2Jsb2cvMjAyMS8wMi9yZXN0YXJ0LWEtY3NzLWFuaW1hdGlvbi13aXRoLWphdmFzY3JpcHQvI3Jlc3RhcnRpbmctYS1jc3MtYW5pbWF0aW9uXG4gKi9cbmNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50Lm9mZnNldEhlaWdodCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xufVxuXG5jb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gIGlmICh3aW5kb3cualF1ZXJ5ICYmICFkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgnZGF0YS1icy1uby1qcXVlcnknKSkge1xuICAgIHJldHVybiB3aW5kb3cualF1ZXJ5XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW11cblxuY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gYWRkIGxpc3RlbmVyIG9uIHRoZSBmaXJzdCBjYWxsIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnXG5cbmNvbnN0IGRlZmluZUpRdWVyeVBsdWdpbiA9IHBsdWdpbiA9PiB7XG4gIG9uRE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRVxuICAgICAgY29uc3QgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltuYW1lXVxuICAgICAgJC5mbltuYW1lXSA9IHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW5cbiAgICAgICQuZm5bbmFtZV0ubm9Db25mbGljdCA9ICgpID0+IHtcbiAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVFxuICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZXhlY3V0ZSA9IChwb3NzaWJsZUNhbGxiYWNrLCBhcmdzID0gW10sIGRlZmF1bHRWYWx1ZSA9IHBvc3NpYmxlQ2FsbGJhY2spID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBwb3NzaWJsZUNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gcG9zc2libGVDYWxsYmFjayguLi5hcmdzKSA6IGRlZmF1bHRWYWx1ZVxufVxuXG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNVxuICBjb25zdCBlbXVsYXRlZER1cmF0aW9uID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodHJhbnNpdGlvbkVsZW1lbnQpICsgZHVyYXRpb25QYWRkaW5nXG5cbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG5cbiAgY29uc3QgaGFuZGxlciA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgaWYgKHRhcmdldCAhPT0gdHJhbnNpdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICB0cmFuc2l0aW9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpXG4gICAgfVxuICB9LCBlbXVsYXRlZER1cmF0aW9uKVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGhcbiAgbGV0IGluZGV4ID0gbGlzdC5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpXG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXVxuICB9XG5cbiAgaW5kZXggKz0gc2hvdWxkR2V0TmV4dCA/IDEgOiAtMVxuXG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV1cbn1cblxuZXhwb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLFxuICBmaW5kU2hhZG93Um9vdCxcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0alF1ZXJ5LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQsXG4gIGdldFVJRCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wLFxuICBvbkRPTUNvbnRlbnRMb2FkZWQsXG4gIHBhcnNlU2VsZWN0b3IsXG4gIHJlZmxvdyxcbiAgdHJpZ2dlclRyYW5zaXRpb25FbmQsXG4gIHRvVHlwZVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGdldGpRdWVyeSB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovXG5jb25zdCBzdHJpcE5hbWVSZWdleCA9IC9cXC4uKi9cbmNvbnN0IHN0cmlwVWlkUmVnZXggPSAvOjpcXGQrJC9cbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fSAvLyBFdmVudHMgc3RvcmFnZVxubGV0IHVpZEV2ZW50ID0gMVxuY29uc3QgY3VzdG9tRXZlbnRzID0ge1xuICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgbW91c2VsZWF2ZTogJ21vdXNlb3V0J1xufVxuXG5jb25zdCBuYXRpdmVFdmVudHMgPSBuZXcgU2V0KFtcbiAgJ2NsaWNrJyxcbiAgJ2RibGNsaWNrJyxcbiAgJ21vdXNldXAnLFxuICAnbW91c2Vkb3duJyxcbiAgJ2NvbnRleHRtZW51JyxcbiAgJ21vdXNld2hlZWwnLFxuICAnRE9NTW91c2VTY3JvbGwnLFxuICAnbW91c2VvdmVyJyxcbiAgJ21vdXNlb3V0JyxcbiAgJ21vdXNlbW92ZScsXG4gICdzZWxlY3RzdGFydCcsXG4gICdzZWxlY3RlbmQnLFxuICAna2V5ZG93bicsXG4gICdrZXlwcmVzcycsXG4gICdrZXl1cCcsXG4gICdvcmllbnRhdGlvbmNoYW5nZScsXG4gICd0b3VjaHN0YXJ0JyxcbiAgJ3RvdWNobW92ZScsXG4gICd0b3VjaGVuZCcsXG4gICd0b3VjaGNhbmNlbCcsXG4gICdwb2ludGVyZG93bicsXG4gICdwb2ludGVybW92ZScsXG4gICdwb2ludGVydXAnLFxuICAncG9pbnRlcmxlYXZlJyxcbiAgJ3BvaW50ZXJjYW5jZWwnLFxuICAnZ2VzdHVyZXN0YXJ0JyxcbiAgJ2dlc3R1cmVjaGFuZ2UnLFxuICAnZ2VzdHVyZWVuZCcsXG4gICdmb2N1cycsXG4gICdibHVyJyxcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICdzZWxlY3QnLFxuICAnc3VibWl0JyxcbiAgJ2ZvY3VzaW4nLFxuICAnZm9jdXNvdXQnLFxuICAnbG9hZCcsXG4gICd1bmxvYWQnLFxuICAnYmVmb3JldW5sb2FkJyxcbiAgJ3Jlc2l6ZScsXG4gICdtb3ZlJyxcbiAgJ0RPTUNvbnRlbnRMb2FkZWQnLFxuICAncmVhZHlzdGF0ZWNoYW5nZScsXG4gICdlcnJvcicsXG4gICdhYm9ydCcsXG4gICdzY3JvbGwnXG5dKVxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kc1xuICovXG5cbmZ1bmN0aW9uIG1ha2VFdmVudFVpZChlbGVtZW50LCB1aWQpIHtcbiAgcmV0dXJuICh1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWApIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrK1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpIHtcbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGVsZW1lbnQpXG5cbiAgZWxlbWVudC51aWRFdmVudCA9IHVpZFxuICBldmVudFJlZ2lzdHJ5W3VpZF0gPSBldmVudFJlZ2lzdHJ5W3VpZF0gfHwge31cblxuICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdXG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiBlbGVtZW50IH0pXG5cbiAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgZm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBmb3IgKGxldCB7IHRhcmdldCB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXQgfSlcblxuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0YXJnZXQsIFtldmVudF0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRzKVxuICAgIC5maW5kKGV2ZW50ID0+IGV2ZW50LmNhbGxhYmxlID09PSBjYWxsYWJsZSAmJiBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IgPT09IGRlbGVnYXRpb25TZWxlY3Rvcilcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGlzRGVsZWdhdGVkID0gdHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnXG4gIC8vIFRPRE86IHRvb2x0aXAgcGFzc2VzIGBmYWxzZWAgaW5zdGVhZCBvZiBzZWxlY3Rvciwgc28gd2UgbmVlZCB0byBjaGVja1xuICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogKGhhbmRsZXIgfHwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KVxuXG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgfVxuXG4gIHJldHVybiBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdXG59XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcbiAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKVxuICB9XG5cbiAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KVxuICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuXG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmZcblxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGNhbGxhYmxlLCBvcmlnaW5hbFR5cGVFdmVudC5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpXG4gIGNvbnN0IGZuID0gaXNEZWxlZ2F0ZWQgP1xuICAgIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6XG4gICAgYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSlcblxuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsXG4gIGZuLmNhbGxhYmxlID0gY2FsbGFibGVcbiAgZm4ub25lT2ZmID0gb25lT2ZmXG4gIGZuLnVpZEV2ZW50ID0gdWlkXG4gIGhhbmRsZXJzW3VpZF0gPSBmblxuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZClcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKSB7XG4gIGNvbnN0IGZuID0gZmluZEhhbmRsZXIoZXZlbnRzW3R5cGVFdmVudF0sIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3RvcilcblxuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKVxuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cblxuICBmb3IgKGNvbnN0IFtoYW5kbGVyS2V5LCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJylcbiAgcmV0dXJuIGN1c3RvbUV2ZW50c1tldmVudF0gfHwgZXZlbnRcbn1cblxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBmYWxzZSlcbiAgfSxcblxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSlcbiAgfSxcblxuICBvZmYoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gdHlwZUV2ZW50ICE9PSBvcmlnaW5hbFR5cGVFdmVudFxuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG4gICAgY29uc3QgaXNOYW1lc3BhY2UgPSBvcmlnaW5hbFR5cGVFdmVudC5zdGFydHNXaXRoKCcuJylcblxuICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgY29uc3QgaGFuZGxlcktleSA9IGtleUhhbmRsZXJzLnJlcGxhY2Uoc3RyaXBVaWRSZWdleCwgJycpXG5cbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudClcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IGV2ZW50ICE9PSB0eXBlRXZlbnRcblxuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGxcbiAgICBsZXQgYnViYmxlcyA9IHRydWVcbiAgICBsZXQgbmF0aXZlRGlzcGF0Y2ggPSB0cnVlXG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZVxuXG4gICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgIGpRdWVyeUV2ZW50ID0gJC5FdmVudChldmVudCwgYXJncylcblxuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KVxuICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKClcbiAgICB9XG5cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwgeyBidWJibGVzLCBjYW5jZWxhYmxlOiB0cnVlIH0pLCBhcmdzKVxuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKG5hdGl2ZURpc3BhdGNoKSB7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIHJldHVybiBldnRcbiAgfVxufVxuXG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICB9IGNhdGNoIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGFLZXkoa2V5KSB7XG4gIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKVxufVxuXG5jb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCwgdmFsdWUpXG4gIH0sXG5cbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKVxuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fVxuICAgIGNvbnN0IGJzS2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQuZGF0YXNldCkuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnYnMnKSAmJiAha2V5LnN0YXJ0c1dpdGgoJ2JzQ29uZmlnJykpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBic0tleXMpIHtcbiAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKVxuICAgICAgcHVyZUtleSA9IHB1cmVLZXkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBwdXJlS2V5LnNsaWNlKDEsIHB1cmVLZXkubGVuZ3RoKVxuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hbmlwdWxhdG9yXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvY29uZmlnLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCB7IGlzRWxlbWVudCwgdG9UeXBlIH0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBzdGF0aWMgbWV0aG9kIFwiTkFNRVwiLCBmb3IgZWFjaCBjb21wb25lbnQhJylcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgIGNvbnN0IGpzb25Db25maWcgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsICdjb25maWcnKSA6IHt9IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgLi4uKGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuICB9XG5cbiAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5LCBleHBlY3RlZFR5cGVzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdUeXBlcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BlcnR5XVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSlcblxuICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwiJHtwcm9wZXJ0eX1cIiBwcm92aWRlZCB0eXBlIFwiJHt2YWx1ZVR5cGV9XCIgYnV0IGV4cGVjdGVkIHR5cGUgXCIke2V4cGVjdGVkVHlwZXN9XCIuYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZ1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBiYXNlLWNvbXBvbmVudC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBEYXRhIGZyb20gJy4vZG9tL2RhdGEuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vdXRpbC9jb25maWcuanMnXG5pbXBvcnQgeyBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50IH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFZFUlNJT04gPSAnNS4zLjMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpXG5cbiAgICBlbGVtZW50ID0gZ2V0RWxlbWVudChlbGVtZW50KVxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnRcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcylcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSlcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnLCB0aGlzLl9lbGVtZW50KVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIERhdGEuZ2V0KGdldEVsZW1lbnQoZWxlbWVudCksIHRoaXMuREFUQV9LRVkpXG4gIH1cblxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTlxuICB9XG5cbiAgc3RhdGljIGdldCBEQVRBX0tFWSgpIHtcbiAgICByZXR1cm4gYGJzLiR7dGhpcy5OQU1FfWBcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xuICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gXG4gIH1cblxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlQ29tcG9uZW50XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBpc0Rpc2FibGVkLCBpc1Zpc2libGUsIHBhcnNlU2VsZWN0b3IgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJ1xuXG5jb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy10YXJnZXQnKVxuXG4gIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgIGxldCBocmVmQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKVxuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICghaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgaWYgKGhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIGhyZWZBdHRyaWJ1dGUgPSBgIyR7aHJlZkF0dHJpYnV0ZS5zcGxpdCgnIycpWzFdfWBcbiAgICB9XG5cbiAgICBzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsXG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gcGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsXG59XG5cbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKVxuICB9LFxuXG4gIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKVxuICB9LFxuXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpXG4gIH0sXG5cbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxuICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuXG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpXG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50c1xuICB9LFxuXG4gIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmdcblxuICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgaWYgKHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbcHJldmlvdXNdXG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZ1xuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbbmV4dF1cbiAgICAgIH1cblxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG5cbiAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgIGNvbnN0IGZvY3VzYWJsZXMgPSBbXG4gICAgICAnYScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdpbnB1dCcsXG4gICAgICAndGV4dGFyZWEnLFxuICAgICAgJ3NlbGVjdCcsXG4gICAgICAnZGV0YWlscycsXG4gICAgICAnW3RhYmluZGV4XScsXG4gICAgICAnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nXG4gICAgXS5tYXAoc2VsZWN0b3IgPT4gYCR7c2VsZWN0b3J9Om5vdChbdGFiaW5kZXhePVwiLVwiXSlgKS5qb2luKCcsJylcblxuICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpc0Rpc2FibGVkKGVsKSAmJiBpc1Zpc2libGUoZWwpKVxuICB9LFxuXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA6IG51bGxcbiAgfSxcblxuICBnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKSA6IFtdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0b3JFbmdpbmVcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgaXNEaXNhYmxlZCB9IGZyb20gJy4vaW5kZXguanMnXG5cbmNvbnN0IGVuYWJsZURpc21pc3NUcmlnZ2VyID0gKGNvbXBvbmVudCwgbWV0aG9kID0gJ2hpZGUnKSA9PiB7XG4gIGNvbnN0IGNsaWNrRXZlbnQgPSBgY2xpY2suZGlzbWlzcyR7Y29tcG9uZW50LkVWRU5UX0tFWX1gXG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRVxuXG4gIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgY2xpY2tFdmVudCwgYFtkYXRhLWJzLWRpc21pc3M9XCIke25hbWV9XCJdYCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKVxuICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gICAgLy8gTWV0aG9kIGFyZ3VtZW50IGlzIGxlZnQsIGZvciBBbGVydCBhbmQgb25seSwgYXMgaXQgZG9lc24ndCBpbXBsZW1lbnQgdGhlICdoaWRlJyBtZXRob2RcbiAgICBpbnN0YW5jZVttZXRob2RdKClcbiAgfSlcbn1cblxuZXhwb3J0IHtcbiAgZW5hYmxlRGlzbWlzc1RyaWdnZXJcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2FsZXJ0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuYWxlcnQnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWX1gXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSlcblxuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRUQpXG4gICAgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJylcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpXG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdidXR0b24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5idXR0b24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJ1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pXG5cbiAgZGF0YS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQnV0dG9uKVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgZXhlY3V0ZSB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzd2lwZSdcbmNvbnN0IEVWRU5UX0tFWSA9ICcuYnMuc3dpcGUnXG5jb25zdCBFVkVOVF9UT1VDSFNUQVJUID0gYHRvdWNoc3RhcnQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSE1PVkUgPSBgdG91Y2htb3ZlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hFTkQgPSBgdG91Y2hlbmQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSRE9XTiA9IGBwb2ludGVyZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJVUCA9IGBwb2ludGVydXAke0VWRU5UX0tFWX1gXG5jb25zdCBQT0lOVEVSX1RZUEVfVE9VQ0ggPSAndG91Y2gnXG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3BlbidcbmNvbnN0IENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCA9ICdwb2ludGVyLWV2ZW50J1xuY29uc3QgU1dJUEVfVEhSRVNIT0xEID0gNDBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgZW5kQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBsZWZ0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICByaWdodENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTd2lwZSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudFxuXG4gICAgaWYgKCFlbGVtZW50IHx8ICFTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2RlbHRhWCA9IDBcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudClcbiAgICB0aGlzLl9pbml0RXZlbnRzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX3N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSkge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQuY2xpZW50WFxuICAgIH1cbiAgfVxuXG4gIF9lbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kZWx0YVhcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpXG4gICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spXG4gIH1cblxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID9cbiAgICAgIDAgOlxuICAgICAgZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fZGVsdGFYXG4gIH1cblxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKVxuXG4gICAgaWYgKGFic0RlbHRhWCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRhWCAvIHRoaXMuX2RlbHRhWFxuXG4gICAgdGhpcy5fZGVsdGFYID0gMFxuXG4gICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV4ZWN1dGUoZGlyZWN0aW9uID4gMCA/IHRoaXMuX2NvbmZpZy5yaWdodENhbGxiYWNrIDogdGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjaylcbiAgfVxuXG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUlVQLCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKVxuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hTVEFSVCwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNITU9WRSwgZXZlbnQgPT4gdGhpcy5fbW92ZShldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpXG4gICAgfVxuICB9XG5cbiAgX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMgJiYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfUEVOIHx8IGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfVE9VQ0gpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN3aXBlXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNhcm91c2VsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTd2lwZSBmcm9tICcuL3V0aWwvc3dpcGUuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjYXJvdXNlbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNhcm91c2VsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMCAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTVxuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJ1xuXG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVldOiBESVJFQ1RJT05fUklHSFQsXG4gIFtBUlJPV19SSUdIVF9LRVldOiBESVJFQ1RJT05fTEVGVFxufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHBhdXNlOiAnaG92ZXInLFxuICByaWRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHdyYXA6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsXG5cbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKVxuICB9XG5cbiAgbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgIC8vIEZJWE1FIFRPRE8gdXNlIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgXG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgfVxuXG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICB9XG5cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLmN5Y2xlKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN5Y2xlKClcbiAgfVxuXG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpXG4gICAgaWYgKGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuXG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlSGVscGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IGNvbmZpZy5pbnRlcnZhbFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIsICgpID0+IHRoaXMucGF1c2UoKSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFLCAoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKClcbiAgICB9XG4gIH1cblxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICB9XG5cbiAgICBjb25zdCBlbmRDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgIT09ICdob3ZlcicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICB9XG5cbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH1cblxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbmV3IFN3aXBlKHRoaXMuX2VsZW1lbnQsIHN3aXBlQ29uZmlnKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XVxuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSlcbiAgICB9XG4gIH1cblxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpXG5cbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBpZiAobmV3QWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICd0cnVlJylcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWxcbiAgfVxuXG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZ2V0QWN0aXZlKClcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKVxuXG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KVxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSlcblxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRlc3RzIHRoYXQgdXNlIGVtcHR5IGRpdnMgdG8gYXZvaWQgdGhpcyBjaGVja1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcbiAgICB0aGlzLnBhdXNlKClcblxuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWVcblxuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EXG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVZcblxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICByZWZsb3cobmV4dEVsZW1lbnQpXG5cbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSlcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSwgb3JkZXJDbGFzc05hbWUsIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKVxuICB9XG5cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9nZXRJdGVtcygpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKVxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG4gIH1cblxuICBfb3JkZXJUb0RpcmVjdGlvbihvcmRlcikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVFxuICAgIH1cblxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKHRoaXMsICdzbGlkZScpID09PSAnbmV4dCcpIHtcbiAgICBjYXJvdXNlbC5uZXh0KClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjYXJvdXNlbC5wcmV2KClcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGNvbnN0IGNhcm91c2VsIG9mIGNhcm91c2Vscykge1xuICAgIENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UoY2Fyb3VzZWwpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKVxuXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50LFxuICByZWZsb3dcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnY29sbGFwc2UnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFID0gJ2NvbGxhcHNlJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnXG5jb25zdCBDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiA9IGA6c2NvcGUgLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX0gLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX1gXG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCdcblxuY29uc3QgV0lEVEggPSAnd2lkdGgnXG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0J1xuXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVTID0gJy5jb2xsYXBzZS5zaG93LCAuY29sbGFwc2UuY29sbGFwc2luZydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb2xsYXBzZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdXG5cbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0b2dnbGVMaXN0KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IFNlbGVjdG9yRW5naW5lLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSlcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuICAgICAgICAuZmlsdGVyKGZvdW5kRWxlbWVudCA9PiBmb3VuZEVsZW1lbnQgPT09IHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRoaXMuX2lzU2hvd24oKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW11cblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpXG4gICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkpXG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZUNoaWxkcmVuLmxlbmd0aCAmJiBhY3RpdmVDaGlsZHJlblswXS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVylcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKClcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDBcblxuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG4gICAgfVxuXG4gICAgY29uc3QgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKVxuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXX1weGBcblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRoaXMuX3RyaWdnZXJBcnJheSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcilcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgX2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKSAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUXG4gIH1cblxuICBfaW5pdGlhbGl6ZUNoaWxkcmVuKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudClcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpXG4gIH1cblxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlckFycmF5KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge31cbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIC8vIHByZXZlbnREZWZhdWx0IG9ubHkgZm9yIDxhPiBlbGVtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBVUkwpIG5vdCBpbnNpZGUgdGhlIGNvbGxhcHNpYmxlIGVsZW1lbnRcbiAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnQScgfHwgKGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3Rvcih0aGlzKSkge1xuICAgIENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pLnRvZ2dsZSgpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBnZXRFbGVtZW50LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Ryb3Bkb3duJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5jb25zdCBUQUJfS0VZID0gJ1RhYidcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMiAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QU1RBUlQgPSAnZHJvcHN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInXG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJdOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX0uJHtDTEFTU19OQU1FX1NIT1d9YFxuY29uc3QgU0VMRUNUT1JfTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJ1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdidcbmNvbnN0IFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5cbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BFTkQgPSBpc1JUTCgpID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9SSUdIVCA9IGlzUlRMKCkgPyAnbGVmdC1zdGFydCcgOiAncmlnaHQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01DRU5URVIgPSAnYm90dG9tJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBEcm9wZG93biBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLnByZXYodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KVxuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jcmVhdGVQb3BwZXIoKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSwgcmVsYXRlZFRhcmdldClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHN1cGVyLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmXG4gICAgICB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcInJlZmVyZW5jZVwiIHByb3ZpZGVkIHR5cGUgXCJvYmplY3RcIiB3aXRob3V0IGEgcmVxdWlyZWQgXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIiBtZXRob2QuYClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIGxldCByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudFxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50XG4gICAgfSBlbHNlIGlmIChpc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyQ29uZmlnID0gdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKClcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZylcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUEVORCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfUklHSFRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUlxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0JPVFRPTUNFTlRFUlxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJ1xuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT01cbiAgfVxuXG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKSAvLyBUT0RPOiB2NiByZW1vdmVcbiAgICAgIGRlZmF1bHRCc1BvcHBlckNvbmZpZy5tb2RpZmllcnMgPSBbe1xuICAgICAgICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfV1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9XG4gIH1cblxuICBfc2VsZWN0TWVudUl0ZW0oeyBrZXksIHRhcmdldCB9KSB7XG4gICAgY29uc3QgaXRlbXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMsIHRoaXMuX21lbnUpLmZpbHRlcihlbGVtZW50ID0+IGlzVmlzaWJsZShlbGVtZW50KSlcblxuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBpZiB0YXJnZXQgaXNuJ3QgaW5jbHVkZWQgaW4gaXRlbXMgKGUuZy4gd2hlbiBleHBhbmRpbmcgdGhlIGRyb3Bkb3duKVxuICAgIC8vIGFsbG93IGN5Y2xpbmcgdG8gZ2V0IHRoZSBsYXN0IGl0ZW0gaW4gY2FzZSBrZXkgZXF1YWxzIEFSUk9XX1VQX0tFWVxuICAgIGdldE5leHRBY3RpdmVFbGVtZW50KGl0ZW1zLCB0YXJnZXQsIGtleSA9PT0gQVJST1dfRE9XTl9LRVksICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgY2xlYXJNZW51cyhldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gPT09IFJJR0hUX01PVVNFX0JVVFRPTiB8fCAoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pXG5cbiAgICBmb3IgKGNvbnN0IHRvZ2dsZSBvZiBvcGVuVG9nZ2xlcykge1xuICAgICAgY29uc3QgY29udGV4dCA9IERyb3Bkb3duLmdldEluc3RhbmNlKHRvZ2dsZSlcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKVxuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpXG4gICAgICBpZiAoXG4gICAgICAgIGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ2luc2lkZScgJiYgIWlzTWVudVRhcmdldCkgfHxcbiAgICAgICAgKGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIG5hdmlnYXRpb24gdGhyb3VnaCB0aGUgZHJvcGRvd24gbWVudSBvciBldmVudHMgZnJvbSBjb250YWluZWQgaW5wdXRzIHNob3VsZG4ndCBjbG9zZSB0aGUgbWVudVxuICAgICAgaWYgKGNvbnRleHQuX21lbnUuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAoKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZKSB8fCAvaW5wdXR8c2VsZWN0fG9wdGlvbnx0ZXh0YXJlYXxmb3JtL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnQgfVxuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudFxuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0YUFwaUtleWRvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgLy8gSWYgbm90IGFuIFVQIHwgRE9XTiB8IEVTQ0FQRSBrZXkgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIC8vIElmIGlucHV0L3RleHRhcmVhICYmIGlmIGtleSBpcyBvdGhlciB0aGFuIEVTQ0FQRSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG5cbiAgICBjb25zdCBpc0lucHV0ID0gL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSlcbiAgICBjb25zdCBpc0VzY2FwZUV2ZW50ID0gZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZXG4gICAgY29uc3QgaXNVcE9yRG93bkV2ZW50ID0gW0FSUk9XX1VQX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcblxuICAgIGlmICghaXNVcE9yRG93bkV2ZW50ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNJbnB1dCAmJiAhaXNFc2NhcGVFdmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gVE9ETzogdjYgcmV2ZXJ0ICMzNzAxMSAmIGNoYW5nZSBtYXJrdXAgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4zL2Zvcm1zL2lucHV0LWdyb3VwL1xuICAgIGNvbnN0IGdldFRvZ2dsZUJ1dHRvbiA9IHRoaXMubWF0Y2hlcyhTRUxFQ1RPUl9EQVRBX1RPR0dMRSkgP1xuICAgICAgdGhpcyA6XG4gICAgICAoU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSkpXG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UoZ2V0VG9nZ2xlQnV0dG9uKVxuXG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGluc3RhbmNlLnNob3coKVxuICAgICAgaW5zdGFuY2UuX3NlbGVjdE1lbnVJdGVtKGV2ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHsgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2UuaGlkZSgpXG4gICAgICBnZXRUb2dnbGVCdXR0b24uZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlVUF9EQVRBX0FQSSwgRHJvcGRvd24uY2xlYXJNZW51cylcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnRvZ2dsZSgpXG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bilcblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHtcbiAgZXhlY3V0ZSwgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCwgcmVmbG93XG59IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdiYWNrZHJvcCdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLmJzLiR7TkFNRX1gXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGNsYXNzTmFtZTogJ21vZGFsLWJhY2tkcm9wJyxcbiAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgaXNBbmltYXRlZDogZmFsc2UsXG4gIGlzVmlzaWJsZTogdHJ1ZSwgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgcm9vdEVsZW1lbnQ6ICdib2R5JyAvLyBnaXZlIHRoZSBjaG9pY2UgdG8gcGxhY2UgYmFja2Ryb3AgdW5kZXIgZGlmZmVyZW50IGVsZW1lbnRzXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQoKVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKVxuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTilcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2VcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjaylcbiAgICB9KVxuXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWVcbiAgfVxuXG4gIF9lbXVsYXRlQW5pbWF0aW9uKGNhbGxiYWNrKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYWNrZHJvcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdmb2N1c3RyYXAnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5mb2N1c3RyYXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnXG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvZm9jdXM6IHRydWUsXG4gIHRyYXBFbGVtZW50OiBudWxsIC8vIFRoZSBlbGVtZW50IHRvIHRyYXAgZm9jdXMgaW5zaWRlIG9mXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpIC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX1RBQiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihldmVudCkpXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWVcbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7IHRyYXBFbGVtZW50IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudClcblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKClcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvY3VzVHJhcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJ1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnXG5jb25zdCBQUk9QRVJUWV9QQURESU5HID0gJ3BhZGRpbmctcmlnaHQnXG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldFdpZHRoKCkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgIGNvbnN0IGRvY3VtZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIHRoaXMuX2Rpc2FibGVPdmVyRmxvdygpXG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aClcbiAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4sIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgLSB3aWR0aClcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTilcbiAgfVxuXG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDBcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rpc2FibGVPdmVyRmxvdygpIHtcbiAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuICB9XG5cbiAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5nZXRXaWR0aCgpXG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KVxuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpXG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsQmFySGVscGVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG1vZGFsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbiwgaXNSVEwsIGlzVmlzaWJsZSwgcmVmbG93XG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ21vZGFsJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3BlbidcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnXG5cbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnXG5jb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZydcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgZm9jdXM6ICdib29sZWFuJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKClcblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKClcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pXG5cbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSlcblxuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgaGFuZGxlVXBkYXRlKCkge1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSwgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgaXNBbmltYXRlZDogdGhpcy5faXNBbmltYXRlZCgpXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMFxuXG4gICAgY29uc3QgbW9kYWxCb2R5ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NT0RBTF9CT0RZLCB0aGlzLl9kaWFsb2cpXG4gICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgbW9kYWxCb2R5LnNjcm9sbFRvcCA9IDBcbiAgICB9XG5cbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMSUNLX0RJU01JU1MsIGV2ZW50MiA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50ICE9PSBldmVudC50YXJnZXQgfHwgdGhpcy5fZWxlbWVudCAhPT0gZXZlbnQyLnRhcmdldCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBfaGlkZU1vZGFsKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJylcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9PUEVOKVxuICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpXG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH0pXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICB9XG5cbiAgX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICBjb25zdCBpbml0aWFsT3ZlcmZsb3dZID0gdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1lcbiAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICBpZiAoaW5pdGlhbE92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJ1xuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQylcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQylcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1lcbiAgICAgIH0sIHRoaXMuX2RpYWxvZylcbiAgICB9LCB0aGlzLl9kaWFsb2cpXG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgKi9cblxuICBfYWRqdXN0RGlhbG9nKCkge1xuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKClcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMFxuXG4gICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0J1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG5cbiAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJ1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJydcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZm9jdXMgcmVzdG9yZXIgaWYgbW9kYWwgd2lsbCBhY3R1YWxseSBnZXQgc2hvd25cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbClcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oTW9kYWwpXG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG9mZmNhbnZhcy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IEJhY2tkcm9wIGZyb20gJy4vdXRpbC9iYWNrZHJvcC5qcydcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMnXG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJy4vdXRpbC9mb2N1c3RyYXAuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGlzRGlzYWJsZWQsXG4gIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgU2Nyb2xsQmFySGVscGVyIGZyb20gJy4vdXRpbC9zY3JvbGxiYXIuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdvZmZjYW52YXMnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5vZmZjYW52YXMnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfU0hPV0lORyA9ICdzaG93aW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9ISURJTkcgPSAnaGlkaW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9CQUNLRFJPUCA9ICdvZmZjYW52YXMtYmFja2Ryb3AnXG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5vZmZjYW52YXMuc2hvdydcblxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBzY3JvbGw6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBPZmZjYW52YXMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fYmFja2Ryb3AgPSB0aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKVxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywgeyByZWxhdGVkVGFyZ2V0IH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5oaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCB8fCB0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwgeyByZWxhdGVkVGFyZ2V0IH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG5cbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICB0aGlzLl9lbGVtZW50LmJsdXIoKVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0hJRElORylcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKClcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX0hJRElORylcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJylcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJylcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5yZXNldCgpXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICBjb25zdCBjbGlja0NhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH1cblxuICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKVxuXG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBjbGFzc05hbWU6IENMQVNTX05BTUVfQkFDS0RST1AsXG4gICAgICBpc1Zpc2libGUsXG4gICAgICBpc0FuaW1hdGVkOiB0cnVlLFxuICAgICAgcm9vdEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgIGNsaWNrQ2FsbGJhY2s6IGlzVmlzaWJsZSA/IGNsaWNrQ2FsbGJhY2sgOiBudWxsXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICB9KVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX0hJRERFTiwgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBhIHRvZ2dsZXIgb2YgYW4gb2ZmY2FudmFzLCB3aGlsZSBhbm90aGVyIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU2VsZWN0b3JFbmdpbmUuZmluZChPUEVOX1NFTEVDVE9SKSkge1xuICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHNlbGVjdG9yKS5zaG93KClcbiAgfVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKCdbYXJpYS1tb2RhbF1bY2xhc3MqPXNob3ddW2NsYXNzKj1vZmZjYW52YXMtXScpKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpLmhpZGUoKVxuICAgIH1cbiAgfVxufSlcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpXG5cbmV4cG9ydCBkZWZhdWx0IE9mZmNhbnZhc1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Nhbml0aXplci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8vIGpzLWRvY3Mtc3RhcnQgYWxsb3ctbGlzdFxuY29uc3QgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTiA9IC9eYXJpYS1bXFx3LV0qJC9pXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRkOiBbXSxcbiAgZGl2OiBbXSxcbiAgZGw6IFtdLFxuICBkdDogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgJ2JhY2tncm91bmQnLFxuICAnY2l0ZScsXG4gICdocmVmJyxcbiAgJ2l0ZW10eXBlJyxcbiAgJ2xvbmdkZXNjJyxcbiAgJ3Bvc3RlcicsXG4gICdzcmMnLFxuICAneGxpbms6aHJlZidcbl0pXG5cbi8qKlxuICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBVUkxzIHRoYXQgYXJlIHNhZmUgd3J0LiBYU1MgaW4gVVJMIG5hdmlnYXRpb25cbiAqIGNvbnRleHRzLlxuICpcbiAqIFNob3V0LW91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xNS4yLjgvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHMjTDM4XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD8hamF2YXNjcmlwdDopKD86W2EtejAtOSsuLV0rOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvaVxuXG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgaWYgKHVyaUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihTQUZFX1VSTF9QQVRURVJOLnRlc3QoYXR0cmlidXRlLm5vZGVWYWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGF0dHJpYnV0ZVJlZ2V4ID0+IGF0dHJpYnV0ZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKVxuICAgIC5zb21lKHJlZ2V4ID0+IHJlZ2V4LnRlc3QoYXR0cmlidXRlTmFtZSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbFxuICB9XG5cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKVxuICB9XG5cbiAgY29uc3QgZG9tUGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKVxuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKVxuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghT2JqZWN0LmtleXMoYWxsb3dMaXN0KS5pbmNsdWRlcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlTGlzdCA9IFtdLmNvbmNhdCguLi5lbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVMaXN0KSB7XG4gICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlcykpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5vZGVOYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUxcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCwgc2FuaXRpemVIdG1sIH0gZnJvbSAnLi9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgeyBleGVjdXRlLCBnZXRFbGVtZW50LCBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnVGVtcGxhdGVGYWN0b3J5J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LCAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn1cblxuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gICAgICAubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMFxuICB9XG5cbiAgY2hhbmdlQ29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbnRlbnQpXG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7IC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LCAuLi5jb250ZW50IH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGVtcGxhdGVXcmFwcGVyLmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUodGhpcy5fY29uZmlnLnRlbXBsYXRlKVxuXG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdXG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKVxuXG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKVxuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudClcbiAgfVxuXG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoeyBzZWxlY3RvciwgZW50cnk6IGNvbnRlbnQgfSwgRGVmYXVsdENvbnRlbnRUeXBlKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKVxuXG4gICAgaWYgKCF0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KVxuXG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgfVxuXG4gIF9tYXliZVNhbml0aXplKGFyZykge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuc2FuaXRpemUgPyBzYW5pdGl6ZUh0bWwoYXJnLCB0aGlzLl9jb25maWcuYWxsb3dMaXN0LCB0aGlzLl9jb25maWcuc2FuaXRpemVGbikgOiBhcmdcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt0aGlzXSlcbiAgfVxuXG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJ1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlRmFjdG9yeVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0b29sdGlwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0ICogYXMgUG9wcGVyIGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbiwgZXhlY3V0ZSwgZmluZFNoYWRvd1Jvb3QsIGdldEVsZW1lbnQsIGdldFVJRCwgaXNSVEwsIG5vb3Bcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCB9IGZyb20gJy4vdXRpbC9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgVGVtcGxhdGVGYWN0b3J5IGZyb20gJy4vdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9vbHRpcCdcbmNvbnN0IERJU0FMTE9XRURfQVRUUklCVVRFUyA9IG5ldyBTZXQoWydzYW5pdGl6ZScsICdhbGxvd0xpc3QnLCAnc2FuaXRpemVGbiddKVxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfTU9EQUwgPSAnbW9kYWwnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcidcbmNvbnN0IFNFTEVDVE9SX01PREFMID0gYC4ke0NMQVNTX05BTUVfTU9EQUx9YFxuXG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnXG5cbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInXG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJ1xuY29uc3QgVFJJR0dFUl9DTElDSyA9ICdjbGljaydcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCdcblxuY29uc3QgRVZFTlRfSElERSA9ICdoaWRlJ1xuY29uc3QgRVZFTlRfSElEREVOID0gJ2hpZGRlbidcbmNvbnN0IEVWRU5UX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX1NIT1dOID0gJ3Nob3duJ1xuY29uc3QgRVZFTlRfSU5TRVJURUQgPSAnaW5zZXJ0ZWQnXG5jb25zdCBFVkVOVF9DTElDSyA9ICdjbGljaydcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSAnZm9jdXNpbidcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gJ2ZvY3Vzb3V0J1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9ICdtb3VzZWVudGVyJ1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJ1xuXG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgNl0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gIGN1c3RvbUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogJ2FycmF5JyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBsYWNlbWVudDogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gIHRpdGxlOiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKScsXG4gIHRyaWdnZXI6ICdzdHJpbmcnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJylcbiAgICB9XG5cbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZVxuICAgIHRoaXMuX3RpbWVvdXQgPSAwXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbFxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fVxuICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBudWxsXG4gICAgdGhpcy5fbmV3Q29udGVudCA9IG51bGxcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMudGlwID0gbnVsbFxuXG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICB0aGlzLl9maXhUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBlbmFibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZVxuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZVxuICB9XG5cbiAgdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkXG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGlja1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VudGVyKClcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG5cbiAgICBpZiAodGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnKSlcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJylcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzLl9pc1dpdGhDb250ZW50KCkgJiYgdGhpcy5faXNFbmFibGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfU0hPVykpXG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGZpbmRTaGFkb3dSb290KHRoaXMuX2VsZW1lbnQpXG4gICAgY29uc3QgaXNJblRoZURvbSA9IChzaGFkb3dSb290IHx8IHRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHY2IHJlbW92ZSB0aGlzIG9yIG1ha2UgaXQgb3B0aW9uYWxcbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKVxuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRoaXMudGlwKSkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZCh0aXApXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9JTlNFUlRFRCkpXG4gICAgfVxuXG4gICAgdGhpcy5fcG9wcGVyID0gdGhpcy5fY3JlYXRlUG9wcGVyKHRpcClcblxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XTikpXG5cbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSkpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KClcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGwgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURERU4pKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvdGVjdGVkXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2dldFRpdGxlKCkpXG4gIH1cblxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aXBcbiAgfVxuXG4gIF9jcmVhdGVUaXBFbGVtZW50KGNvbnRlbnQpIHtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkudG9IdG1sKClcblxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGNoZWNrIGluIHY2XG4gICAgaWYgKCF0aXApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9GQURFLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApXG5cbiAgICBjb25zdCB0aXBJZCA9IGdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpLnRvU3RyaW5nKClcblxuICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpXG5cbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpcFxuICB9XG5cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KSB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRmFjdG9yeSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5LmNoYW5nZUNvbnRlbnQoY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbmV3IFRlbXBsYXRlRmFjdG9yeSh7XG4gICAgICAgIC4uLnRoaXMuX2NvbmZpZyxcbiAgICAgICAgLy8gdGhlIGBjb250ZW50YCB2YXIgaGFzIHRvIGJlIGFmdGVyIGB0aGlzLl9jb25maWdgXG4gICAgICAgIC8vIHRvIG92ZXJyaWRlIGNvbmZpZy5jb250ZW50IGluIGNhc2Ugb2YgcG9wb3ZlclxuICAgICAgICBjb250ZW50LFxuICAgICAgICBleHRyYUNsYXNzOiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY3VzdG9tQ2xhc3MpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUZhY3RvcnlcbiAgfVxuXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLnRpdGxlKSB8fCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5hbmltYXRpb24gfHwgKHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKHRpcCkge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IGV4ZWN1dGUodGhpcy5fY29uZmlnLnBsYWNlbWVudCwgW3RoaXMsIHRpcCwgdGhpcy5fZWxlbWVudF0pXG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldXG4gICAgcmV0dXJuIFBvcHBlci5jcmVhdGVQb3BwZXIodGhpcy5fZWxlbWVudCwgdGlwLCB0aGlzLl9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkpXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBleGVjdXRlKGFyZywgW3RoaXMuX2VsZW1lbnRdKVxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLl9nZXRPZmZzZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgcGhhc2U6ICdiZWZvcmVNYWluJyxcbiAgICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgICAvLyBQcmUtc2V0IFBvcHBlcidzIHBsYWNlbWVudCBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8gcmVhZCB0aGUgYXJyb3cgc2l6ZXMgcHJvcGVybHkuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIFBvcHBlciBtaXhlcyB1cCB0aGUgd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zIHNpbmNlIHRoZSBpbml0aWFsIGFycm93IHN0eWxlIGlzIGZvciB0b3AgcGxhY2VtZW50XG4gICAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9XG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5fY29uZmlnLnRyaWdnZXIuc3BsaXQoJyAnKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKSB7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfQ0xJQ0spLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQudG9nZ2xlKClcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFRU5URVIpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU0lOKVxuICAgICAgICBjb25zdCBldmVudE91dCA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU09VVClcblxuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgZXZlbnRJbiwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWVcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcigpXG4gICAgICAgIH0pXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPVxuICAgICAgICAgICAgY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxuXG4gICAgICAgICAgY29udGV4dC5fbGVhdmUoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTU9EQUwpLCBFVkVOVF9NT0RBTF9ISURFLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKVxuICB9XG5cbiAgX2ZpeFRpdGxlKCkge1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJylcblxuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJiAhdGhpcy5fZWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnLCB0aXRsZSkgLy8gRE8gTk9UIFVTRSBJVC4gSXMgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKVxuICB9XG5cbiAgX2VudGVyKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkgfHwgdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KClcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkuc2hvdylcbiAgfVxuXG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5oaWRlKVxuICB9XG5cbiAgX3NldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpXG4gIH1cblxuICBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9hY3RpdmVUcmlnZ2VyKS5pbmNsdWRlcyh0cnVlKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBmb3IgKGNvbnN0IGRhdGFBdHRyaWJ1dGUgb2YgT2JqZWN0LmtleXMoZGF0YUF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmhhcyhkYXRhQXR0cmlidXRlKSkge1xuICAgICAgICBkZWxldGUgZGF0YUF0dHJpYnV0ZXNbZGF0YUF0dHJpYnV0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcgPSB7XG4gICAgICAuLi5kYXRhQXR0cmlidXRlcyxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmNvbnRhaW5lciA9IGNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlID8gZG9jdW1lbnQuYm9keSA6IGdldEVsZW1lbnQoY29uZmlnLmNvbnRhaW5lcilcblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLnRpdGxlID0gY29uZmlnLnRpdGxlLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcpKSB7XG4gICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIGNvbmZpZ1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZVxuICAgIGNvbmZpZy50cmlnZ2VyID0gJ21hbnVhbCdcblxuICAgIC8vIEluIHRoZSBmdXR1cmUgY2FuIGJlIHJlcGxhY2VkIHdpdGg6XG4gICAgLy8gY29uc3Qga2V5c1dpdGhEaWZmZXJlbnRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcpLmZpbHRlcihlbnRyeSA9PiB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZW50cnlbMF1dICE9PSB0aGlzLl9jb25maWdbZW50cnlbMF1dKVxuICAgIC8vIGBPYmplY3QuZnJvbUVudHJpZXMoa2V5c1dpdGhEaWZmZXJlbnRWYWx1ZXMpYFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9kaXNwb3NlUG9wcGVyKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aXApIHtcbiAgICAgIHRoaXMudGlwLnJlbW92ZSgpXG4gICAgICB0aGlzLnRpcCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb29sdGlwKVxuXG5leHBvcnQgZGVmYXVsdCBUb29sdGlwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHBvcG92ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3Rvb2x0aXAuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdwb3BvdmVyJ1xuXG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInXG5jb25zdCBTRUxFQ1RPUl9DT05URU5UID0gJy5wb3BvdmVyLWJvZHknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdCxcbiAgY29udGVudDogJycsXG4gIG9mZnNldDogWzAsIDhdLFxuICBwbGFjZW1lbnQ6ICdyaWdodCcsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIiByb2xlPVwidG9vbHRpcFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgK1xuICAgICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj4nICtcbiAgICAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0VHlwZSxcbiAgY29udGVudDogJyhudWxsfHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgUG9wb3ZlciBleHRlbmRzIFRvb2x0aXAge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gT3ZlcnJpZGVzXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRUaXRsZSgpIHx8IHRoaXMuX2dldENvbnRlbnQoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0Q29udGVudEZvclRlbXBsYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbU0VMRUNUT1JfVElUTEVdOiB0aGlzLl9nZXRUaXRsZSgpLFxuICAgICAgW1NFTEVDVE9SX0NPTlRFTlRdOiB0aGlzLl9nZXRDb250ZW50KClcbiAgICB9XG4gIH1cblxuICBfZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBQb3BvdmVyLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihQb3BvdmVyKVxuXG5leHBvcnQgZGVmYXVsdCBQb3BvdmVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHNjcm9sbHNweS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXRFbGVtZW50LCBpc0Rpc2FibGVkLCBpc1Zpc2libGVcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc2Nyb2xsc3B5J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuc2Nyb2xsc3B5J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nXG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJU1RfSVRFTVMgPSAnLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJTktfSVRFTVMgPSBgJHtTRUxFQ1RPUl9OQVZfTElOS1N9LCAke1NFTEVDVE9SX05BVl9JVEVNU30gPiAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU31gXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgb2Zmc2V0OiBudWxsLCAvLyBUT0RPOiB2NiBAZGVwcmVjYXRlZCwga2VlcCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuICByb290TWFyZ2luOiAnMHB4IDBweCAtMjUlJyxcbiAgc21vb3RoU2Nyb2xsOiBmYWxzZSxcbiAgdGFyZ2V0OiBudWxsLFxuICB0aHJlc2hvbGQ6IFswLjEsIDAuNSwgMV1cbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIG9mZnNldDogJyhudW1iZXJ8bnVsbCknLCAvLyBUT0RPIHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICdzdHJpbmcnLFxuICBzbW9vdGhTY3JvbGw6ICdib29sZWFuJyxcbiAgdGFyZ2V0OiAnZWxlbWVudCcsXG4gIHRocmVzaG9sZDogJ2FycmF5J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gdGhpcy5fZWxlbWVudCBpcyB0aGUgb2JzZXJ2YWJsZXNDb250YWluZXIgYW5kIGNvbmZpZy50YXJnZXQgdGhlIG1lbnUgbGlua3Mgd3JhcHBlclxuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnRcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsXG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpIC8vIGluaXRpYWxpemVcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKClcbiAgICB0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpXG5cbiAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX2dldE5ld09ic2VydmVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHNlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogb24gdjYgdGFyZ2V0IHNob3VsZCBiZSBnaXZlbiBleHBsaWNpdGx5ICYgcmVtb3ZlIHRoZSB7dGFyZ2V0OiAnc3MtdGFyZ2V0J30gY2FzZVxuICAgIGNvbmZpZy50YXJnZXQgPSBnZXRFbGVtZW50KGNvbmZpZy50YXJnZXQpIHx8IGRvY3VtZW50LmJvZHlcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aHJlc2hvbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5yZWdpc3RlciBhbnkgcHJldmlvdXMgbGlzdGVuZXJzXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSylcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpXG4gICAgICBpZiAob2JzZXJ2YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdEVsZW1lbnQgfHwgd2luZG93XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wXG4gICAgICAgIGlmIChyb290LnNjcm9sbFRvKSB7XG4gICAgICAgICAgcm9vdC5zY3JvbGxUbyh7IHRvcDogaGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENocm9tZSA2MCBkb2Vzbid0IHN1cHBvcnQgYHNjcm9sbFRvYFxuICAgICAgICByb290LnNjcm9sbFRvcCA9IGhlaWdodFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBfZ2V0TmV3T2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMuX3Jvb3RFbGVtZW50LFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl9jb25maWcudGhyZXNob2xkLFxuICAgICAgcm9vdE1hcmdpbjogdGhpcy5fY29uZmlnLnJvb3RNYXJnaW5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucylcbiAgfVxuXG4gIC8vIFRoZSBsb2dpYyBvZiBzZWxlY3Rpb25cbiAgX29ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlbnRyeSA9PiB0aGlzLl90YXJnZXRMaW5rcy5nZXQoYCMke2VudHJ5LnRhcmdldC5pZH1gKVxuICAgIGNvbnN0IGFjdGl2YXRlID0gZW50cnkgPT4ge1xuICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcCA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3BcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wXG4gICAgY29uc3QgdXNlclNjcm9sbHNEb3duID0gcGFyZW50U2Nyb2xsVG9wID49IHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3BcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wID0gcGFyZW50U2Nyb2xsVG9wXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRhcmdldEVsZW1lbnQoZW50cnkpKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcFxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyBkb3duLCBwaWNrIHRoZSBiaWdnZXIgb2Zmc2V0VG9wXG4gICAgICBpZiAodXNlclNjcm9sbHNEb3duICYmIGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzbid0IHNjcm9sbGVkLCBsZXQncyBrZWVwIHRoZSBmaXJzdCB2aXNpYmxlIGl0ZW0sIGJyZWFraW5nIHRoZSBpdGVyYXRpb25cbiAgICAgICAgaWYgKCFwYXJlbnRTY3JvbGxUb3ApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgdXAsIHBpY2sgdGhlIHNtYWxsZXN0IG9mZnNldFRvcFxuICAgICAgaWYgKCF1c2VyU2Nyb2xsc0Rvd24gJiYgIWVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpIHtcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgdGFyZ2V0TGlua3MgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoZGVjb2RlVVJJKGFuY2hvci5oYXNoKSwgdGhpcy5fZWxlbWVudClcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpXG4gICAgICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5zZXQoYW5jaG9yLmhhc2gsIG9ic2VydmFibGVTZWN0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJBY3RpdmVDbGFzcyh0aGlzLl9jb25maWcudGFyZ2V0KVxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldFxuICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRoaXMuX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpXG5cbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwgeyByZWxhdGVkVGFyZ2V0OiB0YXJnZXQgfSlcbiAgfVxuXG4gIF9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KSB7XG4gICAgLy8gQWN0aXZhdGUgZHJvcGRvd24gcGFyZW50c1xuICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fSVRFTSkpIHtcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCB0YXJnZXQuY2xvc2VzdChTRUxFQ1RPUl9EUk9QRE9XTikpXG4gICAgICAgIC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaXN0R3JvdXAgb2YgU2VsZWN0b3JFbmdpbmUucGFyZW50cyh0YXJnZXQsIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKSkge1xuICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rcyBwYXJlbnRzIGFzIGFjdGl2ZVxuICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgU2VsZWN0b3JFbmdpbmUucHJldihsaXN0R3JvdXAsIFNFTEVDVE9SX0xJTktfSVRFTVMpKSB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIGNvbnN0IGFjdGl2ZU5vZGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChgJHtTRUxFQ1RPUl9UQVJHRVRfTElOS1N9LiR7Q0xBU1NfTkFNRV9BQ1RJVkV9YCwgcGFyZW50KVxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBhY3RpdmVOb2Rlcykge1xuICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzcHkgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1NQWSkpIHtcbiAgICBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZShzcHkpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFNjcm9sbFNweSlcblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsU3B5XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRhYi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXROZXh0QWN0aXZlRWxlbWVudCwgaXNEaXNhYmxlZCB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RhYidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRhYidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTiA9IGBrZXlkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSdcbmNvbnN0IEVORF9LRVkgPSAnRW5kJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfRFJPUERPV04gPSAnZHJvcGRvd24nXG5cbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IE5PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSBgOm5vdCgke1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0pYFxuXG5jb25zdCBTRUxFQ1RPUl9UQUJfUEFORUwgPSAnLmxpc3QtZ3JvdXAsIC5uYXYsIFtyb2xlPVwidGFibGlzdFwiXSdcbmNvbnN0IFNFTEVDVE9SX09VVEVSID0gJy5uYXYtaXRlbSwgLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl0nIC8vIFRPRE86IGNvdWxkIG9ubHkgYmUgYHRhYmAgaW4gdjZcbmNvbnN0IFNFTEVDVE9SX0lOTkVSX0VMRU0gPSBgJHtTRUxFQ1RPUl9JTk5FUn0sICR7U0VMRUNUT1JfREFUQV9UT0dHTEV9YFxuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUgPSBgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdYFxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUYWIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTClcblxuICAgIGlmICghdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04sIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkgeyAvLyBTaG93cyB0aGlzIGVsZW0gYW5kIGRlYWN0aXZhdGUgdGhlIGFjdGl2ZSBzaWJsaW5nIGlmIGV4aXN0c1xuICAgIGNvbnN0IGlubmVyRWxlbSA9IHRoaXMuX2VsZW1lbnRcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNlYXJjaCBmb3IgYWN0aXZlIHRhYiBvbiBzYW1lIHBhcmVudCB0byBkZWFjdGl2YXRlIGl0XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fZ2V0QWN0aXZlRWxlbSgpXG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgP1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoYWN0aXZlLCBFVkVOVF9ISURFLCB7IHJlbGF0ZWRUYXJnZXQ6IGlubmVyRWxlbSB9KSA6XG4gICAgICBudWxsXG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcihpbm5lckVsZW0sIEVWRU5UX1NIT1csIHsgcmVsYXRlZFRhcmdldDogYWN0aXZlIH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgKGhpZGVFdmVudCAmJiBoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pXG4gICAgdGhpcy5fYWN0aXZhdGUoaW5uZXJFbGVtLCBhY3RpdmUpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9hY3RpdmF0ZShlbGVtZW50LCByZWxhdGVkRWxlbSkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBhY3RpdmF0ZS9zaG93IHRoZSBwcm9wZXIgc2VjdGlvblxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCB0cnVlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgZWxlbWVudC5ibHVyKClcblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgZmFsc2UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9ISURERU4sIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW0gfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIShbQVJST1dfTEVGVF9LRVksIEFSUk9XX1JJR0hUX0tFWSwgQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWSwgSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKS8vIHN0b3BQcm9wYWdhdGlvbi9wcmV2ZW50RGVmYXVsdCBib3RoIGFkZGVkIHRvIHN1cHBvcnQgdXAvZG93biBrZXlzIHdpdGhvdXQgc2Nyb2xsaW5nIHRoZSBwYWdlXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbHRlcihlbGVtZW50ID0+ICFpc0Rpc2FibGVkKGVsZW1lbnQpKVxuICAgIGxldCBuZXh0QWN0aXZlRWxlbWVudFxuXG4gICAgaWYgKFtIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQgPSBjaGlsZHJlbltldmVudC5rZXkgPT09IEhPTUVfS0VZID8gMCA6IGNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzTmV4dCA9IFtBUlJPV19SSUdIVF9LRVksIEFSUk9XX0RPV05fS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpXG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSlcbiAgICB9XG5cbiAgICBpZiAobmV4dEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KVxuICAgICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UobmV4dEFjdGl2ZUVsZW1lbnQpLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDaGlsZHJlbigpIHsgLy8gY29sbGVjdGlvbiBvZiBpbm5lciBlbGVtZW50c1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lOTkVSX0VMRU0sIHRoaXMuX3BhcmVudClcbiAgfVxuXG4gIF9nZXRBY3RpdmVFbGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbmQoY2hpbGQgPT4gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKSkgfHwgbnVsbFxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpIHtcbiAgICBjaGlsZCA9IHRoaXMuX2dldElubmVyRWxlbWVudChjaGlsZClcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZClcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpXG4gICAgY2hpbGQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgaXNBY3RpdmUpXG5cbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKVxuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGNoaWxkLCAncm9sZScsICd0YWInKVxuXG4gICAgLy8gc2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHJlbGF0ZWQgcGFuZWwgdG9vXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZCkge1xuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoY2hpbGQpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAncm9sZScsICd0YWJwYW5lbCcpXG5cbiAgICBpZiAoY2hpbGQuaWQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGAke2NoaWxkLmlkfWApXG4gICAgfVxuICB9XG5cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIW91dGVyRWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfRFJPUERPV04pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSlcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc05hbWUsIG9wZW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSwgQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX01FTlUsIENMQVNTX05BTUVfU0hPVylcbiAgICBvdXRlckVsZW0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgb3BlbilcbiAgfVxuXG4gIF9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIGlubmVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtbGluaylcbiAgX2dldElubmVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0ubWF0Y2hlcyhTRUxFQ1RPUl9JTk5FUl9FTEVNKSA/IGVsZW0gOiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0lOTkVSX0VMRU0sIGVsZW0pXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBvdXRlciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWl0ZW0pXG4gIF9nZXRPdXRlckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsb3Nlc3QoU0VMRUNUT1JfT1VURVIpIHx8IGVsZW1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpXG59KVxuXG4vKipcbiAqIEluaXRpYWxpemUgb24gZm9jdXNcbiAqL1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUpKSB7XG4gICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudClcbiAgfVxufSlcbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRhYilcblxuZXhwb3J0IGRlZmF1bHQgVGFiXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvYXN0LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIHJlZmxvdyB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RvYXN0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMudG9hc3QnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9NT1VTRU9WRVIgPSBgbW91c2VvdmVyJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU09VVCA9IGBmb2N1c291dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZScgLy8gQGRlcHJlY2F0ZWQgLSBrZXB0IGhlcmUgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYXV0b2hpZGU6ICdib29sZWFuJyxcbiAgZGVsYXk6ICdudW1iZXInXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvYXN0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGZhbHNlXG4gICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGZhbHNlXG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG5cbiAgICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfU0hPV0lORylcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG5cbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElERSkgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBpc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICAvLyBQcml2YXRlXG5cbiAgX21heWJlU2NoZWR1bGVIaWRlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiB8fCB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheSlcbiAgfVxuXG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XG4gICAgICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOiB7XG4gICAgICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNJbnRlcmFjdGluZykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSBuZXh0RWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LmNvbnRhaW5zKG5leHRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICB9XG5cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVkVSLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpXG4gIH1cblxuICBfY2xlYXJUaW1lb3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb2FzdC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKFRvYXN0KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb2FzdClcblxuZXhwb3J0IGRlZmF1bHQgVG9hc3RcbiIsICIvKiFcbiAqIFNlYXJjaCBtb2RhbCBmb3IgQm9vdHN0cmFwIGJhc2VkIFRodWxpdGUgc2l0ZXNcbiAqIENvcHlyaWdodCAyMDIxLTIwMjQgVGh1bGl0ZVxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgTW9kYWwgfSBmcm9tICdib290c3RyYXAnO1xuXG4oKCkgPT4ge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIERlY2xhcmUgc2VhcmNoIGVsZW1lbnRzXG4gICAgY29uc3Qgc2VhcmNoVG9nZ2xlTW9iaWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaFRvZ2dsZU1vYmlsZScpO1xuICAgIGNvbnN0IHNlYXJjaFRvZ2dsZURlc2t0b3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoVG9nZ2xlRGVza3RvcCcpO1xuICAgIGNvbnN0IHNlYXJjaE1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaE1vZGFsJyk7XG4gICAgY29uc3Qgc2VhcmNoRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2gtZm9ybScpO1xuICAgIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXJ5Jyk7XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hSZXN1bHRzJyk7XG5cbiAgICAvLyBDcmVhdGUgc2VhcmNoIG1vZGFsXG4gICAgY29uc3QgZmxleFNlYXJjaE1vZGFsID0gbmV3IE1vZGFsKHNlYXJjaE1vZGFsLCB7XG4gICAgICAgIGZvY3VzOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBTaG93IHNlYXJjaCBtb2RhbCB3aGVuIHNlYXJjaCBidXR0b24gaXMgY2xpY2tlZFxuICAgIHNlYXJjaFRvZ2dsZU1vYmlsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbE9uQ2xpY2spO1xuICAgIHNlYXJjaFRvZ2dsZURlc2t0b3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaG93TW9kYWxPbkNsaWNrKTtcblxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbE9uQ2xpY2soKSB7XG4gICAgICAgIGZsZXhTZWFyY2hNb2RhbC50b2dnbGUoKTtcbiAgICAgICAgLy8gU2hvdyBtZXNzYWdlIFwiTm8gcmVjZW50IHNlYXJjaGVzXCJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZWNlbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bkhhbmRsZXIpO1xuXG4gICAgZnVuY3Rpb24gb25LZXlEb3duSGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBTaG93IHNlYXJjaCBtb2RhbCB3aGVuIFwiQ3RybCArIGtcIiBpcyBwcmVzc2VkXG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleSA9PT0gJ2snKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZmxleFNlYXJjaE1vZGFsLnNob3coKTtcbiAgICAgICAgICAgIC8vIENsZWFyIGlucHV0IGZpZWxkIGFuZCBzZWFyY2ggcmVzdWx0c1xuICAgICAgICAgICAgc2VhcmNoRm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgc2VhcmNoUmVzdWx0cy50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgICAgLy8gU2hvdyBtZXNzYWdlIFwiTm8gcmVjZW50IHNlYXJjaGVzXCJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVjZW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgaW5wdXQgZmllbGQgYW5kIHNlYXJjaCByZXN1bHRzIHdoZW4gXCJFc2NcIiBpcyBwcmVzc2VkXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBzZWFyY2hGb3JtLnJlc2V0KCk7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgICAvLyBSZW1vdmUgY2xhc3MgXCJzZWxlY3RlZFwiIG9uIHNlYXJjaCByZXN1bHQgYW5kIHJlc2V0IGluZGV4IHNlYXJjaCByZXN1bHRzXG4gICAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhpZGUgbWVzc2FnZSBcIk5vIHNlYXJjaCByZXN1bHRzXCJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVzdWx0cycpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNsaWNraW5nIG9uIG1vZGFsIGJhY2tkcm9wXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXQgZmllbGQgYW5kIHNlYXJjaCByZXN1bHRzIHdoZW4gY2xpY2tpbmcgb24gbW9kYWwgYmFja2Ryb3BcbiAgICAgICAgdmFyIG1vZGFsRWxlbWVudCA9IHNlYXJjaE1vZGFsLmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGlmICghbW9kYWxFbGVtZW50KSB7XG4gICAgICAgICAgICBzZWFyY2hGb3JtLnJlc2V0KCk7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgICAvLyBIaWRlIG1lc3NhZ2UgXCJObyBzZWFyY2ggcmVzdWx0c1wiXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLW5vLXJlc3VsdHMnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgY2xhc3MgXCJzZWxlY3RlZFwiIG9uIHNlYXJjaCByZXN1bHQgYW5kIHJlc2V0IGluZGV4IHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGlmIChzZWFyY2hSZXN1bHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Moc2VhcmNoUmVzdWx0U2VsZWN0ZWQsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9jdXMgdGhlIHNlYXJjaCBpbnB1dCBlbGVtZW50IHdoZW4gdGhlIHNlYXJjaCBtb2RhbCBpcyBzaG93blxuICAgIHNlYXJjaE1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xuICAgICAgICBzZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gc2VhcmNoIHJlc3VsdHNcbiAgICAvLyBCYXNlZCBvbiBodHRwczovL2NvZGVwZW4uaW8vbWVodWxkZXNpZ24vcGVuL2VZcGJYTWdcbiAgICB2YXIgc2VhcmNoUmVzdWx0U2VsZWN0ZWQ7XG4gICAgdmFyIGluZGV4ID0gLTE7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAna2V5ZG93bicsXG4gICAgICAgIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGxlbiA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hSZXN1bHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5leHQgIT09ICd1bmRlZmluZWQnICYmIGluZGV4IDw9IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Moc2VhcmNoUmVzdWx0U2VsZWN0ZWQsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Moc2VhcmNoUmVzdWx0U2VsZWN0ZWQsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Moc2VhcmNoUmVzdWx0U2VsZWN0ZWQsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5leHQgIT09ICd1bmRlZmluZWQnICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFNlbGVjdGVkID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbbGVuXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVtsZW5dO1xuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhefFxcXFxiKScgKyBjbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKFxcXFxifCQpJywgJ2dpJyksICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtb3ZlIGZvY3VzIG9uIHNlbGVjdGVkIHNlYXJjaCByZXN1bHRcbiAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQucXVlcnlTZWxlY3RvcignYScpLmJsdXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGZvY3VzIG9uIHNlbGVjdGVkIHNlYXJjaCByZXN1bHRcbiAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQucXVlcnlTZWxlY3RvcignYScpLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1vdXNlIG5hdmlnYXRpb24gc2VhcmNoIHJlc3VsdHNcbiAgICBzZWFyY2hSZXN1bHRzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtb3VzZW92ZXInLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZhbHNlXG4gICAgKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUFBQTtBQUFBLElBQUE7QUFBQSw0QkFBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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O0FBQ0gsc0JBQVE7QUFDUixxQ0FBdUIsY0FBYyxxQkFBcUIsU0FBUyxFQUFFLEdBQUc7QUFBQSxZQUM1RTtBQUNBLHFCQUFTLHNCQUFzQixVQUFVO0FBQUEsVUFDN0MsT0FBTztBQUNILG9CQUFRO0FBQ1IsbUNBQXVCLGNBQWMscUJBQXFCLFNBQVMsRUFBRSxHQUFHO0FBQ3hFLHFCQUFTLHNCQUFzQixVQUFVO0FBQUEsVUFDN0M7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBRUEsYUFBUyxZQUFZLElBQUksV0FBVztBQUNoQyxVQUFJLEdBQUcsV0FBVztBQUNkLFdBQUcsVUFBVSxPQUFPLFNBQVM7QUFBQSxNQUNqQyxPQUFPO0FBQ0gsV0FBRyxZQUFZLEdBQUcsVUFBVSxRQUFRLElBQUksT0FBTyxZQUFZLFVBQVUsTUFBTSxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksV0FBVyxJQUFJLEdBQUcsR0FBRztBQUFBLE1BQ3JIO0FBRUEsMkJBQXFCLGNBQWMsR0FBRyxFQUFFLEtBQUs7QUFBQSxJQUNqRDtBQUVBLGFBQVMsU0FBUyxJQUFJLFdBQVc7QUFDN0IsVUFBSSxHQUFHLFdBQVc7QUFDZCxXQUFHLFVBQVUsSUFBSSxTQUFTO0FBQUEsTUFDOUIsT0FBTztBQUNILFdBQUcsYUFBYSxNQUFNO0FBQUEsTUFDMUI7QUFFQSwyQkFBcUIsY0FBYyxHQUFHLEVBQUUsTUFBTTtBQUFBLElBQ2xEO0FBR0Esa0JBQWM7QUFBQSxNQUNWO0FBQUEsTUFDQSxNQUFNO0FBQ0YsWUFBSSxzQkFBc0I7QUFDdEIsc0JBQVksc0JBQXNCLFVBQVU7QUFBQSxRQUNoRDtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBLEVBQ0osR0FBRzsiLAogICJuYW1lcyI6IFsiY3JlYXRlUG9wcGVyIiwgIm5hbWUiLCAic3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgInRvUGFkZGluZ09iamVjdCIsICJwb3BwZXJPZmZzZXRzIiwgIm1pbiIsICJtYXgiLCAib2Zmc2V0IiwgImVmZmVjdCIsICJwb3BwZXIiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlZmZlY3QiLCAid2luZG93IiwgImhhc2giLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImNsaXBwaW5nUGFyZW50cyIsICJnZXRDb21wdXRlZFN0eWxlIiwgInJlZmVyZW5jZSIsICJwb3BwZXJPZmZzZXRzIiwgIm9mZnNldCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJfbG9vcCIsICJfaSIsICJjaGVja3MiLCAib2Zmc2V0IiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgIm1pbiIsICJtYXgiLCAiZm4iLCAibWVyZ2VkIiwgImRlZmF1bHRNb2RpZmllcnMiLCAiY3JlYXRlUG9wcGVyIiwgInJlZmVyZW5jZSIsICJwb3BwZXIiLCAib3B0aW9ucyIsICJmbiIsICJzdGF0ZSIsICJlZmZlY3QiLCAibm9vcEZuIiwgImNyZWF0ZVBvcHBlciIsICJkZWZhdWx0TW9kaWZpZXJzIiwgImNyZWF0ZVBvcHBlciIsICJlbGVtZW50TWFwIiwgIk1hcCIsICJzZXQiLCAiZWxlbWVudCIsICJrZXkiLCAiaW5zdGFuY2UiLCAiaGFzIiwgImluc3RhbmNlTWFwIiwgImdldCIsICJzaXplIiwgImNvbnNvbGUiLCAiZXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJrZXlzIiwgInJlbW92ZSIsICJkZWxldGUiLCAiTUFYX1VJRCIsICJNSUxMSVNFQ09ORFNfTVVMVElQTElFUiIsICJUUkFOU0lUSU9OX0VORCIsICJwYXJzZVNlbGVjdG9yIiwgInNlbGVjdG9yIiwgIndpbmRvdyIsICJDU1MiLCAiZXNjYXBlIiwgInJlcGxhY2UiLCAibWF0Y2giLCAiaWQiLCAidG9UeXBlIiwgIm9iamVjdCIsICJ1bmRlZmluZWQiLCAiT2JqZWN0IiwgInByb3RvdHlwZSIsICJ0b1N0cmluZyIsICJjYWxsIiwgInRvTG93ZXJDYXNlIiwgImdldFVJRCIsICJwcmVmaXgiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAiZG9jdW1lbnQiLCAiZ2V0RWxlbWVudEJ5SWQiLCAiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCAidHJhbnNpdGlvbkR1cmF0aW9uIiwgInRyYW5zaXRpb25EZWxheSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uIiwgIk51bWJlciIsICJwYXJzZUZsb2F0IiwgImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwgInNwbGl0IiwgInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwgImRpc3BhdGNoRXZlbnQiLCAiRXZlbnQiLCAiaXNFbGVtZW50IiwgImpxdWVyeSIsICJub2RlVHlwZSIsICJnZXRFbGVtZW50IiwgImxlbmd0aCIsICJxdWVyeVNlbGVjdG9yIiwgImlzVmlzaWJsZSIsICJnZXRDbGllbnRSZWN0cyIsICJlbGVtZW50SXNWaXNpYmxlIiwgImdldFByb3BlcnR5VmFsdWUiLCAiY2xvc2VkRGV0YWlscyIsICJjbG9zZXN0IiwgInN1bW1hcnkiLCAicGFyZW50Tm9kZSIsICJpc0Rpc2FibGVkIiwgIk5vZGUiLCAiRUxFTUVOVF9OT0RFIiwgImNsYXNzTGlzdCIsICJjb250YWlucyIsICJkaXNhYmxlZCIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgImZpbmRTaGFkb3dSb290IiwgImRvY3VtZW50RWxlbWVudCIsICJhdHRhY2hTaGFkb3ciLCAiZ2V0Um9vdE5vZGUiLCAicm9vdCIsICJTaGFkb3dSb290IiwgIm5vb3AiLCAicmVmbG93IiwgIm9mZnNldEhlaWdodCIsICJnZXRqUXVlcnkiLCAialF1ZXJ5IiwgImJvZHkiLCAiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsICJvbkRPTUNvbnRlbnRMb2FkZWQiLCAiY2FsbGJhY2siLCAicmVhZHlTdGF0ZSIsICJhZGRFdmVudExpc3RlbmVyIiwgInB1c2giLCAiaXNSVEwiLCAiZGlyIiwgImRlZmluZUpRdWVyeVBsdWdpbiIsICJwbHVnaW4iLCAiJCIsICJuYW1lIiwgIk5BTUUiLCAiSlFVRVJZX05PX0NPTkZMSUNUIiwgImZuIiwgImpRdWVyeUludGVyZmFjZSIsICJDb25zdHJ1Y3RvciIsICJub0NvbmZsaWN0IiwgImV4ZWN1dGUiLCAicG9zc2libGVDYWxsYmFjayIsICJhcmdzIiwgImRlZmF1bHRWYWx1ZSIsICJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwgInRyYW5zaXRpb25FbGVtZW50IiwgIndhaXRGb3JUcmFuc2l0aW9uIiwgImR1cmF0aW9uUGFkZGluZyIsICJlbXVsYXRlZER1cmF0aW9uIiwgImNhbGxlZCIsICJoYW5kbGVyIiwgInRhcmdldCIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInNldFRpbWVvdXQiLCAiZ2V0TmV4dEFjdGl2ZUVsZW1lbnQiLCAibGlzdCIsICJhY3RpdmVFbGVtZW50IiwgInNob3VsZEdldE5leHQiLCAiaXNDeWNsZUFsbG93ZWQiLCAibGlzdExlbmd0aCIsICJpbmRleCIsICJpbmRleE9mIiwgIm1heCIsICJtaW4iLCAibmFtZXNwYWNlUmVnZXgiLCAic3RyaXBOYW1lUmVnZXgiLCAic3RyaXBVaWRSZWdleCIsICJldmVudFJlZ2lzdHJ5IiwgInVpZEV2ZW50IiwgImN1c3RvbUV2ZW50cyIsICJtb3VzZWVudGVyIiwgIm1vdXNlbGVhdmUiLCAibmF0aXZlRXZlbnRzIiwgIlNldCIsICJtYWtlRXZlbnRVaWQiLCAidWlkIiwgImdldEVsZW1lbnRFdmVudHMiLCAiYm9vdHN0cmFwSGFuZGxlciIsICJldmVudCIsICJoeWRyYXRlT2JqIiwgImRlbGVnYXRlVGFyZ2V0IiwgIm9uZU9mZiIsICJFdmVudEhhbmRsZXIiLCAib2ZmIiwgInR5cGUiLCAiYXBwbHkiLCAiYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIiLCAiZG9tRWxlbWVudHMiLCAicXVlcnlTZWxlY3RvckFsbCIsICJkb21FbGVtZW50IiwgImZpbmRIYW5kbGVyIiwgImV2ZW50cyIsICJjYWxsYWJsZSIsICJkZWxlZ2F0aW9uU2VsZWN0b3IiLCAidmFsdWVzIiwgImZpbmQiLCAibm9ybWFsaXplUGFyYW1ldGVycyIsICJvcmlnaW5hbFR5cGVFdmVudCIsICJkZWxlZ2F0aW9uRnVuY3Rpb24iLCAiaXNEZWxlZ2F0ZWQiLCAidHlwZUV2ZW50IiwgImdldFR5cGVFdmVudCIsICJhZGRIYW5kbGVyIiwgIndyYXBGdW5jdGlvbiIsICJyZWxhdGVkVGFyZ2V0IiwgImhhbmRsZXJzIiwgInByZXZpb3VzRnVuY3Rpb24iLCAicmVtb3ZlSGFuZGxlciIsICJCb29sZWFuIiwgInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsICJuYW1lc3BhY2UiLCAic3RvcmVFbGVtZW50RXZlbnQiLCAiaGFuZGxlcktleSIsICJlbnRyaWVzIiwgImluY2x1ZGVzIiwgIm9uIiwgIm9uZSIsICJpbk5hbWVzcGFjZSIsICJpc05hbWVzcGFjZSIsICJzdGFydHNXaXRoIiwgImVsZW1lbnRFdmVudCIsICJzbGljZSIsICJrZXlIYW5kbGVycyIsICJ0cmlnZ2VyIiwgImpRdWVyeUV2ZW50IiwgImJ1YmJsZXMiLCAibmF0aXZlRGlzcGF0Y2giLCAiZGVmYXVsdFByZXZlbnRlZCIsICJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0RlZmF1bHRQcmV2ZW50ZWQiLCAiZXZ0IiwgImNhbmNlbGFibGUiLCAicHJldmVudERlZmF1bHQiLCAib2JqIiwgIm1ldGEiLCAidmFsdWUiLCAiX3VudXNlZCIsICJkZWZpbmVQcm9wZXJ0eSIsICJjb25maWd1cmFibGUiLCAibm9ybWFsaXplRGF0YSIsICJKU09OIiwgInBhcnNlIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJub3JtYWxpemVEYXRhS2V5IiwgImNociIsICJNYW5pcHVsYXRvciIsICJzZXREYXRhQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVEYXRhQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJnZXREYXRhQXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzIiwgImJzS2V5cyIsICJkYXRhc2V0IiwgImZpbHRlciIsICJwdXJlS2V5IiwgImNoYXJBdCIsICJnZXREYXRhQXR0cmlidXRlIiwgIkNvbmZpZyIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIkVycm9yIiwgIl9nZXRDb25maWciLCAiY29uZmlnIiwgIl9tZXJnZUNvbmZpZ09iaiIsICJfY29uZmlnQWZ0ZXJNZXJnZSIsICJfdHlwZUNoZWNrQ29uZmlnIiwgImpzb25Db25maWciLCAiY29uc3RydWN0b3IiLCAiY29uZmlnVHlwZXMiLCAicHJvcGVydHkiLCAiZXhwZWN0ZWRUeXBlcyIsICJ2YWx1ZVR5cGUiLCAiUmVnRXhwIiwgInRlc3QiLCAiVHlwZUVycm9yIiwgInRvVXBwZXJDYXNlIiwgIlZFUlNJT04iLCAiQmFzZUNvbXBvbmVudCIsICJfZWxlbWVudCIsICJfY29uZmlnIiwgIkRhdGEiLCAiREFUQV9LRVkiLCAiZGlzcG9zZSIsICJFVkVOVF9LRVkiLCAicHJvcGVydHlOYW1lIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiX3F1ZXVlQ2FsbGJhY2siLCAiaXNBbmltYXRlZCIsICJnZXRJbnN0YW5jZSIsICJnZXRPckNyZWF0ZUluc3RhbmNlIiwgImV2ZW50TmFtZSIsICJnZXRTZWxlY3RvciIsICJocmVmQXR0cmlidXRlIiwgInRyaW0iLCAibWFwIiwgInNlbCIsICJqb2luIiwgIlNlbGVjdG9yRW5naW5lIiwgImNvbmNhdCIsICJFbGVtZW50IiwgImZpbmRPbmUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAibWF0Y2hlcyIsICJwYXJlbnRzIiwgImFuY2VzdG9yIiwgInByZXYiLCAicHJldmlvdXMiLCAicHJldmlvdXNFbGVtZW50U2libGluZyIsICJuZXh0IiwgIm5leHRFbGVtZW50U2libGluZyIsICJmb2N1c2FibGVDaGlsZHJlbiIsICJmb2N1c2FibGVzIiwgImVsIiwgImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCAiZ2V0RWxlbWVudEZyb21TZWxlY3RvciIsICJnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yIiwgImVuYWJsZURpc21pc3NUcmlnZ2VyIiwgImNvbXBvbmVudCIsICJtZXRob2QiLCAiY2xpY2tFdmVudCIsICJ0YWdOYW1lIiwgIkVWRU5UX0NMT1NFIiwgIkVWRU5UX0NMT1NFRCIsICJDTEFTU19OQU1FX0ZBREUiLCAiQ0xBU1NfTkFNRV9TSE9XIiwgIkFsZXJ0IiwgImNsb3NlIiwgImNsb3NlRXZlbnQiLCAiX2Rlc3Ryb3lFbGVtZW50IiwgImVhY2giLCAiZGF0YSIsICJEQVRBX0FQSV9LRVkiLCAiQ0xBU1NfTkFNRV9BQ1RJVkUiLCAiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCAiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCAiQnV0dG9uIiwgInRvZ2dsZSIsICJidXR0b24iLCAiRVZFTlRfVE9VQ0hTVEFSVCIsICJFVkVOVF9UT1VDSE1PVkUiLCAiRVZFTlRfVE9VQ0hFTkQiLCAiRVZFTlRfUE9JTlRFUkRPV04iLCAiRVZFTlRfUE9JTlRFUlVQIiwgIlBPSU5URVJfVFlQRV9UT1VDSCIsICJQT0lOVEVSX1RZUEVfUEVOIiwgIkNMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCIsICJTV0lQRV9USFJFU0hPTEQiLCAiZW5kQ2FsbGJhY2siLCAibGVmdENhbGxiYWNrIiwgInJpZ2h0Q2FsbGJhY2siLCAiU3dpcGUiLCAiaXNTdXBwb3J0ZWQiLCAiX2RlbHRhWCIsICJfc3VwcG9ydFBvaW50ZXJFdmVudHMiLCAiUG9pbnRlckV2ZW50IiwgIl9pbml0RXZlbnRzIiwgIl9zdGFydCIsICJ0b3VjaGVzIiwgImNsaWVudFgiLCAiX2V2ZW50SXNQb2ludGVyUGVuVG91Y2giLCAiX2VuZCIsICJfaGFuZGxlU3dpcGUiLCAiX21vdmUiLCAiYWJzRGVsdGFYIiwgImFicyIsICJkaXJlY3Rpb24iLCAiYWRkIiwgInBvaW50ZXJUeXBlIiwgIm5hdmlnYXRvciIsICJtYXhUb3VjaFBvaW50cyIsICJBUlJPV19MRUZUX0tFWSIsICJBUlJPV19SSUdIVF9LRVkiLCAiVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCIsICJPUkRFUl9ORVhUIiwgIk9SREVSX1BSRVYiLCAiRElSRUNUSU9OX0xFRlQiLCAiRElSRUNUSU9OX1JJR0hUIiwgIkVWRU5UX1NMSURFIiwgIkVWRU5UX1NMSUQiLCAiRVZFTlRfS0VZRE9XTiIsICJFVkVOVF9NT1VTRUVOVEVSIiwgIkVWRU5UX01PVVNFTEVBVkUiLCAiRVZFTlRfRFJBR19TVEFSVCIsICJFVkVOVF9MT0FEX0RBVEFfQVBJIiwgIkNMQVNTX05BTUVfQ0FST1VTRUwiLCAiQ0xBU1NfTkFNRV9TTElERSIsICJDTEFTU19OQU1FX0VORCIsICJDTEFTU19OQU1FX1NUQVJUIiwgIkNMQVNTX05BTUVfTkVYVCIsICJDTEFTU19OQU1FX1BSRVYiLCAiU0VMRUNUT1JfQUNUSVZFIiwgIlNFTEVDVE9SX0lURU0iLCAiU0VMRUNUT1JfQUNUSVZFX0lURU0iLCAiU0VMRUNUT1JfSVRFTV9JTUciLCAiU0VMRUNUT1JfSU5ESUNBVE9SUyIsICJTRUxFQ1RPUl9EQVRBX1NMSURFIiwgIlNFTEVDVE9SX0RBVEFfUklERSIsICJLRVlfVE9fRElSRUNUSU9OIiwgImludGVydmFsIiwgImtleWJvYXJkIiwgInBhdXNlIiwgInJpZGUiLCAidG91Y2giLCAid3JhcCIsICJDYXJvdXNlbCIsICJfaW50ZXJ2YWwiLCAiX2FjdGl2ZUVsZW1lbnQiLCAiX2lzU2xpZGluZyIsICJ0b3VjaFRpbWVvdXQiLCAiX3N3aXBlSGVscGVyIiwgIl9pbmRpY2F0b3JzRWxlbWVudCIsICJfYWRkRXZlbnRMaXN0ZW5lcnMiLCAiY3ljbGUiLCAiX3NsaWRlIiwgIm5leHRXaGVuVmlzaWJsZSIsICJoaWRkZW4iLCAiX2NsZWFySW50ZXJ2YWwiLCAiX3VwZGF0ZUludGVydmFsIiwgInNldEludGVydmFsIiwgIl9tYXliZUVuYWJsZUN5Y2xlIiwgInRvIiwgIml0ZW1zIiwgIl9nZXRJdGVtcyIsICJhY3RpdmVJbmRleCIsICJfZ2V0SXRlbUluZGV4IiwgIl9nZXRBY3RpdmUiLCAib3JkZXIiLCAiZGVmYXVsdEludGVydmFsIiwgIl9rZXlkb3duIiwgIl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzIiwgImltZyIsICJlbmRDYWxsQmFjayIsICJjbGVhclRpbWVvdXQiLCAic3dpcGVDb25maWciLCAiX2RpcmVjdGlvblRvT3JkZXIiLCAiX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQiLCAiYWN0aXZlSW5kaWNhdG9yIiwgIm5ld0FjdGl2ZUluZGljYXRvciIsICJlbGVtZW50SW50ZXJ2YWwiLCAicGFyc2VJbnQiLCAiaXNOZXh0IiwgIm5leHRFbGVtZW50IiwgIm5leHRFbGVtZW50SW5kZXgiLCAidHJpZ2dlckV2ZW50IiwgIl9vcmRlclRvRGlyZWN0aW9uIiwgInNsaWRlRXZlbnQiLCAiaXNDeWNsaW5nIiwgImRpcmVjdGlvbmFsQ2xhc3NOYW1lIiwgIm9yZGVyQ2xhc3NOYW1lIiwgImNvbXBsZXRlQ2FsbEJhY2siLCAiX2lzQW5pbWF0ZWQiLCAiY2xlYXJJbnRlcnZhbCIsICJjYXJvdXNlbCIsICJzbGlkZUluZGV4IiwgImNhcm91c2VscyIsICJFVkVOVF9TSE9XIiwgIkVWRU5UX1NIT1dOIiwgIkVWRU5UX0hJREUiLCAiRVZFTlRfSElEREVOIiwgIkNMQVNTX05BTUVfQ09MTEFQU0UiLCAiQ0xBU1NfTkFNRV9DT0xMQVBTSU5HIiwgIkNMQVNTX05BTUVfQ09MTEFQU0VEIiwgIkNMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOIiwgIkNMQVNTX05BTUVfSE9SSVpPTlRBTCIsICJXSURUSCIsICJIRUlHSFQiLCAiU0VMRUNUT1JfQUNUSVZFUyIsICJwYXJlbnQiLCAiQ29sbGFwc2UiLCAiX2lzVHJhbnNpdGlvbmluZyIsICJfdHJpZ2dlckFycmF5IiwgInRvZ2dsZUxpc3QiLCAiZWxlbSIsICJmaWx0ZXJFbGVtZW50IiwgImZvdW5kRWxlbWVudCIsICJfaW5pdGlhbGl6ZUNoaWxkcmVuIiwgIl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MiLCAiX2lzU2hvd24iLCAiaGlkZSIsICJzaG93IiwgImFjdGl2ZUNoaWxkcmVuIiwgIl9nZXRGaXJzdExldmVsQ2hpbGRyZW4iLCAic3RhcnRFdmVudCIsICJhY3RpdmVJbnN0YW5jZSIsICJkaW1lbnNpb24iLCAiX2dldERpbWVuc2lvbiIsICJzdHlsZSIsICJjb21wbGV0ZSIsICJjYXBpdGFsaXplZERpbWVuc2lvbiIsICJzY3JvbGxTaXplIiwgImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsICJzZWxlY3RlZCIsICJ0cmlnZ2VyQXJyYXkiLCAiaXNPcGVuIiwgIkVTQ0FQRV9LRVkiLCAiVEFCX0tFWSIsICJBUlJPV19VUF9LRVkiLCAiQVJST1dfRE9XTl9LRVkiLCAiUklHSFRfTU9VU0VfQlVUVE9OIiwgIkVWRU5UX0tFWURPV05fREFUQV9BUEkiLCAiRVZFTlRfS0VZVVBfREFUQV9BUEkiLCAiQ0xBU1NfTkFNRV9EUk9QVVAiLCAiQ0xBU1NfTkFNRV9EUk9QRU5EIiwgIkNMQVNTX05BTUVfRFJPUFNUQVJUIiwgIkNMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiIsICJDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsICJTRUxFQ1RPUl9NRU5VIiwgIlNFTEVDVE9SX05BVkJBUiIsICJTRUxFQ1RPUl9OQVZCQVJfTkFWIiwgIlNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMiLCAiUExBQ0VNRU5UX1RPUCIsICJQTEFDRU1FTlRfVE9QRU5EIiwgIlBMQUNFTUVOVF9CT1RUT00iLCAiUExBQ0VNRU5UX0JPVFRPTUVORCIsICJQTEFDRU1FTlRfUklHSFQiLCAiUExBQ0VNRU5UX0xFRlQiLCAiUExBQ0VNRU5UX1RPUENFTlRFUiIsICJQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSIiwgImF1dG9DbG9zZSIsICJib3VuZGFyeSIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJwb3BwZXJDb25maWciLCAicmVmZXJlbmNlIiwgIkRyb3Bkb3duIiwgIl9wb3BwZXIiLCAiX3BhcmVudCIsICJfbWVudSIsICJfaW5OYXZiYXIiLCAiX2RldGVjdE5hdmJhciIsICJzaG93RXZlbnQiLCAiX2NyZWF0ZVBvcHBlciIsICJmb2N1cyIsICJfY29tcGxldGVIaWRlIiwgImRlc3Ryb3kiLCAidXBkYXRlIiwgImhpZGVFdmVudCIsICJQb3BwZXIiLCAicmVmZXJlbmNlRWxlbWVudCIsICJfZ2V0UG9wcGVyQ29uZmlnIiwgImNyZWF0ZVBvcHBlciIsICJfZ2V0UGxhY2VtZW50IiwgInBhcmVudERyb3Bkb3duIiwgImlzRW5kIiwgIl9nZXRPZmZzZXQiLCAicG9wcGVyRGF0YSIsICJkZWZhdWx0QnNQb3BwZXJDb25maWciLCAicGxhY2VtZW50IiwgIm1vZGlmaWVycyIsICJvcHRpb25zIiwgImVuYWJsZWQiLCAiX3NlbGVjdE1lbnVJdGVtIiwgImNsZWFyTWVudXMiLCAib3BlblRvZ2dsZXMiLCAiY29udGV4dCIsICJjb21wb3NlZFBhdGgiLCAiaXNNZW51VGFyZ2V0IiwgImRhdGFBcGlLZXlkb3duSGFuZGxlciIsICJpc0lucHV0IiwgImlzRXNjYXBlRXZlbnQiLCAiaXNVcE9yRG93bkV2ZW50IiwgImdldFRvZ2dsZUJ1dHRvbiIsICJzdG9wUHJvcGFnYXRpb24iLCAiRVZFTlRfTU9VU0VET1dOIiwgImNsYXNzTmFtZSIsICJjbGlja0NhbGxiYWNrIiwgInJvb3RFbGVtZW50IiwgIkJhY2tkcm9wIiwgIl9pc0FwcGVuZGVkIiwgIl9hcHBlbmQiLCAiX2dldEVsZW1lbnQiLCAiX2VtdWxhdGVBbmltYXRpb24iLCAiYmFja2Ryb3AiLCAiY3JlYXRlRWxlbWVudCIsICJhcHBlbmQiLCAiRVZFTlRfRk9DVVNJTiIsICJFVkVOVF9LRVlET1dOX1RBQiIsICJUQUJfTkFWX0ZPUldBUkQiLCAiVEFCX05BVl9CQUNLV0FSRCIsICJhdXRvZm9jdXMiLCAidHJhcEVsZW1lbnQiLCAiRm9jdXNUcmFwIiwgIl9pc0FjdGl2ZSIsICJfbGFzdFRhYk5hdkRpcmVjdGlvbiIsICJhY3RpdmF0ZSIsICJfaGFuZGxlRm9jdXNpbiIsICJfaGFuZGxlS2V5ZG93biIsICJkZWFjdGl2YXRlIiwgImVsZW1lbnRzIiwgInNoaWZ0S2V5IiwgIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCAiU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQiLCAiUFJPUEVSVFlfUEFERElORyIsICJQUk9QRVJUWV9NQVJHSU4iLCAiU2Nyb2xsQmFySGVscGVyIiwgImdldFdpZHRoIiwgImRvY3VtZW50V2lkdGgiLCAiY2xpZW50V2lkdGgiLCAiaW5uZXJXaWR0aCIsICJ3aWR0aCIsICJfZGlzYWJsZU92ZXJGbG93IiwgIl9zZXRFbGVtZW50QXR0cmlidXRlcyIsICJjYWxjdWxhdGVkVmFsdWUiLCAicmVzZXQiLCAiX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCAiaXNPdmVyZmxvd2luZyIsICJfc2F2ZUluaXRpYWxBdHRyaWJ1dGUiLCAib3ZlcmZsb3ciLCAic3R5bGVQcm9wZXJ0eSIsICJzY3JvbGxiYXJXaWR0aCIsICJtYW5pcHVsYXRpb25DYWxsQmFjayIsICJzZXRQcm9wZXJ0eSIsICJfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayIsICJhY3R1YWxWYWx1ZSIsICJyZW1vdmVQcm9wZXJ0eSIsICJjYWxsQmFjayIsICJFVkVOVF9ISURFX1BSRVZFTlRFRCIsICJFVkVOVF9SRVNJWkUiLCAiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsICJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsICJFVkVOVF9LRVlET1dOX0RJU01JU1MiLCAiQ0xBU1NfTkFNRV9PUEVOIiwgIkNMQVNTX05BTUVfU1RBVElDIiwgIk9QRU5fU0VMRUNUT1IiLCAiU0VMRUNUT1JfRElBTE9HIiwgIlNFTEVDVE9SX01PREFMX0JPRFkiLCAiTW9kYWwiLCAiX2RpYWxvZyIsICJfYmFja2Ryb3AiLCAiX2luaXRpYWxpemVCYWNrRHJvcCIsICJfZm9jdXN0cmFwIiwgIl9pbml0aWFsaXplRm9jdXNUcmFwIiwgIl9zY3JvbGxCYXIiLCAiX2FkanVzdERpYWxvZyIsICJfc2hvd0VsZW1lbnQiLCAiX2hpZGVNb2RhbCIsICJoYW5kbGVVcGRhdGUiLCAic2Nyb2xsVG9wIiwgIm1vZGFsQm9keSIsICJ0cmFuc2l0aW9uQ29tcGxldGUiLCAiX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24iLCAiZXZlbnQyIiwgIl9yZXNldEFkanVzdG1lbnRzIiwgImlzTW9kYWxPdmVyZmxvd2luZyIsICJzY3JvbGxIZWlnaHQiLCAiY2xpZW50SGVpZ2h0IiwgImluaXRpYWxPdmVyZmxvd1kiLCAib3ZlcmZsb3dZIiwgImlzQm9keU92ZXJmbG93aW5nIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIsICJhbHJlYWR5T3BlbiIsICJDTEFTU19OQU1FX1NIT1dJTkciLCAiQ0xBU1NfTkFNRV9ISURJTkciLCAiQ0xBU1NfTkFNRV9CQUNLRFJPUCIsICJzY3JvbGwiLCAiT2ZmY2FudmFzIiwgImJsdXIiLCAiY29tcGxldGVDYWxsYmFjayIsICJwb3NpdGlvbiIsICJBUklBX0FUVFJJQlVURV9QQVRURVJOIiwgIkRlZmF1bHRBbGxvd2xpc3QiLCAiYSIsICJhcmVhIiwgImIiLCAiYnIiLCAiY29sIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwgImVtIiwgImhyIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgImkiLCAibGkiLCAib2wiLCAicCIsICJwcmUiLCAicyIsICJzbWFsbCIsICJzcGFuIiwgInN1YiIsICJzdXAiLCAic3Ryb25nIiwgInUiLCAidWwiLCAidXJpQXR0cmlidXRlcyIsICJTQUZFX1VSTF9QQVRURVJOIiwgImFsbG93ZWRBdHRyaWJ1dGUiLCAiYXR0cmlidXRlIiwgImFsbG93ZWRBdHRyaWJ1dGVMaXN0IiwgImF0dHJpYnV0ZU5hbWUiLCAibm9kZU5hbWUiLCAibm9kZVZhbHVlIiwgImF0dHJpYnV0ZVJlZ2V4IiwgInNvbWUiLCAicmVnZXgiLCAic2FuaXRpemVIdG1sIiwgInVuc2FmZUh0bWwiLCAiYWxsb3dMaXN0IiwgInNhbml0aXplRnVuY3Rpb24iLCAiZG9tUGFyc2VyIiwgIkRPTVBhcnNlciIsICJjcmVhdGVkRG9jdW1lbnQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImVsZW1lbnROYW1lIiwgImF0dHJpYnV0ZUxpc3QiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiaW5uZXJIVE1MIiwgImNvbnRlbnQiLCAiZXh0cmFDbGFzcyIsICJodG1sIiwgInNhbml0aXplIiwgInNhbml0aXplRm4iLCAidGVtcGxhdGUiLCAiRGVmYXVsdENvbnRlbnRUeXBlIiwgImVudHJ5IiwgIlRlbXBsYXRlRmFjdG9yeSIsICJnZXRDb250ZW50IiwgIl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbiIsICJoYXNDb250ZW50IiwgImNoYW5nZUNvbnRlbnQiLCAiX2NoZWNrQ29udGVudCIsICJ0b0h0bWwiLCAidGVtcGxhdGVXcmFwcGVyIiwgIl9tYXliZVNhbml0aXplIiwgInRleHQiLCAiX3NldENvbnRlbnQiLCAiYXJnIiwgInRlbXBsYXRlRWxlbWVudCIsICJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCAidGV4dENvbnRlbnQiLCAiRElTQUxMT1dFRF9BVFRSSUJVVEVTIiwgIkNMQVNTX05BTUVfTU9EQUwiLCAiU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiIsICJTRUxFQ1RPUl9NT0RBTCIsICJFVkVOVF9NT0RBTF9ISURFIiwgIlRSSUdHRVJfSE9WRVIiLCAiVFJJR0dFUl9GT0NVUyIsICJUUklHR0VSX0NMSUNLIiwgIlRSSUdHRVJfTUFOVUFMIiwgIkVWRU5UX0lOU0VSVEVEIiwgIkVWRU5UX0NMSUNLIiwgIkVWRU5UX0ZPQ1VTT1VUIiwgIkF0dGFjaG1lbnRNYXAiLCAiQVVUTyIsICJUT1AiLCAiUklHSFQiLCAiQk9UVE9NIiwgIkxFRlQiLCAiYW5pbWF0aW9uIiwgImNvbnRhaW5lciIsICJjdXN0b21DbGFzcyIsICJkZWxheSIsICJmYWxsYmFja1BsYWNlbWVudHMiLCAidGl0bGUiLCAiVG9vbHRpcCIsICJfaXNFbmFibGVkIiwgIl90aW1lb3V0IiwgIl9pc0hvdmVyZWQiLCAiX2FjdGl2ZVRyaWdnZXIiLCAiX3RlbXBsYXRlRmFjdG9yeSIsICJfbmV3Q29udGVudCIsICJ0aXAiLCAiX3NldExpc3RlbmVycyIsICJfZml4VGl0bGUiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidG9nZ2xlRW5hYmxlZCIsICJjbGljayIsICJfbGVhdmUiLCAiX2VudGVyIiwgIl9oaWRlTW9kYWxIYW5kbGVyIiwgIl9kaXNwb3NlUG9wcGVyIiwgIl9pc1dpdGhDb250ZW50IiwgInNoYWRvd1Jvb3QiLCAiaXNJblRoZURvbSIsICJvd25lckRvY3VtZW50IiwgIl9nZXRUaXBFbGVtZW50IiwgIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwgIl9nZXRUaXRsZSIsICJfY3JlYXRlVGlwRWxlbWVudCIsICJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwgIl9nZXRUZW1wbGF0ZUZhY3RvcnkiLCAidGlwSWQiLCAic2V0Q29udGVudCIsICJfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0IiwgIl9nZXREZWxlZ2F0ZUNvbmZpZyIsICJhdHRhY2htZW50IiwgInBoYXNlIiwgInN0YXRlIiwgInRyaWdnZXJzIiwgImV2ZW50SW4iLCAiZXZlbnRPdXQiLCAiX3NldFRpbWVvdXQiLCAidGltZW91dCIsICJkYXRhQXR0cmlidXRlcyIsICJkYXRhQXR0cmlidXRlIiwgIlNFTEVDVE9SX1RJVExFIiwgIlNFTEVDVE9SX0NPTlRFTlQiLCAiUG9wb3ZlciIsICJfZ2V0Q29udGVudCIsICJFVkVOVF9BQ1RJVkFURSIsICJDTEFTU19OQU1FX0RST1BET1dOX0lURU0iLCAiU0VMRUNUT1JfREFUQV9TUFkiLCAiU0VMRUNUT1JfVEFSR0VUX0xJTktTIiwgIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwgIlNFTEVDVE9SX05BVl9MSU5LUyIsICJTRUxFQ1RPUl9OQVZfSVRFTVMiLCAiU0VMRUNUT1JfTElTVF9JVEVNUyIsICJTRUxFQ1RPUl9MSU5LX0lURU1TIiwgIlNFTEVDVE9SX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJyb290TWFyZ2luIiwgInNtb290aFNjcm9sbCIsICJ0aHJlc2hvbGQiLCAiU2Nyb2xsU3B5IiwgIl90YXJnZXRMaW5rcyIsICJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwgIl9yb290RWxlbWVudCIsICJfYWN0aXZlVGFyZ2V0IiwgIl9vYnNlcnZlciIsICJfcHJldmlvdXNTY3JvbGxEYXRhIiwgInZpc2libGVFbnRyeVRvcCIsICJwYXJlbnRTY3JvbGxUb3AiLCAicmVmcmVzaCIsICJfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcyIsICJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCAiZGlzY29ubmVjdCIsICJfZ2V0TmV3T2JzZXJ2ZXIiLCAic2VjdGlvbiIsICJvYnNlcnZlIiwgIm9ic2VydmFibGVTZWN0aW9uIiwgImhhc2giLCAiaGVpZ2h0IiwgIm9mZnNldFRvcCIsICJzY3JvbGxUbyIsICJ0b3AiLCAiYmVoYXZpb3IiLCAiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCAiX29ic2VydmVyQ2FsbGJhY2siLCAidGFyZ2V0RWxlbWVudCIsICJfcHJvY2VzcyIsICJ1c2VyU2Nyb2xsc0Rvd24iLCAiaXNJbnRlcnNlY3RpbmciLCAiX2NsZWFyQWN0aXZlQ2xhc3MiLCAiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwgInRhcmdldExpbmtzIiwgImFuY2hvciIsICJkZWNvZGVVUkkiLCAiX2FjdGl2YXRlUGFyZW50cyIsICJsaXN0R3JvdXAiLCAiaXRlbSIsICJhY3RpdmVOb2RlcyIsICJub2RlIiwgInNweSIsICJIT01FX0tFWSIsICJFTkRfS0VZIiwgIkNMQVNTX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCAiTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJTRUxFQ1RPUl9UQUJfUEFORUwiLCAiU0VMRUNUT1JfT1VURVIiLCAiU0VMRUNUT1JfSU5ORVIiLCAiU0VMRUNUT1JfSU5ORVJfRUxFTSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUiLCAiVGFiIiwgIl9zZXRJbml0aWFsQXR0cmlidXRlcyIsICJfZ2V0Q2hpbGRyZW4iLCAiaW5uZXJFbGVtIiwgIl9lbGVtSXNBY3RpdmUiLCAiYWN0aXZlIiwgIl9nZXRBY3RpdmVFbGVtIiwgIl9kZWFjdGl2YXRlIiwgIl9hY3RpdmF0ZSIsICJyZWxhdGVkRWxlbSIsICJfdG9nZ2xlRHJvcERvd24iLCAibmV4dEFjdGl2ZUVsZW1lbnQiLCAicHJldmVudFNjcm9sbCIsICJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCIsICJfZ2V0SW5uZXJFbGVtZW50IiwgImlzQWN0aXZlIiwgIm91dGVyRWxlbSIsICJfZ2V0T3V0ZXJFbGVtZW50IiwgIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCAib3BlbiIsICJFVkVOVF9NT1VTRU9WRVIiLCAiRVZFTlRfTU9VU0VPVVQiLCAiQ0xBU1NfTkFNRV9ISURFIiwgImF1dG9oaWRlIiwgIlRvYXN0IiwgIl9oYXNNb3VzZUludGVyYWN0aW9uIiwgIl9oYXNLZXlib2FyZEludGVyYWN0aW9uIiwgIl9jbGVhclRpbWVvdXQiLCAiX21heWJlU2NoZWR1bGVIaWRlIiwgImlzU2hvd24iLCAiX29uSW50ZXJhY3Rpb24iLCAiaXNJbnRlcmFjdGluZyJdCn0K
diff --git a/public/js/search-modal.877cece5b6bc789456f89fa1955ccfcd8a5acdb2179e7882e292a6caa49efe68.js b/public/js/search-modal.877cece5b6bc789456f89fa1955ccfcd8a5acdb2179e7882e292a6caa49efe68.js
deleted file mode 100644
index 4084657d..00000000
--- a/public/js/search-modal.877cece5b6bc789456f89fa1955ccfcd8a5acdb2179e7882e292a6caa49efe68.js
+++ /dev/null
@@ -1,5301 +0,0 @@
-(() => {
- var __defProp = Object.defineProperty;
- var __defProps = Object.defineProperties;
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
- var __spreadValues = (a, b) => {
- for (var prop in b || (b = {}))
- if (__hasOwnProp.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- if (__getOwnPropSymbols)
- for (var prop of __getOwnPropSymbols(b)) {
- if (__propIsEnum.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- }
- return a;
- };
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
- var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
- };
-
- // node_modules/@popperjs/core/lib/index.js
- var lib_exports = {};
- __export(lib_exports, {
- afterMain: () => afterMain,
- afterRead: () => afterRead,
- afterWrite: () => afterWrite,
- applyStyles: () => applyStyles_default,
- arrow: () => arrow_default,
- auto: () => auto,
- basePlacements: () => basePlacements,
- beforeMain: () => beforeMain,
- beforeRead: () => beforeRead,
- beforeWrite: () => beforeWrite,
- bottom: () => bottom,
- clippingParents: () => clippingParents,
- computeStyles: () => computeStyles_default,
- createPopper: () => createPopper3,
- createPopperBase: () => createPopper,
- createPopperLite: () => createPopper2,
- detectOverflow: () => detectOverflow,
- end: () => end,
- eventListeners: () => eventListeners_default,
- flip: () => flip_default,
- hide: () => hide_default,
- left: () => left,
- main: () => main,
- modifierPhases: () => modifierPhases,
- offset: () => offset_default,
- placements: () => placements,
- popper: () => popper,
- popperGenerator: () => popperGenerator,
- popperOffsets: () => popperOffsets_default,
- preventOverflow: () => preventOverflow_default,
- read: () => read,
- reference: () => reference,
- right: () => right,
- start: () => start,
- top: () => top,
- variationPlacements: () => variationPlacements,
- viewport: () => viewport,
- write: () => write
- });
-
- // node_modules/@popperjs/core/lib/enums.js
- var top = "top";
- var bottom = "bottom";
- var right = "right";
- var left = "left";
- var auto = "auto";
- var basePlacements = [top, bottom, right, left];
- var start = "start";
- var end = "end";
- var clippingParents = "clippingParents";
- var viewport = "viewport";
- var popper = "popper";
- var reference = "reference";
- var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
- return acc.concat([placement + "-" + start, placement + "-" + end]);
- }, []);
- var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
- return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
- }, []);
- var beforeRead = "beforeRead";
- var read = "read";
- var afterRead = "afterRead";
- var beforeMain = "beforeMain";
- var main = "main";
- var afterMain = "afterMain";
- var beforeWrite = "beforeWrite";
- var write = "write";
- var afterWrite = "afterWrite";
- var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
-
- // node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
- function getNodeName(element) {
- return element ? (element.nodeName || "").toLowerCase() : null;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindow.js
- function getWindow(node) {
- if (node == null) {
- return window;
- }
- if (node.toString() !== "[object Window]") {
- var ownerDocument = node.ownerDocument;
- return ownerDocument ? ownerDocument.defaultView || window : window;
- }
- return node;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
- function isElement(node) {
- var OwnElement = getWindow(node).Element;
- return node instanceof OwnElement || node instanceof Element;
- }
- function isHTMLElement(node) {
- var OwnElement = getWindow(node).HTMLElement;
- return node instanceof OwnElement || node instanceof HTMLElement;
- }
- function isShadowRoot(node) {
- if (typeof ShadowRoot === "undefined") {
- return false;
- }
- var OwnElement = getWindow(node).ShadowRoot;
- return node instanceof OwnElement || node instanceof ShadowRoot;
- }
-
- // node_modules/@popperjs/core/lib/modifiers/applyStyles.js
- function applyStyles(_ref) {
- var state = _ref.state;
- Object.keys(state.elements).forEach(function(name) {
- var style = state.styles[name] || {};
- var attributes = state.attributes[name] || {};
- var element = state.elements[name];
- if (!isHTMLElement(element) || !getNodeName(element)) {
- return;
- }
- Object.assign(element.style, style);
- Object.keys(attributes).forEach(function(name2) {
- var value = attributes[name2];
- if (value === false) {
- element.removeAttribute(name2);
- } else {
- element.setAttribute(name2, value === true ? "" : value);
- }
- });
- });
- }
- function effect(_ref2) {
- var state = _ref2.state;
- var initialStyles = {
- popper: {
- position: state.options.strategy,
- left: "0",
- top: "0",
- margin: "0"
- },
- arrow: {
- position: "absolute"
- },
- reference: {}
- };
- Object.assign(state.elements.popper.style, initialStyles.popper);
- state.styles = initialStyles;
- if (state.elements.arrow) {
- Object.assign(state.elements.arrow.style, initialStyles.arrow);
- }
- return function() {
- Object.keys(state.elements).forEach(function(name) {
- var element = state.elements[name];
- var attributes = state.attributes[name] || {};
- var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
- var style = styleProperties.reduce(function(style2, property) {
- style2[property] = "";
- return style2;
- }, {});
- if (!isHTMLElement(element) || !getNodeName(element)) {
- return;
- }
- Object.assign(element.style, style);
- Object.keys(attributes).forEach(function(attribute) {
- element.removeAttribute(attribute);
- });
- });
- };
- }
- var applyStyles_default = {
- name: "applyStyles",
- enabled: true,
- phase: "write",
- fn: applyStyles,
- effect,
- requires: ["computeStyles"]
- };
-
- // node_modules/@popperjs/core/lib/utils/getBasePlacement.js
- function getBasePlacement(placement) {
- return placement.split("-")[0];
- }
-
- // node_modules/@popperjs/core/lib/utils/math.js
- var max = Math.max;
- var min = Math.min;
- var round = Math.round;
-
- // node_modules/@popperjs/core/lib/utils/userAgent.js
- function getUAString() {
- var uaData = navigator.userAgentData;
- if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
- return uaData.brands.map(function(item) {
- return item.brand + "/" + item.version;
- }).join(" ");
- }
- return navigator.userAgent;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js
- function isLayoutViewport() {
- return !/^((?!chrome|android).)*safari/i.test(getUAString());
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
- function getBoundingClientRect(element, includeScale, isFixedStrategy) {
- if (includeScale === void 0) {
- includeScale = false;
- }
- if (isFixedStrategy === void 0) {
- isFixedStrategy = false;
- }
- var clientRect = element.getBoundingClientRect();
- var scaleX = 1;
- var scaleY = 1;
- if (includeScale && isHTMLElement(element)) {
- scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
- scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
- }
- var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport;
- var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
- var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
- var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
- var width = clientRect.width / scaleX;
- var height = clientRect.height / scaleY;
- return {
- width,
- height,
- top: y,
- right: x + width,
- bottom: y + height,
- left: x,
- x,
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
- function getLayoutRect(element) {
- var clientRect = getBoundingClientRect(element);
- var width = element.offsetWidth;
- var height = element.offsetHeight;
- if (Math.abs(clientRect.width - width) <= 1) {
- width = clientRect.width;
- }
- if (Math.abs(clientRect.height - height) <= 1) {
- height = clientRect.height;
- }
- return {
- x: element.offsetLeft,
- y: element.offsetTop,
- width,
- height
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/contains.js
- function contains(parent, child) {
- var rootNode = child.getRootNode && child.getRootNode();
- if (parent.contains(child)) {
- return true;
- } else if (rootNode && isShadowRoot(rootNode)) {
- var next = child;
- do {
- if (next && parent.isSameNode(next)) {
- return true;
- }
- next = next.parentNode || next.host;
- } while (next);
- }
- return false;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
- function getComputedStyle2(element) {
- return getWindow(element).getComputedStyle(element);
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
- function isTableElement(element) {
- return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
- function getDocumentElement(element) {
- return ((isElement(element) ? element.ownerDocument : (
- // $FlowFixMe[prop-missing]
- element.document
- )) || window.document).documentElement;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
- function getParentNode(element) {
- if (getNodeName(element) === "html") {
- return element;
- }
- return (
- // this is a quicker (but less type safe) way to save quite some bytes from the bundle
- // $FlowFixMe[incompatible-return]
- // $FlowFixMe[prop-missing]
- element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
- element.parentNode || // DOM Element detected
- (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
- // $FlowFixMe[incompatible-call]: HTMLElement is a Node
- getDocumentElement(element)
- );
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
- function getTrueOffsetParent(element) {
- if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
- getComputedStyle2(element).position === "fixed") {
- return null;
- }
- return element.offsetParent;
- }
- function getContainingBlock(element) {
- var isFirefox = /firefox/i.test(getUAString());
- var isIE = /Trident/i.test(getUAString());
- if (isIE && isHTMLElement(element)) {
- var elementCss = getComputedStyle2(element);
- if (elementCss.position === "fixed") {
- return null;
- }
- }
- var currentNode = getParentNode(element);
- if (isShadowRoot(currentNode)) {
- currentNode = currentNode.host;
- }
- while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
- var css = getComputedStyle2(currentNode);
- if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
- return currentNode;
- } else {
- currentNode = currentNode.parentNode;
- }
- }
- return null;
- }
- function getOffsetParent(element) {
- var window2 = getWindow(element);
- var offsetParent = getTrueOffsetParent(element);
- while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") {
- offsetParent = getTrueOffsetParent(offsetParent);
- }
- if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) {
- return window2;
- }
- return offsetParent || getContainingBlock(element) || window2;
- }
-
- // node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
- function getMainAxisFromPlacement(placement) {
- return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
- }
-
- // node_modules/@popperjs/core/lib/utils/within.js
- function within(min2, value, max2) {
- return max(min2, min(value, max2));
- }
- function withinMaxClamp(min2, value, max2) {
- var v = within(min2, value, max2);
- return v > max2 ? max2 : v;
- }
-
- // node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
- function getFreshSideObject() {
- return {
- top: 0,
- right: 0,
- bottom: 0,
- left: 0
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
- function mergePaddingObject(paddingObject) {
- return Object.assign({}, getFreshSideObject(), paddingObject);
- }
-
- // node_modules/@popperjs/core/lib/utils/expandToHashMap.js
- function expandToHashMap(value, keys) {
- return keys.reduce(function(hashMap, key) {
- hashMap[key] = value;
- return hashMap;
- }, {});
- }
-
- // node_modules/@popperjs/core/lib/modifiers/arrow.js
- var toPaddingObject = function toPaddingObject2(padding, state) {
- padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
- placement: state.placement
- })) : padding;
- return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
- };
- function arrow(_ref) {
- var _state$modifiersData$;
- var state = _ref.state, name = _ref.name, options = _ref.options;
- var arrowElement = state.elements.arrow;
- var popperOffsets2 = state.modifiersData.popperOffsets;
- var basePlacement = getBasePlacement(state.placement);
- var axis = getMainAxisFromPlacement(basePlacement);
- var isVertical = [left, right].indexOf(basePlacement) >= 0;
- var len = isVertical ? "height" : "width";
- if (!arrowElement || !popperOffsets2) {
- return;
- }
- var paddingObject = toPaddingObject(options.padding, state);
- var arrowRect = getLayoutRect(arrowElement);
- var minProp = axis === "y" ? top : left;
- var maxProp = axis === "y" ? bottom : right;
- var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
- var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
- var arrowOffsetParent = getOffsetParent(arrowElement);
- var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
- var centerToReference = endDiff / 2 - startDiff / 2;
- var min2 = paddingObject[minProp];
- var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
- var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
- var offset2 = within(min2, center, max2);
- var axisProp = axis;
- state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
- }
- function effect2(_ref2) {
- var state = _ref2.state, options = _ref2.options;
- var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
- if (arrowElement == null) {
- return;
- }
- if (typeof arrowElement === "string") {
- arrowElement = state.elements.popper.querySelector(arrowElement);
- if (!arrowElement) {
- return;
- }
- }
- if (!contains(state.elements.popper, arrowElement)) {
- return;
- }
- state.elements.arrow = arrowElement;
- }
- var arrow_default = {
- name: "arrow",
- enabled: true,
- phase: "main",
- fn: arrow,
- effect: effect2,
- requires: ["popperOffsets"],
- requiresIfExists: ["preventOverflow"]
- };
-
- // node_modules/@popperjs/core/lib/utils/getVariation.js
- function getVariation(placement) {
- return placement.split("-")[1];
- }
-
- // node_modules/@popperjs/core/lib/modifiers/computeStyles.js
- var unsetSides = {
- top: "auto",
- right: "auto",
- bottom: "auto",
- left: "auto"
- };
- function roundOffsetsByDPR(_ref, win) {
- var x = _ref.x, y = _ref.y;
- var dpr = win.devicePixelRatio || 1;
- return {
- x: round(x * dpr) / dpr || 0,
- y: round(y * dpr) / dpr || 0
- };
- }
- function mapToStyles(_ref2) {
- var _Object$assign2;
- var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
- var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y;
- var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
- x,
- y
- }) : {
- x,
- y
- };
- x = _ref3.x;
- y = _ref3.y;
- var hasX = offsets.hasOwnProperty("x");
- var hasY = offsets.hasOwnProperty("y");
- var sideX = left;
- var sideY = top;
- var win = window;
- if (adaptive) {
- var offsetParent = getOffsetParent(popper2);
- var heightProp = "clientHeight";
- var widthProp = "clientWidth";
- if (offsetParent === getWindow(popper2)) {
- offsetParent = getDocumentElement(popper2);
- if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") {
- heightProp = "scrollHeight";
- widthProp = "scrollWidth";
- }
- }
- offsetParent = offsetParent;
- if (placement === top || (placement === left || placement === right) && variation === end) {
- sideY = bottom;
- var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : (
- // $FlowFixMe[prop-missing]
- offsetParent[heightProp]
- );
- y -= offsetY - popperRect.height;
- y *= gpuAcceleration ? 1 : -1;
- }
- if (placement === left || (placement === top || placement === bottom) && variation === end) {
- sideX = right;
- var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : (
- // $FlowFixMe[prop-missing]
- offsetParent[widthProp]
- );
- x -= offsetX - popperRect.width;
- x *= gpuAcceleration ? 1 : -1;
- }
- }
- var commonStyles = Object.assign({
- position
- }, adaptive && unsetSides);
- var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
- x,
- y
- }, getWindow(popper2)) : {
- x,
- y
- };
- x = _ref4.x;
- y = _ref4.y;
- if (gpuAcceleration) {
- var _Object$assign;
- return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
- }
- return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
- }
- function computeStyles(_ref5) {
- var state = _ref5.state, options = _ref5.options;
- var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
- var commonStyles = {
- placement: getBasePlacement(state.placement),
- variation: getVariation(state.placement),
- popper: state.elements.popper,
- popperRect: state.rects.popper,
- gpuAcceleration,
- isFixed: state.options.strategy === "fixed"
- };
- if (state.modifiersData.popperOffsets != null) {
- state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
- offsets: state.modifiersData.popperOffsets,
- position: state.options.strategy,
- adaptive,
- roundOffsets
- })));
- }
- if (state.modifiersData.arrow != null) {
- state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
- offsets: state.modifiersData.arrow,
- position: "absolute",
- adaptive: false,
- roundOffsets
- })));
- }
- state.attributes.popper = Object.assign({}, state.attributes.popper, {
- "data-popper-placement": state.placement
- });
- }
- var computeStyles_default = {
- name: "computeStyles",
- enabled: true,
- phase: "beforeWrite",
- fn: computeStyles,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/modifiers/eventListeners.js
- var passive = {
- passive: true
- };
- function effect3(_ref) {
- var state = _ref.state, instance = _ref.instance, options = _ref.options;
- var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
- var window2 = getWindow(state.elements.popper);
- var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
- if (scroll) {
- scrollParents.forEach(function(scrollParent) {
- scrollParent.addEventListener("scroll", instance.update, passive);
- });
- }
- if (resize) {
- window2.addEventListener("resize", instance.update, passive);
- }
- return function() {
- if (scroll) {
- scrollParents.forEach(function(scrollParent) {
- scrollParent.removeEventListener("scroll", instance.update, passive);
- });
- }
- if (resize) {
- window2.removeEventListener("resize", instance.update, passive);
- }
- };
- }
- var eventListeners_default = {
- name: "eventListeners",
- enabled: true,
- phase: "write",
- fn: function fn() {
- },
- effect: effect3,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
- var hash = {
- left: "right",
- right: "left",
- bottom: "top",
- top: "bottom"
- };
- function getOppositePlacement(placement) {
- return placement.replace(/left|right|bottom|top/g, function(matched) {
- return hash[matched];
- });
- }
-
- // node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
- var hash2 = {
- start: "end",
- end: "start"
- };
- function getOppositeVariationPlacement(placement) {
- return placement.replace(/start|end/g, function(matched) {
- return hash2[matched];
- });
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
- function getWindowScroll(node) {
- var win = getWindow(node);
- var scrollLeft = win.pageXOffset;
- var scrollTop = win.pageYOffset;
- return {
- scrollLeft,
- scrollTop
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
- function getWindowScrollBarX(element) {
- return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
- function getViewportRect(element, strategy) {
- var win = getWindow(element);
- var html = getDocumentElement(element);
- var visualViewport = win.visualViewport;
- var width = html.clientWidth;
- var height = html.clientHeight;
- var x = 0;
- var y = 0;
- if (visualViewport) {
- width = visualViewport.width;
- height = visualViewport.height;
- var layoutViewport = isLayoutViewport();
- if (layoutViewport || !layoutViewport && strategy === "fixed") {
- x = visualViewport.offsetLeft;
- y = visualViewport.offsetTop;
- }
- }
- return {
- width,
- height,
- x: x + getWindowScrollBarX(element),
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
- function getDocumentRect(element) {
- var _element$ownerDocumen;
- var html = getDocumentElement(element);
- var winScroll = getWindowScroll(element);
- var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
- var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
- var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
- var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
- var y = -winScroll.scrollTop;
- if (getComputedStyle2(body || html).direction === "rtl") {
- x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
- }
- return {
- width,
- height,
- x,
- y
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
- function isScrollParent(element) {
- var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
- return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
- function getScrollParent(node) {
- if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
- return node.ownerDocument.body;
- }
- if (isHTMLElement(node) && isScrollParent(node)) {
- return node;
- }
- return getScrollParent(getParentNode(node));
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
- function listScrollParents(element, list) {
- var _element$ownerDocumen;
- if (list === void 0) {
- list = [];
- }
- var scrollParent = getScrollParent(element);
- var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
- var win = getWindow(scrollParent);
- var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
- var updatedList = list.concat(target);
- return isBody ? updatedList : (
- // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
- updatedList.concat(listScrollParents(getParentNode(target)))
- );
- }
-
- // node_modules/@popperjs/core/lib/utils/rectToClientRect.js
- function rectToClientRect(rect) {
- return Object.assign({}, rect, {
- left: rect.x,
- top: rect.y,
- right: rect.x + rect.width,
- bottom: rect.y + rect.height
- });
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
- function getInnerBoundingClientRect(element, strategy) {
- var rect = getBoundingClientRect(element, false, strategy === "fixed");
- rect.top = rect.top + element.clientTop;
- rect.left = rect.left + element.clientLeft;
- rect.bottom = rect.top + element.clientHeight;
- rect.right = rect.left + element.clientWidth;
- rect.width = element.clientWidth;
- rect.height = element.clientHeight;
- rect.x = rect.left;
- rect.y = rect.top;
- return rect;
- }
- function getClientRectFromMixedType(element, clippingParent, strategy) {
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
- }
- function getClippingParents(element) {
- var clippingParents2 = listScrollParents(getParentNode(element));
- var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0;
- var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
- if (!isElement(clipperElement)) {
- return [];
- }
- return clippingParents2.filter(function(clippingParent) {
- return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
- });
- }
- function getClippingRect(element, boundary, rootBoundary, strategy) {
- var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
- var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
- var firstClippingParent = clippingParents2[0];
- var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
- var rect = getClientRectFromMixedType(element, clippingParent, strategy);
- accRect.top = max(rect.top, accRect.top);
- accRect.right = min(rect.right, accRect.right);
- accRect.bottom = min(rect.bottom, accRect.bottom);
- accRect.left = max(rect.left, accRect.left);
- return accRect;
- }, getClientRectFromMixedType(element, firstClippingParent, strategy));
- clippingRect.width = clippingRect.right - clippingRect.left;
- clippingRect.height = clippingRect.bottom - clippingRect.top;
- clippingRect.x = clippingRect.left;
- clippingRect.y = clippingRect.top;
- return clippingRect;
- }
-
- // node_modules/@popperjs/core/lib/utils/computeOffsets.js
- function computeOffsets(_ref) {
- var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
- var basePlacement = placement ? getBasePlacement(placement) : null;
- var variation = placement ? getVariation(placement) : null;
- var commonX = reference2.x + reference2.width / 2 - element.width / 2;
- var commonY = reference2.y + reference2.height / 2 - element.height / 2;
- var offsets;
- switch (basePlacement) {
- case top:
- offsets = {
- x: commonX,
- y: reference2.y - element.height
- };
- break;
- case bottom:
- offsets = {
- x: commonX,
- y: reference2.y + reference2.height
- };
- break;
- case right:
- offsets = {
- x: reference2.x + reference2.width,
- y: commonY
- };
- break;
- case left:
- offsets = {
- x: reference2.x - element.width,
- y: commonY
- };
- break;
- default:
- offsets = {
- x: reference2.x,
- y: reference2.y
- };
- }
- var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
- if (mainAxis != null) {
- var len = mainAxis === "y" ? "height" : "width";
- switch (variation) {
- case start:
- offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
- break;
- case end:
- offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
- break;
- default:
- }
- }
- return offsets;
- }
-
- // node_modules/@popperjs/core/lib/utils/detectOverflow.js
- function detectOverflow(state, options) {
- if (options === void 0) {
- options = {};
- }
- var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
- var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
- var altContext = elementContext === popper ? reference : popper;
- var popperRect = state.rects.popper;
- var element = state.elements[altBoundary ? altContext : elementContext];
- var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
- var referenceClientRect = getBoundingClientRect(state.elements.reference);
- var popperOffsets2 = computeOffsets({
- reference: referenceClientRect,
- element: popperRect,
- strategy: "absolute",
- placement
- });
- var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
- var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
- var overflowOffsets = {
- top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
- bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
- left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
- right: elementClientRect.right - clippingClientRect.right + paddingObject.right
- };
- var offsetData = state.modifiersData.offset;
- if (elementContext === popper && offsetData) {
- var offset2 = offsetData[placement];
- Object.keys(overflowOffsets).forEach(function(key) {
- var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
- var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
- overflowOffsets[key] += offset2[axis] * multiply;
- });
- }
- return overflowOffsets;
- }
-
- // node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
- function computeAutoPlacement(state, options) {
- if (options === void 0) {
- options = {};
- }
- var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
- var variation = getVariation(placement);
- var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
- return getVariation(placement2) === variation;
- }) : basePlacements;
- var allowedPlacements = placements2.filter(function(placement2) {
- return allowedAutoPlacements.indexOf(placement2) >= 0;
- });
- if (allowedPlacements.length === 0) {
- allowedPlacements = placements2;
- }
- var overflows = allowedPlacements.reduce(function(acc, placement2) {
- acc[placement2] = detectOverflow(state, {
- placement: placement2,
- boundary,
- rootBoundary,
- padding
- })[getBasePlacement(placement2)];
- return acc;
- }, {});
- return Object.keys(overflows).sort(function(a, b) {
- return overflows[a] - overflows[b];
- });
- }
-
- // node_modules/@popperjs/core/lib/modifiers/flip.js
- function getExpandedFallbackPlacements(placement) {
- if (getBasePlacement(placement) === auto) {
- return [];
- }
- var oppositePlacement = getOppositePlacement(placement);
- return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
- }
- function flip(_ref) {
- var state = _ref.state, options = _ref.options, name = _ref.name;
- if (state.modifiersData[name]._skip) {
- return;
- }
- var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
- var preferredPlacement = state.options.placement;
- var basePlacement = getBasePlacement(preferredPlacement);
- var isBasePlacement = basePlacement === preferredPlacement;
- var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
- var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
- return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
- placement: placement2,
- boundary,
- rootBoundary,
- padding,
- flipVariations,
- allowedAutoPlacements
- }) : placement2);
- }, []);
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var checksMap = /* @__PURE__ */ new Map();
- var makeFallbackChecks = true;
- var firstFittingPlacement = placements2[0];
- for (var i = 0; i < placements2.length; i++) {
- var placement = placements2[i];
- var _basePlacement = getBasePlacement(placement);
- var isStartVariation = getVariation(placement) === start;
- var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
- var len = isVertical ? "width" : "height";
- var overflow = detectOverflow(state, {
- placement,
- boundary,
- rootBoundary,
- altBoundary,
- padding
- });
- var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
- if (referenceRect[len] > popperRect[len]) {
- mainVariationSide = getOppositePlacement(mainVariationSide);
- }
- var altVariationSide = getOppositePlacement(mainVariationSide);
- var checks = [];
- if (checkMainAxis) {
- checks.push(overflow[_basePlacement] <= 0);
- }
- if (checkAltAxis) {
- checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
- }
- if (checks.every(function(check) {
- return check;
- })) {
- firstFittingPlacement = placement;
- makeFallbackChecks = false;
- break;
- }
- checksMap.set(placement, checks);
- }
- if (makeFallbackChecks) {
- var numberOfChecks = flipVariations ? 3 : 1;
- var _loop = function _loop2(_i2) {
- var fittingPlacement = placements2.find(function(placement2) {
- var checks2 = checksMap.get(placement2);
- if (checks2) {
- return checks2.slice(0, _i2).every(function(check) {
- return check;
- });
- }
- });
- if (fittingPlacement) {
- firstFittingPlacement = fittingPlacement;
- return "break";
- }
- };
- for (var _i = numberOfChecks; _i > 0; _i--) {
- var _ret = _loop(_i);
- if (_ret === "break") break;
- }
- }
- if (state.placement !== firstFittingPlacement) {
- state.modifiersData[name]._skip = true;
- state.placement = firstFittingPlacement;
- state.reset = true;
- }
- }
- var flip_default = {
- name: "flip",
- enabled: true,
- phase: "main",
- fn: flip,
- requiresIfExists: ["offset"],
- data: {
- _skip: false
- }
- };
-
- // node_modules/@popperjs/core/lib/modifiers/hide.js
- function getSideOffsets(overflow, rect, preventedOffsets) {
- if (preventedOffsets === void 0) {
- preventedOffsets = {
- x: 0,
- y: 0
- };
- }
- return {
- top: overflow.top - rect.height - preventedOffsets.y,
- right: overflow.right - rect.width + preventedOffsets.x,
- bottom: overflow.bottom - rect.height + preventedOffsets.y,
- left: overflow.left - rect.width - preventedOffsets.x
- };
- }
- function isAnySideFullyClipped(overflow) {
- return [top, right, bottom, left].some(function(side) {
- return overflow[side] >= 0;
- });
- }
- function hide(_ref) {
- var state = _ref.state, name = _ref.name;
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var preventedOffsets = state.modifiersData.preventOverflow;
- var referenceOverflow = detectOverflow(state, {
- elementContext: "reference"
- });
- var popperAltOverflow = detectOverflow(state, {
- altBoundary: true
- });
- var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
- var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
- var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
- var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
- state.modifiersData[name] = {
- referenceClippingOffsets,
- popperEscapeOffsets,
- isReferenceHidden,
- hasPopperEscaped
- };
- state.attributes.popper = Object.assign({}, state.attributes.popper, {
- "data-popper-reference-hidden": isReferenceHidden,
- "data-popper-escaped": hasPopperEscaped
- });
- }
- var hide_default = {
- name: "hide",
- enabled: true,
- phase: "main",
- requiresIfExists: ["preventOverflow"],
- fn: hide
- };
-
- // node_modules/@popperjs/core/lib/modifiers/offset.js
- function distanceAndSkiddingToXY(placement, rects, offset2) {
- var basePlacement = getBasePlacement(placement);
- var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
- var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
- placement
- })) : offset2, skidding = _ref[0], distance = _ref[1];
- skidding = skidding || 0;
- distance = (distance || 0) * invertDistance;
- return [left, right].indexOf(basePlacement) >= 0 ? {
- x: distance,
- y: skidding
- } : {
- x: skidding,
- y: distance
- };
- }
- function offset(_ref2) {
- var state = _ref2.state, options = _ref2.options, name = _ref2.name;
- var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
- var data = placements.reduce(function(acc, placement) {
- acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
- return acc;
- }, {});
- var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
- if (state.modifiersData.popperOffsets != null) {
- state.modifiersData.popperOffsets.x += x;
- state.modifiersData.popperOffsets.y += y;
- }
- state.modifiersData[name] = data;
- }
- var offset_default = {
- name: "offset",
- enabled: true,
- phase: "main",
- requires: ["popperOffsets"],
- fn: offset
- };
-
- // node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
- function popperOffsets(_ref) {
- var state = _ref.state, name = _ref.name;
- state.modifiersData[name] = computeOffsets({
- reference: state.rects.reference,
- element: state.rects.popper,
- strategy: "absolute",
- placement: state.placement
- });
- }
- var popperOffsets_default = {
- name: "popperOffsets",
- enabled: true,
- phase: "read",
- fn: popperOffsets,
- data: {}
- };
-
- // node_modules/@popperjs/core/lib/utils/getAltAxis.js
- function getAltAxis(axis) {
- return axis === "x" ? "y" : "x";
- }
-
- // node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
- function preventOverflow(_ref) {
- var state = _ref.state, options = _ref.options, name = _ref.name;
- var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
- var overflow = detectOverflow(state, {
- boundary,
- rootBoundary,
- padding,
- altBoundary
- });
- var basePlacement = getBasePlacement(state.placement);
- var variation = getVariation(state.placement);
- var isBasePlacement = !variation;
- var mainAxis = getMainAxisFromPlacement(basePlacement);
- var altAxis = getAltAxis(mainAxis);
- var popperOffsets2 = state.modifiersData.popperOffsets;
- var referenceRect = state.rects.reference;
- var popperRect = state.rects.popper;
- var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
- placement: state.placement
- })) : tetherOffset;
- var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
- mainAxis: tetherOffsetValue,
- altAxis: tetherOffsetValue
- } : Object.assign({
- mainAxis: 0,
- altAxis: 0
- }, tetherOffsetValue);
- var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
- var data = {
- x: 0,
- y: 0
- };
- if (!popperOffsets2) {
- return;
- }
- if (checkMainAxis) {
- var _offsetModifierState$;
- var mainSide = mainAxis === "y" ? top : left;
- var altSide = mainAxis === "y" ? bottom : right;
- var len = mainAxis === "y" ? "height" : "width";
- var offset2 = popperOffsets2[mainAxis];
- var min2 = offset2 + overflow[mainSide];
- var max2 = offset2 - overflow[altSide];
- var additive = tether ? -popperRect[len] / 2 : 0;
- var minLen = variation === start ? referenceRect[len] : popperRect[len];
- var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
- var arrowElement = state.elements.arrow;
- var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
- width: 0,
- height: 0
- };
- var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
- var arrowPaddingMin = arrowPaddingObject[mainSide];
- var arrowPaddingMax = arrowPaddingObject[altSide];
- var arrowLen = within(0, referenceRect[len], arrowRect[len]);
- var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
- var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
- var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
- var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
- var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
- var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
- var tetherMax = offset2 + maxOffset - offsetModifierValue;
- var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
- popperOffsets2[mainAxis] = preventedOffset;
- data[mainAxis] = preventedOffset - offset2;
- }
- if (checkAltAxis) {
- var _offsetModifierState$2;
- var _mainSide = mainAxis === "x" ? top : left;
- var _altSide = mainAxis === "x" ? bottom : right;
- var _offset = popperOffsets2[altAxis];
- var _len = altAxis === "y" ? "height" : "width";
- var _min = _offset + overflow[_mainSide];
- var _max = _offset - overflow[_altSide];
- var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
- var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
- var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
- var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
- var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
- popperOffsets2[altAxis] = _preventedOffset;
- data[altAxis] = _preventedOffset - _offset;
- }
- state.modifiersData[name] = data;
- }
- var preventOverflow_default = {
- name: "preventOverflow",
- enabled: true,
- phase: "main",
- fn: preventOverflow,
- requiresIfExists: ["offset"]
- };
-
- // node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
- function getHTMLElementScroll(element) {
- return {
- scrollLeft: element.scrollLeft,
- scrollTop: element.scrollTop
- };
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
- function getNodeScroll(node) {
- if (node === getWindow(node) || !isHTMLElement(node)) {
- return getWindowScroll(node);
- } else {
- return getHTMLElementScroll(node);
- }
- }
-
- // node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
- function isElementScaled(element) {
- var rect = element.getBoundingClientRect();
- var scaleX = round(rect.width) / element.offsetWidth || 1;
- var scaleY = round(rect.height) / element.offsetHeight || 1;
- return scaleX !== 1 || scaleY !== 1;
- }
- function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
- if (isFixed === void 0) {
- isFixed = false;
- }
- var isOffsetParentAnElement = isHTMLElement(offsetParent);
- var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
- var documentElement = getDocumentElement(offsetParent);
- var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
- var scroll = {
- scrollLeft: 0,
- scrollTop: 0
- };
- var offsets = {
- x: 0,
- y: 0
- };
- if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
- if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078
- isScrollParent(documentElement)) {
- scroll = getNodeScroll(offsetParent);
- }
- if (isHTMLElement(offsetParent)) {
- offsets = getBoundingClientRect(offsetParent, true);
- offsets.x += offsetParent.clientLeft;
- offsets.y += offsetParent.clientTop;
- } else if (documentElement) {
- offsets.x = getWindowScrollBarX(documentElement);
- }
- }
- return {
- x: rect.left + scroll.scrollLeft - offsets.x,
- y: rect.top + scroll.scrollTop - offsets.y,
- width: rect.width,
- height: rect.height
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/orderModifiers.js
- function order(modifiers) {
- var map = /* @__PURE__ */ new Map();
- var visited = /* @__PURE__ */ new Set();
- var result = [];
- modifiers.forEach(function(modifier) {
- map.set(modifier.name, modifier);
- });
- function sort(modifier) {
- visited.add(modifier.name);
- var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
- requires.forEach(function(dep) {
- if (!visited.has(dep)) {
- var depModifier = map.get(dep);
- if (depModifier) {
- sort(depModifier);
- }
- }
- });
- result.push(modifier);
- }
- modifiers.forEach(function(modifier) {
- if (!visited.has(modifier.name)) {
- sort(modifier);
- }
- });
- return result;
- }
- function orderModifiers(modifiers) {
- var orderedModifiers = order(modifiers);
- return modifierPhases.reduce(function(acc, phase) {
- return acc.concat(orderedModifiers.filter(function(modifier) {
- return modifier.phase === phase;
- }));
- }, []);
- }
-
- // node_modules/@popperjs/core/lib/utils/debounce.js
- function debounce(fn2) {
- var pending;
- return function() {
- if (!pending) {
- pending = new Promise(function(resolve) {
- Promise.resolve().then(function() {
- pending = void 0;
- resolve(fn2());
- });
- });
- }
- return pending;
- };
- }
-
- // node_modules/@popperjs/core/lib/utils/mergeByName.js
- function mergeByName(modifiers) {
- var merged = modifiers.reduce(function(merged2, current) {
- var existing = merged2[current.name];
- merged2[current.name] = existing ? Object.assign({}, existing, current, {
- options: Object.assign({}, existing.options, current.options),
- data: Object.assign({}, existing.data, current.data)
- }) : current;
- return merged2;
- }, {});
- return Object.keys(merged).map(function(key) {
- return merged[key];
- });
- }
-
- // node_modules/@popperjs/core/lib/createPopper.js
- var DEFAULT_OPTIONS = {
- placement: "bottom",
- modifiers: [],
- strategy: "absolute"
- };
- function areValidElements() {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- return !args.some(function(element) {
- return !(element && typeof element.getBoundingClientRect === "function");
- });
- }
- function popperGenerator(generatorOptions) {
- if (generatorOptions === void 0) {
- generatorOptions = {};
- }
- var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
- return function createPopper4(reference2, popper2, options) {
- if (options === void 0) {
- options = defaultOptions;
- }
- var state = {
- placement: "bottom",
- orderedModifiers: [],
- options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
- modifiersData: {},
- elements: {
- reference: reference2,
- popper: popper2
- },
- attributes: {},
- styles: {}
- };
- var effectCleanupFns = [];
- var isDestroyed = false;
- var instance = {
- state,
- setOptions: function setOptions(setOptionsAction) {
- var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
- cleanupModifierEffects();
- state.options = Object.assign({}, defaultOptions, state.options, options2);
- state.scrollParents = {
- reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
- popper: listScrollParents(popper2)
- };
- var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers)));
- state.orderedModifiers = orderedModifiers.filter(function(m) {
- return m.enabled;
- });
- runModifierEffects();
- return instance.update();
- },
- // Sync update – it will always be executed, even if not necessary. This
- // is useful for low frequency updates where sync behavior simplifies the
- // logic.
- // For high frequency updates (e.g. `resize` and `scroll` events), always
- // prefer the async Popper#update method
- forceUpdate: function forceUpdate() {
- if (isDestroyed) {
- return;
- }
- var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
- if (!areValidElements(reference3, popper3)) {
- return;
- }
- state.rects = {
- reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
- popper: getLayoutRect(popper3)
- };
- state.reset = false;
- state.placement = state.options.placement;
- state.orderedModifiers.forEach(function(modifier) {
- return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
- });
- for (var index = 0; index < state.orderedModifiers.length; index++) {
- if (state.reset === true) {
- state.reset = false;
- index = -1;
- continue;
- }
- var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
- if (typeof fn2 === "function") {
- state = fn2({
- state,
- options: _options,
- name,
- instance
- }) || state;
- }
- }
- },
- // Async and optimistically optimized update – it will not be executed if
- // not necessary (debounced to run at most once-per-tick)
- update: debounce(function() {
- return new Promise(function(resolve) {
- instance.forceUpdate();
- resolve(state);
- });
- }),
- destroy: function destroy() {
- cleanupModifierEffects();
- isDestroyed = true;
- }
- };
- if (!areValidElements(reference2, popper2)) {
- return instance;
- }
- instance.setOptions(options).then(function(state2) {
- if (!isDestroyed && options.onFirstUpdate) {
- options.onFirstUpdate(state2);
- }
- });
- function runModifierEffects() {
- state.orderedModifiers.forEach(function(_ref) {
- var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect;
- if (typeof effect4 === "function") {
- var cleanupFn = effect4({
- state,
- name,
- instance,
- options: options2
- });
- var noopFn = function noopFn2() {
- };
- effectCleanupFns.push(cleanupFn || noopFn);
- }
- });
- }
- function cleanupModifierEffects() {
- effectCleanupFns.forEach(function(fn2) {
- return fn2();
- });
- effectCleanupFns = [];
- }
- return instance;
- };
- }
- var createPopper = /* @__PURE__ */ popperGenerator();
-
- // node_modules/@popperjs/core/lib/popper-lite.js
- var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default];
- var createPopper2 = /* @__PURE__ */ popperGenerator({
- defaultModifiers
- });
-
- // node_modules/@popperjs/core/lib/popper.js
- var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
- var createPopper3 = /* @__PURE__ */ popperGenerator({
- defaultModifiers: defaultModifiers2
- });
-
- // node_modules/bootstrap/dist/js/bootstrap.esm.js
- var elementMap = /* @__PURE__ */ new Map();
- var Data = {
- set(element, key, instance) {
- if (!elementMap.has(element)) {
- elementMap.set(element, /* @__PURE__ */ new Map());
- }
- const instanceMap = elementMap.get(element);
- if (!instanceMap.has(key) && instanceMap.size !== 0) {
- console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
- return;
- }
- instanceMap.set(key, instance);
- },
- get(element, key) {
- if (elementMap.has(element)) {
- return elementMap.get(element).get(key) || null;
- }
- return null;
- },
- remove(element, key) {
- if (!elementMap.has(element)) {
- return;
- }
- const instanceMap = elementMap.get(element);
- instanceMap.delete(key);
- if (instanceMap.size === 0) {
- elementMap.delete(element);
- }
- }
- };
- var MAX_UID = 1e6;
- var MILLISECONDS_MULTIPLIER = 1e3;
- var TRANSITION_END = "transitionend";
- var parseSelector = (selector) => {
- if (selector && window.CSS && window.CSS.escape) {
- selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
- }
- return selector;
- };
- var toType = (object) => {
- if (object === null || object === void 0) {
- return `${object}`;
- }
- return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
- };
- var getUID = (prefix) => {
- do {
- prefix += Math.floor(Math.random() * MAX_UID);
- } while (document.getElementById(prefix));
- return prefix;
- };
- var getTransitionDurationFromElement = (element) => {
- if (!element) {
- return 0;
- }
- let {
- transitionDuration,
- transitionDelay
- } = window.getComputedStyle(element);
- const floatTransitionDuration = Number.parseFloat(transitionDuration);
- const floatTransitionDelay = Number.parseFloat(transitionDelay);
- if (!floatTransitionDuration && !floatTransitionDelay) {
- return 0;
- }
- transitionDuration = transitionDuration.split(",")[0];
- transitionDelay = transitionDelay.split(",")[0];
- return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
- };
- var triggerTransitionEnd = (element) => {
- element.dispatchEvent(new Event(TRANSITION_END));
- };
- var isElement2 = (object) => {
- if (!object || typeof object !== "object") {
- return false;
- }
- if (typeof object.jquery !== "undefined") {
- object = object[0];
- }
- return typeof object.nodeType !== "undefined";
- };
- var getElement = (object) => {
- if (isElement2(object)) {
- return object.jquery ? object[0] : object;
- }
- if (typeof object === "string" && object.length > 0) {
- return document.querySelector(parseSelector(object));
- }
- return null;
- };
- var isVisible = (element) => {
- if (!isElement2(element) || element.getClientRects().length === 0) {
- return false;
- }
- const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible";
- const closedDetails = element.closest("details:not([open])");
- if (!closedDetails) {
- return elementIsVisible;
- }
- if (closedDetails !== element) {
- const summary = element.closest("summary");
- if (summary && summary.parentNode !== closedDetails) {
- return false;
- }
- if (summary === null) {
- return false;
- }
- }
- return elementIsVisible;
- };
- var isDisabled = (element) => {
- if (!element || element.nodeType !== Node.ELEMENT_NODE) {
- return true;
- }
- if (element.classList.contains("disabled")) {
- return true;
- }
- if (typeof element.disabled !== "undefined") {
- return element.disabled;
- }
- return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false";
- };
- var findShadowRoot = (element) => {
- if (!document.documentElement.attachShadow) {
- return null;
- }
- if (typeof element.getRootNode === "function") {
- const root = element.getRootNode();
- return root instanceof ShadowRoot ? root : null;
- }
- if (element instanceof ShadowRoot) {
- return element;
- }
- if (!element.parentNode) {
- return null;
- }
- return findShadowRoot(element.parentNode);
- };
- var noop = () => {
- };
- var reflow = (element) => {
- element.offsetHeight;
- };
- var getjQuery = () => {
- if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) {
- return window.jQuery;
- }
- return null;
- };
- var DOMContentLoadedCallbacks = [];
- var onDOMContentLoaded = (callback) => {
- if (document.readyState === "loading") {
- if (!DOMContentLoadedCallbacks.length) {
- document.addEventListener("DOMContentLoaded", () => {
- for (const callback2 of DOMContentLoadedCallbacks) {
- callback2();
- }
- });
- }
- DOMContentLoadedCallbacks.push(callback);
- } else {
- callback();
- }
- };
- var isRTL = () => document.documentElement.dir === "rtl";
- var defineJQueryPlugin = (plugin) => {
- onDOMContentLoaded(() => {
- const $ = getjQuery();
- if ($) {
- const name = plugin.NAME;
- const JQUERY_NO_CONFLICT = $.fn[name];
- $.fn[name] = plugin.jQueryInterface;
- $.fn[name].Constructor = plugin;
- $.fn[name].noConflict = () => {
- $.fn[name] = JQUERY_NO_CONFLICT;
- return plugin.jQueryInterface;
- };
- }
- });
- };
- var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
- return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue;
- };
- var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
- if (!waitForTransition) {
- execute(callback);
- return;
- }
- const durationPadding = 5;
- const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
- let called = false;
- const handler = ({
- target
- }) => {
- if (target !== transitionElement) {
- return;
- }
- called = true;
- transitionElement.removeEventListener(TRANSITION_END, handler);
- execute(callback);
- };
- transitionElement.addEventListener(TRANSITION_END, handler);
- setTimeout(() => {
- if (!called) {
- triggerTransitionEnd(transitionElement);
- }
- }, emulatedDuration);
- };
- var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
- const listLength = list.length;
- let index = list.indexOf(activeElement);
- if (index === -1) {
- return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
- }
- index += shouldGetNext ? 1 : -1;
- if (isCycleAllowed) {
- index = (index + listLength) % listLength;
- }
- return list[Math.max(0, Math.min(index, listLength - 1))];
- };
- var namespaceRegex = /[^.]*(?=\..*)\.|.*/;
- var stripNameRegex = /\..*/;
- var stripUidRegex = /::\d+$/;
- var eventRegistry = {};
- var uidEvent = 1;
- var customEvents = {
- mouseenter: "mouseover",
- mouseleave: "mouseout"
- };
- var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
- function makeEventUid(element, uid) {
- return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
- }
- function getElementEvents(element) {
- const uid = makeEventUid(element);
- element.uidEvent = uid;
- eventRegistry[uid] = eventRegistry[uid] || {};
- return eventRegistry[uid];
- }
- function bootstrapHandler(element, fn2) {
- return function handler(event) {
- hydrateObj(event, {
- delegateTarget: element
- });
- if (handler.oneOff) {
- EventHandler.off(element, event.type, fn2);
- }
- return fn2.apply(element, [event]);
- };
- }
- function bootstrapDelegationHandler(element, selector, fn2) {
- return function handler(event) {
- const domElements = element.querySelectorAll(selector);
- for (let {
- target
- } = event; target && target !== this; target = target.parentNode) {
- for (const domElement of domElements) {
- if (domElement !== target) {
- continue;
- }
- hydrateObj(event, {
- delegateTarget: target
- });
- if (handler.oneOff) {
- EventHandler.off(element, event.type, selector, fn2);
- }
- return fn2.apply(target, [event]);
- }
- }
- };
- }
- function findHandler(events, callable, delegationSelector = null) {
- return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector);
- }
- function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
- const isDelegated = typeof handler === "string";
- const callable = isDelegated ? delegationFunction : handler || delegationFunction;
- let typeEvent = getTypeEvent(originalTypeEvent);
- if (!nativeEvents.has(typeEvent)) {
- typeEvent = originalTypeEvent;
- }
- return [isDelegated, callable, typeEvent];
- }
- function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
- if (typeof originalTypeEvent !== "string" || !element) {
- return;
- }
- let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
- if (originalTypeEvent in customEvents) {
- const wrapFunction = (fn3) => {
- return function(event) {
- if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
- return fn3.call(this, event);
- }
- };
- };
- callable = wrapFunction(callable);
- }
- const events = getElementEvents(element);
- const handlers = events[typeEvent] || (events[typeEvent] = {});
- const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
- if (previousFunction) {
- previousFunction.oneOff = previousFunction.oneOff && oneOff;
- return;
- }
- const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ""));
- const fn2 = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
- fn2.delegationSelector = isDelegated ? handler : null;
- fn2.callable = callable;
- fn2.oneOff = oneOff;
- fn2.uidEvent = uid;
- handlers[uid] = fn2;
- element.addEventListener(typeEvent, fn2, isDelegated);
- }
- function removeHandler(element, events, typeEvent, handler, delegationSelector) {
- const fn2 = findHandler(events[typeEvent], handler, delegationSelector);
- if (!fn2) {
- return;
- }
- element.removeEventListener(typeEvent, fn2, Boolean(delegationSelector));
- delete events[typeEvent][fn2.uidEvent];
- }
- function removeNamespacedHandlers(element, events, typeEvent, namespace) {
- const storeElementEvent = events[typeEvent] || {};
- for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
- if (handlerKey.includes(namespace)) {
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
- }
- }
- }
- function getTypeEvent(event) {
- event = event.replace(stripNameRegex, "");
- return customEvents[event] || event;
- }
- var EventHandler = {
- on(element, event, handler, delegationFunction) {
- addHandler(element, event, handler, delegationFunction, false);
- },
- one(element, event, handler, delegationFunction) {
- addHandler(element, event, handler, delegationFunction, true);
- },
- off(element, originalTypeEvent, handler, delegationFunction) {
- if (typeof originalTypeEvent !== "string" || !element) {
- return;
- }
- const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
- const inNamespace = typeEvent !== originalTypeEvent;
- const events = getElementEvents(element);
- const storeElementEvent = events[typeEvent] || {};
- const isNamespace = originalTypeEvent.startsWith(".");
- if (typeof callable !== "undefined") {
- if (!Object.keys(storeElementEvent).length) {
- return;
- }
- removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
- return;
- }
- if (isNamespace) {
- for (const elementEvent of Object.keys(events)) {
- removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
- }
- }
- for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
- const handlerKey = keyHandlers.replace(stripUidRegex, "");
- if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
- }
- }
- },
- trigger(element, event, args) {
- if (typeof event !== "string" || !element) {
- return null;
- }
- const $ = getjQuery();
- const typeEvent = getTypeEvent(event);
- const inNamespace = event !== typeEvent;
- let jQueryEvent = null;
- let bubbles = true;
- let nativeDispatch = true;
- let defaultPrevented = false;
- if (inNamespace && $) {
- jQueryEvent = $.Event(event, args);
- $(element).trigger(jQueryEvent);
- bubbles = !jQueryEvent.isPropagationStopped();
- nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
- defaultPrevented = jQueryEvent.isDefaultPrevented();
- }
- const evt = hydrateObj(new Event(event, {
- bubbles,
- cancelable: true
- }), args);
- if (defaultPrevented) {
- evt.preventDefault();
- }
- if (nativeDispatch) {
- element.dispatchEvent(evt);
- }
- if (evt.defaultPrevented && jQueryEvent) {
- jQueryEvent.preventDefault();
- }
- return evt;
- }
- };
- function hydrateObj(obj, meta = {}) {
- for (const [key, value] of Object.entries(meta)) {
- try {
- obj[key] = value;
- } catch (_unused) {
- Object.defineProperty(obj, key, {
- configurable: true,
- get() {
- return value;
- }
- });
- }
- }
- return obj;
- }
- function normalizeData(value) {
- if (value === "true") {
- return true;
- }
- if (value === "false") {
- return false;
- }
- if (value === Number(value).toString()) {
- return Number(value);
- }
- if (value === "" || value === "null") {
- return null;
- }
- if (typeof value !== "string") {
- return value;
- }
- try {
- return JSON.parse(decodeURIComponent(value));
- } catch (_unused) {
- return value;
- }
- }
- function normalizeDataKey(key) {
- return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
- }
- var Manipulator = {
- setDataAttribute(element, key, value) {
- element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
- },
- removeDataAttribute(element, key) {
- element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
- },
- getDataAttributes(element) {
- if (!element) {
- return {};
- }
- const attributes = {};
- const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig"));
- for (const key of bsKeys) {
- let pureKey = key.replace(/^bs/, "");
- pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
- attributes[pureKey] = normalizeData(element.dataset[key]);
- }
- return attributes;
- },
- getDataAttribute(element, key) {
- return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
- }
- };
- var Config = class {
- // Getters
- static get Default() {
- return {};
- }
- static get DefaultType() {
- return {};
- }
- static get NAME() {
- throw new Error('You have to implement the static method "NAME", for each component!');
- }
- _getConfig(config) {
- config = this._mergeConfigObj(config);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- _configAfterMerge(config) {
- return config;
- }
- _mergeConfigObj(config, element) {
- const jsonConfig = isElement2(element) ? Manipulator.getDataAttribute(element, "config") : {};
- return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), typeof jsonConfig === "object" ? jsonConfig : {}), isElement2(element) ? Manipulator.getDataAttributes(element) : {}), typeof config === "object" ? config : {});
- }
- _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
- for (const [property, expectedTypes] of Object.entries(configTypes)) {
- const value = config[property];
- const valueType = isElement2(value) ? "element" : toType(value);
- if (!new RegExp(expectedTypes).test(valueType)) {
- throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
- }
- }
- }
- };
- var VERSION = "5.3.3";
- var BaseComponent = class extends Config {
- constructor(element, config) {
- super();
- element = getElement(element);
- if (!element) {
- return;
- }
- this._element = element;
- this._config = this._getConfig(config);
- Data.set(this._element, this.constructor.DATA_KEY, this);
- }
- // Public
- dispose() {
- Data.remove(this._element, this.constructor.DATA_KEY);
- EventHandler.off(this._element, this.constructor.EVENT_KEY);
- for (const propertyName of Object.getOwnPropertyNames(this)) {
- this[propertyName] = null;
- }
- }
- _queueCallback(callback, element, isAnimated = true) {
- executeAfterTransition(callback, element, isAnimated);
- }
- _getConfig(config) {
- config = this._mergeConfigObj(config, this._element);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- // Static
- static getInstance(element) {
- return Data.get(getElement(element), this.DATA_KEY);
- }
- static getOrCreateInstance(element, config = {}) {
- return this.getInstance(element) || new this(element, typeof config === "object" ? config : null);
- }
- static get VERSION() {
- return VERSION;
- }
- static get DATA_KEY() {
- return `bs.${this.NAME}`;
- }
- static get EVENT_KEY() {
- return `.${this.DATA_KEY}`;
- }
- static eventName(name) {
- return `${name}${this.EVENT_KEY}`;
- }
- };
- var getSelector = (element) => {
- let selector = element.getAttribute("data-bs-target");
- if (!selector || selector === "#") {
- let hrefAttribute = element.getAttribute("href");
- if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) {
- return null;
- }
- if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) {
- hrefAttribute = `#${hrefAttribute.split("#")[1]}`;
- }
- selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null;
- }
- return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null;
- };
- var SelectorEngine = {
- find(selector, element = document.documentElement) {
- return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
- },
- findOne(selector, element = document.documentElement) {
- return Element.prototype.querySelector.call(element, selector);
- },
- children(element, selector) {
- return [].concat(...element.children).filter((child) => child.matches(selector));
- },
- parents(element, selector) {
- const parents = [];
- let ancestor = element.parentNode.closest(selector);
- while (ancestor) {
- parents.push(ancestor);
- ancestor = ancestor.parentNode.closest(selector);
- }
- return parents;
- },
- prev(element, selector) {
- let previous = element.previousElementSibling;
- while (previous) {
- if (previous.matches(selector)) {
- return [previous];
- }
- previous = previous.previousElementSibling;
- }
- return [];
- },
- // TODO: this is now unused; remove later along with prev()
- next(element, selector) {
- let next = element.nextElementSibling;
- while (next) {
- if (next.matches(selector)) {
- return [next];
- }
- next = next.nextElementSibling;
- }
- return [];
- },
- focusableChildren(element) {
- const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(",");
- return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el));
- },
- getSelectorFromElement(element) {
- const selector = getSelector(element);
- if (selector) {
- return SelectorEngine.findOne(selector) ? selector : null;
- }
- return null;
- },
- getElementFromSelector(element) {
- const selector = getSelector(element);
- return selector ? SelectorEngine.findOne(selector) : null;
- },
- getMultipleElementsFromSelector(element) {
- const selector = getSelector(element);
- return selector ? SelectorEngine.find(selector) : [];
- }
- };
- var enableDismissTrigger = (component, method = "hide") => {
- const clickEvent = `click.dismiss${component.EVENT_KEY}`;
- const name = component.NAME;
- EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event) {
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
- const instance = component.getOrCreateInstance(target);
- instance[method]();
- });
- };
- var NAME$f = "alert";
- var DATA_KEY$a = "bs.alert";
- var EVENT_KEY$b = `.${DATA_KEY$a}`;
- var EVENT_CLOSE = `close${EVENT_KEY$b}`;
- var EVENT_CLOSED = `closed${EVENT_KEY$b}`;
- var CLASS_NAME_FADE$5 = "fade";
- var CLASS_NAME_SHOW$8 = "show";
- var Alert = class _Alert extends BaseComponent {
- // Getters
- static get NAME() {
- return NAME$f;
- }
- // Public
- close() {
- const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
- if (closeEvent.defaultPrevented) {
- return;
- }
- this._element.classList.remove(CLASS_NAME_SHOW$8);
- const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
- this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
- }
- // Private
- _destroyElement() {
- this._element.remove();
- EventHandler.trigger(this._element, EVENT_CLOSED);
- this.dispose();
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Alert.getOrCreateInstance(this);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- });
- }
- };
- enableDismissTrigger(Alert, "close");
- defineJQueryPlugin(Alert);
- var NAME$e = "button";
- var DATA_KEY$9 = "bs.button";
- var EVENT_KEY$a = `.${DATA_KEY$9}`;
- var DATA_API_KEY$6 = ".data-api";
- var CLASS_NAME_ACTIVE$3 = "active";
- var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
- var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
- var Button = class _Button extends BaseComponent {
- // Getters
- static get NAME() {
- return NAME$e;
- }
- // Public
- toggle() {
- this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Button.getOrCreateInstance(this);
- if (config === "toggle") {
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event) => {
- event.preventDefault();
- const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
- const data = Button.getOrCreateInstance(button);
- data.toggle();
- });
- defineJQueryPlugin(Button);
- var NAME$d = "swipe";
- var EVENT_KEY$9 = ".bs.swipe";
- var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
- var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
- var EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
- var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
- var EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
- var POINTER_TYPE_TOUCH = "touch";
- var POINTER_TYPE_PEN = "pen";
- var CLASS_NAME_POINTER_EVENT = "pointer-event";
- var SWIPE_THRESHOLD = 40;
- var Default$c = {
- endCallback: null,
- leftCallback: null,
- rightCallback: null
- };
- var DefaultType$c = {
- endCallback: "(function|null)",
- leftCallback: "(function|null)",
- rightCallback: "(function|null)"
- };
- var Swipe = class _Swipe extends Config {
- constructor(element, config) {
- super();
- this._element = element;
- if (!element || !_Swipe.isSupported()) {
- return;
- }
- this._config = this._getConfig(config);
- this._deltaX = 0;
- this._supportPointerEvents = Boolean(window.PointerEvent);
- this._initEvents();
- }
- // Getters
- static get Default() {
- return Default$c;
- }
- static get DefaultType() {
- return DefaultType$c;
- }
- static get NAME() {
- return NAME$d;
- }
- // Public
- dispose() {
- EventHandler.off(this._element, EVENT_KEY$9);
- }
- // Private
- _start(event) {
- if (!this._supportPointerEvents) {
- this._deltaX = event.touches[0].clientX;
- return;
- }
- if (this._eventIsPointerPenTouch(event)) {
- this._deltaX = event.clientX;
- }
- }
- _end(event) {
- if (this._eventIsPointerPenTouch(event)) {
- this._deltaX = event.clientX - this._deltaX;
- }
- this._handleSwipe();
- execute(this._config.endCallback);
- }
- _move(event) {
- this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
- }
- _handleSwipe() {
- const absDeltaX = Math.abs(this._deltaX);
- if (absDeltaX <= SWIPE_THRESHOLD) {
- return;
- }
- const direction = absDeltaX / this._deltaX;
- this._deltaX = 0;
- if (!direction) {
- return;
- }
- execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
- }
- _initEvents() {
- if (this._supportPointerEvents) {
- EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => this._start(event));
- EventHandler.on(this._element, EVENT_POINTERUP, (event) => this._end(event));
- this._element.classList.add(CLASS_NAME_POINTER_EVENT);
- } else {
- EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => this._start(event));
- EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => this._move(event));
- EventHandler.on(this._element, EVENT_TOUCHEND, (event) => this._end(event));
- }
- }
- _eventIsPointerPenTouch(event) {
- return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
- }
- // Static
- static isSupported() {
- return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
- }
- };
- var NAME$c = "carousel";
- var DATA_KEY$8 = "bs.carousel";
- var EVENT_KEY$8 = `.${DATA_KEY$8}`;
- var DATA_API_KEY$5 = ".data-api";
- var ARROW_LEFT_KEY$1 = "ArrowLeft";
- var ARROW_RIGHT_KEY$1 = "ArrowRight";
- var TOUCHEVENT_COMPAT_WAIT = 500;
- var ORDER_NEXT = "next";
- var ORDER_PREV = "prev";
- var DIRECTION_LEFT = "left";
- var DIRECTION_RIGHT = "right";
- var EVENT_SLIDE = `slide${EVENT_KEY$8}`;
- var EVENT_SLID = `slid${EVENT_KEY$8}`;
- var EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
- var EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
- var EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
- var EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
- var EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
- var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
- var CLASS_NAME_CAROUSEL = "carousel";
- var CLASS_NAME_ACTIVE$2 = "active";
- var CLASS_NAME_SLIDE = "slide";
- var CLASS_NAME_END = "carousel-item-end";
- var CLASS_NAME_START = "carousel-item-start";
- var CLASS_NAME_NEXT = "carousel-item-next";
- var CLASS_NAME_PREV = "carousel-item-prev";
- var SELECTOR_ACTIVE = ".active";
- var SELECTOR_ITEM = ".carousel-item";
- var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
- var SELECTOR_ITEM_IMG = ".carousel-item img";
- var SELECTOR_INDICATORS = ".carousel-indicators";
- var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]";
- var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
- var KEY_TO_DIRECTION = {
- [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
- [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
- };
- var Default$b = {
- interval: 5e3,
- keyboard: true,
- pause: "hover",
- ride: false,
- touch: true,
- wrap: true
- };
- var DefaultType$b = {
- interval: "(number|boolean)",
- // TODO:v6 remove boolean support
- keyboard: "boolean",
- pause: "(string|boolean)",
- ride: "(boolean|string)",
- touch: "boolean",
- wrap: "boolean"
- };
- var Carousel = class _Carousel extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._interval = null;
- this._activeElement = null;
- this._isSliding = false;
- this.touchTimeout = null;
- this._swipeHelper = null;
- this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
- this._addEventListeners();
- if (this._config.ride === CLASS_NAME_CAROUSEL) {
- this.cycle();
- }
- }
- // Getters
- static get Default() {
- return Default$b;
- }
- static get DefaultType() {
- return DefaultType$b;
- }
- static get NAME() {
- return NAME$c;
- }
- // Public
- next() {
- this._slide(ORDER_NEXT);
- }
- nextWhenVisible() {
- if (!document.hidden && isVisible(this._element)) {
- this.next();
- }
- }
- prev() {
- this._slide(ORDER_PREV);
- }
- pause() {
- if (this._isSliding) {
- triggerTransitionEnd(this._element);
- }
- this._clearInterval();
- }
- cycle() {
- this._clearInterval();
- this._updateInterval();
- this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
- }
- _maybeEnableCycle() {
- if (!this._config.ride) {
- return;
- }
- if (this._isSliding) {
- EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
- return;
- }
- this.cycle();
- }
- to(index) {
- const items = this._getItems();
- if (index > items.length - 1 || index < 0) {
- return;
- }
- if (this._isSliding) {
- EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
- return;
- }
- const activeIndex = this._getItemIndex(this._getActive());
- if (activeIndex === index) {
- return;
- }
- const order2 = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
- this._slide(order2, items[index]);
- }
- dispose() {
- if (this._swipeHelper) {
- this._swipeHelper.dispose();
- }
- super.dispose();
- }
- // Private
- _configAfterMerge(config) {
- config.defaultInterval = config.interval;
- return config;
- }
- _addEventListeners() {
- if (this._config.keyboard) {
- EventHandler.on(this._element, EVENT_KEYDOWN$1, (event) => this._keydown(event));
- }
- if (this._config.pause === "hover") {
- EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
- EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
- }
- if (this._config.touch && Swipe.isSupported()) {
- this._addTouchEventListeners();
- }
- }
- _addTouchEventListeners() {
- for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
- EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault());
- }
- const endCallBack = () => {
- if (this._config.pause !== "hover") {
- return;
- }
- this.pause();
- if (this.touchTimeout) {
- clearTimeout(this.touchTimeout);
- }
- this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
- };
- const swipeConfig = {
- leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
- rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
- endCallback: endCallBack
- };
- this._swipeHelper = new Swipe(this._element, swipeConfig);
- }
- _keydown(event) {
- if (/input|textarea/i.test(event.target.tagName)) {
- return;
- }
- const direction = KEY_TO_DIRECTION[event.key];
- if (direction) {
- event.preventDefault();
- this._slide(this._directionToOrder(direction));
- }
- }
- _getItemIndex(element) {
- return this._getItems().indexOf(element);
- }
- _setActiveIndicatorElement(index) {
- if (!this._indicatorsElement) {
- return;
- }
- const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
- activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
- activeIndicator.removeAttribute("aria-current");
- const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
- if (newActiveIndicator) {
- newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
- newActiveIndicator.setAttribute("aria-current", "true");
- }
- }
- _updateInterval() {
- const element = this._activeElement || this._getActive();
- if (!element) {
- return;
- }
- const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10);
- this._config.interval = elementInterval || this._config.defaultInterval;
- }
- _slide(order2, element = null) {
- if (this._isSliding) {
- return;
- }
- const activeElement = this._getActive();
- const isNext = order2 === ORDER_NEXT;
- const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
- if (nextElement === activeElement) {
- return;
- }
- const nextElementIndex = this._getItemIndex(nextElement);
- const triggerEvent = (eventName) => {
- return EventHandler.trigger(this._element, eventName, {
- relatedTarget: nextElement,
- direction: this._orderToDirection(order2),
- from: this._getItemIndex(activeElement),
- to: nextElementIndex
- });
- };
- const slideEvent = triggerEvent(EVENT_SLIDE);
- if (slideEvent.defaultPrevented) {
- return;
- }
- if (!activeElement || !nextElement) {
- return;
- }
- const isCycling = Boolean(this._interval);
- this.pause();
- this._isSliding = true;
- this._setActiveIndicatorElement(nextElementIndex);
- this._activeElement = nextElement;
- const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
- const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
- nextElement.classList.add(orderClassName);
- reflow(nextElement);
- activeElement.classList.add(directionalClassName);
- nextElement.classList.add(directionalClassName);
- const completeCallBack = () => {
- nextElement.classList.remove(directionalClassName, orderClassName);
- nextElement.classList.add(CLASS_NAME_ACTIVE$2);
- activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
- this._isSliding = false;
- triggerEvent(EVENT_SLID);
- };
- this._queueCallback(completeCallBack, activeElement, this._isAnimated());
- if (isCycling) {
- this.cycle();
- }
- }
- _isAnimated() {
- return this._element.classList.contains(CLASS_NAME_SLIDE);
- }
- _getActive() {
- return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
- }
- _getItems() {
- return SelectorEngine.find(SELECTOR_ITEM, this._element);
- }
- _clearInterval() {
- if (this._interval) {
- clearInterval(this._interval);
- this._interval = null;
- }
- }
- _directionToOrder(direction) {
- if (isRTL()) {
- return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
- }
- return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
- }
- _orderToDirection(order2) {
- if (isRTL()) {
- return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
- }
- return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Carousel.getOrCreateInstance(this, config);
- if (typeof config === "number") {
- data.to(config);
- return;
- }
- if (typeof config === "string") {
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
- return;
- }
- event.preventDefault();
- const carousel = Carousel.getOrCreateInstance(target);
- const slideIndex = this.getAttribute("data-bs-slide-to");
- if (slideIndex) {
- carousel.to(slideIndex);
- carousel._maybeEnableCycle();
- return;
- }
- if (Manipulator.getDataAttribute(this, "slide") === "next") {
- carousel.next();
- carousel._maybeEnableCycle();
- return;
- }
- carousel.prev();
- carousel._maybeEnableCycle();
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
- const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
- for (const carousel of carousels) {
- Carousel.getOrCreateInstance(carousel);
- }
- });
- defineJQueryPlugin(Carousel);
- var NAME$b = "collapse";
- var DATA_KEY$7 = "bs.collapse";
- var EVENT_KEY$7 = `.${DATA_KEY$7}`;
- var DATA_API_KEY$4 = ".data-api";
- var EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
- var EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
- var EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
- var EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
- var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
- var CLASS_NAME_SHOW$7 = "show";
- var CLASS_NAME_COLLAPSE = "collapse";
- var CLASS_NAME_COLLAPSING = "collapsing";
- var CLASS_NAME_COLLAPSED = "collapsed";
- var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
- var CLASS_NAME_HORIZONTAL = "collapse-horizontal";
- var WIDTH = "width";
- var HEIGHT = "height";
- var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing";
- var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
- var Default$a = {
- parent: null,
- toggle: true
- };
- var DefaultType$a = {
- parent: "(null|element)",
- toggle: "boolean"
- };
- var Collapse = class _Collapse extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._isTransitioning = false;
- this._triggerArray = [];
- const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
- for (const elem of toggleList) {
- const selector = SelectorEngine.getSelectorFromElement(elem);
- const filterElement = SelectorEngine.find(selector).filter((foundElement) => foundElement === this._element);
- if (selector !== null && filterElement.length) {
- this._triggerArray.push(elem);
- }
- }
- this._initializeChildren();
- if (!this._config.parent) {
- this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
- }
- if (this._config.toggle) {
- this.toggle();
- }
- }
- // Getters
- static get Default() {
- return Default$a;
- }
- static get DefaultType() {
- return DefaultType$a;
- }
- static get NAME() {
- return NAME$b;
- }
- // Public
- toggle() {
- if (this._isShown()) {
- this.hide();
- } else {
- this.show();
- }
- }
- show() {
- if (this._isTransitioning || this._isShown()) {
- return;
- }
- let activeChildren = [];
- if (this._config.parent) {
- activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => _Collapse.getOrCreateInstance(element, {
- toggle: false
- }));
- }
- if (activeChildren.length && activeChildren[0]._isTransitioning) {
- return;
- }
- const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
- if (startEvent.defaultPrevented) {
- return;
- }
- for (const activeInstance of activeChildren) {
- activeInstance.hide();
- }
- const dimension = this._getDimension();
- this._element.classList.remove(CLASS_NAME_COLLAPSE);
- this._element.classList.add(CLASS_NAME_COLLAPSING);
- this._element.style[dimension] = 0;
- this._addAriaAndCollapsedClass(this._triggerArray, true);
- this._isTransitioning = true;
- const complete = () => {
- this._isTransitioning = false;
- this._element.classList.remove(CLASS_NAME_COLLAPSING);
- this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
- this._element.style[dimension] = "";
- EventHandler.trigger(this._element, EVENT_SHOWN$6);
- };
- const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
- const scrollSize = `scroll${capitalizedDimension}`;
- this._queueCallback(complete, this._element, true);
- this._element.style[dimension] = `${this._element[scrollSize]}px`;
- }
- hide() {
- if (this._isTransitioning || !this._isShown()) {
- return;
- }
- const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
- if (startEvent.defaultPrevented) {
- return;
- }
- const dimension = this._getDimension();
- this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_COLLAPSING);
- this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
- for (const trigger of this._triggerArray) {
- const element = SelectorEngine.getElementFromSelector(trigger);
- if (element && !this._isShown(element)) {
- this._addAriaAndCollapsedClass([trigger], false);
- }
- }
- this._isTransitioning = true;
- const complete = () => {
- this._isTransitioning = false;
- this._element.classList.remove(CLASS_NAME_COLLAPSING);
- this._element.classList.add(CLASS_NAME_COLLAPSE);
- EventHandler.trigger(this._element, EVENT_HIDDEN$6);
- };
- this._element.style[dimension] = "";
- this._queueCallback(complete, this._element, true);
- }
- _isShown(element = this._element) {
- return element.classList.contains(CLASS_NAME_SHOW$7);
- }
- // Private
- _configAfterMerge(config) {
- config.toggle = Boolean(config.toggle);
- config.parent = getElement(config.parent);
- return config;
- }
- _getDimension() {
- return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
- }
- _initializeChildren() {
- if (!this._config.parent) {
- return;
- }
- const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
- for (const element of children) {
- const selected = SelectorEngine.getElementFromSelector(element);
- if (selected) {
- this._addAriaAndCollapsedClass([element], this._isShown(selected));
- }
- }
- }
- _getFirstLevelChildren(selector) {
- const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
- return SelectorEngine.find(selector, this._config.parent).filter((element) => !children.includes(element));
- }
- _addAriaAndCollapsedClass(triggerArray, isOpen) {
- if (!triggerArray.length) {
- return;
- }
- for (const element of triggerArray) {
- element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
- element.setAttribute("aria-expanded", isOpen);
- }
- }
- // Static
- static jQueryInterface(config) {
- const _config = {};
- if (typeof config === "string" && /show|hide/.test(config)) {
- _config.toggle = false;
- }
- return this.each(function() {
- const data = _Collapse.getOrCreateInstance(this, _config);
- if (typeof config === "string") {
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- }
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event) {
- if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") {
- event.preventDefault();
- }
- for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
- Collapse.getOrCreateInstance(element, {
- toggle: false
- }).toggle();
- }
- });
- defineJQueryPlugin(Collapse);
- var NAME$a = "dropdown";
- var DATA_KEY$6 = "bs.dropdown";
- var EVENT_KEY$6 = `.${DATA_KEY$6}`;
- var DATA_API_KEY$3 = ".data-api";
- var ESCAPE_KEY$2 = "Escape";
- var TAB_KEY$1 = "Tab";
- var ARROW_UP_KEY$1 = "ArrowUp";
- var ARROW_DOWN_KEY$1 = "ArrowDown";
- var RIGHT_MOUSE_BUTTON = 2;
- var EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
- var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
- var EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
- var EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
- var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
- var CLASS_NAME_SHOW$6 = "show";
- var CLASS_NAME_DROPUP = "dropup";
- var CLASS_NAME_DROPEND = "dropend";
- var CLASS_NAME_DROPSTART = "dropstart";
- var CLASS_NAME_DROPUP_CENTER = "dropup-center";
- var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center";
- var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
- var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
- var SELECTOR_MENU = ".dropdown-menu";
- var SELECTOR_NAVBAR = ".navbar";
- var SELECTOR_NAVBAR_NAV = ".navbar-nav";
- var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)";
- var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start";
- var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end";
- var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start";
- var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end";
- var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start";
- var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start";
- var PLACEMENT_TOPCENTER = "top";
- var PLACEMENT_BOTTOMCENTER = "bottom";
- var Default$9 = {
- autoClose: true,
- boundary: "clippingParents",
- display: "dynamic",
- offset: [0, 2],
- popperConfig: null,
- reference: "toggle"
- };
- var DefaultType$9 = {
- autoClose: "(boolean|string)",
- boundary: "(string|element)",
- display: "string",
- offset: "(array|string|function)",
- popperConfig: "(null|object|function)",
- reference: "(string|element|object)"
- };
- var Dropdown = class _Dropdown extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._popper = null;
- this._parent = this._element.parentNode;
- this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
- this._inNavbar = this._detectNavbar();
- }
- // Getters
- static get Default() {
- return Default$9;
- }
- static get DefaultType() {
- return DefaultType$9;
- }
- static get NAME() {
- return NAME$a;
- }
- // Public
- toggle() {
- return this._isShown() ? this.hide() : this.show();
- }
- show() {
- if (isDisabled(this._element) || this._isShown()) {
- return;
- }
- const relatedTarget = {
- relatedTarget: this._element
- };
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
- if (showEvent.defaultPrevented) {
- return;
- }
- this._createPopper();
- if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.on(element, "mouseover", noop);
- }
- }
- this._element.focus();
- this._element.setAttribute("aria-expanded", true);
- this._menu.classList.add(CLASS_NAME_SHOW$6);
- this._element.classList.add(CLASS_NAME_SHOW$6);
- EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
- }
- hide() {
- if (isDisabled(this._element) || !this._isShown()) {
- return;
- }
- const relatedTarget = {
- relatedTarget: this._element
- };
- this._completeHide(relatedTarget);
- }
- dispose() {
- if (this._popper) {
- this._popper.destroy();
- }
- super.dispose();
- }
- update() {
- this._inNavbar = this._detectNavbar();
- if (this._popper) {
- this._popper.update();
- }
- }
- // Private
- _completeHide(relatedTarget) {
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
- if (hideEvent.defaultPrevented) {
- return;
- }
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.off(element, "mouseover", noop);
- }
- }
- if (this._popper) {
- this._popper.destroy();
- }
- this._menu.classList.remove(CLASS_NAME_SHOW$6);
- this._element.classList.remove(CLASS_NAME_SHOW$6);
- this._element.setAttribute("aria-expanded", "false");
- Manipulator.removeDataAttribute(this._menu, "popper");
- EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
- }
- _getConfig(config) {
- config = super._getConfig(config);
- if (typeof config.reference === "object" && !isElement2(config.reference) && typeof config.reference.getBoundingClientRect !== "function") {
- throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
- }
- return config;
- }
- _createPopper() {
- if (typeof lib_exports === "undefined") {
- throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
- }
- let referenceElement = this._element;
- if (this._config.reference === "parent") {
- referenceElement = this._parent;
- } else if (isElement2(this._config.reference)) {
- referenceElement = getElement(this._config.reference);
- } else if (typeof this._config.reference === "object") {
- referenceElement = this._config.reference;
- }
- const popperConfig = this._getPopperConfig();
- this._popper = createPopper3(referenceElement, this._menu, popperConfig);
- }
- _isShown() {
- return this._menu.classList.contains(CLASS_NAME_SHOW$6);
- }
- _getPlacement() {
- const parentDropdown = this._parent;
- if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
- return PLACEMENT_RIGHT;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
- return PLACEMENT_LEFT;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
- return PLACEMENT_TOPCENTER;
- }
- if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
- return PLACEMENT_BOTTOMCENTER;
- }
- const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end";
- if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
- return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
- }
- return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
- }
- _detectNavbar() {
- return this._element.closest(SELECTOR_NAVBAR) !== null;
- }
- _getOffset() {
- const {
- offset: offset2
- } = this._config;
- if (typeof offset2 === "string") {
- return offset2.split(",").map((value) => Number.parseInt(value, 10));
- }
- if (typeof offset2 === "function") {
- return (popperData) => offset2(popperData, this._element);
- }
- return offset2;
- }
- _getPopperConfig() {
- const defaultBsPopperConfig = {
- placement: this._getPlacement(),
- modifiers: [{
- name: "preventOverflow",
- options: {
- boundary: this._config.boundary
- }
- }, {
- name: "offset",
- options: {
- offset: this._getOffset()
- }
- }]
- };
- if (this._inNavbar || this._config.display === "static") {
- Manipulator.setDataAttribute(this._menu, "popper", "static");
- defaultBsPopperConfig.modifiers = [{
- name: "applyStyles",
- enabled: false
- }];
- }
- return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
- }
- _selectMenuItem({
- key,
- target
- }) {
- const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element));
- if (!items.length) {
- return;
- }
- getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Dropdown.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- static clearMenus(event) {
- if (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY$1) {
- return;
- }
- const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
- for (const toggle of openToggles) {
- const context = _Dropdown.getInstance(toggle);
- if (!context || context._config.autoClose === false) {
- continue;
- }
- const composedPath = event.composedPath();
- const isMenuTarget = composedPath.includes(context._menu);
- if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) {
- continue;
- }
- if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
- continue;
- }
- const relatedTarget = {
- relatedTarget: context._element
- };
- if (event.type === "click") {
- relatedTarget.clickEvent = event;
- }
- context._completeHide(relatedTarget);
- }
- }
- static dataApiKeydownHandler(event) {
- const isInput = /input|textarea/i.test(event.target.tagName);
- const isEscapeEvent = event.key === ESCAPE_KEY$2;
- const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
- if (!isUpOrDownEvent && !isEscapeEvent) {
- return;
- }
- if (isInput && !isEscapeEvent) {
- return;
- }
- event.preventDefault();
- const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
- const instance = _Dropdown.getOrCreateInstance(getToggleButton);
- if (isUpOrDownEvent) {
- event.stopPropagation();
- instance.show();
- instance._selectMenuItem(event);
- return;
- }
- if (instance._isShown()) {
- event.stopPropagation();
- instance.hide();
- getToggleButton.focus();
- }
- }
- };
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
- EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
- EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
- EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event) {
- event.preventDefault();
- Dropdown.getOrCreateInstance(this).toggle();
- });
- defineJQueryPlugin(Dropdown);
- var NAME$9 = "backdrop";
- var CLASS_NAME_FADE$4 = "fade";
- var CLASS_NAME_SHOW$5 = "show";
- var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
- var Default$8 = {
- className: "modal-backdrop",
- clickCallback: null,
- isAnimated: false,
- isVisible: true,
- // if false, we use the backdrop helper without adding any element to the dom
- rootElement: "body"
- // give the choice to place backdrop under different elements
- };
- var DefaultType$8 = {
- className: "string",
- clickCallback: "(function|null)",
- isAnimated: "boolean",
- isVisible: "boolean",
- rootElement: "(element|string)"
- };
- var Backdrop = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- this._isAppended = false;
- this._element = null;
- }
- // Getters
- static get Default() {
- return Default$8;
- }
- static get DefaultType() {
- return DefaultType$8;
- }
- static get NAME() {
- return NAME$9;
- }
- // Public
- show(callback) {
- if (!this._config.isVisible) {
- execute(callback);
- return;
- }
- this._append();
- const element = this._getElement();
- if (this._config.isAnimated) {
- reflow(element);
- }
- element.classList.add(CLASS_NAME_SHOW$5);
- this._emulateAnimation(() => {
- execute(callback);
- });
- }
- hide(callback) {
- if (!this._config.isVisible) {
- execute(callback);
- return;
- }
- this._getElement().classList.remove(CLASS_NAME_SHOW$5);
- this._emulateAnimation(() => {
- this.dispose();
- execute(callback);
- });
- }
- dispose() {
- if (!this._isAppended) {
- return;
- }
- EventHandler.off(this._element, EVENT_MOUSEDOWN);
- this._element.remove();
- this._isAppended = false;
- }
- // Private
- _getElement() {
- if (!this._element) {
- const backdrop = document.createElement("div");
- backdrop.className = this._config.className;
- if (this._config.isAnimated) {
- backdrop.classList.add(CLASS_NAME_FADE$4);
- }
- this._element = backdrop;
- }
- return this._element;
- }
- _configAfterMerge(config) {
- config.rootElement = getElement(config.rootElement);
- return config;
- }
- _append() {
- if (this._isAppended) {
- return;
- }
- const element = this._getElement();
- this._config.rootElement.append(element);
- EventHandler.on(element, EVENT_MOUSEDOWN, () => {
- execute(this._config.clickCallback);
- });
- this._isAppended = true;
- }
- _emulateAnimation(callback) {
- executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
- }
- };
- var NAME$8 = "focustrap";
- var DATA_KEY$5 = "bs.focustrap";
- var EVENT_KEY$5 = `.${DATA_KEY$5}`;
- var EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
- var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
- var TAB_KEY = "Tab";
- var TAB_NAV_FORWARD = "forward";
- var TAB_NAV_BACKWARD = "backward";
- var Default$7 = {
- autofocus: true,
- trapElement: null
- // The element to trap focus inside of
- };
- var DefaultType$7 = {
- autofocus: "boolean",
- trapElement: "element"
- };
- var FocusTrap = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- this._isActive = false;
- this._lastTabNavDirection = null;
- }
- // Getters
- static get Default() {
- return Default$7;
- }
- static get DefaultType() {
- return DefaultType$7;
- }
- static get NAME() {
- return NAME$8;
- }
- // Public
- activate() {
- if (this._isActive) {
- return;
- }
- if (this._config.autofocus) {
- this._config.trapElement.focus();
- }
- EventHandler.off(document, EVENT_KEY$5);
- EventHandler.on(document, EVENT_FOCUSIN$2, (event) => this._handleFocusin(event));
- EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
- this._isActive = true;
- }
- deactivate() {
- if (!this._isActive) {
- return;
- }
- this._isActive = false;
- EventHandler.off(document, EVENT_KEY$5);
- }
- // Private
- _handleFocusin(event) {
- const {
- trapElement
- } = this._config;
- if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
- return;
- }
- const elements = SelectorEngine.focusableChildren(trapElement);
- if (elements.length === 0) {
- trapElement.focus();
- } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
- elements[elements.length - 1].focus();
- } else {
- elements[0].focus();
- }
- }
- _handleKeydown(event) {
- if (event.key !== TAB_KEY) {
- return;
- }
- this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
- }
- };
- var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top";
- var SELECTOR_STICKY_CONTENT = ".sticky-top";
- var PROPERTY_PADDING = "padding-right";
- var PROPERTY_MARGIN = "margin-right";
- var ScrollBarHelper = class {
- constructor() {
- this._element = document.body;
- }
- // Public
- getWidth() {
- const documentWidth = document.documentElement.clientWidth;
- return Math.abs(window.innerWidth - documentWidth);
- }
- hide() {
- const width = this.getWidth();
- this._disableOverFlow();
- this._setElementAttributes(this._element, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
- this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
- this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, (calculatedValue) => calculatedValue - width);
- }
- reset() {
- this._resetElementAttributes(this._element, "overflow");
- this._resetElementAttributes(this._element, PROPERTY_PADDING);
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
- }
- isOverflowing() {
- return this.getWidth() > 0;
- }
- // Private
- _disableOverFlow() {
- this._saveInitialAttribute(this._element, "overflow");
- this._element.style.overflow = "hidden";
- }
- _setElementAttributes(selector, styleProperty, callback) {
- const scrollbarWidth = this.getWidth();
- const manipulationCallBack = (element) => {
- if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
- return;
- }
- this._saveInitialAttribute(element, styleProperty);
- const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
- element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
- };
- this._applyManipulationCallback(selector, manipulationCallBack);
- }
- _saveInitialAttribute(element, styleProperty) {
- const actualValue = element.style.getPropertyValue(styleProperty);
- if (actualValue) {
- Manipulator.setDataAttribute(element, styleProperty, actualValue);
- }
- }
- _resetElementAttributes(selector, styleProperty) {
- const manipulationCallBack = (element) => {
- const value = Manipulator.getDataAttribute(element, styleProperty);
- if (value === null) {
- element.style.removeProperty(styleProperty);
- return;
- }
- Manipulator.removeDataAttribute(element, styleProperty);
- element.style.setProperty(styleProperty, value);
- };
- this._applyManipulationCallback(selector, manipulationCallBack);
- }
- _applyManipulationCallback(selector, callBack) {
- if (isElement2(selector)) {
- callBack(selector);
- return;
- }
- for (const sel of SelectorEngine.find(selector, this._element)) {
- callBack(sel);
- }
- }
- };
- var NAME$7 = "modal";
- var DATA_KEY$4 = "bs.modal";
- var EVENT_KEY$4 = `.${DATA_KEY$4}`;
- var DATA_API_KEY$2 = ".data-api";
- var ESCAPE_KEY$1 = "Escape";
- var EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
- var EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
- var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
- var EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
- var EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
- var EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
- var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
- var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
- var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
- var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
- var CLASS_NAME_OPEN = "modal-open";
- var CLASS_NAME_FADE$3 = "fade";
- var CLASS_NAME_SHOW$4 = "show";
- var CLASS_NAME_STATIC = "modal-static";
- var OPEN_SELECTOR$1 = ".modal.show";
- var SELECTOR_DIALOG = ".modal-dialog";
- var SELECTOR_MODAL_BODY = ".modal-body";
- var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
- var Default$6 = {
- backdrop: true,
- focus: true,
- keyboard: true
- };
- var DefaultType$6 = {
- backdrop: "(boolean|string)",
- focus: "boolean",
- keyboard: "boolean"
- };
- var Modal = class _Modal extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
- this._backdrop = this._initializeBackDrop();
- this._focustrap = this._initializeFocusTrap();
- this._isShown = false;
- this._isTransitioning = false;
- this._scrollBar = new ScrollBarHelper();
- this._addEventListeners();
- }
- // Getters
- static get Default() {
- return Default$6;
- }
- static get DefaultType() {
- return DefaultType$6;
- }
- static get NAME() {
- return NAME$7;
- }
- // Public
- toggle(relatedTarget) {
- return this._isShown ? this.hide() : this.show(relatedTarget);
- }
- show(relatedTarget) {
- if (this._isShown || this._isTransitioning) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
- relatedTarget
- });
- if (showEvent.defaultPrevented) {
- return;
- }
- this._isShown = true;
- this._isTransitioning = true;
- this._scrollBar.hide();
- document.body.classList.add(CLASS_NAME_OPEN);
- this._adjustDialog();
- this._backdrop.show(() => this._showElement(relatedTarget));
- }
- hide() {
- if (!this._isShown || this._isTransitioning) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
- if (hideEvent.defaultPrevented) {
- return;
- }
- this._isShown = false;
- this._isTransitioning = true;
- this._focustrap.deactivate();
- this._element.classList.remove(CLASS_NAME_SHOW$4);
- this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
- }
- dispose() {
- EventHandler.off(window, EVENT_KEY$4);
- EventHandler.off(this._dialog, EVENT_KEY$4);
- this._backdrop.dispose();
- this._focustrap.deactivate();
- super.dispose();
- }
- handleUpdate() {
- this._adjustDialog();
- }
- // Private
- _initializeBackDrop() {
- return new Backdrop({
- isVisible: Boolean(this._config.backdrop),
- // 'static' option will be translated to true, and booleans will keep their value,
- isAnimated: this._isAnimated()
- });
- }
- _initializeFocusTrap() {
- return new FocusTrap({
- trapElement: this._element
- });
- }
- _showElement(relatedTarget) {
- if (!document.body.contains(this._element)) {
- document.body.append(this._element);
- }
- this._element.style.display = "block";
- this._element.removeAttribute("aria-hidden");
- this._element.setAttribute("aria-modal", true);
- this._element.setAttribute("role", "dialog");
- this._element.scrollTop = 0;
- const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
- if (modalBody) {
- modalBody.scrollTop = 0;
- }
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_SHOW$4);
- const transitionComplete = () => {
- if (this._config.focus) {
- this._focustrap.activate();
- }
- this._isTransitioning = false;
- EventHandler.trigger(this._element, EVENT_SHOWN$4, {
- relatedTarget
- });
- };
- this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
- }
- _addEventListeners() {
- EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event) => {
- if (event.key !== ESCAPE_KEY$1) {
- return;
- }
- if (this._config.keyboard) {
- this.hide();
- return;
- }
- this._triggerBackdropTransition();
- });
- EventHandler.on(window, EVENT_RESIZE$1, () => {
- if (this._isShown && !this._isTransitioning) {
- this._adjustDialog();
- }
- });
- EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => {
- EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => {
- if (this._element !== event.target || this._element !== event2.target) {
- return;
- }
- if (this._config.backdrop === "static") {
- this._triggerBackdropTransition();
- return;
- }
- if (this._config.backdrop) {
- this.hide();
- }
- });
- });
- }
- _hideModal() {
- this._element.style.display = "none";
- this._element.setAttribute("aria-hidden", true);
- this._element.removeAttribute("aria-modal");
- this._element.removeAttribute("role");
- this._isTransitioning = false;
- this._backdrop.hide(() => {
- document.body.classList.remove(CLASS_NAME_OPEN);
- this._resetAdjustments();
- this._scrollBar.reset();
- EventHandler.trigger(this._element, EVENT_HIDDEN$4);
- });
- }
- _isAnimated() {
- return this._element.classList.contains(CLASS_NAME_FADE$3);
- }
- _triggerBackdropTransition() {
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
- if (hideEvent.defaultPrevented) {
- return;
- }
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- const initialOverflowY = this._element.style.overflowY;
- if (initialOverflowY === "hidden" || this._element.classList.contains(CLASS_NAME_STATIC)) {
- return;
- }
- if (!isModalOverflowing) {
- this._element.style.overflowY = "hidden";
- }
- this._element.classList.add(CLASS_NAME_STATIC);
- this._queueCallback(() => {
- this._element.classList.remove(CLASS_NAME_STATIC);
- this._queueCallback(() => {
- this._element.style.overflowY = initialOverflowY;
- }, this._dialog);
- }, this._dialog);
- this._element.focus();
- }
- /**
- * The following methods are used to handle overflowing modals
- */
- _adjustDialog() {
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- const scrollbarWidth = this._scrollBar.getWidth();
- const isBodyOverflowing = scrollbarWidth > 0;
- if (isBodyOverflowing && !isModalOverflowing) {
- const property = isRTL() ? "paddingLeft" : "paddingRight";
- this._element.style[property] = `${scrollbarWidth}px`;
- }
- if (!isBodyOverflowing && isModalOverflowing) {
- const property = isRTL() ? "paddingRight" : "paddingLeft";
- this._element.style[property] = `${scrollbarWidth}px`;
- }
- }
- _resetAdjustments() {
- this._element.style.paddingLeft = "";
- this._element.style.paddingRight = "";
- }
- // Static
- static jQueryInterface(config, relatedTarget) {
- return this.each(function() {
- const data = _Modal.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](relatedTarget);
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- EventHandler.one(target, EVENT_SHOW$4, (showEvent) => {
- if (showEvent.defaultPrevented) {
- return;
- }
- EventHandler.one(target, EVENT_HIDDEN$4, () => {
- if (isVisible(this)) {
- this.focus();
- }
- });
- });
- const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
- if (alreadyOpen) {
- Modal.getInstance(alreadyOpen).hide();
- }
- const data = Modal.getOrCreateInstance(target);
- data.toggle(this);
- });
- enableDismissTrigger(Modal);
- defineJQueryPlugin(Modal);
- var NAME$6 = "offcanvas";
- var DATA_KEY$3 = "bs.offcanvas";
- var EVENT_KEY$3 = `.${DATA_KEY$3}`;
- var DATA_API_KEY$1 = ".data-api";
- var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
- var ESCAPE_KEY = "Escape";
- var CLASS_NAME_SHOW$3 = "show";
- var CLASS_NAME_SHOWING$1 = "showing";
- var CLASS_NAME_HIDING = "hiding";
- var CLASS_NAME_BACKDROP = "offcanvas-backdrop";
- var OPEN_SELECTOR = ".offcanvas.show";
- var EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
- var EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
- var EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
- var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
- var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
- var EVENT_RESIZE = `resize${EVENT_KEY$3}`;
- var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
- var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
- var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
- var Default$5 = {
- backdrop: true,
- keyboard: true,
- scroll: false
- };
- var DefaultType$5 = {
- backdrop: "(boolean|string)",
- keyboard: "boolean",
- scroll: "boolean"
- };
- var Offcanvas = class _Offcanvas extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._isShown = false;
- this._backdrop = this._initializeBackDrop();
- this._focustrap = this._initializeFocusTrap();
- this._addEventListeners();
- }
- // Getters
- static get Default() {
- return Default$5;
- }
- static get DefaultType() {
- return DefaultType$5;
- }
- static get NAME() {
- return NAME$6;
- }
- // Public
- toggle(relatedTarget) {
- return this._isShown ? this.hide() : this.show(relatedTarget);
- }
- show(relatedTarget) {
- if (this._isShown) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
- relatedTarget
- });
- if (showEvent.defaultPrevented) {
- return;
- }
- this._isShown = true;
- this._backdrop.show();
- if (!this._config.scroll) {
- new ScrollBarHelper().hide();
- }
- this._element.setAttribute("aria-modal", true);
- this._element.setAttribute("role", "dialog");
- this._element.classList.add(CLASS_NAME_SHOWING$1);
- const completeCallBack = () => {
- if (!this._config.scroll || this._config.backdrop) {
- this._focustrap.activate();
- }
- this._element.classList.add(CLASS_NAME_SHOW$3);
- this._element.classList.remove(CLASS_NAME_SHOWING$1);
- EventHandler.trigger(this._element, EVENT_SHOWN$3, {
- relatedTarget
- });
- };
- this._queueCallback(completeCallBack, this._element, true);
- }
- hide() {
- if (!this._isShown) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
- if (hideEvent.defaultPrevented) {
- return;
- }
- this._focustrap.deactivate();
- this._element.blur();
- this._isShown = false;
- this._element.classList.add(CLASS_NAME_HIDING);
- this._backdrop.hide();
- const completeCallback = () => {
- this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
- this._element.removeAttribute("aria-modal");
- this._element.removeAttribute("role");
- if (!this._config.scroll) {
- new ScrollBarHelper().reset();
- }
- EventHandler.trigger(this._element, EVENT_HIDDEN$3);
- };
- this._queueCallback(completeCallback, this._element, true);
- }
- dispose() {
- this._backdrop.dispose();
- this._focustrap.deactivate();
- super.dispose();
- }
- // Private
- _initializeBackDrop() {
- const clickCallback = () => {
- if (this._config.backdrop === "static") {
- EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
- return;
- }
- this.hide();
- };
- const isVisible2 = Boolean(this._config.backdrop);
- return new Backdrop({
- className: CLASS_NAME_BACKDROP,
- isVisible: isVisible2,
- isAnimated: true,
- rootElement: this._element.parentNode,
- clickCallback: isVisible2 ? clickCallback : null
- });
- }
- _initializeFocusTrap() {
- return new FocusTrap({
- trapElement: this._element
- });
- }
- _addEventListeners() {
- EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
- if (event.key !== ESCAPE_KEY) {
- return;
- }
- if (this._config.keyboard) {
- this.hide();
- return;
- }
- EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
- });
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Offcanvas.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event) {
- const target = SelectorEngine.getElementFromSelector(this);
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- EventHandler.one(target, EVENT_HIDDEN$3, () => {
- if (isVisible(this)) {
- this.focus();
- }
- });
- const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
- if (alreadyOpen && alreadyOpen !== target) {
- Offcanvas.getInstance(alreadyOpen).hide();
- }
- const data = Offcanvas.getOrCreateInstance(target);
- data.toggle(this);
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
- for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
- Offcanvas.getOrCreateInstance(selector).show();
- }
- });
- EventHandler.on(window, EVENT_RESIZE, () => {
- for (const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]")) {
- if (getComputedStyle(element).position !== "fixed") {
- Offcanvas.getOrCreateInstance(element).hide();
- }
- }
- });
- enableDismissTrigger(Offcanvas);
- defineJQueryPlugin(Offcanvas);
- var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
- var DefaultAllowlist = {
- // Global attributes allowed on any supplied element below.
- "*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN],
- a: ["target", "href", "title", "rel"],
- area: [],
- b: [],
- br: [],
- col: [],
- code: [],
- dd: [],
- div: [],
- dl: [],
- dt: [],
- em: [],
- hr: [],
- h1: [],
- h2: [],
- h3: [],
- h4: [],
- h5: [],
- h6: [],
- i: [],
- img: ["src", "srcset", "alt", "title", "width", "height"],
- li: [],
- ol: [],
- p: [],
- pre: [],
- s: [],
- small: [],
- span: [],
- sub: [],
- sup: [],
- strong: [],
- u: [],
- ul: []
- };
- var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]);
- var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
- var allowedAttribute = (attribute, allowedAttributeList) => {
- const attributeName = attribute.nodeName.toLowerCase();
- if (allowedAttributeList.includes(attributeName)) {
- if (uriAttributes.has(attributeName)) {
- return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
- }
- return true;
- }
- return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName));
- };
- function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
- if (!unsafeHtml.length) {
- return unsafeHtml;
- }
- if (sanitizeFunction && typeof sanitizeFunction === "function") {
- return sanitizeFunction(unsafeHtml);
- }
- const domParser = new window.DOMParser();
- const createdDocument = domParser.parseFromString(unsafeHtml, "text/html");
- const elements = [].concat(...createdDocument.body.querySelectorAll("*"));
- for (const element of elements) {
- const elementName = element.nodeName.toLowerCase();
- if (!Object.keys(allowList).includes(elementName)) {
- element.remove();
- continue;
- }
- const attributeList = [].concat(...element.attributes);
- const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []);
- for (const attribute of attributeList) {
- if (!allowedAttribute(attribute, allowedAttributes)) {
- element.removeAttribute(attribute.nodeName);
- }
- }
- }
- return createdDocument.body.innerHTML;
- }
- var NAME$5 = "TemplateFactory";
- var Default$4 = {
- allowList: DefaultAllowlist,
- content: {},
- // { selector : text , selector2 : text2 , }
- extraClass: "",
- html: false,
- sanitize: true,
- sanitizeFn: null,
- template: "
"
- };
- var DefaultType$4 = {
- allowList: "object",
- content: "object",
- extraClass: "(string|function)",
- html: "boolean",
- sanitize: "boolean",
- sanitizeFn: "(null|function)",
- template: "string"
- };
- var DefaultContentType = {
- entry: "(string|element|function|null)",
- selector: "(string|element)"
- };
- var TemplateFactory = class extends Config {
- constructor(config) {
- super();
- this._config = this._getConfig(config);
- }
- // Getters
- static get Default() {
- return Default$4;
- }
- static get DefaultType() {
- return DefaultType$4;
- }
- static get NAME() {
- return NAME$5;
- }
- // Public
- getContent() {
- return Object.values(this._config.content).map((config) => this._resolvePossibleFunction(config)).filter(Boolean);
- }
- hasContent() {
- return this.getContent().length > 0;
- }
- changeContent(content) {
- this._checkContent(content);
- this._config.content = __spreadValues(__spreadValues({}, this._config.content), content);
- return this;
- }
- toHtml() {
- const templateWrapper = document.createElement("div");
- templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
- for (const [selector, text] of Object.entries(this._config.content)) {
- this._setContent(templateWrapper, text, selector);
- }
- const template = templateWrapper.children[0];
- const extraClass = this._resolvePossibleFunction(this._config.extraClass);
- if (extraClass) {
- template.classList.add(...extraClass.split(" "));
- }
- return template;
- }
- // Private
- _typeCheckConfig(config) {
- super._typeCheckConfig(config);
- this._checkContent(config.content);
- }
- _checkContent(arg) {
- for (const [selector, content] of Object.entries(arg)) {
- super._typeCheckConfig({
- selector,
- entry: content
- }, DefaultContentType);
- }
- }
- _setContent(template, content, selector) {
- const templateElement = SelectorEngine.findOne(selector, template);
- if (!templateElement) {
- return;
- }
- content = this._resolvePossibleFunction(content);
- if (!content) {
- templateElement.remove();
- return;
- }
- if (isElement2(content)) {
- this._putElementInTemplate(getElement(content), templateElement);
- return;
- }
- if (this._config.html) {
- templateElement.innerHTML = this._maybeSanitize(content);
- return;
- }
- templateElement.textContent = content;
- }
- _maybeSanitize(arg) {
- return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
- }
- _resolvePossibleFunction(arg) {
- return execute(arg, [this]);
- }
- _putElementInTemplate(element, templateElement) {
- if (this._config.html) {
- templateElement.innerHTML = "";
- templateElement.append(element);
- return;
- }
- templateElement.textContent = element.textContent;
- }
- };
- var NAME$4 = "tooltip";
- var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]);
- var CLASS_NAME_FADE$2 = "fade";
- var CLASS_NAME_MODAL = "modal";
- var CLASS_NAME_SHOW$2 = "show";
- var SELECTOR_TOOLTIP_INNER = ".tooltip-inner";
- var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
- var EVENT_MODAL_HIDE = "hide.bs.modal";
- var TRIGGER_HOVER = "hover";
- var TRIGGER_FOCUS = "focus";
- var TRIGGER_CLICK = "click";
- var TRIGGER_MANUAL = "manual";
- var EVENT_HIDE$2 = "hide";
- var EVENT_HIDDEN$2 = "hidden";
- var EVENT_SHOW$2 = "show";
- var EVENT_SHOWN$2 = "shown";
- var EVENT_INSERTED = "inserted";
- var EVENT_CLICK$1 = "click";
- var EVENT_FOCUSIN$1 = "focusin";
- var EVENT_FOCUSOUT$1 = "focusout";
- var EVENT_MOUSEENTER = "mouseenter";
- var EVENT_MOUSELEAVE = "mouseleave";
- var AttachmentMap = {
- AUTO: "auto",
- TOP: "top",
- RIGHT: isRTL() ? "left" : "right",
- BOTTOM: "bottom",
- LEFT: isRTL() ? "right" : "left"
- };
- var Default$3 = {
- allowList: DefaultAllowlist,
- animation: true,
- boundary: "clippingParents",
- container: false,
- customClass: "",
- delay: 0,
- fallbackPlacements: ["top", "right", "bottom", "left"],
- html: false,
- offset: [0, 6],
- placement: "top",
- popperConfig: null,
- sanitize: true,
- sanitizeFn: null,
- selector: false,
- template: '',
- title: "",
- trigger: "hover focus"
- };
- var DefaultType$3 = {
- allowList: "object",
- animation: "boolean",
- boundary: "(string|element)",
- container: "(string|element|boolean)",
- customClass: "(string|function)",
- delay: "(number|object)",
- fallbackPlacements: "array",
- html: "boolean",
- offset: "(array|string|function)",
- placement: "(string|function)",
- popperConfig: "(null|object|function)",
- sanitize: "boolean",
- sanitizeFn: "(null|function)",
- selector: "(string|boolean)",
- template: "string",
- title: "(string|element|function)",
- trigger: "string"
- };
- var Tooltip = class _Tooltip extends BaseComponent {
- constructor(element, config) {
- if (typeof lib_exports === "undefined") {
- throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
- }
- super(element, config);
- this._isEnabled = true;
- this._timeout = 0;
- this._isHovered = null;
- this._activeTrigger = {};
- this._popper = null;
- this._templateFactory = null;
- this._newContent = null;
- this.tip = null;
- this._setListeners();
- if (!this._config.selector) {
- this._fixTitle();
- }
- }
- // Getters
- static get Default() {
- return Default$3;
- }
- static get DefaultType() {
- return DefaultType$3;
- }
- static get NAME() {
- return NAME$4;
- }
- // Public
- enable() {
- this._isEnabled = true;
- }
- disable() {
- this._isEnabled = false;
- }
- toggleEnabled() {
- this._isEnabled = !this._isEnabled;
- }
- toggle() {
- if (!this._isEnabled) {
- return;
- }
- this._activeTrigger.click = !this._activeTrigger.click;
- if (this._isShown()) {
- this._leave();
- return;
- }
- this._enter();
- }
- dispose() {
- clearTimeout(this._timeout);
- EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
- if (this._element.getAttribute("data-bs-original-title")) {
- this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title"));
- }
- this._disposePopper();
- super.dispose();
- }
- show() {
- if (this._element.style.display === "none") {
- throw new Error("Please use show on visible elements");
- }
- if (!(this._isWithContent() && this._isEnabled)) {
- return;
- }
- const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
- const shadowRoot = findShadowRoot(this._element);
- const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
- if (showEvent.defaultPrevented || !isInTheDom) {
- return;
- }
- this._disposePopper();
- const tip = this._getTipElement();
- this._element.setAttribute("aria-describedby", tip.getAttribute("id"));
- const {
- container
- } = this._config;
- if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
- container.append(tip);
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
- }
- this._popper = this._createPopper(tip);
- tip.classList.add(CLASS_NAME_SHOW$2);
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.on(element, "mouseover", noop);
- }
- }
- const complete = () => {
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
- if (this._isHovered === false) {
- this._leave();
- }
- this._isHovered = false;
- };
- this._queueCallback(complete, this.tip, this._isAnimated());
- }
- hide() {
- if (!this._isShown()) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
- if (hideEvent.defaultPrevented) {
- return;
- }
- const tip = this._getTipElement();
- tip.classList.remove(CLASS_NAME_SHOW$2);
- if ("ontouchstart" in document.documentElement) {
- for (const element of [].concat(...document.body.children)) {
- EventHandler.off(element, "mouseover", noop);
- }
- }
- this._activeTrigger[TRIGGER_CLICK] = false;
- this._activeTrigger[TRIGGER_FOCUS] = false;
- this._activeTrigger[TRIGGER_HOVER] = false;
- this._isHovered = null;
- const complete = () => {
- if (this._isWithActiveTrigger()) {
- return;
- }
- if (!this._isHovered) {
- this._disposePopper();
- }
- this._element.removeAttribute("aria-describedby");
- EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
- };
- this._queueCallback(complete, this.tip, this._isAnimated());
- }
- update() {
- if (this._popper) {
- this._popper.update();
- }
- }
- // Protected
- _isWithContent() {
- return Boolean(this._getTitle());
- }
- _getTipElement() {
- if (!this.tip) {
- this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
- }
- return this.tip;
- }
- _createTipElement(content) {
- const tip = this._getTemplateFactory(content).toHtml();
- if (!tip) {
- return null;
- }
- tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
- tip.classList.add(`bs-${this.constructor.NAME}-auto`);
- const tipId = getUID(this.constructor.NAME).toString();
- tip.setAttribute("id", tipId);
- if (this._isAnimated()) {
- tip.classList.add(CLASS_NAME_FADE$2);
- }
- return tip;
- }
- setContent(content) {
- this._newContent = content;
- if (this._isShown()) {
- this._disposePopper();
- this.show();
- }
- }
- _getTemplateFactory(content) {
- if (this._templateFactory) {
- this._templateFactory.changeContent(content);
- } else {
- this._templateFactory = new TemplateFactory(__spreadProps(__spreadValues({}, this._config), {
- // the `content` var has to be after `this._config`
- // to override config.content in case of popover
- content,
- extraClass: this._resolvePossibleFunction(this._config.customClass)
- }));
- }
- return this._templateFactory;
- }
- _getContentForTemplate() {
- return {
- [SELECTOR_TOOLTIP_INNER]: this._getTitle()
- };
- }
- _getTitle() {
- return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title");
- }
- // Private
- _initializeOnDelegatedTarget(event) {
- return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
- }
- _isAnimated() {
- return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
- }
- _isShown() {
- return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
- }
- _createPopper(tip) {
- const placement = execute(this._config.placement, [this, tip, this._element]);
- const attachment = AttachmentMap[placement.toUpperCase()];
- return createPopper3(this._element, tip, this._getPopperConfig(attachment));
- }
- _getOffset() {
- const {
- offset: offset2
- } = this._config;
- if (typeof offset2 === "string") {
- return offset2.split(",").map((value) => Number.parseInt(value, 10));
- }
- if (typeof offset2 === "function") {
- return (popperData) => offset2(popperData, this._element);
- }
- return offset2;
- }
- _resolvePossibleFunction(arg) {
- return execute(arg, [this._element]);
- }
- _getPopperConfig(attachment) {
- const defaultBsPopperConfig = {
- placement: attachment,
- modifiers: [{
- name: "flip",
- options: {
- fallbackPlacements: this._config.fallbackPlacements
- }
- }, {
- name: "offset",
- options: {
- offset: this._getOffset()
- }
- }, {
- name: "preventOverflow",
- options: {
- boundary: this._config.boundary
- }
- }, {
- name: "arrow",
- options: {
- element: `.${this.constructor.NAME}-arrow`
- }
- }, {
- name: "preSetPlacement",
- enabled: true,
- phase: "beforeMain",
- fn: (data) => {
- this._getTipElement().setAttribute("data-popper-placement", data.state.placement);
- }
- }]
- };
- return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
- }
- _setListeners() {
- const triggers = this._config.trigger.split(" ");
- for (const trigger of triggers) {
- if (trigger === "click") {
- EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context.toggle();
- });
- } else if (trigger !== TRIGGER_MANUAL) {
- const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
- const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
- EventHandler.on(this._element, eventIn, this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
- context._enter();
- });
- EventHandler.on(this._element, eventOut, this._config.selector, (event) => {
- const context = this._initializeOnDelegatedTarget(event);
- context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
- context._leave();
- });
- }
- }
- this._hideModalHandler = () => {
- if (this._element) {
- this.hide();
- }
- };
- EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
- }
- _fixTitle() {
- const title = this._element.getAttribute("title");
- if (!title) {
- return;
- }
- if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) {
- this._element.setAttribute("aria-label", title);
- }
- this._element.setAttribute("data-bs-original-title", title);
- this._element.removeAttribute("title");
- }
- _enter() {
- if (this._isShown() || this._isHovered) {
- this._isHovered = true;
- return;
- }
- this._isHovered = true;
- this._setTimeout(() => {
- if (this._isHovered) {
- this.show();
- }
- }, this._config.delay.show);
- }
- _leave() {
- if (this._isWithActiveTrigger()) {
- return;
- }
- this._isHovered = false;
- this._setTimeout(() => {
- if (!this._isHovered) {
- this.hide();
- }
- }, this._config.delay.hide);
- }
- _setTimeout(handler, timeout) {
- clearTimeout(this._timeout);
- this._timeout = setTimeout(handler, timeout);
- }
- _isWithActiveTrigger() {
- return Object.values(this._activeTrigger).includes(true);
- }
- _getConfig(config) {
- const dataAttributes = Manipulator.getDataAttributes(this._element);
- for (const dataAttribute of Object.keys(dataAttributes)) {
- if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
- delete dataAttributes[dataAttribute];
- }
- }
- config = __spreadValues(__spreadValues({}, dataAttributes), typeof config === "object" && config ? config : {});
- config = this._mergeConfigObj(config);
- config = this._configAfterMerge(config);
- this._typeCheckConfig(config);
- return config;
- }
- _configAfterMerge(config) {
- config.container = config.container === false ? document.body : getElement(config.container);
- if (typeof config.delay === "number") {
- config.delay = {
- show: config.delay,
- hide: config.delay
- };
- }
- if (typeof config.title === "number") {
- config.title = config.title.toString();
- }
- if (typeof config.content === "number") {
- config.content = config.content.toString();
- }
- return config;
- }
- _getDelegateConfig() {
- const config = {};
- for (const [key, value] of Object.entries(this._config)) {
- if (this.constructor.Default[key] !== value) {
- config[key] = value;
- }
- }
- config.selector = false;
- config.trigger = "manual";
- return config;
- }
- _disposePopper() {
- if (this._popper) {
- this._popper.destroy();
- this._popper = null;
- }
- if (this.tip) {
- this.tip.remove();
- this.tip = null;
- }
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Tooltip.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- defineJQueryPlugin(Tooltip);
- var NAME$3 = "popover";
- var SELECTOR_TITLE = ".popover-header";
- var SELECTOR_CONTENT = ".popover-body";
- var Default$2 = __spreadProps(__spreadValues({}, Tooltip.Default), {
- content: "",
- offset: [0, 8],
- placement: "right",
- template: '',
- trigger: "click"
- });
- var DefaultType$2 = __spreadProps(__spreadValues({}, Tooltip.DefaultType), {
- content: "(null|string|element|function)"
- });
- var Popover = class _Popover extends Tooltip {
- // Getters
- static get Default() {
- return Default$2;
- }
- static get DefaultType() {
- return DefaultType$2;
- }
- static get NAME() {
- return NAME$3;
- }
- // Overrides
- _isWithContent() {
- return this._getTitle() || this._getContent();
- }
- // Private
- _getContentForTemplate() {
- return {
- [SELECTOR_TITLE]: this._getTitle(),
- [SELECTOR_CONTENT]: this._getContent()
- };
- }
- _getContent() {
- return this._resolvePossibleFunction(this._config.content);
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Popover.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- defineJQueryPlugin(Popover);
- var NAME$2 = "scrollspy";
- var DATA_KEY$2 = "bs.scrollspy";
- var EVENT_KEY$2 = `.${DATA_KEY$2}`;
- var DATA_API_KEY = ".data-api";
- var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
- var EVENT_CLICK = `click${EVENT_KEY$2}`;
- var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
- var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item";
- var CLASS_NAME_ACTIVE$1 = "active";
- var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
- var SELECTOR_TARGET_LINKS = "[href]";
- var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group";
- var SELECTOR_NAV_LINKS = ".nav-link";
- var SELECTOR_NAV_ITEMS = ".nav-item";
- var SELECTOR_LIST_ITEMS = ".list-group-item";
- var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
- var SELECTOR_DROPDOWN = ".dropdown";
- var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle";
- var Default$1 = {
- offset: null,
- // TODO: v6 @deprecated, keep it for backwards compatibility reasons
- rootMargin: "0px 0px -25%",
- smoothScroll: false,
- target: null,
- threshold: [0.1, 0.5, 1]
- };
- var DefaultType$1 = {
- offset: "(number|null)",
- // TODO v6 @deprecated, keep it for backwards compatibility reasons
- rootMargin: "string",
- smoothScroll: "boolean",
- target: "element",
- threshold: "array"
- };
- var ScrollSpy = class _ScrollSpy extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._targetLinks = /* @__PURE__ */ new Map();
- this._observableSections = /* @__PURE__ */ new Map();
- this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element;
- this._activeTarget = null;
- this._observer = null;
- this._previousScrollData = {
- visibleEntryTop: 0,
- parentScrollTop: 0
- };
- this.refresh();
- }
- // Getters
- static get Default() {
- return Default$1;
- }
- static get DefaultType() {
- return DefaultType$1;
- }
- static get NAME() {
- return NAME$2;
- }
- // Public
- refresh() {
- this._initializeTargetsAndObservables();
- this._maybeEnableSmoothScroll();
- if (this._observer) {
- this._observer.disconnect();
- } else {
- this._observer = this._getNewObserver();
- }
- for (const section of this._observableSections.values()) {
- this._observer.observe(section);
- }
- }
- dispose() {
- this._observer.disconnect();
- super.dispose();
- }
- // Private
- _configAfterMerge(config) {
- config.target = getElement(config.target) || document.body;
- config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
- if (typeof config.threshold === "string") {
- config.threshold = config.threshold.split(",").map((value) => Number.parseFloat(value));
- }
- return config;
- }
- _maybeEnableSmoothScroll() {
- if (!this._config.smoothScroll) {
- return;
- }
- EventHandler.off(this._config.target, EVENT_CLICK);
- EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {
- const observableSection = this._observableSections.get(event.target.hash);
- if (observableSection) {
- event.preventDefault();
- const root = this._rootElement || window;
- const height = observableSection.offsetTop - this._element.offsetTop;
- if (root.scrollTo) {
- root.scrollTo({
- top: height,
- behavior: "smooth"
- });
- return;
- }
- root.scrollTop = height;
- }
- });
- }
- _getNewObserver() {
- const options = {
- root: this._rootElement,
- threshold: this._config.threshold,
- rootMargin: this._config.rootMargin
- };
- return new IntersectionObserver((entries) => this._observerCallback(entries), options);
- }
- // The logic of selection
- _observerCallback(entries) {
- const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`);
- const activate = (entry) => {
- this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
- this._process(targetElement(entry));
- };
- const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
- const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
- this._previousScrollData.parentScrollTop = parentScrollTop;
- for (const entry of entries) {
- if (!entry.isIntersecting) {
- this._activeTarget = null;
- this._clearActiveClass(targetElement(entry));
- continue;
- }
- const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
- if (userScrollsDown && entryIsLowerThanPrevious) {
- activate(entry);
- if (!parentScrollTop) {
- return;
- }
- continue;
- }
- if (!userScrollsDown && !entryIsLowerThanPrevious) {
- activate(entry);
- }
- }
- }
- _initializeTargetsAndObservables() {
- this._targetLinks = /* @__PURE__ */ new Map();
- this._observableSections = /* @__PURE__ */ new Map();
- const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
- for (const anchor of targetLinks) {
- if (!anchor.hash || isDisabled(anchor)) {
- continue;
- }
- const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
- if (isVisible(observableSection)) {
- this._targetLinks.set(decodeURI(anchor.hash), anchor);
- this._observableSections.set(anchor.hash, observableSection);
- }
- }
- }
- _process(target) {
- if (this._activeTarget === target) {
- return;
- }
- this._clearActiveClass(this._config.target);
- this._activeTarget = target;
- target.classList.add(CLASS_NAME_ACTIVE$1);
- this._activateParents(target);
- EventHandler.trigger(this._element, EVENT_ACTIVATE, {
- relatedTarget: target
- });
- }
- _activateParents(target) {
- if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
- SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
- return;
- }
- for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
- for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
- item.classList.add(CLASS_NAME_ACTIVE$1);
- }
- }
- }
- _clearActiveClass(parent) {
- parent.classList.remove(CLASS_NAME_ACTIVE$1);
- const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
- for (const node of activeNodes) {
- node.classList.remove(CLASS_NAME_ACTIVE$1);
- }
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _ScrollSpy.getOrCreateInstance(this, config);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
- for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
- ScrollSpy.getOrCreateInstance(spy);
- }
- });
- defineJQueryPlugin(ScrollSpy);
- var NAME$1 = "tab";
- var DATA_KEY$1 = "bs.tab";
- var EVENT_KEY$1 = `.${DATA_KEY$1}`;
- var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
- var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
- var EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
- var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
- var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
- var EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
- var EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
- var ARROW_LEFT_KEY = "ArrowLeft";
- var ARROW_RIGHT_KEY = "ArrowRight";
- var ARROW_UP_KEY = "ArrowUp";
- var ARROW_DOWN_KEY = "ArrowDown";
- var HOME_KEY = "Home";
- var END_KEY = "End";
- var CLASS_NAME_ACTIVE = "active";
- var CLASS_NAME_FADE$1 = "fade";
- var CLASS_NAME_SHOW$1 = "show";
- var CLASS_DROPDOWN = "dropdown";
- var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle";
- var SELECTOR_DROPDOWN_MENU = ".dropdown-menu";
- var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
- var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
- var SELECTOR_OUTER = ".nav-item, .list-group-item";
- var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
- var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
- var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
- var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
- var Tab = class _Tab extends BaseComponent {
- constructor(element) {
- super(element);
- this._parent = this._element.closest(SELECTOR_TAB_PANEL);
- if (!this._parent) {
- return;
- }
- this._setInitialAttributes(this._parent, this._getChildren());
- EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
- }
- // Getters
- static get NAME() {
- return NAME$1;
- }
- // Public
- show() {
- const innerElem = this._element;
- if (this._elemIsActive(innerElem)) {
- return;
- }
- const active = this._getActiveElem();
- const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
- relatedTarget: innerElem
- }) : null;
- const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
- relatedTarget: active
- });
- if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
- return;
- }
- this._deactivate(active, innerElem);
- this._activate(innerElem, active);
- }
- // Private
- _activate(element, relatedElem) {
- if (!element) {
- return;
- }
- element.classList.add(CLASS_NAME_ACTIVE);
- this._activate(SelectorEngine.getElementFromSelector(element));
- const complete = () => {
- if (element.getAttribute("role") !== "tab") {
- element.classList.add(CLASS_NAME_SHOW$1);
- return;
- }
- element.removeAttribute("tabindex");
- element.setAttribute("aria-selected", true);
- this._toggleDropDown(element, true);
- EventHandler.trigger(element, EVENT_SHOWN$1, {
- relatedTarget: relatedElem
- });
- };
- this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
- }
- _deactivate(element, relatedElem) {
- if (!element) {
- return;
- }
- element.classList.remove(CLASS_NAME_ACTIVE);
- element.blur();
- this._deactivate(SelectorEngine.getElementFromSelector(element));
- const complete = () => {
- if (element.getAttribute("role") !== "tab") {
- element.classList.remove(CLASS_NAME_SHOW$1);
- return;
- }
- element.setAttribute("aria-selected", false);
- element.setAttribute("tabindex", "-1");
- this._toggleDropDown(element, false);
- EventHandler.trigger(element, EVENT_HIDDEN$1, {
- relatedTarget: relatedElem
- });
- };
- this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
- }
- _keydown(event) {
- if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
- return;
- }
- event.stopPropagation();
- event.preventDefault();
- const children = this._getChildren().filter((element) => !isDisabled(element));
- let nextActiveElement;
- if ([HOME_KEY, END_KEY].includes(event.key)) {
- nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
- } else {
- const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
- nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
- }
- if (nextActiveElement) {
- nextActiveElement.focus({
- preventScroll: true
- });
- _Tab.getOrCreateInstance(nextActiveElement).show();
- }
- }
- _getChildren() {
- return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
- }
- _getActiveElem() {
- return this._getChildren().find((child) => this._elemIsActive(child)) || null;
- }
- _setInitialAttributes(parent, children) {
- this._setAttributeIfNotExists(parent, "role", "tablist");
- for (const child of children) {
- this._setInitialAttributesOnChild(child);
- }
- }
- _setInitialAttributesOnChild(child) {
- child = this._getInnerElement(child);
- const isActive = this._elemIsActive(child);
- const outerElem = this._getOuterElement(child);
- child.setAttribute("aria-selected", isActive);
- if (outerElem !== child) {
- this._setAttributeIfNotExists(outerElem, "role", "presentation");
- }
- if (!isActive) {
- child.setAttribute("tabindex", "-1");
- }
- this._setAttributeIfNotExists(child, "role", "tab");
- this._setInitialAttributesOnTargetPanel(child);
- }
- _setInitialAttributesOnTargetPanel(child) {
- const target = SelectorEngine.getElementFromSelector(child);
- if (!target) {
- return;
- }
- this._setAttributeIfNotExists(target, "role", "tabpanel");
- if (child.id) {
- this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`);
- }
- }
- _toggleDropDown(element, open) {
- const outerElem = this._getOuterElement(element);
- if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
- return;
- }
- const toggle = (selector, className) => {
- const element2 = SelectorEngine.findOne(selector, outerElem);
- if (element2) {
- element2.classList.toggle(className, open);
- }
- };
- toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
- toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
- outerElem.setAttribute("aria-expanded", open);
- }
- _setAttributeIfNotExists(element, attribute, value) {
- if (!element.hasAttribute(attribute)) {
- element.setAttribute(attribute, value);
- }
- }
- _elemIsActive(elem) {
- return elem.classList.contains(CLASS_NAME_ACTIVE);
- }
- // Try to get the inner element (usually the .nav-link)
- _getInnerElement(elem) {
- return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
- }
- // Try to get the outer element (usually the .nav-item)
- _getOuterElement(elem) {
- return elem.closest(SELECTOR_OUTER) || elem;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Tab.getOrCreateInstance(this);
- if (typeof config !== "string") {
- return;
- }
- if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config]();
- });
- }
- };
- EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) {
- if (["A", "AREA"].includes(this.tagName)) {
- event.preventDefault();
- }
- if (isDisabled(this)) {
- return;
- }
- Tab.getOrCreateInstance(this).show();
- });
- EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
- for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
- Tab.getOrCreateInstance(element);
- }
- });
- defineJQueryPlugin(Tab);
- var NAME = "toast";
- var DATA_KEY = "bs.toast";
- var EVENT_KEY = `.${DATA_KEY}`;
- var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
- var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
- var EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
- var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
- var EVENT_HIDE = `hide${EVENT_KEY}`;
- var EVENT_HIDDEN = `hidden${EVENT_KEY}`;
- var EVENT_SHOW = `show${EVENT_KEY}`;
- var EVENT_SHOWN = `shown${EVENT_KEY}`;
- var CLASS_NAME_FADE = "fade";
- var CLASS_NAME_HIDE = "hide";
- var CLASS_NAME_SHOW = "show";
- var CLASS_NAME_SHOWING = "showing";
- var DefaultType = {
- animation: "boolean",
- autohide: "boolean",
- delay: "number"
- };
- var Default = {
- animation: true,
- autohide: true,
- delay: 5e3
- };
- var Toast = class _Toast extends BaseComponent {
- constructor(element, config) {
- super(element, config);
- this._timeout = null;
- this._hasMouseInteraction = false;
- this._hasKeyboardInteraction = false;
- this._setListeners();
- }
- // Getters
- static get Default() {
- return Default;
- }
- static get DefaultType() {
- return DefaultType;
- }
- static get NAME() {
- return NAME;
- }
- // Public
- show() {
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
- if (showEvent.defaultPrevented) {
- return;
- }
- this._clearTimeout();
- if (this._config.animation) {
- this._element.classList.add(CLASS_NAME_FADE);
- }
- const complete = () => {
- this._element.classList.remove(CLASS_NAME_SHOWING);
- EventHandler.trigger(this._element, EVENT_SHOWN);
- this._maybeScheduleHide();
- };
- this._element.classList.remove(CLASS_NAME_HIDE);
- reflow(this._element);
- this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
- this._queueCallback(complete, this._element, this._config.animation);
- }
- hide() {
- if (!this.isShown()) {
- return;
- }
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
- if (hideEvent.defaultPrevented) {
- return;
- }
- const complete = () => {
- this._element.classList.add(CLASS_NAME_HIDE);
- this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
- EventHandler.trigger(this._element, EVENT_HIDDEN);
- };
- this._element.classList.add(CLASS_NAME_SHOWING);
- this._queueCallback(complete, this._element, this._config.animation);
- }
- dispose() {
- this._clearTimeout();
- if (this.isShown()) {
- this._element.classList.remove(CLASS_NAME_SHOW);
- }
- super.dispose();
- }
- isShown() {
- return this._element.classList.contains(CLASS_NAME_SHOW);
- }
- // Private
- _maybeScheduleHide() {
- if (!this._config.autohide) {
- return;
- }
- if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
- return;
- }
- this._timeout = setTimeout(() => {
- this.hide();
- }, this._config.delay);
- }
- _onInteraction(event, isInteracting) {
- switch (event.type) {
- case "mouseover":
- case "mouseout": {
- this._hasMouseInteraction = isInteracting;
- break;
- }
- case "focusin":
- case "focusout": {
- this._hasKeyboardInteraction = isInteracting;
- break;
- }
- }
- if (isInteracting) {
- this._clearTimeout();
- return;
- }
- const nextElement = event.relatedTarget;
- if (this._element === nextElement || this._element.contains(nextElement)) {
- return;
- }
- this._maybeScheduleHide();
- }
- _setListeners() {
- EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
- EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
- EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
- EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
- }
- _clearTimeout() {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- // Static
- static jQueryInterface(config) {
- return this.each(function() {
- const data = _Toast.getOrCreateInstance(this, config);
- if (typeof config === "string") {
- if (typeof data[config] === "undefined") {
- throw new TypeError(`No method named "${config}"`);
- }
- data[config](this);
- }
- });
- }
- };
- enableDismissTrigger(Toast);
- defineJQueryPlugin(Toast);
-
- //
- (() => {
- "use strict";
- const searchToggleMobile = document.getElementById("searchToggleMobile");
- const searchToggleDesktop = document.getElementById("searchToggleDesktop");
- const searchModal = document.getElementById("searchModal");
- const searchForm = document.getElementById("search-form");
- const searchInput = document.getElementById("query");
- const searchResults = document.getElementById("searchResults");
- const flexSearchModal = new Modal(searchModal, {
- focus: true
- });
- searchToggleMobile.addEventListener("click", showModalOnClick);
- searchToggleDesktop.addEventListener("click", showModalOnClick);
- function showModalOnClick() {
- flexSearchModal.toggle();
- document.querySelector(".search-no-recent").classList.remove("d-none");
- }
- document.addEventListener("keydown", onKeyDownHandler);
- function onKeyDownHandler(event) {
- if (event.ctrlKey && event.key === "k") {
- event.preventDefault();
- flexSearchModal.show();
- searchForm.reset();
- searchResults.textContent = "";
- document.querySelector(".search-no-recent").classList.remove("d-none");
- }
- if (event.key === "Escape") {
- searchForm.reset();
- searchResults.textContent = "";
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index = -1;
- }
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- }
- document.addEventListener("click", function(event) {
- var modalElement = searchModal.contains(event.target);
- if (!modalElement) {
- searchForm.reset();
- searchResults.textContent = "";
- document.querySelector(".search-no-results").classList.add("d-none");
- }
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index = -1;
- }
- });
- searchModal.addEventListener("shown.bs.modal", () => {
- searchInput.focus();
- });
- var searchResultSelected;
- var index = -1;
- document.addEventListener(
- "keydown",
- function(event) {
- var len = searchResults.getElementsByTagName("article").length - 1;
- if (event.key === "ArrowDown") {
- index++;
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- const next = searchResults.getElementsByTagName("article")[index];
- if (typeof next !== "undefined" && index <= len) {
- searchResultSelected = next;
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[0];
- }
- addClass(searchResultSelected, "selected");
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[0];
- addClass(searchResultSelected, "selected");
- }
- } else if (event.key === "ArrowUp") {
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- index--;
- const next = searchResults.getElementsByTagName("article")[index];
- if (typeof next !== "undefined" && index >= 0) {
- searchResultSelected = next;
- } else {
- index = len;
- searchResultSelected = searchResults.getElementsByTagName("article")[len];
- }
- addClass(searchResultSelected, "selected");
- } else {
- index = 0;
- searchResultSelected = searchResults.getElementsByTagName("article")[len];
- addClass(searchResultSelected, "selected");
- }
- }
- },
- false
- );
- function removeClass(el, className) {
- if (el.classList) {
- el.classList.remove(className);
- } else {
- el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " ");
- }
- searchResultSelected.querySelector("a").blur();
- }
- function addClass(el, className) {
- if (el.classList) {
- el.classList.add(className);
- } else {
- el.className += " " + className;
- }
- searchResultSelected.querySelector("a").focus();
- }
- searchResults.addEventListener(
- "mouseover",
- () => {
- if (searchResultSelected) {
- removeClass(searchResultSelected, "selected");
- }
- },
- false
- );
- })();
-})();
-/*!
- * Search modal for Bootstrap based Thulite sites
- * Copyright 2021-2024 Thulite
- * Licensed under the MIT License
- */
-/*! Bundled license information:
-
-bootstrap/dist/js/bootstrap.esm.js:
- (*!
- * Bootstrap v5.3.3 (https://getbootstrap.com/)
- * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- *)
-*/
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1saXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9kYXRhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL21hbmlwdWxhdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvY29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Jhc2UtY29tcG9uZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2FsZXJ0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2J1dHRvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3N3aXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Nhcm91c2VsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2NvbGxhcHNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Ryb3Bkb3duLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9mb2N1c3RyYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9zY3JvbGxiYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvbW9kYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvb2ZmY2FudmFzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc2FuaXRpemVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b29sdGlwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3BvcG92ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3RhYi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b2FzdC5qcyIsICI8c3RkaW4+Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdywgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckJhc2UgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tIFwiLi9wb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IiwgImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9OyIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwgImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCAiZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VUFTdHJpbmcoKSB7XG4gIHZhciB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcblxuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLmJyYW5kcyAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5icmFuZCArIFwiL1wiICsgaXRlbS52ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufSIsICJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsICJpbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSwgaXNGaXhlZFN0cmF0ZWd5KSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRml4ZWRTdHJhdGVneSA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZFN0cmF0ZWd5ID0gZmFsc2U7XG4gIH1cblxuICB2YXIgY2xpZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSAxO1xuICB2YXIgc2NhbGVZID0gMTtcblxuICBpZiAoaW5jbHVkZVNjYWxlICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBzY2FsZVggPSBlbGVtZW50Lm9mZnNldFdpZHRoID4gMCA/IHJvdW5kKGNsaWVudFJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxIDogMTtcbiAgICBzY2FsZVkgPSBlbGVtZW50Lm9mZnNldEhlaWdodCA+IDAgPyByb3VuZChjbGllbnRSZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxIDogMTtcbiAgfVxuXG4gIHZhciBfcmVmID0gaXNFbGVtZW50KGVsZW1lbnQpID8gZ2V0V2luZG93KGVsZW1lbnQpIDogd2luZG93LFxuICAgICAgdmlzdWFsVmlld3BvcnQgPSBfcmVmLnZpc3VhbFZpZXdwb3J0O1xuXG4gIHZhciBhZGRWaXN1YWxPZmZzZXRzID0gIWlzTGF5b3V0Vmlld3BvcnQoKSAmJiBpc0ZpeGVkU3RyYXRlZ3k7XG4gIHZhciB4ID0gKGNsaWVudFJlY3QubGVmdCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCA6IDApKSAvIHNjYWxlWDtcbiAgdmFyIHkgPSAoY2xpZW50UmVjdC50b3AgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcCA6IDApKSAvIHNjYWxlWTtcbiAgdmFyIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aCAvIHNjYWxlWDtcbiAgdmFyIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0IC8gc2NhbGVZO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB0b3A6IHksXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgbGVmdDogeCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsICJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn0iLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudCkge1xuICBpZiAoZ2V0Tm9kZU5hbWUoZWxlbWVudCkgPT09ICdodG1sJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuICgvLyB0aGlzIGlzIGEgcXVpY2tlciAoYnV0IGxlc3MgdHlwZSBzYWZlKSB3YXkgdG8gc2F2ZSBxdWl0ZSBzb21lIGJ5dGVzIGZyb20gdGhlIGJ1bmRsZVxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl1cbiAgICAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICBlbGVtZW50LmFzc2lnbmVkU2xvdCB8fCAvLyBzdGVwIGludG8gdGhlIHNoYWRvdyBET00gb2YgdGhlIHBhcmVudCBvZiBhIHNsb3R0ZWQgbm9kZVxuICAgIGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoIC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgaXNTaGFkb3dSb290KGVsZW1lbnQpID8gZWxlbWVudC5ob3N0IDogbnVsbCkgfHwgLy8gU2hhZG93Um9vdCBkZXRlY3RlZFxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBIVE1MRWxlbWVudCBpcyBhIE5vZGVcbiAgICBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkgLy8gZmFsbGJhY2tcblxuICApO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsICJpbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbk1heENsYW1wKG1pbiwgdmFsdWUsIG1heCkge1xuICB2YXIgdiA9IHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpO1xuICByZXR1cm4gdiA+IG1heCA/IG1heCA6IHY7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4cGFuZFRvSGFzaE1hcCh2YWx1ZSwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGhhc2hNYXAsIGtleSkge1xuICAgIGhhc2hNYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBoYXNoTWFwO1xuICB9LCB7fSk7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsICJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmLCB3aW4pIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55O1xuICB2YXIgZHByID0gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZCh4ICogZHByKSAvIGRwciB8fCAwLFxuICAgIHk6IHJvdW5kKHkgKiBkcHIpIC8gZHByIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgdmFyaWF0aW9uID0gX3JlZjIudmFyaWF0aW9uLFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cyxcbiAgICAgIGlzRml4ZWQgPSBfcmVmMi5pc0ZpeGVkO1xuICB2YXIgX29mZnNldHMkeCA9IG9mZnNldHMueCxcbiAgICAgIHggPSBfb2Zmc2V0cyR4ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeCxcbiAgICAgIF9vZmZzZXRzJHkgPSBvZmZzZXRzLnksXG4gICAgICB5ID0gX29mZnNldHMkeSA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHk7XG5cbiAgdmFyIF9yZWYzID0gdHlwZW9mIHJvdW5kT2Zmc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHJvdW5kT2Zmc2V0cyh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmMy54O1xuICB5ID0gX3JlZjMueTtcbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIHZhciBfcmVmNCA9IHJvdW5kT2Zmc2V0cyA9PT0gdHJ1ZSA/IHJvdW5kT2Zmc2V0c0J5RFBSKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSwgZ2V0V2luZG93KHBvcHBlcikpIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsICJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgdmFyIGxheW91dFZpZXdwb3J0ID0gaXNMYXlvdXRWaWV3cG9ydCgpO1xuXG4gICAgaWYgKGxheW91dFZpZXdwb3J0IHx8ICFsYXlvdXRWaWV3cG9ydCAmJiBzdHJhdGVneSA9PT0gJ2ZpeGVkJykge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsICJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsICJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsICJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBmYWxzZSwgc3RyYXRlZ3kgPT09ICdmaXhlZCcpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSkgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpID8gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwgImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMgXHUyMDEzIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwgImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07IiwgImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxO1xuICB2YXIgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcbiAgcmV0dXJuIHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDE7XG59IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudElzU2NhbGVkID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzRWxlbWVudFNjYWxlZChvZmZzZXRQYXJlbnQpO1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnRJc1NjYWxlZCwgaXNGaXhlZCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsICJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwgImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUgXHUyMDEzIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsICJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlc107XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyIsICJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbmltcG9ydCBvZmZzZXQgZnJvbSBcIi4vbW9kaWZpZXJzL29mZnNldC5qc1wiO1xuaW1wb3J0IGZsaXAgZnJvbSBcIi4vbW9kaWZpZXJzL2ZsaXAuanNcIjtcbmltcG9ydCBwcmV2ZW50T3ZlcmZsb3cgZnJvbSBcIi4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGFycm93IGZyb20gXCIuL21vZGlmaWVycy9hcnJvdy5qc1wiO1xuaW1wb3J0IGhpZGUgZnJvbSBcIi4vbW9kaWZpZXJzL2hpZGUuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlcywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93LCBoaWRlXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKVxuICB9LFxuXG4gIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TWFwLmdldChlbGVtZW50KS5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSlcblxuICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgIGlmIChpbnN0YW5jZU1hcC5zaXplID09PSAwKSB7XG4gICAgICBlbGVtZW50TWFwLmRlbGV0ZShlbGVtZW50KVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2luZGV4LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTUFYX1VJRCA9IDFfMDAwXzAwMFxuY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwXG5jb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJ1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApXG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuLy8gU2hvdXQtb3V0IEFuZ3VzIENyb2xsIChodHRwczovL2dvby5nbC9weHdRR3ApXG5jb25zdCB0b1R5cGUgPSBvYmplY3QgPT4ge1xuICBpZiAob2JqZWN0ID09PSBudWxsIHx8IG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGAke29iamVjdH1gXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKClcbn1cblxuLyoqXG4gKiBQdWJsaWMgVXRpbCBBUElcbiAqL1xuXG5jb25zdCBnZXRVSUQgPSBwcmVmaXggPT4ge1xuICBkbyB7XG4gICAgcHJlZml4ICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpXG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpXG5cbiAgcmV0dXJuIHByZWZpeFxufVxuXG5jb25zdCBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHsgdHJhbnNpdGlvbkR1cmF0aW9uLCB0cmFuc2l0aW9uRGVsYXkgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG5cbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkRlbGF5ID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KVxuXG4gIC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcbiAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXVxuICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXVxuXG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVJcbn1cblxuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpXG59XG5cbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdC5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0WzBdXG4gIH1cblxuICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCdcbn1cblxuY29uc3QgZ2V0RWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gIGlmIChpc0VsZW1lbnQob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3QuanF1ZXJ5ID8gb2JqZWN0WzBdIDogb2JqZWN0XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBpc1Zpc2libGUgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgZWxlbWVudElzVmlzaWJsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAndmlzaWJsZSdcbiAgLy8gSGFuZGxlIGBkZXRhaWxzYCBlbGVtZW50IGFzIGl0cyBjb250ZW50IG1heSBmYWxzaWUgYXBwZWFyIHZpc2libGUgd2hlbiBpdCBpcyBjbG9zZWRcbiAgY29uc3QgY2xvc2VkRGV0YWlscyA9IGVsZW1lbnQuY2xvc2VzdCgnZGV0YWlsczpub3QoW29wZW5dKScpXG5cbiAgaWYgKCFjbG9zZWREZXRhaWxzKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbiAgfVxuXG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpXG4gICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbn1cblxuY29uc3QgaXNEaXNhYmxlZCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZFxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnXG59XG5cbmNvbnN0IGZpbmRTaGFkb3dSb290ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKVxuICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsXG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSlcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbi8qKlxuICogVHJpY2sgdG8gcmVzdGFydCBhbiBlbGVtZW50J3MgYW5pbWF0aW9uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB2b2lkXG4gKlxuICogQHNlZSBodHRwczovL3d3dy5jaGFyaXN0aGVvLmlvL2Jsb2cvMjAyMS8wMi9yZXN0YXJ0LWEtY3NzLWFuaW1hdGlvbi13aXRoLWphdmFzY3JpcHQvI3Jlc3RhcnRpbmctYS1jc3MtYW5pbWF0aW9uXG4gKi9cbmNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50Lm9mZnNldEhlaWdodCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xufVxuXG5jb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gIGlmICh3aW5kb3cualF1ZXJ5ICYmICFkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgnZGF0YS1icy1uby1qcXVlcnknKSkge1xuICAgIHJldHVybiB3aW5kb3cualF1ZXJ5XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW11cblxuY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gYWRkIGxpc3RlbmVyIG9uIHRoZSBmaXJzdCBjYWxsIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnXG5cbmNvbnN0IGRlZmluZUpRdWVyeVBsdWdpbiA9IHBsdWdpbiA9PiB7XG4gIG9uRE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRVxuICAgICAgY29uc3QgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltuYW1lXVxuICAgICAgJC5mbltuYW1lXSA9IHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW5cbiAgICAgICQuZm5bbmFtZV0ubm9Db25mbGljdCA9ICgpID0+IHtcbiAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVFxuICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZXhlY3V0ZSA9IChwb3NzaWJsZUNhbGxiYWNrLCBhcmdzID0gW10sIGRlZmF1bHRWYWx1ZSA9IHBvc3NpYmxlQ2FsbGJhY2spID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBwb3NzaWJsZUNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gcG9zc2libGVDYWxsYmFjayguLi5hcmdzKSA6IGRlZmF1bHRWYWx1ZVxufVxuXG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNVxuICBjb25zdCBlbXVsYXRlZER1cmF0aW9uID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodHJhbnNpdGlvbkVsZW1lbnQpICsgZHVyYXRpb25QYWRkaW5nXG5cbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG5cbiAgY29uc3QgaGFuZGxlciA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgaWYgKHRhcmdldCAhPT0gdHJhbnNpdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICB0cmFuc2l0aW9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpXG4gICAgfVxuICB9LCBlbXVsYXRlZER1cmF0aW9uKVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGhcbiAgbGV0IGluZGV4ID0gbGlzdC5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpXG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXVxuICB9XG5cbiAgaW5kZXggKz0gc2hvdWxkR2V0TmV4dCA/IDEgOiAtMVxuXG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV1cbn1cblxuZXhwb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLFxuICBmaW5kU2hhZG93Um9vdCxcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0alF1ZXJ5LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQsXG4gIGdldFVJRCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wLFxuICBvbkRPTUNvbnRlbnRMb2FkZWQsXG4gIHBhcnNlU2VsZWN0b3IsXG4gIHJlZmxvdyxcbiAgdHJpZ2dlclRyYW5zaXRpb25FbmQsXG4gIHRvVHlwZVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGdldGpRdWVyeSB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovXG5jb25zdCBzdHJpcE5hbWVSZWdleCA9IC9cXC4uKi9cbmNvbnN0IHN0cmlwVWlkUmVnZXggPSAvOjpcXGQrJC9cbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fSAvLyBFdmVudHMgc3RvcmFnZVxubGV0IHVpZEV2ZW50ID0gMVxuY29uc3QgY3VzdG9tRXZlbnRzID0ge1xuICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgbW91c2VsZWF2ZTogJ21vdXNlb3V0J1xufVxuXG5jb25zdCBuYXRpdmVFdmVudHMgPSBuZXcgU2V0KFtcbiAgJ2NsaWNrJyxcbiAgJ2RibGNsaWNrJyxcbiAgJ21vdXNldXAnLFxuICAnbW91c2Vkb3duJyxcbiAgJ2NvbnRleHRtZW51JyxcbiAgJ21vdXNld2hlZWwnLFxuICAnRE9NTW91c2VTY3JvbGwnLFxuICAnbW91c2VvdmVyJyxcbiAgJ21vdXNlb3V0JyxcbiAgJ21vdXNlbW92ZScsXG4gICdzZWxlY3RzdGFydCcsXG4gICdzZWxlY3RlbmQnLFxuICAna2V5ZG93bicsXG4gICdrZXlwcmVzcycsXG4gICdrZXl1cCcsXG4gICdvcmllbnRhdGlvbmNoYW5nZScsXG4gICd0b3VjaHN0YXJ0JyxcbiAgJ3RvdWNobW92ZScsXG4gICd0b3VjaGVuZCcsXG4gICd0b3VjaGNhbmNlbCcsXG4gICdwb2ludGVyZG93bicsXG4gICdwb2ludGVybW92ZScsXG4gICdwb2ludGVydXAnLFxuICAncG9pbnRlcmxlYXZlJyxcbiAgJ3BvaW50ZXJjYW5jZWwnLFxuICAnZ2VzdHVyZXN0YXJ0JyxcbiAgJ2dlc3R1cmVjaGFuZ2UnLFxuICAnZ2VzdHVyZWVuZCcsXG4gICdmb2N1cycsXG4gICdibHVyJyxcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICdzZWxlY3QnLFxuICAnc3VibWl0JyxcbiAgJ2ZvY3VzaW4nLFxuICAnZm9jdXNvdXQnLFxuICAnbG9hZCcsXG4gICd1bmxvYWQnLFxuICAnYmVmb3JldW5sb2FkJyxcbiAgJ3Jlc2l6ZScsXG4gICdtb3ZlJyxcbiAgJ0RPTUNvbnRlbnRMb2FkZWQnLFxuICAncmVhZHlzdGF0ZWNoYW5nZScsXG4gICdlcnJvcicsXG4gICdhYm9ydCcsXG4gICdzY3JvbGwnXG5dKVxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kc1xuICovXG5cbmZ1bmN0aW9uIG1ha2VFdmVudFVpZChlbGVtZW50LCB1aWQpIHtcbiAgcmV0dXJuICh1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWApIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrK1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpIHtcbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGVsZW1lbnQpXG5cbiAgZWxlbWVudC51aWRFdmVudCA9IHVpZFxuICBldmVudFJlZ2lzdHJ5W3VpZF0gPSBldmVudFJlZ2lzdHJ5W3VpZF0gfHwge31cblxuICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdXG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiBlbGVtZW50IH0pXG5cbiAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgZm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBmb3IgKGxldCB7IHRhcmdldCB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXQgfSlcblxuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0YXJnZXQsIFtldmVudF0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRzKVxuICAgIC5maW5kKGV2ZW50ID0+IGV2ZW50LmNhbGxhYmxlID09PSBjYWxsYWJsZSAmJiBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IgPT09IGRlbGVnYXRpb25TZWxlY3Rvcilcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGlzRGVsZWdhdGVkID0gdHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnXG4gIC8vIFRPRE86IHRvb2x0aXAgcGFzc2VzIGBmYWxzZWAgaW5zdGVhZCBvZiBzZWxlY3Rvciwgc28gd2UgbmVlZCB0byBjaGVja1xuICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogKGhhbmRsZXIgfHwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KVxuXG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgfVxuXG4gIHJldHVybiBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdXG59XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcbiAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKVxuICB9XG5cbiAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KVxuICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuXG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmZcblxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGNhbGxhYmxlLCBvcmlnaW5hbFR5cGVFdmVudC5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpXG4gIGNvbnN0IGZuID0gaXNEZWxlZ2F0ZWQgP1xuICAgIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6XG4gICAgYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSlcblxuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsXG4gIGZuLmNhbGxhYmxlID0gY2FsbGFibGVcbiAgZm4ub25lT2ZmID0gb25lT2ZmXG4gIGZuLnVpZEV2ZW50ID0gdWlkXG4gIGhhbmRsZXJzW3VpZF0gPSBmblxuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZClcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKSB7XG4gIGNvbnN0IGZuID0gZmluZEhhbmRsZXIoZXZlbnRzW3R5cGVFdmVudF0sIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3RvcilcblxuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKVxuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cblxuICBmb3IgKGNvbnN0IFtoYW5kbGVyS2V5LCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJylcbiAgcmV0dXJuIGN1c3RvbUV2ZW50c1tldmVudF0gfHwgZXZlbnRcbn1cblxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBmYWxzZSlcbiAgfSxcblxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSlcbiAgfSxcblxuICBvZmYoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gdHlwZUV2ZW50ICE9PSBvcmlnaW5hbFR5cGVFdmVudFxuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG4gICAgY29uc3QgaXNOYW1lc3BhY2UgPSBvcmlnaW5hbFR5cGVFdmVudC5zdGFydHNXaXRoKCcuJylcblxuICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgY29uc3QgaGFuZGxlcktleSA9IGtleUhhbmRsZXJzLnJlcGxhY2Uoc3RyaXBVaWRSZWdleCwgJycpXG5cbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudClcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IGV2ZW50ICE9PSB0eXBlRXZlbnRcblxuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGxcbiAgICBsZXQgYnViYmxlcyA9IHRydWVcbiAgICBsZXQgbmF0aXZlRGlzcGF0Y2ggPSB0cnVlXG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZVxuXG4gICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgIGpRdWVyeUV2ZW50ID0gJC5FdmVudChldmVudCwgYXJncylcblxuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KVxuICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKClcbiAgICB9XG5cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwgeyBidWJibGVzLCBjYW5jZWxhYmxlOiB0cnVlIH0pLCBhcmdzKVxuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKG5hdGl2ZURpc3BhdGNoKSB7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIHJldHVybiBldnRcbiAgfVxufVxuXG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICB9IGNhdGNoIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGFLZXkoa2V5KSB7XG4gIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKVxufVxuXG5jb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCwgdmFsdWUpXG4gIH0sXG5cbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKVxuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fVxuICAgIGNvbnN0IGJzS2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQuZGF0YXNldCkuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnYnMnKSAmJiAha2V5LnN0YXJ0c1dpdGgoJ2JzQ29uZmlnJykpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBic0tleXMpIHtcbiAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKVxuICAgICAgcHVyZUtleSA9IHB1cmVLZXkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBwdXJlS2V5LnNsaWNlKDEsIHB1cmVLZXkubGVuZ3RoKVxuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hbmlwdWxhdG9yXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvY29uZmlnLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCB7IGlzRWxlbWVudCwgdG9UeXBlIH0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBzdGF0aWMgbWV0aG9kIFwiTkFNRVwiLCBmb3IgZWFjaCBjb21wb25lbnQhJylcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgIGNvbnN0IGpzb25Db25maWcgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsICdjb25maWcnKSA6IHt9IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgLi4uKGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuICB9XG5cbiAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5LCBleHBlY3RlZFR5cGVzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdUeXBlcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BlcnR5XVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSlcblxuICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwiJHtwcm9wZXJ0eX1cIiBwcm92aWRlZCB0eXBlIFwiJHt2YWx1ZVR5cGV9XCIgYnV0IGV4cGVjdGVkIHR5cGUgXCIke2V4cGVjdGVkVHlwZXN9XCIuYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZ1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBiYXNlLWNvbXBvbmVudC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBEYXRhIGZyb20gJy4vZG9tL2RhdGEuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vdXRpbC9jb25maWcuanMnXG5pbXBvcnQgeyBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50IH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFZFUlNJT04gPSAnNS4zLjMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpXG5cbiAgICBlbGVtZW50ID0gZ2V0RWxlbWVudChlbGVtZW50KVxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnRcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcylcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSlcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnLCB0aGlzLl9lbGVtZW50KVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIERhdGEuZ2V0KGdldEVsZW1lbnQoZWxlbWVudCksIHRoaXMuREFUQV9LRVkpXG4gIH1cblxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTlxuICB9XG5cbiAgc3RhdGljIGdldCBEQVRBX0tFWSgpIHtcbiAgICByZXR1cm4gYGJzLiR7dGhpcy5OQU1FfWBcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xuICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gXG4gIH1cblxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlQ29tcG9uZW50XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBpc0Rpc2FibGVkLCBpc1Zpc2libGUsIHBhcnNlU2VsZWN0b3IgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJ1xuXG5jb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy10YXJnZXQnKVxuXG4gIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgIGxldCBocmVmQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKVxuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICghaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgaWYgKGhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIGhyZWZBdHRyaWJ1dGUgPSBgIyR7aHJlZkF0dHJpYnV0ZS5zcGxpdCgnIycpWzFdfWBcbiAgICB9XG5cbiAgICBzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsXG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gcGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsXG59XG5cbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKVxuICB9LFxuXG4gIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKVxuICB9LFxuXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpXG4gIH0sXG5cbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxuICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuXG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpXG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50c1xuICB9LFxuXG4gIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmdcblxuICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgaWYgKHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbcHJldmlvdXNdXG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZ1xuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbbmV4dF1cbiAgICAgIH1cblxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG5cbiAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgIGNvbnN0IGZvY3VzYWJsZXMgPSBbXG4gICAgICAnYScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdpbnB1dCcsXG4gICAgICAndGV4dGFyZWEnLFxuICAgICAgJ3NlbGVjdCcsXG4gICAgICAnZGV0YWlscycsXG4gICAgICAnW3RhYmluZGV4XScsXG4gICAgICAnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nXG4gICAgXS5tYXAoc2VsZWN0b3IgPT4gYCR7c2VsZWN0b3J9Om5vdChbdGFiaW5kZXhePVwiLVwiXSlgKS5qb2luKCcsJylcblxuICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpc0Rpc2FibGVkKGVsKSAmJiBpc1Zpc2libGUoZWwpKVxuICB9LFxuXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA6IG51bGxcbiAgfSxcblxuICBnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKSA6IFtdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0b3JFbmdpbmVcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgaXNEaXNhYmxlZCB9IGZyb20gJy4vaW5kZXguanMnXG5cbmNvbnN0IGVuYWJsZURpc21pc3NUcmlnZ2VyID0gKGNvbXBvbmVudCwgbWV0aG9kID0gJ2hpZGUnKSA9PiB7XG4gIGNvbnN0IGNsaWNrRXZlbnQgPSBgY2xpY2suZGlzbWlzcyR7Y29tcG9uZW50LkVWRU5UX0tFWX1gXG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRVxuXG4gIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgY2xpY2tFdmVudCwgYFtkYXRhLWJzLWRpc21pc3M9XCIke25hbWV9XCJdYCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKVxuICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gICAgLy8gTWV0aG9kIGFyZ3VtZW50IGlzIGxlZnQsIGZvciBBbGVydCBhbmQgb25seSwgYXMgaXQgZG9lc24ndCBpbXBsZW1lbnQgdGhlICdoaWRlJyBtZXRob2RcbiAgICBpbnN0YW5jZVttZXRob2RdKClcbiAgfSlcbn1cblxuZXhwb3J0IHtcbiAgZW5hYmxlRGlzbWlzc1RyaWdnZXJcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2FsZXJ0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuYWxlcnQnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWX1gXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSlcblxuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRUQpXG4gICAgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJylcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpXG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdidXR0b24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5idXR0b24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJ1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pXG5cbiAgZGF0YS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQnV0dG9uKVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgZXhlY3V0ZSB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzd2lwZSdcbmNvbnN0IEVWRU5UX0tFWSA9ICcuYnMuc3dpcGUnXG5jb25zdCBFVkVOVF9UT1VDSFNUQVJUID0gYHRvdWNoc3RhcnQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSE1PVkUgPSBgdG91Y2htb3ZlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hFTkQgPSBgdG91Y2hlbmQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSRE9XTiA9IGBwb2ludGVyZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJVUCA9IGBwb2ludGVydXAke0VWRU5UX0tFWX1gXG5jb25zdCBQT0lOVEVSX1RZUEVfVE9VQ0ggPSAndG91Y2gnXG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3BlbidcbmNvbnN0IENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCA9ICdwb2ludGVyLWV2ZW50J1xuY29uc3QgU1dJUEVfVEhSRVNIT0xEID0gNDBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgZW5kQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBsZWZ0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICByaWdodENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTd2lwZSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudFxuXG4gICAgaWYgKCFlbGVtZW50IHx8ICFTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2RlbHRhWCA9IDBcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudClcbiAgICB0aGlzLl9pbml0RXZlbnRzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX3N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSkge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQuY2xpZW50WFxuICAgIH1cbiAgfVxuXG4gIF9lbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kZWx0YVhcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpXG4gICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spXG4gIH1cblxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID9cbiAgICAgIDAgOlxuICAgICAgZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fZGVsdGFYXG4gIH1cblxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKVxuXG4gICAgaWYgKGFic0RlbHRhWCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRhWCAvIHRoaXMuX2RlbHRhWFxuXG4gICAgdGhpcy5fZGVsdGFYID0gMFxuXG4gICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV4ZWN1dGUoZGlyZWN0aW9uID4gMCA/IHRoaXMuX2NvbmZpZy5yaWdodENhbGxiYWNrIDogdGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjaylcbiAgfVxuXG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUlVQLCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKVxuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hTVEFSVCwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNITU9WRSwgZXZlbnQgPT4gdGhpcy5fbW92ZShldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpXG4gICAgfVxuICB9XG5cbiAgX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMgJiYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfUEVOIHx8IGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfVE9VQ0gpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN3aXBlXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNhcm91c2VsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTd2lwZSBmcm9tICcuL3V0aWwvc3dpcGUuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjYXJvdXNlbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNhcm91c2VsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMCAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTVxuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJ1xuXG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVldOiBESVJFQ1RJT05fUklHSFQsXG4gIFtBUlJPV19SSUdIVF9LRVldOiBESVJFQ1RJT05fTEVGVFxufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHBhdXNlOiAnaG92ZXInLFxuICByaWRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHdyYXA6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsXG5cbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKVxuICB9XG5cbiAgbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgIC8vIEZJWE1FIFRPRE8gdXNlIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgXG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgfVxuXG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICB9XG5cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLmN5Y2xlKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN5Y2xlKClcbiAgfVxuXG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpXG4gICAgaWYgKGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuXG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlSGVscGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IGNvbmZpZy5pbnRlcnZhbFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIsICgpID0+IHRoaXMucGF1c2UoKSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFLCAoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKClcbiAgICB9XG4gIH1cblxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICB9XG5cbiAgICBjb25zdCBlbmRDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgIT09ICdob3ZlcicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICB9XG5cbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH1cblxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbmV3IFN3aXBlKHRoaXMuX2VsZW1lbnQsIHN3aXBlQ29uZmlnKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XVxuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSlcbiAgICB9XG4gIH1cblxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpXG5cbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBpZiAobmV3QWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICd0cnVlJylcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWxcbiAgfVxuXG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZ2V0QWN0aXZlKClcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKVxuXG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KVxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSlcblxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRlc3RzIHRoYXQgdXNlIGVtcHR5IGRpdnMgdG8gYXZvaWQgdGhpcyBjaGVja1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcbiAgICB0aGlzLnBhdXNlKClcblxuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWVcblxuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EXG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVZcblxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICByZWZsb3cobmV4dEVsZW1lbnQpXG5cbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSlcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSwgb3JkZXJDbGFzc05hbWUsIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKVxuICB9XG5cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9nZXRJdGVtcygpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKVxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG4gIH1cblxuICBfb3JkZXJUb0RpcmVjdGlvbihvcmRlcikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVFxuICAgIH1cblxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKHRoaXMsICdzbGlkZScpID09PSAnbmV4dCcpIHtcbiAgICBjYXJvdXNlbC5uZXh0KClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjYXJvdXNlbC5wcmV2KClcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGNvbnN0IGNhcm91c2VsIG9mIGNhcm91c2Vscykge1xuICAgIENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UoY2Fyb3VzZWwpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKVxuXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50LFxuICByZWZsb3dcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnY29sbGFwc2UnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFID0gJ2NvbGxhcHNlJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnXG5jb25zdCBDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiA9IGA6c2NvcGUgLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX0gLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX1gXG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCdcblxuY29uc3QgV0lEVEggPSAnd2lkdGgnXG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0J1xuXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVTID0gJy5jb2xsYXBzZS5zaG93LCAuY29sbGFwc2UuY29sbGFwc2luZydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb2xsYXBzZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdXG5cbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0b2dnbGVMaXN0KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IFNlbGVjdG9yRW5naW5lLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSlcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuICAgICAgICAuZmlsdGVyKGZvdW5kRWxlbWVudCA9PiBmb3VuZEVsZW1lbnQgPT09IHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRoaXMuX2lzU2hvd24oKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW11cblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpXG4gICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkpXG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZUNoaWxkcmVuLmxlbmd0aCAmJiBhY3RpdmVDaGlsZHJlblswXS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVylcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKClcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDBcblxuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG4gICAgfVxuXG4gICAgY29uc3QgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKVxuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXX1weGBcblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRoaXMuX3RyaWdnZXJBcnJheSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcilcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgX2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKSAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUXG4gIH1cblxuICBfaW5pdGlhbGl6ZUNoaWxkcmVuKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudClcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpXG4gIH1cblxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlckFycmF5KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge31cbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIC8vIHByZXZlbnREZWZhdWx0IG9ubHkgZm9yIDxhPiBlbGVtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBVUkwpIG5vdCBpbnNpZGUgdGhlIGNvbGxhcHNpYmxlIGVsZW1lbnRcbiAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnQScgfHwgKGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3Rvcih0aGlzKSkge1xuICAgIENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pLnRvZ2dsZSgpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBnZXRFbGVtZW50LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Ryb3Bkb3duJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5jb25zdCBUQUJfS0VZID0gJ1RhYidcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMiAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QU1RBUlQgPSAnZHJvcHN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInXG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJdOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX0uJHtDTEFTU19OQU1FX1NIT1d9YFxuY29uc3QgU0VMRUNUT1JfTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJ1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdidcbmNvbnN0IFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5cbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BFTkQgPSBpc1JUTCgpID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9SSUdIVCA9IGlzUlRMKCkgPyAnbGVmdC1zdGFydCcgOiAncmlnaHQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01DRU5URVIgPSAnYm90dG9tJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBEcm9wZG93biBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLnByZXYodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KVxuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jcmVhdGVQb3BwZXIoKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSwgcmVsYXRlZFRhcmdldClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHN1cGVyLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmXG4gICAgICB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcInJlZmVyZW5jZVwiIHByb3ZpZGVkIHR5cGUgXCJvYmplY3RcIiB3aXRob3V0IGEgcmVxdWlyZWQgXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIiBtZXRob2QuYClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIGxldCByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudFxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50XG4gICAgfSBlbHNlIGlmIChpc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyQ29uZmlnID0gdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKClcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZylcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUEVORCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfUklHSFRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUlxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0JPVFRPTUNFTlRFUlxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJ1xuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT01cbiAgfVxuXG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKSAvLyBUT0RPOiB2NiByZW1vdmVcbiAgICAgIGRlZmF1bHRCc1BvcHBlckNvbmZpZy5tb2RpZmllcnMgPSBbe1xuICAgICAgICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfV1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9XG4gIH1cblxuICBfc2VsZWN0TWVudUl0ZW0oeyBrZXksIHRhcmdldCB9KSB7XG4gICAgY29uc3QgaXRlbXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMsIHRoaXMuX21lbnUpLmZpbHRlcihlbGVtZW50ID0+IGlzVmlzaWJsZShlbGVtZW50KSlcblxuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBpZiB0YXJnZXQgaXNuJ3QgaW5jbHVkZWQgaW4gaXRlbXMgKGUuZy4gd2hlbiBleHBhbmRpbmcgdGhlIGRyb3Bkb3duKVxuICAgIC8vIGFsbG93IGN5Y2xpbmcgdG8gZ2V0IHRoZSBsYXN0IGl0ZW0gaW4gY2FzZSBrZXkgZXF1YWxzIEFSUk9XX1VQX0tFWVxuICAgIGdldE5leHRBY3RpdmVFbGVtZW50KGl0ZW1zLCB0YXJnZXQsIGtleSA9PT0gQVJST1dfRE9XTl9LRVksICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgY2xlYXJNZW51cyhldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gPT09IFJJR0hUX01PVVNFX0JVVFRPTiB8fCAoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pXG5cbiAgICBmb3IgKGNvbnN0IHRvZ2dsZSBvZiBvcGVuVG9nZ2xlcykge1xuICAgICAgY29uc3QgY29udGV4dCA9IERyb3Bkb3duLmdldEluc3RhbmNlKHRvZ2dsZSlcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKVxuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpXG4gICAgICBpZiAoXG4gICAgICAgIGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ2luc2lkZScgJiYgIWlzTWVudVRhcmdldCkgfHxcbiAgICAgICAgKGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIG5hdmlnYXRpb24gdGhyb3VnaCB0aGUgZHJvcGRvd24gbWVudSBvciBldmVudHMgZnJvbSBjb250YWluZWQgaW5wdXRzIHNob3VsZG4ndCBjbG9zZSB0aGUgbWVudVxuICAgICAgaWYgKGNvbnRleHQuX21lbnUuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAoKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZKSB8fCAvaW5wdXR8c2VsZWN0fG9wdGlvbnx0ZXh0YXJlYXxmb3JtL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnQgfVxuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudFxuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0YUFwaUtleWRvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgLy8gSWYgbm90IGFuIFVQIHwgRE9XTiB8IEVTQ0FQRSBrZXkgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIC8vIElmIGlucHV0L3RleHRhcmVhICYmIGlmIGtleSBpcyBvdGhlciB0aGFuIEVTQ0FQRSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG5cbiAgICBjb25zdCBpc0lucHV0ID0gL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSlcbiAgICBjb25zdCBpc0VzY2FwZUV2ZW50ID0gZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZXG4gICAgY29uc3QgaXNVcE9yRG93bkV2ZW50ID0gW0FSUk9XX1VQX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcblxuICAgIGlmICghaXNVcE9yRG93bkV2ZW50ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNJbnB1dCAmJiAhaXNFc2NhcGVFdmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gVE9ETzogdjYgcmV2ZXJ0ICMzNzAxMSAmIGNoYW5nZSBtYXJrdXAgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4zL2Zvcm1zL2lucHV0LWdyb3VwL1xuICAgIGNvbnN0IGdldFRvZ2dsZUJ1dHRvbiA9IHRoaXMubWF0Y2hlcyhTRUxFQ1RPUl9EQVRBX1RPR0dMRSkgP1xuICAgICAgdGhpcyA6XG4gICAgICAoU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSkpXG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UoZ2V0VG9nZ2xlQnV0dG9uKVxuXG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGluc3RhbmNlLnNob3coKVxuICAgICAgaW5zdGFuY2UuX3NlbGVjdE1lbnVJdGVtKGV2ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHsgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2UuaGlkZSgpXG4gICAgICBnZXRUb2dnbGVCdXR0b24uZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlVUF9EQVRBX0FQSSwgRHJvcGRvd24uY2xlYXJNZW51cylcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnRvZ2dsZSgpXG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bilcblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHtcbiAgZXhlY3V0ZSwgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCwgcmVmbG93XG59IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdiYWNrZHJvcCdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLmJzLiR7TkFNRX1gXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGNsYXNzTmFtZTogJ21vZGFsLWJhY2tkcm9wJyxcbiAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgaXNBbmltYXRlZDogZmFsc2UsXG4gIGlzVmlzaWJsZTogdHJ1ZSwgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgcm9vdEVsZW1lbnQ6ICdib2R5JyAvLyBnaXZlIHRoZSBjaG9pY2UgdG8gcGxhY2UgYmFja2Ryb3AgdW5kZXIgZGlmZmVyZW50IGVsZW1lbnRzXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQoKVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKVxuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTilcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2VcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjaylcbiAgICB9KVxuXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWVcbiAgfVxuXG4gIF9lbXVsYXRlQW5pbWF0aW9uKGNhbGxiYWNrKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYWNrZHJvcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdmb2N1c3RyYXAnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5mb2N1c3RyYXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnXG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvZm9jdXM6IHRydWUsXG4gIHRyYXBFbGVtZW50OiBudWxsIC8vIFRoZSBlbGVtZW50IHRvIHRyYXAgZm9jdXMgaW5zaWRlIG9mXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpIC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX1RBQiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihldmVudCkpXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWVcbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7IHRyYXBFbGVtZW50IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudClcblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKClcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvY3VzVHJhcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJ1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnXG5jb25zdCBQUk9QRVJUWV9QQURESU5HID0gJ3BhZGRpbmctcmlnaHQnXG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldFdpZHRoKCkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgIGNvbnN0IGRvY3VtZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIHRoaXMuX2Rpc2FibGVPdmVyRmxvdygpXG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aClcbiAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4sIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgLSB3aWR0aClcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTilcbiAgfVxuXG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDBcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rpc2FibGVPdmVyRmxvdygpIHtcbiAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuICB9XG5cbiAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5nZXRXaWR0aCgpXG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KVxuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpXG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsQmFySGVscGVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG1vZGFsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbiwgaXNSVEwsIGlzVmlzaWJsZSwgcmVmbG93XG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ21vZGFsJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3BlbidcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnXG5cbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnXG5jb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZydcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgZm9jdXM6ICdib29sZWFuJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKClcblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKClcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pXG5cbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSlcblxuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgaGFuZGxlVXBkYXRlKCkge1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSwgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgaXNBbmltYXRlZDogdGhpcy5faXNBbmltYXRlZCgpXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMFxuXG4gICAgY29uc3QgbW9kYWxCb2R5ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NT0RBTF9CT0RZLCB0aGlzLl9kaWFsb2cpXG4gICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgbW9kYWxCb2R5LnNjcm9sbFRvcCA9IDBcbiAgICB9XG5cbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMSUNLX0RJU01JU1MsIGV2ZW50MiA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50ICE9PSBldmVudC50YXJnZXQgfHwgdGhpcy5fZWxlbWVudCAhPT0gZXZlbnQyLnRhcmdldCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBfaGlkZU1vZGFsKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJylcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9PUEVOKVxuICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpXG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH0pXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICB9XG5cbiAgX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICBjb25zdCBpbml0aWFsT3ZlcmZsb3dZID0gdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1lcbiAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICBpZiAoaW5pdGlhbE92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJ1xuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQylcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQylcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1lcbiAgICAgIH0sIHRoaXMuX2RpYWxvZylcbiAgICB9LCB0aGlzLl9kaWFsb2cpXG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgKi9cblxuICBfYWRqdXN0RGlhbG9nKCkge1xuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKClcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMFxuXG4gICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0J1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG5cbiAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJ1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJydcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZm9jdXMgcmVzdG9yZXIgaWYgbW9kYWwgd2lsbCBhY3R1YWxseSBnZXQgc2hvd25cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbClcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oTW9kYWwpXG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG9mZmNhbnZhcy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IEJhY2tkcm9wIGZyb20gJy4vdXRpbC9iYWNrZHJvcC5qcydcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMnXG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJy4vdXRpbC9mb2N1c3RyYXAuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGlzRGlzYWJsZWQsXG4gIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgU2Nyb2xsQmFySGVscGVyIGZyb20gJy4vdXRpbC9zY3JvbGxiYXIuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdvZmZjYW52YXMnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5vZmZjYW52YXMnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfU0hPV0lORyA9ICdzaG93aW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9ISURJTkcgPSAnaGlkaW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9CQUNLRFJPUCA9ICdvZmZjYW52YXMtYmFja2Ryb3AnXG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5vZmZjYW52YXMuc2hvdydcblxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBzY3JvbGw6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBPZmZjYW52YXMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fYmFja2Ryb3AgPSB0aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKVxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywgeyByZWxhdGVkVGFyZ2V0IH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5oaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCB8fCB0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwgeyByZWxhdGVkVGFyZ2V0IH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG5cbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICB0aGlzLl9lbGVtZW50LmJsdXIoKVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0hJRElORylcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKClcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX0hJRElORylcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJylcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJylcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5yZXNldCgpXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICBjb25zdCBjbGlja0NhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH1cblxuICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKVxuXG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBjbGFzc05hbWU6IENMQVNTX05BTUVfQkFDS0RST1AsXG4gICAgICBpc1Zpc2libGUsXG4gICAgICBpc0FuaW1hdGVkOiB0cnVlLFxuICAgICAgcm9vdEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgIGNsaWNrQ2FsbGJhY2s6IGlzVmlzaWJsZSA/IGNsaWNrQ2FsbGJhY2sgOiBudWxsXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICB9KVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX0hJRERFTiwgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBhIHRvZ2dsZXIgb2YgYW4gb2ZmY2FudmFzLCB3aGlsZSBhbm90aGVyIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU2VsZWN0b3JFbmdpbmUuZmluZChPUEVOX1NFTEVDVE9SKSkge1xuICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHNlbGVjdG9yKS5zaG93KClcbiAgfVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKCdbYXJpYS1tb2RhbF1bY2xhc3MqPXNob3ddW2NsYXNzKj1vZmZjYW52YXMtXScpKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpLmhpZGUoKVxuICAgIH1cbiAgfVxufSlcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpXG5cbmV4cG9ydCBkZWZhdWx0IE9mZmNhbnZhc1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Nhbml0aXplci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8vIGpzLWRvY3Mtc3RhcnQgYWxsb3ctbGlzdFxuY29uc3QgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTiA9IC9eYXJpYS1bXFx3LV0qJC9pXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRkOiBbXSxcbiAgZGl2OiBbXSxcbiAgZGw6IFtdLFxuICBkdDogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgJ2JhY2tncm91bmQnLFxuICAnY2l0ZScsXG4gICdocmVmJyxcbiAgJ2l0ZW10eXBlJyxcbiAgJ2xvbmdkZXNjJyxcbiAgJ3Bvc3RlcicsXG4gICdzcmMnLFxuICAneGxpbms6aHJlZidcbl0pXG5cbi8qKlxuICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBVUkxzIHRoYXQgYXJlIHNhZmUgd3J0LiBYU1MgaW4gVVJMIG5hdmlnYXRpb25cbiAqIGNvbnRleHRzLlxuICpcbiAqIFNob3V0LW91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xNS4yLjgvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHMjTDM4XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD8hamF2YXNjcmlwdDopKD86W2EtejAtOSsuLV0rOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvaVxuXG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgaWYgKHVyaUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihTQUZFX1VSTF9QQVRURVJOLnRlc3QoYXR0cmlidXRlLm5vZGVWYWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGF0dHJpYnV0ZVJlZ2V4ID0+IGF0dHJpYnV0ZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKVxuICAgIC5zb21lKHJlZ2V4ID0+IHJlZ2V4LnRlc3QoYXR0cmlidXRlTmFtZSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbFxuICB9XG5cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKVxuICB9XG5cbiAgY29uc3QgZG9tUGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKVxuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKVxuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghT2JqZWN0LmtleXMoYWxsb3dMaXN0KS5pbmNsdWRlcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlTGlzdCA9IFtdLmNvbmNhdCguLi5lbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVMaXN0KSB7XG4gICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlcykpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5vZGVOYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUxcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCwgc2FuaXRpemVIdG1sIH0gZnJvbSAnLi9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgeyBleGVjdXRlLCBnZXRFbGVtZW50LCBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnVGVtcGxhdGVGYWN0b3J5J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LCAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn1cblxuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gICAgICAubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMFxuICB9XG5cbiAgY2hhbmdlQ29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbnRlbnQpXG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7IC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LCAuLi5jb250ZW50IH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGVtcGxhdGVXcmFwcGVyLmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUodGhpcy5fY29uZmlnLnRlbXBsYXRlKVxuXG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdXG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKVxuXG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKVxuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudClcbiAgfVxuXG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoeyBzZWxlY3RvciwgZW50cnk6IGNvbnRlbnQgfSwgRGVmYXVsdENvbnRlbnRUeXBlKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKVxuXG4gICAgaWYgKCF0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KVxuXG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgfVxuXG4gIF9tYXliZVNhbml0aXplKGFyZykge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuc2FuaXRpemUgPyBzYW5pdGl6ZUh0bWwoYXJnLCB0aGlzLl9jb25maWcuYWxsb3dMaXN0LCB0aGlzLl9jb25maWcuc2FuaXRpemVGbikgOiBhcmdcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt0aGlzXSlcbiAgfVxuXG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJ1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlRmFjdG9yeVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0b29sdGlwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0ICogYXMgUG9wcGVyIGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbiwgZXhlY3V0ZSwgZmluZFNoYWRvd1Jvb3QsIGdldEVsZW1lbnQsIGdldFVJRCwgaXNSVEwsIG5vb3Bcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCB9IGZyb20gJy4vdXRpbC9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgVGVtcGxhdGVGYWN0b3J5IGZyb20gJy4vdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9vbHRpcCdcbmNvbnN0IERJU0FMTE9XRURfQVRUUklCVVRFUyA9IG5ldyBTZXQoWydzYW5pdGl6ZScsICdhbGxvd0xpc3QnLCAnc2FuaXRpemVGbiddKVxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfTU9EQUwgPSAnbW9kYWwnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcidcbmNvbnN0IFNFTEVDVE9SX01PREFMID0gYC4ke0NMQVNTX05BTUVfTU9EQUx9YFxuXG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnXG5cbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInXG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJ1xuY29uc3QgVFJJR0dFUl9DTElDSyA9ICdjbGljaydcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCdcblxuY29uc3QgRVZFTlRfSElERSA9ICdoaWRlJ1xuY29uc3QgRVZFTlRfSElEREVOID0gJ2hpZGRlbidcbmNvbnN0IEVWRU5UX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX1NIT1dOID0gJ3Nob3duJ1xuY29uc3QgRVZFTlRfSU5TRVJURUQgPSAnaW5zZXJ0ZWQnXG5jb25zdCBFVkVOVF9DTElDSyA9ICdjbGljaydcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSAnZm9jdXNpbidcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gJ2ZvY3Vzb3V0J1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9ICdtb3VzZWVudGVyJ1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJ1xuXG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgNl0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gIGN1c3RvbUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogJ2FycmF5JyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBsYWNlbWVudDogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gIHRpdGxlOiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKScsXG4gIHRyaWdnZXI6ICdzdHJpbmcnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJylcbiAgICB9XG5cbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZVxuICAgIHRoaXMuX3RpbWVvdXQgPSAwXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbFxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fVxuICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBudWxsXG4gICAgdGhpcy5fbmV3Q29udGVudCA9IG51bGxcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMudGlwID0gbnVsbFxuXG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICB0aGlzLl9maXhUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBlbmFibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZVxuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZVxuICB9XG5cbiAgdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkXG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGlja1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VudGVyKClcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG5cbiAgICBpZiAodGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnKSlcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJylcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzLl9pc1dpdGhDb250ZW50KCkgJiYgdGhpcy5faXNFbmFibGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfU0hPVykpXG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGZpbmRTaGFkb3dSb290KHRoaXMuX2VsZW1lbnQpXG4gICAgY29uc3QgaXNJblRoZURvbSA9IChzaGFkb3dSb290IHx8IHRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHY2IHJlbW92ZSB0aGlzIG9yIG1ha2UgaXQgb3B0aW9uYWxcbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKVxuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRoaXMudGlwKSkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZCh0aXApXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9JTlNFUlRFRCkpXG4gICAgfVxuXG4gICAgdGhpcy5fcG9wcGVyID0gdGhpcy5fY3JlYXRlUG9wcGVyKHRpcClcblxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XTikpXG5cbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSkpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KClcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGwgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURERU4pKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvdGVjdGVkXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2dldFRpdGxlKCkpXG4gIH1cblxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aXBcbiAgfVxuXG4gIF9jcmVhdGVUaXBFbGVtZW50KGNvbnRlbnQpIHtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkudG9IdG1sKClcblxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGNoZWNrIGluIHY2XG4gICAgaWYgKCF0aXApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9GQURFLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApXG5cbiAgICBjb25zdCB0aXBJZCA9IGdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpLnRvU3RyaW5nKClcblxuICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpXG5cbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpcFxuICB9XG5cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KSB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRmFjdG9yeSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5LmNoYW5nZUNvbnRlbnQoY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbmV3IFRlbXBsYXRlRmFjdG9yeSh7XG4gICAgICAgIC4uLnRoaXMuX2NvbmZpZyxcbiAgICAgICAgLy8gdGhlIGBjb250ZW50YCB2YXIgaGFzIHRvIGJlIGFmdGVyIGB0aGlzLl9jb25maWdgXG4gICAgICAgIC8vIHRvIG92ZXJyaWRlIGNvbmZpZy5jb250ZW50IGluIGNhc2Ugb2YgcG9wb3ZlclxuICAgICAgICBjb250ZW50LFxuICAgICAgICBleHRyYUNsYXNzOiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY3VzdG9tQ2xhc3MpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUZhY3RvcnlcbiAgfVxuXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLnRpdGxlKSB8fCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5hbmltYXRpb24gfHwgKHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKHRpcCkge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IGV4ZWN1dGUodGhpcy5fY29uZmlnLnBsYWNlbWVudCwgW3RoaXMsIHRpcCwgdGhpcy5fZWxlbWVudF0pXG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldXG4gICAgcmV0dXJuIFBvcHBlci5jcmVhdGVQb3BwZXIodGhpcy5fZWxlbWVudCwgdGlwLCB0aGlzLl9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkpXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBleGVjdXRlKGFyZywgW3RoaXMuX2VsZW1lbnRdKVxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLl9nZXRPZmZzZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgcGhhc2U6ICdiZWZvcmVNYWluJyxcbiAgICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgICAvLyBQcmUtc2V0IFBvcHBlcidzIHBsYWNlbWVudCBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8gcmVhZCB0aGUgYXJyb3cgc2l6ZXMgcHJvcGVybHkuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIFBvcHBlciBtaXhlcyB1cCB0aGUgd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zIHNpbmNlIHRoZSBpbml0aWFsIGFycm93IHN0eWxlIGlzIGZvciB0b3AgcGxhY2VtZW50XG4gICAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9XG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5fY29uZmlnLnRyaWdnZXIuc3BsaXQoJyAnKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKSB7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfQ0xJQ0spLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQudG9nZ2xlKClcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFRU5URVIpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU0lOKVxuICAgICAgICBjb25zdCBldmVudE91dCA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU09VVClcblxuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgZXZlbnRJbiwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWVcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcigpXG4gICAgICAgIH0pXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPVxuICAgICAgICAgICAgY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxuXG4gICAgICAgICAgY29udGV4dC5fbGVhdmUoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTU9EQUwpLCBFVkVOVF9NT0RBTF9ISURFLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKVxuICB9XG5cbiAgX2ZpeFRpdGxlKCkge1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJylcblxuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJiAhdGhpcy5fZWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnLCB0aXRsZSkgLy8gRE8gTk9UIFVTRSBJVC4gSXMgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKVxuICB9XG5cbiAgX2VudGVyKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkgfHwgdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KClcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkuc2hvdylcbiAgfVxuXG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5oaWRlKVxuICB9XG5cbiAgX3NldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpXG4gIH1cblxuICBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9hY3RpdmVUcmlnZ2VyKS5pbmNsdWRlcyh0cnVlKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBmb3IgKGNvbnN0IGRhdGFBdHRyaWJ1dGUgb2YgT2JqZWN0LmtleXMoZGF0YUF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmhhcyhkYXRhQXR0cmlidXRlKSkge1xuICAgICAgICBkZWxldGUgZGF0YUF0dHJpYnV0ZXNbZGF0YUF0dHJpYnV0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcgPSB7XG4gICAgICAuLi5kYXRhQXR0cmlidXRlcyxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmNvbnRhaW5lciA9IGNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlID8gZG9jdW1lbnQuYm9keSA6IGdldEVsZW1lbnQoY29uZmlnLmNvbnRhaW5lcilcblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLnRpdGxlID0gY29uZmlnLnRpdGxlLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcpKSB7XG4gICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIGNvbmZpZ1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZVxuICAgIGNvbmZpZy50cmlnZ2VyID0gJ21hbnVhbCdcblxuICAgIC8vIEluIHRoZSBmdXR1cmUgY2FuIGJlIHJlcGxhY2VkIHdpdGg6XG4gICAgLy8gY29uc3Qga2V5c1dpdGhEaWZmZXJlbnRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcpLmZpbHRlcihlbnRyeSA9PiB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZW50cnlbMF1dICE9PSB0aGlzLl9jb25maWdbZW50cnlbMF1dKVxuICAgIC8vIGBPYmplY3QuZnJvbUVudHJpZXMoa2V5c1dpdGhEaWZmZXJlbnRWYWx1ZXMpYFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9kaXNwb3NlUG9wcGVyKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aXApIHtcbiAgICAgIHRoaXMudGlwLnJlbW92ZSgpXG4gICAgICB0aGlzLnRpcCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb29sdGlwKVxuXG5leHBvcnQgZGVmYXVsdCBUb29sdGlwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHBvcG92ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3Rvb2x0aXAuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdwb3BvdmVyJ1xuXG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInXG5jb25zdCBTRUxFQ1RPUl9DT05URU5UID0gJy5wb3BvdmVyLWJvZHknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdCxcbiAgY29udGVudDogJycsXG4gIG9mZnNldDogWzAsIDhdLFxuICBwbGFjZW1lbnQ6ICdyaWdodCcsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIiByb2xlPVwidG9vbHRpcFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgK1xuICAgICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj4nICtcbiAgICAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0VHlwZSxcbiAgY29udGVudDogJyhudWxsfHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgUG9wb3ZlciBleHRlbmRzIFRvb2x0aXAge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gT3ZlcnJpZGVzXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRUaXRsZSgpIHx8IHRoaXMuX2dldENvbnRlbnQoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0Q29udGVudEZvclRlbXBsYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbU0VMRUNUT1JfVElUTEVdOiB0aGlzLl9nZXRUaXRsZSgpLFxuICAgICAgW1NFTEVDVE9SX0NPTlRFTlRdOiB0aGlzLl9nZXRDb250ZW50KClcbiAgICB9XG4gIH1cblxuICBfZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBQb3BvdmVyLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihQb3BvdmVyKVxuXG5leHBvcnQgZGVmYXVsdCBQb3BvdmVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHNjcm9sbHNweS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXRFbGVtZW50LCBpc0Rpc2FibGVkLCBpc1Zpc2libGVcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc2Nyb2xsc3B5J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuc2Nyb2xsc3B5J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nXG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJU1RfSVRFTVMgPSAnLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJTktfSVRFTVMgPSBgJHtTRUxFQ1RPUl9OQVZfTElOS1N9LCAke1NFTEVDVE9SX05BVl9JVEVNU30gPiAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU31gXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgb2Zmc2V0OiBudWxsLCAvLyBUT0RPOiB2NiBAZGVwcmVjYXRlZCwga2VlcCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuICByb290TWFyZ2luOiAnMHB4IDBweCAtMjUlJyxcbiAgc21vb3RoU2Nyb2xsOiBmYWxzZSxcbiAgdGFyZ2V0OiBudWxsLFxuICB0aHJlc2hvbGQ6IFswLjEsIDAuNSwgMV1cbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIG9mZnNldDogJyhudW1iZXJ8bnVsbCknLCAvLyBUT0RPIHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICdzdHJpbmcnLFxuICBzbW9vdGhTY3JvbGw6ICdib29sZWFuJyxcbiAgdGFyZ2V0OiAnZWxlbWVudCcsXG4gIHRocmVzaG9sZDogJ2FycmF5J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gdGhpcy5fZWxlbWVudCBpcyB0aGUgb2JzZXJ2YWJsZXNDb250YWluZXIgYW5kIGNvbmZpZy50YXJnZXQgdGhlIG1lbnUgbGlua3Mgd3JhcHBlclxuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnRcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsXG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpIC8vIGluaXRpYWxpemVcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKClcbiAgICB0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpXG5cbiAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX2dldE5ld09ic2VydmVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHNlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogb24gdjYgdGFyZ2V0IHNob3VsZCBiZSBnaXZlbiBleHBsaWNpdGx5ICYgcmVtb3ZlIHRoZSB7dGFyZ2V0OiAnc3MtdGFyZ2V0J30gY2FzZVxuICAgIGNvbmZpZy50YXJnZXQgPSBnZXRFbGVtZW50KGNvbmZpZy50YXJnZXQpIHx8IGRvY3VtZW50LmJvZHlcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aHJlc2hvbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5yZWdpc3RlciBhbnkgcHJldmlvdXMgbGlzdGVuZXJzXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSylcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpXG4gICAgICBpZiAob2JzZXJ2YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdEVsZW1lbnQgfHwgd2luZG93XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wXG4gICAgICAgIGlmIChyb290LnNjcm9sbFRvKSB7XG4gICAgICAgICAgcm9vdC5zY3JvbGxUbyh7IHRvcDogaGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENocm9tZSA2MCBkb2Vzbid0IHN1cHBvcnQgYHNjcm9sbFRvYFxuICAgICAgICByb290LnNjcm9sbFRvcCA9IGhlaWdodFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBfZ2V0TmV3T2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMuX3Jvb3RFbGVtZW50LFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl9jb25maWcudGhyZXNob2xkLFxuICAgICAgcm9vdE1hcmdpbjogdGhpcy5fY29uZmlnLnJvb3RNYXJnaW5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucylcbiAgfVxuXG4gIC8vIFRoZSBsb2dpYyBvZiBzZWxlY3Rpb25cbiAgX29ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlbnRyeSA9PiB0aGlzLl90YXJnZXRMaW5rcy5nZXQoYCMke2VudHJ5LnRhcmdldC5pZH1gKVxuICAgIGNvbnN0IGFjdGl2YXRlID0gZW50cnkgPT4ge1xuICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcCA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3BcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wXG4gICAgY29uc3QgdXNlclNjcm9sbHNEb3duID0gcGFyZW50U2Nyb2xsVG9wID49IHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3BcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wID0gcGFyZW50U2Nyb2xsVG9wXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRhcmdldEVsZW1lbnQoZW50cnkpKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcFxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyBkb3duLCBwaWNrIHRoZSBiaWdnZXIgb2Zmc2V0VG9wXG4gICAgICBpZiAodXNlclNjcm9sbHNEb3duICYmIGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzbid0IHNjcm9sbGVkLCBsZXQncyBrZWVwIHRoZSBmaXJzdCB2aXNpYmxlIGl0ZW0sIGJyZWFraW5nIHRoZSBpdGVyYXRpb25cbiAgICAgICAgaWYgKCFwYXJlbnRTY3JvbGxUb3ApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgdXAsIHBpY2sgdGhlIHNtYWxsZXN0IG9mZnNldFRvcFxuICAgICAgaWYgKCF1c2VyU2Nyb2xsc0Rvd24gJiYgIWVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpIHtcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgdGFyZ2V0TGlua3MgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoZGVjb2RlVVJJKGFuY2hvci5oYXNoKSwgdGhpcy5fZWxlbWVudClcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpXG4gICAgICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5zZXQoYW5jaG9yLmhhc2gsIG9ic2VydmFibGVTZWN0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJBY3RpdmVDbGFzcyh0aGlzLl9jb25maWcudGFyZ2V0KVxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldFxuICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRoaXMuX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpXG5cbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwgeyByZWxhdGVkVGFyZ2V0OiB0YXJnZXQgfSlcbiAgfVxuXG4gIF9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KSB7XG4gICAgLy8gQWN0aXZhdGUgZHJvcGRvd24gcGFyZW50c1xuICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fSVRFTSkpIHtcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCB0YXJnZXQuY2xvc2VzdChTRUxFQ1RPUl9EUk9QRE9XTikpXG4gICAgICAgIC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaXN0R3JvdXAgb2YgU2VsZWN0b3JFbmdpbmUucGFyZW50cyh0YXJnZXQsIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKSkge1xuICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rcyBwYXJlbnRzIGFzIGFjdGl2ZVxuICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgU2VsZWN0b3JFbmdpbmUucHJldihsaXN0R3JvdXAsIFNFTEVDVE9SX0xJTktfSVRFTVMpKSB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIGNvbnN0IGFjdGl2ZU5vZGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChgJHtTRUxFQ1RPUl9UQVJHRVRfTElOS1N9LiR7Q0xBU1NfTkFNRV9BQ1RJVkV9YCwgcGFyZW50KVxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBhY3RpdmVOb2Rlcykge1xuICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzcHkgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1NQWSkpIHtcbiAgICBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZShzcHkpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFNjcm9sbFNweSlcblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsU3B5XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRhYi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXROZXh0QWN0aXZlRWxlbWVudCwgaXNEaXNhYmxlZCB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RhYidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRhYidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTiA9IGBrZXlkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSdcbmNvbnN0IEVORF9LRVkgPSAnRW5kJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfRFJPUERPV04gPSAnZHJvcGRvd24nXG5cbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IE5PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSBgOm5vdCgke1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0pYFxuXG5jb25zdCBTRUxFQ1RPUl9UQUJfUEFORUwgPSAnLmxpc3QtZ3JvdXAsIC5uYXYsIFtyb2xlPVwidGFibGlzdFwiXSdcbmNvbnN0IFNFTEVDVE9SX09VVEVSID0gJy5uYXYtaXRlbSwgLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl0nIC8vIFRPRE86IGNvdWxkIG9ubHkgYmUgYHRhYmAgaW4gdjZcbmNvbnN0IFNFTEVDVE9SX0lOTkVSX0VMRU0gPSBgJHtTRUxFQ1RPUl9JTk5FUn0sICR7U0VMRUNUT1JfREFUQV9UT0dHTEV9YFxuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUgPSBgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdYFxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUYWIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTClcblxuICAgIGlmICghdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04sIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkgeyAvLyBTaG93cyB0aGlzIGVsZW0gYW5kIGRlYWN0aXZhdGUgdGhlIGFjdGl2ZSBzaWJsaW5nIGlmIGV4aXN0c1xuICAgIGNvbnN0IGlubmVyRWxlbSA9IHRoaXMuX2VsZW1lbnRcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNlYXJjaCBmb3IgYWN0aXZlIHRhYiBvbiBzYW1lIHBhcmVudCB0byBkZWFjdGl2YXRlIGl0XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fZ2V0QWN0aXZlRWxlbSgpXG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgP1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoYWN0aXZlLCBFVkVOVF9ISURFLCB7IHJlbGF0ZWRUYXJnZXQ6IGlubmVyRWxlbSB9KSA6XG4gICAgICBudWxsXG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcihpbm5lckVsZW0sIEVWRU5UX1NIT1csIHsgcmVsYXRlZFRhcmdldDogYWN0aXZlIH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgKGhpZGVFdmVudCAmJiBoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pXG4gICAgdGhpcy5fYWN0aXZhdGUoaW5uZXJFbGVtLCBhY3RpdmUpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9hY3RpdmF0ZShlbGVtZW50LCByZWxhdGVkRWxlbSkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBhY3RpdmF0ZS9zaG93IHRoZSBwcm9wZXIgc2VjdGlvblxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCB0cnVlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgZWxlbWVudC5ibHVyKClcblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgZmFsc2UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9ISURERU4sIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW0gfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIShbQVJST1dfTEVGVF9LRVksIEFSUk9XX1JJR0hUX0tFWSwgQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWSwgSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKS8vIHN0b3BQcm9wYWdhdGlvbi9wcmV2ZW50RGVmYXVsdCBib3RoIGFkZGVkIHRvIHN1cHBvcnQgdXAvZG93biBrZXlzIHdpdGhvdXQgc2Nyb2xsaW5nIHRoZSBwYWdlXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbHRlcihlbGVtZW50ID0+ICFpc0Rpc2FibGVkKGVsZW1lbnQpKVxuICAgIGxldCBuZXh0QWN0aXZlRWxlbWVudFxuXG4gICAgaWYgKFtIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQgPSBjaGlsZHJlbltldmVudC5rZXkgPT09IEhPTUVfS0VZID8gMCA6IGNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzTmV4dCA9IFtBUlJPV19SSUdIVF9LRVksIEFSUk9XX0RPV05fS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpXG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSlcbiAgICB9XG5cbiAgICBpZiAobmV4dEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KVxuICAgICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UobmV4dEFjdGl2ZUVsZW1lbnQpLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDaGlsZHJlbigpIHsgLy8gY29sbGVjdGlvbiBvZiBpbm5lciBlbGVtZW50c1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lOTkVSX0VMRU0sIHRoaXMuX3BhcmVudClcbiAgfVxuXG4gIF9nZXRBY3RpdmVFbGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbmQoY2hpbGQgPT4gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKSkgfHwgbnVsbFxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpIHtcbiAgICBjaGlsZCA9IHRoaXMuX2dldElubmVyRWxlbWVudChjaGlsZClcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZClcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpXG4gICAgY2hpbGQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgaXNBY3RpdmUpXG5cbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKVxuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGNoaWxkLCAncm9sZScsICd0YWInKVxuXG4gICAgLy8gc2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHJlbGF0ZWQgcGFuZWwgdG9vXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZCkge1xuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoY2hpbGQpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAncm9sZScsICd0YWJwYW5lbCcpXG5cbiAgICBpZiAoY2hpbGQuaWQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGAke2NoaWxkLmlkfWApXG4gICAgfVxuICB9XG5cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIW91dGVyRWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfRFJPUERPV04pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSlcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc05hbWUsIG9wZW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSwgQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX01FTlUsIENMQVNTX05BTUVfU0hPVylcbiAgICBvdXRlckVsZW0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgb3BlbilcbiAgfVxuXG4gIF9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIGlubmVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtbGluaylcbiAgX2dldElubmVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0ubWF0Y2hlcyhTRUxFQ1RPUl9JTk5FUl9FTEVNKSA/IGVsZW0gOiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0lOTkVSX0VMRU0sIGVsZW0pXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBvdXRlciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWl0ZW0pXG4gIF9nZXRPdXRlckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsb3Nlc3QoU0VMRUNUT1JfT1VURVIpIHx8IGVsZW1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpXG59KVxuXG4vKipcbiAqIEluaXRpYWxpemUgb24gZm9jdXNcbiAqL1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUpKSB7XG4gICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudClcbiAgfVxufSlcbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRhYilcblxuZXhwb3J0IGRlZmF1bHQgVGFiXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvYXN0LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIHJlZmxvdyB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RvYXN0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMudG9hc3QnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9NT1VTRU9WRVIgPSBgbW91c2VvdmVyJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU09VVCA9IGBmb2N1c291dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZScgLy8gQGRlcHJlY2F0ZWQgLSBrZXB0IGhlcmUgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYXV0b2hpZGU6ICdib29sZWFuJyxcbiAgZGVsYXk6ICdudW1iZXInXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvYXN0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGZhbHNlXG4gICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGZhbHNlXG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG5cbiAgICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfU0hPV0lORylcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG5cbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElERSkgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBpc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICAvLyBQcml2YXRlXG5cbiAgX21heWJlU2NoZWR1bGVIaWRlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiB8fCB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheSlcbiAgfVxuXG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XG4gICAgICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOiB7XG4gICAgICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNJbnRlcmFjdGluZykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSBuZXh0RWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LmNvbnRhaW5zKG5leHRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICB9XG5cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVkVSLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpXG4gIH1cblxuICBfY2xlYXJUaW1lb3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb2FzdC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKFRvYXN0KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb2FzdClcblxuZXhwb3J0IGRlZmF1bHQgVG9hc3RcbiIsICIvKiFcclxuICogU2VhcmNoIG1vZGFsIGZvciBCb290c3RyYXAgYmFzZWQgVGh1bGl0ZSBzaXRlc1xyXG4gKiBDb3B5cmlnaHQgMjAyMS0yMDI0IFRodWxpdGVcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgTW9kYWwgfSBmcm9tICdib290c3RyYXAnO1xyXG5cclxuKCgpID0+IHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICAvLyBEZWNsYXJlIHNlYXJjaCBlbGVtZW50c1xyXG4gICAgY29uc3Qgc2VhcmNoVG9nZ2xlTW9iaWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaFRvZ2dsZU1vYmlsZScpO1xyXG4gICAgY29uc3Qgc2VhcmNoVG9nZ2xlRGVza3RvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hUb2dnbGVEZXNrdG9wJyk7XHJcbiAgICBjb25zdCBzZWFyY2hNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hNb2RhbCcpO1xyXG4gICAgY29uc3Qgc2VhcmNoRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2gtZm9ybScpO1xyXG4gICAgY29uc3Qgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVlcnknKTtcclxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoUmVzdWx0cycpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBzZWFyY2ggbW9kYWxcclxuICAgIGNvbnN0IGZsZXhTZWFyY2hNb2RhbCA9IG5ldyBNb2RhbChzZWFyY2hNb2RhbCwge1xyXG4gICAgICAgIGZvY3VzOiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTaG93IHNlYXJjaCBtb2RhbCB3aGVuIHNlYXJjaCBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAgc2VhcmNoVG9nZ2xlTW9iaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsT25DbGljayk7XHJcbiAgICBzZWFyY2hUb2dnbGVEZXNrdG9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsT25DbGljayk7XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsT25DbGljaygpIHtcclxuICAgICAgICBmbGV4U2VhcmNoTW9kYWwudG9nZ2xlKCk7XHJcbiAgICAgICAgLy8gU2hvdyBtZXNzYWdlIFwiTm8gcmVjZW50IHNlYXJjaGVzXCJcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLW5vLXJlY2VudCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBrZXlib2FyZCBzaG9ydGN1dHNcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd25IYW5kbGVyKTtcclxuXHJcbiAgICBmdW5jdGlvbiBvbktleURvd25IYW5kbGVyKGV2ZW50KSB7XHJcbiAgICAgICAgLy8gU2hvdyBzZWFyY2ggbW9kYWwgd2hlbiBcIkN0cmwgKyBrXCIgaXMgcHJlc3NlZFxyXG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleSA9PT0gJ2snKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGZsZXhTZWFyY2hNb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIGlucHV0IGZpZWxkIGFuZCBzZWFyY2ggcmVzdWx0c1xyXG4gICAgICAgICAgICBzZWFyY2hGb3JtLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdHMudGV4dENvbnRlbnQgPSAnJztcclxuICAgICAgICAgICAgLy8gU2hvdyBtZXNzYWdlIFwiTm8gcmVjZW50IHNlYXJjaGVzXCJcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZWNlbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXQgZmllbGQgYW5kIHNlYXJjaCByZXN1bHRzIHdoZW4gXCJFc2NcIiBpcyBwcmVzc2VkXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgc2VhcmNoRm9ybS5yZXNldCgpO1xyXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzLnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBjbGFzcyBcInNlbGVjdGVkXCIgb24gc2VhcmNoIHJlc3VsdCBhbmQgcmVzZXQgaW5kZXggc2VhcmNoIHJlc3VsdHNcclxuICAgICAgICAgICAgaWYgKHNlYXJjaFJlc3VsdFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEhpZGUgbWVzc2FnZSBcIk5vIHNlYXJjaCByZXN1bHRzXCJcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1uby1yZXN1bHRzJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBjbGlja2luZyBvbiBtb2RhbCBiYWNrZHJvcFxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAvLyBDbGVhciBpbnB1dCBmaWVsZCBhbmQgc2VhcmNoIHJlc3VsdHMgd2hlbiBjbGlja2luZyBvbiBtb2RhbCBiYWNrZHJvcFxyXG4gICAgICAgIHZhciBtb2RhbEVsZW1lbnQgPSBzZWFyY2hNb2RhbC5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG4gICAgICAgIGlmICghbW9kYWxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHNlYXJjaEZvcm0ucmVzZXQoKTtcclxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0cy50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAvLyBIaWRlIG1lc3NhZ2UgXCJObyBzZWFyY2ggcmVzdWx0c1wiXHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtbm8tcmVzdWx0cycpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgY2xhc3MgXCJzZWxlY3RlZFwiIG9uIHNlYXJjaCByZXN1bHQgYW5kIHJlc2V0IGluZGV4IHNlYXJjaCByZXN1bHRzXHJcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKHNlYXJjaFJlc3VsdFNlbGVjdGVkLCAnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgaW5kZXggPSAtMTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGb2N1cyB0aGUgc2VhcmNoIGlucHV0IGVsZW1lbnQgd2hlbiB0aGUgc2VhcmNoIG1vZGFsIGlzIHNob3duXHJcbiAgICBzZWFyY2hNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcclxuICAgICAgICBzZWFyY2hJbnB1dC5mb2N1cygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gc2VhcmNoIHJlc3VsdHNcclxuICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vY29kZXBlbi5pby9tZWh1bGRlc2lnbi9wZW4vZVlwYlhNZ1xyXG4gICAgdmFyIHNlYXJjaFJlc3VsdFNlbGVjdGVkO1xyXG4gICAgdmFyIGluZGV4ID0gLTE7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAna2V5ZG93bicsXHJcbiAgICAgICAgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBsZW4gPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJykubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcclxuICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0U2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBpbmRleCA8PSBsZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBzZWFyY2hSZXN1bHRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHNlYXJjaFJlc3VsdFNlbGVjdGVkLCAnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVswXTtcclxuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hSZXN1bHRTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKHNlYXJjaFJlc3VsdFNlbGVjdGVkLCAnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gc2VhcmNoUmVzdWx0cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXJ0aWNsZScpW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5leHQgIT09ICd1bmRlZmluZWQnICYmIGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQgPSBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVtsZW5dO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZCA9IHNlYXJjaFJlc3VsdHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKVtsZW5dO1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHNlYXJjaFJlc3VsdFNlbGVjdGVkLCAnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmFsc2VcclxuICAgICk7XHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhefFxcXFxiKScgKyBjbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKFxcXFxifCQpJywgJ2dpJyksICcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBmb2N1cyBvbiBzZWxlY3RlZCBzZWFyY2ggcmVzdWx0XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0U2VsZWN0ZWQucXVlcnlTZWxlY3RvcignYScpLmJsdXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2V0IGZvY3VzIG9uIHNlbGVjdGVkIHNlYXJjaCByZXN1bHRcclxuICAgICAgICBzZWFyY2hSZXN1bHRTZWxlY3RlZC5xdWVyeVNlbGVjdG9yKCdhJykuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgbW91c2UgbmF2aWdhdGlvbiBzZWFyY2ggcmVzdWx0c1xyXG4gICAgc2VhcmNoUmVzdWx0cy5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICdtb3VzZW92ZXInLFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaFJlc3VsdFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhzZWFyY2hSZXN1bHRTZWxlY3RlZCwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhbHNlXHJcbiAgICApO1xyXG59KSgpO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUFBQTtBQUFBLElBQUE7QUFBQSw0QkFBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FPLE1BQUksTUFBTTtBQUNWLE1BQUksU0FBUztBQUNiLE1BQUksUUFBUTtBQUNaLE1BQUksT0FBTztBQUNYLE1BQUksT0FBTztBQUNYLE1BQUksaUJBQWlCLENBQUMsS0FBSyxRQUFRLE9BQU8sSUFBSTtBQUM5QyxNQUFJLFFBQVE7QUFDWixNQUFJLE1BQU07QUFDVixNQUFJLGtCQUFrQjtBQUN0QixNQUFJLFdBQVc7QUFDZixNQUFJLFNBQVM7QUFDYixNQUFJLFlBQVk7QUFDaEIsTUFBSSxzQkFBbUMsK0JBQWUsT0FBTyxTQUFVLEtBQUssV0FBVztBQUM1RixXQUFPLElBQUksT0FBTyxDQUFDLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxHQUFHLENBQUM7QUFBQSxFQUNwRSxHQUFHLENBQUMsQ0FBQztBQUNFLE1BQUksYUFBMEIsaUJBQUMsRUFBRSxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sU0FBVSxLQUFLLFdBQVc7QUFDdEcsV0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxHQUFHLENBQUM7QUFBQSxFQUMvRSxHQUFHLENBQUMsQ0FBQztBQUVFLE1BQUksYUFBYTtBQUNqQixN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QUFNO0FBQUEsTUFDMUI7QUFFQSwyQkFBcUIsY0FBYyxHQUFHLEVBQUUsTUFBTTtBQUFBLElBQ2xEO0FBR0Esa0JBQWM7QUFBQSxNQUNWO0FBQUEsTUFDQSxNQUFNO0FBQ0YsWUFBSSxzQkFBc0I7QUFDdEIsc0JBQVksc0JBQXNCLFVBQVU7QUFBQSxRQUNoRDtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBLEVBQ0osR0FBRzsiLAogICJuYW1lcyI6IFsiY3JlYXRlUG9wcGVyIiwgIm5hbWUiLCAic3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgInRvUGFkZGluZ09iamVjdCIsICJwb3BwZXJPZmZzZXRzIiwgIm1pbiIsICJtYXgiLCAib2Zmc2V0IiwgImVmZmVjdCIsICJwb3BwZXIiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlZmZlY3QiLCAid2luZG93IiwgImhhc2giLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImNsaXBwaW5nUGFyZW50cyIsICJnZXRDb21wdXRlZFN0eWxlIiwgInJlZmVyZW5jZSIsICJwb3BwZXJPZmZzZXRzIiwgIm9mZnNldCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJfbG9vcCIsICJfaSIsICJjaGVja3MiLCAib2Zmc2V0IiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgIm1pbiIsICJtYXgiLCAiZm4iLCAibWVyZ2VkIiwgImRlZmF1bHRNb2RpZmllcnMiLCAiY3JlYXRlUG9wcGVyIiwgInJlZmVyZW5jZSIsICJwb3BwZXIiLCAib3B0aW9ucyIsICJmbiIsICJzdGF0ZSIsICJlZmZlY3QiLCAibm9vcEZuIiwgImNyZWF0ZVBvcHBlciIsICJkZWZhdWx0TW9kaWZpZXJzIiwgImNyZWF0ZVBvcHBlciIsICJlbGVtZW50TWFwIiwgIk1hcCIsICJzZXQiLCAiZWxlbWVudCIsICJrZXkiLCAiaW5zdGFuY2UiLCAiaGFzIiwgImluc3RhbmNlTWFwIiwgImdldCIsICJzaXplIiwgImNvbnNvbGUiLCAiZXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJrZXlzIiwgInJlbW92ZSIsICJkZWxldGUiLCAiTUFYX1VJRCIsICJNSUxMSVNFQ09ORFNfTVVMVElQTElFUiIsICJUUkFOU0lUSU9OX0VORCIsICJwYXJzZVNlbGVjdG9yIiwgInNlbGVjdG9yIiwgIndpbmRvdyIsICJDU1MiLCAiZXNjYXBlIiwgInJlcGxhY2UiLCAibWF0Y2giLCAiaWQiLCAidG9UeXBlIiwgIm9iamVjdCIsICJ1bmRlZmluZWQiLCAiT2JqZWN0IiwgInByb3RvdHlwZSIsICJ0b1N0cmluZyIsICJjYWxsIiwgInRvTG93ZXJDYXNlIiwgImdldFVJRCIsICJwcmVmaXgiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAiZG9jdW1lbnQiLCAiZ2V0RWxlbWVudEJ5SWQiLCAiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCAidHJhbnNpdGlvbkR1cmF0aW9uIiwgInRyYW5zaXRpb25EZWxheSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uIiwgIk51bWJlciIsICJwYXJzZUZsb2F0IiwgImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwgInNwbGl0IiwgInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwgImRpc3BhdGNoRXZlbnQiLCAiRXZlbnQiLCAiaXNFbGVtZW50IiwgImpxdWVyeSIsICJub2RlVHlwZSIsICJnZXRFbGVtZW50IiwgImxlbmd0aCIsICJxdWVyeVNlbGVjdG9yIiwgImlzVmlzaWJsZSIsICJnZXRDbGllbnRSZWN0cyIsICJlbGVtZW50SXNWaXNpYmxlIiwgImdldFByb3BlcnR5VmFsdWUiLCAiY2xvc2VkRGV0YWlscyIsICJjbG9zZXN0IiwgInN1bW1hcnkiLCAicGFyZW50Tm9kZSIsICJpc0Rpc2FibGVkIiwgIk5vZGUiLCAiRUxFTUVOVF9OT0RFIiwgImNsYXNzTGlzdCIsICJjb250YWlucyIsICJkaXNhYmxlZCIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgImZpbmRTaGFkb3dSb290IiwgImRvY3VtZW50RWxlbWVudCIsICJhdHRhY2hTaGFkb3ciLCAiZ2V0Um9vdE5vZGUiLCAicm9vdCIsICJTaGFkb3dSb290IiwgIm5vb3AiLCAicmVmbG93IiwgIm9mZnNldEhlaWdodCIsICJnZXRqUXVlcnkiLCAialF1ZXJ5IiwgImJvZHkiLCAiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsICJvbkRPTUNvbnRlbnRMb2FkZWQiLCAiY2FsbGJhY2siLCAicmVhZHlTdGF0ZSIsICJhZGRFdmVudExpc3RlbmVyIiwgInB1c2giLCAiaXNSVEwiLCAiZGlyIiwgImRlZmluZUpRdWVyeVBsdWdpbiIsICJwbHVnaW4iLCAiJCIsICJuYW1lIiwgIk5BTUUiLCAiSlFVRVJZX05PX0NPTkZMSUNUIiwgImZuIiwgImpRdWVyeUludGVyZmFjZSIsICJDb25zdHJ1Y3RvciIsICJub0NvbmZsaWN0IiwgImV4ZWN1dGUiLCAicG9zc2libGVDYWxsYmFjayIsICJhcmdzIiwgImRlZmF1bHRWYWx1ZSIsICJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwgInRyYW5zaXRpb25FbGVtZW50IiwgIndhaXRGb3JUcmFuc2l0aW9uIiwgImR1cmF0aW9uUGFkZGluZyIsICJlbXVsYXRlZER1cmF0aW9uIiwgImNhbGxlZCIsICJoYW5kbGVyIiwgInRhcmdldCIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInNldFRpbWVvdXQiLCAiZ2V0TmV4dEFjdGl2ZUVsZW1lbnQiLCAibGlzdCIsICJhY3RpdmVFbGVtZW50IiwgInNob3VsZEdldE5leHQiLCAiaXNDeWNsZUFsbG93ZWQiLCAibGlzdExlbmd0aCIsICJpbmRleCIsICJpbmRleE9mIiwgIm1heCIsICJtaW4iLCAibmFtZXNwYWNlUmVnZXgiLCAic3RyaXBOYW1lUmVnZXgiLCAic3RyaXBVaWRSZWdleCIsICJldmVudFJlZ2lzdHJ5IiwgInVpZEV2ZW50IiwgImN1c3RvbUV2ZW50cyIsICJtb3VzZWVudGVyIiwgIm1vdXNlbGVhdmUiLCAibmF0aXZlRXZlbnRzIiwgIlNldCIsICJtYWtlRXZlbnRVaWQiLCAidWlkIiwgImdldEVsZW1lbnRFdmVudHMiLCAiYm9vdHN0cmFwSGFuZGxlciIsICJldmVudCIsICJoeWRyYXRlT2JqIiwgImRlbGVnYXRlVGFyZ2V0IiwgIm9uZU9mZiIsICJFdmVudEhhbmRsZXIiLCAib2ZmIiwgInR5cGUiLCAiYXBwbHkiLCAiYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIiLCAiZG9tRWxlbWVudHMiLCAicXVlcnlTZWxlY3RvckFsbCIsICJkb21FbGVtZW50IiwgImZpbmRIYW5kbGVyIiwgImV2ZW50cyIsICJjYWxsYWJsZSIsICJkZWxlZ2F0aW9uU2VsZWN0b3IiLCAidmFsdWVzIiwgImZpbmQiLCAibm9ybWFsaXplUGFyYW1ldGVycyIsICJvcmlnaW5hbFR5cGVFdmVudCIsICJkZWxlZ2F0aW9uRnVuY3Rpb24iLCAiaXNEZWxlZ2F0ZWQiLCAidHlwZUV2ZW50IiwgImdldFR5cGVFdmVudCIsICJhZGRIYW5kbGVyIiwgIndyYXBGdW5jdGlvbiIsICJyZWxhdGVkVGFyZ2V0IiwgImhhbmRsZXJzIiwgInByZXZpb3VzRnVuY3Rpb24iLCAicmVtb3ZlSGFuZGxlciIsICJCb29sZWFuIiwgInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsICJuYW1lc3BhY2UiLCAic3RvcmVFbGVtZW50RXZlbnQiLCAiaGFuZGxlcktleSIsICJlbnRyaWVzIiwgImluY2x1ZGVzIiwgIm9uIiwgIm9uZSIsICJpbk5hbWVzcGFjZSIsICJpc05hbWVzcGFjZSIsICJzdGFydHNXaXRoIiwgImVsZW1lbnRFdmVudCIsICJzbGljZSIsICJrZXlIYW5kbGVycyIsICJ0cmlnZ2VyIiwgImpRdWVyeUV2ZW50IiwgImJ1YmJsZXMiLCAibmF0aXZlRGlzcGF0Y2giLCAiZGVmYXVsdFByZXZlbnRlZCIsICJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0RlZmF1bHRQcmV2ZW50ZWQiLCAiZXZ0IiwgImNhbmNlbGFibGUiLCAicHJldmVudERlZmF1bHQiLCAib2JqIiwgIm1ldGEiLCAidmFsdWUiLCAiX3VudXNlZCIsICJkZWZpbmVQcm9wZXJ0eSIsICJjb25maWd1cmFibGUiLCAibm9ybWFsaXplRGF0YSIsICJKU09OIiwgInBhcnNlIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJub3JtYWxpemVEYXRhS2V5IiwgImNociIsICJNYW5pcHVsYXRvciIsICJzZXREYXRhQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVEYXRhQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJnZXREYXRhQXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzIiwgImJzS2V5cyIsICJkYXRhc2V0IiwgImZpbHRlciIsICJwdXJlS2V5IiwgImNoYXJBdCIsICJnZXREYXRhQXR0cmlidXRlIiwgIkNvbmZpZyIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIkVycm9yIiwgIl9nZXRDb25maWciLCAiY29uZmlnIiwgIl9tZXJnZUNvbmZpZ09iaiIsICJfY29uZmlnQWZ0ZXJNZXJnZSIsICJfdHlwZUNoZWNrQ29uZmlnIiwgImpzb25Db25maWciLCAiY29uc3RydWN0b3IiLCAiY29uZmlnVHlwZXMiLCAicHJvcGVydHkiLCAiZXhwZWN0ZWRUeXBlcyIsICJ2YWx1ZVR5cGUiLCAiUmVnRXhwIiwgInRlc3QiLCAiVHlwZUVycm9yIiwgInRvVXBwZXJDYXNlIiwgIlZFUlNJT04iLCAiQmFzZUNvbXBvbmVudCIsICJfZWxlbWVudCIsICJfY29uZmlnIiwgIkRhdGEiLCAiREFUQV9LRVkiLCAiZGlzcG9zZSIsICJFVkVOVF9LRVkiLCAicHJvcGVydHlOYW1lIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiX3F1ZXVlQ2FsbGJhY2siLCAiaXNBbmltYXRlZCIsICJnZXRJbnN0YW5jZSIsICJnZXRPckNyZWF0ZUluc3RhbmNlIiwgImV2ZW50TmFtZSIsICJnZXRTZWxlY3RvciIsICJocmVmQXR0cmlidXRlIiwgInRyaW0iLCAibWFwIiwgInNlbCIsICJqb2luIiwgIlNlbGVjdG9yRW5naW5lIiwgImNvbmNhdCIsICJFbGVtZW50IiwgImZpbmRPbmUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAibWF0Y2hlcyIsICJwYXJlbnRzIiwgImFuY2VzdG9yIiwgInByZXYiLCAicHJldmlvdXMiLCAicHJldmlvdXNFbGVtZW50U2libGluZyIsICJuZXh0IiwgIm5leHRFbGVtZW50U2libGluZyIsICJmb2N1c2FibGVDaGlsZHJlbiIsICJmb2N1c2FibGVzIiwgImVsIiwgImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCAiZ2V0RWxlbWVudEZyb21TZWxlY3RvciIsICJnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yIiwgImVuYWJsZURpc21pc3NUcmlnZ2VyIiwgImNvbXBvbmVudCIsICJtZXRob2QiLCAiY2xpY2tFdmVudCIsICJ0YWdOYW1lIiwgIkVWRU5UX0NMT1NFIiwgIkVWRU5UX0NMT1NFRCIsICJDTEFTU19OQU1FX0ZBREUiLCAiQ0xBU1NfTkFNRV9TSE9XIiwgIkFsZXJ0IiwgImNsb3NlIiwgImNsb3NlRXZlbnQiLCAiX2Rlc3Ryb3lFbGVtZW50IiwgImVhY2giLCAiZGF0YSIsICJEQVRBX0FQSV9LRVkiLCAiQ0xBU1NfTkFNRV9BQ1RJVkUiLCAiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCAiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCAiQnV0dG9uIiwgInRvZ2dsZSIsICJidXR0b24iLCAiRVZFTlRfVE9VQ0hTVEFSVCIsICJFVkVOVF9UT1VDSE1PVkUiLCAiRVZFTlRfVE9VQ0hFTkQiLCAiRVZFTlRfUE9JTlRFUkRPV04iLCAiRVZFTlRfUE9JTlRFUlVQIiwgIlBPSU5URVJfVFlQRV9UT1VDSCIsICJQT0lOVEVSX1RZUEVfUEVOIiwgIkNMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCIsICJTV0lQRV9USFJFU0hPTEQiLCAiZW5kQ2FsbGJhY2siLCAibGVmdENhbGxiYWNrIiwgInJpZ2h0Q2FsbGJhY2siLCAiU3dpcGUiLCAiaXNTdXBwb3J0ZWQiLCAiX2RlbHRhWCIsICJfc3VwcG9ydFBvaW50ZXJFdmVudHMiLCAiUG9pbnRlckV2ZW50IiwgIl9pbml0RXZlbnRzIiwgIl9zdGFydCIsICJ0b3VjaGVzIiwgImNsaWVudFgiLCAiX2V2ZW50SXNQb2ludGVyUGVuVG91Y2giLCAiX2VuZCIsICJfaGFuZGxlU3dpcGUiLCAiX21vdmUiLCAiYWJzRGVsdGFYIiwgImFicyIsICJkaXJlY3Rpb24iLCAiYWRkIiwgInBvaW50ZXJUeXBlIiwgIm5hdmlnYXRvciIsICJtYXhUb3VjaFBvaW50cyIsICJBUlJPV19MRUZUX0tFWSIsICJBUlJPV19SSUdIVF9LRVkiLCAiVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCIsICJPUkRFUl9ORVhUIiwgIk9SREVSX1BSRVYiLCAiRElSRUNUSU9OX0xFRlQiLCAiRElSRUNUSU9OX1JJR0hUIiwgIkVWRU5UX1NMSURFIiwgIkVWRU5UX1NMSUQiLCAiRVZFTlRfS0VZRE9XTiIsICJFVkVOVF9NT1VTRUVOVEVSIiwgIkVWRU5UX01PVVNFTEVBVkUiLCAiRVZFTlRfRFJBR19TVEFSVCIsICJFVkVOVF9MT0FEX0RBVEFfQVBJIiwgIkNMQVNTX05BTUVfQ0FST1VTRUwiLCAiQ0xBU1NfTkFNRV9TTElERSIsICJDTEFTU19OQU1FX0VORCIsICJDTEFTU19OQU1FX1NUQVJUIiwgIkNMQVNTX05BTUVfTkVYVCIsICJDTEFTU19OQU1FX1BSRVYiLCAiU0VMRUNUT1JfQUNUSVZFIiwgIlNFTEVDVE9SX0lURU0iLCAiU0VMRUNUT1JfQUNUSVZFX0lURU0iLCAiU0VMRUNUT1JfSVRFTV9JTUciLCAiU0VMRUNUT1JfSU5ESUNBVE9SUyIsICJTRUxFQ1RPUl9EQVRBX1NMSURFIiwgIlNFTEVDVE9SX0RBVEFfUklERSIsICJLRVlfVE9fRElSRUNUSU9OIiwgImludGVydmFsIiwgImtleWJvYXJkIiwgInBhdXNlIiwgInJpZGUiLCAidG91Y2giLCAid3JhcCIsICJDYXJvdXNlbCIsICJfaW50ZXJ2YWwiLCAiX2FjdGl2ZUVsZW1lbnQiLCAiX2lzU2xpZGluZyIsICJ0b3VjaFRpbWVvdXQiLCAiX3N3aXBlSGVscGVyIiwgIl9pbmRpY2F0b3JzRWxlbWVudCIsICJfYWRkRXZlbnRMaXN0ZW5lcnMiLCAiY3ljbGUiLCAiX3NsaWRlIiwgIm5leHRXaGVuVmlzaWJsZSIsICJoaWRkZW4iLCAiX2NsZWFySW50ZXJ2YWwiLCAiX3VwZGF0ZUludGVydmFsIiwgInNldEludGVydmFsIiwgIl9tYXliZUVuYWJsZUN5Y2xlIiwgInRvIiwgIml0ZW1zIiwgIl9nZXRJdGVtcyIsICJhY3RpdmVJbmRleCIsICJfZ2V0SXRlbUluZGV4IiwgIl9nZXRBY3RpdmUiLCAib3JkZXIiLCAiZGVmYXVsdEludGVydmFsIiwgIl9rZXlkb3duIiwgIl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzIiwgImltZyIsICJlbmRDYWxsQmFjayIsICJjbGVhclRpbWVvdXQiLCAic3dpcGVDb25maWciLCAiX2RpcmVjdGlvblRvT3JkZXIiLCAiX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQiLCAiYWN0aXZlSW5kaWNhdG9yIiwgIm5ld0FjdGl2ZUluZGljYXRvciIsICJlbGVtZW50SW50ZXJ2YWwiLCAicGFyc2VJbnQiLCAiaXNOZXh0IiwgIm5leHRFbGVtZW50IiwgIm5leHRFbGVtZW50SW5kZXgiLCAidHJpZ2dlckV2ZW50IiwgIl9vcmRlclRvRGlyZWN0aW9uIiwgInNsaWRlRXZlbnQiLCAiaXNDeWNsaW5nIiwgImRpcmVjdGlvbmFsQ2xhc3NOYW1lIiwgIm9yZGVyQ2xhc3NOYW1lIiwgImNvbXBsZXRlQ2FsbEJhY2siLCAiX2lzQW5pbWF0ZWQiLCAiY2xlYXJJbnRlcnZhbCIsICJjYXJvdXNlbCIsICJzbGlkZUluZGV4IiwgImNhcm91c2VscyIsICJFVkVOVF9TSE9XIiwgIkVWRU5UX1NIT1dOIiwgIkVWRU5UX0hJREUiLCAiRVZFTlRfSElEREVOIiwgIkNMQVNTX05BTUVfQ09MTEFQU0UiLCAiQ0xBU1NfTkFNRV9DT0xMQVBTSU5HIiwgIkNMQVNTX05BTUVfQ09MTEFQU0VEIiwgIkNMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOIiwgIkNMQVNTX05BTUVfSE9SSVpPTlRBTCIsICJXSURUSCIsICJIRUlHSFQiLCAiU0VMRUNUT1JfQUNUSVZFUyIsICJwYXJlbnQiLCAiQ29sbGFwc2UiLCAiX2lzVHJhbnNpdGlvbmluZyIsICJfdHJpZ2dlckFycmF5IiwgInRvZ2dsZUxpc3QiLCAiZWxlbSIsICJmaWx0ZXJFbGVtZW50IiwgImZvdW5kRWxlbWVudCIsICJfaW5pdGlhbGl6ZUNoaWxkcmVuIiwgIl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MiLCAiX2lzU2hvd24iLCAiaGlkZSIsICJzaG93IiwgImFjdGl2ZUNoaWxkcmVuIiwgIl9nZXRGaXJzdExldmVsQ2hpbGRyZW4iLCAic3RhcnRFdmVudCIsICJhY3RpdmVJbnN0YW5jZSIsICJkaW1lbnNpb24iLCAiX2dldERpbWVuc2lvbiIsICJzdHlsZSIsICJjb21wbGV0ZSIsICJjYXBpdGFsaXplZERpbWVuc2lvbiIsICJzY3JvbGxTaXplIiwgImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsICJzZWxlY3RlZCIsICJ0cmlnZ2VyQXJyYXkiLCAiaXNPcGVuIiwgIkVTQ0FQRV9LRVkiLCAiVEFCX0tFWSIsICJBUlJPV19VUF9LRVkiLCAiQVJST1dfRE9XTl9LRVkiLCAiUklHSFRfTU9VU0VfQlVUVE9OIiwgIkVWRU5UX0tFWURPV05fREFUQV9BUEkiLCAiRVZFTlRfS0VZVVBfREFUQV9BUEkiLCAiQ0xBU1NfTkFNRV9EUk9QVVAiLCAiQ0xBU1NfTkFNRV9EUk9QRU5EIiwgIkNMQVNTX05BTUVfRFJPUFNUQVJUIiwgIkNMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiIsICJDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsICJTRUxFQ1RPUl9NRU5VIiwgIlNFTEVDVE9SX05BVkJBUiIsICJTRUxFQ1RPUl9OQVZCQVJfTkFWIiwgIlNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMiLCAiUExBQ0VNRU5UX1RPUCIsICJQTEFDRU1FTlRfVE9QRU5EIiwgIlBMQUNFTUVOVF9CT1RUT00iLCAiUExBQ0VNRU5UX0JPVFRPTUVORCIsICJQTEFDRU1FTlRfUklHSFQiLCAiUExBQ0VNRU5UX0xFRlQiLCAiUExBQ0VNRU5UX1RPUENFTlRFUiIsICJQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSIiwgImF1dG9DbG9zZSIsICJib3VuZGFyeSIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJwb3BwZXJDb25maWciLCAicmVmZXJlbmNlIiwgIkRyb3Bkb3duIiwgIl9wb3BwZXIiLCAiX3BhcmVudCIsICJfbWVudSIsICJfaW5OYXZiYXIiLCAiX2RldGVjdE5hdmJhciIsICJzaG93RXZlbnQiLCAiX2NyZWF0ZVBvcHBlciIsICJmb2N1cyIsICJfY29tcGxldGVIaWRlIiwgImRlc3Ryb3kiLCAidXBkYXRlIiwgImhpZGVFdmVudCIsICJQb3BwZXIiLCAicmVmZXJlbmNlRWxlbWVudCIsICJfZ2V0UG9wcGVyQ29uZmlnIiwgImNyZWF0ZVBvcHBlciIsICJfZ2V0UGxhY2VtZW50IiwgInBhcmVudERyb3Bkb3duIiwgImlzRW5kIiwgIl9nZXRPZmZzZXQiLCAicG9wcGVyRGF0YSIsICJkZWZhdWx0QnNQb3BwZXJDb25maWciLCAicGxhY2VtZW50IiwgIm1vZGlmaWVycyIsICJvcHRpb25zIiwgImVuYWJsZWQiLCAiX3NlbGVjdE1lbnVJdGVtIiwgImNsZWFyTWVudXMiLCAib3BlblRvZ2dsZXMiLCAiY29udGV4dCIsICJjb21wb3NlZFBhdGgiLCAiaXNNZW51VGFyZ2V0IiwgImRhdGFBcGlLZXlkb3duSGFuZGxlciIsICJpc0lucHV0IiwgImlzRXNjYXBlRXZlbnQiLCAiaXNVcE9yRG93bkV2ZW50IiwgImdldFRvZ2dsZUJ1dHRvbiIsICJzdG9wUHJvcGFnYXRpb24iLCAiRVZFTlRfTU9VU0VET1dOIiwgImNsYXNzTmFtZSIsICJjbGlja0NhbGxiYWNrIiwgInJvb3RFbGVtZW50IiwgIkJhY2tkcm9wIiwgIl9pc0FwcGVuZGVkIiwgIl9hcHBlbmQiLCAiX2dldEVsZW1lbnQiLCAiX2VtdWxhdGVBbmltYXRpb24iLCAiYmFja2Ryb3AiLCAiY3JlYXRlRWxlbWVudCIsICJhcHBlbmQiLCAiRVZFTlRfRk9DVVNJTiIsICJFVkVOVF9LRVlET1dOX1RBQiIsICJUQUJfTkFWX0ZPUldBUkQiLCAiVEFCX05BVl9CQUNLV0FSRCIsICJhdXRvZm9jdXMiLCAidHJhcEVsZW1lbnQiLCAiRm9jdXNUcmFwIiwgIl9pc0FjdGl2ZSIsICJfbGFzdFRhYk5hdkRpcmVjdGlvbiIsICJhY3RpdmF0ZSIsICJfaGFuZGxlRm9jdXNpbiIsICJfaGFuZGxlS2V5ZG93biIsICJkZWFjdGl2YXRlIiwgImVsZW1lbnRzIiwgInNoaWZ0S2V5IiwgIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCAiU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQiLCAiUFJPUEVSVFlfUEFERElORyIsICJQUk9QRVJUWV9NQVJHSU4iLCAiU2Nyb2xsQmFySGVscGVyIiwgImdldFdpZHRoIiwgImRvY3VtZW50V2lkdGgiLCAiY2xpZW50V2lkdGgiLCAiaW5uZXJXaWR0aCIsICJ3aWR0aCIsICJfZGlzYWJsZU92ZXJGbG93IiwgIl9zZXRFbGVtZW50QXR0cmlidXRlcyIsICJjYWxjdWxhdGVkVmFsdWUiLCAicmVzZXQiLCAiX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCAiaXNPdmVyZmxvd2luZyIsICJfc2F2ZUluaXRpYWxBdHRyaWJ1dGUiLCAib3ZlcmZsb3ciLCAic3R5bGVQcm9wZXJ0eSIsICJzY3JvbGxiYXJXaWR0aCIsICJtYW5pcHVsYXRpb25DYWxsQmFjayIsICJzZXRQcm9wZXJ0eSIsICJfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayIsICJhY3R1YWxWYWx1ZSIsICJyZW1vdmVQcm9wZXJ0eSIsICJjYWxsQmFjayIsICJFVkVOVF9ISURFX1BSRVZFTlRFRCIsICJFVkVOVF9SRVNJWkUiLCAiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsICJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsICJFVkVOVF9LRVlET1dOX0RJU01JU1MiLCAiQ0xBU1NfTkFNRV9PUEVOIiwgIkNMQVNTX05BTUVfU1RBVElDIiwgIk9QRU5fU0VMRUNUT1IiLCAiU0VMRUNUT1JfRElBTE9HIiwgIlNFTEVDVE9SX01PREFMX0JPRFkiLCAiTW9kYWwiLCAiX2RpYWxvZyIsICJfYmFja2Ryb3AiLCAiX2luaXRpYWxpemVCYWNrRHJvcCIsICJfZm9jdXN0cmFwIiwgIl9pbml0aWFsaXplRm9jdXNUcmFwIiwgIl9zY3JvbGxCYXIiLCAiX2FkanVzdERpYWxvZyIsICJfc2hvd0VsZW1lbnQiLCAiX2hpZGVNb2RhbCIsICJoYW5kbGVVcGRhdGUiLCAic2Nyb2xsVG9wIiwgIm1vZGFsQm9keSIsICJ0cmFuc2l0aW9uQ29tcGxldGUiLCAiX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24iLCAiZXZlbnQyIiwgIl9yZXNldEFkanVzdG1lbnRzIiwgImlzTW9kYWxPdmVyZmxvd2luZyIsICJzY3JvbGxIZWlnaHQiLCAiY2xpZW50SGVpZ2h0IiwgImluaXRpYWxPdmVyZmxvd1kiLCAib3ZlcmZsb3dZIiwgImlzQm9keU92ZXJmbG93aW5nIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIsICJhbHJlYWR5T3BlbiIsICJDTEFTU19OQU1FX1NIT1dJTkciLCAiQ0xBU1NfTkFNRV9ISURJTkciLCAiQ0xBU1NfTkFNRV9CQUNLRFJPUCIsICJzY3JvbGwiLCAiT2ZmY2FudmFzIiwgImJsdXIiLCAiY29tcGxldGVDYWxsYmFjayIsICJwb3NpdGlvbiIsICJBUklBX0FUVFJJQlVURV9QQVRURVJOIiwgIkRlZmF1bHRBbGxvd2xpc3QiLCAiYSIsICJhcmVhIiwgImIiLCAiYnIiLCAiY29sIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwgImVtIiwgImhyIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgImkiLCAibGkiLCAib2wiLCAicCIsICJwcmUiLCAicyIsICJzbWFsbCIsICJzcGFuIiwgInN1YiIsICJzdXAiLCAic3Ryb25nIiwgInUiLCAidWwiLCAidXJpQXR0cmlidXRlcyIsICJTQUZFX1VSTF9QQVRURVJOIiwgImFsbG93ZWRBdHRyaWJ1dGUiLCAiYXR0cmlidXRlIiwgImFsbG93ZWRBdHRyaWJ1dGVMaXN0IiwgImF0dHJpYnV0ZU5hbWUiLCAibm9kZU5hbWUiLCAibm9kZVZhbHVlIiwgImF0dHJpYnV0ZVJlZ2V4IiwgInNvbWUiLCAicmVnZXgiLCAic2FuaXRpemVIdG1sIiwgInVuc2FmZUh0bWwiLCAiYWxsb3dMaXN0IiwgInNhbml0aXplRnVuY3Rpb24iLCAiZG9tUGFyc2VyIiwgIkRPTVBhcnNlciIsICJjcmVhdGVkRG9jdW1lbnQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImVsZW1lbnROYW1lIiwgImF0dHJpYnV0ZUxpc3QiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiaW5uZXJIVE1MIiwgImNvbnRlbnQiLCAiZXh0cmFDbGFzcyIsICJodG1sIiwgInNhbml0aXplIiwgInNhbml0aXplRm4iLCAidGVtcGxhdGUiLCAiRGVmYXVsdENvbnRlbnRUeXBlIiwgImVudHJ5IiwgIlRlbXBsYXRlRmFjdG9yeSIsICJnZXRDb250ZW50IiwgIl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbiIsICJoYXNDb250ZW50IiwgImNoYW5nZUNvbnRlbnQiLCAiX2NoZWNrQ29udGVudCIsICJ0b0h0bWwiLCAidGVtcGxhdGVXcmFwcGVyIiwgIl9tYXliZVNhbml0aXplIiwgInRleHQiLCAiX3NldENvbnRlbnQiLCAiYXJnIiwgInRlbXBsYXRlRWxlbWVudCIsICJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCAidGV4dENvbnRlbnQiLCAiRElTQUxMT1dFRF9BVFRSSUJVVEVTIiwgIkNMQVNTX05BTUVfTU9EQUwiLCAiU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiIsICJTRUxFQ1RPUl9NT0RBTCIsICJFVkVOVF9NT0RBTF9ISURFIiwgIlRSSUdHRVJfSE9WRVIiLCAiVFJJR0dFUl9GT0NVUyIsICJUUklHR0VSX0NMSUNLIiwgIlRSSUdHRVJfTUFOVUFMIiwgIkVWRU5UX0lOU0VSVEVEIiwgIkVWRU5UX0NMSUNLIiwgIkVWRU5UX0ZPQ1VTT1VUIiwgIkF0dGFjaG1lbnRNYXAiLCAiQVVUTyIsICJUT1AiLCAiUklHSFQiLCAiQk9UVE9NIiwgIkxFRlQiLCAiYW5pbWF0aW9uIiwgImNvbnRhaW5lciIsICJjdXN0b21DbGFzcyIsICJkZWxheSIsICJmYWxsYmFja1BsYWNlbWVudHMiLCAidGl0bGUiLCAiVG9vbHRpcCIsICJfaXNFbmFibGVkIiwgIl90aW1lb3V0IiwgIl9pc0hvdmVyZWQiLCAiX2FjdGl2ZVRyaWdnZXIiLCAiX3RlbXBsYXRlRmFjdG9yeSIsICJfbmV3Q29udGVudCIsICJ0aXAiLCAiX3NldExpc3RlbmVycyIsICJfZml4VGl0bGUiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidG9nZ2xlRW5hYmxlZCIsICJjbGljayIsICJfbGVhdmUiLCAiX2VudGVyIiwgIl9oaWRlTW9kYWxIYW5kbGVyIiwgIl9kaXNwb3NlUG9wcGVyIiwgIl9pc1dpdGhDb250ZW50IiwgInNoYWRvd1Jvb3QiLCAiaXNJblRoZURvbSIsICJvd25lckRvY3VtZW50IiwgIl9nZXRUaXBFbGVtZW50IiwgIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwgIl9nZXRUaXRsZSIsICJfY3JlYXRlVGlwRWxlbWVudCIsICJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwgIl9nZXRUZW1wbGF0ZUZhY3RvcnkiLCAidGlwSWQiLCAic2V0Q29udGVudCIsICJfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0IiwgIl9nZXREZWxlZ2F0ZUNvbmZpZyIsICJhdHRhY2htZW50IiwgInBoYXNlIiwgInN0YXRlIiwgInRyaWdnZXJzIiwgImV2ZW50SW4iLCAiZXZlbnRPdXQiLCAiX3NldFRpbWVvdXQiLCAidGltZW91dCIsICJkYXRhQXR0cmlidXRlcyIsICJkYXRhQXR0cmlidXRlIiwgIlNFTEVDVE9SX1RJVExFIiwgIlNFTEVDVE9SX0NPTlRFTlQiLCAiUG9wb3ZlciIsICJfZ2V0Q29udGVudCIsICJFVkVOVF9BQ1RJVkFURSIsICJDTEFTU19OQU1FX0RST1BET1dOX0lURU0iLCAiU0VMRUNUT1JfREFUQV9TUFkiLCAiU0VMRUNUT1JfVEFSR0VUX0xJTktTIiwgIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwgIlNFTEVDVE9SX05BVl9MSU5LUyIsICJTRUxFQ1RPUl9OQVZfSVRFTVMiLCAiU0VMRUNUT1JfTElTVF9JVEVNUyIsICJTRUxFQ1RPUl9MSU5LX0lURU1TIiwgIlNFTEVDVE9SX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJyb290TWFyZ2luIiwgInNtb290aFNjcm9sbCIsICJ0aHJlc2hvbGQiLCAiU2Nyb2xsU3B5IiwgIl90YXJnZXRMaW5rcyIsICJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwgIl9yb290RWxlbWVudCIsICJfYWN0aXZlVGFyZ2V0IiwgIl9vYnNlcnZlciIsICJfcHJldmlvdXNTY3JvbGxEYXRhIiwgInZpc2libGVFbnRyeVRvcCIsICJwYXJlbnRTY3JvbGxUb3AiLCAicmVmcmVzaCIsICJfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcyIsICJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCAiZGlzY29ubmVjdCIsICJfZ2V0TmV3T2JzZXJ2ZXIiLCAic2VjdGlvbiIsICJvYnNlcnZlIiwgIm9ic2VydmFibGVTZWN0aW9uIiwgImhhc2giLCAiaGVpZ2h0IiwgIm9mZnNldFRvcCIsICJzY3JvbGxUbyIsICJ0b3AiLCAiYmVoYXZpb3IiLCAiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCAiX29ic2VydmVyQ2FsbGJhY2siLCAidGFyZ2V0RWxlbWVudCIsICJfcHJvY2VzcyIsICJ1c2VyU2Nyb2xsc0Rvd24iLCAiaXNJbnRlcnNlY3RpbmciLCAiX2NsZWFyQWN0aXZlQ2xhc3MiLCAiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwgInRhcmdldExpbmtzIiwgImFuY2hvciIsICJkZWNvZGVVUkkiLCAiX2FjdGl2YXRlUGFyZW50cyIsICJsaXN0R3JvdXAiLCAiaXRlbSIsICJhY3RpdmVOb2RlcyIsICJub2RlIiwgInNweSIsICJIT01FX0tFWSIsICJFTkRfS0VZIiwgIkNMQVNTX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCAiTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJTRUxFQ1RPUl9UQUJfUEFORUwiLCAiU0VMRUNUT1JfT1VURVIiLCAiU0VMRUNUT1JfSU5ORVIiLCAiU0VMRUNUT1JfSU5ORVJfRUxFTSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUiLCAiVGFiIiwgIl9zZXRJbml0aWFsQXR0cmlidXRlcyIsICJfZ2V0Q2hpbGRyZW4iLCAiaW5uZXJFbGVtIiwgIl9lbGVtSXNBY3RpdmUiLCAiYWN0aXZlIiwgIl9nZXRBY3RpdmVFbGVtIiwgIl9kZWFjdGl2YXRlIiwgIl9hY3RpdmF0ZSIsICJyZWxhdGVkRWxlbSIsICJfdG9nZ2xlRHJvcERvd24iLCAibmV4dEFjdGl2ZUVsZW1lbnQiLCAicHJldmVudFNjcm9sbCIsICJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCIsICJfZ2V0SW5uZXJFbGVtZW50IiwgImlzQWN0aXZlIiwgIm91dGVyRWxlbSIsICJfZ2V0T3V0ZXJFbGVtZW50IiwgIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCAib3BlbiIsICJFVkVOVF9NT1VTRU9WRVIiLCAiRVZFTlRfTU9VU0VPVVQiLCAiQ0xBU1NfTkFNRV9ISURFIiwgImF1dG9oaWRlIiwgIlRvYXN0IiwgIl9oYXNNb3VzZUludGVyYWN0aW9uIiwgIl9oYXNLZXlib2FyZEludGVyYWN0aW9uIiwgIl9jbGVhclRpbWVvdXQiLCAiX21heWJlU2NoZWR1bGVIaWRlIiwgImlzU2hvd24iLCAiX29uSW50ZXJhY3Rpb24iLCAiaXNJbnRlcmFjdGluZyJdCn0K
diff --git a/public/learn b/public/learn
deleted file mode 100644
index e69de29b..00000000
diff --git a/public/main.css.map b/public/main.css.map
deleted file mode 100644
index 9b437eba..00000000
--- a/public/main.css.map
+++ /dev/null
@@ -1,243 +0,0 @@
-{
- "version": 3,
- "file": "main.css",
- "sourceRoot": "/Users/Jimi/Desktop/Personal/wth-docs-lab",
- "sources": [
- "node_modules/@thulite/doks-core/assets/scss/app.scss",
- "node_modules/bootstrap/scss/_functions.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_colors.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_variables-overrides.scss",
- "assets/scss/common/_variables-custom.scss",
- "node_modules/bootstrap/scss/_variables.scss",
- "node_modules/bootstrap/scss/_variables-dark.scss",
- "node_modules/bootstrap/scss/_variables-dark.scss",
- "node_modules/bootstrap/scss/_maps.scss",
- "node_modules/bootstrap/scss/_mixins.scss",
- "node_modules/bootstrap/scss/vendor/_rfs.scss",
- "node_modules/bootstrap/scss/mixins/_deprecate.scss",
- "node_modules/bootstrap/scss/mixins/_breakpoints.scss",
- "node_modules/bootstrap/scss/mixins/_color-mode.scss",
- "node_modules/bootstrap/scss/mixins/_color-scheme.scss",
- "node_modules/bootstrap/scss/mixins/_image.scss",
- "node_modules/bootstrap/scss/mixins/_resize.scss",
- "node_modules/bootstrap/scss/mixins/_visually-hidden.scss",
- "node_modules/bootstrap/scss/mixins/_reset-text.scss",
- "node_modules/bootstrap/scss/mixins/_text-truncate.scss",
- "node_modules/bootstrap/scss/mixins/_utilities.scss",
- "node_modules/bootstrap/scss/mixins/_backdrop.scss",
- "node_modules/bootstrap/scss/mixins/_buttons.scss",
- "node_modules/bootstrap/scss/mixins/_caret.scss",
- "node_modules/bootstrap/scss/mixins/_pagination.scss",
- "node_modules/bootstrap/scss/mixins/_lists.scss",
- "node_modules/bootstrap/scss/mixins/_forms.scss",
- "node_modules/bootstrap/scss/mixins/_table-variants.scss",
- "node_modules/bootstrap/scss/mixins/_border-radius.scss",
- "node_modules/bootstrap/scss/mixins/_box-shadow.scss",
- "node_modules/bootstrap/scss/mixins/_gradients.scss",
- "node_modules/bootstrap/scss/mixins/_transition.scss",
- "node_modules/bootstrap/scss/mixins/_clearfix.scss",
- "node_modules/bootstrap/scss/mixins/_container.scss",
- "node_modules/bootstrap/scss/mixins/_grid.scss",
- "node_modules/bootstrap/scss/_root.scss",
- "node_modules/bootstrap/scss/_utilities.scss",
- "node_modules/bootstrap/scss/_reboot.scss",
- "node_modules/bootstrap/scss/_type.scss",
- "node_modules/bootstrap/scss/_images.scss",
- "node_modules/bootstrap/scss/_containers.scss",
- "node_modules/bootstrap/scss/_grid.scss",
- "node_modules/bootstrap/scss/_helpers.scss",
- "node_modules/bootstrap/scss/helpers/_clearfix.scss",
- "node_modules/bootstrap/scss/helpers/_color-bg.scss",
- "node_modules/bootstrap/scss/helpers/_colored-links.scss",
- "node_modules/bootstrap/scss/helpers/_focus-ring.scss",
- "node_modules/bootstrap/scss/helpers/_icon-link.scss",
- "node_modules/bootstrap/scss/helpers/_ratio.scss",
- "node_modules/bootstrap/scss/helpers/_position.scss",
- "node_modules/bootstrap/scss/helpers/_stacks.scss",
- "node_modules/bootstrap/scss/helpers/_visually-hidden.scss",
- "node_modules/bootstrap/scss/helpers/_stretched-link.scss",
- "node_modules/bootstrap/scss/helpers/_text-truncation.scss",
- "node_modules/bootstrap/scss/helpers/_vr.scss",
- "node_modules/bootstrap/scss/_tables.scss",
- "node_modules/bootstrap/scss/_forms.scss",
- "node_modules/bootstrap/scss/forms/_labels.scss",
- "node_modules/bootstrap/scss/forms/_form-text.scss",
- "node_modules/bootstrap/scss/forms/_form-control.scss",
- "node_modules/bootstrap/scss/forms/_form-select.scss",
- "node_modules/bootstrap/scss/forms/_form-check.scss",
- "node_modules/bootstrap/scss/forms/_form-range.scss",
- "node_modules/bootstrap/scss/forms/_floating-labels.scss",
- "node_modules/bootstrap/scss/forms/_input-group.scss",
- "node_modules/bootstrap/scss/forms/_validation.scss",
- "node_modules/bootstrap/scss/_buttons.scss",
- "node_modules/bootstrap/scss/_transitions.scss",
- "node_modules/bootstrap/scss/_dropdown.scss",
- "node_modules/bootstrap/scss/_button-group.scss",
- "node_modules/bootstrap/scss/_nav.scss",
- "node_modules/bootstrap/scss/_navbar.scss",
- "node_modules/bootstrap/scss/_card.scss",
- "node_modules/bootstrap/scss/_accordion.scss",
- "node_modules/bootstrap/scss/_breadcrumb.scss",
- "node_modules/bootstrap/scss/_pagination.scss",
- "node_modules/bootstrap/scss/_badge.scss",
- "node_modules/bootstrap/scss/_alert.scss",
- "node_modules/bootstrap/scss/_progress.scss",
- "node_modules/bootstrap/scss/_list-group.scss",
- "node_modules/bootstrap/scss/_close.scss",
- "node_modules/bootstrap/scss/_toasts.scss",
- "node_modules/bootstrap/scss/_modal.scss",
- "node_modules/bootstrap/scss/_tooltip.scss",
- "node_modules/bootstrap/scss/_popover.scss",
- "node_modules/bootstrap/scss/_carousel.scss",
- "node_modules/bootstrap/scss/_spinners.scss",
- "node_modules/bootstrap/scss/_offcanvas.scss",
- "node_modules/bootstrap/scss/_placeholders.scss",
- "node_modules/bootstrap/scss/utilities/_api.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_fonts.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_global.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_syntax.scss",
- "node_modules/@thulite/doks-core/assets/scss/common/_dark.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_alerts.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_buttons.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_callouts.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_expressive-code.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_code.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_comments.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_details.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_forms.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_images.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_mermaid.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_modals.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_search.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_section-nav.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_steps.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_tables.scss",
- "node_modules/@thulite/doks-core/assets/scss/components/_tabs.scss",
- "node_modules/@thulite/doks-core/assets/scss/layouts/_footer.scss",
- "node_modules/@thulite/doks-core/assets/scss/layouts/_header.scss",
- "node_modules/@thulite/doks-core/assets/scss/layouts/_pages.scss",
- "node_modules/@thulite/doks-core/assets/scss/layouts/_posts.scss",
- "node_modules/@thulite/doks-core/assets/scss/layouts/_sidebar.scss",
- "assets/scss/common/_custom.scss"
- ],
- "sourcesContent": [
- "// Source: https://getbootstrap.com/docs/5.3/customize/sass/#importing\n\n// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)\n@import \"bootstrap/scss/functions\";\n\n// 2. Include any default variable overrides here\n@import \"common/colors\";\n@import \"common/variables-overrides\";\n@import \"common/variables-custom\";\n\n// 3. Include remainder of required Bootstrap stylesheets (including any separate color mode stylesheets)\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n\n// 4. Include any default map overrides here\n\n// 5. Include remainder of required parts\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/root\";\n\n// 6. Optionally include any other parts as needed\n\n// Layout & components\n@import \"bootstrap/scss/utilities\";\n@import \"bootstrap/scss/reboot\";\n@import \"bootstrap/scss/type\";\n@import \"bootstrap/scss/images\";\n@import \"bootstrap/scss/containers\";\n@import \"bootstrap/scss/grid\";\n@import \"bootstrap/scss/helpers\";\n@import \"bootstrap/scss/tables\";\n@import \"bootstrap/scss/forms\";\n@import \"bootstrap/scss/buttons\";\n@import \"bootstrap/scss/transitions\";\n@import \"bootstrap/scss/dropdown\";\n@import \"bootstrap/scss/button-group\";\n@import \"bootstrap/scss/nav\";\n@import \"bootstrap/scss/navbar\";\n@import \"bootstrap/scss/card\";\n@import \"bootstrap/scss/accordion\";\n@import \"bootstrap/scss/breadcrumb\";\n@import \"bootstrap/scss/pagination\";\n@import \"bootstrap/scss/badge\";\n@import \"bootstrap/scss/alert\";\n@import \"bootstrap/scss/progress\";\n@import \"bootstrap/scss/list-group\";\n@import \"bootstrap/scss/close\";\n@import \"bootstrap/scss/toasts\";\n@import \"bootstrap/scss/modal\";\n@import \"bootstrap/scss/tooltip\";\n@import \"bootstrap/scss/popover\";\n@import \"bootstrap/scss/carousel\";\n@import \"bootstrap/scss/spinners\";\n@import \"bootstrap/scss/offcanvas\";\n@import \"bootstrap/scss/placeholders\";\n\n// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`\n@import \"bootstrap/scss/utilities/api\";\n\n// 8. Add additional custom code here\n@import \"common/fonts\";\n@import \"common/global\";\n@import \"common/syntax\";\n@import \"common/dark\";\n@import \"components/alerts\";\n@import \"components/buttons\";\n@import \"components/callouts\";\n@import \"components/expressive-code\";\n@import \"components/code\";\n@import \"components/comments\";\n@import \"components/details\";\n@import \"components/forms\";\n@import \"components/images\";\n@import \"components/mermaid\";\n@import \"components/modals\";\n@import \"components/search\";\n@import \"components/section-nav\";\n@import \"components/steps\";\n@import \"components/tables\";\n@import \"components/tabs\";\n@import \"layouts/footer\";\n@import \"layouts/header\";\n@import \"layouts/pages\";\n@import \"layouts/posts\";\n@import \"layouts/sidebar\";\n\n/*\nbody {\n background-color: {{ site.Params.doks.backGround }};\n}\n*/\n\n// 9. Custom styles\n@import \"common/custom\";\n",
- "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Colors\n@function to-rgb($value) {\n @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n @if $identifier == \"body\" and $target == \"bg\" {\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n } @if $identifier == \"body\" and $target == \"text\" {\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n } @else {\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n }\n}\n\n@function map-loop($map, $func, $args...) {\n $_map: ();\n\n @each $key, $value in $map {\n // allow to pass the $key and $value of the map as an function argument\n $_args: ();\n @each $arg in $args {\n $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n }\n\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n }\n\n @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n $result: null;\n @each $entry in $list {\n $result: append($result, var(--#{$prefix}#{$entry}), space);\n }\n @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n $merged-maps: ();\n\n @each $map in $maps {\n $merged-maps: map-merge($merged-maps, $map);\n }\n @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.1 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n",
- "// Doks color scheme\n\n// Light mode\n\n/* Bluish cyan */\n$db-bluishCyan-100: #1d2d35;\n\n/* Gray */\n$db-gray-100: #ffffff;\n$db-gray-200: #fcf8f2;\n$db-gray-300: #f3f3f3;\n$db-gray-400: #efebf3;\n$db-gray-500: #e6e6e6;\n$db-gray-600: #d9d9d9;\n$db-gray-700: #808080;\n$db-gray-800: #666666;\n\n/* Yellow */\n$db-yellow-100: #fffce6;\n$db-yellow-200: #fff9cc;\n$db-yellow-300: #fff6b3;\n$db-yellow-400: #fff399;\n$db-yellow-500: #fff080;\n$db-yellow-600: #ffea4d;\n$db-yellow-700: #ffe733;\n$db-yellow-800: #ffe41a;\n$db-yellow-900: #ffe000;\n\n/* Khaki */\n$db-khaki-100: #fbf7f0;\n$db-khaki-200: #dcccaf;\n$db-khaki-300: #aa9c84;\n\n/* Purple */\n$db-purple-100: #cfc1db;\n$db-purple-200: #8e6eab;\n$db-purple-300: #5d2f86;\n\n/* Vermilion */\n$db-vermilion-100: #e55235;\n\n:root[data-bs-theme=\"light\"],\n[data-bs-theme=\"light\"] ::backdrop {\n --sl-color-white: hsl(224, 10%, 10%);\n --sl-color-gray-1: hsl(224, 14%, 16%);\n --sl-color-gray-2: hsl(224, 10%, 23%);\n --sl-color-gray-3: hsl(224, 7%, 36%);\n --sl-color-gray-4: hsl(224, 6%, 56%);\n --sl-color-gray-5: hsl(224, 6%, 77%);\n --sl-color-gray-6: hsl(224, 20%, 94%);\n --sl-color-gray-7: hsl(224, 19%, 97%);\n --sl-color-black: hsl(0, 0%, 100%);\n}\n\n// Dark mode\n\n:root,\n::backdrop {\n --sl-color-white: hsl(0, 0%, 100%);\n --sl-color-gray-1: hsl(224, 20%, 94%);\n --sl-color-gray-2: hsl(224, 6%, 77%);\n --sl-color-gray-3: hsl(224, 6%, 56%);\n --sl-color-gray-4: hsl(224, 7%, 36%);\n --sl-color-gray-5: hsl(224, 10%, 23%);\n --sl-color-gray-6: hsl(224, 14%, 16%);\n --sl-color-black: hsl(224, 10%, 10%);\n --sl-hue-orange: 41;\n --sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);\n --sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);\n --sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);\n --sl-hue-green: 101;\n --sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);\n --sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);\n --sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);\n --sl-hue-blue: 234;\n --sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);\n --sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);\n --sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);\n --sl-hue-purple: 281;\n --sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);\n --sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);\n --sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);\n --sl-hue-red: 339;\n --sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);\n --sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);\n --sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);\n --sl-color-accent-low: hsl(224, 54%, 20%);\n --sl-color-accent: hsl(224, 100%, 60%);\n --sl-color-accent-high: hsl(224, 100%, 85%);\n --sl-color-text: var(--sl-color-gray-2);\n --sl-color-text-accent: var(--sl-color-accent-high);\n --sl-color-text-invert: var(--sl-color-accent-low);\n --sl-color-bg: var(--sl-color-black);\n --sl-color-bg-nav: var(--sl-color-gray-6);\n --sl-color-bg-sidebar: var(--sl-color-gray-6);\n --sl-color-bg-inline-code: var(--sl-color-gray-5);\n --sl-color-hairline-light: var(--sl-color-gray-5);\n --sl-color-hairline: var(--sl-color-gray-6);\n --sl-color-hairline-shade: var(--sl-color-black);\n --sl-color-backdrop-overlay: hsla(223, 13%, 10%, 0.66);\n --sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, 0.12), 0px 2px 1px hsla(0, 0%, 0%, 0.24);\n --sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, 0.08), 0px 5px 2px hsla(0, 0%, 0%, 0.08), 0px 3px 2px hsla(0, 0%, 0%, 0.12), 0px 1px 1px hsla(0, 0%, 0%, 0.15);\n --sl-shadow-lg: 0px 25px 7px hsla(0, 0%, 0%, 0.03), 0px 16px 6px hsla(0, 0%, 0%, 0.1), 0px 9px 5px hsla(223, 13%, 10%, 0.33), 0px 4px 4px hsla(0, 0%, 0%, 0.75), 0px 4px 2px hsla(0, 0%, 0%, 0.25);\n --sl-text-xs: 0.8125rem;\n --sl-text-sm: 0.875rem;\n --sl-text-base: 1rem;\n --sl-text-lg: 1.125rem;\n --sl-text-xl: 1.25rem;\n --sl-text-2xl: 1.5rem;\n --sl-text-3xl: 1.8125rem;\n --sl-text-4xl: 2.1875rem;\n --sl-text-5xl: 2.625rem;\n --sl-text-6xl: 4rem;\n --sl-text-body: var(--sl-text-base);\n --sl-text-body-sm: var(--sl-text-xs);\n --sl-text-code: var(--sl-text-sm);\n --sl-text-code-sm: var(--sl-text-xs);\n --sl-text-h1: var(--sl-text-4xl);\n --sl-text-h2: var(--sl-text-3xl);\n --sl-text-h3: var(--sl-text-2xl);\n --sl-text-h4: var(--sl-text-xl);\n --sl-text-h5: var(--sl-text-lg);\n --sl-line-height: 1.8;\n --sl-line-height-headings: 1.2;\n --sl-font-system: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --__sl-font: var(--sl-font, \"\"), var(--sl-font-system);\n --__sl-font-mono: var(--sl-font-mono, \"\"), var(--sl-font-system-mono);\n --sl-nav-height: 3.5rem;\n --sl-nav-pad-x: 1rem;\n --sl-nav-pad-y: 0.75rem;\n --sl-mobile-toc-height: 3rem;\n --sl-sidebar-width: 18.75rem;\n --sl-sidebar-pad-x: 1rem;\n --sl-content-width: 45rem;\n --sl-content-pad-x: 1rem;\n --sl-menu-button-size: 2rem;\n --sl-nav-gap: var(--sl-content-pad-x);\n --sl-outline-offset-inside: -0.1875rem;\n --sl-z-index-toc: 4;\n --sl-z-index-menu: 5;\n --sl-z-index-navbar: 10;\n --sl-z-index-skiplink: 20;\n}\n\n:root {\n --purple-hsl: 255, 60%, 60%;\n --overlay-blurple: hsla(var(--purple-hsl), 0.2);\n}\n\n:root {\n --ec-brdRad: 0px;\n --ec-brdWd: 1px;\n --ec-brdCol: color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);\n --ec-codeFontFml: var(--__sl-font-mono);\n --ec-codeFontSize: var(--sl-text-code);\n --ec-codeFontWg: 400;\n --ec-codeLineHt: var(--sl-line-height);\n --ec-codePadBlk: 0.75rem;\n --ec-codePadInl: 1rem;\n --ec-codeBg: #011627;\n --ec-codeFg: #d6deeb;\n --ec-codeSelBg: #1d3b53;\n --ec-uiFontFml: var(--__sl-font);\n --ec-uiFontSize: 0.9rem;\n --ec-uiFontWg: 400;\n --ec-uiLineHt: 1.65;\n --ec-uiPadBlk: 0.25rem;\n --ec-uiPadInl: 1rem;\n --ec-uiSelBg: #234d708c;\n --ec-uiSelFg: #ffffff;\n --ec-focusBrd: #122d42;\n --ec-sbThumbCol: #ffffff17;\n --ec-sbThumbHoverCol: #ffffff49;\n --ec-tm-lineMarkerAccentMarg: 0rem;\n --ec-tm-lineMarkerAccentWd: 0.15rem;\n --ec-tm-lineDiffIndMargLeft: 0.25rem;\n --ec-tm-inlMarkerBrdWd: 1.5px;\n --ec-tm-inlMarkerBrdRad: 0.2rem;\n --ec-tm-inlMarkerPad: 0.15rem;\n --ec-tm-insDiffIndContent: \"+\";\n --ec-tm-delDiffIndContent: \"-\";\n --ec-tm-markBg: #ffffff17;\n --ec-tm-markBrdCol: #ffffff40;\n --ec-tm-insBg: #1e571599;\n --ec-tm-insBrdCol: #487f3bd0;\n --ec-tm-insDiffIndCol: #79b169d0;\n --ec-tm-delBg: #862d2799;\n --ec-tm-delBrdCol: #b4554bd0;\n --ec-tm-delDiffIndCol: #ed8779d0;\n --ec-frm-shdCol: #011627;\n --ec-frm-frameBoxShdCssVal: none;\n --ec-frm-edActTabBg: var(--sl-color-gray-6);\n --ec-frm-edActTabFg: var(--sl-color-text);\n --ec-frm-edActTabBrdCol: transparent;\n --ec-frm-edActTabIndHt: 1px;\n --ec-frm-edActTabIndTopCol: var(--sl-color-accent-high);\n --ec-frm-edActTabIndBtmCol: transparent;\n --ec-frm-edTabsMargInlStart: 0;\n --ec-frm-edTabsMargBlkStart: 0;\n --ec-frm-edTabBrdRad: 0px;\n --ec-frm-edTabBarBg: var(--sl-color-black);\n --ec-frm-edTabBarBrdCol: color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);\n --ec-frm-edTabBarBrdBtmCol: color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);\n --ec-frm-edBg: var(--sl-color-gray-6);\n --ec-frm-trmTtbDotsFg: color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);\n --ec-frm-trmTtbDotsOpa: 0.75;\n --ec-frm-trmTtbBg: var(--sl-color-black);\n --ec-frm-trmTtbFg: var(--sl-color-text);\n --ec-frm-trmTtbBrdBtmCol: color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);\n --ec-frm-trmBg: var(--sl-color-gray-6);\n --ec-frm-inlBtnFg: var(--sl-color-text);\n --ec-frm-inlBtnBg: var(--sl-color-text);\n --ec-frm-inlBtnBgIdleOpa: 0;\n --ec-frm-inlBtnBgHoverOrFocusOpa: 0.2;\n --ec-frm-inlBtnBgActOpa: 0.3;\n --ec-frm-inlBtnBrd: var(--sl-color-text);\n --ec-frm-inlBtnBrdOpa: 0.4;\n --ec-frm-tooltipSuccessBg: #158744;\n --ec-frm-tooltipSuccessFg: white;\n}\n",
- "$blue: hsl(234, 100%, 60%);\n$purple: hsl(281, 82%, 63%);\n$red: hsl(339, 82%, 63%);\n$yellow: hsl(41, 82%, 63%);\n$green: hsl(101, 82%, 63%);\n\n$primary: $db-purple-300;\n$info: $blue;\n\n$enable-negative-margins: true;\n\n$body-color: $db-bluishCyan-100;\n\n$link-decoration: none;\n$link-hover-decoration: underline;\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1240px,\n xxl: 1320px\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$grid-columns: 16;\n$grid-gutter-width: 3rem;\n\n$font-family-sans-serif:\n \"Jost\",\n system-ui,\n -apple-system,\n \"Segoe UI\",\n Roboto,\n \"Helvetica Neue\",\n \"Noto Sans\",\n \"Liberation Sans\",\n Arial,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\";\n\n$font-size-base: 1rem;\n$font-size-md: $font-size-base * 1.125;\n$font-size-xl: $font-size-base * 1.375;\n\n$headings-font-weight: 700;\n$headings-color: null;\n\n$lead-font-weight: 400;\n\n$input-btn-focus-width: 0;\n$input-btn-focus-box-shadow: none;\n\n$gray-200: #e9ecef;\n\n$card-border-color: $gray-200;\n\n$spacer: 1rem;\n\n$alert-padding-x: $spacer * 1.5;\n$alert-margin-bottom: 0;\n$alert-border-radius: 0;\n$alert-border-width: 0;\n\n$offcanvas-horizontal-width: 332px;\n\n// Dark color mode variables\n$light-bg-subtle-dark: hsl(224, 14%, 16%);\n$light-border-subtle-dark: hsl(224, 10%, 23%);\n\n$body-bg-dark: hsl(224, 10%, 10%);\n$body-overlay-dark: hsl(224, 14%, 16%);\n$border-dark: hsl(224, 14%, 16%);\n$body-color-dark: hsl(224, 6%, 77%);\n$headings-color-dark: hsl(0, 0%, 100%);\n$dots-dark: darken($body-color-dark, 50%);\n$link-color-dark: hsl(224, 100%, 85%);\n$button-color-dark: $link-color-dark;\n$focus-color-dark: lighten($link-color-dark, 2.5%);\n\n$navbar-dark-color: $body-color-dark;\n$navbar-dark-hover-color: $link-color-dark;\n$navbar-dark-active-color: $link-color-dark;\n",
- "// Put your custom SCSS variables here\n",
- "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml, \") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml, \") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml, \") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml, \") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml, \") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml, \") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml, \") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml, \") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml, \") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml, \") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml, \") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n// fusv-disable\n$accordion-button-focus-border-color: $input-focus-border-color !default; // Deprecated in v5.3.3\n// fusv-enable\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml, \") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml, \") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml, \") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml, \") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml, \") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n\n@import \"variables-dark\"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3\n",
- "// Dark color mode variables\n//\n// Custom variables for the `[data-bs-theme=\"dark\"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need.\n\n//\n// Global colors\n//\n\n// scss-docs-start sass-dark-mode-vars\n// scss-docs-start theme-text-dark-variables\n$primary-text-emphasis-dark: tint-color($primary, 40%) !default;\n$secondary-text-emphasis-dark: tint-color($secondary, 40%) !default;\n$success-text-emphasis-dark: tint-color($success, 40%) !default;\n$info-text-emphasis-dark: tint-color($info, 40%) !default;\n$warning-text-emphasis-dark: tint-color($warning, 40%) !default;\n$danger-text-emphasis-dark: tint-color($danger, 40%) !default;\n$light-text-emphasis-dark: $gray-100 !default;\n$dark-text-emphasis-dark: $gray-300 !default;\n// scss-docs-end theme-text-dark-variables\n\n// scss-docs-start theme-bg-subtle-dark-variables\n$primary-bg-subtle-dark: shade-color($primary, 80%) !default;\n$secondary-bg-subtle-dark: shade-color($secondary, 80%) !default;\n$success-bg-subtle-dark: shade-color($success, 80%) !default;\n$info-bg-subtle-dark: shade-color($info, 80%) !default;\n$warning-bg-subtle-dark: shade-color($warning, 80%) !default;\n$danger-bg-subtle-dark: shade-color($danger, 80%) !default;\n$light-bg-subtle-dark: $gray-800 !default;\n$dark-bg-subtle-dark: mix($gray-800, $black) !default;\n// scss-docs-end theme-bg-subtle-dark-variables\n\n// scss-docs-start theme-border-subtle-dark-variables\n$primary-border-subtle-dark: shade-color($primary, 40%) !default;\n$secondary-border-subtle-dark: shade-color($secondary, 40%) !default;\n$success-border-subtle-dark: shade-color($success, 40%) !default;\n$info-border-subtle-dark: shade-color($info, 40%) !default;\n$warning-border-subtle-dark: shade-color($warning, 40%) !default;\n$danger-border-subtle-dark: shade-color($danger, 40%) !default;\n$light-border-subtle-dark: $gray-700 !default;\n$dark-border-subtle-dark: $gray-800 !default;\n// scss-docs-end theme-border-subtle-dark-variables\n\n$body-color-dark: $gray-300 !default;\n$body-bg-dark: $gray-900 !default;\n$body-secondary-color-dark: rgba($body-color-dark, .75) !default;\n$body-secondary-bg-dark: $gray-800 !default;\n$body-tertiary-color-dark: rgba($body-color-dark, .5) !default;\n$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default;\n$body-emphasis-color-dark: $white !default;\n$border-color-dark: $gray-700 !default;\n$border-color-translucent-dark: rgba($white, .15) !default;\n$headings-color-dark: inherit !default;\n$link-color-dark: tint-color($primary, 40%) !default;\n$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage) !default;\n$code-color-dark: tint-color($code-color, 40%) !default;\n$mark-color-dark: $body-color-dark !default;\n$mark-bg-dark: $yellow-800 !default;\n\n\n//\n// Forms\n//\n\n$form-select-indicator-color-dark: $body-color-dark !default;\n$form-select-indicator-dark: url(\"data:image/svg+xml, \") !default;\n\n$form-switch-color-dark: rgba($white, .25) !default;\n$form-switch-bg-image-dark: url(\"data:image/svg+xml, \") !default;\n\n// scss-docs-start form-validation-colors-dark\n$form-valid-color-dark: $green-300 !default;\n$form-valid-border-color-dark: $green-300 !default;\n$form-invalid-color-dark: $red-300 !default;\n$form-invalid-border-color-dark: $red-300 !default;\n// scss-docs-end form-validation-colors-dark\n\n\n//\n// Accordion\n//\n\n$accordion-icon-color-dark: $primary-text-emphasis-dark !default;\n$accordion-icon-active-color-dark: $primary-text-emphasis-dark !default;\n\n$accordion-button-icon-dark: url(\"data:image/svg+xml, \") !default;\n$accordion-button-active-icon-dark: url(\"data:image/svg+xml, \") !default;\n// scss-docs-end sass-dark-mode-vars\n",
- "// Dark color mode variables\n//\n// Custom variables for the `[data-bs-theme=\"dark\"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need.\n\n//\n// Global colors\n//\n\n// scss-docs-start sass-dark-mode-vars\n// scss-docs-start theme-text-dark-variables\n$primary-text-emphasis-dark: tint-color($primary, 40%) !default;\n$secondary-text-emphasis-dark: tint-color($secondary, 40%) !default;\n$success-text-emphasis-dark: tint-color($success, 40%) !default;\n$info-text-emphasis-dark: tint-color($info, 40%) !default;\n$warning-text-emphasis-dark: tint-color($warning, 40%) !default;\n$danger-text-emphasis-dark: tint-color($danger, 40%) !default;\n$light-text-emphasis-dark: $gray-100 !default;\n$dark-text-emphasis-dark: $gray-300 !default;\n// scss-docs-end theme-text-dark-variables\n\n// scss-docs-start theme-bg-subtle-dark-variables\n$primary-bg-subtle-dark: shade-color($primary, 80%) !default;\n$secondary-bg-subtle-dark: shade-color($secondary, 80%) !default;\n$success-bg-subtle-dark: shade-color($success, 80%) !default;\n$info-bg-subtle-dark: shade-color($info, 80%) !default;\n$warning-bg-subtle-dark: shade-color($warning, 80%) !default;\n$danger-bg-subtle-dark: shade-color($danger, 80%) !default;\n$light-bg-subtle-dark: $gray-800 !default;\n$dark-bg-subtle-dark: mix($gray-800, $black) !default;\n// scss-docs-end theme-bg-subtle-dark-variables\n\n// scss-docs-start theme-border-subtle-dark-variables\n$primary-border-subtle-dark: shade-color($primary, 40%) !default;\n$secondary-border-subtle-dark: shade-color($secondary, 40%) !default;\n$success-border-subtle-dark: shade-color($success, 40%) !default;\n$info-border-subtle-dark: shade-color($info, 40%) !default;\n$warning-border-subtle-dark: shade-color($warning, 40%) !default;\n$danger-border-subtle-dark: shade-color($danger, 40%) !default;\n$light-border-subtle-dark: $gray-700 !default;\n$dark-border-subtle-dark: $gray-800 !default;\n// scss-docs-end theme-border-subtle-dark-variables\n\n$body-color-dark: $gray-300 !default;\n$body-bg-dark: $gray-900 !default;\n$body-secondary-color-dark: rgba($body-color-dark, .75) !default;\n$body-secondary-bg-dark: $gray-800 !default;\n$body-tertiary-color-dark: rgba($body-color-dark, .5) !default;\n$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default;\n$body-emphasis-color-dark: $white !default;\n$border-color-dark: $gray-700 !default;\n$border-color-translucent-dark: rgba($white, .15) !default;\n$headings-color-dark: inherit !default;\n$link-color-dark: tint-color($primary, 40%) !default;\n$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage) !default;\n$code-color-dark: tint-color($code-color, 40%) !default;\n$mark-color-dark: $body-color-dark !default;\n$mark-bg-dark: $yellow-800 !default;\n\n\n//\n// Forms\n//\n\n$form-select-indicator-color-dark: $body-color-dark !default;\n$form-select-indicator-dark: url(\"data:image/svg+xml, \") !default;\n\n$form-switch-color-dark: rgba($white, .25) !default;\n$form-switch-bg-image-dark: url(\"data:image/svg+xml, \") !default;\n\n// scss-docs-start form-validation-colors-dark\n$form-valid-color-dark: $green-300 !default;\n$form-valid-border-color-dark: $green-300 !default;\n$form-invalid-color-dark: $red-300 !default;\n$form-invalid-border-color-dark: $red-300 !default;\n// scss-docs-end form-validation-colors-dark\n\n\n//\n// Accordion\n//\n\n$accordion-icon-color-dark: $primary-text-emphasis-dark !default;\n$accordion-icon-active-color-dark: $primary-text-emphasis-dark !default;\n\n$accordion-button-icon-dark: url(\"data:image/svg+xml, \") !default;\n$accordion-button-active-icon-dark: url(\"data:image/svg+xml, \") !default;\n// scss-docs-end sass-dark-mode-vars\n",
- "// Re-assigned maps\n//\n// Placed here so that others can override the default Sass maps and see automatic updates to utilities and more.\n\n// scss-docs-start theme-colors-rgb\n$theme-colors-rgb: map-loop($theme-colors, to-rgb, \"$value\") !default;\n// scss-docs-end theme-colors-rgb\n\n// scss-docs-start theme-text-map\n$theme-colors-text: (\n \"primary\": $primary-text-emphasis,\n \"secondary\": $secondary-text-emphasis,\n \"success\": $success-text-emphasis,\n \"info\": $info-text-emphasis,\n \"warning\": $warning-text-emphasis,\n \"danger\": $danger-text-emphasis,\n \"light\": $light-text-emphasis,\n \"dark\": $dark-text-emphasis,\n) !default;\n// scss-docs-end theme-text-map\n\n// scss-docs-start theme-bg-subtle-map\n$theme-colors-bg-subtle: (\n \"primary\": $primary-bg-subtle,\n \"secondary\": $secondary-bg-subtle,\n \"success\": $success-bg-subtle,\n \"info\": $info-bg-subtle,\n \"warning\": $warning-bg-subtle,\n \"danger\": $danger-bg-subtle,\n \"light\": $light-bg-subtle,\n \"dark\": $dark-bg-subtle,\n) !default;\n// scss-docs-end theme-bg-subtle-map\n\n// scss-docs-start theme-border-subtle-map\n$theme-colors-border-subtle: (\n \"primary\": $primary-border-subtle,\n \"secondary\": $secondary-border-subtle,\n \"success\": $success-border-subtle,\n \"info\": $info-border-subtle,\n \"warning\": $warning-border-subtle,\n \"danger\": $danger-border-subtle,\n \"light\": $light-border-subtle,\n \"dark\": $dark-border-subtle,\n) !default;\n// scss-docs-end theme-border-subtle-map\n\n$theme-colors-text-dark: null !default;\n$theme-colors-bg-subtle-dark: null !default;\n$theme-colors-border-subtle-dark: null !default;\n\n@if $enable-dark-mode {\n // scss-docs-start theme-text-dark-map\n $theme-colors-text-dark: (\n \"primary\": $primary-text-emphasis-dark,\n \"secondary\": $secondary-text-emphasis-dark,\n \"success\": $success-text-emphasis-dark,\n \"info\": $info-text-emphasis-dark,\n \"warning\": $warning-text-emphasis-dark,\n \"danger\": $danger-text-emphasis-dark,\n \"light\": $light-text-emphasis-dark,\n \"dark\": $dark-text-emphasis-dark,\n ) !default;\n // scss-docs-end theme-text-dark-map\n\n // scss-docs-start theme-bg-subtle-dark-map\n $theme-colors-bg-subtle-dark: (\n \"primary\": $primary-bg-subtle-dark,\n \"secondary\": $secondary-bg-subtle-dark,\n \"success\": $success-bg-subtle-dark,\n \"info\": $info-bg-subtle-dark,\n \"warning\": $warning-bg-subtle-dark,\n \"danger\": $danger-bg-subtle-dark,\n \"light\": $light-bg-subtle-dark,\n \"dark\": $dark-bg-subtle-dark,\n ) !default;\n // scss-docs-end theme-bg-subtle-dark-map\n\n // scss-docs-start theme-border-subtle-dark-map\n $theme-colors-border-subtle-dark: (\n \"primary\": $primary-border-subtle-dark,\n \"secondary\": $secondary-border-subtle-dark,\n \"success\": $success-border-subtle-dark,\n \"info\": $info-border-subtle-dark,\n \"warning\": $warning-border-subtle-dark,\n \"danger\": $danger-border-subtle-dark,\n \"light\": $light-border-subtle-dark,\n \"dark\": $dark-border-subtle-dark,\n ) !default;\n // scss-docs-end theme-border-subtle-dark-map\n}\n\n// Utilities maps\n//\n// Extends the default `$theme-colors` maps to help create our utilities.\n\n// Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign.\n// scss-docs-start utilities-colors\n$utilities-colors: $theme-colors-rgb !default;\n// scss-docs-end utilities-colors\n\n// scss-docs-start utilities-text-colors\n$utilities-text: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-color)\n )\n) !default;\n$utilities-text-colors: map-loop($utilities-text, rgba-css-var, \"$key\", \"text\") !default;\n\n$utilities-text-emphasis-colors: (\n \"primary-emphasis\": var(--#{$prefix}primary-text-emphasis),\n \"secondary-emphasis\": var(--#{$prefix}secondary-text-emphasis),\n \"success-emphasis\": var(--#{$prefix}success-text-emphasis),\n \"info-emphasis\": var(--#{$prefix}info-text-emphasis),\n \"warning-emphasis\": var(--#{$prefix}warning-text-emphasis),\n \"danger-emphasis\": var(--#{$prefix}danger-text-emphasis),\n \"light-emphasis\": var(--#{$prefix}light-text-emphasis),\n \"dark-emphasis\": var(--#{$prefix}dark-text-emphasis)\n) !default;\n// scss-docs-end utilities-text-colors\n\n// scss-docs-start utilities-bg-colors\n$utilities-bg: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-bg)\n )\n) !default;\n$utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, \"$key\", \"bg\") !default;\n\n$utilities-bg-subtle: (\n \"primary-subtle\": var(--#{$prefix}primary-bg-subtle),\n \"secondary-subtle\": var(--#{$prefix}secondary-bg-subtle),\n \"success-subtle\": var(--#{$prefix}success-bg-subtle),\n \"info-subtle\": var(--#{$prefix}info-bg-subtle),\n \"warning-subtle\": var(--#{$prefix}warning-bg-subtle),\n \"danger-subtle\": var(--#{$prefix}danger-bg-subtle),\n \"light-subtle\": var(--#{$prefix}light-bg-subtle),\n \"dark-subtle\": var(--#{$prefix}dark-bg-subtle)\n) !default;\n// scss-docs-end utilities-bg-colors\n\n// scss-docs-start utilities-border-colors\n$utilities-border: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white)\n )\n) !default;\n$utilities-border-colors: map-loop($utilities-border, rgba-css-var, \"$key\", \"border\") !default;\n\n$utilities-border-subtle: (\n \"primary-subtle\": var(--#{$prefix}primary-border-subtle),\n \"secondary-subtle\": var(--#{$prefix}secondary-border-subtle),\n \"success-subtle\": var(--#{$prefix}success-border-subtle),\n \"info-subtle\": var(--#{$prefix}info-border-subtle),\n \"warning-subtle\": var(--#{$prefix}warning-border-subtle),\n \"danger-subtle\": var(--#{$prefix}danger-border-subtle),\n \"light-subtle\": var(--#{$prefix}light-border-subtle),\n \"dark-subtle\": var(--#{$prefix}dark-border-subtle)\n) !default;\n// scss-docs-end utilities-border-colors\n\n$utilities-links-underline: map-loop($utilities-colors, rgba-css-var, \"$key\", \"link-underline\") !default;\n\n$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;\n\n$gutters: $spacers !default;\n",
- "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-mode\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/backdrop\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n",
- "// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n",
- "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n",
- "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n",
- "// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n",
- "// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n @media (prefers-color-scheme: #{$name}) {\n @content;\n }\n}\n// scss-docs-end mixin-color-scheme\n",
- "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n",
- "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n",
- "// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n",
- "@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n}\n",
- "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",
- "// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n",
- "// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n",
- "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n",
- "// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n",
- "// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}pagination-padding-x: #{$padding-x};\n --#{$prefix}pagination-padding-y: #{$padding-y};\n @include rfs($font-size, --#{$prefix}pagination-font-size);\n --#{$prefix}pagination-border-radius: #{$border-radius};\n}\n// scss-docs-end pagination-mixin\n",
- "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n",
- "// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),\n $border-color: $color\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $border-color;\n @if $enable-shadows {\n @include box-shadow($input-box-shadow, $focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $focus-box-shadow;\n }\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};\n padding-right: $form-select-feedback-icon-padding-end;\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $border-color;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $focus-box-shadow;\n }\n }\n }\n }\n\n .form-control-color {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n width: add($form-color-width, $input-height-inner);\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $border-color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group {\n > .form-control:not(:focus),\n > .form-select:not(:focus),\n > .form-floating:not(:focus-within) {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 3;\n } @else if $state == \"invalid\" {\n z-index: 4;\n }\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n",
- "// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n",
- "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n",
- "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n",
- "// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n",
- "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n",
- "// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n",
- "// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n",
- "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is an invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n",
- ":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n",
- "// Utilities\n\n$utilities: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-merge(\n (\n // scss-docs-start utils-vertical-align\n \"align\": (\n property: vertical-align,\n class: align,\n values: baseline top middle bottom text-bottom text-top\n ),\n // scss-docs-end utils-vertical-align\n // scss-docs-start utils-float\n \"float\": (\n responsive: true,\n property: float,\n values: (\n start: left,\n end: right,\n none: none,\n )\n ),\n // scss-docs-end utils-float\n // Object Fit utilities\n // scss-docs-start utils-object-fit\n \"object-fit\": (\n responsive: true,\n property: object-fit,\n values: (\n contain: contain,\n cover: cover,\n fill: fill,\n scale: scale-down,\n none: none,\n )\n ),\n // scss-docs-end utils-object-fit\n // Opacity utilities\n // scss-docs-start utils-opacity\n \"opacity\": (\n property: opacity,\n values: (\n 0: 0,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1,\n )\n ),\n // scss-docs-end utils-opacity\n // scss-docs-start utils-overflow\n \"overflow\": (\n property: overflow,\n values: auto hidden visible scroll,\n ),\n \"overflow-x\": (\n property: overflow-x,\n values: auto hidden visible scroll,\n ),\n \"overflow-y\": (\n property: overflow-y,\n values: auto hidden visible scroll,\n ),\n // scss-docs-end utils-overflow\n // scss-docs-start utils-display\n \"display\": (\n responsive: true,\n print: true,\n property: display,\n class: d,\n values: inline inline-block block grid inline-grid table table-row table-cell flex inline-flex none\n ),\n // scss-docs-end utils-display\n // scss-docs-start utils-shadow\n \"shadow\": (\n property: box-shadow,\n class: shadow,\n values: (\n null: var(--#{$prefix}box-shadow),\n sm: var(--#{$prefix}box-shadow-sm),\n lg: var(--#{$prefix}box-shadow-lg),\n none: none,\n )\n ),\n // scss-docs-end utils-shadow\n // scss-docs-start utils-focus-ring\n \"focus-ring\": (\n css-var: true,\n css-variable-name: focus-ring-color,\n class: focus-ring,\n values: map-loop($theme-colors-rgb, rgba-css-var, \"$key\", \"focus-ring\")\n ),\n // scss-docs-end utils-focus-ring\n // scss-docs-start utils-position\n \"position\": (\n property: position,\n values: static relative absolute fixed sticky\n ),\n \"top\": (\n property: top,\n values: $position-values\n ),\n \"bottom\": (\n property: bottom,\n values: $position-values\n ),\n \"start\": (\n property: left,\n class: start,\n values: $position-values\n ),\n \"end\": (\n property: right,\n class: end,\n values: $position-values\n ),\n \"translate-middle\": (\n property: transform,\n class: translate-middle,\n values: (\n null: translate(-50%, -50%),\n x: translateX(-50%),\n y: translateY(-50%),\n )\n ),\n // scss-docs-end utils-position\n // scss-docs-start utils-borders\n \"border\": (\n property: border,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-top\": (\n property: border-top,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-end\": (\n property: border-right,\n class: border-end,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-bottom\": (\n property: border-bottom,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-start\": (\n property: border-left,\n class: border-start,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-color\": (\n property: border-color,\n class: border,\n local-vars: (\n \"border-opacity\": 1\n ),\n values: $utilities-border-colors\n ),\n \"subtle-border-color\": (\n property: border-color,\n class: border,\n values: $utilities-border-subtle\n ),\n \"border-width\": (\n property: border-width,\n class: border,\n values: $border-widths\n ),\n \"border-opacity\": (\n css-var: true,\n class: border-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n // scss-docs-end utils-borders\n // Sizing utilities\n // scss-docs-start utils-sizing\n \"width\": (\n property: width,\n class: w,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-width\": (\n property: max-width,\n class: mw,\n values: (100: 100%)\n ),\n \"viewport-width\": (\n property: width,\n class: vw,\n values: (100: 100vw)\n ),\n \"min-viewport-width\": (\n property: min-width,\n class: min-vw,\n values: (100: 100vw)\n ),\n \"height\": (\n property: height,\n class: h,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-height\": (\n property: max-height,\n class: mh,\n values: (100: 100%)\n ),\n \"viewport-height\": (\n property: height,\n class: vh,\n values: (100: 100vh)\n ),\n \"min-viewport-height\": (\n property: min-height,\n class: min-vh,\n values: (100: 100vh)\n ),\n // scss-docs-end utils-sizing\n // Flex utilities\n // scss-docs-start utils-flex\n \"flex\": (\n responsive: true,\n property: flex,\n values: (fill: 1 1 auto)\n ),\n \"flex-direction\": (\n responsive: true,\n property: flex-direction,\n class: flex,\n values: row column row-reverse column-reverse\n ),\n \"flex-grow\": (\n responsive: true,\n property: flex-grow,\n class: flex,\n values: (\n grow-0: 0,\n grow-1: 1,\n )\n ),\n \"flex-shrink\": (\n responsive: true,\n property: flex-shrink,\n class: flex,\n values: (\n shrink-0: 0,\n shrink-1: 1,\n )\n ),\n \"flex-wrap\": (\n responsive: true,\n property: flex-wrap,\n class: flex,\n values: wrap nowrap wrap-reverse\n ),\n \"justify-content\": (\n responsive: true,\n property: justify-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly,\n )\n ),\n \"align-items\": (\n responsive: true,\n property: align-items,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"align-content\": (\n responsive: true,\n property: align-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch,\n )\n ),\n \"align-self\": (\n responsive: true,\n property: align-self,\n values: (\n auto: auto,\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"order\": (\n responsive: true,\n property: order,\n values: (\n first: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n last: 6,\n ),\n ),\n // scss-docs-end utils-flex\n // Margin utilities\n // scss-docs-start utils-spacing\n \"margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: map-merge($spacers, (auto: auto))\n ),\n // Negative margin utilities\n \"negative-margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: $negative-spacers\n ),\n \"negative-margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: $negative-spacers\n ),\n \"negative-margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: $negative-spacers\n ),\n \"negative-margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: $negative-spacers\n ),\n \"negative-margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: $negative-spacers\n ),\n \"negative-margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: $negative-spacers\n ),\n \"negative-margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: $negative-spacers\n ),\n // Padding utilities\n \"padding\": (\n responsive: true,\n property: padding,\n class: p,\n values: $spacers\n ),\n \"padding-x\": (\n responsive: true,\n property: padding-right padding-left,\n class: px,\n values: $spacers\n ),\n \"padding-y\": (\n responsive: true,\n property: padding-top padding-bottom,\n class: py,\n values: $spacers\n ),\n \"padding-top\": (\n responsive: true,\n property: padding-top,\n class: pt,\n values: $spacers\n ),\n \"padding-end\": (\n responsive: true,\n property: padding-right,\n class: pe,\n values: $spacers\n ),\n \"padding-bottom\": (\n responsive: true,\n property: padding-bottom,\n class: pb,\n values: $spacers\n ),\n \"padding-start\": (\n responsive: true,\n property: padding-left,\n class: ps,\n values: $spacers\n ),\n // Gap utility\n \"gap\": (\n responsive: true,\n property: gap,\n class: gap,\n values: $spacers\n ),\n \"row-gap\": (\n responsive: true,\n property: row-gap,\n class: row-gap,\n values: $spacers\n ),\n \"column-gap\": (\n responsive: true,\n property: column-gap,\n class: column-gap,\n values: $spacers\n ),\n // scss-docs-end utils-spacing\n // Text\n // scss-docs-start utils-text\n \"font-family\": (\n property: font-family,\n class: font,\n values: (monospace: var(--#{$prefix}font-monospace))\n ),\n \"font-size\": (\n rfs: true,\n property: font-size,\n class: fs,\n values: $font-sizes\n ),\n \"font-style\": (\n property: font-style,\n class: fst,\n values: italic normal\n ),\n \"font-weight\": (\n property: font-weight,\n class: fw,\n values: (\n lighter: $font-weight-lighter,\n light: $font-weight-light,\n normal: $font-weight-normal,\n medium: $font-weight-medium,\n semibold: $font-weight-semibold,\n bold: $font-weight-bold,\n bolder: $font-weight-bolder\n )\n ),\n \"line-height\": (\n property: line-height,\n class: lh,\n values: (\n 1: 1,\n sm: $line-height-sm,\n base: $line-height-base,\n lg: $line-height-lg,\n )\n ),\n \"text-align\": (\n responsive: true,\n property: text-align,\n class: text,\n values: (\n start: left,\n end: right,\n center: center,\n )\n ),\n \"text-decoration\": (\n property: text-decoration,\n values: none underline line-through\n ),\n \"text-transform\": (\n property: text-transform,\n class: text,\n values: lowercase uppercase capitalize\n ),\n \"white-space\": (\n property: white-space,\n class: text,\n values: (\n wrap: normal,\n nowrap: nowrap,\n )\n ),\n \"word-wrap\": (\n property: word-wrap word-break,\n class: text,\n values: (break: break-word),\n rtl: false\n ),\n // scss-docs-end utils-text\n // scss-docs-start utils-color\n \"color\": (\n property: color,\n class: text,\n local-vars: (\n \"text-opacity\": 1\n ),\n values: map-merge(\n $utilities-text-colors,\n (\n \"muted\": var(--#{$prefix}secondary-color), // deprecated\n \"black-50\": rgba($black, .5), // deprecated\n \"white-50\": rgba($white, .5), // deprecated\n \"body-secondary\": var(--#{$prefix}secondary-color),\n \"body-tertiary\": var(--#{$prefix}tertiary-color),\n \"body-emphasis\": var(--#{$prefix}emphasis-color),\n \"reset\": inherit,\n )\n )\n ),\n \"text-opacity\": (\n css-var: true,\n class: text-opacity,\n values: (\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"text-color\": (\n property: color,\n class: text,\n values: $utilities-text-emphasis-colors\n ),\n // scss-docs-end utils-color\n // scss-docs-start utils-links\n \"link-opacity\": (\n css-var: true,\n class: link-opacity,\n state: hover,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"link-offset\": (\n property: text-underline-offset,\n class: link-offset,\n state: hover,\n values: (\n 1: .125em,\n 2: .25em,\n 3: .375em,\n )\n ),\n \"link-underline\": (\n property: text-decoration-color,\n class: link-underline,\n local-vars: (\n \"link-underline-opacity\": 1\n ),\n values: map-merge(\n $utilities-links-underline,\n (\n null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1)),\n )\n )\n ),\n \"link-underline-opacity\": (\n css-var: true,\n class: link-underline-opacity,\n state: hover,\n values: (\n 0: 0,\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n ),\n ),\n // scss-docs-end utils-links\n // scss-docs-start utils-bg-color\n \"background-color\": (\n property: background-color,\n class: bg,\n local-vars: (\n \"bg-opacity\": 1\n ),\n values: map-merge(\n $utilities-bg-colors,\n (\n \"transparent\": transparent,\n \"body-secondary\": rgba(var(--#{$prefix}secondary-bg-rgb), var(--#{$prefix}bg-opacity)),\n \"body-tertiary\": rgba(var(--#{$prefix}tertiary-bg-rgb), var(--#{$prefix}bg-opacity)),\n )\n )\n ),\n \"bg-opacity\": (\n css-var: true,\n class: bg-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n \"subtle-background-color\": (\n property: background-color,\n class: bg,\n values: $utilities-bg-subtle\n ),\n // scss-docs-end utils-bg-color\n \"gradient\": (\n property: background-image,\n class: bg,\n values: (gradient: var(--#{$prefix}gradient))\n ),\n // scss-docs-start utils-interaction\n \"user-select\": (\n property: user-select,\n values: all auto none\n ),\n \"pointer-events\": (\n property: pointer-events,\n class: pe,\n values: none auto,\n ),\n // scss-docs-end utils-interaction\n // scss-docs-start utils-border-radius\n \"rounded\": (\n property: border-radius,\n class: rounded,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-top\": (\n property: border-top-left-radius border-top-right-radius,\n class: rounded-top,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-end\": (\n property: border-top-right-radius border-bottom-right-radius,\n class: rounded-end,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-bottom\": (\n property: border-bottom-right-radius border-bottom-left-radius,\n class: rounded-bottom,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-start\": (\n property: border-bottom-left-radius border-top-left-radius,\n class: rounded-start,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-xxl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n // scss-docs-end utils-border-radius\n // scss-docs-start utils-visibility\n \"visibility\": (\n property: visibility,\n class: null,\n values: (\n visible: visible,\n invisible: hidden,\n )\n ),\n // scss-docs-end utils-visibility\n // scss-docs-start utils-zindex\n \"z-index\": (\n property: z-index,\n class: z,\n values: $zindex-levels,\n )\n // scss-docs-end utils-zindex\n ),\n $utilities\n);\n",
- "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, ``-`` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on ` `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `