Mission Control Dashboard Plugin

linkPlugin settings

name

Mission Control Dashboard

Information

description

Multifunctional, highly configurable account dashboard


icon

dashboard


setting

Tag to apply to planning notes

Default is "planning/quarterly"

setting

Console logging

Default is false, only for debugging

setting

debug_console

Default is false, only for debugging

instructions

This plugin allows you to get a high-level glimpse of what's going on in your world. Here is the help page on how to install it.



We call the different components "widgets," and these widgets can be reordered by clicking "Layout" in the top-left, or by clicking for two seconds on the title bar of a widget. You can add a background image under "Settings."

Prerequisites: Ensure you have created at least one Task Domain to use the dashboard. All notes and tasks are picked from the selected domain. Task Domain setup instructions.

Current widgets offered by the Amplenote Dashboard include:

1. Quarterly planning. The starting point for the "Dreamtask" widget, and for your day in general. The dashboard ensures that you keep what matters top-of-mind. By default, it allows the quarterly plan to be augmented with a monthly plan. If you make it 2-tall, it also has room to present your weekly plan.
2. Victory Value. How much is getting done each day, and how do you feel while doing it? Hover on a day to remember the specific tasks you finished.
3. Dreamtask. Use your preferred LLM to synthesize your quarterly/monthly/weekly plan with the tasks in your task domain. Get 2-4 tasks recommended each day, with a record of past recommendations to ensure that you get new tasks every day of the week.
4. Day Sketcher. Sketch out what to focus on today in a tab-navigable per-hour breakdown.
5. Revisit candidates. Notes with tasks that have been languishing. When you get distracted from a project, this widget helps you re-engage with long-term ideas.
6. Mood tracker. Display your daily mood ratings in either "cycle" or "wave" form. Even though nobody wants to hear about your crappy day, Amplenote Dashboard wants to help you feel "seen" by letting you leave a record of each day's highs & lows, as recommended by the experts.
7. Peak hours. Which hours were most productive during the currently selected month: both for originating ideas that ended up being high in Victory Value, or for completing said ideas?
8. Calendar. The control center for the date-based modules, allows you to see which dates have events scheduled along with specifying which date you want to see featured in the rest of the dashboard.
9. Task Agenda. What's on the docket in the coming days? Uses the Task Domain selected atop the dashboard, combined with the date selected in Calendar.
10. Inspiration quotes. Take a wild guess.
11. Quick actions. Jump to your daily jot, calendar, or a random note 🎲

Drop a comment if there's another widget you'd like to see added?



linkUpdates

June 27, 2026

Add Shared Notes component

Add Proposed Agenda component

Fix "Layout" popup not fitting within mobile screen

May 10, 2026

Add Task Retirement Center to suggest tasks that could be dismissed, and get progressively rewarded for acting on old tasks

Add widget layout profiles to allow users to customize which widgets are shown for different personas

Fix Goal Coach consistently taking 10s+ to render

Implement "Component Spotlight": Click the icon of a component to have it swoop into center stage (as means to savor the day's background image)

April 29, 2026.

Intersperse events & tasks in agenda

Fix events not showing on mobile Dashboard

Use data cached note for "Recent Notes" component to expedite rendering across devices

Add link to schedule Dream Tasks

April 16, 2026. Incorporate calendar events & Ample Agent Pro

Calendar events now shown in Agenda

Calendar events now shown in Day Sketch

Dream Task uses Ample Agent Pro to generate suggested tasks, when available

Update global "Settings" to allow specifying "Week" and "Hour" format, using defaults that accord with the user's locale. The date/time settings chosen are now applied to all components that renders dates & times (currently Agenda, Calendar, Dream Task, Day Sketch, and Peak Hours)

Update Day Sketch component to allow up/down arrows to switch between hours of day

April 5, 2026. Dream Task v2

Add tests for suggester with all the AI providers

More descriptive Dream Task error messages

March 24, 2026

Fixed background image uploads not being processed.

Set up default background to be used when none has been uploaded

Don't show hidden tasks in agenda

Ensure recommended tasks are synced between devices

Mood rating notes now recorded to the same data store as in-app mood ratings


linkCodes

(() => {
// lib/constants/settings.js
var SETTING_KEYS = {
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode",
CONSOLE_LOGGING: "Console logging",
DASHBOARD_COMPONENTS: "dashboard_elements",
DEBUG_CONSOLE: "debug_console",
LLM_API_KEY_ANTHROPIC: "Anthropic API Key",
LLM_API_KEY_GEMINI: "Gemini API Key",
LLM_API_KEY_GROK: "Grok API Key",
LLM_API_KEY_OPENAI: "OpenAI API Key",
LLM_PROVIDER_MODEL: "LLM Provider",
FIRST_INSTALLED_AT: "dashboard_first_installed_at",
SELECTED_LAYOUT_PROFILE: "dashboard_selected_layout_profile",
TASK_DOMAINS: "dashboard_task_domains",
PLANNING_NOTE_TAG: "Tag to apply to planning notes",
PROPOSED_AGENDA_PRIORITY: "dashboard_proposed_agenda_priority",
PROPOSED_AGENDA_LLM: "dashboard_proposed_agenda_llm"
};
var API_KEY_FROM_PROVIDER = {
anthropic: SETTING_KEYS.LLM_API_KEY_ANTHROPIC,
gemini: SETTING_KEYS.LLM_API_KEY_GEMINI,
grok: SETTING_KEYS.LLM_API_KEY_GROK,
openai: SETTING_KEYS.LLM_API_KEY_OPENAI
};
function widgetConfigKey(widgetId) {
return `dashboard_${widgetId}_config`;
}
var DASHBOARD_COMPONENTS = SETTING_KEYS.DASHBOARD_COMPONENTS;
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var WIDGET_REGISTRY = [
{
widgetId: "layout-picker",
name: "Layout Picker",
description: "One-click presets that rearrange your entire dashboard into a curated profile",
icon: "\u{1F5C2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "dream-task",
name: "Goal Coach",
description: "Get task suggestions that blend quarterly/monthly goals with day-of-week preferences",
icon: "\u{1F52E}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "day-sketch",
name: "Day Sketcher",
description: "Notebook-paper day planner with hour-by-hour entries saved to a note",
icon: "\u{1F5D2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "proposed-agenda",
name: "Proposed Agenda",
description: "AI-proposed hour-by-hour schedule built from your recent tasks and quarterly plan",
icon: "\u{1F5D3}\uFE0F",
defaultGridWidthSize: 2,
introducedAt: "2026-06-27",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Inspiration Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "graveyard",
name: "Task Retirement Center",
description: "Surface neglected tasks and retire them to an archived note",
icon: "\u{1F475}\uFE0F",
defaultGridWidthSize: 2,
introducedAt: "2026-05-09",
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "recent-notes",
name: "Revisit Candidate",
description: "Notes with open tasks that have not had a new task in over a week",
icon: "\u{1F4CC}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "shared-notes",
name: "Shared Notes",
description: "Shared notes recently updated by a collaborator after your own changes",
icon: "\u{1F91D}",
defaultGridWidthSize: 2,
introducedAt: "2026-06-26",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Mood Tracker",
visibleTitle: "How are you feeling?",
description: "Log your daily mood and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "peak-hours",
name: "Peak Hours",
description: "Hourly distribution of task creation and completion activity",
icon: "\u23F0",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "debug-console",
name: "Debug Console",
description: "Scrollable log viewer showing all logIfEnabled messages (developer tool)",
icon: "\u{1F41B}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2,
debugOnly: true
}
];
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.filter((w) => !w.debugOnly).map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
 
// lib/constants/quarters.js
var FULL_MONTH_NAMES = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
function getCurrentQuarter() {
const now = /* @__PURE__ */ new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return { year, quarter, label: `Q${quarter} ${year}` };
}
function getNextQuarter() {
let { year, quarter } = getCurrentQuarter();
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return { year, quarter, label: `Q${quarter} ${year}` };
}
 
// lib/util/log.js
var _enabled = false;
var _entryId = 0;
var MAX_LOG_BUFFER = 200;
var _logBuffer = [];
var _listeners = /* @__PURE__ */ new Set();
function setLoggingEnabled(settingValue) {
if (typeof settingValue === "boolean") {
_enabled = settingValue;
return;
}
const normalized = String(settingValue || "").trim().toLowerCase();
_enabled = ["true", "yes", "1", "on", "enabled"].includes(normalized);
}
function logIfEnabled(...args) {
if (_enabled) {
console.log(...args);
const entry = { id: ++_entryId, ts: Date.now(), args };
_logBuffer.push(entry);
if (_logBuffer.length > MAX_LOG_BUFFER)
_logBuffer.shift();
setTimeout(() => _listeners.forEach((fn) => fn(entry)), 0);
}
}
 
// lib/util/all-notes-tasks.js
var MAX_ALL_NOTES_TO_SCAN = 250;
function fetchDomainOrAllNotesTasks(app, domainUuid, { includeDone = false, maxNotes = MAX_ALL_NOTES_TO_SCAN } = {}) {
if (domainUuid) {
return app.getTaskDomainTasks(domainUuid);
} else {
return _allNotesTasks(app, includeDone, maxNotes);
}
}
async function _allNotesTasks(app, includeDone, maxNotes) {
const seen = /* @__PURE__ */ new Set();
const noteHandles = [];
for await (const handle of await app.filterNotes({ group: "taskLists" }, "changed")) {
if (!handle?.uuid || seen.has(handle.uuid))
continue;
seen.add(handle.uuid);
noteHandles.push(handle);
if (noteHandles.length >= maxNotes)
break;
}
logIfEnabled(`[all-notes-tasks] No task domain \u2014 scanning ${noteHandles.length} task-list notes for tasks`);
const settled = await Promise.allSettled(noteHandles.map((handle) => app.getNoteTasks({ uuid: handle.uuid }, { includeDone })));
const allTasks = [];
for (let index = 0; index < settled.length; index += 1) {
const outcome = settled[index];
const handle = noteHandles[index];
if (!outcome || outcome.status === "rejected") {
logIfEnabled("[all-notes-tasks] getNoteTasks failed:", outcome?.reason);
continue;
}
const tasks = Array.isArray(outcome.value) ? outcome.value : [];
for (const task of tasks) {
if (!task?.uuid)
continue;
allTasks.push({
...task,
noteName: task.noteName || task.noteTitle || task.note?.name || handle.name || null,
noteUUID: task.noteUUID || handle.uuid
});
}
}
logIfEnabled(`[all-notes-tasks] Gathered ${allTasks.length} tasks across all notes (no task domain)`);
return allTasks;
}
 
// lib/util/date-utility.js
function dateFromDateInput(dateInput, { throwOnInvalid = true } = {}) {
const fail = () => {
if (!throwOnInvalid)
return null;
throw new TypeError(`Invalid date input: ${String(dateInput)}`);
};
if (dateInput == null || dateInput === "")
return fail();
if (dateInput instanceof Date) {
const date = new Date(dateInput);
return Number.isNaN(date.getTime()) ? fail() : date;
}
if (typeof dateInput === "number") {
if (!Number.isFinite(dateInput))
return fail();
const millis = Math.abs(dateInput) < 1e10 ? dateInput * 1e3 : dateInput;
const parsed2 = new Date(millis);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
if (typeof dateInput === "string") {
const trimmed = dateInput.trim();
if (!trimmed)
return fail();
if (/^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const numericValue = Number(trimmed);
if (!Number.isNaN(numericValue))
return dateFromDateInput(numericValue, { throwOnInvalid });
const parsed2 = new Date(trimmed);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
const parsed = new Date(dateInput);
return Number.isNaN(parsed.getTime()) ? fail() : parsed;
}
function weekStartFromDateInput(dateInput, weekStartDay = 1) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const delta = (dayOfWeek - weekStartDay + 7) % 7;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - delta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput, weekStartDay = 1) {
const weekStart = weekStartFromDateInput(dateInput, weekStartDay);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
 
// lib/data-service.js
async function fetchDashboardData(app) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
const t0 = Date.now();
logIfEnabled("[fetchDashboardData] starting \u2014 launching domain + mood/plans/settings in parallel");
const now = /* @__PURE__ */ new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const domainPromise = _resolveTaskDomains(app).catch((err) => {
logIfEnabled("[fetchDashboardData] _resolveTaskDomains failed:", err);
return { domains: [], selectedDomainUuid: null };
});
const tasksPromise = domainPromise.then((info) => {
logIfEnabled(`[fetchDashboardData] domain resolved in ${Date.now() - t0}ms, uuid=${info.selectedDomainUuid} \u2014 fetching tasks`);
return _fetchTasksForDomain(app, info.selectedDomainUuid);
});
const [taskDomainInfo, moodRatings, quarterlyPlans, settings, domainTasks] = await Promise.all([
domainPromise,
_safeMoodRatings(app, twoWeeksAgoUnixSeconds),
_findQuarterlyPlans(app),
_readDashboardSettings(app),
tasksPromise
]);
logIfEnabled(`[fetchDashboardData] all resolved in ${Date.now() - t0}ms \u2014 ${domainTasks.length} tasks, ${moodRatings?.length ?? 0} mood ratings`);
return {
activeTaskDomain: taskDomainInfo.selectedDomainUuid,
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
context: { noteUUID: app.context?.noteUUID || null, pluginUUID: app.context?.pluginUUID || null },
currentDate: now.toISOString(),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
moodRatings,
pluginNoteUUID: app.context?.noteUUID || null,
quarterlyPlans,
settings,
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
taskDomains: taskDomainInfo.domains,
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd)
};
}
function _logTaskDomainsResponse(prefix, response) {
const isArray = Array.isArray(response);
const count = isArray ? response.length : 0;
const type = response === null ? "null" : Array.isArray(response) ? "array" : typeof response;
const keys = response && typeof response === "object" && !isArray ? Object.keys(response) : null;
let serialized;
try {
serialized = JSON.stringify(response);
} catch {
serialized = String(response);
}
logIfEnabled(
`${prefix} getTaskDomains() returned ${count} domains (type=${type}${keys ? `, keys=[${keys.join(",")}]` : ""})`,
{ raw: response, serialized }
);
}
async function _resolveTaskDomains(app) {
const raw = app.settings[SETTING_KEYS.TASK_DOMAINS];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
logIfEnabled(`[_resolveTaskDomains] cache ${hasDomains ? "stale" : "empty"} \u2014 calling getTaskDomains()`);
const t0 = Date.now();
const freshDomains = await app.getTaskDomains();
_logTaskDomainsResponse(`[_resolveTaskDomains] (${Date.now() - t0}ms)`, freshDomains);
stored.domains = (Array.isArray(freshDomains) ? freshDomains : []).filter((d) => d && d.uuid).map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
return stored;
}
function _pickDefaultDomain(domains) {
if (!domains || domains.length === 0)
return null;
const work = domains.find((d) => d.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
async function _fetchTasksForDomain(app, domainUuid, includeDone = false) {
const t0 = Date.now();
const list = await fetchDomainOrAllNotesTasks(app, domainUuid, { includeDone });
logIfEnabled(`[_fetchTasksForDomain] ${domainUuid ? `getTaskDomainTasks(${domainUuid})` : "all-notes fallback"} returned ${list.length} tasks in ${Date.now() - t0}ms`);
return list;
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds) {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
logIfEnabled("Mood ratings", moodRatings, "from", fromUnixSeconds);
return moodRatings;
}
async function _findQuarterlyPlans(app) {
const t0 = Date.now();
const current = getCurrentQuarter();
const next = getNextQuarter();
logIfEnabled(`[_findQuarterlyPlans] querying: "${current.label} Plan", "${next.label} Plan"`);
const [currentPlans, nextPlans] = await Promise.all([
app.filterNotes({ query: `${current.label} Plan` }),
app.filterNotes({ query: `${next.label} Plan` })
]);
logIfEnabled(`[_findQuarterlyPlans] filterNotes results \u2014 current:`, currentPlans, `next:`, nextPlans);
const currentNoteUUID = currentPlans.find((n) => n.name === `${current.label} Plan`)?.uuid;
const nextNoteUUID = nextPlans.find((n) => n.name === `${next.label} Plan`)?.uuid;
logIfEnabled(`[_findQuarterlyPlans] resolved UUIDs \u2014 current: ${currentNoteUUID}, next: ${nextNoteUUID}`);
const currentMonths = _quarterMonthNames(current.quarter);
const nextMonths = _quarterMonthNames(next.quarter);
const [currentHasAll, nextHasAll] = await Promise.all([
currentNoteUUID ? _hasAllMonthSections(app, currentNoteUUID, currentMonths) : Promise.resolve(false),
nextNoteUUID ? _hasAllMonthSections(app, nextNoteUUID, nextMonths) : Promise.resolve(false)
]);
logIfEnabled(`[_findQuarterlyPlans] hasAllMonthlyDetails \u2014 current: ${currentHasAll}, next: ${nextHasAll} (${Date.now() - t0}ms total)`);
return {
current: { ...current, noteUUID: currentNoteUUID, hasAllMonthlyDetails: currentHasAll },
next: { ...next, noteUUID: nextNoteUUID, hasAllMonthlyDetails: nextHasAll }
};
}
function _quarterMonthNames(quarter) {
const start = (quarter - 1) * 3;
return [0, 1, 2].map((i) => FULL_MONTH_NAMES[(start + i) % 12]);
}
async function _hasAllMonthSections(app, noteUUID, monthNames) {
try {
const sections = await app.getNoteSections({ uuid: noteUUID });
return monthNames.every(
(name) => sections.some((s) => s.heading?.text?.trim().toLowerCase() === name.toLowerCase())
);
} catch {
return false;
}
}
async function _readDashboardSettings(app) {
const keys = [
widgetConfigKey("victory-value"),
widgetConfigKey("calendar"),
widgetConfigKey("quotes"),
widgetConfigKey("mood"),
widgetConfigKey("recent-notes")
];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] || "";
settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] || "cover";
settings[SETTING_KEYS.CONSOLE_LOGGING] = app.settings[SETTING_KEYS.CONSOLE_LOGGING] || "";
settings[SETTING_KEYS.LLM_PROVIDER_MODEL] = app.settings[SETTING_KEYS.LLM_PROVIDER_MODEL] || "";
settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] = app.settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] || "";
settings[SETTING_KEYS.LLM_API_KEY_GEMINI] = app.settings[SETTING_KEYS.LLM_API_KEY_GEMINI] || "";
settings[SETTING_KEYS.LLM_API_KEY_GROK] = app.settings[SETTING_KEYS.LLM_API_KEY_GROK] || "";
settings[SETTING_KEYS.LLM_API_KEY_OPENAI] = app.settings[SETTING_KEYS.LLM_API_KEY_OPENAI] || "";
let componentLayout = null;
try {
componentLayout = app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(SETTING_KEYS.DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[SETTING_KEYS.DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
 
// client-bundle:client-bundle
var clientBase64 = "KCgpPT57dmFyIGR4PU9iamVjdC5jcmVhdGU7dmFyIENoPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgY3g9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgdXg9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIHB4PU9iamVjdC5nZXRQcm90b3R5cGVPZixmeD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBmcj0oZSx0KT0+KCk9Pih0fHxlKCh0PXtleHBvcnRzOnt9fSkuZXhwb3J0cyx0KSx0LmV4cG9ydHMpO3ZhciBoeD0oZSx0LG4scik9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgbyBvZiB1eCh0KSkhZnguY2FsbChlLG8pJiZvIT09biYmQ2goZSxvLHtnZXQ6KCk9PnRbb10sZW51bWVyYWJsZTohKHI9Y3godCxvKSl8fHIuZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgVT0oZSx0LG4pPT4obj1lIT1udWxsP2R4KHB4KGUpKTp7fSxoeCh0fHwhZXx8IWUuX19lc01vZHVsZT9DaChuLCJkZWZhdWx0Iix7dmFsdWU6ZSxlbnVtZXJhYmxlOiEwfSk6bixlKSk7dmFyIEJoPWZyKHZlPT57InVzZSBzdHJpY3QiO3ZhciBKYT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksZ3g9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksbXg9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSx2eD1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLHl4PVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksd3g9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxieD1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0Iiksa3g9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSx4eD1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFN4PVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxFeD1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksT2g9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIE54KGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9T2gmJmVbT2hdfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgUmg9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LFBoPU9iamVjdC5hc3NpZ24sTGg9e307ZnVuY3Rpb24gdGEoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9TGgsdGhpcy51cGRhdGVyPW58fFJofXRhLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O3RhLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O3RhLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gVWgoKXt9VWgucHJvdG90eXBlPXRhLnByb3RvdHlwZTtmdW5jdGlvbiBuYyhlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1MaCx0aGlzLnVwZGF0ZXI9bnx8Umh9dmFyIHJjPW5jLnByb3RvdHlwZT1uZXcgVWg7cmMuY29uc3RydWN0b3I9bmM7UGgocmMsdGEucHJvdG90eXBlKTtyYy5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgSWg9QXJyYXkuaXNBcnJheSx6aD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LG9jPXtjdXJyZW50Om51bGx9LEZoPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gJGgoZSx0LG4pe3ZhciByLG89e30sYT1udWxsLGk9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYoaT10LnJlZiksdC5rZXkhPT12b2lkIDAmJihhPSIiK3Qua2V5KSx0KXpoLmNhbGwodCxyKSYmIUZoLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGw9QXJyYXkocyksZD0wO2Q8cztkKyspbFtkXT1hcmd1bWVudHNbZCsyXTtvLmNoaWxkcmVuPWx9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKW9bcl09PT12b2lkIDAmJihvW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpKYSx0eXBlOmUsa2V5OmEscmVmOmkscHJvcHM6byxfb3duZXI6b2MuY3VycmVudH19ZnVuY3Rpb24gVHgoZSx0KXtyZXR1cm57JCR0eXBlb2Y6SmEsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBhYyhlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PUphfWZ1bmN0aW9uIER4KGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIE1oPS9cLysvZztmdW5jdGlvbiB0YyhlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9EeCgiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gQ3MoZSx0LG4scixvKXt2YXIgYT10eXBlb2YgZTsoYT09PSJ1bmRlZmluZWQifHxhPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGk9ITE7aWYoZT09PW51bGwpaT0hMDtlbHNlIHN3aXRjaChhKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmk9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIEphOmNhc2UgZ3g6aT0hMH19aWYoaSlyZXR1cm4gaT1lLG89byhpKSxlPXI9PT0iIj8iLiIrdGMoaSwwKTpyLEloKG8pPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShNaCwiJCYvIikrIi8iKSxDcyhvLHQsbiwiIixmdW5jdGlvbihkKXtyZXR1cm4gZH0pKTpvIT1udWxsJiYoYWMobykmJihvPVR4KG8sbisoIW8ua2V5fHxpJiZpLmtleT09PW8ua2V5PyIiOigiIitvLmtleSkucmVwbGFjZShNaCwiJCYvIikrIi8iKStlKSksdC5wdXNoKG8pKSwxO2lmKGk9MCxyPXI9PT0iIj8iLiI6cisiOiIsSWgoZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2E9ZVtzXTt2YXIgbD1yK3RjKGEscyk7aSs9Q3MoYSx0LG4sbCxvKX1lbHNlIGlmKGw9TngoZSksdHlwZW9mIGw9PSJmdW5jdGlvbiIpZm9yKGU9bC5jYWxsKGUpLHM9MDshKGE9ZS5uZXh0KCkpLmRvbmU7KWE9YS52YWx1ZSxsPXIrdGMoYSxzKyspLGkrPUNzKGEsdCxuLGwsbyk7ZWxzZSBpZihhPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGl9ZnVuY3Rpb24gX3MoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10sbz0wO3JldHVybiBDcyhlLHIsIiIsIiIsZnVuY3Rpb24oYSl7cmV0dXJuIHQuY2FsbChuLGEsbysrKX0pLHJ9ZnVuY3Rpb24gQXgoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgUHQ9e2N1cnJlbnQ6bnVsbH0sT3M9e3RyYW5zaXRpb246bnVsbH0sX3g9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6UHQsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6T3MsUmVhY3RDdXJyZW50T3duZXI6b2N9O2Z1bmN0aW9uIFdoKCl7dGhyb3cgRXJyb3IoImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuIil9dmUuQ2hpbGRyZW49e21hcDpfcyxmb3JFYWNoOmZ1bmN0aW9uKGUsdCxuKXtfcyhlLGZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4pfSxjb3VudDpmdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBfcyhlLGZ1bmN0aW9uKCl7dCsrfSksdH0sdG9BcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gX3MoZSxmdW5jdGlvbih0KXtyZXR1cm4gdH0pfHxbXX0sb25seTpmdW5jdGlvbihlKXtpZighYWMoZSkpdGhyb3cgRXJyb3IoIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLiIpO3JldHVybiBlfX07dmUuQ29tcG9uZW50PXRhO3ZlLkZyYWdtZW50PW14O3ZlLlByb2ZpbGVyPXl4O3ZlLlB1cmVDb21wb25lbnQ9bmM7dmUuU3RyaWN0TW9kZT12eDt2ZS5TdXNwZW5zZT14eDt2ZS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1feDt2ZS5hY3Q9V2g7dmUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj1QaCh7fSxlLnByb3BzKSxvPWUua2V5LGE9ZS5yZWYsaT1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGE9dC5yZWYsaT1vYy5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKG89IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihsIGluIHQpemguY2FsbCh0LGwpJiYhRmguaGFzT3duUHJvcGVydHkobCkmJihyW2xdPXRbbF09PT12b2lkIDAmJnMhPT12b2lkIDA/c1tsXTp0W2xdKX12YXIgbD1hcmd1bWVudHMubGVuZ3RoLTI7aWYobD09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxsKXtzPUFycmF5KGwpO2Zvcih2YXIgZD0wO2Q8bDtkKyspc1tkXT1hcmd1bWVudHNbZCsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOkphLHR5cGU6ZS50eXBlLGtleTpvLHJlZjphLHByb3BzOnIsX293bmVyOml9fTt2ZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpieCxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOnd4LF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07dmUuY3JlYXRlRWxlbWVudD0kaDt2ZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PSRoLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07dmUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O3ZlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOmt4LHJlbmRlcjplfX07dmUuaXNWYWxpZEVsZW1lbnQ9YWM7dmUubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6RXgsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpBeH19O3ZlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6U3gsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTt2ZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9T3MudHJhbnNpdGlvbjtPcy50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtPcy50cmFuc2l0aW9uPXR9fTt2ZS51bnN0YWJsZV9hY3Q9V2g7dmUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUHQuY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTt2ZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBQdC5jdXJyZW50LnVzZUNvbnRleHQoZSl9O3ZlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O3ZlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFB0LmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07dmUudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFB0LmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O3ZlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIFB0LmN1cnJlbnQudXNlSWQoKX07dmUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFB0LmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O3ZlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBQdC5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTt2ZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUHQuY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07dmUudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBQdC5jdXJyZW50LnVzZU1lbW8oZSx0KX07dmUudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFB0LmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O3ZlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gUHQuY3VycmVudC51c2VSZWYoZSl9O3ZlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBQdC5jdXJyZW50LnVzZVN0YXRlKGUpfTt2ZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFB0LmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTt2ZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIFB0LmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTt2ZS52ZXJzaW9uPSIxOC4zLjEifSk7dmFyIHllPWZyKChXSSxIaCk9PnsidXNlIHN0cmljdCI7SGguZXhwb3J0cz1CaCgpfSk7dmFyIFpoPWZyKEhlPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGRjKGUsdCl7dmFyIG49ZS5sZW5ndGg7ZS5wdXNoKHQpO2U6Zm9yKDswPG47KXt2YXIgcj1uLTE+Pj4xLG89ZVtyXTtpZigwPElzKG8sdCkpZVtyXT10LGVbbl09byxuPXI7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBSbihlKXtyZXR1cm4gZS5sZW5ndGg9PT0wP251bGw6ZVswXX1mdW5jdGlvbiBScyhlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIG51bGw7dmFyIHQ9ZVswXSxuPWUucG9wKCk7aWYobiE9PXQpe2VbMF09bjtlOmZvcih2YXIgcj0wLG89ZS5sZW5ndGgsYT1vPj4+MTtyPGE7KXt2YXIgaT0yKihyKzEpLTEscz1lW2ldLGw9aSsxLGQ9ZVtsXTtpZigwPklzKHMsbikpbDxvJiYwPklzKGQscyk/KGVbcl09ZCxlW2xdPW4scj1sKTooZVtyXT1zLGVbaV09bixyPWkpO2Vsc2UgaWYobDxvJiYwPklzKGQsbikpZVtyXT1kLGVbbF09bixyPWw7ZWxzZSBicmVhayBlfX1yZXR1cm4gdH1mdW5jdGlvbiBJcyhlLHQpe3ZhciBuPWUuc29ydEluZGV4LXQuc29ydEluZGV4O3JldHVybiBuIT09MD9uOmUuaWQtdC5pZH10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iPyhHaD1wZXJmb3JtYW5jZSxIZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gR2gubm93KCl9KTooaWM9RGF0ZSxqaD1pYy5ub3coKSxIZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gaWMubm93KCktamh9KTt2YXIgR2gsaWMsamgsSm49W10sVXI9W10sQ3g9MSxnbj1udWxsLFR0PTMsUHM9ITEsa289ITEsWmE9ITEsWWg9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDpudWxsLHFoPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0Om51bGwsVmg9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gY2MoZSl7Zm9yKHZhciB0PVJuKFVyKTt0IT09bnVsbDspe2lmKHQuY2FsbGJhY2s9PT1udWxsKVJzKFVyKTtlbHNlIGlmKHQuc3RhcnRUaW1lPD1lKVJzKFVyKSx0LnNvcnRJbmRleD10LmV4cGlyYXRpb25UaW1lLGRjKEpuLHQpO2Vsc2UgYnJlYWs7dD1SbihVcil9fWZ1bmN0aW9uIHVjKGUpe2lmKFphPSExLGNjKGUpLCFrbylpZihSbihKbikhPT1udWxsKWtvPSEwLGZjKHBjKTtlbHNle3ZhciB0PVJuKFVyKTt0IT09bnVsbCYmaGModWMsdC5zdGFydFRpbWUtZSl9fWZ1bmN0aW9uIHBjKGUsdCl7a289ITEsWmEmJihaYT0hMSxxaChlaSksZWk9LTEpLFBzPSEwO3ZhciBuPVR0O3RyeXtmb3IoY2ModCksZ249Um4oSm4pO2duIT09bnVsbCYmKCEoZ24uZXhwaXJhdGlvblRpbWU+dCl8fGUmJiFYaCgpKTspe3ZhciByPWduLmNhbGxiYWNrO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXtnbi5jYWxsYmFjaz1udWxsLFR0PWduLnByaW9yaXR5TGV2ZWw7dmFyIG89cihnbi5leHBpcmF0aW9uVGltZTw9dCk7dD1IZS51bnN0YWJsZV9ub3coKSx0eXBlb2Ygbz09ImZ1bmN0aW9uIj9nbi5jYWxsYmFjaz1vOmduPT09Um4oSm4pJiZScyhKbiksY2ModCl9ZWxzZSBScyhKbik7Z249Um4oSm4pfWlmKGduIT09bnVsbCl2YXIgYT0hMDtlbHNle3ZhciBpPVJuKFVyKTtpIT09bnVsbCYmaGModWMsaS5zdGFydFRpbWUtdCksYT0hMX1yZXR1cm4gYX1maW5hbGx5e2duPW51bGwsVHQ9bixQcz0hMX19dmFyIExzPSExLE1zPW51bGwsZWk9LTEsUWg9NSxKaD0tMTtmdW5jdGlvbiBYaCgpe3JldHVybiEoSGUudW5zdGFibGVfbm93KCktSmg8UWgpfWZ1bmN0aW9uIHNjKCl7aWYoTXMhPT1udWxsKXt2YXIgZT1IZS51bnN0YWJsZV9ub3coKTtKaD1lO3ZhciB0PSEwO3RyeXt0PU1zKCEwLGUpfWZpbmFsbHl7dD9YYSgpOihMcz0hMSxNcz1udWxsKX19ZWxzZSBMcz0hMX12YXIgWGE7dHlwZW9mIFZoPT0iZnVuY3Rpb24iP1hhPWZ1bmN0aW9uKCl7Vmgoc2MpfTp0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiPyhsYz1uZXcgTWVzc2FnZUNoYW5uZWwsS2g9bGMucG9ydDIsbGMucG9ydDEub25tZXNzYWdlPXNjLFhhPWZ1bmN0aW9uKCl7S2gucG9zdE1lc3NhZ2UobnVsbCl9KTpYYT1mdW5jdGlvbigpe1loKHNjLDApfTt2YXIgbGMsS2g7ZnVuY3Rpb24gZmMoZSl7TXM9ZSxMc3x8KExzPSEwLFhhKCkpfWZ1bmN0aW9uIGhjKGUsdCl7ZWk9WWgoZnVuY3Rpb24oKXtlKEhlLnVuc3RhYmxlX25vdygpKX0sdCl9SGUudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7SGUudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MTtIZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00O0hlLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7SGUudW5zdGFibGVfUHJvZmlsaW5nPW51bGw7SGUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtIZS51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihlKXtlLmNhbGxiYWNrPW51bGx9O0hlLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7a298fFBzfHwoa289ITAsZmMocGMpKX07SGUudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oZSl7MD5lfHwxMjU8ZT9jb25zb2xlLmVycm9yKCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQiKTpRaD0wPGU/TWF0aC5mbG9vcigxZTMvZSk6NX07SGUudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gVHR9O0hlLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIFJuKEpuKX07SGUudW5zdGFibGVfbmV4dD1mdW5jdGlvbihlKXtzd2l0Y2goVHQpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciB0PTM7YnJlYWs7ZGVmYXVsdDp0PVR0fXZhciBuPVR0O1R0PXQ7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtUdD1ufX07SGUudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9O0hlLnVuc3RhYmxlX3JlcXVlc3RQYWludD1mdW5jdGlvbigpe307SGUudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDplPTN9dmFyIG49VHQ7VHQ9ZTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e1R0PW59fTtIZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1IZS51bnN0YWJsZV9ub3coKTtzd2l0Y2godHlwZW9mIG49PSJvYmplY3QiJiZuIT09bnVsbD8obj1uLmRlbGF5LG49dHlwZW9mIG49PSJudW1iZXIiJiYwPG4/cituOnIpOm49cixlKXtjYXNlIDE6dmFyIG89LTE7YnJlYWs7Y2FzZSAyOm89MjUwO2JyZWFrO2Nhc2UgNTpvPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0Om89MWU0O2JyZWFrO2RlZmF1bHQ6bz01ZTN9cmV0dXJuIG89bitvLGU9e2lkOkN4KyssY2FsbGJhY2s6dCxwcmlvcml0eUxldmVsOmUsc3RhcnRUaW1lOm4sZXhwaXJhdGlvblRpbWU6byxzb3J0SW5kZXg6LTF9LG4+cj8oZS5zb3J0SW5kZXg9bixkYyhVcixlKSxSbihKbik9PT1udWxsJiZlPT09Um4oVXIpJiYoWmE/KHFoKGVpKSxlaT0tMSk6WmE9ITAsaGModWMsbi1yKSkpOihlLnNvcnRJbmRleD1vLGRjKEpuLGUpLGtvfHxQc3x8KGtvPSEwLGZjKHBjKSkpLGV9O0hlLnVuc3RhYmxlX3Nob3VsZFlpZWxkPVhoO0hlLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihlKXt2YXIgdD1UdDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1UdDtUdD10O3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtUdD1ufX19fSk7dmFyIHRnPWZyKChISSxlZyk9PnsidXNlIHN0cmljdCI7ZWcuZXhwb3J0cz1aaCgpfSk7dmFyIGF5PWZyKHNuPT57InVzZSBzdHJpY3QiO3ZhciBPeD15ZSgpLG9uPXRnKCk7ZnVuY3Rpb24gTChlKXtmb3IodmFyIHQ9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbbl0pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciBsbT1uZXcgU2V0LHhpPXt9O2Z1bmN0aW9uIFJvKGUsdCl7eGEoZSx0KSx4YShlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiB4YShlLHQpe2Zvcih4aVtlXT10LGU9MDtlPHQubGVuZ3RoO2UrKylsbS5hZGQodFtlXSl9dmFyIHdyPSEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ+InUiKSxVYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEl4PS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sbmc9e30scmc9e307ZnVuY3Rpb24gTXgoZSl7cmV0dXJuIFVjLmNhbGwocmcsZSk/ITA6VWMuY2FsbChuZyxlKT8hMTpJeC50ZXN0KGUpP3JnW2VdPSEwOihuZ1tlXT0hMCwhMSl9ZnVuY3Rpb24gUngoZSx0LG4scil7aWYobiE9PW51bGwmJm4udHlwZT09PTApcmV0dXJuITE7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4gcj8hMTpuIT09bnVsbD8hbi5hY2NlcHRzQm9vbGVhbnM6KGU9ZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSksZSE9PSJkYXRhLSImJmUhPT0iYXJpYS0iKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBQeChlLHQsbixyKXtpZih0PT09bnVsbHx8dHlwZW9mIHQ+InUifHxSeChlLHQsbixyKSlyZXR1cm4hMDtpZihyKXJldHVybiExO2lmKG4hPT1udWxsKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuIHQ9PT0hMTtjYXNlIDU6cmV0dXJuIGlzTmFOKHQpO2Nhc2UgNjpyZXR1cm4gaXNOYU4odCl8fDE+dH1yZXR1cm4hMX1mdW5jdGlvbiB6dChlLHQsbixyLG8sYSxpKXt0aGlzLmFjY2VwdHNCb29sZWFucz10PT09Mnx8dD09PTN8fHQ9PT00LHRoaXMuYXR0cmlidXRlTmFtZT1yLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW8sdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9YSx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWl9dmFyIFN0PXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXtTdFtlXT1uZXcgenQoZSwwLCExLGUsbnVsbCwhMSwhMSl9KTtbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtTdFt0XT1uZXcgenQodCwxLCExLGVbMV0sbnVsbCwhMSwhMSl9KTtbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7U3RbZV09bmV3IHp0KGUsMiwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1N0W2VdPW5ldyB6dChlLDIsITEsZSxudWxsLCExLCExKX0pOyJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7U3RbZV09bmV3IHp0KGUsMywhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1N0W2VdPW5ldyB6dChlLDMsITAsZSxudWxsLCExLCExKX0pO1siY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtTdFtlXT1uZXcgenQoZSw0LCExLGUsbnVsbCwhMSwhMSl9KTtbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1N0W2VdPW5ldyB6dChlLDYsITEsZSxudWxsLCExLCExKX0pO1sicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaChmdW5jdGlvbihlKXtTdFtlXT1uZXcgenQoZSw1LCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBfdT0vW1wtOl0oW2Etel0pL2c7ZnVuY3Rpb24gQ3UoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoX3UsQ3UpO1N0W3RdPW5ldyB6dCh0LDEsITEsZSxudWxsLCExLCExKX0pOyJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoX3UsQ3UpO1N0W3RdPW5ldyB6dCh0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITEsITEpfSk7WyJ4bWw6YmFzZSIsInhtbDpsYW5nIiwieG1sOnNwYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoX3UsQ3UpO1N0W3RdPW5ldyB6dCh0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KTtbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1N0W2VdPW5ldyB6dChlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7U3QueGxpbmtIcmVmPW5ldyB6dCgieGxpbmtIcmVmIiwxLCExLCJ4bGluazpocmVmIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITAsITEpO1sic3JjIiwiaHJlZiIsImFjdGlvbiIsImZvcm1BY3Rpb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1N0W2VdPW5ldyB6dChlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7ZnVuY3Rpb24gT3UoZSx0LG4scil7dmFyIG89U3QuaGFzT3duUHJvcGVydHkodCk/U3RbdF06bnVsbDsobyE9PW51bGw/by50eXBlIT09MDpyfHwhKDI8dC5sZW5ndGgpfHx0WzBdIT09Im8iJiZ0WzBdIT09Ik8ifHx0WzFdIT09Im4iJiZ0WzFdIT09Ik4iKSYmKFB4KHQsbixvLHIpJiYobj1udWxsKSxyfHxvPT09bnVsbD9NeCh0KSYmKG49PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpOm8ubXVzdFVzZVByb3BlcnR5P2Vbby5wcm9wZXJ0eU5hbWVdPW49PT1udWxsP28udHlwZT09PTM/ITE6IiI6bjoodD1vLmF0dHJpYnV0ZU5hbWUscj1vLmF0dHJpYnV0ZU5hbWVzcGFjZSxuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobz1vLnR5cGUsbj1vPT09M3x8bz09PTQmJm49PT0hMD8iIjoiIituLHI/ZS5zZXRBdHRyaWJ1dGVOUyhyLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX12YXIgU3I9T3guX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsVXM9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLG9hPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLGFhPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksSXU9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSx6Yz1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLGRtPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksY209U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLE11PVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksRmM9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSwkYz1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksUnU9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLEZyPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKTtTeW1ib2wuZm9yKCJyZWFjdC5zY29wZSIpO1N5bWJvbC5mb3IoInJlYWN0LmRlYnVnX3RyYWNlX21vZGUiKTt2YXIgdW09U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIik7U3ltYm9sLmZvcigicmVhY3QubGVnYWN5X2hpZGRlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmNhY2hlIik7U3ltYm9sLmZvcigicmVhY3QudHJhY2luZ19tYXJrZXIiKTt2YXIgb2c9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIHRpKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9b2cmJmVbb2ddfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgZXQ9T2JqZWN0LmFzc2lnbixnYztmdW5jdGlvbiBkaShlKXtpZihnYz09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgdD1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7Z2M9dCYmdFsxXXx8IiJ9cmV0dXJuYApgK2djK2V9dmFyIG1jPSExO2Z1bmN0aW9uIHZjKGUsdCl7aWYoIWV8fG1jKXJldHVybiIiO21jPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKGQpe3ZhciByPWR9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaChkKXtyPWR9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKGQpe3I9ZH1lKCl9fWNhdGNoKGQpe2lmKGQmJnImJnR5cGVvZiBkLnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBvPWQuc3RhY2suc3BsaXQoYApgKSxhPXIuc3RhY2suc3BsaXQoYApgKSxpPW8ubGVuZ3RoLTEscz1hLmxlbmd0aC0xOzE8PWkmJjA8PXMmJm9baV0hPT1hW3NdOylzLS07Zm9yKDsxPD1pJiYwPD1zO2ktLSxzLS0paWYob1tpXSE9PWFbc10pe2lmKGkhPT0xfHxzIT09MSlkbyBpZihpLS0scy0tLDA+c3x8b1tpXSE9PWFbc10pe3ZhciBsPWAKYCtvW2ldLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZsLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYobD1sLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksbH13aGlsZSgxPD1pJiYwPD1zKTticmVha319fWZpbmFsbHl7bWM9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/ZGkoZSk6IiJ9ZnVuY3Rpb24gTHgoZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIGRpKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gZGkoIkxhenkiKTtjYXNlIDEzOnJldHVybiBkaSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBkaSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPXZjKGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPXZjKGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPXZjKGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBXYyhlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIGFhOnJldHVybiJGcmFnbWVudCI7Y2FzZSBvYTpyZXR1cm4iUG9ydGFsIjtjYXNlIHpjOnJldHVybiJQcm9maWxlciI7Y2FzZSBJdTpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBGYzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgJGM6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGNtOnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgZG06cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBNdTp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBSdTpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6V2MoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgRnI6dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIFdjKGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gVXgoZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gV2ModCk7Y2FzZSA4OnJldHVybiB0PT09SXU/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWnIoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBwbShlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIHp4KGUpe3ZhciB0PXBtKGUpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxyPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBvPW4uZ2V0LGE9bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oaSl7cj0iIitpLGEuY2FsbCh0aGlzLGkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGkpe3I9IiIraX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24genMoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPXp4KGUpKX1mdW5jdGlvbiBmbShlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIGUmJihyPXBtKGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPXIsZSE9PW4/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIHBsKGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBCYyhlLHQpe3ZhciBuPXQuY2hlY2tlZDtyZXR1cm4gZXQoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gYWcoZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxyPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPVpyKHQudmFsdWUhPW51bGw/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBobShlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJk91KGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIEhjKGUsdCl7aG0oZSx0KTt2YXIgbj1acih0LnZhbHVlKSxyPXQudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9bikmJihlLnZhbHVlPSIiK24pOmUudmFsdWUhPT0iIituJiYoZS52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP0djKGUsdC50eXBlLG4pOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZHYyhlLHQudHlwZSxacih0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBpZyhlLHQsbil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPXQudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fW49ZS5uYW1lLG4hPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJihlLm5hbWU9bil9ZnVuY3Rpb24gR2MoZSx0LG4peyh0IT09Im51bWJlciJ8fHBsKGUub3duZXJEb2N1bWVudCkhPT1lKSYmKG49PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK24mJihlLmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIGNpPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gbWEoZSx0LG4scil7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl0WyIkIituW29dXT0hMDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKW89dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtuXS52YWx1ZSksZVtuXS5zZWxlY3RlZCE9PW8mJihlW25dLnNlbGVjdGVkPW8pLG8mJnImJihlW25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIitacihuKSx0PW51bGwsbz0wO288ZS5sZW5ndGg7bysrKXtpZihlW29dLnZhbHVlPT09bil7ZVtvXS5zZWxlY3RlZD0hMCxyJiYoZVtvXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtvXS5kaXNhYmxlZHx8KHQ9ZVtvXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gamMoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKEwoOTEpKTtyZXR1cm4gZXQoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIHNnKGUsdCl7dmFyIG49dC52YWx1ZTtpZihuPT1udWxsKXtpZihuPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKEwoOTIpKTtpZihjaShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihMKDkzKSk7bj1uWzBdfXQ9bn10PT1udWxsJiYodD0iIiksbj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOlpyKG4pfX1mdW5jdGlvbiBnbShlLHQpe3ZhciBuPVpyKHQudmFsdWUpLHI9WnIodC5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PWUudmFsdWUmJihlLnZhbHVlPW4pLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PW4mJihlLmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIGxnKGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uIG1tKGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gVmMoZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9tbSh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgRnMsdm09ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKEZzPUZzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxGcy5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9RnMuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIFNpKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIGZpPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxGeD1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGZpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0Z4LmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSksZmlbdF09ZmlbZV19KX0pO2Z1bmN0aW9uIHltKGUsdCxuKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOm58fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fGZpLmhhc093blByb3BlcnR5KGUpJiZmaVtlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiB3bShlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLG89eW0obix0W25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP2Uuc2V0UHJvcGVydHkobixvKTplW25dPW99fXZhciAkeD1ldCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBLYyhlLHQpe2lmKHQpe2lmKCR4W2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoTCgxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoTCg2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKEwoNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoTCg2MikpfX1mdW5jdGlvbiBZYyhlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgcWM9bnVsbDtmdW5jdGlvbiBQdShlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIFFjPW51bGwsdmE9bnVsbCx5YT1udWxsO2Z1bmN0aW9uIGRnKGUpe2lmKGU9V2koZSkpe2lmKHR5cGVvZiBRYyE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihMKDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PSRsKHQpLFFjKGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIGJtKGUpe3ZhP3lhP3lhLnB1c2goZSk6eWE9W2VdOnZhPWV9ZnVuY3Rpb24ga20oKXtpZih2YSl7dmFyIGU9dmEsdD15YTtpZih5YT12YT1udWxsLGRnKGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKylkZyh0W2VdKX19ZnVuY3Rpb24geG0oZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBTbSgpe312YXIgeWM9ITE7ZnVuY3Rpb24gRW0oZSx0LG4pe2lmKHljKXJldHVybiBlKHQsbik7eWM9ITA7dHJ5e3JldHVybiB4bShlLHQsbil9ZmluYWxseXt5Yz0hMSwodmEhPT1udWxsfHx5YSE9PW51bGwpJiYoU20oKSxrbSgpKX19ZnVuY3Rpb24gRWkoZSx0KXt2YXIgbj1lLnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj0kbChuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KGU9ZS50eXBlLHI9IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hcjticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKEwoMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgSmM9ITE7aWYod3IpdHJ5e25hPXt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe0pjPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixuYSxuYSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLG5hLG5hKX1jYXRjaHtKYz0hMX12YXIgbmE7ZnVuY3Rpb24gV3goZSx0LG4scixvLGEsaSxzLGwpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShuLGQpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIGhpPSExLGZsPW51bGwsaGw9ITEsWGM9bnVsbCxCeD17b25FcnJvcjpmdW5jdGlvbihlKXtoaT0hMCxmbD1lfX07ZnVuY3Rpb24gSHgoZSx0LG4scixvLGEsaSxzLGwpe2hpPSExLGZsPW51bGwsV3guYXBwbHkoQngsYXJndW1lbnRzKX1mdW5jdGlvbiBHeChlLHQsbixyLG8sYSxpLHMsbCl7aWYoSHguYXBwbHkodGhpcyxhcmd1bWVudHMpLGhpKXtpZihoaSl7dmFyIGQ9Zmw7aGk9ITEsZmw9bnVsbH1lbHNlIHRocm93IEVycm9yKEwoMTk4KSk7aGx8fChobD0hMCxYYz1kKX19ZnVuY3Rpb24gUG8oZSl7dmFyIHQ9ZSxuPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBObShlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGNnKGUpe2lmKFBvKGUpIT09ZSl0aHJvdyBFcnJvcihMKDE4OCkpfWZ1bmN0aW9uIGp4KGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PVBvKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKEwoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxyPXQ7Oyl7dmFyIG89bi5yZXR1cm47aWYobz09PW51bGwpYnJlYWs7dmFyIGE9by5hbHRlcm5hdGU7aWYoYT09PW51bGwpe2lmKHI9by5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihvLmNoaWxkPT09YS5jaGlsZCl7Zm9yKGE9by5jaGlsZDthOyl7aWYoYT09PW4pcmV0dXJuIGNnKG8pLGU7aWYoYT09PXIpcmV0dXJuIGNnKG8pLHQ7YT1hLnNpYmxpbmd9dGhyb3cgRXJyb3IoTCgxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49byxyPWE7ZWxzZXtmb3IodmFyIGk9ITEscz1vLmNoaWxkO3M7KXtpZihzPT09bil7aT0hMCxuPW8scj1hO2JyZWFrfWlmKHM9PT1yKXtpPSEwLHI9byxuPWE7YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWkpe2ZvcihzPWEuY2hpbGQ7czspe2lmKHM9PT1uKXtpPSEwLG49YSxyPW87YnJlYWt9aWYocz09PXIpe2k9ITAscj1hLG49bzticmVha31zPXMuc2libGluZ31pZighaSl0aHJvdyBFcnJvcihMKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoTCgxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoTCgxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fWZ1bmN0aW9uIFRtKGUpe3JldHVybiBlPWp4KGUpLGUhPT1udWxsP0RtKGUpOm51bGx9ZnVuY3Rpb24gRG0oZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PURtKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciBBbT1vbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLHVnPW9uLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFZ4PW9uLnVuc3RhYmxlX3Nob3VsZFlpZWxkLEt4PW9uLnVuc3RhYmxlX3JlcXVlc3RQYWludCxzdD1vbi51bnN0YWJsZV9ub3csWXg9b24udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsTHU9b24udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksX209b24udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksZ2w9b24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscXg9b24udW5zdGFibGVfTG93UHJpb3JpdHksQ209b24udW5zdGFibGVfSWRsZVByaW9yaXR5LExsPW51bGwsdHI9bnVsbDtmdW5jdGlvbiBReChlKXtpZih0ciYmdHlwZW9mIHRyLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt0ci5vbkNvbW1pdEZpYmVyUm9vdChMbCxlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIEZuPU1hdGguY2x6MzI/TWF0aC5jbHozMjpaeCxKeD1NYXRoLmxvZyxYeD1NYXRoLkxOMjtmdW5jdGlvbiBaeChlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLShKeChlKS9YeHwwKXwwfXZhciAkcz02NCxXcz00MTk0MzA0O2Z1bmN0aW9uIHVpKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBtbChlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsbz1lLnN1c3BlbmRlZExhbmVzLGE9ZS5waW5nZWRMYW5lcyxpPW4mMjY4NDM1NDU1O2lmKGkhPT0wKXt2YXIgcz1pJn5vO3MhPT0wP3I9dWkocyk6KGEmPWksYSE9PTAmJihyPXVpKGEpKSl9ZWxzZSBpPW4mfm8saSE9PTA/cj11aShpKTphIT09MCYmKHI9dWkoYSkpO2lmKHI9PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09ciYmISh0Jm8pJiYobz1yJi1yLGE9dCYtdCxvPj1hfHxvPT09MTYmJihhJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYociY0JiYocnw9biYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1yOzA8dDspbj0zMS1Gbih0KSxvPTE8PG4scnw9ZVtuXSx0Jj1+bztyZXR1cm4gcn1mdW5jdGlvbiBlMShlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiB0MShlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLHI9ZS5waW5nZWRMYW5lcyxvPWUuZXhwaXJhdGlvblRpbWVzLGE9ZS5wZW5kaW5nTGFuZXM7MDxhOyl7dmFyIGk9MzEtRm4oYSkscz0xPDxpLGw9b1tpXTtsPT09LTE/KCEocyZuKXx8cyZyKSYmKG9baV09ZTEocyx0KSk6bDw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxhJj1+c319ZnVuY3Rpb24gWmMoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIE9tKCl7dmFyIGU9JHM7cmV0dXJuICRzPDw9MSwhKCRzJjQxOTQyNDApJiYoJHM9NjQpLGV9ZnVuY3Rpb24gd2MoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gRmkoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLUZuKHQpLGVbdF09bn1mdW5jdGlvbiBuMShlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgcj1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIG89MzEtRm4obiksYT0xPDxvO3Rbb109MCxyW29dPS0xLGVbb109LTEsbiY9fmF9fWZ1bmN0aW9uIFV1KGUsdCl7dmFyIG49ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLUZuKG4pLG89MTw8cjtvJnR8ZVtyXSZ0JiYoZVtyXXw9dCksbiY9fm99fXZhciBVZT0wO2Z1bmN0aW9uIEltKGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIE1tLHp1LFJtLFBtLExtLGV1PSExLEJzPVtdLGpyPW51bGwsVnI9bnVsbCxLcj1udWxsLE5pPW5ldyBNYXAsVGk9bmV3IE1hcCxXcj1bXSxyMT0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBwZyhlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmpyPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpWcj1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjpLcj1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6TmkuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6VGkuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gbmkoZSx0LG4scixvLGEpe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PWE/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDphLHRhcmdldENvbnRhaW5lcnM6W29dfSx0IT09bnVsbCYmKHQ9V2kodCksdCE9PW51bGwmJnp1KHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1yLHQ9ZS50YXJnZXRDb250YWluZXJzLG8hPT1udWxsJiZ0LmluZGV4T2Yobyk9PT0tMSYmdC5wdXNoKG8pLGUpfWZ1bmN0aW9uIG8xKGUsdCxuLHIsbyl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIGpyPW5pKGpyLGUsdCxuLHIsbyksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBWcj1uaShWcixlLHQsbixyLG8pLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gS3I9bmkoS3IsZSx0LG4scixvKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgYT1vLnBvaW50ZXJJZDtyZXR1cm4gTmkuc2V0KGEsbmkoTmkuZ2V0KGEpfHxudWxsLGUsdCxuLHIsbykpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBhPW8ucG9pbnRlcklkLFRpLnNldChhLG5pKFRpLmdldChhKXx8bnVsbCxlLHQsbixyLG8pKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBVbShlKXt2YXIgdD1FbyhlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciBuPVBvKHQpO2lmKG4hPT1udWxsKXtpZih0PW4udGFnLHQ9PT0xMyl7aWYodD1ObShuKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxMbShlLnByaW9yaXR5LGZ1bmN0aW9uKCl7Um0obil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBubChlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIG49dHUoZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249ZS5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7cWM9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLHFjPW51bGx9ZWxzZSByZXR1cm4gdD1XaShuKSx0IT09bnVsbCYmenUodCksZS5ibG9ja2VkT249biwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gZmcoZSx0LG4pe25sKGUpJiZuLmRlbGV0ZSh0KX1mdW5jdGlvbiBhMSgpe2V1PSExLGpyIT09bnVsbCYmbmwoanIpJiYoanI9bnVsbCksVnIhPT1udWxsJiZubChWcikmJihWcj1udWxsKSxLciE9PW51bGwmJm5sKEtyKSYmKEtyPW51bGwpLE5pLmZvckVhY2goZmcpLFRpLmZvckVhY2goZmcpfWZ1bmN0aW9uIHJpKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxldXx8KGV1PSEwLG9uLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sob24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksYTEpKSl9ZnVuY3Rpb24gRGkoZSl7ZnVuY3Rpb24gdChvKXtyZXR1cm4gcmkobyxlKX1pZigwPEJzLmxlbmd0aCl7cmkoQnNbMF0sZSk7Zm9yKHZhciBuPTE7bjxCcy5sZW5ndGg7bisrKXt2YXIgcj1Cc1tuXTtyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKGpyIT09bnVsbCYmcmkoanIsZSksVnIhPT1udWxsJiZyaShWcixlKSxLciE9PW51bGwmJnJpKEtyLGUpLE5pLmZvckVhY2godCksVGkuZm9yRWFjaCh0KSxuPTA7bjxXci5sZW5ndGg7bisrKXI9V3Jbbl0sci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPFdyLmxlbmd0aCYmKG49V3JbMF0sbi5ibG9ja2VkT249PT1udWxsKTspVW0obiksbi5ibG9ja2VkT249PT1udWxsJiZXci5zaGlmdCgpfXZhciB3YT1Tci5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyx2bD0hMDtmdW5jdGlvbiBpMShlLHQsbixyKXt2YXIgbz1VZSxhPXdhLnRyYW5zaXRpb247d2EudHJhbnNpdGlvbj1udWxsO3RyeXtVZT0xLEZ1KGUsdCxuLHIpfWZpbmFsbHl7VWU9byx3YS50cmFuc2l0aW9uPWF9fWZ1bmN0aW9uIHMxKGUsdCxuLHIpe3ZhciBvPVVlLGE9d2EudHJhbnNpdGlvbjt3YS50cmFuc2l0aW9uPW51bGw7dHJ5e1VlPTQsRnUoZSx0LG4scil9ZmluYWxseXtVZT1vLHdhLnRyYW5zaXRpb249YX19ZnVuY3Rpb24gRnUoZSx0LG4scil7aWYodmwpe3ZhciBvPXR1KGUsdCxuLHIpO2lmKG89PT1udWxsKVRjKGUsdCxyLHlsLG4pLHBnKGUscik7ZWxzZSBpZihvMShvLGUsdCxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihwZyhlLHIpLHQmNCYmLTE8cjEuaW5kZXhPZihlKSl7Zm9yKDtvIT09bnVsbDspe3ZhciBhPVdpKG8pO2lmKGEhPT1udWxsJiZNbShhKSxhPXR1KGUsdCxuLHIpLGE9PT1udWxsJiZUYyhlLHQscix5bCxuKSxhPT09bylicmVhaztvPWF9byE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBUYyhlLHQscixudWxsLG4pfX12YXIgeWw9bnVsbDtmdW5jdGlvbiB0dShlLHQsbixyKXtpZih5bD1udWxsLGU9UHUociksZT1FbyhlKSxlIT09bnVsbClpZih0PVBvKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKG49dC50YWcsbj09PTEzKXtpZihlPU5tKHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKG49PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4geWw9ZSxudWxsfWZ1bmN0aW9uIHptKGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChZeCgpKXtjYXNlIEx1OnJldHVybiAxO2Nhc2UgX206cmV0dXJuIDQ7Y2FzZSBnbDpjYXNlIHF4OnJldHVybiAxNjtjYXNlIENtOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBIcj1udWxsLCR1PW51bGwscmw9bnVsbDtmdW5jdGlvbiBGbSgpe2lmKHJsKXJldHVybiBybDt2YXIgZSx0PSR1LG49dC5sZW5ndGgscixvPSJ2YWx1ZSJpbiBIcj9Ici52YWx1ZTpIci50ZXh0Q29udGVudCxhPW8ubGVuZ3RoO2ZvcihlPTA7ZTxuJiZ0W2VdPT09b1tlXTtlKyspO3ZhciBpPW4tZTtmb3Iocj0xO3I8PWkmJnRbbi1yXT09PW9bYS1yXTtyKyspO3JldHVybiBybD1vLnNsaWNlKGUsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIG9sKGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIEhzKCl7cmV0dXJuITB9ZnVuY3Rpb24gaGcoKXtyZXR1cm4hMX1mdW5jdGlvbiBhbihlKXtmdW5jdGlvbiB0KG4scixvLGEsaSl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1vLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9YSx0aGlzLnRhcmdldD1pLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihuPWVbc10sdGhpc1tzXT1uP24oYSk6YVtzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShhLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/YS5kZWZhdWx0UHJldmVudGVkOmEucmV0dXJuVmFsdWU9PT0hMSk/SHM6aGcsdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1oZyx0aGlzfXJldHVybiBldCh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPUhzKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUhzKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OkhzfSksdH12YXIgX2E9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sV3U9YW4oX2EpLCRpPWV0KHt9LF9hLHt2aWV3OjAsZGV0YWlsOjB9KSxsMT1hbigkaSksYmMsa2Msb2ksVWw9ZXQoe30sJGkse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6QnUsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09b2kmJihvaSYmZS50eXBlPT09Im1vdXNlbW92ZSI/KGJjPWUuc2NyZWVuWC1vaS5zY3JlZW5YLGtjPWUuc2NyZWVuWS1vaS5zY3JlZW5ZKTprYz1iYz0wLG9pPWUpLGJjKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTprY319KSxnZz1hbihVbCksZDE9ZXQoe30sVWwse2RhdGFUcmFuc2ZlcjowfSksYzE9YW4oZDEpLHUxPWV0KHt9LCRpLHtyZWxhdGVkVGFyZ2V0OjB9KSx4Yz1hbih1MSkscDE9ZXQoe30sX2Ese2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLGYxPWFuKHAxKSxoMT1ldCh7fSxfYSx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxnMT1hbihoMSksbTE9ZXQoe30sX2Ese2RhdGE6MH0pLG1nPWFuKG0xKSx2MT17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0seTE9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSx3MT17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIGIxKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9dzFbZV0pPyEhdFtlXTohMX1mdW5jdGlvbiBCdSgpe3JldHVybiBiMX12YXIgazE9ZXQoe30sJGkse2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9djFbZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9b2woZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP3kxW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpCdSxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9vbChlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP29sKGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSx4MT1hbihrMSksUzE9ZXQoe30sVWwse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksdmc9YW4oUzEpLEUxPWV0KHt9LCRpLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6QnV9KSxOMT1hbihFMSksVDE9ZXQoe30sX2Ese3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksRDE9YW4oVDEpLEExPWV0KHt9LFVsLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksXzE9YW4oQTEpLEMxPVs5LDEzLDI3LDMyXSxIdT13ciYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGdpPW51bGw7d3ImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihnaT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBPMT13ciYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFnaSwkbT13ciYmKCFIdXx8Z2kmJjg8Z2kmJjExPj1naSkseWc9IiAiLHdnPSExO2Z1bmN0aW9uIFdtKGUsdCl7c3dpdGNoKGUpe2Nhc2Uia2V5dXAiOnJldHVybiBDMS5pbmRleE9mKHQua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiB0LmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIEJtKGUpe3JldHVybiBlPWUuZGV0YWlsLHR5cGVvZiBlPT0ib2JqZWN0IiYmImRhdGEiaW4gZT9lLmRhdGE6bnVsbH12YXIgaWE9ITE7ZnVuY3Rpb24gSTEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIEJtKHQpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiB0LndoaWNoIT09MzI/bnVsbDood2c9ITAseWcpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gZT10LmRhdGEsZT09PXlnJiZ3Zz9udWxsOmU7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gTTEoZSx0KXtpZihpYSlyZXR1cm4gZT09PSJjb21wb3NpdGlvbmVuZCJ8fCFIdSYmV20oZSx0KT8oZT1GbSgpLHJsPSR1PUhyPW51bGwsaWE9ITEsZSk6bnVsbDtzd2l0Y2goZSl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoISh0LmN0cmxLZXl8fHQuYWx0S2V5fHx0Lm1ldGFLZXkpfHx0LmN0cmxLZXkmJnQuYWx0S2V5KXtpZih0LmNoYXImJjE8dC5jaGFyLmxlbmd0aClyZXR1cm4gdC5jaGFyO2lmKHQud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuICRtJiZ0LmxvY2FsZSE9PSJrbyI/bnVsbDp0LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIFIxPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBiZyhlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiPyEhUjFbZS50eXBlXTp0PT09InRleHRhcmVhIn1mdW5jdGlvbiBIbShlLHQsbixyKXtibShyKSx0PXdsKHQsIm9uQ2hhbmdlIiksMDx0Lmxlbmd0aCYmKG49bmV3IFd1KCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLHIpLGUucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6dH0pKX12YXIgbWk9bnVsbCxBaT1udWxsO2Z1bmN0aW9uIFAxKGUpe2V2KGUsMCl9ZnVuY3Rpb24gemwoZSl7dmFyIHQ9ZGEoZSk7aWYoZm0odCkpcmV0dXJuIGV9ZnVuY3Rpb24gTDEoZSx0KXtpZihlPT09ImNoYW5nZSIpcmV0dXJuIHR9dmFyIEdtPSExO3dyJiYod3I/KGpzPSJvbmlucHV0ImluIGRvY3VtZW50LGpzfHwoU2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksU2Muc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLGpzPXR5cGVvZiBTYy5vbmlucHV0PT0iZnVuY3Rpb24iKSxHcz1qcyk6R3M9ITEsR209R3MmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSkpO3ZhciBHcyxqcyxTYztmdW5jdGlvbiBrZygpe21pJiYobWkuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGptKSxBaT1taT1udWxsKX1mdW5jdGlvbiBqbShlKXtpZihlLnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJnpsKEFpKSl7dmFyIHQ9W107SG0odCxBaSxlLFB1KGUpKSxFbShQMSx0KX19ZnVuY3Rpb24gVTEoZSx0LG4pe2U9PT0iZm9jdXNpbiI/KGtnKCksbWk9dCxBaT1uLG1pLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixqbSkpOmU9PT0iZm9jdXNvdXQiJiZrZygpfWZ1bmN0aW9uIHoxKGUpe2lmKGU9PT0ic2VsZWN0aW9uY2hhbmdlInx8ZT09PSJrZXl1cCJ8fGU9PT0ia2V5ZG93biIpcmV0dXJuIHpsKEFpKX1mdW5jdGlvbiBGMShlLHQpe2lmKGU9PT0iY2xpY2siKXJldHVybiB6bCh0KX1mdW5jdGlvbiAkMShlLHQpe2lmKGU9PT0iaW5wdXQifHxlPT09ImNoYW5nZSIpcmV0dXJuIHpsKHQpfWZ1bmN0aW9uIFcxKGUsdCl7cmV0dXJuIGU9PT10JiYoZSE9PTB8fDEvZT09PTEvdCl8fGUhPT1lJiZ0IT09dH12YXIgV249dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6VzE7ZnVuY3Rpb24gX2koZSx0KXtpZihXbihlLHQpKXJldHVybiEwO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07aWYoIVVjLmNhbGwodCxvKXx8IVduKGVbb10sdFtvXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24geGcoZSl7Zm9yKDtlJiZlLmZpcnN0Q2hpbGQ7KWU9ZS5maXJzdENoaWxkO3JldHVybiBlfWZ1bmN0aW9uIFNnKGUsdCl7dmFyIG49eGcoZSk7ZT0wO2Zvcih2YXIgcjtuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKHI9ZStuLnRleHRDb250ZW50Lmxlbmd0aCxlPD10JiZyPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtZX07ZT1yfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49eGcobil9fWZ1bmN0aW9uIFZtKGUsdCl7cmV0dXJuIGUmJnQ/ZT09PXQ/ITA6ZSYmZS5ub2RlVHlwZT09PTM/ITE6dCYmdC5ub2RlVHlwZT09PTM/Vm0oZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBlP2UuY29udGFpbnModCk6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KTohMTohMX1mdW5jdGlvbiBLbSgpe2Zvcih2YXIgZT13aW5kb3csdD1wbCgpO3QgaW5zdGFuY2VvZiBlLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiB0LmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKWU9dC5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7dD1wbChlLmRvY3VtZW50KX1yZXR1cm4gdH1mdW5jdGlvbiBHdShlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJih0PT09ImlucHV0IiYmKGUudHlwZT09PSJ0ZXh0Inx8ZS50eXBlPT09InNlYXJjaCJ8fGUudHlwZT09PSJ0ZWwifHxlLnR5cGU9PT0idXJsInx8ZS50eXBlPT09InBhc3N3b3JkIil8fHQ9PT0idGV4dGFyZWEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gQjEoZSl7dmFyIHQ9S20oKSxuPWUuZm9jdXNlZEVsZW0scj1lLnNlbGVjdGlvblJhbmdlO2lmKHQhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJlZtKG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKHIhPT1udWxsJiZHdShuKSl7aWYodD1yLnN0YXJ0LGU9ci5lbmQsZT09PXZvaWQgMCYmKGU9dCksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD10LG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKGUsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZT0odD1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmdC5kZWZhdWx0Vmlld3x8d2luZG93LGUuZ2V0U2VsZWN0aW9uKXtlPWUuZ2V0U2VsZWN0aW9uKCk7dmFyIG89bi50ZXh0Q29udGVudC5sZW5ndGgsYT1NYXRoLm1pbihyLnN0YXJ0LG8pO3I9ci5lbmQ9PT12b2lkIDA/YTpNYXRoLm1pbihyLmVuZCxvKSwhZS5leHRlbmQmJmE+ciYmKG89cixyPWEsYT1vKSxvPVNnKG4sYSk7dmFyIGk9U2cobixyKTtvJiZpJiYoZS5yYW5nZUNvdW50IT09MXx8ZS5hbmNob3JOb2RlIT09by5ub2RlfHxlLmFuY2hvck9mZnNldCE9PW8ub2Zmc2V0fHxlLmZvY3VzTm9kZSE9PWkubm9kZXx8ZS5mb2N1c09mZnNldCE9PWkub2Zmc2V0KSYmKHQ9dC5jcmVhdGVSYW5nZSgpLHQuc2V0U3RhcnQoby5ub2RlLG8ub2Zmc2V0KSxlLnJlbW92ZUFsbFJhbmdlcygpLGE+cj8oZS5hZGRSYW5nZSh0KSxlLmV4dGVuZChpLm5vZGUsaS5vZmZzZXQpKToodC5zZXRFbmQoaS5ub2RlLGkub2Zmc2V0KSxlLmFkZFJhbmdlKHQpKSl9fWZvcih0PVtdLGU9bjtlPWUucGFyZW50Tm9kZTspZS5ub2RlVHlwZT09PTEmJnQucHVzaCh7ZWxlbWVudDplLGxlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0sZS5lbGVtZW50LnNjcm9sbExlZnQ9ZS5sZWZ0LGUuZWxlbWVudC5zY3JvbGxUb3A9ZS50b3B9fXZhciBIMT13ciYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxzYT1udWxsLG51PW51bGwsdmk9bnVsbCxydT0hMTtmdW5jdGlvbiBFZyhlLHQsbil7dmFyIHI9bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7cnV8fHNhPT1udWxsfHxzYSE9PXBsKHIpfHwocj1zYSwic2VsZWN0aW9uU3RhcnQiaW4gciYmR3Uocik/cj17c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxyPXthbmNob3JOb2RlOnIuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9KSx2aSYmX2kodmkscil8fCh2aT1yLHI9d2wobnUsIm9uU2VsZWN0IiksMDxyLmxlbmd0aCYmKHQ9bmV3IFd1KCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCx0LG4pLGUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6cn0pLHQudGFyZ2V0PXNhKSkpfWZ1bmN0aW9uIFZzKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxufXZhciBsYT17YW5pbWF0aW9uZW5kOlZzKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246VnMoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OlZzKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6VnMoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LEVjPXt9LFltPXt9O3dyJiYoWW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBsYS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBsYS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBsYS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgbGEudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBGbChlKXtpZihFY1tlXSlyZXR1cm4gRWNbZV07aWYoIWxhW2VdKXJldHVybiBlO3ZhciB0PWxhW2VdLG47Zm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIFltKXJldHVybiBFY1tlXT10W25dO3JldHVybiBlfXZhciBxbT1GbCgiYW5pbWF0aW9uZW5kIiksUW09RmwoImFuaW1hdGlvbml0ZXJhdGlvbiIpLEptPUZsKCJhbmltYXRpb25zdGFydCIpLFhtPUZsKCJ0cmFuc2l0aW9uZW5kIiksWm09bmV3IE1hcCxOZz0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gdG8oZSx0KXtabS5zZXQoZSx0KSxSbyh0LFtlXSl9Zm9yKEtzPTA7S3M8TmcubGVuZ3RoO0tzKyspWXM9TmdbS3NdLFRnPVlzLnRvTG93ZXJDYXNlKCksRGc9WXNbMF0udG9VcHBlckNhc2UoKStZcy5zbGljZSgxKSx0byhUZywib24iK0RnKTt2YXIgWXMsVGcsRGcsS3M7dG8ocW0sIm9uQW5pbWF0aW9uRW5kIik7dG8oUW0sIm9uQW5pbWF0aW9uSXRlcmF0aW9uIik7dG8oSm0sIm9uQW5pbWF0aW9uU3RhcnQiKTt0bygiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIik7dG8oImZvY3VzaW4iLCJvbkZvY3VzIik7dG8oImZvY3Vzb3V0Iiwib25CbHVyIik7dG8oWG0sIm9uVHJhbnNpdGlvbkVuZCIpO3hhKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7eGEoIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTt4YSgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO3hhKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7Um8oIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO1JvKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7Um8oIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pO1JvKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO1JvKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTtSbygib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgcGk9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLEcxPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQocGkpKTtmdW5jdGlvbiBBZyhlLHQsbil7dmFyIHI9ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sR3gocix0LHZvaWQgMCxlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBldihlLHQpe3Q9KHQmNCkhPT0wO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLG89ci5ldmVudDtyPXIubGlzdGVuZXJzO2U6e3ZhciBhPXZvaWQgMDtpZih0KWZvcih2YXIgaT1yLmxlbmd0aC0xOzA8PWk7aS0tKXt2YXIgcz1yW2ldLGw9cy5pbnN0YW5jZSxkPXMuY3VycmVudFRhcmdldDtpZihzPXMubGlzdGVuZXIsbCE9PWEmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO0FnKG8scyxkKSxhPWx9ZWxzZSBmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKXtpZihzPXJbaV0sbD1zLmluc3RhbmNlLGQ9cy5jdXJyZW50VGFyZ2V0LHM9cy5saXN0ZW5lcixsIT09YSYmby5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7QWcobyxzLGQpLGE9bH19fWlmKGhsKXRocm93IGU9WGMsaGw9ITEsWGM9bnVsbCxlfWZ1bmN0aW9uIEtlKGUsdCl7dmFyIG49dFtsdV07bj09PXZvaWQgMCYmKG49dFtsdV09bmV3IFNldCk7dmFyIHI9ZSsiX19idWJibGUiO24uaGFzKHIpfHwodHYodCxlLDIsITEpLG4uYWRkKHIpKX1mdW5jdGlvbiBOYyhlLHQsbil7dmFyIHI9MDt0JiYocnw9NCksdHYobixlLHIsdCl9dmFyIHFzPSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIENpKGUpe2lmKCFlW3FzXSl7ZVtxc109ITAsbG0uZm9yRWFjaChmdW5jdGlvbihuKXtuIT09InNlbGVjdGlvbmNoYW5nZSImJihHMS5oYXMobil8fE5jKG4sITEsZSksTmMobiwhMCxlKSl9KTt2YXIgdD1lLm5vZGVUeXBlPT09OT9lOmUub3duZXJEb2N1bWVudDt0PT09bnVsbHx8dFtxc118fCh0W3FzXT0hMCxOYygic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIHR2KGUsdCxuLHIpe3N3aXRjaCh6bSh0KSl7Y2FzZSAxOnZhciBvPWkxO2JyZWFrO2Nhc2UgNDpvPXMxO2JyZWFrO2RlZmF1bHQ6bz1GdX1uPW8uYmluZChudWxsLHQsbixlKSxvPXZvaWQgMCwhSmN8fHQhPT0idG91Y2hzdGFydCImJnQhPT0idG91Y2htb3ZlIiYmdCE9PSJ3aGVlbCJ8fChvPSEwKSxyP28hPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7Y2FwdHVyZTohMCxwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKTpvIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se3Bhc3NpdmU6b30pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIFRjKGUsdCxuLHIsbyl7dmFyIGE9cjtpZighKHQmMSkmJiEodCYyKSYmciE9PW51bGwpZTpmb3IoOzspe2lmKHI9PT1udWxsKXJldHVybjt2YXIgaT1yLnRhZztpZihpPT09M3x8aT09PTQpe3ZhciBzPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYocz09PW98fHMubm9kZVR5cGU9PT04JiZzLnBhcmVudE5vZGU9PT1vKWJyZWFrO2lmKGk9PT00KWZvcihpPXIucmV0dXJuO2khPT1udWxsOyl7dmFyIGw9aS50YWc7aWYoKGw9PT0zfHxsPT09NCkmJihsPWkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sbD09PW98fGwubm9kZVR5cGU9PT04JiZsLnBhcmVudE5vZGU9PT1vKSlyZXR1cm47aT1pLnJldHVybn1mb3IoO3MhPT1udWxsOyl7aWYoaT1FbyhzKSxpPT09bnVsbClyZXR1cm47aWYobD1pLnRhZyxsPT09NXx8bD09PTYpe3I9YT1pO2NvbnRpbnVlIGV9cz1zLnBhcmVudE5vZGV9fXI9ci5yZXR1cm59RW0oZnVuY3Rpb24oKXt2YXIgZD1hLGM9UHUobikscD1bXTtlOnt2YXIgdT1abS5nZXQoZSk7aWYodSE9PXZvaWQgMCl7dmFyIGY9V3Usdj1lO3N3aXRjaChlKXtjYXNlImtleXByZXNzIjppZihvbChuKT09PTApYnJlYWsgZTtjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmY9eDE7YnJlYWs7Y2FzZSJmb2N1c2luIjp2PSJmb2N1cyIsZj14YzticmVhaztjYXNlImZvY3Vzb3V0Ijp2PSJibHVyIixmPXhjO2JyZWFrO2Nhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmY9eGM7YnJlYWs7Y2FzZSJjbGljayI6aWYobi5idXR0b249PT0yKWJyZWFrIGU7Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNldXAiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlImNvbnRleHRtZW51IjpmPWdnO2JyZWFrO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmY9YzE7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2UidG91Y2hzdGFydCI6Zj1OMTticmVhaztjYXNlIHFtOmNhc2UgUW06Y2FzZSBKbTpmPWYxO2JyZWFrO2Nhc2UgWG06Zj1EMTticmVhaztjYXNlInNjcm9sbCI6Zj1sMTticmVhaztjYXNlIndoZWVsIjpmPV8xO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UicGFzdGUiOmY9ZzE7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJ1cCI6Zj12Z312YXIgdz0odCY0KSE9PTAsYj0hdyYmZT09PSJzY3JvbGwiLGc9dz91IT09bnVsbD91KyJDYXB0dXJlIjpudWxsOnU7dz1bXTtmb3IodmFyIG09ZCx5O20hPT1udWxsOyl7eT1tO3ZhciBoPXkuc3RhdGVOb2RlO2lmKHkudGFnPT09NSYmaCE9PW51bGwmJih5PWgsZyE9PW51bGwmJihoPUVpKG0sZyksaCE9bnVsbCYmdy5wdXNoKE9pKG0saCx5KSkpKSxiKWJyZWFrO209bS5yZXR1cm59MDx3Lmxlbmd0aCYmKHU9bmV3IGYodSx2LG51bGwsbixjKSxwLnB1c2goe2V2ZW50OnUsbGlzdGVuZXJzOnd9KSl9fWlmKCEodCY3KSl7ZTp7aWYodT1lPT09Im1vdXNlb3ZlciJ8fGU9PT0icG9pbnRlcm92ZXIiLGY9ZT09PSJtb3VzZW91dCJ8fGU9PT0icG9pbnRlcm91dCIsdSYmbiE9PXFjJiYodj1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYoRW8odil8fHZbYnJdKSlicmVhayBlO2lmKChmfHx1KSYmKHU9Yy53aW5kb3c9PT1jP2M6KHU9Yy5vd25lckRvY3VtZW50KT91LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvdzp3aW5kb3csZj8odj1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LGY9ZCx2PXY/RW8odik6bnVsbCx2IT09bnVsbCYmKGI9UG8odiksdiE9PWJ8fHYudGFnIT09NSYmdi50YWchPT02KSYmKHY9bnVsbCkpOihmPW51bGwsdj1kKSxmIT09dikpe2lmKHc9Z2csaD0ib25Nb3VzZUxlYXZlIixnPSJvbk1vdXNlRW50ZXIiLG09Im1vdXNlIiwoZT09PSJwb2ludGVyb3V0Inx8ZT09PSJwb2ludGVyb3ZlciIpJiYodz12ZyxoPSJvblBvaW50ZXJMZWF2ZSIsZz0ib25Qb2ludGVyRW50ZXIiLG09InBvaW50ZXIiKSxiPWY9PW51bGw/dTpkYShmKSx5PXY9PW51bGw/dTpkYSh2KSx1PW5ldyB3KGgsbSsibGVhdmUiLGYsbixjKSx1LnRhcmdldD1iLHUucmVsYXRlZFRhcmdldD15LGg9bnVsbCxFbyhjKT09PWQmJih3PW5ldyB3KGcsbSsiZW50ZXIiLHYsbixjKSx3LnRhcmdldD15LHcucmVsYXRlZFRhcmdldD1iLGg9dyksYj1oLGYmJnYpdDp7Zm9yKHc9ZixnPXYsbT0wLHk9dzt5O3k9cmEoeSkpbSsrO2Zvcih5PTAsaD1nO2g7aD1yYShoKSl5Kys7Zm9yKDswPG0teTspdz1yYSh3KSxtLS07Zm9yKDswPHktbTspZz1yYShnKSx5LS07Zm9yKDttLS07KXtpZih3PT09Z3x8ZyE9PW51bGwmJnc9PT1nLmFsdGVybmF0ZSlicmVhayB0O3c9cmEodyksZz1yYShnKX13PW51bGx9ZWxzZSB3PW51bGw7ZiE9PW51bGwmJl9nKHAsdSxmLHcsITEpLHYhPT1udWxsJiZiIT09bnVsbCYmX2cocCxiLHYsdywhMCl9fWU6e2lmKHU9ZD9kYShkKTp3aW5kb3csZj11Lm5vZGVOYW1lJiZ1Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZj09PSJzZWxlY3QifHxmPT09ImlucHV0IiYmdS50eXBlPT09ImZpbGUiKXZhciB4PUwxO2Vsc2UgaWYoYmcodSkpaWYoR20peD0kMTtlbHNle3g9ejE7dmFyIEU9VTF9ZWxzZShmPXUubm9kZU5hbWUpJiZmLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodS50eXBlPT09ImNoZWNrYm94Inx8dS50eXBlPT09InJhZGlvIikmJih4PUYxKTtpZih4JiYoeD14KGUsZCkpKXtIbShwLHgsbixjKTticmVhayBlfUUmJkUoZSx1LGQpLGU9PT0iZm9jdXNvdXQiJiYoRT11Ll93cmFwcGVyU3RhdGUpJiZFLmNvbnRyb2xsZWQmJnUudHlwZT09PSJudW1iZXIiJiZHYyh1LCJudW1iZXIiLHUudmFsdWUpfXN3aXRjaChFPWQ/ZGEoZCk6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KGJnKEUpfHxFLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJihzYT1FLG51PWQsdmk9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6dmk9bnU9c2E9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6cnU9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOnJ1PSExLEVnKHAsbixjKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYoSDEpYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpFZyhwLG4sYyl9dmFyIFQ7aWYoSHUpZTp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIEQ9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9uZW5kIjpEPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOkQ9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGV9RD12b2lkIDB9ZWxzZSBpYT9XbShlLG4pJiYoRD0ib25Db21wb3NpdGlvbkVuZCIpOmU9PT0ia2V5ZG93biImJm4ua2V5Q29kZT09PTIyOSYmKEQ9Im9uQ29tcG9zaXRpb25TdGFydCIpO0QmJigkbSYmbi5sb2NhbGUhPT0ia28iJiYoaWF8fEQhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9EPT09Im9uQ29tcG9zaXRpb25FbmQiJiZpYSYmKFQ9Rm0oKSk6KEhyPWMsJHU9InZhbHVlImluIEhyP0hyLnZhbHVlOkhyLnRleHRDb250ZW50LGlhPSEwKSksRT13bChkLEQpLDA8RS5sZW5ndGgmJihEPW5ldyBtZyhELGUsbnVsbCxuLGMpLHAucHVzaCh7ZXZlbnQ6RCxsaXN0ZW5lcnM6RX0pLFQ/RC5kYXRhPVQ6KFQ9Qm0obiksVCE9PW51bGwmJihELmRhdGE9VCkpKSksKFQ9TzE/STEoZSxuKTpNMShlLG4pKSYmKGQ9d2woZCwib25CZWZvcmVJbnB1dCIpLDA8ZC5sZW5ndGgmJihjPW5ldyBtZygib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLG4sYykscC5wdXNoKHtldmVudDpjLGxpc3RlbmVyczpkfSksYy5kYXRhPVQpKX1ldihwLHQpfSl9ZnVuY3Rpb24gT2koZSx0LG4pe3JldHVybntpbnN0YW5jZTplLGxpc3RlbmVyOnQsY3VycmVudFRhcmdldDpufX1mdW5jdGlvbiB3bChlLHQpe2Zvcih2YXIgbj10KyJDYXB0dXJlIixyPVtdO2UhPT1udWxsOyl7dmFyIG89ZSxhPW8uc3RhdGVOb2RlO28udGFnPT09NSYmYSE9PW51bGwmJihvPWEsYT1FaShlLG4pLGEhPW51bGwmJnIudW5zaGlmdChPaShlLGEsbykpLGE9RWkoZSx0KSxhIT1udWxsJiZyLnB1c2goT2koZSxhLG8pKSksZT1lLnJldHVybn1yZXR1cm4gcn1mdW5jdGlvbiByYShlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtkbyBlPWUucmV0dXJuO3doaWxlKGUmJmUudGFnIT09NSk7cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gX2coZSx0LG4scixvKXtmb3IodmFyIGE9dC5fcmVhY3ROYW1lLGk9W107biE9PW51bGwmJm4hPT1yOyl7dmFyIHM9bixsPXMuYWx0ZXJuYXRlLGQ9cy5zdGF0ZU5vZGU7aWYobCE9PW51bGwmJmw9PT1yKWJyZWFrO3MudGFnPT09NSYmZCE9PW51bGwmJihzPWQsbz8obD1FaShuLGEpLGwhPW51bGwmJmkudW5zaGlmdChPaShuLGwscykpKTpvfHwobD1FaShuLGEpLGwhPW51bGwmJmkucHVzaChPaShuLGwscykpKSksbj1uLnJldHVybn1pLmxlbmd0aCE9PTAmJmUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6aX0pfXZhciBqMT0vXHJcbj8vZyxWMT0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIENnKGUpe3JldHVybih0eXBlb2YgZT09InN0cmluZyI/ZToiIitlKS5yZXBsYWNlKGoxLGAKYCkucmVwbGFjZShWMSwiIil9ZnVuY3Rpb24gUXMoZSx0LG4pe2lmKHQ9Q2codCksQ2coZSkhPT10JiZuKXRocm93IEVycm9yKEwoNDI1KSl9ZnVuY3Rpb24gYmwoKXt9dmFyIG91PW51bGwsYXU9bnVsbDtmdW5jdGlvbiBpdShlLHQpe3JldHVybiBlPT09InRleHRhcmVhInx8ZT09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTD09Im9iamVjdCImJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPT1udWxsJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCE9bnVsbH12YXIgc3U9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDp2b2lkIDAsSzE9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6dm9pZCAwLE9nPXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6dm9pZCAwLFkxPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazp0eXBlb2YgT2c8InUiP2Z1bmN0aW9uKGUpe3JldHVybiBPZy5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2gocTEpfTpzdTtmdW5jdGlvbiBxMShlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIERjKGUsdCl7dmFyIG49dCxyPTA7ZG97dmFyIG89bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLG8mJm8ubm9kZVR5cGU9PT04KWlmKG49by5kYXRhLG49PT0iLyQiKXtpZihyPT09MCl7ZS5yZW1vdmVDaGlsZChvKSxEaSh0KTtyZXR1cm59ci0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkPyImJm4hPT0iJCEifHxyKys7bj1vfXdoaWxlKG4pO0RpKHQpfWZ1bmN0aW9uIFlyKGUpe2Zvcig7ZSE9bnVsbDtlPWUubmV4dFNpYmxpbmcpe3ZhciB0PWUubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWUuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyIpYnJlYWs7aWYodD09PSIvJCIpcmV0dXJuIG51bGx9fXJldHVybiBlfWZ1bmN0aW9uIElnKGUpe2U9ZS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIkInx8bj09PSIkISJ8fG49PT0iJD8iKXtpZih0PT09MClyZXR1cm4gZTt0LS19ZWxzZSBuPT09Ii8kIiYmdCsrfWU9ZS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIENhPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLGVyPSJfX3JlYWN0RmliZXIkIitDYSxJaT0iX19yZWFjdFByb3BzJCIrQ2EsYnI9Il9fcmVhY3RDb250YWluZXIkIitDYSxsdT0iX19yZWFjdEV2ZW50cyQiK0NhLFExPSJfX3JlYWN0TGlzdGVuZXJzJCIrQ2EsSjE9Il9fcmVhY3RIYW5kbGVzJCIrQ2E7ZnVuY3Rpb24gRW8oZSl7dmFyIHQ9ZVtlcl07aWYodClyZXR1cm4gdDtmb3IodmFyIG49ZS5wYXJlbnROb2RlO247KXtpZih0PW5bYnJdfHxuW2VyXSl7aWYobj10LmFsdGVybmF0ZSx0LmNoaWxkIT09bnVsbHx8biE9PW51bGwmJm4uY2hpbGQhPT1udWxsKWZvcihlPUlnKGUpO2UhPT1udWxsOyl7aWYobj1lW2VyXSlyZXR1cm4gbjtlPUlnKGUpfXJldHVybiB0fWU9bixuPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBXaShlKXtyZXR1cm4gZT1lW2VyXXx8ZVticl0sIWV8fGUudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTEzJiZlLnRhZyE9PTM/bnVsbDplfWZ1bmN0aW9uIGRhKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihMKDMzKSl9ZnVuY3Rpb24gJGwoZSl7cmV0dXJuIGVbSWldfHxudWxsfXZhciBkdT1bXSxjYT0tMTtmdW5jdGlvbiBubyhlKXtyZXR1cm57Y3VycmVudDplfX1mdW5jdGlvbiBZZShlKXswPmNhfHwoZS5jdXJyZW50PWR1W2NhXSxkdVtjYV09bnVsbCxjYS0tKX1mdW5jdGlvbiBHZShlLHQpe2NhKyssZHVbY2FdPWUuY3VycmVudCxlLmN1cnJlbnQ9dH12YXIgZW89e30sQ3Q9bm8oZW8pLHF0PW5vKCExKSxfbz1lbztmdW5jdGlvbiBTYShlLHQpe3ZhciBuPWUudHlwZS5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIGVvO3ZhciByPWUuc3RhdGVOb2RlO2lmKHImJnIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PXQpcmV0dXJuIHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIG89e30sYTtmb3IoYSBpbiBuKW9bYV09dFthXTtyZXR1cm4gciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXQsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1vKSxvfWZ1bmN0aW9uIFF0KGUpe3JldHVybiBlPWUuY2hpbGRDb250ZXh0VHlwZXMsZSE9bnVsbH1mdW5jdGlvbiBrbCgpe1llKHF0KSxZZShDdCl9ZnVuY3Rpb24gTWcoZSx0LG4pe2lmKEN0LmN1cnJlbnQhPT1lbyl0aHJvdyBFcnJvcihMKDE2OCkpO0dlKEN0LHQpLEdlKHF0LG4pfWZ1bmN0aW9uIG52KGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0PXQuY2hpbGRDb250ZXh0VHlwZXMsdHlwZW9mIHIuZ2V0Q2hpbGRDb250ZXh0IT0iZnVuY3Rpb24iKXJldHVybiBuO3I9ci5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIG8gaW4gcilpZighKG8gaW4gdCkpdGhyb3cgRXJyb3IoTCgxMDgsVXgoZSl8fCJVbmtub3duIixvKSk7cmV0dXJuIGV0KHt9LG4scil9ZnVuY3Rpb24geGwoZSl7cmV0dXJuIGU9KGU9ZS5zdGF0ZU5vZGUpJiZlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxlbyxfbz1DdC5jdXJyZW50LEdlKEN0LGUpLEdlKHF0LHF0LmN1cnJlbnQpLCEwfWZ1bmN0aW9uIFJnKGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZighcil0aHJvdyBFcnJvcihMKDE2OSkpO24/KGU9bnYoZSx0LF9vKSxyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWUsWWUocXQpLFllKEN0KSxHZShDdCxlKSk6WWUocXQpLEdlKHF0LG4pfXZhciBncj1udWxsLFdsPSExLEFjPSExO2Z1bmN0aW9uIHJ2KGUpe2dyPT09bnVsbD9ncj1bZV06Z3IucHVzaChlKX1mdW5jdGlvbiBYMShlKXtXbD0hMCxydihlKX1mdW5jdGlvbiBybygpe2lmKCFBYyYmZ3IhPT1udWxsKXtBYz0hMDt2YXIgZT0wLHQ9VWU7dHJ5e3ZhciBuPWdyO2ZvcihVZT0xO2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO2RvIHI9cighMCk7d2hpbGUociE9PW51bGwpfWdyPW51bGwsV2w9ITF9Y2F0Y2gobyl7dGhyb3cgZ3IhPT1udWxsJiYoZ3I9Z3Iuc2xpY2UoZSsxKSksQW0oTHUscm8pLG99ZmluYWxseXtVZT10LEFjPSExfX1yZXR1cm4gbnVsbH12YXIgdWE9W10scGE9MCxTbD1udWxsLEVsPTAsbW49W10sdm49MCxDbz1udWxsLG1yPTEsdnI9IiI7ZnVuY3Rpb24geG8oZSx0KXt1YVtwYSsrXT1FbCx1YVtwYSsrXT1TbCxTbD1lLEVsPXR9ZnVuY3Rpb24gb3YoZSx0LG4pe21uW3ZuKytdPW1yLG1uW3ZuKytdPXZyLG1uW3ZuKytdPUNvLENvPWU7dmFyIHI9bXI7ZT12cjt2YXIgbz0zMi1GbihyKS0xO3ImPX4oMTw8byksbis9MTt2YXIgYT0zMi1Gbih0KStvO2lmKDMwPGEpe3ZhciBpPW8tbyU1O2E9KHImKDE8PGkpLTEpLnRvU3RyaW5nKDMyKSxyPj49aSxvLT1pLG1yPTE8PDMyLUZuKHQpK298bjw8b3xyLHZyPWErZX1lbHNlIG1yPTE8PGF8bjw8b3xyLHZyPWV9ZnVuY3Rpb24ganUoZSl7ZS5yZXR1cm4hPT1udWxsJiYoeG8oZSwxKSxvdihlLDEsMCkpfWZ1bmN0aW9uIFZ1KGUpe2Zvcig7ZT09PVNsOylTbD11YVstLXBhXSx1YVtwYV09bnVsbCxFbD11YVstLXBhXSx1YVtwYV09bnVsbDtmb3IoO2U9PT1DbzspQ289bW5bLS12bl0sbW5bdm5dPW51bGwsdnI9bW5bLS12bl0sbW5bdm5dPW51bGwsbXI9bW5bLS12bl0sbW5bdm5dPW51bGx9dmFyIHJuPW51bGwsbm49bnVsbCxxZT0hMSx6bj1udWxsO2Z1bmN0aW9uIGF2KGUsdCl7dmFyIG49eW4oNSxudWxsLG51bGwsMCk7bi5lbGVtZW50VHlwZT0iREVMRVRFRCIsbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLHQ9ZS5kZWxldGlvbnMsdD09PW51bGw/KGUuZGVsZXRpb25zPVtuXSxlLmZsYWdzfD0xNik6dC5wdXNoKG4pfWZ1bmN0aW9uIFBnKGUsdCl7c3dpdGNoKGUudGFnKXtjYXNlIDU6dmFyIG49ZS50eXBlO3JldHVybiB0PXQubm9kZVR5cGUhPT0xfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LHJuPWUsbm49WXIodC5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiB0PWUucGVuZGluZ1Byb3BzPT09IiJ8fHQubm9kZVR5cGUhPT0zP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxybj1lLG5uPW51bGwsITApOiExO2Nhc2UgMTM6cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTg/bnVsbDp0LHQhPT1udWxsPyhuPUNvIT09bnVsbD97aWQ6bXIsb3ZlcmZsb3c6dnJ9Om51bGwsZS5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOnQsdHJlZUNvbnRleHQ6bixyZXRyeUxhbmU6MTA3Mzc0MTgyNH0sbj15bigxOCxudWxsLG51bGwsMCksbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLGUuY2hpbGQ9bixybj1lLG5uPW51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGN1KGUpe3JldHVybihlLm1vZGUmMSkhPT0wJiYoZS5mbGFncyYxMjgpPT09MH1mdW5jdGlvbiB1dShlKXtpZihxZSl7dmFyIHQ9bm47aWYodCl7dmFyIG49dDtpZighUGcoZSx0KSl7aWYoY3UoZSkpdGhyb3cgRXJyb3IoTCg0MTgpKTt0PVlyKG4ubmV4dFNpYmxpbmcpO3ZhciByPXJuO3QmJlBnKGUsdCk/YXYocixuKTooZS5mbGFncz1lLmZsYWdzJi00MDk3fDIscWU9ITEscm49ZSl9fWVsc2V7aWYoY3UoZSkpdGhyb3cgRXJyb3IoTCg0MTgpKTtlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixxZT0hMSxybj1lfX19ZnVuY3Rpb24gTGcoZSl7Zm9yKGU9ZS5yZXR1cm47ZSE9PW51bGwmJmUudGFnIT09NSYmZS50YWchPT0zJiZlLnRhZyE9PTEzOyllPWUucmV0dXJuO3JuPWV9ZnVuY3Rpb24gSnMoZSl7aWYoZSE9PXJuKXJldHVybiExO2lmKCFxZSlyZXR1cm4gTGcoZSkscWU9ITAsITE7dmFyIHQ7aWYoKHQ9ZS50YWchPT0zKSYmISh0PWUudGFnIT09NSkmJih0PWUudHlwZSx0PXQhPT0iaGVhZCImJnQhPT0iYm9keSImJiFpdShlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9bm4pKXtpZihjdShlKSl0aHJvdyBpdigpLEVycm9yKEwoNDE4KSk7Zm9yKDt0OylhdihlLHQpLHQ9WXIodC5uZXh0U2libGluZyl9aWYoTGcoZSksZS50YWc9PT0xMyl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcihMKDMxNykpO2U6e2ZvcihlPWUubmV4dFNpYmxpbmcsdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iLyQiKXtpZih0PT09MCl7bm49WXIoZS5uZXh0U2libGluZyk7YnJlYWsgZX10LS19ZWxzZSBuIT09IiQiJiZuIT09IiQhIiYmbiE9PSIkPyJ8fHQrK31lPWUubmV4dFNpYmxpbmd9bm49bnVsbH19ZWxzZSBubj1ybj9ZcihlLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBpdigpe2Zvcih2YXIgZT1ubjtlOyllPVlyKGUubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIEVhKCl7bm49cm49bnVsbCxxZT0hMX1mdW5jdGlvbiBLdShlKXt6bj09PW51bGw/em49W2VdOnpuLnB1c2goZSl9dmFyIFoxPVNyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIGFpKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoTCgzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihMKDE0NyxlKSk7dmFyIG89cixhPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PWE/dC5yZWY6KHQ9ZnVuY3Rpb24oaSl7dmFyIHM9by5yZWZzO2k9PT1udWxsP2RlbGV0ZSBzW2FdOnNbYV09aX0sdC5fc3RyaW5nUmVmPWEsdCl9aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IEVycm9yKEwoMjg0KSk7aWYoIW4uX293bmVyKXRocm93IEVycm9yKEwoMjkwLGUpKX1yZXR1cm4gZX1mdW5jdGlvbiBYcyhlLHQpe3Rocm93IGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLEVycm9yKEwoMzEsZT09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQpLmpvaW4oIiwgIikrIn0iOmUpKX1mdW5jdGlvbiBVZyhlKXt2YXIgdD1lLl9pbml0O3JldHVybiB0KGUuX3BheWxvYWQpfWZ1bmN0aW9uIHN2KGUpe2Z1bmN0aW9uIHQoZyxtKXtpZihlKXt2YXIgeT1nLmRlbGV0aW9uczt5PT09bnVsbD8oZy5kZWxldGlvbnM9W21dLGcuZmxhZ3N8PTE2KTp5LnB1c2gobSl9fWZ1bmN0aW9uIG4oZyxtKXtpZighZSlyZXR1cm4gbnVsbDtmb3IoO20hPT1udWxsOyl0KGcsbSksbT1tLnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gcihnLG0pe2ZvcihnPW5ldyBNYXA7bSE9PW51bGw7KW0ua2V5IT09bnVsbD9nLnNldChtLmtleSxtKTpnLnNldChtLmluZGV4LG0pLG09bS5zaWJsaW5nO3JldHVybiBnfWZ1bmN0aW9uIG8oZyxtKXtyZXR1cm4gZz1YcihnLG0pLGcuaW5kZXg9MCxnLnNpYmxpbmc9bnVsbCxnfWZ1bmN0aW9uIGEoZyxtLHkpe3JldHVybiBnLmluZGV4PXksZT8oeT1nLmFsdGVybmF0ZSx5IT09bnVsbD8oeT15LmluZGV4LHk8bT8oZy5mbGFnc3w9MixtKTp5KTooZy5mbGFnc3w9MixtKSk6KGcuZmxhZ3N8PTEwNDg1NzYsbSl9ZnVuY3Rpb24gaShnKXtyZXR1cm4gZSYmZy5hbHRlcm5hdGU9PT1udWxsJiYoZy5mbGFnc3w9MiksZ31mdW5jdGlvbiBzKGcsbSx5LGgpe3JldHVybiBtPT09bnVsbHx8bS50YWchPT02PyhtPVBjKHksZy5tb2RlLGgpLG0ucmV0dXJuPWcsbSk6KG09byhtLHkpLG0ucmV0dXJuPWcsbSl9ZnVuY3Rpb24gbChnLG0seSxoKXt2YXIgeD15LnR5cGU7cmV0dXJuIHg9PT1hYT9jKGcsbSx5LnByb3BzLmNoaWxkcmVuLGgseS5rZXkpOm0hPT1udWxsJiYobS5lbGVtZW50VHlwZT09PXh8fHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJnguJCR0eXBlb2Y9PT1GciYmVWcoeCk9PT1tLnR5cGUpPyhoPW8obSx5LnByb3BzKSxoLnJlZj1haShnLG0seSksaC5yZXR1cm49ZyxoKTooaD11bCh5LnR5cGUseS5rZXkseS5wcm9wcyxudWxsLGcubW9kZSxoKSxoLnJlZj1haShnLG0seSksaC5yZXR1cm49ZyxoKX1mdW5jdGlvbiBkKGcsbSx5LGgpe3JldHVybiBtPT09bnVsbHx8bS50YWchPT00fHxtLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09eS5jb250YWluZXJJbmZvfHxtLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PXkuaW1wbGVtZW50YXRpb24/KG09TGMoeSxnLm1vZGUsaCksbS5yZXR1cm49ZyxtKToobT1vKG0seS5jaGlsZHJlbnx8W10pLG0ucmV0dXJuPWcsbSl9ZnVuY3Rpb24gYyhnLG0seSxoLHgpe3JldHVybiBtPT09bnVsbHx8bS50YWchPT03PyhtPUFvKHksZy5tb2RlLGgseCksbS5yZXR1cm49ZyxtKToobT1vKG0seSksbS5yZXR1cm49ZyxtKX1mdW5jdGlvbiBwKGcsbSx5KXtpZih0eXBlb2YgbT09InN0cmluZyImJm0hPT0iInx8dHlwZW9mIG09PSJudW1iZXIiKXJldHVybiBtPVBjKCIiK20sZy5tb2RlLHkpLG0ucmV0dXJuPWcsbTtpZih0eXBlb2YgbT09Im9iamVjdCImJm0hPT1udWxsKXtzd2l0Y2gobS4kJHR5cGVvZil7Y2FzZSBVczpyZXR1cm4geT11bChtLnR5cGUsbS5rZXksbS5wcm9wcyxudWxsLGcubW9kZSx5KSx5LnJlZj1haShnLG51bGwsbSkseS5yZXR1cm49Zyx5O2Nhc2Ugb2E6cmV0dXJuIG09TGMobSxnLm1vZGUseSksbS5yZXR1cm49ZyxtO2Nhc2UgRnI6dmFyIGg9bS5faW5pdDtyZXR1cm4gcChnLGgobS5fcGF5bG9hZCkseSl9aWYoY2kobSl8fHRpKG0pKXJldHVybiBtPUFvKG0sZy5tb2RlLHksbnVsbCksbS5yZXR1cm49ZyxtO1hzKGcsbSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdShnLG0seSxoKXt2YXIgeD1tIT09bnVsbD9tLmtleTpudWxsO2lmKHR5cGVvZiB5PT0ic3RyaW5nIiYmeSE9PSIifHx0eXBlb2YgeT09Im51bWJlciIpcmV0dXJuIHghPT1udWxsP251bGw6cyhnLG0sIiIreSxoKTtpZih0eXBlb2YgeT09Im9iamVjdCImJnkhPT1udWxsKXtzd2l0Y2goeS4kJHR5cGVvZil7Y2FzZSBVczpyZXR1cm4geS5rZXk9PT14P2woZyxtLHksaCk6bnVsbDtjYXNlIG9hOnJldHVybiB5LmtleT09PXg/ZChnLG0seSxoKTpudWxsO2Nhc2UgRnI6cmV0dXJuIHg9eS5faW5pdCx1KGcsbSx4KHkuX3BheWxvYWQpLGgpfWlmKGNpKHkpfHx0aSh5KSlyZXR1cm4geCE9PW51bGw/bnVsbDpjKGcsbSx5LGgsbnVsbCk7WHMoZyx5KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmKGcsbSx5LGgseCl7aWYodHlwZW9mIGg9PSJzdHJpbmciJiZoIT09IiJ8fHR5cGVvZiBoPT0ibnVtYmVyIilyZXR1cm4gZz1nLmdldCh5KXx8bnVsbCxzKG0sZywiIitoLHgpO2lmKHR5cGVvZiBoPT0ib2JqZWN0IiYmaCE9PW51bGwpe3N3aXRjaChoLiQkdHlwZW9mKXtjYXNlIFVzOnJldHVybiBnPWcuZ2V0KGgua2V5PT09bnVsbD95Omgua2V5KXx8bnVsbCxsKG0sZyxoLHgpO2Nhc2Ugb2E6cmV0dXJuIGc9Zy5nZXQoaC5rZXk9PT1udWxsP3k6aC5rZXkpfHxudWxsLGQobSxnLGgseCk7Y2FzZSBGcjp2YXIgRT1oLl9pbml0O3JldHVybiBmKGcsbSx5LEUoaC5fcGF5bG9hZCkseCl9aWYoY2koaCl8fHRpKGgpKXJldHVybiBnPWcuZ2V0KHkpfHxudWxsLGMobSxnLGgseCxudWxsKTtYcyhtLGgpfXJldHVybiBudWxsfWZ1bmN0aW9uIHYoZyxtLHksaCl7Zm9yKHZhciB4PW51bGwsRT1udWxsLFQ9bSxEPW09MCxBPW51bGw7VCE9PW51bGwmJkQ8eS5sZW5ndGg7RCsrKXtULmluZGV4PkQ/KEE9VCxUPW51bGwpOkE9VC5zaWJsaW5nO3ZhciBfPXUoZyxULHlbRF0saCk7aWYoXz09PW51bGwpe1Q9PT1udWxsJiYoVD1BKTticmVha31lJiZUJiZfLmFsdGVybmF0ZT09PW51bGwmJnQoZyxUKSxtPWEoXyxtLEQpLEU9PT1udWxsP3g9XzpFLnNpYmxpbmc9XyxFPV8sVD1BfWlmKEQ9PT15Lmxlbmd0aClyZXR1cm4gbihnLFQpLHFlJiZ4byhnLEQpLHg7aWYoVD09PW51bGwpe2Zvcig7RDx5Lmxlbmd0aDtEKyspVD1wKGcseVtEXSxoKSxUIT09bnVsbCYmKG09YShULG0sRCksRT09PW51bGw/eD1UOkUuc2libGluZz1ULEU9VCk7cmV0dXJuIHFlJiZ4byhnLEQpLHh9Zm9yKFQ9cihnLFQpO0Q8eS5sZW5ndGg7RCsrKUE9ZihULGcsRCx5W0RdLGgpLEEhPT1udWxsJiYoZSYmQS5hbHRlcm5hdGUhPT1udWxsJiZULmRlbGV0ZShBLmtleT09PW51bGw/RDpBLmtleSksbT1hKEEsbSxEKSxFPT09bnVsbD94PUE6RS5zaWJsaW5nPUEsRT1BKTtyZXR1cm4gZSYmVC5mb3JFYWNoKGZ1bmN0aW9uKEkpe3JldHVybiB0KGcsSSl9KSxxZSYmeG8oZyxEKSx4fWZ1bmN0aW9uIHcoZyxtLHksaCl7dmFyIHg9dGkoeSk7aWYodHlwZW9mIHghPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoTCgxNTApKTtpZih5PXguY2FsbCh5KSx5PT1udWxsKXRocm93IEVycm9yKEwoMTUxKSk7Zm9yKHZhciBFPXg9bnVsbCxUPW0sRD1tPTAsQT1udWxsLF89eS5uZXh0KCk7VCE9PW51bGwmJiFfLmRvbmU7RCsrLF89eS5uZXh0KCkpe1QuaW5kZXg+RD8oQT1ULFQ9bnVsbCk6QT1ULnNpYmxpbmc7dmFyIEk9dShnLFQsXy52YWx1ZSxoKTtpZihJPT09bnVsbCl7VD09PW51bGwmJihUPUEpO2JyZWFrfWUmJlQmJkkuYWx0ZXJuYXRlPT09bnVsbCYmdChnLFQpLG09YShJLG0sRCksRT09PW51bGw/eD1JOkUuc2libGluZz1JLEU9SSxUPUF9aWYoXy5kb25lKXJldHVybiBuKGcsVCkscWUmJnhvKGcsRCkseDtpZihUPT09bnVsbCl7Zm9yKDshXy5kb25lO0QrKyxfPXkubmV4dCgpKV89cChnLF8udmFsdWUsaCksXyE9PW51bGwmJihtPWEoXyxtLEQpLEU9PT1udWxsP3g9XzpFLnNpYmxpbmc9XyxFPV8pO3JldHVybiBxZSYmeG8oZyxEKSx4fWZvcihUPXIoZyxUKTshXy5kb25lO0QrKyxfPXkubmV4dCgpKV89ZihULGcsRCxfLnZhbHVlLGgpLF8hPT1udWxsJiYoZSYmXy5hbHRlcm5hdGUhPT1udWxsJiZULmRlbGV0ZShfLmtleT09PW51bGw/RDpfLmtleSksbT1hKF8sbSxEKSxFPT09bnVsbD94PV86RS5zaWJsaW5nPV8sRT1fKTtyZXR1cm4gZSYmVC5mb3JFYWNoKGZ1bmN0aW9uKE0pe3JldHVybiB0KGcsTSl9KSxxZSYmeG8oZyxEKSx4fWZ1bmN0aW9uIGIoZyxtLHksaCl7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCYmeS50eXBlPT09YWEmJnkua2V5PT09bnVsbCYmKHk9eS5wcm9wcy5jaGlsZHJlbiksdHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgVXM6ZTp7Zm9yKHZhciB4PXkua2V5LEU9bTtFIT09bnVsbDspe2lmKEUua2V5PT09eCl7aWYoeD15LnR5cGUseD09PWFhKXtpZihFLnRhZz09PTcpe24oZyxFLnNpYmxpbmcpLG09byhFLHkucHJvcHMuY2hpbGRyZW4pLG0ucmV0dXJuPWcsZz1tO2JyZWFrIGV9fWVsc2UgaWYoRS5lbGVtZW50VHlwZT09PXh8fHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJnguJCR0eXBlb2Y9PT1GciYmVWcoeCk9PT1FLnR5cGUpe24oZyxFLnNpYmxpbmcpLG09byhFLHkucHJvcHMpLG0ucmVmPWFpKGcsRSx5KSxtLnJldHVybj1nLGc9bTticmVhayBlfW4oZyxFKTticmVha31lbHNlIHQoZyxFKTtFPUUuc2libGluZ315LnR5cGU9PT1hYT8obT1Bbyh5LnByb3BzLmNoaWxkcmVuLGcubW9kZSxoLHkua2V5KSxtLnJldHVybj1nLGc9bSk6KGg9dWwoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCxnLm1vZGUsaCksaC5yZWY9YWkoZyxtLHkpLGgucmV0dXJuPWcsZz1oKX1yZXR1cm4gaShnKTtjYXNlIG9hOmU6e2ZvcihFPXkua2V5O20hPT1udWxsOyl7aWYobS5rZXk9PT1FKWlmKG0udGFnPT09NCYmbS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PXkuY29udGFpbmVySW5mbyYmbS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT15LmltcGxlbWVudGF0aW9uKXtuKGcsbS5zaWJsaW5nKSxtPW8obSx5LmNoaWxkcmVufHxbXSksbS5yZXR1cm49ZyxnPW07YnJlYWsgZX1lbHNle24oZyxtKTticmVha31lbHNlIHQoZyxtKTttPW0uc2libGluZ31tPUxjKHksZy5tb2RlLGgpLG0ucmV0dXJuPWcsZz1tfXJldHVybiBpKGcpO2Nhc2UgRnI6cmV0dXJuIEU9eS5faW5pdCxiKGcsbSxFKHkuX3BheWxvYWQpLGgpfWlmKGNpKHkpKXJldHVybiB2KGcsbSx5LGgpO2lmKHRpKHkpKXJldHVybiB3KGcsbSx5LGgpO1hzKGcseSl9cmV0dXJuIHR5cGVvZiB5PT0ic3RyaW5nIiYmeSE9PSIifHx0eXBlb2YgeT09Im51bWJlciI/KHk9IiIreSxtIT09bnVsbCYmbS50YWc9PT02PyhuKGcsbS5zaWJsaW5nKSxtPW8obSx5KSxtLnJldHVybj1nLGc9bSk6KG4oZyxtKSxtPVBjKHksZy5tb2RlLGgpLG0ucmV0dXJuPWcsZz1tKSxpKGcpKTpuKGcsbSl9cmV0dXJuIGJ9dmFyIE5hPXN2KCEwKSxsdj1zdighMSksTmw9bm8obnVsbCksVGw9bnVsbCxmYT1udWxsLFl1PW51bGw7ZnVuY3Rpb24gcXUoKXtZdT1mYT1UbD1udWxsfWZ1bmN0aW9uIFF1KGUpe3ZhciB0PU5sLmN1cnJlbnQ7WWUoTmwpLGUuX2N1cnJlbnRWYWx1ZT10fWZ1bmN0aW9uIHB1KGUsdCxuKXtmb3IoO2UhPT1udWxsOyl7dmFyIHI9ZS5hbHRlcm5hdGU7aWYoKGUuY2hpbGRMYW5lcyZ0KSE9PXQ/KGUuY2hpbGRMYW5lc3w9dCxyIT09bnVsbCYmKHIuY2hpbGRMYW5lc3w9dCkpOnIhPT1udWxsJiYoci5jaGlsZExhbmVzJnQpIT09dCYmKHIuY2hpbGRMYW5lc3w9dCksZT09PW4pYnJlYWs7ZT1lLnJldHVybn19ZnVuY3Rpb24gYmEoZSx0KXtUbD1lLFl1PWZhPW51bGwsZT1lLmRlcGVuZGVuY2llcyxlIT09bnVsbCYmZS5maXJzdENvbnRleHQhPT1udWxsJiYoZS5sYW5lcyZ0JiYoWXQ9ITApLGUuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIGJuKGUpe3ZhciB0PWUuX2N1cnJlbnRWYWx1ZTtpZihZdSE9PWUpaWYoZT17Y29udGV4dDplLG1lbW9pemVkVmFsdWU6dCxuZXh0Om51bGx9LGZhPT09bnVsbCl7aWYoVGw9PT1udWxsKXRocm93IEVycm9yKEwoMzA4KSk7ZmE9ZSxUbC5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmV9fWVsc2UgZmE9ZmEubmV4dD1lO3JldHVybiB0fXZhciBObz1udWxsO2Z1bmN0aW9uIEp1KGUpe05vPT09bnVsbD9Obz1bZV06Tm8ucHVzaChlKX1mdW5jdGlvbiBkdihlLHQsbixyKXt2YXIgbz10LmludGVybGVhdmVkO3JldHVybiBvPT09bnVsbD8obi5uZXh0PW4sSnUodCkpOihuLm5leHQ9by5uZXh0LG8ubmV4dD1uKSx0LmludGVybGVhdmVkPW4sa3IoZSxyKX1mdW5jdGlvbiBrcihlLHQpe2UubGFuZXN8PXQ7dmFyIG49ZS5hbHRlcm5hdGU7Zm9yKG4hPT1udWxsJiYobi5sYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47ZSE9PW51bGw7KWUuY2hpbGRMYW5lc3w9dCxuPWUuYWx0ZXJuYXRlLG4hPT1udWxsJiYobi5jaGlsZExhbmVzfD10KSxuPWUsZT1lLnJldHVybjtyZXR1cm4gbi50YWc9PT0zP24uc3RhdGVOb2RlOm51bGx9dmFyICRyPSExO2Z1bmN0aW9uIFh1KGUpe2UudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19ZnVuY3Rpb24gY3YoZSx0KXtlPWUudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT09PWUmJih0LnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmUubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmUuc2hhcmVkLGVmZmVjdHM6ZS5lZmZlY3RzfSl9ZnVuY3Rpb24geXIoZSx0KXtyZXR1cm57ZXZlbnRUaW1lOmUsbGFuZTp0LHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gcXIoZSx0LG4pe3ZhciByPWUudXBkYXRlUXVldWU7aWYocj09PW51bGwpcmV0dXJuIG51bGw7aWYocj1yLnNoYXJlZCxUZSYyKXt2YXIgbz1yLnBlbmRpbmc7cmV0dXJuIG89PT1udWxsP3QubmV4dD10Oih0Lm5leHQ9by5uZXh0LG8ubmV4dD10KSxyLnBlbmRpbmc9dCxrcihlLG4pfXJldHVybiBvPXIuaW50ZXJsZWF2ZWQsbz09PW51bGw/KHQubmV4dD10LEp1KHIpKToodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5pbnRlcmxlYXZlZD10LGtyKGUsbil9ZnVuY3Rpb24gYWwoZSx0LG4pe2lmKHQ9dC51cGRhdGVRdWV1ZSx0IT09bnVsbCYmKHQ9dC5zaGFyZWQsKG4mNDE5NDI0MCkhPT0wKSl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixVdShlLG4pfX1mdW5jdGlvbiB6ZyhlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUscj1lLmFsdGVybmF0ZTtpZihyIT09bnVsbCYmKHI9ci51cGRhdGVRdWV1ZSxuPT09cikpe3ZhciBvPW51bGwsYT1udWxsO2lmKG49bi5maXJzdEJhc2VVcGRhdGUsbiE9PW51bGwpe2Rve3ZhciBpPXtldmVudFRpbWU6bi5ldmVudFRpbWUsbGFuZTpuLmxhbmUsdGFnOm4udGFnLHBheWxvYWQ6bi5wYXlsb2FkLGNhbGxiYWNrOm4uY2FsbGJhY2ssbmV4dDpudWxsfTthPT09bnVsbD9vPWE9aTphPWEubmV4dD1pLG49bi5uZXh0fXdoaWxlKG4hPT1udWxsKTthPT09bnVsbD9vPWE9dDphPWEubmV4dD10fWVsc2Ugbz1hPXQ7bj17YmFzZVN0YXRlOnIuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpvLGxhc3RCYXNlVXBkYXRlOmEsc2hhcmVkOnIuc2hhcmVkLGVmZmVjdHM6ci5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufWU9bi5sYXN0QmFzZVVwZGF0ZSxlPT09bnVsbD9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiBEbChlLHQsbixyKXt2YXIgbz1lLnVwZGF0ZVF1ZXVlOyRyPSExO3ZhciBhPW8uZmlyc3RCYXNlVXBkYXRlLGk9by5sYXN0QmFzZVVwZGF0ZSxzPW8uc2hhcmVkLnBlbmRpbmc7aWYocyE9PW51bGwpe28uc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgbD1zLGQ9bC5uZXh0O2wubmV4dD1udWxsLGk9PT1udWxsP2E9ZDppLm5leHQ9ZCxpPWw7dmFyIGM9ZS5hbHRlcm5hdGU7YyE9PW51bGwmJihjPWMudXBkYXRlUXVldWUscz1jLmxhc3RCYXNlVXBkYXRlLHMhPT1pJiYocz09PW51bGw/Yy5maXJzdEJhc2VVcGRhdGU9ZDpzLm5leHQ9ZCxjLmxhc3RCYXNlVXBkYXRlPWwpKX1pZihhIT09bnVsbCl7dmFyIHA9by5iYXNlU3RhdGU7aT0wLGM9ZD1sPW51bGwscz1hO2Rve3ZhciB1PXMubGFuZSxmPXMuZXZlbnRUaW1lO2lmKChyJnUpPT09dSl7YyE9PW51bGwmJihjPWMubmV4dD17ZXZlbnRUaW1lOmYsbGFuZTowLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0pO2U6e3ZhciB2PWUsdz1zO3N3aXRjaCh1PXQsZj1uLHcudGFnKXtjYXNlIDE6aWYodj13LnBheWxvYWQsdHlwZW9mIHY9PSJmdW5jdGlvbiIpe3A9di5jYWxsKGYscCx1KTticmVhayBlfXA9djticmVhayBlO2Nhc2UgMzp2LmZsYWdzPXYuZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYodj13LnBheWxvYWQsdT10eXBlb2Ygdj09ImZ1bmN0aW9uIj92LmNhbGwoZixwLHUpOnYsdT09bnVsbClicmVhayBlO3A9ZXQoe30scCx1KTticmVhayBlO2Nhc2UgMjokcj0hMH19cy5jYWxsYmFjayE9PW51bGwmJnMubGFuZSE9PTAmJihlLmZsYWdzfD02NCx1PW8uZWZmZWN0cyx1PT09bnVsbD9vLmVmZmVjdHM9W3NdOnUucHVzaChzKSl9ZWxzZSBmPXtldmVudFRpbWU6ZixsYW5lOnUsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSxjPT09bnVsbD8oZD1jPWYsbD1wKTpjPWMubmV4dD1mLGl8PXU7aWYocz1zLm5leHQscz09PW51bGwpe2lmKHM9by5zaGFyZWQucGVuZGluZyxzPT09bnVsbClicmVhazt1PXMscz11Lm5leHQsdS5uZXh0PW51bGwsby5sYXN0QmFzZVVwZGF0ZT11LG8uc2hhcmVkLnBlbmRpbmc9bnVsbH19d2hpbGUoITApO2lmKGM9PT1udWxsJiYobD1wKSxvLmJhc2VTdGF0ZT1sLG8uZmlyc3RCYXNlVXBkYXRlPWQsby5sYXN0QmFzZVVwZGF0ZT1jLHQ9by5zaGFyZWQuaW50ZXJsZWF2ZWQsdCE9PW51bGwpe289dDtkbyBpfD1vLmxhbmUsbz1vLm5leHQ7d2hpbGUobyE9PXQpfWVsc2UgYT09PW51bGwmJihvLnNoYXJlZC5sYW5lcz0wKTtJb3w9aSxlLmxhbmVzPWksZS5tZW1vaXplZFN0YXRlPXB9fWZ1bmN0aW9uIEZnKGUsdCxuKXtpZihlPXQuZWZmZWN0cyx0LmVmZmVjdHM9bnVsbCxlIT09bnVsbClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgcj1lW3RdLG89ci5jYWxsYmFjaztpZihvIT09bnVsbCl7aWYoci5jYWxsYmFjaz1udWxsLHI9bix0eXBlb2YgbyE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihMKDE5MSxvKSk7by5jYWxsKHIpfX19dmFyIEJpPXt9LG5yPW5vKEJpKSxNaT1ubyhCaSksUmk9bm8oQmkpO2Z1bmN0aW9uIFRvKGUpe2lmKGU9PT1CaSl0aHJvdyBFcnJvcihMKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIFp1KGUsdCl7c3dpdGNoKEdlKFJpLHQpLEdlKE1pLGUpLEdlKG5yLEJpKSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6VmMobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1WYyh0LGUpfVllKG5yKSxHZShucix0KX1mdW5jdGlvbiBUYSgpe1llKG5yKSxZZShNaSksWWUoUmkpfWZ1bmN0aW9uIHV2KGUpe1RvKFJpLmN1cnJlbnQpO3ZhciB0PVRvKG5yLmN1cnJlbnQpLG49VmModCxlLnR5cGUpO3QhPT1uJiYoR2UoTWksZSksR2UobnIsbikpfWZ1bmN0aW9uIGVwKGUpe01pLmN1cnJlbnQ9PT1lJiYoWWUobnIpLFllKE1pKSl9dmFyIFhlPW5vKDApO2Z1bmN0aW9uIEFsKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIF9jPVtdO2Z1bmN0aW9uIHRwKCl7Zm9yKHZhciBlPTA7ZTxfYy5sZW5ndGg7ZSsrKV9jW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7X2MubGVuZ3RoPTB9dmFyIGlsPVNyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsQ2M9U3IuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsT289MCxaZT1udWxsLHB0PW51bGwsbXQ9bnVsbCxfbD0hMSx5aT0hMSxQaT0wLGVTPTA7ZnVuY3Rpb24gRHQoKXt0aHJvdyBFcnJvcihMKDMyMSkpfWZ1bmN0aW9uIG5wKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIVduKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gcnAoZSx0LG4scixvLGEpe2lmKE9vPWEsWmU9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLGlsLmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/b1M6YVMsZT1uKHIsbykseWkpe2E9MDtkb3tpZih5aT0hMSxQaT0wLDI1PD1hKXRocm93IEVycm9yKEwoMzAxKSk7YSs9MSxtdD1wdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxpbC5jdXJyZW50PWlTLGU9bihyLG8pfXdoaWxlKHlpKX1pZihpbC5jdXJyZW50PUNsLHQ9cHQhPT1udWxsJiZwdC5uZXh0IT09bnVsbCxPbz0wLG10PXB0PVplPW51bGwsX2w9ITEsdCl0aHJvdyBFcnJvcihMKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIG9wKCl7dmFyIGU9UGkhPT0wO3JldHVybiBQaT0wLGV9ZnVuY3Rpb24gWm4oKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gbXQ9PT1udWxsP1plLm1lbW9pemVkU3RhdGU9bXQ9ZTptdD1tdC5uZXh0PWUsbXR9ZnVuY3Rpb24ga24oKXtpZihwdD09PW51bGwpe3ZhciBlPVplLmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1wdC5uZXh0O3ZhciB0PW10PT09bnVsbD9aZS5tZW1vaXplZFN0YXRlOm10Lm5leHQ7aWYodCE9PW51bGwpbXQ9dCxwdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoTCgzMTApKTtwdD1lLGU9e21lbW9pemVkU3RhdGU6cHQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6cHQuYmFzZVN0YXRlLGJhc2VRdWV1ZTpwdC5iYXNlUXVldWUscXVldWU6cHQucXVldWUsbmV4dDpudWxsfSxtdD09PW51bGw/WmUubWVtb2l6ZWRTdGF0ZT1tdD1lOm10PW10Lm5leHQ9ZX1yZXR1cm4gbXR9ZnVuY3Rpb24gTGkoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIE9jKGUpe3ZhciB0PWtuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKEwoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9cHQsbz1yLmJhc2VRdWV1ZSxhPW4ucGVuZGluZztpZihhIT09bnVsbCl7aWYobyE9PW51bGwpe3ZhciBpPW8ubmV4dDtvLm5leHQ9YS5uZXh0LGEubmV4dD1pfXIuYmFzZVF1ZXVlPW89YSxuLnBlbmRpbmc9bnVsbH1pZihvIT09bnVsbCl7YT1vLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1pPW51bGwsbD1udWxsLGQ9YTtkb3t2YXIgYz1kLmxhbmU7aWYoKE9vJmMpPT09YylsIT09bnVsbCYmKGw9bC5uZXh0PXtsYW5lOjAsYWN0aW9uOmQuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6ZC5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6ZC5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9ZC5oYXNFYWdlclN0YXRlP2QuZWFnZXJTdGF0ZTplKHIsZC5hY3Rpb24pO2Vsc2V7dmFyIHA9e2xhbmU6YyxhY3Rpb246ZC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpkLmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTpkLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtsPT09bnVsbD8ocz1sPXAsaT1yKTpsPWwubmV4dD1wLFplLmxhbmVzfD1jLElvfD1jfWQ9ZC5uZXh0fXdoaWxlKGQhPT1udWxsJiZkIT09YSk7bD09PW51bGw/aT1yOmwubmV4dD1zLFduKHIsdC5tZW1vaXplZFN0YXRlKXx8KFl0PSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1pLHQuYmFzZVF1ZXVlPWwsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7bz1lO2RvIGE9by5sYW5lLFplLmxhbmVzfD1hLElvfD1hLG89by5uZXh0O3doaWxlKG8hPT1lKX1lbHNlIG89PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIEljKGUpe3ZhciB0PWtuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKEwoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxvPW4ucGVuZGluZyxhPXQubWVtb2l6ZWRTdGF0ZTtpZihvIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGk9bz1vLm5leHQ7ZG8gYT1lKGEsaS5hY3Rpb24pLGk9aS5uZXh0O3doaWxlKGkhPT1vKTtXbihhLHQubWVtb2l6ZWRTdGF0ZSl8fChZdD0hMCksdC5tZW1vaXplZFN0YXRlPWEsdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9YSksbi5sYXN0UmVuZGVyZWRTdGF0ZT1hfXJldHVyblthLHJdfWZ1bmN0aW9uIHB2KCl7fWZ1bmN0aW9uIGZ2KGUsdCl7dmFyIG49WmUscj1rbigpLG89dCgpLGE9IVduKHIubWVtb2l6ZWRTdGF0ZSxvKTtpZihhJiYoci5tZW1vaXplZFN0YXRlPW8sWXQ9ITApLHI9ci5xdWV1ZSxhcChtdi5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fGF8fG10IT09bnVsbCYmbXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxVaSg5LGd2LmJpbmQobnVsbCxuLHIsbyx0KSx2b2lkIDAsbnVsbCksdnQ9PT1udWxsKXRocm93IEVycm9yKEwoMzQ5KSk7T28mMzB8fGh2KG4sdCxvKX1yZXR1cm4gb31mdW5jdGlvbiBodihlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PVplLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LFplLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBndihlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLHZ2KHQpJiZ5dihlKX1mdW5jdGlvbiBtdihlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXt2dih0KSYmeXYoZSl9KX1mdW5jdGlvbiB2dihlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFXbihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiB5dihlKXt2YXIgdD1rcihlLDEpO3QhPT1udWxsJiYkbih0LGUsMSwtMSl9ZnVuY3Rpb24gJGcoZSl7dmFyIHQ9Wm4oKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6TGksbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD1yUy5iaW5kKG51bGwsWmUsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBVaShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9WmUudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sWmUudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiB3digpe3JldHVybiBrbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gc2woZSx0LG4scil7dmFyIG89Wm4oKTtaZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9VWkoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBCbChlLHQsbixyKXt2YXIgbz1rbigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIGE9dm9pZCAwO2lmKHB0IT09bnVsbCl7dmFyIGk9cHQubWVtb2l6ZWRTdGF0ZTtpZihhPWkuZGVzdHJveSxyIT09bnVsbCYmbnAocixpLmRlcHMpKXtvLm1lbW9pemVkU3RhdGU9VWkodCxuLGEscik7cmV0dXJufX1aZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9VWkoMXx0LG4sYSxyKX1mdW5jdGlvbiBXZyhlLHQpe3JldHVybiBzbCg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBhcChlLHQpe3JldHVybiBCbCgyMDQ4LDgsZSx0KX1mdW5jdGlvbiBidihlLHQpe3JldHVybiBCbCg0LDIsZSx0KX1mdW5jdGlvbiBrdihlLHQpe3JldHVybiBCbCg0LDQsZSx0KX1mdW5jdGlvbiB4dihlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gU3YoZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLEJsKDQsNCx4di5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBpcCgpe31mdW5jdGlvbiBFdihlLHQpe3ZhciBuPWtuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmbnAodCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gTnYoZSx0KXt2YXIgbj1rbigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJm5wKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIFR2KGUsdCxuKXtyZXR1cm4gT28mMjE/KFduKG4sdCl8fChuPU9tKCksWmUubGFuZXN8PW4sSW98PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLFl0PSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gdFMoZSx0KXt2YXIgbj1VZTtVZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1DYy50cmFuc2l0aW9uO0NjLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1VlPW4sQ2MudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBEdigpe3JldHVybiBrbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gblMoZSx0LG4pe3ZhciByPUpyKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LEF2KGUpKV92KHQsbik7ZWxzZSBpZihuPWR2KGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgbz1VdCgpOyRuKG4sZSxyLG8pLEN2KG4sdCxyKX19ZnVuY3Rpb24gclMoZSx0LG4pe3ZhciByPUpyKGUpLG89e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKEF2KGUpKV92KHQsbyk7ZWxzZXt2YXIgYT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGE9PT1udWxsfHxhLmxhbmVzPT09MCkmJihhPXQubGFzdFJlbmRlcmVkUmVkdWNlcixhIT09bnVsbCkpdHJ5e3ZhciBpPXQubGFzdFJlbmRlcmVkU3RhdGUscz1hKGksbik7aWYoby5oYXNFYWdlclN0YXRlPSEwLG8uZWFnZXJTdGF0ZT1zLFduKHMsaSkpe3ZhciBsPXQuaW50ZXJsZWF2ZWQ7bD09PW51bGw/KG8ubmV4dD1vLEp1KHQpKTooby5uZXh0PWwubmV4dCxsLm5leHQ9byksdC5pbnRlcmxlYXZlZD1vO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49ZHYoZSx0LG8sciksbiE9PW51bGwmJihvPVV0KCksJG4obixlLHIsbyksQ3Yobix0LHIpKX19ZnVuY3Rpb24gQXYoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1aZXx8dCE9PW51bGwmJnQ9PT1aZX1mdW5jdGlvbiBfdihlLHQpe3lpPV9sPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gQ3YoZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixVdShlLG4pfX12YXIgQ2w9e3JlYWRDb250ZXh0OmJuLHVzZUNhbGxiYWNrOkR0LHVzZUNvbnRleHQ6RHQsdXNlRWZmZWN0OkR0LHVzZUltcGVyYXRpdmVIYW5kbGU6RHQsdXNlSW5zZXJ0aW9uRWZmZWN0OkR0LHVzZUxheW91dEVmZmVjdDpEdCx1c2VNZW1vOkR0LHVzZVJlZHVjZXI6RHQsdXNlUmVmOkR0LHVzZVN0YXRlOkR0LHVzZURlYnVnVmFsdWU6RHQsdXNlRGVmZXJyZWRWYWx1ZTpEdCx1c2VUcmFuc2l0aW9uOkR0LHVzZU11dGFibGVTb3VyY2U6RHQsdXNlU3luY0V4dGVybmFsU3RvcmU6RHQsdXNlSWQ6RHQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxvUz17cmVhZENvbnRleHQ6Ym4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWm4oKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OmJuLHVzZUVmZmVjdDpXZyx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxzbCg0MTk0MzA4LDQseHYuYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBzbCg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHNsKDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49Wm4oKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9Wm4oKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9blMuYmluZChudWxsLFplLGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1abigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTokZyx1c2VEZWJ1Z1ZhbHVlOmlwLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFpuKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9JGcoITEpLHQ9ZVswXTtyZXR1cm4gZT10Uy5iaW5kKG51bGwsZVsxXSksWm4oKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1aZSxvPVpuKCk7aWYocWUpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoTCg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLHZ0PT09bnVsbCl0aHJvdyBFcnJvcihMKDM0OSkpO09vJjMwfHxodihyLHQsbil9by5tZW1vaXplZFN0YXRlPW47dmFyIGE9e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIG8ucXVldWU9YSxXZyhtdi5iaW5kKG51bGwscixhLGUpLFtlXSksci5mbGFnc3w9MjA0OCxVaSg5LGd2LmJpbmQobnVsbCxyLGEsbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1abigpLHQ9dnQuaWRlbnRpZmllclByZWZpeDtpZihxZSl7dmFyIG49dnIscj1tcjtuPShyJn4oMTw8MzItRm4ociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1QaSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1lUysrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sYVM9e3JlYWRDb250ZXh0OmJuLHVzZUNhbGxiYWNrOkV2LHVzZUNvbnRleHQ6Ym4sdXNlRWZmZWN0OmFwLHVzZUltcGVyYXRpdmVIYW5kbGU6U3YsdXNlSW5zZXJ0aW9uRWZmZWN0OmJ2LHVzZUxheW91dEVmZmVjdDprdix1c2VNZW1vOk52LHVzZVJlZHVjZXI6T2MsdXNlUmVmOnd2LHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIE9jKExpKX0sdXNlRGVidWdWYWx1ZTppcCx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWtuKCk7cmV0dXJuIFR2KHQscHQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPU9jKExpKVswXSx0PWtuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpwdix1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdix1c2VJZDpEdix1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGlTPXtyZWFkQ29udGV4dDpibix1c2VDYWxsYmFjazpFdix1c2VDb250ZXh0OmJuLHVzZUVmZmVjdDphcCx1c2VJbXBlcmF0aXZlSGFuZGxlOlN2LHVzZUluc2VydGlvbkVmZmVjdDpidix1c2VMYXlvdXRFZmZlY3Q6a3YsdXNlTWVtbzpOdix1c2VSZWR1Y2VyOkljLHVzZVJlZjp3dix1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBJYyhMaSl9LHVzZURlYnVnVmFsdWU6aXAsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1rbigpO3JldHVybiBwdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6VHYodCxwdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9SWMoTGkpWzBdLHQ9a24oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOnB2LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ2LHVzZUlkOkR2LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gTG4oZSx0KXtpZihlJiZlLmRlZmF1bHRQcm9wcyl7dD1ldCh7fSx0KSxlPWUuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiBlKXRbbl09PT12b2lkIDAmJih0W25dPWVbbl0pO3JldHVybiB0fXJldHVybiB0fWZ1bmN0aW9uIGZ1KGUsdCxuLHIpe3Q9ZS5tZW1vaXplZFN0YXRlLG49bihyLHQpLG49bj09bnVsbD90OmV0KHt9LHQsbiksZS5tZW1vaXplZFN0YXRlPW4sZS5sYW5lcz09PTAmJihlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1uKX12YXIgSGw9e2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4oZT1lLl9yZWFjdEludGVybmFscyk/UG8oZSk9PT1lOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIHI9VXQoKSxvPUpyKGUpLGE9eXIocixvKTthLnBheWxvYWQ9dCxuIT1udWxsJiYoYS5jYWxsYmFjaz1uKSx0PXFyKGUsYSxvKSx0IT09bnVsbCYmKCRuKHQsZSxvLHIpLGFsKHQsZSxvKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIHI9VXQoKSxvPUpyKGUpLGE9eXIocixvKTthLnRhZz0xLGEucGF5bG9hZD10LG4hPW51bGwmJihhLmNhbGxiYWNrPW4pLHQ9cXIoZSxhLG8pLHQhPT1udWxsJiYoJG4odCxlLG8sciksYWwodCxlLG8pKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgbj1VdCgpLHI9SnIoZSksbz15cihuLHIpO28udGFnPTIsdCE9bnVsbCYmKG8uY2FsbGJhY2s9dCksdD1xcihlLG8sciksdCE9PW51bGwmJigkbih0LGUscixuKSxhbCh0LGUscikpfX07ZnVuY3Rpb24gQmcoZSx0LG4scixvLGEsaSl7cmV0dXJuIGU9ZS5zdGF0ZU5vZGUsdHlwZW9mIGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPT0iZnVuY3Rpb24iP2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHIsYSxpKTp0LnByb3RvdHlwZSYmdC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IV9pKG4scil8fCFfaShvLGEpOiEwfWZ1bmN0aW9uIE92KGUsdCxuKXt2YXIgcj0hMSxvPWVvLGE9dC5jb250ZXh0VHlwZTtyZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9hPWJuKGEpOihvPVF0KHQpP19vOkN0LmN1cnJlbnQscj10LmNvbnRleHRUeXBlcyxhPShyPXIhPW51bGwpP1NhKGUsbyk6ZW8pLHQ9bmV3IHQobixhKSxlLm1lbW9pemVkU3RhdGU9dC5zdGF0ZSE9PW51bGwmJnQuc3RhdGUhPT12b2lkIDA/dC5zdGF0ZTpudWxsLHQudXBkYXRlcj1IbCxlLnN0YXRlTm9kZT10LHQuX3JlYWN0SW50ZXJuYWxzPWUsciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PW8sZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1hKSx0fWZ1bmN0aW9uIEhnKGUsdCxuLHIpe2U9dC5zdGF0ZSx0eXBlb2YgdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0eXBlb2YgdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHQuc3RhdGUhPT1lJiZIbC5lbnF1ZXVlUmVwbGFjZVN0YXRlKHQsdC5zdGF0ZSxudWxsKX1mdW5jdGlvbiBodShlLHQsbixyKXt2YXIgbz1lLnN0YXRlTm9kZTtvLnByb3BzPW4sby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsby5yZWZzPXt9LFh1KGUpO3ZhciBhPXQuY29udGV4dFR5cGU7dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9vLmNvbnRleHQ9Ym4oYSk6KGE9UXQodCk/X286Q3QuY3VycmVudCxvLmNvbnRleHQ9U2EoZSxhKSksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsYT10LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyx0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKGZ1KGUsdCxhLG4pLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0PW8uc3RhdGUsdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLHQhPT1vLnN0YXRlJiZIbC5lbnF1ZXVlUmVwbGFjZVN0YXRlKG8sby5zdGF0ZSxudWxsKSxEbChlLG4sbyxyKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIG8uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJihlLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBEYShlLHQpe3RyeXt2YXIgbj0iIixyPXQ7ZG8gbis9THgocikscj1yLnJldHVybjt3aGlsZShyKTt2YXIgbz1ufWNhdGNoKGEpe289YApFcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBgK2EubWVzc2FnZStgCmArYS5zdGFja31yZXR1cm57dmFsdWU6ZSxzb3VyY2U6dCxzdGFjazpvLGRpZ2VzdDpudWxsfX1mdW5jdGlvbiBNYyhlLHQsbil7cmV0dXJue3ZhbHVlOmUsc291cmNlOm51bGwsc3RhY2s6bj8/bnVsbCxkaWdlc3Q6dD8/bnVsbH19ZnVuY3Rpb24gZ3UoZSx0KXt0cnl7Y29uc29sZS5lcnJvcih0LnZhbHVlKX1jYXRjaChuKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgbn0pfX12YXIgc1M9dHlwZW9mIFdlYWtNYXA9PSJmdW5jdGlvbiI/V2Vha01hcDpNYXA7ZnVuY3Rpb24gSXYoZSx0LG4pe249eXIoLTEsbiksbi50YWc9MyxuLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIHI9dC52YWx1ZTtyZXR1cm4gbi5jYWxsYmFjaz1mdW5jdGlvbigpe0lsfHwoSWw9ITAsTnU9ciksZ3UoZSx0KX0sbn1mdW5jdGlvbiBNdihlLHQsbil7bj15cigtMSxuKSxuLnRhZz0zO3ZhciByPWUudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBvPXQudmFsdWU7bi5wYXlsb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIHIobyl9LG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtndShlLHQpfX12YXIgYT1lLnN0YXRlTm9kZTtyZXR1cm4gYSE9PW51bGwmJnR5cGVvZiBhLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYobi5jYWxsYmFjaz1mdW5jdGlvbigpe2d1KGUsdCksdHlwZW9mIHIhPSJmdW5jdGlvbiImJihRcj09PW51bGw/UXI9bmV3IFNldChbdGhpc10pOlFyLmFkZCh0aGlzKSk7dmFyIGk9dC5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKHQudmFsdWUse2NvbXBvbmVudFN0YWNrOmkhPT1udWxsP2k6IiJ9KX0pLG59ZnVuY3Rpb24gR2coZSx0LG4pe3ZhciByPWUucGluZ0NhY2hlO2lmKHI9PT1udWxsKXtyPWUucGluZ0NhY2hlPW5ldyBzUzt2YXIgbz1uZXcgU2V0O3Iuc2V0KHQsbyl9ZWxzZSBvPXIuZ2V0KHQpLG89PT12b2lkIDAmJihvPW5ldyBTZXQsci5zZXQodCxvKSk7by5oYXMobil8fChvLmFkZChuKSxlPWtTLmJpbmQobnVsbCxlLHQsbiksdC50aGVuKGUsZSkpfWZ1bmN0aW9uIGpnKGUpe2Rve3ZhciB0O2lmKCh0PWUudGFnPT09MTMpJiYodD1lLm1lbW9pemVkU3RhdGUsdD10IT09bnVsbD90LmRlaHlkcmF0ZWQhPT1udWxsOiEwKSx0KXJldHVybiBlO2U9ZS5yZXR1cm59d2hpbGUoZSE9PW51bGwpO3JldHVybiBudWxsfWZ1bmN0aW9uIFZnKGUsdCxuLHIsbyl7cmV0dXJuIGUubW9kZSYxPyhlLmZsYWdzfD02NTUzNixlLmxhbmVzPW8sZSk6KGU9PT10P2UuZmxhZ3N8PTY1NTM2OihlLmZsYWdzfD0xMjgsbi5mbGFnc3w9MTMxMDcyLG4uZmxhZ3MmPS01MjgwNSxuLnRhZz09PTEmJihuLmFsdGVybmF0ZT09PW51bGw/bi50YWc9MTc6KHQ9eXIoLTEsMSksdC50YWc9MixxcihuLHQsMSkpKSxuLmxhbmVzfD0xKSxlKX12YXIgbFM9U3IuUmVhY3RDdXJyZW50T3duZXIsWXQ9ITE7ZnVuY3Rpb24gTHQoZSx0LG4scil7dC5jaGlsZD1lPT09bnVsbD9sdih0LG51bGwsbixyKTpOYSh0LGUuY2hpbGQsbixyKX1mdW5jdGlvbiBLZyhlLHQsbixyLG8pe249bi5yZW5kZXI7dmFyIGE9dC5yZWY7cmV0dXJuIGJhKHQsbykscj1ycChlLHQsbixyLGEsbyksbj1vcCgpLGUhPT1udWxsJiYhWXQ/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byx4cihlLHQsbykpOihxZSYmbiYmanUodCksdC5mbGFnc3w9MSxMdChlLHQscixvKSx0LmNoaWxkKX1mdW5jdGlvbiBZZyhlLHQsbixyLG8pe2lmKGU9PT1udWxsKXt2YXIgYT1uLnR5cGU7cmV0dXJuIHR5cGVvZiBhPT0iZnVuY3Rpb24iJiYhaHAoYSkmJmEuZGVmYXVsdFByb3BzPT09dm9pZCAwJiZuLmNvbXBhcmU9PT1udWxsJiZuLmRlZmF1bHRQcm9wcz09PXZvaWQgMD8odC50YWc9MTUsdC50eXBlPWEsUnYoZSx0LGEscixvKSk6KGU9dWwobi50eXBlLG51bGwscix0LHQubW9kZSxvKSxlLnJlZj10LnJlZixlLnJldHVybj10LHQuY2hpbGQ9ZSl9aWYoYT1lLmNoaWxkLCEoZS5sYW5lcyZvKSl7dmFyIGk9YS5tZW1vaXplZFByb3BzO2lmKG49bi5jb21wYXJlLG49biE9PW51bGw/bjpfaSxuKGkscikmJmUucmVmPT09dC5yZWYpcmV0dXJuIHhyKGUsdCxvKX1yZXR1cm4gdC5mbGFnc3w9MSxlPVhyKGEsciksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWV9ZnVuY3Rpb24gUnYoZSx0LG4scixvKXtpZihlIT09bnVsbCl7dmFyIGE9ZS5tZW1vaXplZFByb3BzO2lmKF9pKGEscikmJmUucmVmPT09dC5yZWYpaWYoWXQ9ITEsdC5wZW5kaW5nUHJvcHM9cj1hLChlLmxhbmVzJm8pIT09MCllLmZsYWdzJjEzMTA3MiYmKFl0PSEwKTtlbHNlIHJldHVybiB0LmxhbmVzPWUubGFuZXMseHIoZSx0LG8pfXJldHVybiBtdShlLHQsbixyLG8pfWZ1bmN0aW9uIFB2KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPXIuY2hpbGRyZW4sYT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbDtpZihyLm1vZGU9PT0iaGlkZGVuIilpZighKHQubW9kZSYxKSl0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEdlKGdhLHRuKSx0bnw9bjtlbHNle2lmKCEobiYxMDczNzQxODI0KSlyZXR1cm4gZT1hIT09bnVsbD9hLmJhc2VMYW5lc3xuOm4sdC5sYW5lcz10LmNoaWxkTGFuZXM9MTA3Mzc0MTgyNCx0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LHQudXBkYXRlUXVldWU9bnVsbCxHZShnYSx0biksdG58PWUsbnVsbDt0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LHI9YSE9PW51bGw/YS5iYXNlTGFuZXM6bixHZShnYSx0biksdG58PXJ9ZWxzZSBhIT09bnVsbD8ocj1hLmJhc2VMYW5lc3xuLHQubWVtb2l6ZWRTdGF0ZT1udWxsKTpyPW4sR2UoZ2EsdG4pLHRufD1yO3JldHVybiBMdChlLHQsbyxuKSx0LmNoaWxkfWZ1bmN0aW9uIEx2KGUsdCl7dmFyIG49dC5yZWY7KGU9PT1udWxsJiZuIT09bnVsbHx8ZSE9PW51bGwmJmUucmVmIT09bikmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9ZnVuY3Rpb24gbXUoZSx0LG4scixvKXt2YXIgYT1RdChuKT9fbzpDdC5jdXJyZW50O3JldHVybiBhPVNhKHQsYSksYmEodCxvKSxuPXJwKGUsdCxuLHIsYSxvKSxyPW9wKCksZSE9PW51bGwmJiFZdD8odC51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQuZmxhZ3MmPS0yMDUzLGUubGFuZXMmPX5vLHhyKGUsdCxvKSk6KHFlJiZyJiZqdSh0KSx0LmZsYWdzfD0xLEx0KGUsdCxuLG8pLHQuY2hpbGQpfWZ1bmN0aW9uIHFnKGUsdCxuLHIsbyl7aWYoUXQobikpe3ZhciBhPSEwO3hsKHQpfWVsc2UgYT0hMTtpZihiYSh0LG8pLHQuc3RhdGVOb2RlPT09bnVsbClsbChlLHQpLE92KHQsbixyKSxodSh0LG4scixvKSxyPSEwO2Vsc2UgaWYoZT09PW51bGwpe3ZhciBpPXQuc3RhdGVOb2RlLHM9dC5tZW1vaXplZFByb3BzO2kucHJvcHM9czt2YXIgbD1pLmNvbnRleHQsZD1uLmNvbnRleHRUeXBlO3R5cGVvZiBkPT0ib2JqZWN0IiYmZCE9PW51bGw/ZD1ibihkKTooZD1RdChuKT9fbzpDdC5jdXJyZW50LGQ9U2EodCxkKSk7dmFyIGM9bi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMscD10eXBlb2YgYz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiI7cHx8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChzIT09cnx8bCE9PWQpJiZIZyh0LGkscixkKSwkcj0hMTt2YXIgdT10Lm1lbW9pemVkU3RhdGU7aS5zdGF0ZT11LERsKHQscixpLG8pLGw9dC5tZW1vaXplZFN0YXRlLHMhPT1yfHx1IT09bHx8cXQuY3VycmVudHx8JHI/KHR5cGVvZiBjPT0iZnVuY3Rpb24iJiYoZnUodCxuLGMsciksbD10Lm1lbW9pemVkU3RhdGUpLChzPSRyfHxCZyh0LG4scyxyLHUsbCxkKSk/KHB8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksdHlwZW9mIGkuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSk6KHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPWwpLGkucHJvcHM9cixpLnN0YXRlPWwsaS5jb250ZXh0PWQscj1zKToodHlwZW9mIGkuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSxyPSExKX1lbHNle2k9dC5zdGF0ZU5vZGUsY3YoZSx0KSxzPXQubWVtb2l6ZWRQcm9wcyxkPXQudHlwZT09PXQuZWxlbWVudFR5cGU/czpMbih0LnR5cGUscyksaS5wcm9wcz1kLHA9dC5wZW5kaW5nUHJvcHMsdT1pLmNvbnRleHQsbD1uLmNvbnRleHRUeXBlLHR5cGVvZiBsPT0ib2JqZWN0IiYmbCE9PW51bGw/bD1ibihsKToobD1RdChuKT9fbzpDdC5jdXJyZW50LGw9U2EodCxsKSk7dmFyIGY9bi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7KGM9dHlwZW9mIGY9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iKXx8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChzIT09cHx8dSE9PWwpJiZIZyh0LGkscixsKSwkcj0hMSx1PXQubWVtb2l6ZWRTdGF0ZSxpLnN0YXRlPXUsRGwodCxyLGksbyk7dmFyIHY9dC5tZW1vaXplZFN0YXRlO3MhPT1wfHx1IT09dnx8cXQuY3VycmVudHx8JHI/KHR5cGVvZiBmPT0iZnVuY3Rpb24iJiYoZnUodCxuLGYsciksdj10Lm1lbW9pemVkU3RhdGUpLChkPSRyfHxCZyh0LG4sZCxyLHUsdixsKXx8ITEpPyhjfHx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGkuY29tcG9uZW50V2lsbFVwZGF0ZSE9ImZ1bmN0aW9uInx8KHR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGU9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbFVwZGF0ZShyLHYsbCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGU9PSJmdW5jdGlvbiImJmkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUocix2LGwpKSx0eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00KSx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTEwMjQpKToodHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZ1PT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnU9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSx0Lm1lbW9pemVkUHJvcHM9cix0Lm1lbW9pemVkU3RhdGU9diksaS5wcm9wcz1yLGkuc3RhdGU9dixpLmNvbnRleHQ9bCxyPWQpOih0eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnU9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmdT09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLHI9ITEpfXJldHVybiB2dShlLHQsbixyLGEsbyl9ZnVuY3Rpb24gdnUoZSx0LG4scixvLGEpe0x2KGUsdCk7dmFyIGk9KHQuZmxhZ3MmMTI4KSE9PTA7aWYoIXImJiFpKXJldHVybiBvJiZSZyh0LG4sITEpLHhyKGUsdCxhKTtyPXQuc3RhdGVOb2RlLGxTLmN1cnJlbnQ9dDt2YXIgcz1pJiZ0eXBlb2Ygbi5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPSJmdW5jdGlvbiI/bnVsbDpyLnJlbmRlcigpO3JldHVybiB0LmZsYWdzfD0xLGUhPT1udWxsJiZpPyh0LmNoaWxkPU5hKHQsZS5jaGlsZCxudWxsLGEpLHQuY2hpbGQ9TmEodCxudWxsLHMsYSkpOkx0KGUsdCxzLGEpLHQubWVtb2l6ZWRTdGF0ZT1yLnN0YXRlLG8mJlJnKHQsbiwhMCksdC5jaGlsZH1mdW5jdGlvbiBVdihlKXt2YXIgdD1lLnN0YXRlTm9kZTt0LnBlbmRpbmdDb250ZXh0P01nKGUsdC5wZW5kaW5nQ29udGV4dCx0LnBlbmRpbmdDb250ZXh0IT09dC5jb250ZXh0KTp0LmNvbnRleHQmJk1nKGUsdC5jb250ZXh0LCExKSxadShlLHQuY29udGFpbmVySW5mbyl9ZnVuY3Rpb24gUWcoZSx0LG4scixvKXtyZXR1cm4gRWEoKSxLdShvKSx0LmZsYWdzfD0yNTYsTHQoZSx0LG4sciksdC5jaGlsZH12YXIgeXU9e2RlaHlkcmF0ZWQ6bnVsbCx0cmVlQ29udGV4dDpudWxsLHJldHJ5TGFuZTowfTtmdW5jdGlvbiB3dShlKXtyZXR1cm57YmFzZUxhbmVzOmUsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH19ZnVuY3Rpb24genYoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89WGUuY3VycmVudCxhPSExLGk9KHQuZmxhZ3MmMTI4KSE9PTAscztpZigocz1pKXx8KHM9ZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZT09PW51bGw/ITE6KG8mMikhPT0wKSxzPyhhPSEwLHQuZmxhZ3MmPS0xMjkpOihlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCkmJihvfD0xKSxHZShYZSxvJjEpLGU9PT1udWxsKXJldHVybiB1dSh0KSxlPXQubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmKGU9ZS5kZWh5ZHJhdGVkLGUhPT1udWxsKT8odC5tb2RlJjE/ZS5kYXRhPT09IiQhIj90LmxhbmVzPTg6dC5sYW5lcz0xMDczNzQxODI0OnQubGFuZXM9MSxudWxsKTooaT1yLmNoaWxkcmVuLGU9ci5mYWxsYmFjayxhPyhyPXQubW9kZSxhPXQuY2hpbGQsaT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjppfSwhKHImMSkmJmEhPT1udWxsPyhhLmNoaWxkTGFuZXM9MCxhLnBlbmRpbmdQcm9wcz1pKTphPVZsKGksciwwLG51bGwpLGU9QW8oZSxyLG4sbnVsbCksYS5yZXR1cm49dCxlLnJldHVybj10LGEuc2libGluZz1lLHQuY2hpbGQ9YSx0LmNoaWxkLm1lbW9pemVkU3RhdGU9d3UobiksdC5tZW1vaXplZFN0YXRlPXl1LGUpOnNwKHQsaSkpO2lmKG89ZS5tZW1vaXplZFN0YXRlLG8hPT1udWxsJiYocz1vLmRlaHlkcmF0ZWQscyE9PW51bGwpKXJldHVybiBkUyhlLHQsaSxyLHMsbyxuKTtpZihhKXthPXIuZmFsbGJhY2ssaT10Lm1vZGUsbz1lLmNoaWxkLHM9by5zaWJsaW5nO3ZhciBsPXttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOnIuY2hpbGRyZW59O3JldHVybiEoaSYxKSYmdC5jaGlsZCE9PW8/KHI9dC5jaGlsZCxyLmNoaWxkTGFuZXM9MCxyLnBlbmRpbmdQcm9wcz1sLHQuZGVsZXRpb25zPW51bGwpOihyPVhyKG8sbCksci5zdWJ0cmVlRmxhZ3M9by5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQpLHMhPT1udWxsP2E9WHIocyxhKTooYT1BbyhhLGksbixudWxsKSxhLmZsYWdzfD0yKSxhLnJldHVybj10LHIucmV0dXJuPXQsci5zaWJsaW5nPWEsdC5jaGlsZD1yLHI9YSxhPXQuY2hpbGQsaT1lLmNoaWxkLm1lbW9pemVkU3RhdGUsaT1pPT09bnVsbD93dShuKTp7YmFzZUxhbmVzOmkuYmFzZUxhbmVzfG4sY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6aS50cmFuc2l0aW9uc30sYS5tZW1vaXplZFN0YXRlPWksYS5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyZ+bix0Lm1lbW9pemVkU3RhdGU9eXUscn1yZXR1cm4gYT1lLmNoaWxkLGU9YS5zaWJsaW5nLHI9WHIoYSx7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46ci5jaGlsZHJlbn0pLCEodC5tb2RlJjEpJiYoci5sYW5lcz1uKSxyLnJldHVybj10LHIuc2libGluZz1udWxsLGUhPT1udWxsJiYobj10LmRlbGV0aW9ucyxuPT09bnVsbD8odC5kZWxldGlvbnM9W2VdLHQuZmxhZ3N8PTE2KTpuLnB1c2goZSkpLHQuY2hpbGQ9cix0Lm1lbW9pemVkU3RhdGU9bnVsbCxyfWZ1bmN0aW9uIHNwKGUsdCl7cmV0dXJuIHQ9Vmwoe21vZGU6InZpc2libGUiLGNoaWxkcmVuOnR9LGUubW9kZSwwLG51bGwpLHQucmV0dXJuPWUsZS5jaGlsZD10fWZ1bmN0aW9uIFpzKGUsdCxuLHIpe3JldHVybiByIT09bnVsbCYmS3UociksTmEodCxlLmNoaWxkLG51bGwsbiksZT1zcCh0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxlLmZsYWdzfD0yLHQubWVtb2l6ZWRTdGF0ZT1udWxsLGV9ZnVuY3Rpb24gZFMoZSx0LG4scixvLGEsaSl7aWYobilyZXR1cm4gdC5mbGFncyYyNTY/KHQuZmxhZ3MmPS0yNTcscj1NYyhFcnJvcihMKDQyMikpKSxacyhlLHQsaSxyKSk6dC5tZW1vaXplZFN0YXRlIT09bnVsbD8odC5jaGlsZD1lLmNoaWxkLHQuZmxhZ3N8PTEyOCxudWxsKTooYT1yLmZhbGxiYWNrLG89dC5tb2RlLHI9Vmwoe21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59LG8sMCxudWxsKSxhPUFvKGEsbyxpLG51bGwpLGEuZmxhZ3N8PTIsci5yZXR1cm49dCxhLnJldHVybj10LHIuc2libGluZz1hLHQuY2hpbGQ9cix0Lm1vZGUmMSYmTmEodCxlLmNoaWxkLG51bGwsaSksdC5jaGlsZC5tZW1vaXplZFN0YXRlPXd1KGkpLHQubWVtb2l6ZWRTdGF0ZT15dSxhKTtpZighKHQubW9kZSYxKSlyZXR1cm4gWnMoZSx0LGksbnVsbCk7aWYoby5kYXRhPT09IiQhIil7aWYocj1vLm5leHRTaWJsaW5nJiZvLm5leHRTaWJsaW5nLmRhdGFzZXQscil2YXIgcz1yLmRnc3Q7cmV0dXJuIHI9cyxhPUVycm9yKEwoNDE5KSkscj1NYyhhLHIsdm9pZCAwKSxacyhlLHQsaSxyKX1pZihzPShpJmUuY2hpbGRMYW5lcykhPT0wLFl0fHxzKXtpZihyPXZ0LHIhPT1udWxsKXtzd2l0Y2goaSYtaSl7Y2FzZSA0Om89MjticmVhaztjYXNlIDE2Om89ODticmVhaztjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOmNhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6bz0zMjticmVhaztjYXNlIDUzNjg3MDkxMjpvPTI2ODQzNTQ1NjticmVhaztkZWZhdWx0Om89MH1vPW8mKHIuc3VzcGVuZGVkTGFuZXN8aSk/MDpvLG8hPT0wJiZvIT09YS5yZXRyeUxhbmUmJihhLnJldHJ5TGFuZT1vLGtyKGUsbyksJG4ocixlLG8sLTEpKX1yZXR1cm4gZnAoKSxyPU1jKEVycm9yKEwoNDIxKSkpLFpzKGUsdCxpLHIpfXJldHVybiBvLmRhdGE9PT0iJD8iPyh0LmZsYWdzfD0xMjgsdC5jaGlsZD1lLmNoaWxkLHQ9eFMuYmluZChudWxsLGUpLG8uX3JlYWN0UmV0cnk9dCxudWxsKTooZT1hLnRyZWVDb250ZXh0LG5uPVlyKG8ubmV4dFNpYmxpbmcpLHJuPXQscWU9ITAsem49bnVsbCxlIT09bnVsbCYmKG1uW3ZuKytdPW1yLG1uW3ZuKytdPXZyLG1uW3ZuKytdPUNvLG1yPWUuaWQsdnI9ZS5vdmVyZmxvdyxDbz10KSx0PXNwKHQsci5jaGlsZHJlbiksdC5mbGFnc3w9NDA5Nix0KX1mdW5jdGlvbiBKZyhlLHQsbil7ZS5sYW5lc3w9dDt2YXIgcj1lLmFsdGVybmF0ZTtyIT09bnVsbCYmKHIubGFuZXN8PXQpLHB1KGUucmV0dXJuLHQsbil9ZnVuY3Rpb24gUmMoZSx0LG4scixvKXt2YXIgYT1lLm1lbW9pemVkU3RhdGU7YT09PW51bGw/ZS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczp0LHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6cix0YWlsOm4sdGFpbE1vZGU6b306KGEuaXNCYWNrd2FyZHM9dCxhLnJlbmRlcmluZz1udWxsLGEucmVuZGVyaW5nU3RhcnRUaW1lPTAsYS5sYXN0PXIsYS50YWlsPW4sYS50YWlsTW9kZT1vKX1mdW5jdGlvbiBGdihlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLnJldmVhbE9yZGVyLGE9ci50YWlsO2lmKEx0KGUsdCxyLmNoaWxkcmVuLG4pLHI9WGUuY3VycmVudCxyJjIpcj1yJjF8Mix0LmZsYWdzfD0xMjg7ZWxzZXtpZihlIT09bnVsbCYmZS5mbGFncyYxMjgpZTpmb3IoZT10LmNoaWxkO2UhPT1udWxsOyl7aWYoZS50YWc9PT0xMyllLm1lbW9pemVkU3RhdGUhPT1udWxsJiZKZyhlLG4sdCk7ZWxzZSBpZihlLnRhZz09PTE5KUpnKGUsbix0KTtlbHNlIGlmKGUuY2hpbGQhPT1udWxsKXtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZDtjb250aW51ZX1pZihlPT09dClicmVhayBlO2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8ZS5yZXR1cm49PT10KWJyZWFrIGU7ZT1lLnJldHVybn1lLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nfXImPTF9aWYoR2UoWGUsciksISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPW51bGw7ZWxzZSBzd2l0Y2gobyl7Y2FzZSJmb3J3YXJkcyI6Zm9yKG49dC5jaGlsZCxvPW51bGw7biE9PW51bGw7KWU9bi5hbHRlcm5hdGUsZSE9PW51bGwmJkFsKGUpPT09bnVsbCYmKG89biksbj1uLnNpYmxpbmc7bj1vLG49PT1udWxsPyhvPXQuY2hpbGQsdC5jaGlsZD1udWxsKToobz1uLnNpYmxpbmcsbi5zaWJsaW5nPW51bGwpLFJjKHQsITEsbyxuLGEpO2JyZWFrO2Nhc2UiYmFja3dhcmRzIjpmb3Iobj1udWxsLG89dC5jaGlsZCx0LmNoaWxkPW51bGw7byE9PW51bGw7KXtpZihlPW8uYWx0ZXJuYXRlLGUhPT1udWxsJiZBbChlKT09PW51bGwpe3QuY2hpbGQ9bzticmVha31lPW8uc2libGluZyxvLnNpYmxpbmc9bixuPW8sbz1lfVJjKHQsITAsbixudWxsLGEpO2JyZWFrO2Nhc2UidG9nZXRoZXIiOlJjKHQsITEsbnVsbCxudWxsLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0Lm1lbW9pemVkU3RhdGU9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBsbChlLHQpeyEodC5tb2RlJjEpJiZlIT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsdC5hbHRlcm5hdGU9bnVsbCx0LmZsYWdzfD0yKX1mdW5jdGlvbiB4cihlLHQsbil7aWYoZSE9PW51bGwmJih0LmRlcGVuZGVuY2llcz1lLmRlcGVuZGVuY2llcyksSW98PXQubGFuZXMsIShuJnQuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYoZSE9PW51bGwmJnQuY2hpbGQhPT1lLmNoaWxkKXRocm93IEVycm9yKEwoMTUzKSk7aWYodC5jaGlsZCE9PW51bGwpe2ZvcihlPXQuY2hpbGQsbj1YcihlLGUucGVuZGluZ1Byb3BzKSx0LmNoaWxkPW4sbi5yZXR1cm49dDtlLnNpYmxpbmchPT1udWxsOyllPWUuc2libGluZyxuPW4uc2libGluZz1YcihlLGUucGVuZGluZ1Byb3BzKSxuLnJldHVybj10O24uc2libGluZz1udWxsfXJldHVybiB0LmNoaWxkfWZ1bmN0aW9uIGNTKGUsdCxuKXtzd2l0Y2godC50YWcpe2Nhc2UgMzpVdih0KSxFYSgpO2JyZWFrO2Nhc2UgNTp1dih0KTticmVhaztjYXNlIDE6UXQodC50eXBlKSYmeGwodCk7YnJlYWs7Y2FzZSA0Olp1KHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7YnJlYWs7Y2FzZSAxMDp2YXIgcj10LnR5cGUuX2NvbnRleHQsbz10Lm1lbW9pemVkUHJvcHMudmFsdWU7R2UoTmwsci5fY3VycmVudFZhbHVlKSxyLl9jdXJyZW50VmFsdWU9bzticmVhaztjYXNlIDEzOmlmKHI9dC5tZW1vaXplZFN0YXRlLHIhPT1udWxsKXJldHVybiByLmRlaHlkcmF0ZWQhPT1udWxsPyhHZShYZSxYZS5jdXJyZW50JjEpLHQuZmxhZ3N8PTEyOCxudWxsKTpuJnQuY2hpbGQuY2hpbGRMYW5lcz96dihlLHQsbik6KEdlKFhlLFhlLmN1cnJlbnQmMSksZT14cihlLHQsbiksZSE9PW51bGw/ZS5zaWJsaW5nOm51bGwpO0dlKFhlLFhlLmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTppZihyPShuJnQuY2hpbGRMYW5lcykhPT0wLGUuZmxhZ3MmMTI4KXtpZihyKXJldHVybiBGdihlLHQsbik7dC5mbGFnc3w9MTI4fWlmKG89dC5tZW1vaXplZFN0YXRlLG8hPT1udWxsJiYoby5yZW5kZXJpbmc9bnVsbCxvLnRhaWw9bnVsbCxvLmxhc3RFZmZlY3Q9bnVsbCksR2UoWGUsWGUuY3VycmVudCkscilicmVhaztyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHQubGFuZXM9MCxQdihlLHQsbil9cmV0dXJuIHhyKGUsdCxuKX12YXIgJHYsYnUsV3YsQnY7JHY9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5jaGlsZDtuIT09bnVsbDspe2lmKG4udGFnPT09NXx8bi50YWc9PT02KWUuYXBwZW5kQ2hpbGQobi5zdGF0ZU5vZGUpO2Vsc2UgaWYobi50YWchPT00JiZuLmNoaWxkIT09bnVsbCl7bi5jaGlsZC5yZXR1cm49bixuPW4uY2hpbGQ7Y29udGludWV9aWYobj09PXQpYnJlYWs7Zm9yKDtuLnNpYmxpbmc9PT1udWxsOyl7aWYobi5yZXR1cm49PT1udWxsfHxuLnJldHVybj09PXQpcmV0dXJuO249bi5yZXR1cm59bi5zaWJsaW5nLnJldHVybj1uLnJldHVybixuPW4uc2libGluZ319O2J1PWZ1bmN0aW9uKCl7fTtXdj1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1lLm1lbW9pemVkUHJvcHM7aWYobyE9PXIpe2U9dC5zdGF0ZU5vZGUsVG8obnIuY3VycmVudCk7dmFyIGE9bnVsbDtzd2l0Y2gobil7Y2FzZSJpbnB1dCI6bz1CYyhlLG8pLHI9QmMoZSxyKSxhPVtdO2JyZWFrO2Nhc2Uic2VsZWN0IjpvPWV0KHt9LG8se3ZhbHVlOnZvaWQgMH0pLHI9ZXQoe30scix7dmFsdWU6dm9pZCAwfSksYT1bXTticmVhaztjYXNlInRleHRhcmVhIjpvPWpjKGUsbykscj1qYyhlLHIpLGE9W107YnJlYWs7ZGVmYXVsdDp0eXBlb2Ygby5vbkNsaWNrIT0iZnVuY3Rpb24iJiZ0eXBlb2Ygci5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoZS5vbmNsaWNrPWJsKX1LYyhuLHIpO3ZhciBpO249bnVsbDtmb3IoZCBpbiBvKWlmKCFyLmhhc093blByb3BlcnR5KGQpJiZvLmhhc093blByb3BlcnR5KGQpJiZvW2RdIT1udWxsKWlmKGQ9PT0ic3R5bGUiKXt2YXIgcz1vW2RdO2ZvcihpIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShpKSYmKG58fChuPXt9KSxuW2ldPSIiKX1lbHNlIGQhPT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiJiZkIT09ImNoaWxkcmVuIiYmZCE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZkIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmQhPT0iYXV0b0ZvY3VzIiYmKHhpLmhhc093blByb3BlcnR5KGQpP2F8fChhPVtdKTooYT1hfHxbXSkucHVzaChkLG51bGwpKTtmb3IoZCBpbiByKXt2YXIgbD1yW2RdO2lmKHM9bz8uW2RdLHIuaGFzT3duUHJvcGVydHkoZCkmJmwhPT1zJiYobCE9bnVsbHx8cyE9bnVsbCkpaWYoZD09PSJzdHlsZSIpaWYocyl7Zm9yKGkgaW4gcykhcy5oYXNPd25Qcm9wZXJ0eShpKXx8bCYmbC5oYXNPd25Qcm9wZXJ0eShpKXx8KG58fChuPXt9KSxuW2ldPSIiKTtmb3IoaSBpbiBsKWwuaGFzT3duUHJvcGVydHkoaSkmJnNbaV0hPT1sW2ldJiYobnx8KG49e30pLG5baV09bFtpXSl9ZWxzZSBufHwoYXx8KGE9W10pLGEucHVzaChkLG4pKSxuPWw7ZWxzZSBkPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8obD1sP2wuX19odG1sOnZvaWQgMCxzPXM/cy5fX2h0bWw6dm9pZCAwLGwhPW51bGwmJnMhPT1sJiYoYT1hfHxbXSkucHVzaChkLGwpKTpkPT09ImNoaWxkcmVuIj90eXBlb2YgbCE9InN0cmluZyImJnR5cGVvZiBsIT0ibnVtYmVyInx8KGE9YXx8W10pLnB1c2goZCwiIitsKTpkIT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJmQhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmKHhpLmhhc093blByb3BlcnR5KGQpPyhsIT1udWxsJiZkPT09Im9uU2Nyb2xsIiYmS2UoInNjcm9sbCIsZSksYXx8cz09PWx8fChhPVtdKSk6KGE9YXx8W10pLnB1c2goZCxsKSl9biYmKGE9YXx8W10pLnB1c2goInN0eWxlIixuKTt2YXIgZD1hOyh0LnVwZGF0ZVF1ZXVlPWQpJiYodC5mbGFnc3w9NCl9fTtCdj1mdW5jdGlvbihlLHQsbixyKXtuIT09ciYmKHQuZmxhZ3N8PTQpfTtmdW5jdGlvbiBpaShlLHQpe2lmKCFxZSlzd2l0Y2goZS50YWlsTW9kZSl7Y2FzZSJoaWRkZW4iOnQ9ZS50YWlsO2Zvcih2YXIgbj1udWxsO3QhPT1udWxsOyl0LmFsdGVybmF0ZSE9PW51bGwmJihuPXQpLHQ9dC5zaWJsaW5nO249PT1udWxsP2UudGFpbD1udWxsOm4uc2libGluZz1udWxsO2JyZWFrO2Nhc2UiY29sbGFwc2VkIjpuPWUudGFpbDtmb3IodmFyIHI9bnVsbDtuIT09bnVsbDspbi5hbHRlcm5hdGUhPT1udWxsJiYocj1uKSxuPW4uc2libGluZztyPT09bnVsbD90fHxlLnRhaWw9PT1udWxsP2UudGFpbD1udWxsOmUudGFpbC5zaWJsaW5nPW51bGw6ci5zaWJsaW5nPW51bGx9fWZ1bmN0aW9uIEF0KGUpe3ZhciB0PWUuYWx0ZXJuYXRlIT09bnVsbCYmZS5hbHRlcm5hdGUuY2hpbGQ9PT1lLmNoaWxkLG49MCxyPTA7aWYodClmb3IodmFyIG89ZS5jaGlsZDtvIT09bnVsbDspbnw9by5sYW5lc3xvLmNoaWxkTGFuZXMscnw9by5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQscnw9by5mbGFncyYxNDY4MDA2NCxvLnJldHVybj1lLG89by5zaWJsaW5nO2Vsc2UgZm9yKG89ZS5jaGlsZDtvIT09bnVsbDspbnw9by5sYW5lc3xvLmNoaWxkTGFuZXMscnw9by5zdWJ0cmVlRmxhZ3Mscnw9by5mbGFncyxvLnJldHVybj1lLG89by5zaWJsaW5nO3JldHVybiBlLnN1YnRyZWVGbGFnc3w9cixlLmNoaWxkTGFuZXM9bix0fWZ1bmN0aW9uIHVTKGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcztzd2l0Y2goVnUodCksdC50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBBdCh0KSxudWxsO2Nhc2UgMTpyZXR1cm4gUXQodC50eXBlKSYma2woKSxBdCh0KSxudWxsO2Nhc2UgMzpyZXR1cm4gcj10LnN0YXRlTm9kZSxUYSgpLFllKHF0KSxZZShDdCksdHAoKSxyLnBlbmRpbmdDb250ZXh0JiYoci5jb250ZXh0PXIucGVuZGluZ0NvbnRleHQsci5wZW5kaW5nQ29udGV4dD1udWxsKSwoZT09PW51bGx8fGUuY2hpbGQ9PT1udWxsKSYmKEpzKHQpP3QuZmxhZ3N8PTQ6ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJiEodC5mbGFncyYyNTYpfHwodC5mbGFnc3w9MTAyNCx6biE9PW51bGwmJihBdSh6biksem49bnVsbCkpKSxidShlLHQpLEF0KHQpLG51bGw7Y2FzZSA1OmVwKHQpO3ZhciBvPVRvKFJpLmN1cnJlbnQpO2lmKG49dC50eXBlLGUhPT1udWxsJiZ0LnN0YXRlTm9kZSE9bnVsbClXdihlLHQsbixyLG8pLGUucmVmIT09dC5yZWYmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mik7ZWxzZXtpZighcil7aWYodC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKEwoMTY2KSk7cmV0dXJuIEF0KHQpLG51bGx9aWYoZT1Ubyhuci5jdXJyZW50KSxKcyh0KSl7cj10LnN0YXRlTm9kZSxuPXQudHlwZTt2YXIgYT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHJbZXJdPXQscltJaV09YSxlPSh0Lm1vZGUmMSkhPT0wLG4pe2Nhc2UiZGlhbG9nIjpLZSgiY2FuY2VsIixyKSxLZSgiY2xvc2UiLHIpO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6S2UoImxvYWQiLHIpO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihvPTA7bzxwaS5sZW5ndGg7bysrKUtlKHBpW29dLHIpO2JyZWFrO2Nhc2Uic291cmNlIjpLZSgiZXJyb3IiLHIpO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOktlKCJlcnJvciIsciksS2UoImxvYWQiLHIpO2JyZWFrO2Nhc2UiZGV0YWlscyI6S2UoInRvZ2dsZSIscik7YnJlYWs7Y2FzZSJpbnB1dCI6YWcocixhKSxLZSgiaW52YWxpZCIscik7YnJlYWs7Y2FzZSJzZWxlY3QiOnIuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFhLm11bHRpcGxlfSxLZSgiaW52YWxpZCIscik7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6c2cocixhKSxLZSgiaW52YWxpZCIscil9S2MobixhKSxvPW51bGw7Zm9yKHZhciBpIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIHM9YVtpXTtpPT09ImNoaWxkcmVuIj90eXBlb2Ygcz09InN0cmluZyI/ci50ZXh0Q29udGVudCE9PXMmJihhLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZRcyhyLnRleHRDb250ZW50LHMsZSksbz1bImNoaWxkcmVuIixzXSk6dHlwZW9mIHM9PSJudW1iZXIiJiZyLnRleHRDb250ZW50IT09IiIrcyYmKGEuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJlFzKHIudGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLCIiK3NdKTp4aS5oYXNPd25Qcm9wZXJ0eShpKSYmcyE9bnVsbCYmaT09PSJvblNjcm9sbCImJktlKCJzY3JvbGwiLHIpfXN3aXRjaChuKXtjYXNlImlucHV0Ijp6cyhyKSxpZyhyLGEsITApO2JyZWFrO2Nhc2UidGV4dGFyZWEiOnpzKHIpLGxnKHIpO2JyZWFrO2Nhc2Uic2VsZWN0IjpjYXNlIm9wdGlvbiI6YnJlYWs7ZGVmYXVsdDp0eXBlb2YgYS5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoci5vbmNsaWNrPWJsKX1yPW8sdC51cGRhdGVRdWV1ZT1yLHIhPT1udWxsJiYodC5mbGFnc3w9NCl9ZWxzZXtpPW8ubm9kZVR5cGU9PT05P286by5vd25lckRvY3VtZW50LGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCImJihlPW1tKG4pKSxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP249PT0ic2NyaXB0Ij8oZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuaW5uZXJIVE1MPSI8c2NyaXB0PjxcL3NjcmlwdD4iLGU9ZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpKTp0eXBlb2Ygci5pcz09InN0cmluZyI/ZT1pLmNyZWF0ZUVsZW1lbnQobix7aXM6ci5pc30pOihlPWkuY3JlYXRlRWxlbWVudChuKSxuPT09InNlbGVjdCImJihpPWUsci5tdWx0aXBsZT9pLm11bHRpcGxlPSEwOnIuc2l6ZSYmKGkuc2l6ZT1yLnNpemUpKSk6ZT1pLmNyZWF0ZUVsZW1lbnROUyhlLG4pLGVbZXJdPXQsZVtJaV09ciwkdihlLHQsITEsITEpLHQuc3RhdGVOb2RlPWU7ZTp7c3dpdGNoKGk9WWMobixyKSxuKXtjYXNlImRpYWxvZyI6S2UoImNhbmNlbCIsZSksS2UoImNsb3NlIixlKSxvPXI7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpLZSgibG9hZCIsZSksbz1yO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihvPTA7bzxwaS5sZW5ndGg7bysrKUtlKHBpW29dLGUpO289cjticmVhaztjYXNlInNvdXJjZSI6S2UoImVycm9yIixlKSxvPXI7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6S2UoImVycm9yIixlKSxLZSgibG9hZCIsZSksbz1yO2JyZWFrO2Nhc2UiZGV0YWlscyI6S2UoInRvZ2dsZSIsZSksbz1yO2JyZWFrO2Nhc2UiaW5wdXQiOmFnKGUsciksbz1CYyhlLHIpLEtlKCJpbnZhbGlkIixlKTticmVhaztjYXNlIm9wdGlvbiI6bz1yO2JyZWFrO2Nhc2Uic2VsZWN0IjplLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhci5tdWx0aXBsZX0sbz1ldCh7fSxyLHt2YWx1ZTp2b2lkIDB9KSxLZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6c2coZSxyKSxvPWpjKGUsciksS2UoImludmFsaWQiLGUpO2JyZWFrO2RlZmF1bHQ6bz1yfUtjKG4sbykscz1vO2ZvcihhIGluIHMpaWYocy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGw9c1thXTthPT09InN0eWxlIj93bShlLGwpOmE9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhsPWw/bC5fX2h0bWw6dm9pZCAwLGwhPW51bGwmJnZtKGUsbCkpOmE9PT0iY2hpbGRyZW4iP3R5cGVvZiBsPT0ic3RyaW5nIj8obiE9PSJ0ZXh0YXJlYSJ8fGwhPT0iIikmJlNpKGUsbCk6dHlwZW9mIGw9PSJudW1iZXIiJiZTaShlLCIiK2wpOmEhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmYSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZhIT09ImF1dG9Gb2N1cyImJih4aS5oYXNPd25Qcm9wZXJ0eShhKT9sIT1udWxsJiZhPT09Im9uU2Nyb2xsIiYmS2UoInNjcm9sbCIsZSk6bCE9bnVsbCYmT3UoZSxhLGwsaSkpfXN3aXRjaChuKXtjYXNlImlucHV0Ijp6cyhlKSxpZyhlLHIsITEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOnpzKGUpLGxnKGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpyLnZhbHVlIT1udWxsJiZlLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK1pyKHIudmFsdWUpKTticmVhaztjYXNlInNlbGVjdCI6ZS5tdWx0aXBsZT0hIXIubXVsdGlwbGUsYT1yLnZhbHVlLGEhPW51bGw/bWEoZSwhIXIubXVsdGlwbGUsYSwhMSk6ci5kZWZhdWx0VmFsdWUhPW51bGwmJm1hKGUsISFyLm11bHRpcGxlLHIuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihlLm9uY2xpY2s9YmwpfXN3aXRjaChuKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOnI9ISFyLmF1dG9Gb2N1czticmVhayBlO2Nhc2UiaW1nIjpyPSEwO2JyZWFrIGU7ZGVmYXVsdDpyPSExfX1yJiYodC5mbGFnc3w9NCl9dC5yZWYhPT1udWxsJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfXJldHVybiBBdCh0KSxudWxsO2Nhc2UgNjppZihlJiZ0LnN0YXRlTm9kZSE9bnVsbClCdihlLHQsZS5tZW1vaXplZFByb3BzLHIpO2Vsc2V7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoTCgxNjYpKTtpZihuPVRvKFJpLmN1cnJlbnQpLFRvKG5yLmN1cnJlbnQpLEpzKHQpKXtpZihyPXQuc3RhdGVOb2RlLG49dC5tZW1vaXplZFByb3BzLHJbZXJdPXQsKGE9ci5ub2RlVmFsdWUhPT1uKSYmKGU9cm4sZSE9PW51bGwpKXN3aXRjaChlLnRhZyl7Y2FzZSAzOlFzKHIubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApO2JyZWFrO2Nhc2UgNTplLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJlFzKHIubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApfWEmJih0LmZsYWdzfD00KX1lbHNlIHI9KG4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShyKSxyW2VyXT10LHQuc3RhdGVOb2RlPXJ9cmV0dXJuIEF0KHQpLG51bGw7Y2FzZSAxMzppZihZZShYZSkscj10Lm1lbW9pemVkU3RhdGUsZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYocWUmJm5uIT09bnVsbCYmdC5tb2RlJjEmJiEodC5mbGFncyYxMjgpKWl2KCksRWEoKSx0LmZsYWdzfD05ODU2MCxhPSExO2Vsc2UgaWYoYT1Kcyh0KSxyIT09bnVsbCYmci5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoZT09PW51bGwpe2lmKCFhKXRocm93IEVycm9yKEwoMzE4KSk7aWYoYT10Lm1lbW9pemVkU3RhdGUsYT1hIT09bnVsbD9hLmRlaHlkcmF0ZWQ6bnVsbCwhYSl0aHJvdyBFcnJvcihMKDMxNykpO2FbZXJdPXR9ZWxzZSBFYSgpLCEodC5mbGFncyYxMjgpJiYodC5tZW1vaXplZFN0YXRlPW51bGwpLHQuZmxhZ3N8PTQ7QXQodCksYT0hMX1lbHNlIHpuIT09bnVsbCYmKEF1KHpuKSx6bj1udWxsKSxhPSEwO2lmKCFhKXJldHVybiB0LmZsYWdzJjY1NTM2P3Q6bnVsbH1yZXR1cm4gdC5mbGFncyYxMjg/KHQubGFuZXM9bix0KToocj1yIT09bnVsbCxyIT09KGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmciYmKHQuY2hpbGQuZmxhZ3N8PTgxOTIsdC5tb2RlJjEmJihlPT09bnVsbHx8WGUuY3VycmVudCYxP2Z0PT09MCYmKGZ0PTMpOmZwKCkpKSx0LnVwZGF0ZVF1ZXVlIT09bnVsbCYmKHQuZmxhZ3N8PTQpLEF0KHQpLG51bGwpO2Nhc2UgNDpyZXR1cm4gVGEoKSxidShlLHQpLGU9PT1udWxsJiZDaSh0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxBdCh0KSxudWxsO2Nhc2UgMTA6cmV0dXJuIFF1KHQudHlwZS5fY29udGV4dCksQXQodCksbnVsbDtjYXNlIDE3OnJldHVybiBRdCh0LnR5cGUpJiZrbCgpLEF0KHQpLG51bGw7Y2FzZSAxOTppZihZZShYZSksYT10Lm1lbW9pemVkU3RhdGUsYT09PW51bGwpcmV0dXJuIEF0KHQpLG51bGw7aWYocj0odC5mbGFncyYxMjgpIT09MCxpPWEucmVuZGVyaW5nLGk9PT1udWxsKWlmKHIpaWkoYSwhMSk7ZWxzZXtpZihmdCE9PTB8fGUhPT1udWxsJiZlLmZsYWdzJjEyOClmb3IoZT10LmNoaWxkO2UhPT1udWxsOyl7aWYoaT1BbChlKSxpIT09bnVsbCl7Zm9yKHQuZmxhZ3N8PTEyOCxpaShhLCExKSxyPWkudXBkYXRlUXVldWUsciE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPXIsdC5mbGFnc3w9NCksdC5zdWJ0cmVlRmxhZ3M9MCxyPW4sbj10LmNoaWxkO24hPT1udWxsOylhPW4sZT1yLGEuZmxhZ3MmPTE0NjgwMDY2LGk9YS5hbHRlcm5hdGUsaT09PW51bGw/KGEuY2hpbGRMYW5lcz0wLGEubGFuZXM9ZSxhLmNoaWxkPW51bGwsYS5zdWJ0cmVlRmxhZ3M9MCxhLm1lbW9pemVkUHJvcHM9bnVsbCxhLm1lbW9pemVkU3RhdGU9bnVsbCxhLnVwZGF0ZVF1ZXVlPW51bGwsYS5kZXBlbmRlbmNpZXM9bnVsbCxhLnN0YXRlTm9kZT1udWxsKTooYS5jaGlsZExhbmVzPWkuY2hpbGRMYW5lcyxhLmxhbmVzPWkubGFuZXMsYS5jaGlsZD1pLmNoaWxkLGEuc3VidHJlZUZsYWdzPTAsYS5kZWxldGlvbnM9bnVsbCxhLm1lbW9pemVkUHJvcHM9aS5tZW1vaXplZFByb3BzLGEubWVtb2l6ZWRTdGF0ZT1pLm1lbW9pemVkU3RhdGUsYS51cGRhdGVRdWV1ZT1pLnVwZGF0ZVF1ZXVlLGEudHlwZT1pLnR5cGUsZT1pLmRlcGVuZGVuY2llcyxhLmRlcGVuZGVuY2llcz1lPT09bnVsbD9udWxsOntsYW5lczplLmxhbmVzLGZpcnN0Q29udGV4dDplLmZpcnN0Q29udGV4dH0pLG49bi5zaWJsaW5nO3JldHVybiBHZShYZSxYZS5jdXJyZW50JjF8MiksdC5jaGlsZH1lPWUuc2libGluZ31hLnRhaWwhPT1udWxsJiZzdCgpPkFhJiYodC5mbGFnc3w9MTI4LHI9ITAsaWkoYSwhMSksdC5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFyKWlmKGU9QWwoaSksZSE9PW51bGwpe2lmKHQuZmxhZ3N8PTEyOCxyPSEwLG49ZS51cGRhdGVRdWV1ZSxuIT09bnVsbCYmKHQudXBkYXRlUXVldWU9bix0LmZsYWdzfD00KSxpaShhLCEwKSxhLnRhaWw9PT1udWxsJiZhLnRhaWxNb2RlPT09ImhpZGRlbiImJiFpLmFsdGVybmF0ZSYmIXFlKXJldHVybiBBdCh0KSxudWxsfWVsc2UgMipzdCgpLWEucmVuZGVyaW5nU3RhcnRUaW1lPkFhJiZuIT09MTA3Mzc0MTgyNCYmKHQuZmxhZ3N8PTEyOCxyPSEwLGlpKGEsITEpLHQubGFuZXM9NDE5NDMwNCk7YS5pc0JhY2t3YXJkcz8oaS5zaWJsaW5nPXQuY2hpbGQsdC5jaGlsZD1pKToobj1hLmxhc3QsbiE9PW51bGw/bi5zaWJsaW5nPWk6dC5jaGlsZD1pLGEubGFzdD1pKX1yZXR1cm4gYS50YWlsIT09bnVsbD8odD1hLnRhaWwsYS5yZW5kZXJpbmc9dCxhLnRhaWw9dC5zaWJsaW5nLGEucmVuZGVyaW5nU3RhcnRUaW1lPXN0KCksdC5zaWJsaW5nPW51bGwsbj1YZS5jdXJyZW50LEdlKFhlLHI/biYxfDI6biYxKSx0KTooQXQodCksbnVsbCk7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBwcCgpLHI9dC5tZW1vaXplZFN0YXRlIT09bnVsbCxlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCE9PXImJih0LmZsYWdzfD04MTkyKSxyJiZ0Lm1vZGUmMT90biYxMDczNzQxODI0JiYoQXQodCksdC5zdWJ0cmVlRmxhZ3MmNiYmKHQuZmxhZ3N8PTgxOTIpKTpBdCh0KSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihMKDE1Nix0LnRhZykpfWZ1bmN0aW9uIHBTKGUsdCl7c3dpdGNoKFZ1KHQpLHQudGFnKXtjYXNlIDE6cmV0dXJuIFF0KHQudHlwZSkmJmtsKCksZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAzOnJldHVybiBUYSgpLFllKHF0KSxZZShDdCksdHAoKSxlPXQuZmxhZ3MsZSY2NTUzNiYmIShlJjEyOCk/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSA1OnJldHVybiBlcCh0KSxudWxsO2Nhc2UgMTM6aWYoWWUoWGUpLGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiZlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0LmFsdGVybmF0ZT09PW51bGwpdGhyb3cgRXJyb3IoTCgzNDApKTtFYSgpfXJldHVybiBlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDE5OnJldHVybiBZZShYZSksbnVsbDtjYXNlIDQ6cmV0dXJuIFRhKCksbnVsbDtjYXNlIDEwOnJldHVybiBRdSh0LnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBwcCgpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgZWw9ITEsX3Q9ITEsZlM9dHlwZW9mIFdlYWtTZXQ9PSJmdW5jdGlvbiI/V2Vha1NldDpTZXQsVj1udWxsO2Z1bmN0aW9uIGhhKGUsdCl7dmFyIG49ZS5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7cnQoZSx0LHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24ga3UoZSx0LG4pe3RyeXtuKCl9Y2F0Y2gocil7cnQoZSx0LHIpfX12YXIgWGc9ITE7ZnVuY3Rpb24gaFMoZSx0KXtpZihvdT12bCxlPUttKCksR3UoZSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXZhciBuPXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgbz1yLmFuY2hvck9mZnNldCxhPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxhLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBpPTAscz0tMSxsPS0xLGQ9MCxjPTAscD1lLHU9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBmO3AhPT1ufHxvIT09MCYmcC5ub2RlVHlwZSE9PTN8fChzPWkrbykscCE9PWF8fHIhPT0wJiZwLm5vZGVUeXBlIT09M3x8KGw9aStyKSxwLm5vZGVUeXBlPT09MyYmKGkrPXAubm9kZVZhbHVlLmxlbmd0aCksKGY9cC5maXJzdENoaWxkKSE9PW51bGw7KXU9cCxwPWY7Zm9yKDs7KXtpZihwPT09ZSlicmVhayB0O2lmKHU9PT1uJiYrK2Q9PT1vJiYocz1pKSx1PT09YSYmKytjPT09ciYmKGw9aSksKGY9cC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO3A9dSx1PXAucGFyZW50Tm9kZX1wPWZ9bj1zPT09LTF8fGw9PT0tMT9udWxsOntzdGFydDpzLGVuZDpsfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoYXU9e2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6bn0sdmw9ITEsVj10O1YhPT1udWxsOylpZih0PVYsZT10LmNoaWxkLCh0LnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJmUhPT1udWxsKWUucmV0dXJuPXQsVj1lO2Vsc2UgZm9yKDtWIT09bnVsbDspe3Q9Vjt0cnl7dmFyIHY9dC5hbHRlcm5hdGU7aWYodC5mbGFncyYxMDI0KXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYodiE9PW51bGwpe3ZhciB3PXYubWVtb2l6ZWRQcm9wcyxiPXYubWVtb2l6ZWRTdGF0ZSxnPXQuc3RhdGVOb2RlLG09Zy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSh0LmVsZW1lbnRUeXBlPT09dC50eXBlP3c6TG4odC50eXBlLHcpLGIpO2cuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9bX1icmVhaztjYXNlIDM6dmFyIHk9dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzt5Lm5vZGVUeXBlPT09MT95LnRleHRDb250ZW50PSIiOnkubm9kZVR5cGU9PT05JiZ5LmRvY3VtZW50RWxlbWVudCYmeS5yZW1vdmVDaGlsZCh5LmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKEwoMTYzKSl9fWNhdGNoKGgpe3J0KHQsdC5yZXR1cm4saCl9aWYoZT10LnNpYmxpbmcsZSE9PW51bGwpe2UucmV0dXJuPXQucmV0dXJuLFY9ZTticmVha31WPXQucmV0dXJufXJldHVybiB2PVhnLFhnPSExLHZ9ZnVuY3Rpb24gd2koZSx0LG4pe3ZhciByPXQudXBkYXRlUXVldWU7aWYocj1yIT09bnVsbD9yLmxhc3RFZmZlY3Q6bnVsbCxyIT09bnVsbCl7dmFyIG89cj1yLm5leHQ7ZG97aWYoKG8udGFnJmUpPT09ZSl7dmFyIGE9by5kZXN0cm95O28uZGVzdHJveT12b2lkIDAsYSE9PXZvaWQgMCYma3UodCxuLGEpfW89by5uZXh0fXdoaWxlKG8hPT1yKX19ZnVuY3Rpb24gR2woZSx0KXtpZih0PXQudXBkYXRlUXVldWUsdD10IT09bnVsbD90Lmxhc3RFZmZlY3Q6bnVsbCx0IT09bnVsbCl7dmFyIG49dD10Lm5leHQ7ZG97aWYoKG4udGFnJmUpPT09ZSl7dmFyIHI9bi5jcmVhdGU7bi5kZXN0cm95PXIoKX1uPW4ubmV4dH13aGlsZShuIT09dCl9fWZ1bmN0aW9uIHh1KGUpe3ZhciB0PWUucmVmO2lmKHQhPT1udWxsKXt2YXIgbj1lLnN0YXRlTm9kZTtzd2l0Y2goZS50YWcpe2Nhc2UgNTplPW47YnJlYWs7ZGVmYXVsdDplPW59dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0LmN1cnJlbnQ9ZX19ZnVuY3Rpb24gSHYoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7dCE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLEh2KHQpKSxlLmNoaWxkPW51bGwsZS5kZWxldGlvbnM9bnVsbCxlLnNpYmxpbmc9bnVsbCxlLnRhZz09PTUmJih0PWUuc3RhdGVOb2RlLHQhPT1udWxsJiYoZGVsZXRlIHRbZXJdLGRlbGV0ZSB0W0lpXSxkZWxldGUgdFtsdV0sZGVsZXRlIHRbUTFdLGRlbGV0ZSB0W0oxXSkpLGUuc3RhdGVOb2RlPW51bGwsZS5yZXR1cm49bnVsbCxlLmRlcGVuZGVuY2llcz1udWxsLGUubWVtb2l6ZWRQcm9wcz1udWxsLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUucGVuZGluZ1Byb3BzPW51bGwsZS5zdGF0ZU5vZGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gR3YoZSl7cmV0dXJuIGUudGFnPT09NXx8ZS50YWc9PT0zfHxlLnRhZz09PTR9ZnVuY3Rpb24gWmcoZSl7ZTpmb3IoOzspe2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8R3YoZS5yZXR1cm4pKXJldHVybiBudWxsO2U9ZS5yZXR1cm59Zm9yKGUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmc7ZS50YWchPT01JiZlLnRhZyE9PTYmJmUudGFnIT09MTg7KXtpZihlLmZsYWdzJjJ8fGUuY2hpbGQ9PT1udWxsfHxlLnRhZz09PTQpY29udGludWUgZTtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZH1pZighKGUuZmxhZ3MmMikpcmV0dXJuIGUuc3RhdGVOb2RlfX1mdW5jdGlvbiBTdShlLHQsbil7dmFyIHI9ZS50YWc7aWYocj09PTV8fHI9PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLm5vZGVUeXBlPT09OD9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdCk6bi5pbnNlcnRCZWZvcmUoZSx0KToobi5ub2RlVHlwZT09PTg/KHQ9bi5wYXJlbnROb2RlLHQuaW5zZXJ0QmVmb3JlKGUsbikpOih0PW4sdC5hcHBlbmRDaGlsZChlKSksbj1uLl9yZWFjdFJvb3RDb250YWluZXIsbiE9bnVsbHx8dC5vbmNsaWNrIT09bnVsbHx8KHQub25jbGljaz1ibCkpO2Vsc2UgaWYociE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcihTdShlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KVN1KGUsdCxuKSxlPWUuc2libGluZ31mdW5jdGlvbiBFdShlLHQsbil7dmFyIHI9ZS50YWc7aWYocj09PTV8fHI9PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLmluc2VydEJlZm9yZShlLHQpOm4uYXBwZW5kQ2hpbGQoZSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKEV1KGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspRXUoZSx0LG4pLGU9ZS5zaWJsaW5nfXZhciBrdD1udWxsLFVuPSExO2Z1bmN0aW9uIHpyKGUsdCxuKXtmb3Iobj1uLmNoaWxkO24hPT1udWxsOylqdihlLHQsbiksbj1uLnNpYmxpbmd9ZnVuY3Rpb24ganYoZSx0LG4pe2lmKHRyJiZ0eXBlb2YgdHIub25Db21taXRGaWJlclVubW91bnQ9PSJmdW5jdGlvbiIpdHJ5e3RyLm9uQ29tbWl0RmliZXJVbm1vdW50KExsLG4pfWNhdGNoe31zd2l0Y2gobi50YWcpe2Nhc2UgNTpfdHx8aGEobix0KTtjYXNlIDY6dmFyIHI9a3Qsbz1VbjtrdD1udWxsLHpyKGUsdCxuKSxrdD1yLFVuPW8sa3QhPT1udWxsJiYoVW4/KGU9a3Qsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik6ZS5yZW1vdmVDaGlsZChuKSk6a3QucmVtb3ZlQ2hpbGQobi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Omt0IT09bnVsbCYmKFVuPyhlPWt0LG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/RGMoZS5wYXJlbnROb2RlLG4pOmUubm9kZVR5cGU9PT0xJiZEYyhlLG4pLERpKGUpKTpEYyhrdCxuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpyPWt0LG89VW4sa3Q9bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxVbj0hMCx6cihlLHQsbiksa3Q9cixVbj1vO2JyZWFrO2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZighX3QmJihyPW4udXBkYXRlUXVldWUsciE9PW51bGwmJihyPXIubGFzdEVmZmVjdCxyIT09bnVsbCkpKXtvPXI9ci5uZXh0O2Rve3ZhciBhPW8saT1hLmRlc3Ryb3k7YT1hLnRhZyxpIT09dm9pZCAwJiYoYSYyfHxhJjQpJiZrdShuLHQsaSksbz1vLm5leHR9d2hpbGUobyE9PXIpfXpyKGUsdCxuKTticmVhaztjYXNlIDE6aWYoIV90JiYoaGEobix0KSxyPW4uc3RhdGVOb2RlLHR5cGVvZiByLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKSl0cnl7ci5wcm9wcz1uLm1lbW9pemVkUHJvcHMsci5zdGF0ZT1uLm1lbW9pemVkU3RhdGUsci5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHMpe3J0KG4sdCxzKX16cihlLHQsbik7YnJlYWs7Y2FzZSAyMTp6cihlLHQsbik7YnJlYWs7Y2FzZSAyMjpuLm1vZGUmMT8oX3Q9KHI9X3QpfHxuLm1lbW9pemVkU3RhdGUhPT1udWxsLHpyKGUsdCxuKSxfdD1yKTp6cihlLHQsbik7YnJlYWs7ZGVmYXVsdDp6cihlLHQsbil9fWZ1bmN0aW9uIGVtKGUpe3ZhciB0PWUudXBkYXRlUXVldWU7aWYodCE9PW51bGwpe2UudXBkYXRlUXVldWU9bnVsbDt2YXIgbj1lLnN0YXRlTm9kZTtuPT09bnVsbCYmKG49ZS5zdGF0ZU5vZGU9bmV3IGZTKSx0LmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89U1MuYmluZChudWxsLGUscik7bi5oYXMocil8fChuLmFkZChyKSxyLnRoZW4obyxvKSl9KX19ZnVuY3Rpb24gUG4oZSx0KXt2YXIgbj10LmRlbGV0aW9ucztpZihuIT09bnVsbClmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt0cnl7dmFyIGE9ZSxpPXQscz1pO2U6Zm9yKDtzIT09bnVsbDspe3N3aXRjaChzLnRhZyl7Y2FzZSA1Omt0PXMuc3RhdGVOb2RlLFVuPSExO2JyZWFrIGU7Y2FzZSAzOmt0PXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sVW49ITA7YnJlYWsgZTtjYXNlIDQ6a3Q9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxVbj0hMDticmVhayBlfXM9cy5yZXR1cm59aWYoa3Q9PT1udWxsKXRocm93IEVycm9yKEwoMTYwKSk7anYoYSxpLG8pLGt0PW51bGwsVW49ITE7dmFyIGw9by5hbHRlcm5hdGU7bCE9PW51bGwmJihsLnJldHVybj1udWxsKSxvLnJldHVybj1udWxsfWNhdGNoKGQpe3J0KG8sdCxkKX19aWYodC5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspVnYodCxlKSx0PXQuc2libGluZ31mdW5jdGlvbiBWdihlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlLHI9ZS5mbGFncztzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZihQbih0LGUpLFhuKGUpLHImNCl7dHJ5e3dpKDMsZSxlLnJldHVybiksR2woMyxlKX1jYXRjaCh3KXtydChlLGUucmV0dXJuLHcpfXRyeXt3aSg1LGUsZS5yZXR1cm4pfWNhdGNoKHcpe3J0KGUsZS5yZXR1cm4sdyl9fWJyZWFrO2Nhc2UgMTpQbih0LGUpLFhuKGUpLHImNTEyJiZuIT09bnVsbCYmaGEobixuLnJldHVybik7YnJlYWs7Y2FzZSA1OmlmKFBuKHQsZSksWG4oZSksciY1MTImJm4hPT1udWxsJiZoYShuLG4ucmV0dXJuKSxlLmZsYWdzJjMyKXt2YXIgbz1lLnN0YXRlTm9kZTt0cnl7U2kobywiIil9Y2F0Y2godyl7cnQoZSxlLnJldHVybix3KX19aWYociY0JiYobz1lLnN0YXRlTm9kZSxvIT1udWxsKSl7dmFyIGE9ZS5tZW1vaXplZFByb3BzLGk9biE9PW51bGw/bi5tZW1vaXplZFByb3BzOmEscz1lLnR5cGUsbD1lLnVwZGF0ZVF1ZXVlO2lmKGUudXBkYXRlUXVldWU9bnVsbCxsIT09bnVsbCl0cnl7cz09PSJpbnB1dCImJmEudHlwZT09PSJyYWRpbyImJmEubmFtZSE9bnVsbCYmaG0obyxhKSxZYyhzLGkpO3ZhciBkPVljKHMsYSk7Zm9yKGk9MDtpPGwubGVuZ3RoO2krPTIpe3ZhciBjPWxbaV0scD1sW2krMV07Yz09PSJzdHlsZSI/d20obyxwKTpjPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj92bShvLHApOmM9PT0iY2hpbGRyZW4iP1NpKG8scCk6T3UobyxjLHAsZCl9c3dpdGNoKHMpe2Nhc2UiaW5wdXQiOkhjKG8sYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6Z20obyxhKTticmVhaztjYXNlInNlbGVjdCI6dmFyIHU9by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO28uX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIWEubXVsdGlwbGU7dmFyIGY9YS52YWx1ZTtmIT1udWxsP21hKG8sISFhLm11bHRpcGxlLGYsITEpOnUhPT0hIWEubXVsdGlwbGUmJihhLmRlZmF1bHRWYWx1ZSE9bnVsbD9tYShvLCEhYS5tdWx0aXBsZSxhLmRlZmF1bHRWYWx1ZSwhMCk6bWEobywhIWEubXVsdGlwbGUsYS5tdWx0aXBsZT9bXToiIiwhMSkpfW9bSWldPWF9Y2F0Y2godyl7cnQoZSxlLnJldHVybix3KX19YnJlYWs7Y2FzZSA2OmlmKFBuKHQsZSksWG4oZSksciY0KXtpZihlLnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoTCgxNjIpKTtvPWUuc3RhdGVOb2RlLGE9ZS5tZW1vaXplZFByb3BzO3RyeXtvLm5vZGVWYWx1ZT1hfWNhdGNoKHcpe3J0KGUsZS5yZXR1cm4sdyl9fWJyZWFrO2Nhc2UgMzppZihQbih0LGUpLFhuKGUpLHImNCYmbiE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e0RpKHQuY29udGFpbmVySW5mbyl9Y2F0Y2godyl7cnQoZSxlLnJldHVybix3KX1icmVhaztjYXNlIDQ6UG4odCxlKSxYbihlKTticmVhaztjYXNlIDEzOlBuKHQsZSksWG4oZSksbz1lLmNoaWxkLG8uZmxhZ3MmODE5MiYmKGE9by5tZW1vaXplZFN0YXRlIT09bnVsbCxvLnN0YXRlTm9kZS5pc0hpZGRlbj1hLCFhfHxvLmFsdGVybmF0ZSE9PW51bGwmJm8uYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUhPT1udWxsfHwoY3A9c3QoKSkpLHImNCYmZW0oZSk7YnJlYWs7Y2FzZSAyMjppZihjPW4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUhPT1udWxsLGUubW9kZSYxPyhfdD0oZD1fdCl8fGMsUG4odCxlKSxfdD1kKTpQbih0LGUpLFhuKGUpLHImODE5Mil7aWYoZD1lLm1lbW9pemVkU3RhdGUhPT1udWxsLChlLnN0YXRlTm9kZS5pc0hpZGRlbj1kKSYmIWMmJmUubW9kZSYxKWZvcihWPWUsYz1lLmNoaWxkO2MhPT1udWxsOyl7Zm9yKHA9Vj1jO1YhPT1udWxsOyl7c3dpdGNoKHU9VixmPXUuY2hpbGQsdS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTp3aSg0LHUsdS5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpoYSh1LHUucmV0dXJuKTt2YXIgdj11LnN0YXRlTm9kZTtpZih0eXBlb2Ygdi5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj11LG49dS5yZXR1cm47dHJ5e3Q9cix2LnByb3BzPXQubWVtb2l6ZWRQcm9wcyx2LnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSx2LmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2godyl7cnQocixuLHcpfX1icmVhaztjYXNlIDU6aGEodSx1LnJldHVybik7YnJlYWs7Y2FzZSAyMjppZih1Lm1lbW9pemVkU3RhdGUhPT1udWxsKXtubShwKTtjb250aW51ZX19ZiE9PW51bGw/KGYucmV0dXJuPXUsVj1mKTpubShwKX1jPWMuc2libGluZ31lOmZvcihjPW51bGwscD1lOzspe2lmKHAudGFnPT09NSl7aWYoYz09PW51bGwpe2M9cDt0cnl7bz1wLnN0YXRlTm9kZSxkPyhhPW8uc3R5bGUsdHlwZW9mIGEuc2V0UHJvcGVydHk9PSJmdW5jdGlvbiI/YS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsIm5vbmUiLCJpbXBvcnRhbnQiKTphLmRpc3BsYXk9Im5vbmUiKToocz1wLnN0YXRlTm9kZSxsPXAubWVtb2l6ZWRQcm9wcy5zdHlsZSxpPWwhPW51bGwmJmwuaGFzT3duUHJvcGVydHkoImRpc3BsYXkiKT9sLmRpc3BsYXk6bnVsbCxzLnN0eWxlLmRpc3BsYXk9eW0oImRpc3BsYXkiLGkpKX1jYXRjaCh3KXtydChlLGUucmV0dXJuLHcpfX19ZWxzZSBpZihwLnRhZz09PTYpe2lmKGM9PT1udWxsKXRyeXtwLnN0YXRlTm9kZS5ub2RlVmFsdWU9ZD8iIjpwLm1lbW9pemVkUHJvcHN9Y2F0Y2godyl7cnQoZSxlLnJldHVybix3KX19ZWxzZSBpZigocC50YWchPT0yMiYmcC50YWchPT0yM3x8cC5tZW1vaXplZFN0YXRlPT09bnVsbHx8cD09PWUpJiZwLmNoaWxkIT09bnVsbCl7cC5jaGlsZC5yZXR1cm49cCxwPXAuY2hpbGQ7Y29udGludWV9aWYocD09PWUpYnJlYWsgZTtmb3IoO3Auc2libGluZz09PW51bGw7KXtpZihwLnJldHVybj09PW51bGx8fHAucmV0dXJuPT09ZSlicmVhayBlO2M9PT1wJiYoYz1udWxsKSxwPXAucmV0dXJufWM9PT1wJiYoYz1udWxsKSxwLnNpYmxpbmcucmV0dXJuPXAucmV0dXJuLHA9cC5zaWJsaW5nfX1icmVhaztjYXNlIDE5OlBuKHQsZSksWG4oZSksciY0JiZlbShlKTticmVhaztjYXNlIDIxOmJyZWFrO2RlZmF1bHQ6UG4odCxlKSxYbihlKX19ZnVuY3Rpb24gWG4oZSl7dmFyIHQ9ZS5mbGFncztpZih0JjIpe3RyeXtlOntmb3IodmFyIG49ZS5yZXR1cm47biE9PW51bGw7KXtpZihHdihuKSl7dmFyIHI9bjticmVhayBlfW49bi5yZXR1cm59dGhyb3cgRXJyb3IoTCgxNjApKX1zd2l0Y2goci50YWcpe2Nhc2UgNTp2YXIgbz1yLnN0YXRlTm9kZTtyLmZsYWdzJjMyJiYoU2kobywiIiksci5mbGFncyY9LTMzKTt2YXIgYT1aZyhlKTtFdShlLGEsbyk7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgaT1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLHM9WmcoZSk7U3UoZSxzLGkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoTCgxNjEpKX19Y2F0Y2gobCl7cnQoZSxlLnJldHVybixsKX1lLmZsYWdzJj0tM310JjQwOTYmJihlLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gZ1MoZSx0LG4pe1Y9ZSxLdihlLHQsbil9ZnVuY3Rpb24gS3YoZSx0LG4pe2Zvcih2YXIgcj0oZS5tb2RlJjEpIT09MDtWIT09bnVsbDspe3ZhciBvPVYsYT1vLmNoaWxkO2lmKG8udGFnPT09MjImJnIpe3ZhciBpPW8ubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fGVsO2lmKCFpKXt2YXIgcz1vLmFsdGVybmF0ZSxsPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxfdDtzPWVsO3ZhciBkPV90O2lmKGVsPWksKF90PWwpJiYhZClmb3IoVj1vO1YhPT1udWxsOylpPVYsbD1pLmNoaWxkLGkudGFnPT09MjImJmkubWVtb2l6ZWRTdGF0ZSE9PW51bGw/cm0obyk6bCE9PW51bGw/KGwucmV0dXJuPWksVj1sKTpybShvKTtmb3IoO2EhPT1udWxsOylWPWEsS3YoYSx0LG4pLGE9YS5zaWJsaW5nO1Y9byxlbD1zLF90PWR9dG0oZSx0LG4pfWVsc2Ugby5zdWJ0cmVlRmxhZ3MmODc3MiYmYSE9PW51bGw/KGEucmV0dXJuPW8sVj1hKTp0bShlLHQsbil9fWZ1bmN0aW9uIHRtKGUpe2Zvcig7ViE9PW51bGw7KXt2YXIgdD1WO2lmKHQuZmxhZ3MmODc3Mil7dmFyIG49dC5hbHRlcm5hdGU7dHJ5e2lmKHQuZmxhZ3MmODc3Milzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6X3R8fEdsKDUsdCk7YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHQuZmxhZ3MmNCYmIV90KWlmKG49PT1udWxsKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBvPXQuZWxlbWVudFR5cGU9PT10LnR5cGU/bi5tZW1vaXplZFByb3BzOkxuKHQudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKG8sbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBhPXQudXBkYXRlUXVldWU7YSE9PW51bGwmJkZnKHQsYSxyKTticmVhaztjYXNlIDM6dmFyIGk9dC51cGRhdGVRdWV1ZTtpZihpIT09bnVsbCl7aWYobj1udWxsLHQuY2hpbGQhPT1udWxsKXN3aXRjaCh0LmNoaWxkLnRhZyl7Y2FzZSA1Om49dC5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49dC5jaGlsZC5zdGF0ZU5vZGV9RmcodCxpLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz10LnN0YXRlTm9kZTtpZihuPT09bnVsbCYmdC5mbGFncyY0KXtuPXM7dmFyIGw9dC5tZW1vaXplZFByb3BzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6bC5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6bC5zcmMmJihuLnNyYz1sLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKHQubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciBkPXQuYWx0ZXJuYXRlO2lmKGQhPT1udWxsKXt2YXIgYz1kLm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciBwPWMuZGVoeWRyYXRlZDtwIT09bnVsbCYmRGkocCl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKEwoMTYzKSl9X3R8fHQuZmxhZ3MmNTEyJiZ4dSh0KX1jYXRjaCh1KXtydCh0LHQucmV0dXJuLHUpfX1pZih0PT09ZSl7Vj1udWxsO2JyZWFrfWlmKG49dC5zaWJsaW5nLG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixWPW47YnJlYWt9Vj10LnJldHVybn19ZnVuY3Rpb24gbm0oZSl7Zm9yKDtWIT09bnVsbDspe3ZhciB0PVY7aWYodD09PWUpe1Y9bnVsbDticmVha312YXIgbj10LnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPXQucmV0dXJuLFY9bjticmVha31WPXQucmV0dXJufX1mdW5jdGlvbiBybShlKXtmb3IoO1YhPT1udWxsOyl7dmFyIHQ9Vjt0cnl7c3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBuPXQucmV0dXJuO3RyeXtHbCg0LHQpfWNhdGNoKGwpe3J0KHQsbixsKX1icmVhaztjYXNlIDE6dmFyIHI9dC5zdGF0ZU5vZGU7aWYodHlwZW9mIHIuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiIpe3ZhciBvPXQucmV0dXJuO3RyeXtyLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2gobCl7cnQodCxvLGwpfX12YXIgYT10LnJldHVybjt0cnl7eHUodCl9Y2F0Y2gobCl7cnQodCxhLGwpfWJyZWFrO2Nhc2UgNTp2YXIgaT10LnJldHVybjt0cnl7eHUodCl9Y2F0Y2gobCl7cnQodCxpLGwpfX19Y2F0Y2gobCl7cnQodCx0LnJldHVybixsKX1pZih0PT09ZSl7Vj1udWxsO2JyZWFrfXZhciBzPXQuc2libGluZztpZihzIT09bnVsbCl7cy5yZXR1cm49dC5yZXR1cm4sVj1zO2JyZWFrfVY9dC5yZXR1cm59fXZhciBtUz1NYXRoLmNlaWwsT2w9U3IuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixscD1Tci5SZWFjdEN1cnJlbnRPd25lcix3bj1Tci5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxUZT0wLHZ0PW51bGwsY3Q9bnVsbCx4dD0wLHRuPTAsZ2E9bm8oMCksZnQ9MCx6aT1udWxsLElvPTAsamw9MCxkcD0wLGJpPW51bGwsS3Q9bnVsbCxjcD0wLEFhPTEvMCxocj1udWxsLElsPSExLE51PW51bGwsUXI9bnVsbCx0bD0hMSxHcj1udWxsLE1sPTAsa2k9MCxUdT1udWxsLGRsPS0xLGNsPTA7ZnVuY3Rpb24gVXQoKXtyZXR1cm4gVGUmNj9zdCgpOmRsIT09LTE/ZGw6ZGw9c3QoKX1mdW5jdGlvbiBKcihlKXtyZXR1cm4gZS5tb2RlJjE/VGUmMiYmeHQhPT0wP3h0Ji14dDpaMS50cmFuc2l0aW9uIT09bnVsbD8oY2w9PT0wJiYoY2w9T20oKSksY2wpOihlPVVlLGUhPT0wfHwoZT13aW5kb3cuZXZlbnQsZT1lPT09dm9pZCAwPzE2OnptKGUudHlwZSkpLGUpOjF9ZnVuY3Rpb24gJG4oZSx0LG4scil7aWYoNTA8a2kpdGhyb3cga2k9MCxUdT1udWxsLEVycm9yKEwoMTg1KSk7RmkoZSxuLHIpLCghKFRlJjIpfHxlIT09dnQpJiYoZT09PXZ0JiYoIShUZSYyKSYmKGpsfD1uKSxmdD09PTQmJkJyKGUseHQpKSxKdChlLHIpLG49PT0xJiZUZT09PTAmJiEodC5tb2RlJjEpJiYoQWE9c3QoKSs1MDAsV2wmJnJvKCkpKX1mdW5jdGlvbiBKdChlLHQpe3ZhciBuPWUuY2FsbGJhY2tOb2RlO3QxKGUsdCk7dmFyIHI9bWwoZSxlPT09dnQ/eHQ6MCk7aWYocj09PTApbiE9PW51bGwmJnVnKG4pLGUuY2FsbGJhY2tOb2RlPW51bGwsZS5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZih0PXImLXIsZS5jYWxsYmFja1ByaW9yaXR5IT09dCl7aWYobiE9bnVsbCYmdWcobiksdD09PTEpZS50YWc9PT0wP1gxKG9tLmJpbmQobnVsbCxlKSk6cnYob20uYmluZChudWxsLGUpKSxZMShmdW5jdGlvbigpeyEoVGUmNikmJnJvKCl9KSxuPW51bGw7ZWxzZXtzd2l0Y2goSW0ocikpe2Nhc2UgMTpuPUx1O2JyZWFrO2Nhc2UgNDpuPV9tO2JyZWFrO2Nhc2UgMTY6bj1nbDticmVhaztjYXNlIDUzNjg3MDkxMjpuPUNtO2JyZWFrO2RlZmF1bHQ6bj1nbH1uPXR5KG4sWXYuYmluZChudWxsLGUpKX1lLmNhbGxiYWNrUHJpb3JpdHk9dCxlLmNhbGxiYWNrTm9kZT1ufX1mdW5jdGlvbiBZdihlLHQpe2lmKGRsPS0xLGNsPTAsVGUmNil0aHJvdyBFcnJvcihMKDMyNykpO3ZhciBuPWUuY2FsbGJhY2tOb2RlO2lmKGthKCkmJmUuY2FsbGJhY2tOb2RlIT09bilyZXR1cm4gbnVsbDt2YXIgcj1tbChlLGU9PT12dD94dDowKTtpZihyPT09MClyZXR1cm4gbnVsbDtpZihyJjMwfHxyJmUuZXhwaXJlZExhbmVzfHx0KXQ9UmwoZSxyKTtlbHNle3Q9cjt2YXIgbz1UZTtUZXw9Mjt2YXIgYT1RdigpOyh2dCE9PWV8fHh0IT09dCkmJihocj1udWxsLEFhPXN0KCkrNTAwLERvKGUsdCkpO2RvIHRyeXt3UygpO2JyZWFrfWNhdGNoKHMpe3F2KGUscyl9d2hpbGUoITApO3F1KCksT2wuY3VycmVudD1hLFRlPW8sY3QhPT1udWxsP3Q9MDoodnQ9bnVsbCx4dD0wLHQ9ZnQpfWlmKHQhPT0wKXtpZih0PT09MiYmKG89WmMoZSksbyE9PTAmJihyPW8sdD1EdShlLG8pKSksdD09PTEpdGhyb3cgbj16aSxEbyhlLDApLEJyKGUsciksSnQoZSxzdCgpKSxuO2lmKHQ9PT02KUJyKGUscik7ZWxzZXtpZihvPWUuY3VycmVudC5hbHRlcm5hdGUsIShyJjMwKSYmIXZTKG8pJiYodD1SbChlLHIpLHQ9PT0yJiYoYT1aYyhlKSxhIT09MCYmKHI9YSx0PUR1KGUsYSkpKSx0PT09MSkpdGhyb3cgbj16aSxEbyhlLDApLEJyKGUsciksSnQoZSxzdCgpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1vLGUuZmluaXNoZWRMYW5lcz1yLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoTCgzNDUpKTtjYXNlIDI6U28oZSxLdCxocik7YnJlYWs7Y2FzZSAzOmlmKEJyKGUsciksKHImMTMwMDIzNDI0KT09PXImJih0PWNwKzUwMC1zdCgpLDEwPHQpKXtpZihtbChlLDApIT09MClicmVhaztpZihvPWUuc3VzcGVuZGVkTGFuZXMsKG8mcikhPT1yKXtVdCgpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbzticmVha31lLnRpbWVvdXRIYW5kbGU9c3UoU28uYmluZChudWxsLGUsS3QsaHIpLHQpO2JyZWFrfVNvKGUsS3QsaHIpO2JyZWFrO2Nhc2UgNDppZihCcihlLHIpLChyJjQxOTQyNDApPT09cilicmVhaztmb3IodD1lLmV2ZW50VGltZXMsbz0tMTswPHI7KXt2YXIgaT0zMS1GbihyKTthPTE8PGksaT10W2ldLGk+byYmKG89aSksciY9fmF9aWYocj1vLHI9c3QoKS1yLHI9KDEyMD5yPzEyMDo0ODA+cj80ODA6MTA4MD5yPzEwODA6MTkyMD5yPzE5MjA6M2UzPnI/M2UzOjQzMjA+cj80MzIwOjE5NjAqbVMoci8xOTYwKSktciwxMDxyKXtlLnRpbWVvdXRIYW5kbGU9c3UoU28uYmluZChudWxsLGUsS3QsaHIpLHIpO2JyZWFrfVNvKGUsS3QsaHIpO2JyZWFrO2Nhc2UgNTpTbyhlLEt0LGhyKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKEwoMzI5KSl9fX1yZXR1cm4gSnQoZSxzdCgpKSxlLmNhbGxiYWNrTm9kZT09PW4/WXYuYmluZChudWxsLGUpOm51bGx9ZnVuY3Rpb24gRHUoZSx0KXt2YXIgbj1iaTtyZXR1cm4gZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYoRG8oZSx0KS5mbGFnc3w9MjU2KSxlPVJsKGUsdCksZSE9PTImJih0PUt0LEt0PW4sdCE9PW51bGwmJkF1KHQpKSxlfWZ1bmN0aW9uIEF1KGUpe0t0PT09bnVsbD9LdD1lOkt0LnB1c2guYXBwbHkoS3QsZSl9ZnVuY3Rpb24gdlMoZSl7Zm9yKHZhciB0PWU7Oyl7aWYodC5mbGFncyYxNjM4NCl7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuIT09bnVsbCYmKG49bi5zdG9yZXMsbiE9PW51bGwpKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLGE9by5nZXRTbmFwc2hvdDtvPW8udmFsdWU7dHJ5e2lmKCFXbihhKCksbykpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJm4hPT1udWxsKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBCcihlLHQpe2Zvcih0Jj1+ZHAsdCY9fmpsLGUuc3VzcGVuZGVkTGFuZXN8PXQsZS5waW5nZWRMYW5lcyY9fnQsZT1lLmV4cGlyYXRpb25UaW1lczswPHQ7KXt2YXIgbj0zMS1Gbih0KSxyPTE8PG47ZVtuXT0tMSx0Jj1+cn19ZnVuY3Rpb24gb20oZSl7aWYoVGUmNil0aHJvdyBFcnJvcihMKDMyNykpO2thKCk7dmFyIHQ9bWwoZSwwKTtpZighKHQmMSkpcmV0dXJuIEp0KGUsc3QoKSksbnVsbDt2YXIgbj1SbChlLHQpO2lmKGUudGFnIT09MCYmbj09PTIpe3ZhciByPVpjKGUpO3IhPT0wJiYodD1yLG49RHUoZSxyKSl9aWYobj09PTEpdGhyb3cgbj16aSxEbyhlLDApLEJyKGUsdCksSnQoZSxzdCgpKSxuO2lmKG49PT02KXRocm93IEVycm9yKEwoMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsU28oZSxLdCxociksSnQoZSxzdCgpKSxudWxsfWZ1bmN0aW9uIHVwKGUsdCl7dmFyIG49VGU7VGV8PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7VGU9bixUZT09PTAmJihBYT1zdCgpKzUwMCxXbCYmcm8oKSl9fWZ1bmN0aW9uIE1vKGUpe0dyIT09bnVsbCYmR3IudGFnPT09MCYmIShUZSY2KSYma2EoKTt2YXIgdD1UZTtUZXw9MTt2YXIgbj13bi50cmFuc2l0aW9uLHI9VWU7dHJ5e2lmKHduLnRyYW5zaXRpb249bnVsbCxVZT0xLGUpcmV0dXJuIGUoKX1maW5hbGx5e1VlPXIsd24udHJhbnNpdGlvbj1uLFRlPXQsIShUZSY2KSYmcm8oKX19ZnVuY3Rpb24gcHAoKXt0bj1nYS5jdXJyZW50LFllKGdhKX1mdW5jdGlvbiBEbyhlLHQpe2UuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTA7dmFyIG49ZS50aW1lb3V0SGFuZGxlO2lmKG4hPT0tMSYmKGUudGltZW91dEhhbmRsZT0tMSxLMShuKSksY3QhPT1udWxsKWZvcihuPWN0LnJldHVybjtuIT09bnVsbDspe3ZhciByPW47c3dpdGNoKFZ1KHIpLHIudGFnKXtjYXNlIDE6cj1yLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMsciE9bnVsbCYma2woKTticmVhaztjYXNlIDM6VGEoKSxZZShxdCksWWUoQ3QpLHRwKCk7YnJlYWs7Y2FzZSA1OmVwKHIpO2JyZWFrO2Nhc2UgNDpUYSgpO2JyZWFrO2Nhc2UgMTM6WWUoWGUpO2JyZWFrO2Nhc2UgMTk6WWUoWGUpO2JyZWFrO2Nhc2UgMTA6UXUoci50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6cHAoKX1uPW4ucmV0dXJufWlmKHZ0PWUsY3Q9ZT1YcihlLmN1cnJlbnQsbnVsbCkseHQ9dG49dCxmdD0wLHppPW51bGwsZHA9amw9SW89MCxLdD1iaT1udWxsLE5vIT09bnVsbCl7Zm9yKHQ9MDt0PE5vLmxlbmd0aDt0KyspaWYobj1Ob1t0XSxyPW4uaW50ZXJsZWF2ZWQsciE9PW51bGwpe24uaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgbz1yLm5leHQsYT1uLnBlbmRpbmc7aWYoYSE9PW51bGwpe3ZhciBpPWEubmV4dDthLm5leHQ9byxyLm5leHQ9aX1uLnBlbmRpbmc9cn1Obz1udWxsfXJldHVybiBlfWZ1bmN0aW9uIHF2KGUsdCl7ZG97dmFyIG49Y3Q7dHJ5e2lmKHF1KCksaWwuY3VycmVudD1DbCxfbCl7Zm9yKHZhciByPVplLm1lbW9pemVkU3RhdGU7ciE9PW51bGw7KXt2YXIgbz1yLnF1ZXVlO28hPT1udWxsJiYoby5wZW5kaW5nPW51bGwpLHI9ci5uZXh0fV9sPSExfWlmKE9vPTAsbXQ9cHQ9WmU9bnVsbCx5aT0hMSxQaT0wLGxwLmN1cnJlbnQ9bnVsbCxuPT09bnVsbHx8bi5yZXR1cm49PT1udWxsKXtmdD0xLHppPXQsY3Q9bnVsbDticmVha31lOnt2YXIgYT1lLGk9bi5yZXR1cm4scz1uLGw9dDtpZih0PXh0LHMuZmxhZ3N8PTMyNzY4LGwhPT1udWxsJiZ0eXBlb2YgbD09Im9iamVjdCImJnR5cGVvZiBsLnRoZW49PSJmdW5jdGlvbiIpe3ZhciBkPWwsYz1zLHA9Yy50YWc7aWYoIShjLm1vZGUmMSkmJihwPT09MHx8cD09PTExfHxwPT09MTUpKXt2YXIgdT1jLmFsdGVybmF0ZTt1PyhjLnVwZGF0ZVF1ZXVlPXUudXBkYXRlUXVldWUsYy5tZW1vaXplZFN0YXRlPXUubWVtb2l6ZWRTdGF0ZSxjLmxhbmVzPXUubGFuZXMpOihjLnVwZGF0ZVF1ZXVlPW51bGwsYy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBmPWpnKGkpO2lmKGYhPT1udWxsKXtmLmZsYWdzJj0tMjU3LFZnKGYsaSxzLGEsdCksZi5tb2RlJjEmJkdnKGEsZCx0KSx0PWYsbD1kO3ZhciB2PXQudXBkYXRlUXVldWU7aWYodj09PW51bGwpe3ZhciB3PW5ldyBTZXQ7dy5hZGQobCksdC51cGRhdGVRdWV1ZT13fWVsc2Ugdi5hZGQobCk7YnJlYWsgZX1lbHNle2lmKCEodCYxKSl7R2coYSxkLHQpLGZwKCk7YnJlYWsgZX1sPUVycm9yKEwoNDI2KSl9fWVsc2UgaWYocWUmJnMubW9kZSYxKXt2YXIgYj1qZyhpKTtpZihiIT09bnVsbCl7IShiLmZsYWdzJjY1NTM2KSYmKGIuZmxhZ3N8PTI1NiksVmcoYixpLHMsYSx0KSxLdShEYShsLHMpKTticmVhayBlfX1hPWw9RGEobCxzKSxmdCE9PTQmJihmdD0yKSxiaT09PW51bGw/Ymk9W2FdOmJpLnB1c2goYSksYT1pO2Rve3N3aXRjaChhLnRhZyl7Y2FzZSAzOmEuZmxhZ3N8PTY1NTM2LHQmPS10LGEubGFuZXN8PXQ7dmFyIGc9SXYoYSxsLHQpO3pnKGEsZyk7YnJlYWsgZTtjYXNlIDE6cz1sO3ZhciBtPWEudHlwZSx5PWEuc3RhdGVOb2RlO2lmKCEoYS5mbGFncyYxMjgpJiYodHlwZW9mIG0uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx5IT09bnVsbCYmdHlwZW9mIHkuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihRcj09PW51bGx8fCFRci5oYXMoeSkpKSl7YS5mbGFnc3w9NjU1MzYsdCY9LXQsYS5sYW5lc3w9dDt2YXIgaD1NdihhLHMsdCk7emcoYSxoKTticmVhayBlfX1hPWEucmV0dXJufXdoaWxlKGEhPT1udWxsKX1YdihuKX1jYXRjaCh4KXt0PXgsY3Q9PT1uJiZuIT09bnVsbCYmKGN0PW49bi5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKCEwKX1mdW5jdGlvbiBRdigpe3ZhciBlPU9sLmN1cnJlbnQ7cmV0dXJuIE9sLmN1cnJlbnQ9Q2wsZT09PW51bGw/Q2w6ZX1mdW5jdGlvbiBmcCgpeyhmdD09PTB8fGZ0PT09M3x8ZnQ9PT0yKSYmKGZ0PTQpLHZ0PT09bnVsbHx8IShJbyYyNjg0MzU0NTUpJiYhKGpsJjI2ODQzNTQ1NSl8fEJyKHZ0LHh0KX1mdW5jdGlvbiBSbChlLHQpe3ZhciBuPVRlO1RlfD0yO3ZhciByPVF2KCk7KHZ0IT09ZXx8eHQhPT10KSYmKGhyPW51bGwsRG8oZSx0KSk7ZG8gdHJ5e3lTKCk7YnJlYWt9Y2F0Y2gobyl7cXYoZSxvKX13aGlsZSghMCk7aWYocXUoKSxUZT1uLE9sLmN1cnJlbnQ9cixjdCE9PW51bGwpdGhyb3cgRXJyb3IoTCgyNjEpKTtyZXR1cm4gdnQ9bnVsbCx4dD0wLGZ0fWZ1bmN0aW9uIHlTKCl7Zm9yKDtjdCE9PW51bGw7KUp2KGN0KX1mdW5jdGlvbiB3Uygpe2Zvcig7Y3QhPT1udWxsJiYhVngoKTspSnYoY3QpfWZ1bmN0aW9uIEp2KGUpe3ZhciB0PWV5KGUuYWx0ZXJuYXRlLGUsdG4pO2UubWVtb2l6ZWRQcm9wcz1lLnBlbmRpbmdQcm9wcyx0PT09bnVsbD9YdihlKTpjdD10LGxwLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBYdihlKXt2YXIgdD1lO2Rve3ZhciBuPXQuYWx0ZXJuYXRlO2lmKGU9dC5yZXR1cm4sdC5mbGFncyYzMjc2OCl7aWYobj1wUyhuLHQpLG4hPT1udWxsKXtuLmZsYWdzJj0zMjc2NyxjdD1uO3JldHVybn1pZihlIT09bnVsbCllLmZsYWdzfD0zMjc2OCxlLnN1YnRyZWVGbGFncz0wLGUuZGVsZXRpb25zPW51bGw7ZWxzZXtmdD02LGN0PW51bGw7cmV0dXJufX1lbHNlIGlmKG49dVMobix0LHRuKSxuIT09bnVsbCl7Y3Q9bjtyZXR1cm59aWYodD10LnNpYmxpbmcsdCE9PW51bGwpe2N0PXQ7cmV0dXJufWN0PXQ9ZX13aGlsZSh0IT09bnVsbCk7ZnQ9PT0wJiYoZnQ9NSl9ZnVuY3Rpb24gU28oZSx0LG4pe3ZhciByPVVlLG89d24udHJhbnNpdGlvbjt0cnl7d24udHJhbnNpdGlvbj1udWxsLFVlPTEsYlMoZSx0LG4scil9ZmluYWxseXt3bi50cmFuc2l0aW9uPW8sVWU9cn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBiUyhlLHQsbixyKXtkbyBrYSgpO3doaWxlKEdyIT09bnVsbCk7aWYoVGUmNil0aHJvdyBFcnJvcihMKDMyNykpO249ZS5maW5pc2hlZFdvcms7dmFyIG89ZS5maW5pc2hlZExhbmVzO2lmKG49PT1udWxsKXJldHVybiBudWxsO2lmKGUuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTAsbj09PWUuY3VycmVudCl0aHJvdyBFcnJvcihMKDE3NykpO2UuY2FsbGJhY2tOb2RlPW51bGwsZS5jYWxsYmFja1ByaW9yaXR5PTA7dmFyIGE9bi5sYW5lc3xuLmNoaWxkTGFuZXM7aWYobjEoZSxhKSxlPT09dnQmJihjdD12dD1udWxsLHh0PTApLCEobi5zdWJ0cmVlRmxhZ3MmMjA2NCkmJiEobi5mbGFncyYyMDY0KXx8dGx8fCh0bD0hMCx0eShnbCxmdW5jdGlvbigpe3JldHVybiBrYSgpLG51bGx9KSksYT0obi5mbGFncyYxNTk5MCkhPT0wLG4uc3VidHJlZUZsYWdzJjE1OTkwfHxhKXthPXduLnRyYW5zaXRpb24sd24udHJhbnNpdGlvbj1udWxsO3ZhciBpPVVlO1VlPTE7dmFyIHM9VGU7VGV8PTQsbHAuY3VycmVudD1udWxsLGhTKGUsbiksVnYobixlKSxCMShhdSksdmw9ISFvdSxhdT1vdT1udWxsLGUuY3VycmVudD1uLGdTKG4sZSxvKSxLeCgpLFRlPXMsVWU9aSx3bi50cmFuc2l0aW9uPWF9ZWxzZSBlLmN1cnJlbnQ9bjtpZih0bCYmKHRsPSExLEdyPWUsTWw9byksYT1lLnBlbmRpbmdMYW5lcyxhPT09MCYmKFFyPW51bGwpLFF4KG4uc3RhdGVOb2RlLHIpLEp0KGUsc3QoKSksdCE9PW51bGwpZm9yKHI9ZS5vblJlY292ZXJhYmxlRXJyb3Isbj0wO248dC5sZW5ndGg7bisrKW89dFtuXSxyKG8udmFsdWUse2NvbXBvbmVudFN0YWNrOm8uc3RhY2ssZGlnZXN0Om8uZGlnZXN0fSk7aWYoSWwpdGhyb3cgSWw9ITEsZT1OdSxOdT1udWxsLGU7cmV0dXJuIE1sJjEmJmUudGFnIT09MCYma2EoKSxhPWUucGVuZGluZ0xhbmVzLGEmMT9lPT09VHU/a2krKzooa2k9MCxUdT1lKTpraT0wLHJvKCksbnVsbH1mdW5jdGlvbiBrYSgpe2lmKEdyIT09bnVsbCl7dmFyIGU9SW0oTWwpLHQ9d24udHJhbnNpdGlvbixuPVVlO3RyeXtpZih3bi50cmFuc2l0aW9uPW51bGwsVWU9MTY+ZT8xNjplLEdyPT09bnVsbCl2YXIgcj0hMTtlbHNle2lmKGU9R3IsR3I9bnVsbCxNbD0wLFRlJjYpdGhyb3cgRXJyb3IoTCgzMzEpKTt2YXIgbz1UZTtmb3IoVGV8PTQsVj1lLmN1cnJlbnQ7ViE9PW51bGw7KXt2YXIgYT1WLGk9YS5jaGlsZDtpZihWLmZsYWdzJjE2KXt2YXIgcz1hLmRlbGV0aW9ucztpZihzIT09bnVsbCl7Zm9yKHZhciBsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciBkPXNbbF07Zm9yKFY9ZDtWIT09bnVsbDspe3ZhciBjPVY7c3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OndpKDgsYyxhKX12YXIgcD1jLmNoaWxkO2lmKHAhPT1udWxsKXAucmV0dXJuPWMsVj1wO2Vsc2UgZm9yKDtWIT09bnVsbDspe2M9Vjt2YXIgdT1jLnNpYmxpbmcsZj1jLnJldHVybjtpZihIdihjKSxjPT09ZCl7Vj1udWxsO2JyZWFrfWlmKHUhPT1udWxsKXt1LnJldHVybj1mLFY9dTticmVha31WPWZ9fX12YXIgdj1hLmFsdGVybmF0ZTtpZih2IT09bnVsbCl7dmFyIHc9di5jaGlsZDtpZih3IT09bnVsbCl7di5jaGlsZD1udWxsO2Rve3ZhciBiPXcuc2libGluZzt3LnNpYmxpbmc9bnVsbCx3PWJ9d2hpbGUodyE9PW51bGwpfX1WPWF9fWlmKGEuc3VidHJlZUZsYWdzJjIwNjQmJmkhPT1udWxsKWkucmV0dXJuPWEsVj1pO2Vsc2UgZTpmb3IoO1YhPT1udWxsOyl7aWYoYT1WLGEuZmxhZ3MmMjA0OClzd2l0Y2goYS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6d2koOSxhLGEucmV0dXJuKX12YXIgZz1hLnNpYmxpbmc7aWYoZyE9PW51bGwpe2cucmV0dXJuPWEucmV0dXJuLFY9ZzticmVhayBlfVY9YS5yZXR1cm59fXZhciBtPWUuY3VycmVudDtmb3IoVj1tO1YhPT1udWxsOyl7aT1WO3ZhciB5PWkuY2hpbGQ7aWYoaS5zdWJ0cmVlRmxhZ3MmMjA2NCYmeSE9PW51bGwpeS5yZXR1cm49aSxWPXk7ZWxzZSBlOmZvcihpPW07ViE9PW51bGw7KXtpZihzPVYscy5mbGFncyYyMDQ4KXRyeXtzd2l0Y2gocy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6R2woOSxzKX19Y2F0Y2goeCl7cnQocyxzLnJldHVybix4KX1pZihzPT09aSl7Vj1udWxsO2JyZWFrIGV9dmFyIGg9cy5zaWJsaW5nO2lmKGghPT1udWxsKXtoLnJldHVybj1zLnJldHVybixWPWg7YnJlYWsgZX1WPXMucmV0dXJufX1pZihUZT1vLHJvKCksdHImJnR5cGVvZiB0ci5vblBvc3RDb21taXRGaWJlclJvb3Q9PSJmdW5jdGlvbiIpdHJ5e3RyLm9uUG9zdENvbW1pdEZpYmVyUm9vdChMbCxlKX1jYXRjaHt9cj0hMH1yZXR1cm4gcn1maW5hbGx5e1VlPW4sd24udHJhbnNpdGlvbj10fX1yZXR1cm4hMX1mdW5jdGlvbiBhbShlLHQsbil7dD1EYShuLHQpLHQ9SXYoZSx0LDEpLGU9cXIoZSx0LDEpLHQ9VXQoKSxlIT09bnVsbCYmKEZpKGUsMSx0KSxKdChlLHQpKX1mdW5jdGlvbiBydChlLHQsbil7aWYoZS50YWc9PT0zKWFtKGUsZSxuKTtlbHNlIGZvcig7dCE9PW51bGw7KXtpZih0LnRhZz09PTMpe2FtKHQsZSxuKTticmVha31lbHNlIGlmKHQudGFnPT09MSl7dmFyIHI9dC5zdGF0ZU5vZGU7aWYodHlwZW9mIHQudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I9PSJmdW5jdGlvbiJ8fHR5cGVvZiByLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoUXI9PT1udWxsfHwhUXIuaGFzKHIpKSl7ZT1EYShuLGUpLGU9TXYodCxlLDEpLHQ9cXIodCxlLDEpLGU9VXQoKSx0IT09bnVsbCYmKEZpKHQsMSxlKSxKdCh0LGUpKTticmVha319dD10LnJldHVybn19ZnVuY3Rpb24ga1MoZSx0LG4pe3ZhciByPWUucGluZ0NhY2hlO3IhPT1udWxsJiZyLmRlbGV0ZSh0KSx0PVV0KCksZS5waW5nZWRMYW5lc3w9ZS5zdXNwZW5kZWRMYW5lcyZuLHZ0PT09ZSYmKHh0Jm4pPT09biYmKGZ0PT09NHx8ZnQ9PT0zJiYoeHQmMTMwMDIzNDI0KT09PXh0JiY1MDA+c3QoKS1jcD9EbyhlLDApOmRwfD1uKSxKdChlLHQpfWZ1bmN0aW9uIFp2KGUsdCl7dD09PTAmJihlLm1vZGUmMT8odD1XcyxXczw8PTEsIShXcyYxMzAwMjM0MjQpJiYoV3M9NDE5NDMwNCkpOnQ9MSk7dmFyIG49VXQoKTtlPWtyKGUsdCksZSE9PW51bGwmJihGaShlLHQsbiksSnQoZSxuKSl9ZnVuY3Rpb24geFMoZSl7dmFyIHQ9ZS5tZW1vaXplZFN0YXRlLG49MDt0IT09bnVsbCYmKG49dC5yZXRyeUxhbmUpLFp2KGUsbil9ZnVuY3Rpb24gU1MoZSx0KXt2YXIgbj0wO3N3aXRjaChlLnRhZyl7Y2FzZSAxMzp2YXIgcj1lLnN0YXRlTm9kZSxvPWUubWVtb2l6ZWRTdGF0ZTtvIT09bnVsbCYmKG49by5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6cj1lLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKEwoMzE0KSl9ciE9PW51bGwmJnIuZGVsZXRlKHQpLFp2KGUsbil9dmFyIGV5O2V5PWZ1bmN0aW9uKGUsdCxuKXtpZihlIT09bnVsbClpZihlLm1lbW9pemVkUHJvcHMhPT10LnBlbmRpbmdQcm9wc3x8cXQuY3VycmVudClZdD0hMDtlbHNle2lmKCEoZS5sYW5lcyZuKSYmISh0LmZsYWdzJjEyOCkpcmV0dXJuIFl0PSExLGNTKGUsdCxuKTtZdD0hIShlLmZsYWdzJjEzMTA3Mil9ZWxzZSBZdD0hMSxxZSYmdC5mbGFncyYxMDQ4NTc2JiZvdih0LEVsLHQuaW5kZXgpO3N3aXRjaCh0LmxhbmVzPTAsdC50YWcpe2Nhc2UgMjp2YXIgcj10LnR5cGU7bGwoZSx0KSxlPXQucGVuZGluZ1Byb3BzO3ZhciBvPVNhKHQsQ3QuY3VycmVudCk7YmEodCxuKSxvPXJwKG51bGwsdCxyLGUsbyxuKTt2YXIgYT1vcCgpO3JldHVybiB0LmZsYWdzfD0xLHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwmJnR5cGVvZiBvLnJlbmRlcj09ImZ1bmN0aW9uIiYmby4kJHR5cGVvZj09PXZvaWQgMD8odC50YWc9MSx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsUXQocik/KGE9ITAseGwodCkpOmE9ITEsdC5tZW1vaXplZFN0YXRlPW8uc3RhdGUhPT1udWxsJiZvLnN0YXRlIT09dm9pZCAwP28uc3RhdGU6bnVsbCxYdSh0KSxvLnVwZGF0ZXI9SGwsdC5zdGF0ZU5vZGU9byxvLl9yZWFjdEludGVybmFscz10LGh1KHQscixlLG4pLHQ9dnUobnVsbCx0LHIsITAsYSxuKSk6KHQudGFnPTAscWUmJmEmJmp1KHQpLEx0KG51bGwsdCxvLG4pLHQ9dC5jaGlsZCksdDtjYXNlIDE2OnI9dC5lbGVtZW50VHlwZTtlOntzd2l0Y2gobGwoZSx0KSxlPXQucGVuZGluZ1Byb3BzLG89ci5faW5pdCxyPW8oci5fcGF5bG9hZCksdC50eXBlPXIsbz10LnRhZz1OUyhyKSxlPUxuKHIsZSksbyl7Y2FzZSAwOnQ9bXUobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTp0PXFnKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDExOnQ9S2cobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTQ6dD1ZZyhudWxsLHQscixMbihyLnR5cGUsZSksbik7YnJlYWsgZX10aHJvdyBFcnJvcihMKDMwNixyLCIiKSl9cmV0dXJuIHQ7Y2FzZSAwOnJldHVybiByPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLG89dC5lbGVtZW50VHlwZT09PXI/bzpMbihyLG8pLG11KGUsdCxyLG8sbik7Y2FzZSAxOnJldHVybiByPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLG89dC5lbGVtZW50VHlwZT09PXI/bzpMbihyLG8pLHFnKGUsdCxyLG8sbik7Y2FzZSAzOmU6e2lmKFV2KHQpLGU9PT1udWxsKXRocm93IEVycm9yKEwoMzg3KSk7cj10LnBlbmRpbmdQcm9wcyxhPXQubWVtb2l6ZWRTdGF0ZSxvPWEuZWxlbWVudCxjdihlLHQpLERsKHQscixudWxsLG4pO3ZhciBpPXQubWVtb2l6ZWRTdGF0ZTtpZihyPWkuZWxlbWVudCxhLmlzRGVoeWRyYXRlZClpZihhPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOiExLGNhY2hlOmkuY2FjaGUscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczppLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsdHJhbnNpdGlvbnM6aS50cmFuc2l0aW9uc30sdC51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9YSx0Lm1lbW9pemVkU3RhdGU9YSx0LmZsYWdzJjI1Nil7bz1EYShFcnJvcihMKDQyMykpLHQpLHQ9UWcoZSx0LHIsbixvKTticmVhayBlfWVsc2UgaWYociE9PW8pe289RGEoRXJyb3IoTCg0MjQpKSx0KSx0PVFnKGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGZvcihubj1Zcih0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLHJuPXQscWU9ITAsem49bnVsbCxuPWx2KHQsbnVsbCxyLG4pLHQuY2hpbGQ9bjtuOyluLmZsYWdzPW4uZmxhZ3MmLTN8NDA5NixuPW4uc2libGluZztlbHNle2lmKEVhKCkscj09PW8pe3Q9eHIoZSx0LG4pO2JyZWFrIGV9THQoZSx0LHIsbil9dD10LmNoaWxkfXJldHVybiB0O2Nhc2UgNTpyZXR1cm4gdXYodCksZT09PW51bGwmJnV1KHQpLHI9dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsYT1lIT09bnVsbD9lLm1lbW9pemVkUHJvcHM6bnVsbCxpPW8uY2hpbGRyZW4saXUocixvKT9pPW51bGw6YSE9PW51bGwmJml1KHIsYSkmJih0LmZsYWdzfD0zMiksTHYoZSx0KSxMdChlLHQsaSxuKSx0LmNoaWxkO2Nhc2UgNjpyZXR1cm4gZT09PW51bGwmJnV1KHQpLG51bGw7Y2FzZSAxMzpyZXR1cm4genYoZSx0LG4pO2Nhc2UgNDpyZXR1cm4gWnUodCx0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxyPXQucGVuZGluZ1Byb3BzLGU9PT1udWxsP3QuY2hpbGQ9TmEodCxudWxsLHIsbik6THQoZSx0LHIsbiksdC5jaGlsZDtjYXNlIDExOnJldHVybiByPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLG89dC5lbGVtZW50VHlwZT09PXI/bzpMbihyLG8pLEtnKGUsdCxyLG8sbik7Y2FzZSA3OnJldHVybiBMdChlLHQsdC5wZW5kaW5nUHJvcHMsbiksdC5jaGlsZDtjYXNlIDg6cmV0dXJuIEx0KGUsdCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixuKSx0LmNoaWxkO2Nhc2UgMTI6cmV0dXJuIEx0KGUsdCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixuKSx0LmNoaWxkO2Nhc2UgMTA6ZTp7aWYocj10LnR5cGUuX2NvbnRleHQsbz10LnBlbmRpbmdQcm9wcyxhPXQubWVtb2l6ZWRQcm9wcyxpPW8udmFsdWUsR2UoTmwsci5fY3VycmVudFZhbHVlKSxyLl9jdXJyZW50VmFsdWU9aSxhIT09bnVsbClpZihXbihhLnZhbHVlLGkpKXtpZihhLmNoaWxkcmVuPT09by5jaGlsZHJlbiYmIXF0LmN1cnJlbnQpe3Q9eHIoZSx0LG4pO2JyZWFrIGV9fWVsc2UgZm9yKGE9dC5jaGlsZCxhIT09bnVsbCYmKGEucmV0dXJuPXQpO2EhPT1udWxsOyl7dmFyIHM9YS5kZXBlbmRlbmNpZXM7aWYocyE9PW51bGwpe2k9YS5jaGlsZDtmb3IodmFyIGw9cy5maXJzdENvbnRleHQ7bCE9PW51bGw7KXtpZihsLmNvbnRleHQ9PT1yKXtpZihhLnRhZz09PTEpe2w9eXIoLTEsbiYtbiksbC50YWc9Mjt2YXIgZD1hLnVwZGF0ZVF1ZXVlO2lmKGQhPT1udWxsKXtkPWQuc2hhcmVkO3ZhciBjPWQucGVuZGluZztjPT09bnVsbD9sLm5leHQ9bDoobC5uZXh0PWMubmV4dCxjLm5leHQ9bCksZC5wZW5kaW5nPWx9fWEubGFuZXN8PW4sbD1hLmFsdGVybmF0ZSxsIT09bnVsbCYmKGwubGFuZXN8PW4pLHB1KGEucmV0dXJuLG4sdCkscy5sYW5lc3w9bjticmVha31sPWwubmV4dH19ZWxzZSBpZihhLnRhZz09PTEwKWk9YS50eXBlPT09dC50eXBlP251bGw6YS5jaGlsZDtlbHNlIGlmKGEudGFnPT09MTgpe2lmKGk9YS5yZXR1cm4saT09PW51bGwpdGhyb3cgRXJyb3IoTCgzNDEpKTtpLmxhbmVzfD1uLHM9aS5hbHRlcm5hdGUscyE9PW51bGwmJihzLmxhbmVzfD1uKSxwdShpLG4sdCksaT1hLnNpYmxpbmd9ZWxzZSBpPWEuY2hpbGQ7aWYoaSE9PW51bGwpaS5yZXR1cm49YTtlbHNlIGZvcihpPWE7aSE9PW51bGw7KXtpZihpPT09dCl7aT1udWxsO2JyZWFrfWlmKGE9aS5zaWJsaW5nLGEhPT1udWxsKXthLnJldHVybj1pLnJldHVybixpPWE7YnJlYWt9aT1pLnJldHVybn1hPWl9THQoZSx0LG8uY2hpbGRyZW4sbiksdD10LmNoaWxkfXJldHVybiB0O2Nhc2UgOTpyZXR1cm4gbz10LnR5cGUscj10LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixiYSh0LG4pLG89Ym4obykscj1yKG8pLHQuZmxhZ3N8PTEsTHQoZSx0LHIsbiksdC5jaGlsZDtjYXNlIDE0OnJldHVybiByPXQudHlwZSxvPUxuKHIsdC5wZW5kaW5nUHJvcHMpLG89TG4oci50eXBlLG8pLFlnKGUsdCxyLG8sbik7Y2FzZSAxNTpyZXR1cm4gUnYoZSx0LHQudHlwZSx0LnBlbmRpbmdQcm9wcyxuKTtjYXNlIDE3OnJldHVybiByPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLG89dC5lbGVtZW50VHlwZT09PXI/bzpMbihyLG8pLGxsKGUsdCksdC50YWc9MSxRdChyKT8oZT0hMCx4bCh0KSk6ZT0hMSxiYSh0LG4pLE92KHQscixvKSxodSh0LHIsbyxuKSx2dShudWxsLHQsciwhMCxlLG4pO2Nhc2UgMTk6cmV0dXJuIEZ2KGUsdCxuKTtjYXNlIDIyOnJldHVybiBQdihlLHQsbil9dGhyb3cgRXJyb3IoTCgxNTYsdC50YWcpKX07ZnVuY3Rpb24gdHkoZSx0KXtyZXR1cm4gQW0oZSx0KX1mdW5jdGlvbiBFUyhlLHQsbixyKXt0aGlzLnRhZz1lLHRoaXMua2V5PW4sdGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbCx0aGlzLmluZGV4PTAsdGhpcy5yZWY9bnVsbCx0aGlzLnBlbmRpbmdQcm9wcz10LHRoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsLHRoaXMubW9kZT1yLHRoaXMuc3VidHJlZUZsYWdzPXRoaXMuZmxhZ3M9MCx0aGlzLmRlbGV0aW9ucz1udWxsLHRoaXMuY2hpbGRMYW5lcz10aGlzLmxhbmVzPTAsdGhpcy5hbHRlcm5hdGU9bnVsbH1mdW5jdGlvbiB5bihlLHQsbixyKXtyZXR1cm4gbmV3IEVTKGUsdCxuLHIpfWZ1bmN0aW9uIGhwKGUpe3JldHVybiBlPWUucHJvdG90eXBlLCEoIWV8fCFlLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIE5TKGUpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBocChlKT8xOjA7aWYoZSE9bnVsbCl7aWYoZT1lLiQkdHlwZW9mLGU9PT1NdSlyZXR1cm4gMTE7aWYoZT09PVJ1KXJldHVybiAxNH1yZXR1cm4gMn1mdW5jdGlvbiBYcihlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlO3JldHVybiBuPT09bnVsbD8obj15bihlLnRhZyx0LGUua2V5LGUubW9kZSksbi5lbGVtZW50VHlwZT1lLmVsZW1lbnRUeXBlLG4udHlwZT1lLnR5cGUsbi5zdGF0ZU5vZGU9ZS5zdGF0ZU5vZGUsbi5hbHRlcm5hdGU9ZSxlLmFsdGVybmF0ZT1uKToobi5wZW5kaW5nUHJvcHM9dCxuLnR5cGU9ZS50eXBlLG4uZmxhZ3M9MCxuLnN1YnRyZWVGbGFncz0wLG4uZGVsZXRpb25zPW51bGwpLG4uZmxhZ3M9ZS5mbGFncyYxNDY4MDA2NCxuLmNoaWxkTGFuZXM9ZS5jaGlsZExhbmVzLG4ubGFuZXM9ZS5sYW5lcyxuLmNoaWxkPWUuY2hpbGQsbi5tZW1vaXplZFByb3BzPWUubWVtb2l6ZWRQcm9wcyxuLm1lbW9pemVkU3RhdGU9ZS5tZW1vaXplZFN0YXRlLG4udXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0PWUuZGVwZW5kZW5jaWVzLG4uZGVwZW5kZW5jaWVzPXQ9PT1udWxsP251bGw6e2xhbmVzOnQubGFuZXMsZmlyc3RDb250ZXh0OnQuZmlyc3RDb250ZXh0fSxuLnNpYmxpbmc9ZS5zaWJsaW5nLG4uaW5kZXg9ZS5pbmRleCxuLnJlZj1lLnJlZixufWZ1bmN0aW9uIHVsKGUsdCxuLHIsbyxhKXt2YXIgaT0yO2lmKHI9ZSx0eXBlb2YgZT09ImZ1bmN0aW9uIilocChlKSYmKGk9MSk7ZWxzZSBpZih0eXBlb2YgZT09InN0cmluZyIpaT01O2Vsc2UgZTpzd2l0Y2goZSl7Y2FzZSBhYTpyZXR1cm4gQW8obi5jaGlsZHJlbixvLGEsdCk7Y2FzZSBJdTppPTgsb3w9ODticmVhaztjYXNlIHpjOnJldHVybiBlPXluKDEyLG4sdCxvfDIpLGUuZWxlbWVudFR5cGU9emMsZS5sYW5lcz1hLGU7Y2FzZSBGYzpyZXR1cm4gZT15bigxMyxuLHQsbyksZS5lbGVtZW50VHlwZT1GYyxlLmxhbmVzPWEsZTtjYXNlICRjOnJldHVybiBlPXluKDE5LG4sdCxvKSxlLmVsZW1lbnRUeXBlPSRjLGUubGFuZXM9YSxlO2Nhc2UgdW06cmV0dXJuIFZsKG4sbyxhLHQpO2RlZmF1bHQ6aWYodHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbClzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBkbTppPTEwO2JyZWFrIGU7Y2FzZSBjbTppPTk7YnJlYWsgZTtjYXNlIE11Omk9MTE7YnJlYWsgZTtjYXNlIFJ1Omk9MTQ7YnJlYWsgZTtjYXNlIEZyOmk9MTYscj1udWxsO2JyZWFrIGV9dGhyb3cgRXJyb3IoTCgxMzAsZT09bnVsbD9lOnR5cGVvZiBlLCIiKSl9cmV0dXJuIHQ9eW4oaSxuLHQsbyksdC5lbGVtZW50VHlwZT1lLHQudHlwZT1yLHQubGFuZXM9YSx0fWZ1bmN0aW9uIEFvKGUsdCxuLHIpe3JldHVybiBlPXluKDcsZSxyLHQpLGUubGFuZXM9bixlfWZ1bmN0aW9uIFZsKGUsdCxuLHIpe3JldHVybiBlPXluKDIyLGUscix0KSxlLmVsZW1lbnRUeXBlPXVtLGUubGFuZXM9bixlLnN0YXRlTm9kZT17aXNIaWRkZW46ITF9LGV9ZnVuY3Rpb24gUGMoZSx0LG4pe3JldHVybiBlPXluKDYsZSxudWxsLHQpLGUubGFuZXM9bixlfWZ1bmN0aW9uIExjKGUsdCxuKXtyZXR1cm4gdD15big0LGUuY2hpbGRyZW4hPT1udWxsP2UuY2hpbGRyZW46W10sZS5rZXksdCksdC5sYW5lcz1uLHQuc3RhdGVOb2RlPXtjb250YWluZXJJbmZvOmUuY29udGFpbmVySW5mbyxwZW5kaW5nQ2hpbGRyZW46bnVsbCxpbXBsZW1lbnRhdGlvbjplLmltcGxlbWVudGF0aW9ufSx0fWZ1bmN0aW9uIFRTKGUsdCxuLHIsbyl7dGhpcy50YWc9dCx0aGlzLmNvbnRhaW5lckluZm89ZSx0aGlzLmZpbmlzaGVkV29yaz10aGlzLnBpbmdDYWNoZT10aGlzLmN1cnJlbnQ9dGhpcy5wZW5kaW5nQ2hpbGRyZW49bnVsbCx0aGlzLnRpbWVvdXRIYW5kbGU9LTEsdGhpcy5jYWxsYmFja05vZGU9dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9bnVsbCx0aGlzLmNhbGxiYWNrUHJpb3JpdHk9MCx0aGlzLmV2ZW50VGltZXM9d2MoMCksdGhpcy5leHBpcmF0aW9uVGltZXM9d2MoLTEpLHRoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5maW5pc2hlZExhbmVzPXRoaXMubXV0YWJsZVJlYWRMYW5lcz10aGlzLmV4cGlyZWRMYW5lcz10aGlzLnBpbmdlZExhbmVzPXRoaXMuc3VzcGVuZGVkTGFuZXM9dGhpcy5wZW5kaW5nTGFuZXM9MCx0aGlzLmVudGFuZ2xlbWVudHM9d2MoMCksdGhpcy5pZGVudGlmaWVyUHJlZml4PXIsdGhpcy5vblJlY292ZXJhYmxlRXJyb3I9byx0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9bnVsbH1mdW5jdGlvbiBncChlLHQsbixyLG8sYSxpLHMsbCl7cmV0dXJuIGU9bmV3IFRTKGUsdCxuLHMsbCksdD09PTE/KHQ9MSxhPT09ITAmJih0fD04KSk6dD0wLGE9eW4oMyxudWxsLG51bGwsdCksZS5jdXJyZW50PWEsYS5zdGF0ZU5vZGU9ZSxhLm1lbW9pemVkU3RhdGU9e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6bixjYWNoZTpudWxsLHRyYW5zaXRpb25zOm51bGwscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpudWxsfSxYdShhKSxlfWZ1bmN0aW9uIERTKGUsdCxuKXt2YXIgcj0zPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6b2Esa2V5OnI9PW51bGw/bnVsbDoiIityLGNoaWxkcmVuOmUsY29udGFpbmVySW5mbzp0LGltcGxlbWVudGF0aW9uOm59fWZ1bmN0aW9uIG55KGUpe2lmKCFlKXJldHVybiBlbztlPWUuX3JlYWN0SW50ZXJuYWxzO2U6e2lmKFBvKGUpIT09ZXx8ZS50YWchPT0xKXRocm93IEVycm9yKEwoMTcwKSk7dmFyIHQ9ZTtkb3tzd2l0Y2godC50YWcpe2Nhc2UgMzp0PXQuc3RhdGVOb2RlLmNvbnRleHQ7YnJlYWsgZTtjYXNlIDE6aWYoUXQodC50eXBlKSl7dD10LnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBlfX10PXQucmV0dXJufXdoaWxlKHQhPT1udWxsKTt0aHJvdyBFcnJvcihMKDE3MSkpfWlmKGUudGFnPT09MSl7dmFyIG49ZS50eXBlO2lmKFF0KG4pKXJldHVybiBudihlLG4sdCl9cmV0dXJuIHR9ZnVuY3Rpb24gcnkoZSx0LG4scixvLGEsaSxzLGwpe3JldHVybiBlPWdwKG4sciwhMCxlLG8sYSxpLHMsbCksZS5jb250ZXh0PW55KG51bGwpLG49ZS5jdXJyZW50LHI9VXQoKSxvPUpyKG4pLGE9eXIocixvKSxhLmNhbGxiYWNrPXQ/P251bGwscXIobixhLG8pLGUuY3VycmVudC5sYW5lcz1vLEZpKGUsbyxyKSxKdChlLHIpLGV9ZnVuY3Rpb24gS2woZSx0LG4scil7dmFyIG89dC5jdXJyZW50LGE9VXQoKSxpPUpyKG8pO3JldHVybiBuPW55KG4pLHQuY29udGV4dD09PW51bGw/dC5jb250ZXh0PW46dC5wZW5kaW5nQ29udGV4dD1uLHQ9eXIoYSxpKSx0LnBheWxvYWQ9e2VsZW1lbnQ6ZX0scj1yPT09dm9pZCAwP251bGw6cixyIT09bnVsbCYmKHQuY2FsbGJhY2s9ciksZT1xcihvLHQsaSksZSE9PW51bGwmJigkbihlLG8saSxhKSxhbChlLG8saSkpLGl9ZnVuY3Rpb24gUGwoZSl7aWYoZT1lLmN1cnJlbnQsIWUuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGUuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGUuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGUuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBpbShlLHQpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiZlLmRlaHlkcmF0ZWQhPT1udWxsKXt2YXIgbj1lLnJldHJ5TGFuZTtlLnJldHJ5TGFuZT1uIT09MCYmbjx0P246dH19ZnVuY3Rpb24gbXAoZSx0KXtpbShlLHQpLChlPWUuYWx0ZXJuYXRlKSYmaW0oZSx0KX1mdW5jdGlvbiBBUygpe3JldHVybiBudWxsfXZhciBveT10eXBlb2YgcmVwb3J0RXJyb3I9PSJmdW5jdGlvbiI/cmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX07ZnVuY3Rpb24gdnAoZSl7dGhpcy5faW50ZXJuYWxSb290PWV9WWwucHJvdG90eXBlLnJlbmRlcj12cC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2ludGVybmFsUm9vdDtpZih0PT09bnVsbCl0aHJvdyBFcnJvcihMKDQwOSkpO0tsKGUsdCxudWxsLG51bGwpfTtZbC5wcm90b3R5cGUudW5tb3VudD12cC5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2ludGVybmFsUm9vdDtpZihlIT09bnVsbCl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIHQ9ZS5jb250YWluZXJJbmZvO01vKGZ1bmN0aW9uKCl7S2wobnVsbCxlLG51bGwsbnVsbCl9KSx0W2JyXT1udWxsfX07ZnVuY3Rpb24gWWwoZSl7dGhpcy5faW50ZXJuYWxSb290PWV9WWwucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PVBtKCk7ZT17YmxvY2tlZE9uOm51bGwsdGFyZ2V0OmUscHJpb3JpdHk6dH07Zm9yKHZhciBuPTA7bjxXci5sZW5ndGgmJnQhPT0wJiZ0PFdyW25dLnByaW9yaXR5O24rKyk7V3Iuc3BsaWNlKG4sMCxlKSxuPT09MCYmVW0oZSl9fTtmdW5jdGlvbiB5cChlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSl9ZnVuY3Rpb24gcWwoZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEmJihlLm5vZGVUeXBlIT09OHx8ZS5ub2RlVmFsdWUhPT0iIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICIpKX1mdW5jdGlvbiBzbSgpe31mdW5jdGlvbiBfUyhlLHQsbixyLG8pe2lmKG8pe2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgYT1yO3I9ZnVuY3Rpb24oKXt2YXIgZD1QbChpKTthLmNhbGwoZCl9fXZhciBpPXJ5KHQscixlLDAsbnVsbCwhMSwhMSwiIixzbSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1pLGVbYnJdPWkuY3VycmVudCxDaShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksTW8oKSxpfWZvcig7bz1lLmxhc3RDaGlsZDspZS5yZW1vdmVDaGlsZChvKTtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIHM9cjtyPWZ1bmN0aW9uKCl7dmFyIGQ9UGwobCk7cy5jYWxsKGQpfX12YXIgbD1ncChlLDAsITEsbnVsbCxudWxsLCExLCExLCIiLHNtKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVticl09bC5jdXJyZW50LENpKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxNbyhmdW5jdGlvbigpe0tsKHQsbCxuLHIpfSksbH1mdW5jdGlvbiBRbChlLHQsbixyLG8pe3ZhciBhPW4uX3JlYWN0Um9vdENvbnRhaW5lcjtpZihhKXt2YXIgaT1hO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKXt2YXIgcz1vO289ZnVuY3Rpb24oKXt2YXIgbD1QbChpKTtzLmNhbGwobCl9fUtsKHQsaSxlLG8pfWVsc2UgaT1fUyhuLHQsZSxvLHIpO3JldHVybiBQbChpKX1NbT1mdW5jdGlvbihlKXtzd2l0Y2goZS50YWcpe2Nhc2UgMzp2YXIgdD1lLnN0YXRlTm9kZTtpZih0LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBuPXVpKHQucGVuZGluZ0xhbmVzKTtuIT09MCYmKFV1KHQsbnwxKSxKdCh0LHN0KCkpLCEoVGUmNikmJihBYT1zdCgpKzUwMCxybygpKSl9YnJlYWs7Y2FzZSAxMzpNbyhmdW5jdGlvbigpe3ZhciByPWtyKGUsMSk7aWYociE9PW51bGwpe3ZhciBvPVV0KCk7JG4ocixlLDEsbyl9fSksbXAoZSwxKX19O3p1PWZ1bmN0aW9uKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PWtyKGUsMTM0MjE3NzI4KTtpZih0IT09bnVsbCl7dmFyIG49VXQoKTskbih0LGUsMTM0MjE3NzI4LG4pfW1wKGUsMTM0MjE3NzI4KX19O1JtPWZ1bmN0aW9uKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PUpyKGUpLG49a3IoZSx0KTtpZihuIT09bnVsbCl7dmFyIHI9VXQoKTskbihuLGUsdCxyKX1tcChlLHQpfX07UG09ZnVuY3Rpb24oKXtyZXR1cm4gVWV9O0xtPWZ1bmN0aW9uKGUsdCl7dmFyIG49VWU7dHJ5e3JldHVybiBVZT1lLHQoKX1maW5hbGx5e1VlPW59fTtRYz1mdW5jdGlvbihlLHQsbil7c3dpdGNoKHQpe2Nhc2UiaW5wdXQiOmlmKEhjKGUsbiksdD1uLm5hbWUsbi50eXBlPT09InJhZGlvIiYmdCE9bnVsbCl7Zm9yKG49ZTtuLnBhcmVudE5vZGU7KW49bi5wYXJlbnROb2RlO2ZvcihuPW4ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0iK0pTT04uc3RyaW5naWZ5KCIiK3QpKyddW3R5cGU9InJhZGlvIl0nKSx0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07aWYociE9PWUmJnIuZm9ybT09PWUuZm9ybSl7dmFyIG89JGwocik7aWYoIW8pdGhyb3cgRXJyb3IoTCg5MCkpO2ZtKHIpLEhjKHIsbyl9fX1icmVhaztjYXNlInRleHRhcmVhIjpnbShlLG4pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp0PW4udmFsdWUsdCE9bnVsbCYmbWEoZSwhIW4ubXVsdGlwbGUsdCwhMSl9fTt4bT11cDtTbT1Nbzt2YXIgQ1M9e3VzaW5nQ2xpZW50RW50cnlQb2ludDohMSxFdmVudHM6W1dpLGRhLCRsLGJtLGttLHVwXX0sc2k9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOkVvLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOiIxOC4zLjEiLHJlbmRlcmVyUGFja2FnZU5hbWU6InJlYWN0LWRvbSJ9LE9TPXtidW5kbGVUeXBlOnNpLmJ1bmRsZVR5cGUsdmVyc2lvbjpzaS52ZXJzaW9uLHJlbmRlcmVyUGFja2FnZU5hbWU6c2kucmVuZGVyZXJQYWNrYWdlTmFtZSxyZW5kZXJlckNvbmZpZzpzaS5yZW5kZXJlckNvbmZpZyxvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxvdmVycmlkZVByb3BzRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOm51bGwsc2V0RXJyb3JIYW5kbGVyOm51bGwsc2V0U3VzcGVuc2VIYW5kbGVyOm51bGwsc2NoZWR1bGVVcGRhdGU6bnVsbCxjdXJyZW50RGlzcGF0Y2hlclJlZjpTci5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPVRtKGUpLGU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGV9LGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOnNpLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlfHxBUyxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsLHJlY29uY2lsZXJWZXJzaW9uOiIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSImJihsaT1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIWxpLmlzRGlzYWJsZWQmJmxpLnN1cHBvcnRzRmliZXIpKXRyeXtMbD1saS5pbmplY3QoT1MpLHRyPWxpfWNhdGNoe312YXIgbGk7c24uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9Q1M7c24uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIXlwKHQpKXRocm93IEVycm9yKEwoMjAwKSk7cmV0dXJuIERTKGUsdCxudWxsLG4pfTtzbi5jcmVhdGVSb290PWZ1bmN0aW9uKGUsdCl7aWYoIXlwKGUpKXRocm93IEVycm9yKEwoMjk5KSk7dmFyIG49ITEscj0iIixvPW95O3JldHVybiB0IT1udWxsJiYodC51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSx0LmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPXQuaWRlbnRpZmllclByZWZpeCksdC5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihvPXQub25SZWNvdmVyYWJsZUVycm9yKSksdD1ncChlLDEsITEsbnVsbCxudWxsLG4sITEscixvKSxlW2JyXT10LmN1cnJlbnQsQ2koZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5ldyB2cCh0KX07c24uZmluZERPTU5vZGU9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZihlLm5vZGVUeXBlPT09MSlyZXR1cm4gZTt2YXIgdD1lLl9yZWFjdEludGVybmFscztpZih0PT09dm9pZCAwKXRocm93IHR5cGVvZiBlLnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihMKDE4OCkpOihlPU9iamVjdC5rZXlzKGUpLmpvaW4oIiwiKSxFcnJvcihMKDI2OCxlKSkpO3JldHVybiBlPVRtKHQpLGU9ZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZSxlfTtzbi5mbHVzaFN5bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIE1vKGUpfTtzbi5oeWRyYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZighcWwodCkpdGhyb3cgRXJyb3IoTCgyMDApKTtyZXR1cm4gUWwobnVsbCxlLHQsITAsbil9O3NuLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGUsdCxuKXtpZigheXAoZSkpdGhyb3cgRXJyb3IoTCg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxvPSExLGE9IiIsaT1veTtpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihvPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihhPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPW4ub25SZWNvdmVyYWJsZUVycm9yKSksdD1yeSh0LG51bGwsZSwxLG4/P251bGwsbywhMSxhLGkpLGVbYnJdPXQuY3VycmVudCxDaShlKSxyKWZvcihlPTA7ZTxyLmxlbmd0aDtlKyspbj1yW2VdLG89bi5fZ2V0VmVyc2lvbixvPW8obi5fc291cmNlKSx0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLG9dOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4sbyk7cmV0dXJuIG5ldyBZbCh0KX07c24ucmVuZGVyPWZ1bmN0aW9uKGUsdCxuKXtpZighcWwodCkpdGhyb3cgRXJyb3IoTCgyMDApKTtyZXR1cm4gUWwobnVsbCxlLHQsITEsbil9O3NuLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oZSl7aWYoIXFsKGUpKXRocm93IEVycm9yKEwoNDApKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPyhNbyhmdW5jdGlvbigpe1FsKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVticl09bnVsbH0pfSksITApOiExfTtzbi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz11cDtzbi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihlLHQsbixyKXtpZighcWwobikpdGhyb3cgRXJyb3IoTCgyMDApKTtpZihlPT1udWxsfHxlLl9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihMKDM4KSk7cmV0dXJuIFFsKGUsdCxuLCExLHIpfTtzbi52ZXJzaW9uPSIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2In0pO3ZhciB3cD1mcigoakksc3kpPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGl5KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShpeSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19aXkoKSxzeS5leHBvcnRzPWF5KCl9KTt2YXIgZHk9ZnIoYnA9PnsidXNlIHN0cmljdCI7dmFyIGx5PXdwKCk7YnAuY3JlYXRlUm9vdD1seS5jcmVhdGVSb290LGJwLmh5ZHJhdGVSb290PWx5Lmh5ZHJhdGVSb290O3ZhciBWSX0pO3ZhciBndz1mcihtZD0+eyJ1c2Ugc3RyaWN0Ijt2YXIgSkU9eWUoKSxYRT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksWkU9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxlTj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHROPUpFLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLG5OPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gaHcoZSx0LG4pe3ZhciByLG89e30sYT1udWxsLGk9bnVsbDtuIT09dm9pZCAwJiYoYT0iIituKSx0LmtleSE9PXZvaWQgMCYmKGE9IiIrdC5rZXkpLHQucmVmIT09dm9pZCAwJiYoaT10LnJlZik7Zm9yKHIgaW4gdCllTi5jYWxsKHQscikmJiFuTi5oYXNPd25Qcm9wZXJ0eShyKSYmKG9bcl09dFtyXSk7aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gdD1lLmRlZmF1bHRQcm9wcyx0KW9bcl09PT12b2lkIDAmJihvW3JdPXRbcl0pO3JldHVybnskJHR5cGVvZjpYRSx0eXBlOmUsa2V5OmEscmVmOmkscHJvcHM6byxfb3duZXI6dE4uY3VycmVudH19bWQuRnJhZ21lbnQ9WkU7bWQuanN4PWh3O21kLmpzeHM9aHd9KTt2YXIgZWU9ZnIoKHJVLG13KT0+eyJ1c2Ugc3RyaWN0Ijttdy5leHBvcnRzPWd3KCl9KTt2YXIgaXg9VShkeSgpLDEpO3ZhciBGdD17REVGQVVMVDoiZGVmYXVsdCIsTEFZT1VUX0NPTkZJRzoibGF5b3V0Q29uZmlnIixTRVRUSU5HU19DT05GSUc6InNldHRpbmdzQ29uZmlnIn07dmFyIHV5PXR5cGVvZiBwcm9jZXNzPCJ1IiYmITEseG49ITEsa3A9MzAsSWU9InBsdWdpbnMvZGFzaGJvYXJkIixYbD0icGxhbm5pbmcvcXVhcnRlcmx5Ijt2YXIgaj17QkFDS0dST1VORF9JTUFHRV9VUkw6IkJhY2tncm91bmQgSW1hZ2UgVVJMIixCQUNLR1JPVU5EX0lNQUdFX01PREU6IkJhY2tncm91bmQgSW1hZ2UgTW9kZSIsQ09OU09MRV9MT0dHSU5HOiJDb25zb2xlIGxvZ2dpbmciLERBU0hCT0FSRF9DT01QT05FTlRTOiJkYXNoYm9hcmRfZWxlbWVudHMiLERFQlVHX0NPTlNPTEU6ImRlYnVnX2NvbnNvbGUiLExMTV9BUElfS0VZX0FOVEhST1BJQzoiQW50aHJvcGljIEFQSSBLZXkiLExMTV9BUElfS0VZX0dFTUlOSToiR2VtaW5pIEFQSSBLZXkiLExMTV9BUElfS0VZX0dST0s6Ikdyb2sgQVBJIEtleSIsTExNX0FQSV9LRVlfT1BFTkFJOiJPcGVuQUkgQVBJIEtleSIsTExNX1BST1ZJREVSX01PREVMOiJMTE0gUHJvdmlkZXIiLEZJUlNUX0lOU1RBTExFRF9BVDoiZGFzaGJvYXJkX2ZpcnN0X2luc3RhbGxlZF9hdCIsU0VMRUNURURfTEFZT1VUX1BST0ZJTEU6ImRhc2hib2FyZF9zZWxlY3RlZF9sYXlvdXRfcHJvZmlsZSIsVEFTS19ET01BSU5TOiJkYXNoYm9hcmRfdGFza19kb21haW5zIixQTEFOTklOR19OT1RFX1RBRzoiVGFnIHRvIGFwcGx5IHRvIHBsYW5uaW5nIG5vdGVzIixQUk9QT1NFRF9BR0VOREFfUFJJT1JJVFk6ImRhc2hib2FyZF9wcm9wb3NlZF9hZ2VuZGFfcHJpb3JpdHkiLFBST1BPU0VEX0FHRU5EQV9MTE06ImRhc2hib2FyZF9wcm9wb3NlZF9hZ2VuZGFfbGxtIn0sSmw9e2FudGhyb3BpYzpqLkxMTV9BUElfS0VZX0FOVEhST1BJQyxnZW1pbmk6ai5MTE1fQVBJX0tFWV9HRU1JTkksZ3JvazpqLkxMTV9BUElfS0VZX0dST0ssb3BlbmFpOmouTExNX0FQSV9LRVlfT1BFTkFJfSxjeT17bm9uZTpudWxsLG9wZW5haToib3BlbmFpIixhbnRocm9waWM6ImFudGhyb3BpYyIsImFudGhyb3BpYy1zb25uZXQiOiJhbnRocm9waWMiLGdlbWluaToiZ2VtaW5pIixncm9rOiJncm9rIn07ZnVuY3Rpb24gb28oZSl7cmV0dXJuIWV8fGU9PT0ibm9uZSI/bnVsbDpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3ksZSk/Y3lbZV06SmxbZV0/ZTpudWxsfWZ1bmN0aW9uICR0KGUpe3JldHVybiBKbFtlXXx8bnVsbH1mdW5jdGlvbiBabChlKXtyZXR1cm4gT2JqZWN0LmtleXMoSmwpLmZpbHRlcih0PT57bGV0IG49ZT8uW0psW3RdXTtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciJiZuLnRyaW0oKS5sZW5ndGg+MH0pfWZ1bmN0aW9uIHB5KGUpe3N3aXRjaChlKXtjYXNlIm9wZW5haSI6cmV0dXJuKHByb2Nlc3MuZW52Lk9QRU5fQUlfQUNDRVNTX1RPS0VOfHwiIikudHJpbSgpO2Nhc2UiYW50aHJvcGljIjpyZXR1cm4ocHJvY2Vzcy5lbnYuQU5USFJPUElDX0FJX0FDQ0VTU19UT0tFTnx8IiIpLnRyaW0oKTtjYXNlImdyb2siOnJldHVybihwcm9jZXNzLmVudi5HUk9LX0FJX0FDQ0VTU19UT0tFTnx8IiIpLnRyaW0oKTtjYXNlImdlbWluaSI6cmV0dXJuKHByb2Nlc3MuZW52LkdFTUlOSV9BSV9BQ0NFU1NfVE9LRU58fCIiKS50cmltKCk7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gZnkoKXtyZXR1cm4geG4/WyJvcGVuYWkiLCJhbnRocm9waWMiLCJncm9rIiwiZ2VtaW5pIl0uc29tZShlPT4hIXB5KGUpKTohMX1mdW5jdGlvbiBlZChlKXtpZigheG4pcmV0dXJuIG51bGw7Zm9yKGxldCB0IG9mWyJvcGVuYWkiLCJhbnRocm9waWMiLCJncm9rIiwiZ2VtaW5pIl0pe2xldCBuPXB5KHQpLHI9ZVt0XXx8bnVsbDtpZihuJiZyKXJldHVybntwcm92aWRlcjp0LG1vZGVsOnIsYXBpS2V5Om59fXJldHVybiBudWxsfWZ1bmN0aW9uIE9hKGUpe3JldHVybmBkYXNoYm9hcmRfJHtlfV9jb25maWdgfWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZT8uW09hKHQpXTtpZighbilyZXR1cm5bXTtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShuKX1jYXRjaHtyZXR1cm5bXX19dmFyIGh5PVt7dmFsdWU6ImNvdmVyIixsYWJlbDoiQ292ZXIgKGZpbGwgZW50aXJlIGJhY2tncm91bmQpIn0se3ZhbHVlOiJjb250YWluIixsYWJlbDoiQ29udGFpbiAoZml0IHdpdGhvdXQgY3JvcHBpbmcpIn0se3ZhbHVlOiJyZXBlYXQiLGxhYmVsOiJSZXBlYXQgKHRpbGUgdGhlIGltYWdlKSJ9LHt2YWx1ZToicmVwZWF0LXgiLGxhYmVsOiJSZXBlYXQgaG9yaXpvbnRhbGx5In0se3ZhbHVlOiJyZXBlYXQteSIsbGFiZWw6IlJlcGVhdCB2ZXJ0aWNhbGx5In0se3ZhbHVlOiJuby1yZXBlYXQiLGxhYmVsOiJObyByZXBlYXQgKHNpbmdsZSBjZW50ZXJlZCBpbWFnZSkifV0sWUk9ai5EQVNIQk9BUkRfQ09NUE9ORU5UUyxJUz0yNCo2MCo2MCoxZTMsbG49W3t3aWRnZXRJZDoibGF5b3V0LXBpY2tlciIsbmFtZToiTGF5b3V0IFBpY2tlciIsZGVzY3JpcHRpb246Ik9uZS1jbGljayBwcmVzZXRzIHRoYXQgcmVhcnJhbmdlIHlvdXIgZW50aXJlIGRhc2hib2FyZCBpbnRvIGEgY3VyYXRlZCBwcm9maWxlIixpY29uOiJcdXsxRjVDMn1cdUZFMEYiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InBsYW5uaW5nIixuYW1lOiJRdWFydGVybHkgUGxhbm5pbmciLGRlc2NyaXB0aW9uOiJQbGFuIGFuZCB0cmFjayB5b3VyIHF1YXJ0ZXJseSBnb2FscyBhbmQgcHJpb3JpdGllcyIsaWNvbjoiXHV7MUY0Q0J9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixuYW1lOiJWaWN0b3J5IFZhbHVlIixkZXNjcmlwdGlvbjoiQ2VsZWJyYXRlIHdpbnMgYW5kIHRyYWNrIGhpZ2gtdmFsdWUgdGFzayBjb21wbGV0aW9ucyIsaWNvbjoiXHV7MUYzQzZ9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJkcmVhbS10YXNrIixuYW1lOiJHb2FsIENvYWNoIixkZXNjcmlwdGlvbjoiR2V0IHRhc2sgc3VnZ2VzdGlvbnMgdGhhdCBibGVuZCBxdWFydGVybHkvbW9udGhseSBnb2FscyB3aXRoIGRheS1vZi13ZWVrIHByZWZlcmVuY2VzIixpY29uOiJcdXsxRjUyRX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLG5hbWU6IkRheSBTa2V0Y2hlciIsZGVzY3JpcHRpb246Ik5vdGVib29rLXBhcGVyIGRheSBwbGFubmVyIHdpdGggaG91ci1ieS1ob3VyIGVudHJpZXMgc2F2ZWQgdG8gYSBub3RlIixpY29uOiJcdXsxRjVEMn1cdUZFMEYiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImFnZW5kYSIsbmFtZToiVGFzayBBZ2VuZGEiLGRlc2NyaXB0aW9uOiJWaWV3IGFuZCBtYW5hZ2UgeW91ciBwcmlvcml0aXplZCB0YXNrIGxpc3QiLGljb246Ilx1ezFGNENDfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicHJvcG9zZWQtYWdlbmRhIixuYW1lOiJQcm9wb3NlZCBBZ2VuZGEiLGRlc2NyaXB0aW9uOiJBSS1wcm9wb3NlZCBob3VyLWJ5LWhvdXIgc2NoZWR1bGUgYnVpbHQgZnJvbSB5b3VyIHJlY2VudCB0YXNrcyBhbmQgcXVhcnRlcmx5IHBsYW4iLGljb246Ilx1ezFGNUQzfVx1RkUwRiIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixpbnRyb2R1Y2VkQXQ6IjIwMjYtMDYtMjciLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJxdW90ZXMiLG5hbWU6Ikluc3BpcmF0aW9uIFF1b3RlcyIsZGVzY3JpcHRpb246IlJvdGF0aW5nIGluc3BpcmF0aW9uYWwgcXVvdGVzIHRvIGtlZXAgeW91IG1vdGl2YXRlZCIsaWNvbjoiXHV7MUY0QTF9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLG5hbWU6IlRhc2sgUmV0aXJlbWVudCBDZW50ZXIiLGRlc2NyaXB0aW9uOiJTdXJmYWNlIG5lZ2xlY3RlZCB0YXNrcyBhbmQgcmV0aXJlIHRoZW0gdG8gYW4gYXJjaGl2ZWQgbm90ZSIsaWNvbjoiXHV7MUY0NzV9XHVGRTBGIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLGludHJvZHVjZWRBdDoiMjAyNi0wNS0wOSIsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InJlY2VudC1ub3RlcyIsbmFtZToiUmV2aXNpdCBDYW5kaWRhdGUiLGRlc2NyaXB0aW9uOiJOb3RlcyB3aXRoIG9wZW4gdGFza3MgdGhhdCBoYXZlIG5vdCBoYWQgYSBuZXcgdGFzayBpbiBvdmVyIGEgd2VlayIsaWNvbjoiXHV7MUY0Q0N9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLG5hbWU6IlNoYXJlZCBOb3RlcyIsZGVzY3JpcHRpb246IlNoYXJlZCBub3RlcyByZWNlbnRseSB1cGRhdGVkIGJ5IGEgY29sbGFib3JhdG9yIGFmdGVyIHlvdXIgb3duIGNoYW5nZXMiLGljb246Ilx1ezFGOTFEfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixpbnRyb2R1Y2VkQXQ6IjIwMjYtMDYtMjYiLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJtb29kIixuYW1lOiJNb29kIFRyYWNrZXIiLHZpc2libGVUaXRsZToiSG93IGFyZSB5b3UgZmVlbGluZz8iLGRlc2NyaXB0aW9uOiJMb2cgeW91ciBkYWlseSBtb29kIGFuZCB2aXN1YWxpemUgdHJlbmRzIG92ZXIgdGltZSIsaWNvbjoiXHV7MUYzQUR9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJjYWxlbmRhciIsbmFtZToiQ2FsZW5kYXIiLGRlc2NyaXB0aW9uOiJTZWUgdXBjb21pbmcgZXZlbnRzIGFuZCBhcHBvaW50bWVudHMgYXQgYSBnbGFuY2UiLGljb246Ilx1ezFGNEM1fSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicXVpY2stYWN0aW9ucyIsbmFtZToiUXVpY2sgQWN0aW9ucyIsZGVzY3JpcHRpb246IlNob3J0Y3V0cyBmb3IgeW91ciBtb3N0IGZyZXF1ZW50bHkgdXNlZCBkYXNoYm9hcmQgYWN0aW9ucyIsaWNvbjoiXHUyNkExIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJwZWFrLWhvdXJzIixuYW1lOiJQZWFrIEhvdXJzIixkZXNjcmlwdGlvbjoiSG91cmx5IGRpc3RyaWJ1dGlvbiBvZiB0YXNrIGNyZWF0aW9uIGFuZCBjb21wbGV0aW9uIGFjdGl2aXR5IixpY29uOiJcdTIzRjAiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRlYnVnLWNvbnNvbGUiLG5hbWU6IkRlYnVnIENvbnNvbGUiLGRlc2NyaXB0aW9uOiJTY3JvbGxhYmxlIGxvZyB2aWV3ZXIgc2hvd2luZyBhbGwgbG9nSWZFbmFibGVkIG1lc3NhZ2VzIChkZXZlbG9wZXIgdG9vbCkiLGljb246Ilx1ezFGNDFCfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjIsZGVidWdPbmx5OiEwfV07ZnVuY3Rpb24gbGUoZSl7bGV0IHQ9bG4uZmluZChuPT5uLndpZGdldElkPT09ZSk7cmV0dXJuIHQ/LnZpc2libGVUaXRsZXx8dD8ubmFtZXx8ZX1mdW5jdGlvbiBneShlKXtyZXR1cm4gbG4uZmluZCh0PT50LndpZGdldElkPT09ZSl8fG51bGx9dmFyIGFvPWxuLmZpbHRlcihlPT4hZS5kZWJ1Z09ubHkpLm1hcChlPT4oe3dpZGdldElkOmUud2lkZ2V0SWQsZ3JpZFdpZHRoU2l6ZTplLmRlZmF1bHRHcmlkV2lkdGhTaXplLGdyaWRIZWlnaHRTaXplOjEsc2V0dGluZ3M6e319KSk7dmFyIHhwPSExLE1TPTAsUlM9MjAwLG5kPVtdLFNwPW5ldyBTZXQ7ZnVuY3Rpb24gRXAoZSl7aWYodHlwZW9mIGU9PSJib29sZWFuIil7eHA9ZTtyZXR1cm59bGV0IHQ9U3RyaW5nKGV8fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKTt4cD1bInRydWUiLCJ5ZXMiLCIxIiwib24iLCJlbmFibGVkIl0uaW5jbHVkZXModCl9ZnVuY3Rpb24gayguLi5lKXtpZih4cCl7Y29uc29sZS5sb2coLi4uZSk7bGV0IHQ9e2lkOisrTVMsdHM6RGF0ZS5ub3coKSxhcmdzOmV9O25kLnB1c2godCksbmQubGVuZ3RoPlJTJiZuZC5zaGlmdCgpLHNldFRpbWVvdXQoKCk9PlNwLmZvckVhY2gobj0+bih0KSksMCl9fWZ1bmN0aW9uIG15KCl7cmV0dXJuWy4uLm5kXX1mdW5jdGlvbiB2eShlKXtTcC5hZGQoZSl9ZnVuY3Rpb24geXkoZSl7U3AuZGVsZXRlKGUpfWZ1bmN0aW9uIHdlKGUpe3JldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpLWUqNjAqMWUzKS50b0lTT1N0cmluZygpfXZhciBMbz17ImRvbWFpbi13b3JrLXV1aWQiOlt7dXVpZDoibm90ZS13b3JrLTEiLG5hbWU6IlExIEdvYWwgUmV2aWV3Iix0YWdzOlsid29yayJdLHNoYXJlZDohMCxoYXNUYXNrczohMCxhY3RpdmU6d2UoNDUpLGNoYW5nZWQ6d2UoMjg4MCksdXBkYXRlZDp3ZSg4KX0se3V1aWQ6Im5vdGUtd29yay0yIixuYW1lOiJTdGFuZC11cCBOb3RlcyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0zIixuYW1lOiJGZWF0dXJlIEltcGxlbWVudGF0aW9uIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTQiLG5hbWU6IkRlc2lnbiBGZWVkYmFjayIsdGFnczpbIndvcmsiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITAsYWN0aXZlOndlKDE1MDApLGNoYW5nZWQ6d2UoNzIwMCksdXBkYXRlZDp3ZSgxMjApfSx7dXVpZDoibm90ZS13b3JrLTUiLG5hbWU6IkJ1ZGdldCBUcmFja2VyIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTYiLG5hbWU6Ik9mZmxpbmUgVGVzdGluZyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay03IixuYW1lOiJTcHJpbnQgUmV0cm8iLHRhZ3M6WyJ3b3JrIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiExLGFjdGl2ZTp3ZSg4NjQwKSxjaGFuZ2VkOndlKDU1NzYwKSx1cGRhdGVkOndlKDQ0NDQwKX0se3V1aWQ6Im5vdGUtd29yay04IixuYW1lOiJBUEkgTGF5ZXIgUmVzZWFyY2giLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstOSIsbmFtZToiSW50ZWdyYXRpb24gVGVzdHMiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstMTAiLG5hbWU6IlB1bGwgUmVxdWVzdCBRdWV1ZSIsdGFnczpbIndvcmsiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITAsYWN0aXZlOndlKDI0MCksY2hhbmdlZDp3ZSgxODApLHVwZGF0ZWQ6d2UoMTgwKX0se3V1aWQ6Im5vdGUtd29yay0xMSIsbmFtZToiU2V0dGluZ3MgTW9kdWxlIFRlc3RzIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTEyIixuYW1lOiJDU1MgQ2xlYW51cCIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xMyIsbmFtZToiRGFzaGJvYXJkIE1lbW9yeSBMZWFrIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTE0IixuYW1lOiJDbGllbnQgRmVlZGJhY2siLHRhZ3M6WyJ3b3JrIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiEwLGFjdGl2ZTp3ZSgyMDE2MCksY2hhbmdlZDp3ZSgxNDQwMCksdXBkYXRlZDp3ZSgxNDMyMCl9LHt1dWlkOiJub3RlLXdvcmstMTUiLG5hbWU6IkFQSSBFcnJvciBIYW5kbGluZyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xNiIsbmFtZToiQXV0aCBUb2tlbiBSZWZyZXNoIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTE3IixuYW1lOiJEQiBRdWVyeSBQZXJmb3JtYW5jZSIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtb2xkLTNtbyIsbmFtZToiU2VjdXJpdHkgQmFja2xvZyAoUTQpIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtNG1vIixuYW1lOiJQbGF0Zm9ybSBNaWdyYXRpb24gTm90ZXMiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLW9sZC01bW8iLG5hbWU6IlRlY2ggRGVidCBUcmFja2VyIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtNm1vIixuYW1lOiJBYmFuZG9uZWQgRmVhdHVyZSBDb25jZXB0cyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtb2xkLTdtbyIsbmFtZToiTGVnYWN5IFN5c3RlbSBEb2NzIix0YWdzOlsid29yayJdfV0sImRvbWFpbi1wZXJzb25hbC11dWlkIjpbe3V1aWQ6Im5vdGUtcGVyc29uYWwtMSIsbmFtZToiTmV0d29ya2luZyBPdXRyZWFjaCIsdGFnczpbInBlcnNvbmFsIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiEwLGFjdGl2ZTp3ZSgxMjApLGNoYW5nZWQ6d2UoMTQ0MCksdXBkYXRlZDp3ZSgyNSl9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTIiLG5hbWU6IkZpdG5lc3MgTG9nIix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtMyIsbmFtZToiU29jaWFsIFJlbWluZGVycyIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTQiLG5hbWU6IkVudGVydGFpbm1lbnQiLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC01IixuYW1lOiJTaG9wcGluZyBMaXN0Iix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNiIsbmFtZToiSGVhbHRoIEFwcG9pbnRtZW50cyIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTciLG5hbWU6IlJlYWRpbmcgTGlzdCIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTgiLG5hbWU6IkhvYmJpZXMiLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC05IixuYW1lOiJUcmlwIFBsYW5uaW5nIix0YWdzOlsicGVyc29uYWwiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITEsYWN0aXZlOndlKDQzMjApLGNoYW5nZWQ6d2UoMjg4MCksdXBkYXRlZDp3ZSgzNjApfSx7dXVpZDoibm90ZS1wZXJzb25hbC0xMCIsbmFtZToiSG9tZSBPZmZpY2UiLHRhZ3M6WyJwZXJzb25hbCJdfV0sImRvbWFpbi1zaWRlLXV1aWQiOlt7dXVpZDoibm90ZS1zaWRlLTEiLG5hbWU6IkJsb2cgUG9zdCBJZGVhcyIsdGFnczpbInNpZGUtcHJvamVjdHMiXX0se3V1aWQ6Im5vdGUtc2lkZS0yIixuYW1lOiJTaWRlIFByb2plY3QgUkVBRE1FIix0YWdzOlsic2lkZS1wcm9qZWN0cyJdLHNoYXJlZDohMCxoYXNUYXNrczohMCxhY3RpdmU6d2UoMjg4MCksY2hhbmdlZDp3ZSg0MzIwKSx1cGRhdGVkOndlKDQ1KX0se3V1aWQ6Im5vdGUtc2lkZS0zIixuYW1lOiJDSSBQaXBlbGluZSBTZXR1cCIsdGFnczpbInNpZGUtcHJvamVjdHMiXX1dfSx3eT1be3V1aWQ6InBlcnNvbi1qb3JkYW4tbGVlIixuYW1lOiJKb3JkYW4gTGVlIixhdmF0YXI6e2ltYWdlOiJodHRwczovL2kucHJhdmF0YXIuY2MvODA/dT1qb3JkYW4tbGVlIn0sYWN0aXZlOndlKDMwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtd29yay0xIl0sdGFnczpbXX19LHt1dWlkOiJwZXJzb24tc2FtLXJpdmVyYSIsbmFtZToiU2FtIFJpdmVyYSIsYXZhdGFyOnt0ZXh0OiJTUiJ9LGFjdGl2ZTp3ZSg5MCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXdvcmstMSJdLHRhZ3M6W119fSx7dXVpZDoicGVyc29uLXByaXlhLXBhdGVsIixuYW1lOiJQcml5YSBQYXRlbCIsYXZhdGFyOntpbWFnZToiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzgwP3U9cHJpeWEtcGF0ZWwifSxhY3RpdmU6d2UoMjQwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtd29yay00Il0sdGFnczpbIndvcmsiXX19LHt1dWlkOiJwZXJzb24tY2hlbi13ZWkiLG5hbWU6IkNoZW4gV2VpIixhdmF0YXI6e3RleHQ6IkNXIn0sYWN0aXZlOndlKDE1MDApLHNoYXJpbmc6e25vdGVzOlsibm90ZS13b3JrLTciXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1tYXJpYS1nb21leiIsbmFtZToiTWFyaWEgR29tZXoiLGF2YXRhcjp7aW1hZ2U6Imh0dHBzOi8vaS5wcmF2YXRhci5jYy84MD91PW1hcmlhLWdvbWV6In0sYWN0aXZlOndlKDE2MDApLHNoYXJpbmc6e25vdGVzOlsibm90ZS13b3JrLTciXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1hbGV4LWtpbSIsbmFtZToiQWxleCBLaW0iLGF2YXRhcjp7dGV4dDoiQUsifSxhY3RpdmU6d2UoMjAwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtd29yay0xMCJdLHRhZ3M6W119fSx7dXVpZDoicGVyc29uLXRheWxvci1icm9va3MiLG5hbWU6IlRheWxvciBCcm9va3MiLGF2YXRhcjp7dGV4dDoiVEIifSxhY3RpdmU6d2UoNDQwMCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXdvcmstMTQiXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1kYW5hLWNvbGUiLG5hbWU6IkRhbmEgQ29sZSIsYXZhdGFyOntpbWFnZToiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzgwP3U9ZGFuYS1jb2xlIn0sYWN0aXZlOndlKDYwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtcGVyc29uYWwtMSJdLHRhZ3M6WyJwZXJzb25hbCJdfX0se3V1aWQ6InBlcnNvbi1yb2Jpbi1mb3giLG5hbWU6IlJvYmluIEZveCIsYXZhdGFyOnt0ZXh0OiJSRiJ9LGFjdGl2ZTp3ZSg0MDApLHNoYXJpbmc6e25vdGVzOlsibm90ZS1wZXJzb25hbC05Il0sdGFnczpbXX19LHt1dWlkOiJwZXJzb24tamFtaWUtcGFyayIsbmFtZToiSmFtaWUgUGFyayIsYXZhdGFyOntpbWFnZToiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzgwP3U9amFtaWUtcGFyayJ9LGFjdGl2ZTp3ZSg0MjApLHNoYXJpbmc6e25vdGVzOlsibm90ZS1wZXJzb25hbC05Il0sdGFnczpbXX19LHt1dWlkOiJwZXJzb24tbW9yZ2FuLWVsbGlzIixuYW1lOiJNb3JnYW4gRWxsaXMiLGF2YXRhcjp7dGV4dDoiTUUifSxhY3RpdmU6d2UoNTApLHNoYXJpbmc6e25vdGVzOlsibm90ZS1zaWRlLTIiXSx0YWdzOlsic2lkZS1wcm9qZWN0cyJdfX1dLFBTPXtzaGFyZWQ6ZT0+ISFlPy5zaGFyZWQsdGFza0xpc3RzOmU9PmU/Lmhhc1Rhc2tzIT09ITF9O2Z1bmN0aW9uIE5wKGUsdCl7cmV0dXJuIHQ/U3RyaW5nKHQpLnNwbGl0KCIsIikubWFwKHI9PnIudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikuZXZlcnkocj0+e2xldCBvPVBTW3JdO3JldHVybiBvP28oZSk6ITB9KTohMH1mdW5jdGlvbiBieShlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLmFzeW5jSXRlcmF0b3Ise3ZhbHVlOmZ1bmN0aW9uKCl7bGV0IHQ9MDtyZXR1cm57bmV4dDooKT0+dDxlLmxlbmd0aD9Qcm9taXNlLnJlc29sdmUoe3ZhbHVlOmVbdCsrXSxkb25lOiExfSk6UHJvbWlzZS5yZXNvbHZlKHtkb25lOiEwfSl9fX0pLGV9dmFyIGt5PSJDb25zb2xlIGxvZ2dpbmciLExTPW5ldyBTZXQoWyJjaGFuZ2VkIiwiY3JlYXRlZCIsIm9wZW5lZCIsInJlbGV2YW5jZSIsInRpdGxlIiwidXBkYXRlZCJdKTtmdW5jdGlvbiByZChlKXtyZXR1cm5gZGFzaGJvYXJkXyR7ZX1fY29uZmlnYH1mdW5jdGlvbiBUcChlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP2U6ZT8udXVpZH1mdW5jdGlvbiBEeShlKXtyZXR1cm4oZS5tYXRjaCgvXigjezEsNn0pXHMrKC4rKSQvZ20pfHxbXSkubWFwKChuLHIpPT4oe2hlYWRpbmc6e3RleHQ6bi5yZXBsYWNlKC9eI3sxLDZ9XHMrLywiIikudHJpbSgpLGxldmVsOihuLm1hdGNoKC9eIysvKXx8WyIiXSlbMF0ubGVuZ3RofSxpbmRleDpyfSkpfWZ1bmN0aW9uIG9kKGUpe3JldHVybiBlPT1udWxsP251bGw6ZTwxZTEwP2UqMWUzOmV9ZnVuY3Rpb24gVVMoZSl7bGV0IHQ9bmV3IERhdGUoZSksbj10LmdldERheSgpO3JldHVybiB0LnNldERhdGUodC5nZXREYXRlKCktbisobj09PTA/LTY6MSkpLHQuc2V0SG91cnMoMCwwLDAsMCksdH1mdW5jdGlvbiBBcChlKXtyZXR1cm4oZXx8W10pLm1hcCh0PT4oey4uLnQsc2NvcmU6dD8uc2NvcmU/P3Q/LnZpY3RvcnlWYWx1ZT8/MH0pKX1mdW5jdGlvbiB6UyhlLHQpe2xldCBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLmdldFRpbWUoKSxyPW4rODY0ZTU7cmV0dXJuIGUuZmlsdGVyKG89PntsZXQgYT1vZChvLnN0YXJ0QXQpO3JldHVybiFvLmNvbXBsZXRlZEF0JiYhby5kaXNtaXNzZWRBdCYmYSE9bnVsbCYmYT49biYmYTxyfSl9ZnVuY3Rpb24gQXkoZSx0KXtsZXQgbj10LmdldFRpbWUoKSxyPW4rNyo4NjRlNTtyZXR1cm4gZS5maWx0ZXIobz0+e2xldCBhPW9kKG8uY29tcGxldGVkQXQpO3JldHVybiBhIT1udWxsJiZhPj1uJiZhPHJ9KX1mdW5jdGlvbiBGUyhlLHQpe3JldHVybiBBeShlLHQpLnJlZHVjZSgobixyKT0+bisoci52aWN0b3J5VmFsdWV8fDApLDApfWZ1bmN0aW9uICRTKGUsdCl7cmV0dXJuWyJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiLCJTdW4iXS5tYXAoKHIsbyk9PntsZXQgYT1uZXcgRGF0ZSh0KTthLnNldERhdGUoYS5nZXREYXRlKCkrbyk7bGV0IGk9bmV3IERhdGUoYSk7aS5zZXREYXRlKGkuZ2V0RGF0ZSgpKzEpO2xldCBzPWUuZmlsdGVyKGw9PntsZXQgZD1vZChsLmNvbXBsZXRlZEF0KTtyZXR1cm4gZCE9bnVsbCYmZD49YS5nZXRUaW1lKCkmJmQ8aS5nZXRUaW1lKCl9KTtyZXR1cm57ZGF5OnIsZGF0ZTphLnRvSVNPU3RyaW5nKCksdmFsdWU6cy5yZWR1Y2UoKGwsZCk9PmwrKGQudmljdG9yeVZhbHVlfHwwKSwwKSx0YXNrQ291bnQ6cy5sZW5ndGh9fSl9ZnVuY3Rpb24geHkoZSl7bGV0IHQ9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG49KGUtMSkqMztyZXR1cm5bdFtuXSx0W24rMV0sdFtuKzJdXX1mdW5jdGlvbiBXUyhlLHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7bi5zdHlsZS5kaXNwbGF5PSJmbGV4IixuLnN0eWxlLmFsaWduSXRlbXM9ImNlbnRlciIsbi5zdHlsZS5nYXA9IjEwcHgiO2xldCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLnRleHRDb250ZW50PWU/LmxhYmVsfHxgSW5wdXQgJHt0KzF9YCxyLnN0eWxlLm1pbldpZHRoPSIxNDBweCIsbi5hcHBlbmRDaGlsZChyKTtsZXQgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLnN0eWxlLmZsZXg9IjEiLG4uYXBwZW5kQ2hpbGQobyk7bGV0IGE9ZT8udHlwZXx8InRleHQiLGk9QXJyYXkuaXNBcnJheShlPy5vcHRpb25zKT9lLm9wdGlvbnM6W107aWYoYT09PSJjaGVja2JveCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIGwudHlwZT0iY2hlY2tib3giLGwuY2hlY2tlZD0hIWU/LnZhbHVlLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLmNoZWNrZWR9fWlmKGE9PT0icmFkaW8iKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlLmRpc3BsYXk9ImZsZXgiLGwuc3R5bGUuZmxleFdyYXA9IndyYXAiLGwuc3R5bGUuZ2FwPSIxMHB4IjtsZXQgZD1gZGV2LXByb21wdC1yYWRpby0ke0RhdGUubm93KCl9LSR7dH1gLGM9bnVsbDtmb3IobGV0W3AsdV1vZiBpLmVudHJpZXMoKSl7bGV0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtmLnN0eWxlLmRpc3BsYXk9ImlubGluZS1mbGV4IixmLnN0eWxlLmFsaWduSXRlbXM9ImNlbnRlciIsZi5zdHlsZS5nYXA9IjRweCI7bGV0IHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt2LnR5cGU9InJhZGlvIix2Lm5hbWU9ZCx2LnZhbHVlPVN0cmluZyh1Py52YWx1ZT8/dT8ubGFiZWw/PyIiKSxlPy52YWx1ZSE9bnVsbCYmU3RyaW5nKGUudmFsdWUpPT09di52YWx1ZSYmKHYuY2hlY2tlZD0hMCksY3x8KGM9dik7bGV0IHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3cudGV4dENvbnRlbnQ9dT8ubGFiZWw/P3YudmFsdWUsZi5hcHBlbmQodix3KSxsLmFwcGVuZENoaWxkKGYpLHA9PT1pLmxlbmd0aC0xJiYhbC5xdWVyeVNlbGVjdG9yKCJpbnB1dDpjaGVja2VkIikmJmMmJihjLmNoZWNrZWQ9ITApfXJldHVybiBvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6YyxnZXRWYWx1ZTooKT0+e2xldCBwPWwucXVlcnlTZWxlY3RvcigiaW5wdXQ6Y2hlY2tlZCIpO3JldHVybiBwP3AudmFsdWU6bnVsbH19fWlmKGE9PT0ic2VsZWN0Iil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7bC5zdHlsZS53aWR0aD0iMTAwJSI7Zm9yKGxldCBkIG9mIGkpe2xldCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO2MudmFsdWU9U3RyaW5nKGQ/LnZhbHVlPz9kPy5sYWJlbD8/IiIpLGMudGV4dENvbnRlbnQ9ZD8ubGFiZWw/P2MudmFsdWUsbC5hcHBlbmRDaGlsZChjKX1yZXR1cm4gZT8udmFsdWUhPW51bGwmJihsLnZhbHVlPVN0cmluZyhlLnZhbHVlKSksby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmwsZ2V0VmFsdWU6KCk9PmwudmFsdWV9fWlmKGE9PT0iZGF0ZSIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aWYobC50eXBlPSJkYXRlIixlPy52YWx1ZSE9bnVsbCl7bGV0IGQ9bmV3IERhdGUob2QoTnVtYmVyKGUudmFsdWUpKSk7TnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKXx8KGwudmFsdWU9ZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApKX1yZXR1cm4gbC5zdHlsZS53aWR0aD0iMTAwJSIsby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmwsZ2V0VmFsdWU6KCk9PntpZighbC52YWx1ZSlyZXR1cm4gbnVsbDtsZXQgZD1EYXRlLnBhcnNlKGAke2wudmFsdWV9VDAwOjAwOjAwWmApO3JldHVybiBOdW1iZXIuaXNOYU4oZCk/bnVsbDpNYXRoLmZsb29yKGQvMWUzKX19fWlmKGE9PT0idGV4dCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7cmV0dXJuIGwucm93cz0yLGwuc3R5bGUud2lkdGg9IjEwMCUiLGwudmFsdWU9U3RyaW5nKGU/LnZhbHVlPz8iIiksZT8ucGxhY2Vob2xkZXImJihsLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIpLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLnZhbHVlfX1sZXQgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiBzLnR5cGU9YT09PSJzZWN1cmVUZXh0Ij8icGFzc3dvcmQiOiJ0ZXh0IixzLnN0eWxlLndpZHRoPSIxMDAlIixzLnZhbHVlPVN0cmluZyhlPy52YWx1ZT8/IiIpLGU/LnBsYWNlaG9sZGVyJiYocy5wbGFjZWhvbGRlcj1lLnBsYWNlaG9sZGVyKSxvLmFwcGVuZENoaWxkKHMpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6cyxnZXRWYWx1ZTooKT0+cy52YWx1ZX19ZnVuY3Rpb24gQlMoZSx0PXt9KXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7bGV0IG49QXJyYXkuaXNBcnJheSh0Py5pbnB1dHMpJiZ0LmlucHV0cy5sZW5ndGg+MD90LmlucHV0czpbe3R5cGU6InRleHQifV0scj1BcnJheS5pc0FycmF5KHQ/LmFjdGlvbnMpP3QuYWN0aW9uczpbXTtyZXR1cm4gbmV3IFByb21pc2Uobz0+e2xldCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuZGF0YXNldC5kZXZQcm9tcHQ9Im92ZXJsYXkiLGEuc3R5bGUucG9zaXRpb249ImZpeGVkIixhLnN0eWxlLmluc2V0PSIwIixhLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwwLDAsMC4zNSkiLGEuc3R5bGUuekluZGV4PSI5OTk5OSIsYS5zdHlsZS5kaXNwbGF5PSJncmlkIixhLnN0eWxlLnBsYWNlSXRlbXM9ImNlbnRlciI7bGV0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5zdHlsZS53aWR0aD0ibWluKDY4MHB4LCA5MnZ3KSIsaS5zdHlsZS5iYWNrZ3JvdW5kPSIjZmZmIixpLnN0eWxlLmNvbG9yPSIjMTExIixpLnN0eWxlLmJvcmRlclJhZGl1cz0iMTBweCIsaS5zdHlsZS5wYWRkaW5nPSIxNnB4IixpLnN0eWxlLmJveFNoYWRvdz0iMCAxNnB4IDQ4cHggcmdiYSgwLDAsMCwwLjI1KSIsYS5hcHBlbmRDaGlsZChpKTtsZXQgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtzLnRleHRDb250ZW50PVN0cmluZyhlPz8iUHJvbXB0Iikscy5zdHlsZS5mb250V2VpZ2h0PSI2MDAiLHMuc3R5bGUubWFyZ2luQm90dG9tPSIxMnB4IixpLmFwcGVuZENoaWxkKHMpO2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKTtsLnN0eWxlLmRpc3BsYXk9ImZsZXgiLGwuc3R5bGUuZmxleERpcmVjdGlvbj0iY29sdW1uIixsLnN0eWxlLmdhcD0iMTBweCIsaS5hcHBlbmRDaGlsZChsKTtsZXQgZD1uLm1hcCgodyxiKT0+V1ModyxiKSk7Zm9yKGxldCB3IG9mIGQpbC5hcHBlbmRDaGlsZCh3LmxpbmUpO2xldCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc3R5bGUuZGlzcGxheT0iZmxleCIsYy5zdHlsZS5qdXN0aWZ5Q29udGVudD0iZmxleC1lbmQiLGMuc3R5bGUuZ2FwPSI4cHgiLGMuc3R5bGUubWFyZ2luVG9wPSI4cHgiLGwuYXBwZW5kQ2hpbGQoYyk7bGV0IHA9LTE7Zm9yKGxldFt3LGJdb2Ygci5lbnRyaWVzKCkpe2xldCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2cudHlwZT0iYnV0dG9uIixnLnRleHRDb250ZW50PWI/LmxhYmVsfHxgQWN0aW9uICR7dysxfWAsZy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntwPWI/LnZhbHVlPz93LGwucmVxdWVzdFN1Ym1pdCgpfSksYy5hcHBlbmRDaGlsZChnKX1sZXQgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTt1LnR5cGU9ImJ1dHRvbiIsdS5kYXRhc2V0LmRldlByb21wdENhbmNlbD0idHJ1ZSIsdS50ZXh0Q29udGVudD0iQ2FuY2VsIix1LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2EucmVtb3ZlKCksbyhudWxsKX0pLGMuYXBwZW5kQ2hpbGQodSk7bGV0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7Zi50eXBlPSJzdWJtaXQiLGYudGV4dENvbnRlbnQ9IlN1Ym1pdCIsYy5hcHBlbmRDaGlsZChmKSxsLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsdz0+e3cucHJldmVudERlZmF1bHQoKTtsZXQgYj1kLm1hcChnPT5nLmdldFZhbHVlKCkpO2EucmVtb3ZlKCksYi5sZW5ndGg9PT0xJiZyLmxlbmd0aD09PTA/byhiWzBdKTpyLmxlbmd0aD09PTA/byhiKTpvKFsuLi5iLHBdKX0pLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7bGV0IHY9ZC5maW5kKHc9PncuZm9jdXNUYXJnZXQpPy5mb2N1c1RhcmdldDt2JiZ2LmZvY3VzKCl9KX12YXIgSGk9bnVsbDthc3luYyBmdW5jdGlvbiBfeSgpe2lmKEhpIT09bnVsbClyZXR1cm4gSGk7dHJ5e0hpPWF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL3NldHRpbmdzIikpLmpzb24oKX1jYXRjaHtIaT17fX1yZXR1cm4gSGl9YXN5bmMgZnVuY3Rpb24gSFMoZSx0KXtsZXQgbj1hd2FpdCBfeSgpO25bZV09dDt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvc2V0dGluZ3MiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7a2V5OmUsdmFsdWU6dH0pfSl9Y2F0Y2gocil7Y29uc29sZS53YXJuKCJbZGV2LWFwcF0gZmFpbGVkIHRvIHBlcnNpc3Qgc2V0dGluZyIsZSxyKX19YXN5bmMgZnVuY3Rpb24gRHAoKXt0cnl7bGV0IGU9YXdhaXQgZmV0Y2goIi9hcGkvdGFza3MiKTtyZXR1cm4gQXAoYXdhaXQgZS5qc29uKCkpfWNhdGNoe3JldHVybltdfX1hc3luYyBmdW5jdGlvbiBHUyhlLHQpe3RyeXtsZXQgbj1hd2FpdCBmZXRjaChgL2FwaS90YXNrcz9mcm9tPSR7ZX0mdG89JHt0fWApO3JldHVybiBBcChhd2FpdCBuLmpzb24oKSl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIFN5KGUpe3RyeXtsZXQgdD1lP2AvYXBpL21vb2RzP2Zyb209JHtlfWA6Ii9hcGkvbW9vZHMiO3JldHVybiBhd2FpdChhd2FpdCBmZXRjaCh0KSkuanNvbigpfWNhdGNoe3JldHVybltdfX12YXIgalM9W3tpZDoiZG9tYWluLXdvcmstdXVpZCIsbmFtZToiV29yayIsdXVpZDoiZG9tYWluLXdvcmstdXVpZCIsbm90ZXM6TG9bImRvbWFpbi13b3JrLXV1aWQiXX0se2lkOiJkb21haW4tcGVyc29uYWwtdXVpZCIsbmFtZToiUGVyc29uYWwiLHV1aWQ6ImRvbWFpbi1wZXJzb25hbC11dWlkIixub3RlczpMb1siZG9tYWluLXBlcnNvbmFsLXV1aWQiXX0se2lkOiJkb21haW4tc2lkZS11dWlkIixuYW1lOiJTaWRlIFByb2plY3RzIix1dWlkOiJkb21haW4tc2lkZS11dWlkIixub3RlczpMb1siZG9tYWluLXNpZGUtdXVpZCJdfV07ZnVuY3Rpb24gRXkoZSx0PSIiLG49IiIpe2xldCByPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnRyaW0oKS50b0xvd2VyQ2FzZSgpOiIiO2lmKCFMUy5oYXMocil8fHI9PT0icmVsZXZhbmNlIiYmIXQpcmV0dXJuIGU7aWYoIVsicmVsZXZhbmNlIiwidGl0bGUiXS5pbmNsdWRlcyhyKSl7bGV0IGE9cj09PSJjcmVhdGVkIj8iY3JlYXRlZCI6cj09PSJvcGVuZWQiPyJvcGVuZWQiOiJ1cGRhdGVkIixpPXM9PntsZXQgbD1EYXRlLnBhcnNlKHM/LlthXXx8KGE9PT0ib3BlbmVkIj9zPy51cGRhdGVkfHxzPy5jcmVhdGVkOiIiKXx8IiIpO3JldHVybiBOdW1iZXIuaXNOYU4obCk/MDpsfTtyZXR1cm5bLi4uZV0uc29ydCgocyxsKT0+e2xldCBkPWkobCktaShzKTtyZXR1cm4gZCE9PTA/ZDoocz8ubmFtZXx8IiIpLmxvY2FsZUNvbXBhcmUobD8ubmFtZXx8IiIpfSl9bGV0IG89dC50cmltKCkudG9Mb3dlckNhc2UoKTtyZXR1cm5bLi4uZV0uc29ydCgoYSxpKT0+e2xldCBzPWE/Lm5hbWV8fCIiLGw9aT8ubmFtZXx8IiI7aWYocj09PSJ0aXRsZSIpcmV0dXJuIHMubG9jYWxlQ29tcGFyZShsKTtsZXQgZD1wPT57bGV0IHU9cC50b0xvd2VyQ2FzZSgpO3JldHVybiB1PT09bz8zOnUuc3RhcnRzV2l0aChvKT8yOnUuaW5jbHVkZXMobyk/MTowfSxjPWQobCktZChzKTtyZXR1cm4gYyE9PTA/YzpzLmxvY2FsZUNvbXBhcmUobCl9KX1hc3luYyBmdW5jdGlvbiBOeShlKXt0cnl7cmV0dXJuIGF3YWl0KGF3YWl0IGZldGNoKGAvYXBpL25vdGUtZmluZD9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWApKS5qc29uKCl9Y2F0Y2h7cmV0dXJuIG51bGx9fWFzeW5jIGZ1bmN0aW9uIFR5KGUpe3RyeXtsZXQgbj1hd2FpdCBfcCgpLmdldE5vdGVDb250ZW50KGUpO3JldHVybiBEeShufHwiIil9Y2F0Y2h7cmV0dXJuW119fXZhciBJYT1udWxsO2Z1bmN0aW9uIF9wKCl7aWYoSWEpcmV0dXJuIElhO2xldCBlPXQ9PntsZXQgbj0vXmh0dHBzOlwvXC93d3dcLmFtcGxlbm90ZVwuY29tXC9ub3Rlcyg/OiR8Wy8/XS4qKS8udGVzdCh0KTtyZXR1cm4gbj9jb25zb2xlLmxvZygiW2Rldi1hcHBdIG5hdmlnYXRlIix0KTpjb25zb2xlLndhcm4oIltkZXYtYXBwXSBuYXZpZ2F0ZSByZWplY3RlZCBpbnZhbGlkIFVSTCIsdCksbn07cmV0dXJuIElhPXtzZXR0aW5nczp7fSxhc3luYyBpbml0KCl7bGV0IHQ9YXdhaXQgX3koKTtpZih0W2t5XXx8KHRba3ldPSJ0cnVlIiksdHlwZW9mIHQuZGFzaGJvYXJkX2VsZW1lbnRzPT0ic3RyaW5nIil0cnl7dC5kYXNoYm9hcmRfZWxlbWVudHM9SlNPTi5wYXJzZSh0LmRhc2hib2FyZF9lbGVtZW50cyl9Y2F0Y2h7dC5kYXNoYm9hcmRfZWxlbWVudHM9bnVsbH1mb3IobGV0IHkgb2ZbcmQoInZpY3RvcnktdmFsdWUiKSxyZCgiY2FsZW5kYXIiKSxyZCgibW9vZCIpLHJkKCJxdW90ZXMiKV0paWYodHlwZW9mIHRbeV09PSJzdHJpbmciKXRyeXt0W3ldPUpTT04ucGFyc2UodFt5XSl9Y2F0Y2h7dFt5XT1udWxsfWxldCBuPW5ldyBEYXRlLHI9VVMobiksbz1hd2FpdCBEcCgpLGE9YXdhaXQgU3koKSxpPU1hdGguY2VpbCgobi5nZXRNb250aCgpKzEpLzMpLHM9YFEke2l9ICR7bi5nZXRGdWxsWWVhcigpfWAsbD1pPT09ND8xOmkrMSxkPWk9PT00P24uZ2V0RnVsbFllYXIoKSsxOm4uZ2V0RnVsbFllYXIoKSxjPWBRJHtsfSAke2R9YCxbcCx1XT1hd2FpdCBQcm9taXNlLmFsbChbTnkoYCR7c30gUGxhbmApLE55KGAke2N9IFBsYW5gKV0pLFtmLHZdPWF3YWl0IFByb21pc2UuYWxsKFtwPy51dWlkP1R5KHAudXVpZCk6UHJvbWlzZS5yZXNvbHZlKFtdKSx1Py51dWlkP1R5KHUudXVpZCk6UHJvbWlzZS5yZXNvbHZlKFtdKV0pLHc9eHkoaSksYj14eShsKSxnPXcuZXZlcnkoeT0+Zi5zb21lKGg9PmguaGVhZGluZz8udGV4dD8udHJpbSgpLnRvTG93ZXJDYXNlKCk9PT15LnRvTG93ZXJDYXNlKCkpKSxtPWIuZXZlcnkoeT0+di5zb21lKGg9PmguaGVhZGluZz8udGV4dD8udHJpbSgpLnRvTG93ZXJDYXNlKCk9PT15LnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gSWEuc2V0dGluZ3M9dCx7dGFza3M6byx0b2RheVRhc2tzOnpTKG8sbiksY29tcGxldGVkVGhpc1dlZWs6QXkobyxyKSx3ZWVrbHlWaWN0b3J5VmFsdWU6RlMobyxyKSxkYWlseVZpY3RvcnlWYWx1ZXM6JFMobyxyKSxtb29kUmF0aW5nczphLHF1YXJ0ZXJseVBsYW5zOntjdXJyZW50Ont5ZWFyOm4uZ2V0RnVsbFllYXIoKSxxdWFydGVyOmksbGFiZWw6cyxub3RlVVVJRDpwPy51dWlkPz9udWxsLGhhc0FsbE1vbnRobHlEZXRhaWxzOmd9LG5leHQ6e3llYXI6ZCxxdWFydGVyOmwsbGFiZWw6Yyxub3RlVVVJRDp1Py51dWlkPz9udWxsLGhhc0FsbE1vbnRobHlEZXRhaWxzOm19fSxjdXJyZW50RGF0ZTpuLnRvSVNPU3RyaW5nKCksc2V0dGluZ3M6dCx0YXNrRG9tYWluczpbe25hbWU6IldvcmsiLHV1aWQ6ImRvbWFpbi13b3JrLXV1aWQifSx7bmFtZToiUGVyc29uYWwiLHV1aWQ6ImRvbWFpbi1wZXJzb25hbC11dWlkIn0se25hbWU6IlNpZGUgUHJvamVjdHMiLHV1aWQ6ImRvbWFpbi1zaWRlLXV1aWQifV0sYWN0aXZlVGFza0RvbWFpbjoiZG9tYWluLXdvcmstdXVpZCJ9fSxhc3luYyBjb25maWd1cmUoKXtyZXR1cm4gbnVsbH0sYXN5bmMgZ2V0TW9vZFJhdGluZ3ModCl7cmV0dXJuIFN5KHQpfSxhc3luYyBnZXRDb21wbGV0ZWRUYXNrcyh0LG4pe3JldHVybiBHUyh0LG4pfSxhc3luYyBnZXRFeHRlcm5hbENhbGVuZGFyRXZlbnRzKCl7bGV0IHQ9bmV3IERhdGUsbj10LmdldEZ1bGxZZWFyKCkscj10LmdldE1vbnRoKCksbz10LmdldERhdGUoKTtyZXR1cm5be2FsbERheTohMSxjYWxlbmRhcjp7dXVpZDoiY2FsLXBlcnNvbmFsLXV1aWQiLG5hbWU6IlBlcnNvbmFsIn0sY29sb3I6IiM0Mjg1ZjQiLGVuZDpuZXcgRGF0ZShuLHIsbywxNywwLDApLHN0YXJ0Om5ldyBEYXRlKG4scixvLDE2LDAsMCksdGl0bGU6IkJpcnRoZGF5IHBhcnR5In0se2FsbERheTohMSxjYWxlbmRhcjp7dXVpZDoiY2FsLXdvcmstdXVpZCIsbmFtZToiV29yayJ9LGNvbG9yOiIjMGI4MDQzIixlbmQ6bmV3IERhdGUobixyLG8rMiwxMiwyNSwwKSxzdGFydDpuZXcgRGF0ZShuLHIsbysyLDExLDI1LDApLHRpdGxlOiJRdWFydGVybHkgUmV2aWV3IFN5bmMifV19LGFzeW5jIGdldFRhc2tEb21haW5zKCl7cmV0dXJuIGpTfSxhc3luYyBnZXRQZW9wbGUoKXtyZXR1cm4gd3l9LGFzeW5jIGdldFRhc2tEb21haW5UYXNrcyh0KXtsZXQgbj10P2AvYXBpL3Rhc2tzP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX1gOiIvYXBpL3Rhc2tzIixyPWF3YWl0IGZldGNoKG4pO3JldHVybiBBcChhd2FpdCByLmpzb24oKSl9LGFzeW5jIGdldE5vdGVUYXNrcyh0LG4pe2xldCByPXR5cGVvZiB0PT0ic3RyaW5nIj90OnQ/LnV1aWQ7cmV0dXJuKGF3YWl0IERwKCkpLmZpbHRlcihhPT5hLm5vdGVVVUlEPT09ciYmYS5jb21wbGV0ZWRBdD09bnVsbCYmYS5kaXNtaXNzZWRBdD09bnVsbCl9LGFzeW5jIGdldFRhc2sodCl7cmV0dXJuKGF3YWl0IERwKCkpLmZpbmQocj0+ci51dWlkPT09dCl8fG51bGx9LG5hdmlnYXRlKHQpe3JldHVybiBlKHQpfSxhc3luYyBzZXRTZXR0aW5nKHQsbil7bGV0IHI9bj09bnVsbD8iIjpTdHJpbmcobik7SWEuc2V0dGluZ3NbdF09cixhd2FpdCBIUyh0LHIpfSxhc3luYyByZWNvcmRNb29kUmF0aW5nKHQpe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dmFsdWU6dH0pfSkpLmpzb24oKSkudXVpZH1jYXRjaChuKXtyZXR1cm4gaygiW2Rldi1hcHBdIHJlY29yZE1vb2RSYXRpbmcgZmFpbGVkOiIsbiksbnVsbH19LGFzeW5jIHVwZGF0ZU1vb2RSYXRpbmcodCxuKXt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBBVENIIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3V1aWQ6dCx1cGRhdGVzOm59KX0pfWNhdGNoKHIpe2soIltkZXYtYXBwXSB1cGRhdGVNb29kUmF0aW5nIGZhaWxlZDoiLHIpfX0sYXN5bmMgZ2V0Tm90ZUNvbnRlbnQodCl7bGV0IG49VHAodCk7dHJ5e3JldHVybihhd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWNvbnRlbnQ/dXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudChuKX1gKSkuanNvbigpKS5jb250ZW50Pz8iIn1jYXRjaHtyZXR1cm4iIn19LGFzeW5jIGdldE5vdGVTZWN0aW9ucyh0KXtsZXQgbj1hd2FpdCB0aGlzLmdldE5vdGVDb250ZW50KHQpO3JldHVybiBEeShuKX0sYXN5bmMgZmluZE5vdGUodD17fSl7aWYodC51dWlkKXtsZXQgbj1PYmplY3QudmFsdWVzKExvKS5mbGF0KCkuZmluZChyPT5yLnV1aWQ9PT10LnV1aWQpO2lmKG4pcmV0dXJuIG59dHJ5e2xldCBuPXQudXVpZD9gdXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnV1aWQpfWA6YG5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQodC5uYW1lKX1gLG89YXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kPyR7bn1gKSkuanNvbigpO3JldHVybiBvPy51dWlkP286bnVsbH1jYXRjaHtyZXR1cm4gbnVsbH19LGZpbHRlck5vdGVzKHQ9e30sbj0iIil7bGV0IHI7aWYodC50YXNrRG9tYWluVVVJRCl7bGV0IG89KExvW3QudGFza0RvbWFpblVVSURdfHxbXSkuZmlsdGVyKGE9Pk5wKGEsdC5ncm91cCkpO3I9RXkobyx0LnF1ZXJ5LG4pfWVsc2V7bGV0IG89T2JqZWN0LnZhbHVlcyhMbykuZmxhdCgpLmZpbHRlcihpPT5OcChpLHQuZ3JvdXApKSxhPXQucXVlcnk/by5maWx0ZXIoaT0+KGkubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModC5xdWVyeS50b0xvd2VyQ2FzZSgpKSk6bztyPUV5KGEsdC5xdWVyeXx8bnVsbCxuKX1yZXR1cm4gYnkocil9LGFzeW5jIHVwZGF0ZVRhc2sodCxuKXtyZXR1cm4gaygiW2Rldi1hcHBdIHVwZGF0ZVRhc2siLHQsbiksITB9LGFzeW5jIGNyZWF0ZU5vdGUodCxuPVtdKXt0cnl7cmV0dXJuKGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL25vdGUtY3JlYXRlIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe25hbWU6dCx0YWdzOm59KX0pKS5qc29uKCkpLnV1aWR9Y2F0Y2h7cmV0dXJuIG51bGx9fSxhc3luYyByZXBsYWNlTm90ZUNvbnRlbnQodCxuLHI9e30pe2xldCBvPVRwKHQpO3RyeXtsZXQgYT17dXVpZDpvLGNvbnRlbnQ6bn07cmV0dXJuIHIuc2VjdGlvbiYmKGEuc2VjdGlvbj1yLnNlY3Rpb24pLChhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9ub3RlLWNvbnRlbnQiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeShhKX0pKS5qc29uKCkpLm9rfHwhMX1jYXRjaHtyZXR1cm4hMX19LGFzeW5jIGluc2VydE5vdGVDb250ZW50KHQsbixyPXt9KXtsZXQgbz1UcCh0KTt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbm90ZS1hcHBlbmQiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dXVpZDpvLGNvbnRlbnQ6bixhdEVuZDohIXIuYXRFbmR9KX0pfWNhdGNoe319LGFzeW5jIGF0dGFjaE5vdGVNZWRpYSh0LG4pe2soIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgY2FsbGVkLCBkYXRhVVJMIGxlbmd0aDoiLG4/Lmxlbmd0aHx8MCk7dHJ5e2xldCBhPShhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9hdHRhY2gtbWVkaWEiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7ZGF0YVVSTDpufSl9KSkuanNvbigpKS51cmx8fG51bGw7cmV0dXJuIGsoIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgcmVzcG9uc2U6IixhP2BVUkwgcmVjZWl2ZWQ6ICR7YX1gOiJubyBVUkwgaW4gcmVzcG9uc2UiKSxhfWNhdGNoKHIpe3JldHVybiBrKCJbZGV2LWFwcF0gYXR0YWNoTm90ZU1lZGlhIEZBSUxFRDoiLHIpLG51bGx9fSxhc3luYyBwcm9tcHQodCxuPXt9KXtyZXR1cm4gQlModCxuKX19LElhfXZhciB4ZT1VKHllKCksMSk7dmFyIGlvPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxWUz1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLENwPWNsYXNze2NvbnN0cnVjdG9yKHtpbmRleDp0LHNob3J0Om4sZnVsbDpyLHBsYW46byxjdXJyZW50OmF9KXt0aGlzLmluZGV4PXQsdGhpcy5zaG9ydD1uLHRoaXMuZnVsbD1yLHRoaXMucGxhbj1vLHRoaXMuY3VycmVudD1hfX07ZnVuY3Rpb24gR2koKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RnVsbFllYXIoKSxuPWUuZ2V0TW9udGgoKSxyPU1hdGguZmxvb3Iobi8zKSsxO3JldHVybnt5ZWFyOnQscXVhcnRlcjpyLGxhYmVsOmBRJHtyfSAke3R9YH19ZnVuY3Rpb24gQ3koZSx0KXtsZXQgbj0oZS5xdWFydGVyLTEpKjMscj1uZXcgRGF0ZSgpLmdldE1vbnRoKCksbz1bXTtmb3IobGV0IGE9MDthPDY7YSsrKXtsZXQgaT0obithKSUxMjtvLnB1c2gobmV3IENwKHtpbmRleDppLHNob3J0OlZTW2ldLGZ1bGw6aW9baV0scGxhbjphPDM/ZTp0LGN1cnJlbnQ6aT09PXJ9KSl9cmV0dXJuIG99ZnVuY3Rpb24gYWQoKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RGF5KCksbjtyZXR1cm4gdD09PTY/bj0yOnQ9PT0wP249MTpuPTEtdCxuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpK24pfWZ1bmN0aW9uIGlkKGUpe3JldHVybmBXZWVrIG9mICR7aW9bZS5nZXRNb250aCgpXX0gJHtlLmdldERhdGUoKX1gfWZ1bmN0aW9uIE1hKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpLHI9bmV3IFJlZ0V4cChgKF58XFxuKSgjezEsNn0pXFxzKyR7bn1cXHMqXFxuYCwiaSIpLG89ZS5tYXRjaChyKTtpZighbylyZXR1cm4gbnVsbDtsZXQgYT1vLmluZGV4K29bMF0ubGVuZ3RoLGk9ZS5zdWJzdHJpbmcoYSkscz1pLm1hdGNoKC9cbiN7MSw2fVxzLyksbD1zP2kuc3Vic3RyaW5nKDAscy5pbmRleCk6aTtyZXR1cm4gS1MobCl9ZnVuY3Rpb24gS1MoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFxzKlxcXHMqKSskL2csIiIpLnRyaW0oKX1mdW5jdGlvbiBPcChlKXtyZXR1cm5gCiMjIyAke2V9Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CmB9ZnVuY3Rpb24gSXAoZSl7cmV0dXJuYAojIyMgJHtlfQotIFByaW1hcnkgZm9jdXM6Ci0gS2V5IHRhc2tzOgotIENvbW1pdG1lbnRzOgpgfXZhciBvdD0idG9wIixodD0iYm90dG9tIix1dD0icmlnaHQiLGx0PSJsZWZ0IixzZD0iYXV0byIsc289W290LGh0LHV0LGx0XSxFcj0ic3RhcnQiLFVvPSJlbmQiLE95PSJjbGlwcGluZ1BhcmVudHMiLGxkPSJ2aWV3cG9ydCIsUmE9InBvcHBlciIsSXk9InJlZmVyZW5jZSIsTXA9c28ucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KFt0KyItIitFcix0KyItIitVb10pfSxbXSksZGQ9W10uY29uY2F0KHNvLFtzZF0pLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdChbdCx0KyItIitFcix0KyItIitVb10pfSxbXSksWVM9ImJlZm9yZVJlYWQiLHFTPSJyZWFkIixRUz0iYWZ0ZXJSZWFkIixKUz0iYmVmb3JlTWFpbiIsWFM9Im1haW4iLFpTPSJhZnRlck1haW4iLGVFPSJiZWZvcmVXcml0ZSIsdEU9IndyaXRlIixuRT0iYWZ0ZXJXcml0ZSIsTXk9W1lTLHFTLFFTLEpTLFhTLFpTLGVFLHRFLG5FXTtmdW5jdGlvbiB5dChlKXtyZXR1cm4gZT8oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6bnVsbH1mdW5jdGlvbiBRZShlKXtpZihlPT1udWxsKXJldHVybiB3aW5kb3c7aWYoZS50b1N0cmluZygpIT09IltvYmplY3QgV2luZG93XSIpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gdCYmdC5kZWZhdWx0Vmlld3x8d2luZG93fXJldHVybiBlfWZ1bmN0aW9uIFNuKGUpe3ZhciB0PVFlKGUpLkVsZW1lbnQ7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgRWxlbWVudH1mdW5jdGlvbiBndChlKXt2YXIgdD1RZShlKS5IVE1MRWxlbWVudDtyZXR1cm4gZSBpbnN0YW5jZW9mIHR8fGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH1mdW5jdGlvbiBQYShlKXtpZih0eXBlb2YgU2hhZG93Um9vdD4idSIpcmV0dXJuITE7dmFyIHQ9UWUoZSkuU2hhZG93Um9vdDtyZXR1cm4gZSBpbnN0YW5jZW9mIHR8fGUgaW5zdGFuY2VvZiBTaGFkb3dSb290fWZ1bmN0aW9uIHJFKGUpe3ZhciB0PWUuc3RhdGU7T2JqZWN0LmtleXModC5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj10LnN0eWxlc1tuXXx8e30sbz10LmF0dHJpYnV0ZXNbbl18fHt9LGE9dC5lbGVtZW50c1tuXTshZ3QoYSl8fCF5dChhKXx8KE9iamVjdC5hc3NpZ24oYS5zdHlsZSxyKSxPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPW9baV07cz09PSExP2EucmVtb3ZlQXR0cmlidXRlKGkpOmEuc2V0QXR0cmlidXRlKGkscz09PSEwPyIiOnMpfSkpfSl9ZnVuY3Rpb24gb0UoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXtwb3BwZXI6e3Bvc2l0aW9uOnQub3B0aW9ucy5zdHJhdGVneSxsZWZ0OiIwIix0b3A6IjAiLG1hcmdpbjoiMCJ9LGFycm93Ontwb3NpdGlvbjoiYWJzb2x1dGUifSxyZWZlcmVuY2U6e319O3JldHVybiBPYmplY3QuYXNzaWduKHQuZWxlbWVudHMucG9wcGVyLnN0eWxlLG4ucG9wcGVyKSx0LnN0eWxlcz1uLHQuZWxlbWVudHMuYXJyb3cmJk9iamVjdC5hc3NpZ24odC5lbGVtZW50cy5hcnJvdy5zdHlsZSxuLmFycm93KSxmdW5jdGlvbigpe09iamVjdC5rZXlzKHQuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89dC5lbGVtZW50c1tyXSxhPXQuYXR0cmlidXRlc1tyXXx8e30saT1PYmplY3Qua2V5cyh0LnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShyKT90LnN0eWxlc1tyXTpuW3JdKSxzPWkucmVkdWNlKGZ1bmN0aW9uKGwsZCl7cmV0dXJuIGxbZF09IiIsbH0se30pOyFndChvKXx8IXl0KG8pfHwoT2JqZWN0LmFzc2lnbihvLnN0eWxlLHMpLE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24obCl7by5yZW1vdmVBdHRyaWJ1dGUobCl9KSl9KX19dmFyIGppPXtuYW1lOiJhcHBseVN0eWxlcyIsZW5hYmxlZDohMCxwaGFzZToid3JpdGUiLGZuOnJFLGVmZmVjdDpvRSxyZXF1aXJlczpbImNvbXB1dGVTdHlsZXMiXX07ZnVuY3Rpb24gd3QoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVswXX12YXIgQm49TWF0aC5tYXgsem89TWF0aC5taW4sTnI9TWF0aC5yb3VuZDtmdW5jdGlvbiBMYSgpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnREYXRhO3JldHVybiBlIT1udWxsJiZlLmJyYW5kcyYmQXJyYXkuaXNBcnJheShlLmJyYW5kcyk/ZS5icmFuZHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJyYW5kKyIvIit0LnZlcnNpb259KS5qb2luKCIgIik6bmF2aWdhdG9yLnVzZXJBZ2VudH1mdW5jdGlvbiBWaSgpe3JldHVybiEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KExhKCkpfWZ1bmN0aW9uIEVuKGUsdCxuKXt0PT09dm9pZCAwJiYodD0hMSksbj09PXZvaWQgMCYmKG49ITEpO3ZhciByPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz0xLGE9MTt0JiZndChlKSYmKG89ZS5vZmZzZXRXaWR0aD4wJiZOcihyLndpZHRoKS9lLm9mZnNldFdpZHRofHwxLGE9ZS5vZmZzZXRIZWlnaHQ+MCYmTnIoci5oZWlnaHQpL2Uub2Zmc2V0SGVpZ2h0fHwxKTt2YXIgaT1TbihlKT9RZShlKTp3aW5kb3cscz1pLnZpc3VhbFZpZXdwb3J0LGw9IVZpKCkmJm4sZD0oci5sZWZ0KyhsJiZzP3Mub2Zmc2V0TGVmdDowKSkvbyxjPShyLnRvcCsobCYmcz9zLm9mZnNldFRvcDowKSkvYSxwPXIud2lkdGgvbyx1PXIuaGVpZ2h0L2E7cmV0dXJue3dpZHRoOnAsaGVpZ2h0OnUsdG9wOmMscmlnaHQ6ZCtwLGJvdHRvbTpjK3UsbGVmdDpkLHg6ZCx5OmN9fWZ1bmN0aW9uIEZvKGUpe3ZhciB0PUVuKGUpLG49ZS5vZmZzZXRXaWR0aCxyPWUub2Zmc2V0SGVpZ2h0O3JldHVybiBNYXRoLmFicyh0LndpZHRoLW4pPD0xJiYobj10LndpZHRoKSxNYXRoLmFicyh0LmhlaWdodC1yKTw9MSYmKHI9dC5oZWlnaHQpLHt4OmUub2Zmc2V0TGVmdCx5OmUub2Zmc2V0VG9wLHdpZHRoOm4saGVpZ2h0OnJ9fWZ1bmN0aW9uIEtpKGUsdCl7dmFyIG49dC5nZXRSb290Tm9kZSYmdC5nZXRSb290Tm9kZSgpO2lmKGUuY29udGFpbnModCkpcmV0dXJuITA7aWYobiYmUGEobikpe3ZhciByPXQ7ZG97aWYociYmZS5pc1NhbWVOb2RlKHIpKXJldHVybiEwO3I9ci5wYXJlbnROb2RlfHxyLmhvc3R9d2hpbGUocil9cmV0dXJuITF9ZnVuY3Rpb24gV3QoZSl7cmV0dXJuIFFlKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gUnAoZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmRleE9mKHl0KGUpKT49MH1mdW5jdGlvbiBFdChlKXtyZXR1cm4oKFNuKGUpP2Uub3duZXJEb2N1bWVudDplLmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gVHIoZSl7cmV0dXJuIHl0KGUpPT09Imh0bWwiP2U6ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8KFBhKGUpP2UuaG9zdDpudWxsKXx8RXQoZSl9ZnVuY3Rpb24gUnkoZSl7cmV0dXJuIWd0KGUpfHxXdChlKS5wb3NpdGlvbj09PSJmaXhlZCI/bnVsbDplLm9mZnNldFBhcmVudH1mdW5jdGlvbiBhRShlKXt2YXIgdD0vZmlyZWZveC9pLnRlc3QoTGEoKSksbj0vVHJpZGVudC9pLnRlc3QoTGEoKSk7aWYobiYmZ3QoZSkpe3ZhciByPVd0KGUpO2lmKHIucG9zaXRpb249PT0iZml4ZWQiKXJldHVybiBudWxsfXZhciBvPVRyKGUpO2ZvcihQYShvKSYmKG89by5ob3N0KTtndChvKSYmWyJodG1sIiwiYm9keSJdLmluZGV4T2YoeXQobykpPDA7KXt2YXIgYT1XdChvKTtpZihhLnRyYW5zZm9ybSE9PSJub25lInx8YS5wZXJzcGVjdGl2ZSE9PSJub25lInx8YS5jb250YWluPT09InBhaW50Inx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSJdLmluZGV4T2YoYS53aWxsQ2hhbmdlKSE9PS0xfHx0JiZhLndpbGxDaGFuZ2U9PT0iZmlsdGVyInx8dCYmYS5maWx0ZXImJmEuZmlsdGVyIT09Im5vbmUiKXJldHVybiBvO289by5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIEhuKGUpe2Zvcih2YXIgdD1RZShlKSxuPVJ5KGUpO24mJlJwKG4pJiZXdChuKS5wb3NpdGlvbj09PSJzdGF0aWMiOyluPVJ5KG4pO3JldHVybiBuJiYoeXQobik9PT0iaHRtbCJ8fHl0KG4pPT09ImJvZHkiJiZXdChuKS5wb3NpdGlvbj09PSJzdGF0aWMiKT90Om58fGFFKGUpfHx0fWZ1bmN0aW9uICRvKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5kZXhPZihlKT49MD8ieCI6InkifWZ1bmN0aW9uIFdvKGUsdCxuKXtyZXR1cm4gQm4oZSx6byh0LG4pKX1mdW5jdGlvbiBQeShlLHQsbil7dmFyIHI9V28oZSx0LG4pO3JldHVybiByPm4/bjpyfWZ1bmN0aW9uIFlpKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfX1mdW5jdGlvbiBxaShlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxZaSgpLGUpfWZ1bmN0aW9uIFFpKGUsdCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bcl09ZSxufSx7fSl9dmFyIGlFPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChPYmplY3QuYXNzaWduKHt9LG4ucmVjdHMse3BsYWNlbWVudDpuLnBsYWNlbWVudH0pKTp0LHFpKHR5cGVvZiB0IT0ibnVtYmVyIj90OlFpKHQsc28pKX07ZnVuY3Rpb24gc0UoZSl7dmFyIHQsbj1lLnN0YXRlLHI9ZS5uYW1lLG89ZS5vcHRpb25zLGE9bi5lbGVtZW50cy5hcnJvdyxpPW4ubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLHM9d3Qobi5wbGFjZW1lbnQpLGw9JG8ocyksZD1bbHQsdXRdLmluZGV4T2Yocyk+PTAsYz1kPyJoZWlnaHQiOiJ3aWR0aCI7aWYoISghYXx8IWkpKXt2YXIgcD1pRShvLnBhZGRpbmcsbiksdT1GbyhhKSxmPWw9PT0ieSI/b3Q6bHQsdj1sPT09InkiP2h0OnV0LHc9bi5yZWN0cy5yZWZlcmVuY2VbY10rbi5yZWN0cy5yZWZlcmVuY2VbbF0taVtsXS1uLnJlY3RzLnBvcHBlcltjXSxiPWlbbF0tbi5yZWN0cy5yZWZlcmVuY2VbbF0sZz1IbihhKSxtPWc/bD09PSJ5Ij9nLmNsaWVudEhlaWdodHx8MDpnLmNsaWVudFdpZHRofHwwOjAseT13LzItYi8yLGg9cFtmXSx4PW0tdVtjXS1wW3ZdLEU9bS8yLXVbY10vMit5LFQ9V28oaCxFLHgpLEQ9bDtuLm1vZGlmaWVyc0RhdGFbcl09KHQ9e30sdFtEXT1ULHQuY2VudGVyT2Zmc2V0PVQtRSx0KX19ZnVuY3Rpb24gbEUoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPW4uZWxlbWVudCxvPXI9PT12b2lkIDA/IltkYXRhLXBvcHBlci1hcnJvd10iOnI7byE9bnVsbCYmKHR5cGVvZiBvPT0ic3RyaW5nIiYmKG89dC5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihvKSwhbyl8fEtpKHQuZWxlbWVudHMucG9wcGVyLG8pJiYodC5lbGVtZW50cy5hcnJvdz1vKSl9dmFyIEx5PXtuYW1lOiJhcnJvdyIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46c0UsZWZmZWN0OmxFLHJlcXVpcmVzOlsicG9wcGVyT2Zmc2V0cyJdLHJlcXVpcmVzSWZFeGlzdHM6WyJwcmV2ZW50T3ZlcmZsb3ciXX07ZnVuY3Rpb24gTm4oZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVsxXX12YXIgZEU9e3RvcDoiYXV0byIscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byIsbGVmdDoiYXV0byJ9O2Z1bmN0aW9uIGNFKGUsdCl7dmFyIG49ZS54LHI9ZS55LG89dC5kZXZpY2VQaXhlbFJhdGlvfHwxO3JldHVybnt4Ok5yKG4qbykvb3x8MCx5Ok5yKHIqbykvb3x8MH19ZnVuY3Rpb24gVXkoZSl7dmFyIHQsbj1lLnBvcHBlcixyPWUucG9wcGVyUmVjdCxvPWUucGxhY2VtZW50LGE9ZS52YXJpYXRpb24saT1lLm9mZnNldHMscz1lLnBvc2l0aW9uLGw9ZS5ncHVBY2NlbGVyYXRpb24sZD1lLmFkYXB0aXZlLGM9ZS5yb3VuZE9mZnNldHMscD1lLmlzRml4ZWQsdT1pLngsZj11PT09dm9pZCAwPzA6dSx2PWkueSx3PXY9PT12b2lkIDA/MDp2LGI9dHlwZW9mIGM9PSJmdW5jdGlvbiI/Yyh7eDpmLHk6d30pOnt4OmYseTp3fTtmPWIueCx3PWIueTt2YXIgZz1pLmhhc093blByb3BlcnR5KCJ4IiksbT1pLmhhc093blByb3BlcnR5KCJ5IikseT1sdCxoPW90LHg9d2luZG93O2lmKGQpe3ZhciBFPUhuKG4pLFQ9ImNsaWVudEhlaWdodCIsRD0iY2xpZW50V2lkdGgiO2lmKEU9PT1RZShuKSYmKEU9RXQobiksV3QoRSkucG9zaXRpb24hPT0ic3RhdGljIiYmcz09PSJhYnNvbHV0ZSImJihUPSJzY3JvbGxIZWlnaHQiLEQ9InNjcm9sbFdpZHRoIikpLEU9RSxvPT09b3R8fChvPT09bHR8fG89PT11dCkmJmE9PT1Vbyl7aD1odDt2YXIgQT1wJiZFPT09eCYmeC52aXN1YWxWaWV3cG9ydD94LnZpc3VhbFZpZXdwb3J0LmhlaWdodDpFW1RdO3ctPUEtci5oZWlnaHQsdyo9bD8xOi0xfWlmKG89PT1sdHx8KG89PT1vdHx8bz09PWh0KSYmYT09PVVvKXt5PXV0O3ZhciBfPXAmJkU9PT14JiZ4LnZpc3VhbFZpZXdwb3J0P3gudmlzdWFsVmlld3BvcnQud2lkdGg6RVtEXTtmLT1fLXIud2lkdGgsZio9bD8xOi0xfX12YXIgST1PYmplY3QuYXNzaWduKHtwb3NpdGlvbjpzfSxkJiZkRSksTT1jPT09ITA/Y0Uoe3g6Zix5Ond9LFFlKG4pKTp7eDpmLHk6d307aWYoZj1NLngsdz1NLnksbCl7dmFyIFA7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sSSwoUD17fSxQW2hdPW0/IjAiOiIiLFBbeV09Zz8iMCI6IiIsUC50cmFuc2Zvcm09KHguZGV2aWNlUGl4ZWxSYXRpb3x8MSk8PTE/InRyYW5zbGF0ZSgiK2YrInB4LCAiK3crInB4KSI6InRyYW5zbGF0ZTNkKCIrZisicHgsICIrdysicHgsIDApIixQKSl9cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sSSwodD17fSx0W2hdPW0/dysicHgiOiIiLHRbeV09Zz9mKyJweCI6IiIsdC50cmFuc2Zvcm09IiIsdCkpfWZ1bmN0aW9uIHVFKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1uLmdwdUFjY2VsZXJhdGlvbixvPXI9PT12b2lkIDA/ITA6cixhPW4uYWRhcHRpdmUsaT1hPT09dm9pZCAwPyEwOmEscz1uLnJvdW5kT2Zmc2V0cyxsPXM9PT12b2lkIDA/ITA6cyxkPXtwbGFjZW1lbnQ6d3QodC5wbGFjZW1lbnQpLHZhcmlhdGlvbjpObih0LnBsYWNlbWVudCkscG9wcGVyOnQuZWxlbWVudHMucG9wcGVyLHBvcHBlclJlY3Q6dC5yZWN0cy5wb3BwZXIsZ3B1QWNjZWxlcmF0aW9uOm8saXNGaXhlZDp0Lm9wdGlvbnMuc3RyYXRlZ3k9PT0iZml4ZWQifTt0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyE9bnVsbCYmKHQuc3R5bGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LHQuc3R5bGVzLnBvcHBlcixVeShPYmplY3QuYXNzaWduKHt9LGQse29mZnNldHM6dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMscG9zaXRpb246dC5vcHRpb25zLnN0cmF0ZWd5LGFkYXB0aXZlOmkscm91bmRPZmZzZXRzOmx9KSkpKSx0Lm1vZGlmaWVyc0RhdGEuYXJyb3chPW51bGwmJih0LnN0eWxlcy5hcnJvdz1PYmplY3QuYXNzaWduKHt9LHQuc3R5bGVzLmFycm93LFV5KE9iamVjdC5hc3NpZ24oe30sZCx7b2Zmc2V0czp0Lm1vZGlmaWVyc0RhdGEuYXJyb3cscG9zaXRpb246ImFic29sdXRlIixhZGFwdGl2ZTohMSxyb3VuZE9mZnNldHM6bH0pKSkpLHQuYXR0cmlidXRlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LmF0dHJpYnV0ZXMucG9wcGVyLHsiZGF0YS1wb3BwZXItcGxhY2VtZW50Ijp0LnBsYWNlbWVudH0pfXZhciB6eT17bmFtZToiY29tcHV0ZVN0eWxlcyIsZW5hYmxlZDohMCxwaGFzZToiYmVmb3JlV3JpdGUiLGZuOnVFLGRhdGE6e319O3ZhciBjZD17cGFzc2l2ZTohMH07ZnVuY3Rpb24gcEUoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUuaW5zdGFuY2Uscj1lLm9wdGlvbnMsbz1yLnNjcm9sbCxhPW89PT12b2lkIDA/ITA6byxpPXIucmVzaXplLHM9aT09PXZvaWQgMD8hMDppLGw9UWUodC5lbGVtZW50cy5wb3BwZXIpLGQ9W10uY29uY2F0KHQuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsdC5zY3JvbGxQYXJlbnRzLnBvcHBlcik7cmV0dXJuIGEmJmQuZm9yRWFjaChmdW5jdGlvbihjKXtjLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsbi51cGRhdGUsY2QpfSkscyYmbC5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG4udXBkYXRlLGNkKSxmdW5jdGlvbigpe2EmJmQuZm9yRWFjaChmdW5jdGlvbihjKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsbi51cGRhdGUsY2QpfSkscyYmbC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLG4udXBkYXRlLGNkKX19dmFyIEZ5PXtuYW1lOiJldmVudExpc3RlbmVycyIsZW5hYmxlZDohMCxwaGFzZToid3JpdGUiLGZuOmZ1bmN0aW9uKCl7fSxlZmZlY3Q6cEUsZGF0YTp7fX07dmFyIGZFPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9O2Z1bmN0aW9uIFVhKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLGZ1bmN0aW9uKHQpe3JldHVybiBmRVt0XX0pfXZhciBoRT17c3RhcnQ6ImVuZCIsZW5kOiJzdGFydCJ9O2Z1bmN0aW9uIHVkKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLGZ1bmN0aW9uKHQpe3JldHVybiBoRVt0XX0pfWZ1bmN0aW9uIEJvKGUpe3ZhciB0PVFlKGUpLG49dC5wYWdlWE9mZnNldCxyPXQucGFnZVlPZmZzZXQ7cmV0dXJue3Njcm9sbExlZnQ6bixzY3JvbGxUb3A6cn19ZnVuY3Rpb24gSG8oZSl7cmV0dXJuIEVuKEV0KGUpKS5sZWZ0K0JvKGUpLnNjcm9sbExlZnR9ZnVuY3Rpb24gUHAoZSx0KXt2YXIgbj1RZShlKSxyPUV0KGUpLG89bi52aXN1YWxWaWV3cG9ydCxhPXIuY2xpZW50V2lkdGgsaT1yLmNsaWVudEhlaWdodCxzPTAsbD0wO2lmKG8pe2E9by53aWR0aCxpPW8uaGVpZ2h0O3ZhciBkPVZpKCk7KGR8fCFkJiZ0PT09ImZpeGVkIikmJihzPW8ub2Zmc2V0TGVmdCxsPW8ub2Zmc2V0VG9wKX1yZXR1cm57d2lkdGg6YSxoZWlnaHQ6aSx4OnMrSG8oZSkseTpsfX1mdW5jdGlvbiBMcChlKXt2YXIgdCxuPUV0KGUpLHI9Qm8oZSksbz0odD1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmJvZHksYT1CbihuLnNjcm9sbFdpZHRoLG4uY2xpZW50V2lkdGgsbz9vLnNjcm9sbFdpZHRoOjAsbz9vLmNsaWVudFdpZHRoOjApLGk9Qm4obi5zY3JvbGxIZWlnaHQsbi5jbGllbnRIZWlnaHQsbz9vLnNjcm9sbEhlaWdodDowLG8/by5jbGllbnRIZWlnaHQ6MCkscz0tci5zY3JvbGxMZWZ0K0hvKGUpLGw9LXIuc2Nyb2xsVG9wO3JldHVybiBXdChvfHxuKS5kaXJlY3Rpb249PT0icnRsIiYmKHMrPUJuKG4uY2xpZW50V2lkdGgsbz9vLmNsaWVudFdpZHRoOjApLWEpLHt3aWR0aDphLGhlaWdodDppLHg6cyx5Omx9fWZ1bmN0aW9uIEdvKGUpe3ZhciB0PVd0KGUpLG49dC5vdmVyZmxvdyxyPXQub3ZlcmZsb3dYLG89dC5vdmVyZmxvd1k7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG4rbytyKX1mdW5jdGlvbiBwZChlKXtyZXR1cm5bImh0bWwiLCJib2R5IiwiI2RvY3VtZW50Il0uaW5kZXhPZih5dChlKSk+PTA/ZS5vd25lckRvY3VtZW50LmJvZHk6Z3QoZSkmJkdvKGUpP2U6cGQoVHIoZSkpfWZ1bmN0aW9uIGxvKGUsdCl7dmFyIG47dD09PXZvaWQgMCYmKHQ9W10pO3ZhciByPXBkKGUpLG89cj09PSgobj1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDpuLmJvZHkpLGE9UWUociksaT1vP1thXS5jb25jYXQoYS52aXN1YWxWaWV3cG9ydHx8W10sR28ocik/cjpbXSk6cixzPXQuY29uY2F0KGkpO3JldHVybiBvP3M6cy5jb25jYXQobG8oVHIoaSkpKX1mdW5jdGlvbiB6YShlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxlLHtsZWZ0OmUueCx0b3A6ZS55LHJpZ2h0OmUueCtlLndpZHRoLGJvdHRvbTplLnkrZS5oZWlnaHR9KX1mdW5jdGlvbiBnRShlLHQpe3ZhciBuPUVuKGUsITEsdD09PSJmaXhlZCIpO3JldHVybiBuLnRvcD1uLnRvcCtlLmNsaWVudFRvcCxuLmxlZnQ9bi5sZWZ0K2UuY2xpZW50TGVmdCxuLmJvdHRvbT1uLnRvcCtlLmNsaWVudEhlaWdodCxuLnJpZ2h0PW4ubGVmdCtlLmNsaWVudFdpZHRoLG4ud2lkdGg9ZS5jbGllbnRXaWR0aCxuLmhlaWdodD1lLmNsaWVudEhlaWdodCxuLng9bi5sZWZ0LG4ueT1uLnRvcCxufWZ1bmN0aW9uICR5KGUsdCxuKXtyZXR1cm4gdD09PWxkP3phKFBwKGUsbikpOlNuKHQpP2dFKHQsbik6emEoTHAoRXQoZSkpKX1mdW5jdGlvbiBtRShlKXt2YXIgdD1sbyhUcihlKSksbj1bImFic29sdXRlIiwiZml4ZWQiXS5pbmRleE9mKFd0KGUpLnBvc2l0aW9uKT49MCxyPW4mJmd0KGUpP0huKGUpOmU7cmV0dXJuIFNuKHIpP3QuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBTbihvKSYmS2kobyxyKSYmeXQobykhPT0iYm9keSJ9KTpbXX1mdW5jdGlvbiBVcChlLHQsbixyKXt2YXIgbz10PT09ImNsaXBwaW5nUGFyZW50cyI/bUUoZSk6W10uY29uY2F0KHQpLGE9W10uY29uY2F0KG8sW25dKSxpPWFbMF0scz1hLnJlZHVjZShmdW5jdGlvbihsLGQpe3ZhciBjPSR5KGUsZCxyKTtyZXR1cm4gbC50b3A9Qm4oYy50b3AsbC50b3ApLGwucmlnaHQ9em8oYy5yaWdodCxsLnJpZ2h0KSxsLmJvdHRvbT16byhjLmJvdHRvbSxsLmJvdHRvbSksbC5sZWZ0PUJuKGMubGVmdCxsLmxlZnQpLGx9LCR5KGUsaSxyKSk7cmV0dXJuIHMud2lkdGg9cy5yaWdodC1zLmxlZnQscy5oZWlnaHQ9cy5ib3R0b20tcy50b3Ascy54PXMubGVmdCxzLnk9cy50b3Asc31mdW5jdGlvbiBKaShlKXt2YXIgdD1lLnJlZmVyZW5jZSxuPWUuZWxlbWVudCxyPWUucGxhY2VtZW50LG89cj93dChyKTpudWxsLGE9cj9ObihyKTpudWxsLGk9dC54K3Qud2lkdGgvMi1uLndpZHRoLzIscz10LnkrdC5oZWlnaHQvMi1uLmhlaWdodC8yLGw7c3dpdGNoKG8pe2Nhc2Ugb3Q6bD17eDppLHk6dC55LW4uaGVpZ2h0fTticmVhaztjYXNlIGh0Omw9e3g6aSx5OnQueSt0LmhlaWdodH07YnJlYWs7Y2FzZSB1dDpsPXt4OnQueCt0LndpZHRoLHk6c307YnJlYWs7Y2FzZSBsdDpsPXt4OnQueC1uLndpZHRoLHk6c307YnJlYWs7ZGVmYXVsdDpsPXt4OnQueCx5OnQueX19dmFyIGQ9bz8kbyhvKTpudWxsO2lmKGQhPW51bGwpe3ZhciBjPWQ9PT0ieSI/ImhlaWdodCI6IndpZHRoIjtzd2l0Y2goYSl7Y2FzZSBFcjpsW2RdPWxbZF0tKHRbY10vMi1uW2NdLzIpO2JyZWFrO2Nhc2UgVW86bFtkXT1sW2RdKyh0W2NdLzItbltjXS8yKTticmVhaztkZWZhdWx0On19cmV0dXJuIGx9ZnVuY3Rpb24gR24oZSx0KXt0PT09dm9pZCAwJiYodD17fSk7dmFyIG49dCxyPW4ucGxhY2VtZW50LG89cj09PXZvaWQgMD9lLnBsYWNlbWVudDpyLGE9bi5zdHJhdGVneSxpPWE9PT12b2lkIDA/ZS5zdHJhdGVneTphLHM9bi5ib3VuZGFyeSxsPXM9PT12b2lkIDA/T3k6cyxkPW4ucm9vdEJvdW5kYXJ5LGM9ZD09PXZvaWQgMD9sZDpkLHA9bi5lbGVtZW50Q29udGV4dCx1PXA9PT12b2lkIDA/UmE6cCxmPW4uYWx0Qm91bmRhcnksdj1mPT09dm9pZCAwPyExOmYsdz1uLnBhZGRpbmcsYj13PT09dm9pZCAwPzA6dyxnPXFpKHR5cGVvZiBiIT0ibnVtYmVyIj9iOlFpKGIsc28pKSxtPXU9PT1SYT9JeTpSYSx5PWUucmVjdHMucG9wcGVyLGg9ZS5lbGVtZW50c1t2P206dV0seD1VcChTbihoKT9oOmguY29udGV4dEVsZW1lbnR8fEV0KGUuZWxlbWVudHMucG9wcGVyKSxsLGMsaSksRT1FbihlLmVsZW1lbnRzLnJlZmVyZW5jZSksVD1KaSh7cmVmZXJlbmNlOkUsZWxlbWVudDp5LHN0cmF0ZWd5OiJhYnNvbHV0ZSIscGxhY2VtZW50Om99KSxEPXphKE9iamVjdC5hc3NpZ24oe30seSxUKSksQT11PT09UmE/RDpFLF89e3RvcDp4LnRvcC1BLnRvcCtnLnRvcCxib3R0b206QS5ib3R0b20teC5ib3R0b20rZy5ib3R0b20sbGVmdDp4LmxlZnQtQS5sZWZ0K2cubGVmdCxyaWdodDpBLnJpZ2h0LXgucmlnaHQrZy5yaWdodH0sST1lLm1vZGlmaWVyc0RhdGEub2Zmc2V0O2lmKHU9PT1SYSYmSSl7dmFyIE09SVtvXTtPYmplY3Qua2V5cyhfKS5mb3JFYWNoKGZ1bmN0aW9uKFApe3ZhciB6PVt1dCxodF0uaW5kZXhPZihQKT49MD8xOi0xLEI9W290LGh0XS5pbmRleE9mKFApPj0wPyJ5IjoieCI7X1tQXSs9TVtCXSp6fSl9cmV0dXJuIF99ZnVuY3Rpb24genAoZSx0KXt0PT09dm9pZCAwJiYodD17fSk7dmFyIG49dCxyPW4ucGxhY2VtZW50LG89bi5ib3VuZGFyeSxhPW4ucm9vdEJvdW5kYXJ5LGk9bi5wYWRkaW5nLHM9bi5mbGlwVmFyaWF0aW9ucyxsPW4uYWxsb3dlZEF1dG9QbGFjZW1lbnRzLGQ9bD09PXZvaWQgMD9kZDpsLGM9Tm4ocikscD1jP3M/TXA6TXAuZmlsdGVyKGZ1bmN0aW9uKHYpe3JldHVybiBObih2KT09PWN9KTpzbyx1PXAuZmlsdGVyKGZ1bmN0aW9uKHYpe3JldHVybiBkLmluZGV4T2Yodik+PTB9KTt1Lmxlbmd0aD09PTAmJih1PXApO3ZhciBmPXUucmVkdWNlKGZ1bmN0aW9uKHYsdyl7cmV0dXJuIHZbd109R24oZSx7cGxhY2VtZW50OncsYm91bmRhcnk6byxyb290Qm91bmRhcnk6YSxwYWRkaW5nOml9KVt3dCh3KV0sdn0se30pO3JldHVybiBPYmplY3Qua2V5cyhmKS5zb3J0KGZ1bmN0aW9uKHYsdyl7cmV0dXJuIGZbdl0tZlt3XX0pfWZ1bmN0aW9uIHZFKGUpe2lmKHd0KGUpPT09c2QpcmV0dXJuW107dmFyIHQ9VWEoZSk7cmV0dXJuW3VkKGUpLHQsdWQodCldfWZ1bmN0aW9uIHlFKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1lLm5hbWU7aWYoIXQubW9kaWZpZXJzRGF0YVtyXS5fc2tpcCl7Zm9yKHZhciBvPW4ubWFpbkF4aXMsYT1vPT09dm9pZCAwPyEwOm8saT1uLmFsdEF4aXMscz1pPT09dm9pZCAwPyEwOmksbD1uLmZhbGxiYWNrUGxhY2VtZW50cyxkPW4ucGFkZGluZyxjPW4uYm91bmRhcnkscD1uLnJvb3RCb3VuZGFyeSx1PW4uYWx0Qm91bmRhcnksZj1uLmZsaXBWYXJpYXRpb25zLHY9Zj09PXZvaWQgMD8hMDpmLHc9bi5hbGxvd2VkQXV0b1BsYWNlbWVudHMsYj10Lm9wdGlvbnMucGxhY2VtZW50LGc9d3QoYiksbT1nPT09Yix5PWx8fChtfHwhdj9bVWEoYildOnZFKGIpKSxoPVtiXS5jb25jYXQoeSkucmVkdWNlKGZ1bmN0aW9uKFgsUSl7cmV0dXJuIFguY29uY2F0KHd0KFEpPT09c2Q/enAodCx7cGxhY2VtZW50OlEsYm91bmRhcnk6Yyxyb290Qm91bmRhcnk6cCxwYWRkaW5nOmQsZmxpcFZhcmlhdGlvbnM6dixhbGxvd2VkQXV0b1BsYWNlbWVudHM6d30pOlEpfSxbXSkseD10LnJlY3RzLnJlZmVyZW5jZSxFPXQucmVjdHMucG9wcGVyLFQ9bmV3IE1hcCxEPSEwLEE9aFswXSxfPTA7XzxoLmxlbmd0aDtfKyspe3ZhciBJPWhbX10sTT13dChJKSxQPU5uKEkpPT09RXIsej1bb3QsaHRdLmluZGV4T2YoTSk+PTAsQj16PyJ3aWR0aCI6ImhlaWdodCIsVz1Hbih0LHtwbGFjZW1lbnQ6SSxib3VuZGFyeTpjLHJvb3RCb3VuZGFyeTpwLGFsdEJvdW5kYXJ5OnUscGFkZGluZzpkfSksc2U9ej9QP3V0Omx0OlA/aHQ6b3Q7eFtCXT5FW0JdJiYoc2U9VWEoc2UpKTt2YXIgTz1VYShzZSksJD1bXTtpZihhJiYkLnB1c2goV1tNXTw9MCkscyYmJC5wdXNoKFdbc2VdPD0wLFdbT108PTApLCQuZXZlcnkoZnVuY3Rpb24oWCl7cmV0dXJuIFh9KSl7QT1JLEQ9ITE7YnJlYWt9VC5zZXQoSSwkKX1pZihEKWZvcih2YXIgTj12PzM6MSxTPWZ1bmN0aW9uKFEpe3ZhciBaPWguZmluZChmdW5jdGlvbihxKXt2YXIgcmU9VC5nZXQocSk7aWYocmUpcmV0dXJuIHJlLnNsaWNlKDAsUSkuZXZlcnkoZnVuY3Rpb24ocGUpe3JldHVybiBwZX0pfSk7aWYoWilyZXR1cm4gQT1aLCJicmVhayJ9LFI9TjtSPjA7Ui0tKXt2YXIgRj1TKFIpO2lmKEY9PT0iYnJlYWsiKWJyZWFrfXQucGxhY2VtZW50IT09QSYmKHQubW9kaWZpZXJzRGF0YVtyXS5fc2tpcD0hMCx0LnBsYWNlbWVudD1BLHQucmVzZXQ9ITApfX12YXIgV3k9e25hbWU6ImZsaXAiLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOnlFLHJlcXVpcmVzSWZFeGlzdHM6WyJvZmZzZXQiXSxkYXRhOntfc2tpcDohMX19O2Z1bmN0aW9uIEJ5KGUsdCxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49e3g6MCx5OjB9KSx7dG9wOmUudG9wLXQuaGVpZ2h0LW4ueSxyaWdodDplLnJpZ2h0LXQud2lkdGgrbi54LGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCtuLnksbGVmdDplLmxlZnQtdC53aWR0aC1uLnh9fWZ1bmN0aW9uIEh5KGUpe3JldHVybltvdCx1dCxodCxsdF0uc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZVt0XT49MH0pfWZ1bmN0aW9uIHdFKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm5hbWUscj10LnJlY3RzLnJlZmVyZW5jZSxvPXQucmVjdHMucG9wcGVyLGE9dC5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdyxpPUduKHQse2VsZW1lbnRDb250ZXh0OiJyZWZlcmVuY2UifSkscz1Hbih0LHthbHRCb3VuZGFyeTohMH0pLGw9QnkoaSxyKSxkPUJ5KHMsbyxhKSxjPUh5KGwpLHA9SHkoZCk7dC5tb2RpZmllcnNEYXRhW25dPXtyZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6bCxwb3BwZXJFc2NhcGVPZmZzZXRzOmQsaXNSZWZlcmVuY2VIaWRkZW46YyxoYXNQb3BwZXJFc2NhcGVkOnB9LHQuYXR0cmlidXRlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LmF0dHJpYnV0ZXMucG9wcGVyLHsiZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbiI6YywiZGF0YS1wb3BwZXItZXNjYXBlZCI6cH0pfXZhciBHeT17bmFtZToiaGlkZSIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIscmVxdWlyZXNJZkV4aXN0czpbInByZXZlbnRPdmVyZmxvdyJdLGZuOndFfTtmdW5jdGlvbiBiRShlLHQsbil7dmFyIHI9d3QoZSksbz1bbHQsb3RdLmluZGV4T2Yocik+PTA/LTE6MSxhPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oT2JqZWN0LmFzc2lnbih7fSx0LHtwbGFjZW1lbnQ6ZX0pKTpuLGk9YVswXSxzPWFbMV07cmV0dXJuIGk9aXx8MCxzPShzfHwwKSpvLFtsdCx1dF0uaW5kZXhPZihyKT49MD97eDpzLHk6aX06e3g6aSx5OnN9fWZ1bmN0aW9uIGtFKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1lLm5hbWUsbz1uLm9mZnNldCxhPW89PT12b2lkIDA/WzAsMF06byxpPWRkLnJlZHVjZShmdW5jdGlvbihjLHApe3JldHVybiBjW3BdPWJFKHAsdC5yZWN0cyxhKSxjfSx7fSkscz1pW3QucGxhY2VtZW50XSxsPXMueCxkPXMueTt0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyE9bnVsbCYmKHQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLngrPWwsdC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSs9ZCksdC5tb2RpZmllcnNEYXRhW3JdPWl9dmFyIGp5PXtuYW1lOiJvZmZzZXQiLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLHJlcXVpcmVzOlsicG9wcGVyT2Zmc2V0cyJdLGZuOmtFfTtmdW5jdGlvbiB4RShlKXt2YXIgdD1lLnN0YXRlLG49ZS5uYW1lO3QubW9kaWZpZXJzRGF0YVtuXT1KaSh7cmVmZXJlbmNlOnQucmVjdHMucmVmZXJlbmNlLGVsZW1lbnQ6dC5yZWN0cy5wb3BwZXIsc3RyYXRlZ3k6ImFic29sdXRlIixwbGFjZW1lbnQ6dC5wbGFjZW1lbnR9KX12YXIgVnk9e25hbWU6InBvcHBlck9mZnNldHMiLGVuYWJsZWQ6ITAscGhhc2U6InJlYWQiLGZuOnhFLGRhdGE6e319O2Z1bmN0aW9uIEZwKGUpe3JldHVybiBlPT09IngiPyJ5IjoieCJ9ZnVuY3Rpb24gU0UoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPWUubmFtZSxvPW4ubWFpbkF4aXMsYT1vPT09dm9pZCAwPyEwOm8saT1uLmFsdEF4aXMscz1pPT09dm9pZCAwPyExOmksbD1uLmJvdW5kYXJ5LGQ9bi5yb290Qm91bmRhcnksYz1uLmFsdEJvdW5kYXJ5LHA9bi5wYWRkaW5nLHU9bi50ZXRoZXIsZj11PT09dm9pZCAwPyEwOnUsdj1uLnRldGhlck9mZnNldCx3PXY9PT12b2lkIDA/MDp2LGI9R24odCx7Ym91bmRhcnk6bCxyb290Qm91bmRhcnk6ZCxwYWRkaW5nOnAsYWx0Qm91bmRhcnk6Y30pLGc9d3QodC5wbGFjZW1lbnQpLG09Tm4odC5wbGFjZW1lbnQpLHk9IW0saD0kbyhnKSx4PUZwKGgpLEU9dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsVD10LnJlY3RzLnJlZmVyZW5jZSxEPXQucmVjdHMucG9wcGVyLEE9dHlwZW9mIHc9PSJmdW5jdGlvbiI/dyhPYmplY3QuYXNzaWduKHt9LHQucmVjdHMse3BsYWNlbWVudDp0LnBsYWNlbWVudH0pKTp3LF89dHlwZW9mIEE9PSJudW1iZXIiP3ttYWluQXhpczpBLGFsdEF4aXM6QX06T2JqZWN0LmFzc2lnbih7bWFpbkF4aXM6MCxhbHRBeGlzOjB9LEEpLEk9dC5tb2RpZmllcnNEYXRhLm9mZnNldD90Lm1vZGlmaWVyc0RhdGEub2Zmc2V0W3QucGxhY2VtZW50XTpudWxsLE09e3g6MCx5OjB9O2lmKEUpe2lmKGEpe3ZhciBQLHo9aD09PSJ5Ij9vdDpsdCxCPWg9PT0ieSI/aHQ6dXQsVz1oPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsc2U9RVtoXSxPPXNlK2Jbel0sJD1zZS1iW0JdLE49Zj8tRFtXXS8yOjAsUz1tPT09RXI/VFtXXTpEW1ddLFI9bT09PUVyPy1EW1ddOi1UW1ddLEY9dC5lbGVtZW50cy5hcnJvdyxYPWYmJkY/Rm8oRik6e3dpZHRoOjAsaGVpZ2h0OjB9LFE9dC5tb2RpZmllcnNEYXRhWyJhcnJvdyNwZXJzaXN0ZW50Il0/dC5tb2RpZmllcnNEYXRhWyJhcnJvdyNwZXJzaXN0ZW50Il0ucGFkZGluZzpZaSgpLFo9UVt6XSxxPVFbQl0scmU9V28oMCxUW1ddLFhbV10pLHBlPXk/VFtXXS8yLU4tcmUtWi1fLm1haW5BeGlzOlMtcmUtWi1fLm1haW5BeGlzLGdlPXk/LVRbV10vMitOK3JlK3ErXy5tYWluQXhpczpSK3JlK3ErXy5tYWluQXhpcyxoZT10LmVsZW1lbnRzLmFycm93JiZIbih0LmVsZW1lbnRzLmFycm93KSxFZT1oZT9oPT09InkiP2hlLmNsaWVudFRvcHx8MDpoZS5jbGllbnRMZWZ0fHwwOjAsQWU9KFA9ST8uW2hdKSE9bnVsbD9QOjAsY2U9c2UrcGUtQWUtRWUsb2U9c2UrZ2UtQWUsSz1XbyhmP3pvKE8sY2UpOk8sc2UsZj9CbigkLG9lKTokKTtFW2hdPUssTVtoXT1LLXNlfWlmKHMpe3ZhciBmZSxWZT1oPT09IngiP290Omx0LG50PWg9PT0ieCI/aHQ6dXQsX2U9RVt4XSxqdD14PT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsT249X2UrYltWZV0sVnQ9X2UtYltudF0sSW49W290LGx0XS5pbmRleE9mKGcpIT09LTEsUHI9KGZlPUk/Llt4XSkhPW51bGw/ZmU6MCxRbj1Jbj9PbjpfZS1UW2p0XS1EW2p0XS1QcitfLmFsdEF4aXMsTHI9SW4/X2UrVFtqdF0rRFtqdF0tUHItXy5hbHRBeGlzOlZ0LHVyPWYmJkluP1B5KFFuLF9lLExyKTpXbyhmP1FuOk9uLF9lLGY/THI6VnQpO0VbeF09dXIsTVt4XT11ci1fZX10Lm1vZGlmaWVyc0RhdGFbcl09TX19dmFyIEt5PXtuYW1lOiJwcmV2ZW50T3ZlcmZsb3ciLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOlNFLHJlcXVpcmVzSWZFeGlzdHM6WyJvZmZzZXQiXX07ZnVuY3Rpb24gJHAoZSl7cmV0dXJue3Njcm9sbExlZnQ6ZS5zY3JvbGxMZWZ0LHNjcm9sbFRvcDplLnNjcm9sbFRvcH19ZnVuY3Rpb24gV3AoZSl7cmV0dXJuIGU9PT1RZShlKXx8IWd0KGUpP0JvKGUpOiRwKGUpfWZ1bmN0aW9uIEVFKGUpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1Ocih0LndpZHRoKS9lLm9mZnNldFdpZHRofHwxLHI9TnIodC5oZWlnaHQpL2Uub2Zmc2V0SGVpZ2h0fHwxO3JldHVybiBuIT09MXx8ciE9PTF9ZnVuY3Rpb24gQnAoZSx0LG4pe249PT12b2lkIDAmJihuPSExKTt2YXIgcj1ndCh0KSxvPWd0KHQpJiZFRSh0KSxhPUV0KHQpLGk9RW4oZSxvLG4pLHM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD17eDowLHk6MH07cmV0dXJuKHJ8fCFyJiYhbikmJigoeXQodCkhPT0iYm9keSJ8fEdvKGEpKSYmKHM9V3AodCkpLGd0KHQpPyhsPUVuKHQsITApLGwueCs9dC5jbGllbnRMZWZ0LGwueSs9dC5jbGllbnRUb3ApOmEmJihsLng9SG8oYSkpKSx7eDppLmxlZnQrcy5zY3JvbGxMZWZ0LWwueCx5OmkudG9wK3Muc2Nyb2xsVG9wLWwueSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodH19ZnVuY3Rpb24gTkUoZSl7dmFyIHQ9bmV3IE1hcCxuPW5ldyBTZXQscj1bXTtlLmZvckVhY2goZnVuY3Rpb24oYSl7dC5zZXQoYS5uYW1lLGEpfSk7ZnVuY3Rpb24gbyhhKXtuLmFkZChhLm5hbWUpO3ZhciBpPVtdLmNvbmNhdChhLnJlcXVpcmVzfHxbXSxhLnJlcXVpcmVzSWZFeGlzdHN8fFtdKTtpLmZvckVhY2goZnVuY3Rpb24ocyl7aWYoIW4uaGFzKHMpKXt2YXIgbD10LmdldChzKTtsJiZvKGwpfX0pLHIucHVzaChhKX1yZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGEpe24uaGFzKGEubmFtZSl8fG8oYSl9KSxyfWZ1bmN0aW9uIEhwKGUpe3ZhciB0PU5FKGUpO3JldHVybiBNeS5yZWR1Y2UoZnVuY3Rpb24obixyKXtyZXR1cm4gbi5jb25jYXQodC5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8ucGhhc2U9PT1yfSkpfSxbXSl9ZnVuY3Rpb24gR3AoZSl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR8fCh0PW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt0PXZvaWQgMCxuKGUoKSl9KX0pKSx0fX1mdW5jdGlvbiBqcChlKXt2YXIgdD1lLnJlZHVjZShmdW5jdGlvbihuLHIpe3ZhciBvPW5bci5uYW1lXTtyZXR1cm4gbltyLm5hbWVdPW8/T2JqZWN0LmFzc2lnbih7fSxvLHIse29wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxvLm9wdGlvbnMsci5vcHRpb25zKSxkYXRhOk9iamVjdC5hc3NpZ24oe30sby5kYXRhLHIuZGF0YSl9KTpyLG59LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIFl5PXtwbGFjZW1lbnQ6ImJvdHRvbSIsbW9kaWZpZXJzOltdLHN0cmF0ZWd5OiJhYnNvbHV0ZSJ9O2Z1bmN0aW9uIHF5KCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIXQuc29tZShmdW5jdGlvbihyKXtyZXR1cm4hKHImJnR5cGVvZiByLmdldEJvdW5kaW5nQ2xpZW50UmVjdD09ImZ1bmN0aW9uIil9KX1mdW5jdGlvbiBReShlKXtlPT09dm9pZCAwJiYoZT17fSk7dmFyIHQ9ZSxuPXQuZGVmYXVsdE1vZGlmaWVycyxyPW49PT12b2lkIDA/W106bixvPXQuZGVmYXVsdE9wdGlvbnMsYT1vPT09dm9pZCAwP1l5Om87cmV0dXJuIGZ1bmN0aW9uKHMsbCxkKXtkPT09dm9pZCAwJiYoZD1hKTt2YXIgYz17cGxhY2VtZW50OiJib3R0b20iLG9yZGVyZWRNb2RpZmllcnM6W10sb3B0aW9uczpPYmplY3QuYXNzaWduKHt9LFl5LGEpLG1vZGlmaWVyc0RhdGE6e30sZWxlbWVudHM6e3JlZmVyZW5jZTpzLHBvcHBlcjpsfSxhdHRyaWJ1dGVzOnt9LHN0eWxlczp7fX0scD1bXSx1PSExLGY9e3N0YXRlOmMsc2V0T3B0aW9uczpmdW5jdGlvbihnKXt2YXIgbT10eXBlb2YgZz09ImZ1bmN0aW9uIj9nKGMub3B0aW9ucyk6Zzt3KCksYy5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sYSxjLm9wdGlvbnMsbSksYy5zY3JvbGxQYXJlbnRzPXtyZWZlcmVuY2U6U24ocyk/bG8ocyk6cy5jb250ZXh0RWxlbWVudD9sbyhzLmNvbnRleHRFbGVtZW50KTpbXSxwb3BwZXI6bG8obCl9O3ZhciB5PUhwKGpwKFtdLmNvbmNhdChyLGMub3B0aW9ucy5tb2RpZmllcnMpKSk7cmV0dXJuIGMub3JkZXJlZE1vZGlmaWVycz15LmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4gaC5lbmFibGVkfSksdigpLGYudXBkYXRlKCl9LGZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXUpe3ZhciBnPWMuZWxlbWVudHMsbT1nLnJlZmVyZW5jZSx5PWcucG9wcGVyO2lmKHF5KG0seSkpe2MucmVjdHM9e3JlZmVyZW5jZTpCcChtLEhuKHkpLGMub3B0aW9ucy5zdHJhdGVneT09PSJmaXhlZCIpLHBvcHBlcjpGbyh5KX0sYy5yZXNldD0hMSxjLnBsYWNlbWVudD1jLm9wdGlvbnMucGxhY2VtZW50LGMub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKF8pe3JldHVybiBjLm1vZGlmaWVyc0RhdGFbXy5uYW1lXT1PYmplY3QuYXNzaWduKHt9LF8uZGF0YSl9KTtmb3IodmFyIGg9MDtoPGMub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7aCsrKXtpZihjLnJlc2V0PT09ITApe2MucmVzZXQ9ITEsaD0tMTtjb250aW51ZX12YXIgeD1jLm9yZGVyZWRNb2RpZmllcnNbaF0sRT14LmZuLFQ9eC5vcHRpb25zLEQ9VD09PXZvaWQgMD97fTpULEE9eC5uYW1lO3R5cGVvZiBFPT0iZnVuY3Rpb24iJiYoYz1FKHtzdGF0ZTpjLG9wdGlvbnM6RCxuYW1lOkEsaW5zdGFuY2U6Zn0pfHxjKX19fX0sdXBkYXRlOkdwKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe2YuZm9yY2VVcGRhdGUoKSxiKGMpfSl9KSxkZXN0cm95OmZ1bmN0aW9uKCl7dygpLHU9ITB9fTtpZighcXkocyxsKSlyZXR1cm4gZjtmLnNldE9wdGlvbnMoZCkudGhlbihmdW5jdGlvbihiKXshdSYmZC5vbkZpcnN0VXBkYXRlJiZkLm9uRmlyc3RVcGRhdGUoYil9KTtmdW5jdGlvbiB2KCl7Yy5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGc9Yi5uYW1lLG09Yi5vcHRpb25zLHk9bT09PXZvaWQgMD97fTptLGg9Yi5lZmZlY3Q7aWYodHlwZW9mIGg9PSJmdW5jdGlvbiIpe3ZhciB4PWgoe3N0YXRlOmMsbmFtZTpnLGluc3RhbmNlOmYsb3B0aW9uczp5fSksRT1mdW5jdGlvbigpe307cC5wdXNoKHh8fEUpfX0pfWZ1bmN0aW9uIHcoKXtwLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGIoKX0pLHA9W119cmV0dXJuIGZ9fXZhciBURT1bRnksVnksenksamksanksV3ksS3ksTHksR3ldLFZwPVF5KHtkZWZhdWx0TW9kaWZpZXJzOlRFfSk7dmFyIERFPSJ0aXBweS1ib3giLGl3PSJ0aXBweS1jb250ZW50IixBRT0idGlwcHktYmFja2Ryb3AiLHN3PSJ0aXBweS1hcnJvdyIsbHc9InRpcHB5LXN2Zy1hcnJvdyIsam89e3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0sZHc9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keX07ZnVuY3Rpb24gS3AoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciByPWVbdF07cmV0dXJuIHI/PyhBcnJheS5pc0FycmF5KG4pP25bdF06bil9cmV0dXJuIGV9ZnVuY3Rpb24gWnAoZSx0KXt2YXIgbj17fS50b1N0cmluZy5jYWxsKGUpO3JldHVybiBuLmluZGV4T2YoIltvYmplY3QiKT09PTAmJm4uaW5kZXhPZih0KyJdIik+LTF9ZnVuY3Rpb24gY3coZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZS5hcHBseSh2b2lkIDAsdCk6ZX1mdW5jdGlvbiBKeShlLHQpe2lmKHQ9PT0wKXJldHVybiBlO3ZhciBuO3JldHVybiBmdW5jdGlvbihyKXtjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShyKX0sdCl9fWZ1bmN0aW9uIF9FKGUpe3JldHVybiBlLnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gRmEoZSl7cmV0dXJuW10uY29uY2F0KGUpfWZ1bmN0aW9uIFh5KGUsdCl7ZS5pbmRleE9mKHQpPT09LTEmJmUucHVzaCh0KX1mdW5jdGlvbiBDRShlKXtyZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5pbmRleE9mKHQpPT09bn0pfWZ1bmN0aW9uIE9FKGUpe3JldHVybiBlLnNwbGl0KCItIilbMF19ZnVuY3Rpb24gaGQoZSl7cmV0dXJuW10uc2xpY2UuY2FsbChlKX1mdW5jdGlvbiBaeShlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbbl0hPT12b2lkIDAmJih0W25dPWVbbl0pLHR9LHt9KX1mdW5jdGlvbiBYaSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX1mdW5jdGlvbiBnZChlKXtyZXR1cm5bIkVsZW1lbnQiLCJGcmFnbWVudCJdLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIFpwKGUsdCl9KX1mdW5jdGlvbiBJRShlKXtyZXR1cm4gWnAoZSwiTm9kZUxpc3QiKX1mdW5jdGlvbiBNRShlKXtyZXR1cm4gWnAoZSwiTW91c2VFdmVudCIpfWZ1bmN0aW9uIFJFKGUpe3JldHVybiEhKGUmJmUuX3RpcHB5JiZlLl90aXBweS5yZWZlcmVuY2U9PT1lKX1mdW5jdGlvbiBQRShlKXtyZXR1cm4gZ2QoZSk/W2VdOklFKGUpP2hkKGUpOkFycmF5LmlzQXJyYXkoZSk/ZTpoZChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiBZcChlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihuKXtuJiYobi5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249dCsibXMiKX0pfWZ1bmN0aW9uIGV3KGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJm4uc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIix0KX0pfWZ1bmN0aW9uIExFKGUpe3ZhciB0LG49RmEoZSkscj1uWzBdO3JldHVybiByIT1udWxsJiYodD1yLm93bmVyRG9jdW1lbnQpIT1udWxsJiZ0LmJvZHk/ci5vd25lckRvY3VtZW50OmRvY3VtZW50fWZ1bmN0aW9uIFVFKGUsdCl7dmFyIG49dC5jbGllbnRYLHI9dC5jbGllbnRZO3JldHVybiBlLmV2ZXJ5KGZ1bmN0aW9uKG8pe3ZhciBhPW8ucG9wcGVyUmVjdCxpPW8ucG9wcGVyU3RhdGUscz1vLnByb3BzLGw9cy5pbnRlcmFjdGl2ZUJvcmRlcixkPU9FKGkucGxhY2VtZW50KSxjPWkubW9kaWZpZXJzRGF0YS5vZmZzZXQ7aWYoIWMpcmV0dXJuITA7dmFyIHA9ZD09PSJib3R0b20iP2MudG9wLnk6MCx1PWQ9PT0idG9wIj9jLmJvdHRvbS55OjAsZj1kPT09InJpZ2h0Ij9jLmxlZnQueDowLHY9ZD09PSJsZWZ0Ij9jLnJpZ2h0Lng6MCx3PWEudG9wLXIrcD5sLGI9ci1hLmJvdHRvbS11PmwsZz1hLmxlZnQtbitmPmwsbT1uLWEucmlnaHQtdj5sO3JldHVybiB3fHxifHxnfHxtfSl9ZnVuY3Rpb24gcXAoZSx0LG4pe3ZhciByPXQrIkV2ZW50TGlzdGVuZXIiO1sidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiXS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2Vbcl0obyxuKX0pfWZ1bmN0aW9uIHR3KGUsdCl7Zm9yKHZhciBuPXQ7bjspe3ZhciByO2lmKGUuY29udGFpbnMobikpcmV0dXJuITA7bj1uLmdldFJvb3ROb2RlPT1udWxsfHwocj1uLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDpyLmhvc3R9cmV0dXJuITF9dmFyIHJyPXtpc1RvdWNoOiExfSxudz0wO2Z1bmN0aW9uIHpFKCl7cnIuaXNUb3VjaHx8KHJyLmlzVG91Y2g9ITAsd2luZG93LnBlcmZvcm1hbmNlJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHV3KSl9ZnVuY3Rpb24gdXcoKXt2YXIgZT1wZXJmb3JtYW5jZS5ub3coKTtlLW53PDIwJiYocnIuaXNUb3VjaD0hMSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHV3KSksbnc9ZX1mdW5jdGlvbiBGRSgpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoUkUoZSkpe3ZhciB0PWUuX3RpcHB5O2UuYmx1ciYmIXQuc3RhdGUuaXNWaXNpYmxlJiZlLmJsdXIoKX19ZnVuY3Rpb24gJEUoKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix6RSxqbyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLEZFKX12YXIgV0U9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIsQkU9V0U/ISF3aW5kb3cubXNDcnlwdG86ITE7dmFyIEhFPXthbmltYXRlRmlsbDohMSxmb2xsb3dDdXJzb3I6ITEsaW5saW5lUG9zaXRpb25pbmc6ITEsc3RpY2t5OiExfSxHRT17YWxsb3dIVE1MOiExLGFuaW1hdGlvbjoiZmFkZSIsYXJyb3c6ITAsY29udGVudDoiIixpbmVydGlhOiExLG1heFdpZHRoOjM1MCxyb2xlOiJ0b29sdGlwIix0aGVtZToiIix6SW5kZXg6OTk5OX0sam49T2JqZWN0LmFzc2lnbih7YXBwZW5kVG86ZHcsYXJpYTp7Y29udGVudDoiYXV0byIsZXhwYW5kZWQ6ImF1dG8ifSxkZWxheTowLGR1cmF0aW9uOlszMDAsMjUwXSxnZXRSZWZlcmVuY2VDbGllbnRSZWN0Om51bGwsaGlkZU9uQ2xpY2s6ITAsaWdub3JlQXR0cmlidXRlczohMSxpbnRlcmFjdGl2ZTohMSxpbnRlcmFjdGl2ZUJvcmRlcjoyLGludGVyYWN0aXZlRGVib3VuY2U6MCxtb3ZlVHJhbnNpdGlvbjoiIixvZmZzZXQ6WzAsMTBdLG9uQWZ0ZXJVcGRhdGU6ZnVuY3Rpb24oKXt9LG9uQmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7fSxvbkNyZWF0ZTpmdW5jdGlvbigpe30sb25EZXN0cm95OmZ1bmN0aW9uKCl7fSxvbkhpZGRlbjpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSxvbk1vdW50OmZ1bmN0aW9uKCl7fSxvblNob3c6ZnVuY3Rpb24oKXt9LG9uU2hvd246ZnVuY3Rpb24oKXt9LG9uVHJpZ2dlcjpmdW5jdGlvbigpe30sb25VbnRyaWdnZXI6ZnVuY3Rpb24oKXt9LG9uQ2xpY2tPdXRzaWRlOmZ1bmN0aW9uKCl7fSxwbGFjZW1lbnQ6InRvcCIscGx1Z2luczpbXSxwb3BwZXJPcHRpb25zOnt9LHJlbmRlcjpudWxsLHNob3dPbkNyZWF0ZTohMSx0b3VjaDohMCx0cmlnZ2VyOiJtb3VzZWVudGVyIGZvY3VzIix0cmlnZ2VyVGFyZ2V0Om51bGx9LEhFLEdFKSxqRT1PYmplY3Qua2V5cyhqbiksVkU9ZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmtleXModCk7bi5mb3JFYWNoKGZ1bmN0aW9uKHIpe2puW3JdPXRbcl19KX07ZnVuY3Rpb24gcHcoZSl7dmFyIHQ9ZS5wbHVnaW5zfHxbXSxuPXQucmVkdWNlKGZ1bmN0aW9uKHIsbyl7dmFyIGE9by5uYW1lLGk9by5kZWZhdWx0VmFsdWU7aWYoYSl7dmFyIHM7clthXT1lW2FdIT09dm9pZCAwP2VbYV06KHM9am5bYV0pIT1udWxsP3M6aX1yZXR1cm4gcn0se30pO3JldHVybiBPYmplY3QuYXNzaWduKHt9LGUsbil9ZnVuY3Rpb24gS0UoZSx0KXt2YXIgbj10P09iamVjdC5rZXlzKHB3KE9iamVjdC5hc3NpZ24oe30sam4se3BsdWdpbnM6dH0pKSk6akUscj1uLnJlZHVjZShmdW5jdGlvbihvLGEpe3ZhciBpPShlLmdldEF0dHJpYnV0ZSgiZGF0YS10aXBweS0iK2EpfHwiIikudHJpbSgpO2lmKCFpKXJldHVybiBvO2lmKGE9PT0iY29udGVudCIpb1thXT1pO2Vsc2UgdHJ5e29bYV09SlNPTi5wYXJzZShpKX1jYXRjaHtvW2FdPWl9cmV0dXJuIG99LHt9KTtyZXR1cm4gcn1mdW5jdGlvbiBydyhlLHQpe3ZhciBuPU9iamVjdC5hc3NpZ24oe30sdCx7Y29udGVudDpjdyh0LmNvbnRlbnQsW2VdKX0sdC5pZ25vcmVBdHRyaWJ1dGVzP3t9OktFKGUsdC5wbHVnaW5zKSk7cmV0dXJuIG4uYXJpYT1PYmplY3QuYXNzaWduKHt9LGpuLmFyaWEsbi5hcmlhKSxuLmFyaWE9e2V4cGFuZGVkOm4uYXJpYS5leHBhbmRlZD09PSJhdXRvIj90LmludGVyYWN0aXZlOm4uYXJpYS5leHBhbmRlZCxjb250ZW50Om4uYXJpYS5jb250ZW50PT09ImF1dG8iP3QuaW50ZXJhY3RpdmU/bnVsbDoiZGVzY3JpYmVkYnkiOm4uYXJpYS5jb250ZW50fSxufXZhciBZRT1mdW5jdGlvbigpe3JldHVybiJpbm5lckhUTUwifTtmdW5jdGlvbiBKcChlLHQpe2VbWUUoKV09dH1mdW5jdGlvbiBvdyhlKXt2YXIgdD1YaSgpO3JldHVybiBlPT09ITA/dC5jbGFzc05hbWU9c3c6KHQuY2xhc3NOYW1lPWx3LGdkKGUpP3QuYXBwZW5kQ2hpbGQoZSk6SnAodCxlKSksdH1mdW5jdGlvbiBhdyhlLHQpe2dkKHQuY29udGVudCk/KEpwKGUsIiIpLGUuYXBwZW5kQ2hpbGQodC5jb250ZW50KSk6dHlwZW9mIHQuY29udGVudCE9ImZ1bmN0aW9uIiYmKHQuYWxsb3dIVE1MP0pwKGUsdC5jb250ZW50KTplLnRleHRDb250ZW50PXQuY29udGVudCl9ZnVuY3Rpb24gWHAoZSl7dmFyIHQ9ZS5maXJzdEVsZW1lbnRDaGlsZCxuPWhkKHQuY2hpbGRyZW4pO3JldHVybntib3g6dCxjb250ZW50Om4uZmluZChmdW5jdGlvbihyKXtyZXR1cm4gci5jbGFzc0xpc3QuY29udGFpbnMoaXcpfSksYXJyb3c6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyhzdyl8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKGx3KX0pLGJhY2tkcm9wOm4uZmluZChmdW5jdGlvbihyKXtyZXR1cm4gci5jbGFzc0xpc3QuY29udGFpbnMoQUUpfSl9fWZ1bmN0aW9uIGZ3KGUpe3ZhciB0PVhpKCksbj1YaSgpO24uY2xhc3NOYW1lPURFLG4uc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIiwiaGlkZGVuIiksbi5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt2YXIgcj1YaSgpO3IuY2xhc3NOYW1lPWl3LHIuc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIiwiaGlkZGVuIiksYXcocixlLnByb3BzKSx0LmFwcGVuZENoaWxkKG4pLG4uYXBwZW5kQ2hpbGQociksbyhlLnByb3BzLGUucHJvcHMpO2Z1bmN0aW9uIG8oYSxpKXt2YXIgcz1YcCh0KSxsPXMuYm94LGQ9cy5jb250ZW50LGM9cy5hcnJvdztpLnRoZW1lP2wuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIixpLnRoZW1lKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpLHR5cGVvZiBpLmFuaW1hdGlvbj09InN0cmluZyI/bC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uIixpLmFuaW1hdGlvbik6bC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uIiksaS5pbmVydGlhP2wuc2V0QXR0cmlidXRlKCJkYXRhLWluZXJ0aWEiLCIiKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1pbmVydGlhIiksbC5zdHlsZS5tYXhXaWR0aD10eXBlb2YgaS5tYXhXaWR0aD09Im51bWJlciI/aS5tYXhXaWR0aCsicHgiOmkubWF4V2lkdGgsaS5yb2xlP2wuc2V0QXR0cmlidXRlKCJyb2xlIixpLnJvbGUpOmwucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksKGEuY29udGVudCE9PWkuY29udGVudHx8YS5hbGxvd0hUTUwhPT1pLmFsbG93SFRNTCkmJmF3KGQsZS5wcm9wcyksaS5hcnJvdz9jP2EuYXJyb3chPT1pLmFycm93JiYobC5yZW1vdmVDaGlsZChjKSxsLmFwcGVuZENoaWxkKG93KGkuYXJyb3cpKSk6bC5hcHBlbmRDaGlsZChvdyhpLmFycm93KSk6YyYmbC5yZW1vdmVDaGlsZChjKX1yZXR1cm57cG9wcGVyOnQsb25VcGRhdGU6b319ZncuJCR0aXBweT0hMDt2YXIgcUU9MSxmZD1bXSxRcD1bXTtmdW5jdGlvbiBRRShlLHQpe3ZhciBuPXJ3KGUsT2JqZWN0LmFzc2lnbih7fSxqbixwdyhaeSh0KSkpKSxyLG8sYSxpPSExLHM9ITEsbD0hMSxkPSExLGMscCx1LGY9W10sdj1KeShjZSxuLmludGVyYWN0aXZlRGVib3VuY2UpLHcsYj1xRSsrLGc9bnVsbCxtPUNFKG4ucGx1Z2lucykseT17aXNFbmFibGVkOiEwLGlzVmlzaWJsZTohMSxpc0Rlc3Ryb3llZDohMSxpc01vdW50ZWQ6ITEsaXNTaG93bjohMX0saD17aWQ6YixyZWZlcmVuY2U6ZSxwb3BwZXI6WGkoKSxwb3BwZXJJbnN0YW5jZTpnLHByb3BzOm4sc3RhdGU6eSxwbHVnaW5zOm0sY2xlYXJEZWxheVRpbWVvdXRzOlFuLHNldFByb3BzOkxyLHNldENvbnRlbnQ6dXIsc2hvdzptZSxoaWRlOldlLGhpZGVXaXRoSW50ZXJhY3Rpdml0eTpidCxlbmFibGU6SW4sZGlzYWJsZTpQcix1bm1vdW50Ok1uLGRlc3Ryb3k6cHJ9O2lmKCFuLnJlbmRlcilyZXR1cm4gaDt2YXIgeD1uLnJlbmRlcihoKSxFPXgucG9wcGVyLFQ9eC5vblVwZGF0ZTtFLnNldEF0dHJpYnV0ZSgiZGF0YS10aXBweS1yb290IiwiIiksRS5pZD0idGlwcHktIitoLmlkLGgucG9wcGVyPUUsZS5fdGlwcHk9aCxFLl90aXBweT1oO3ZhciBEPW0ubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBDLmZuKGgpfSksQT1lLmhhc0F0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpO3JldHVybiBoZSgpLE4oKSxzZSgpLE8oIm9uQ3JlYXRlIixbaF0pLG4uc2hvd09uQ3JlYXRlJiZPbigpLEUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZnVuY3Rpb24oKXtoLnByb3BzLmludGVyYWN0aXZlJiZoLnN0YXRlLmlzVmlzaWJsZSYmaC5jbGVhckRlbGF5VGltZW91dHMoKX0pLEUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtoLnByb3BzLmludGVyYWN0aXZlJiZoLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPj0wJiZ6KCkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix2KX0pLGg7ZnVuY3Rpb24gXygpe3ZhciBDPWgucHJvcHMudG91Y2g7cmV0dXJuIEFycmF5LmlzQXJyYXkoQyk/QzpbQywwXX1mdW5jdGlvbiBJKCl7cmV0dXJuIF8oKVswXT09PSJob2xkIn1mdW5jdGlvbiBNKCl7dmFyIEM7cmV0dXJuISEoKEM9aC5wcm9wcy5yZW5kZXIpIT1udWxsJiZDLiQkdGlwcHkpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gd3x8ZX1mdW5jdGlvbiB6KCl7dmFyIEM9UCgpLnBhcmVudE5vZGU7cmV0dXJuIEM/TEUoQyk6ZG9jdW1lbnR9ZnVuY3Rpb24gQigpe3JldHVybiBYcChFKX1mdW5jdGlvbiBXKEMpe3JldHVybiBoLnN0YXRlLmlzTW91bnRlZCYmIWguc3RhdGUuaXNWaXNpYmxlfHxyci5pc1RvdWNofHxjJiZjLnR5cGU9PT0iZm9jdXMiPzA6S3AoaC5wcm9wcy5kZWxheSxDPzA6MSxqbi5kZWxheSl9ZnVuY3Rpb24gc2UoQyl7Qz09PXZvaWQgMCYmKEM9ITEpLEUuc3R5bGUucG9pbnRlckV2ZW50cz1oLnByb3BzLmludGVyYWN0aXZlJiYhQz8iIjoibm9uZSIsRS5zdHlsZS56SW5kZXg9IiIraC5wcm9wcy56SW5kZXh9ZnVuY3Rpb24gTyhDLFksYWUpe2lmKGFlPT09dm9pZCAwJiYoYWU9ITApLEQuZm9yRWFjaChmdW5jdGlvbihOZSl7TmVbQ10mJk5lW0NdLmFwcGx5KE5lLFkpfSksYWUpe3ZhciBSZTsoUmU9aC5wcm9wcylbQ10uYXBwbHkoUmUsWSl9fWZ1bmN0aW9uICQoKXt2YXIgQz1oLnByb3BzLmFyaWE7aWYoQy5jb250ZW50KXt2YXIgWT0iYXJpYS0iK0MuY29udGVudCxhZT1FLmlkLFJlPUZhKGgucHJvcHMudHJpZ2dlclRhcmdldHx8ZSk7UmUuZm9yRWFjaChmdW5jdGlvbihOZSl7dmFyIFJ0PU5lLmdldEF0dHJpYnV0ZShZKTtpZihoLnN0YXRlLmlzVmlzaWJsZSlOZS5zZXRBdHRyaWJ1dGUoWSxSdD9SdCsiICIrYWU6YWUpO2Vsc2V7dmFyIGhuPVJ0JiZSdC5yZXBsYWNlKGFlLCIiKS50cmltKCk7aG4/TmUuc2V0QXR0cmlidXRlKFksaG4pOk5lLnJlbW92ZUF0dHJpYnV0ZShZKX19KX19ZnVuY3Rpb24gTigpe2lmKCEoQXx8IWgucHJvcHMuYXJpYS5leHBhbmRlZCkpe3ZhciBDPUZhKGgucHJvcHMudHJpZ2dlclRhcmdldHx8ZSk7Qy5mb3JFYWNoKGZ1bmN0aW9uKFkpe2gucHJvcHMuaW50ZXJhY3RpdmU/WS5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGguc3RhdGUuaXNWaXNpYmxlJiZZPT09UCgpPyJ0cnVlIjoiZmFsc2UiKTpZLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpfSl9fWZ1bmN0aW9uIFMoKXt6KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix2KSxmZD1mZC5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEMhPT12fSl9ZnVuY3Rpb24gUihDKXtpZighKHJyLmlzVG91Y2gmJihsfHxDLnR5cGU9PT0ibW91c2Vkb3duIikpKXt2YXIgWT1DLmNvbXBvc2VkUGF0aCYmQy5jb21wb3NlZFBhdGgoKVswXXx8Qy50YXJnZXQ7aWYoIShoLnByb3BzLmludGVyYWN0aXZlJiZ0dyhFLFkpKSl7aWYoRmEoaC5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKS5zb21lKGZ1bmN0aW9uKGFlKXtyZXR1cm4gdHcoYWUsWSl9KSl7aWYocnIuaXNUb3VjaHx8aC5zdGF0ZS5pc1Zpc2libGUmJmgucHJvcHMudHJpZ2dlci5pbmRleE9mKCJjbGljayIpPj0wKXJldHVybn1lbHNlIE8oIm9uQ2xpY2tPdXRzaWRlIixbaCxDXSk7aC5wcm9wcy5oaWRlT25DbGljaz09PSEwJiYoaC5jbGVhckRlbGF5VGltZW91dHMoKSxoLmhpZGUoKSxzPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzPSExfSksaC5zdGF0ZS5pc01vdW50ZWR8fFooKSl9fX1mdW5jdGlvbiBGKCl7bD0hMH1mdW5jdGlvbiBYKCl7bD0hMX1mdW5jdGlvbiBRKCl7dmFyIEM9eigpO0MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixSLCEwKSxDLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixSLGpvKSxDLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLFgsam8pLEMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixGLGpvKX1mdW5jdGlvbiBaKCl7dmFyIEM9eigpO0MucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixSLCEwKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixSLGpvKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLFgsam8pLEMucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixGLGpvKX1mdW5jdGlvbiBxKEMsWSl7cGUoQyxmdW5jdGlvbigpeyFoLnN0YXRlLmlzVmlzaWJsZSYmRS5wYXJlbnROb2RlJiZFLnBhcmVudE5vZGUuY29udGFpbnMoRSkmJlkoKX0pfWZ1bmN0aW9uIHJlKEMsWSl7cGUoQyxZKX1mdW5jdGlvbiBwZShDLFkpe3ZhciBhZT1CKCkuYm94O2Z1bmN0aW9uIFJlKE5lKXtOZS50YXJnZXQ9PT1hZSYmKHFwKGFlLCJyZW1vdmUiLFJlKSxZKCkpfWlmKEM9PT0wKXJldHVybiBZKCk7cXAoYWUsInJlbW92ZSIscCkscXAoYWUsImFkZCIsUmUpLHA9UmV9ZnVuY3Rpb24gZ2UoQyxZLGFlKXthZT09PXZvaWQgMCYmKGFlPSExKTt2YXIgUmU9RmEoaC5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtSZS5mb3JFYWNoKGZ1bmN0aW9uKE5lKXtOZS5hZGRFdmVudExpc3RlbmVyKEMsWSxhZSksZi5wdXNoKHtub2RlOk5lLGV2ZW50VHlwZTpDLGhhbmRsZXI6WSxvcHRpb25zOmFlfSl9KX1mdW5jdGlvbiBoZSgpe0koKSYmKGdlKCJ0b3VjaHN0YXJ0IixBZSx7cGFzc2l2ZTohMH0pLGdlKCJ0b3VjaGVuZCIsb2Use3Bhc3NpdmU6ITB9KSksX0UoaC5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKGZ1bmN0aW9uKEMpe2lmKEMhPT0ibWFudWFsIilzd2l0Y2goZ2UoQyxBZSksQyl7Y2FzZSJtb3VzZWVudGVyIjpnZSgibW91c2VsZWF2ZSIsb2UpO2JyZWFrO2Nhc2UiZm9jdXMiOmdlKEJFPyJmb2N1c291dCI6ImJsdXIiLEspO2JyZWFrO2Nhc2UiZm9jdXNpbiI6Z2UoImZvY3Vzb3V0IixLKTticmVha319KX1mdW5jdGlvbiBFZSgpe2YuZm9yRWFjaChmdW5jdGlvbihDKXt2YXIgWT1DLm5vZGUsYWU9Qy5ldmVudFR5cGUsUmU9Qy5oYW5kbGVyLE5lPUMub3B0aW9ucztZLnJlbW92ZUV2ZW50TGlzdGVuZXIoYWUsUmUsTmUpfSksZj1bXX1mdW5jdGlvbiBBZShDKXt2YXIgWSxhZT0hMTtpZighKCFoLnN0YXRlLmlzRW5hYmxlZHx8ZmUoQyl8fHMpKXt2YXIgUmU9KChZPWMpPT1udWxsP3ZvaWQgMDpZLnR5cGUpPT09ImZvY3VzIjtjPUMsdz1DLmN1cnJlbnRUYXJnZXQsTigpLCFoLnN0YXRlLmlzVmlzaWJsZSYmTUUoQykmJmZkLmZvckVhY2goZnVuY3Rpb24oTmUpe3JldHVybiBOZShDKX0pLEMudHlwZT09PSJjbGljayImJihoLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPDB8fGkpJiZoLnByb3BzLmhpZGVPbkNsaWNrIT09ITEmJmguc3RhdGUuaXNWaXNpYmxlP2FlPSEwOk9uKEMpLEMudHlwZT09PSJjbGljayImJihpPSFhZSksYWUmJiFSZSYmVnQoQyl9fWZ1bmN0aW9uIGNlKEMpe3ZhciBZPUMudGFyZ2V0LGFlPVAoKS5jb250YWlucyhZKXx8RS5jb250YWlucyhZKTtpZighKEMudHlwZT09PSJtb3VzZW1vdmUiJiZhZSkpe3ZhciBSZT1qdCgpLmNvbmNhdChFKS5tYXAoZnVuY3Rpb24oTmUpe3ZhciBSdCxobj1OZS5fdGlwcHksWm89KFJ0PWhuLnBvcHBlckluc3RhbmNlKT09bnVsbD92b2lkIDA6UnQuc3RhdGU7cmV0dXJuIFpvP3twb3BwZXJSZWN0Ok5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHBvcHBlclN0YXRlOlpvLHByb3BzOm59Om51bGx9KS5maWx0ZXIoQm9vbGVhbik7VUUoUmUsQykmJihTKCksVnQoQykpfX1mdW5jdGlvbiBvZShDKXt2YXIgWT1mZShDKXx8aC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTAmJmk7aWYoIVkpe2lmKGgucHJvcHMuaW50ZXJhY3RpdmUpe2guaGlkZVdpdGhJbnRlcmFjdGl2aXR5KEMpO3JldHVybn1WdChDKX19ZnVuY3Rpb24gSyhDKXtoLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiZm9jdXNpbiIpPDAmJkMudGFyZ2V0IT09UCgpfHxoLnByb3BzLmludGVyYWN0aXZlJiZDLnJlbGF0ZWRUYXJnZXQmJkUuY29udGFpbnMoQy5yZWxhdGVkVGFyZ2V0KXx8VnQoQyl9ZnVuY3Rpb24gZmUoQyl7cmV0dXJuIHJyLmlzVG91Y2g/SSgpIT09Qy50eXBlLmluZGV4T2YoInRvdWNoIik+PTA6ITF9ZnVuY3Rpb24gVmUoKXtudCgpO3ZhciBDPWgucHJvcHMsWT1DLnBvcHBlck9wdGlvbnMsYWU9Qy5wbGFjZW1lbnQsUmU9Qy5vZmZzZXQsTmU9Qy5nZXRSZWZlcmVuY2VDbGllbnRSZWN0LFJ0PUMubW92ZVRyYW5zaXRpb24saG49TSgpP1hwKEUpLmFycm93Om51bGwsWm89TmU/e2dldEJvdW5kaW5nQ2xpZW50UmVjdDpOZSxjb250ZXh0RWxlbWVudDpOZS5jb250ZXh0RWxlbWVudHx8UCgpfTplLF9oPXtuYW1lOiIkJHRpcHB5IixlbmFibGVkOiEwLHBoYXNlOiJiZWZvcmVXcml0ZSIscmVxdWlyZXM6WyJjb21wdXRlU3R5bGVzIl0sZm46ZnVuY3Rpb24oRHMpe3ZhciBlYT1Ecy5zdGF0ZTtpZihNKCkpe3ZhciBseD1CKCksZWM9bHguYm94O1sicGxhY2VtZW50IiwicmVmZXJlbmNlLWhpZGRlbiIsImVzY2FwZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKEFzKXtBcz09PSJwbGFjZW1lbnQiP2VjLnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFjZW1lbnQiLGVhLnBsYWNlbWVudCk6ZWEuYXR0cmlidXRlcy5wb3BwZXJbImRhdGEtcG9wcGVyLSIrQXNdP2VjLnNldEF0dHJpYnV0ZSgiZGF0YS0iK0FzLCIiKTplYy5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtIitBcyl9KSxlYS5hdHRyaWJ1dGVzLnBvcHBlcj17fX19fSxibz1be25hbWU6Im9mZnNldCIsb3B0aW9uczp7b2Zmc2V0OlJlfX0se25hbWU6InByZXZlbnRPdmVyZmxvdyIsb3B0aW9uczp7cGFkZGluZzp7dG9wOjIsYm90dG9tOjIsbGVmdDo1LHJpZ2h0OjV9fX0se25hbWU6ImZsaXAiLG9wdGlvbnM6e3BhZGRpbmc6NX19LHtuYW1lOiJjb21wdXRlU3R5bGVzIixvcHRpb25zOnthZGFwdGl2ZTohUnR9fSxfaF07TSgpJiZobiYmYm8ucHVzaCh7bmFtZToiYXJyb3ciLG9wdGlvbnM6e2VsZW1lbnQ6aG4scGFkZGluZzozfX0pLGJvLnB1c2guYXBwbHkoYm8sWT8ubW9kaWZpZXJzfHxbXSksaC5wb3BwZXJJbnN0YW5jZT1WcChabyxFLE9iamVjdC5hc3NpZ24oe30sWSx7cGxhY2VtZW50OmFlLG9uRmlyc3RVcGRhdGU6dSxtb2RpZmllcnM6Ym99KSl9ZnVuY3Rpb24gbnQoKXtoLnBvcHBlckluc3RhbmNlJiYoaC5wb3BwZXJJbnN0YW5jZS5kZXN0cm95KCksaC5wb3BwZXJJbnN0YW5jZT1udWxsKX1mdW5jdGlvbiBfZSgpe3ZhciBDPWgucHJvcHMuYXBwZW5kVG8sWSxhZT1QKCk7aC5wcm9wcy5pbnRlcmFjdGl2ZSYmQz09PWR3fHxDPT09InBhcmVudCI/WT1hZS5wYXJlbnROb2RlOlk9Y3coQyxbYWVdKSxZLmNvbnRhaW5zKEUpfHxZLmFwcGVuZENoaWxkKEUpLGguc3RhdGUuaXNNb3VudGVkPSEwLFZlKCl9ZnVuY3Rpb24ganQoKXtyZXR1cm4gaGQoRS5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS10aXBweS1yb290XSIpKX1mdW5jdGlvbiBPbihDKXtoLmNsZWFyRGVsYXlUaW1lb3V0cygpLEMmJk8oIm9uVHJpZ2dlciIsW2gsQ10pLFEoKTt2YXIgWT1XKCEwKSxhZT1fKCksUmU9YWVbMF0sTmU9YWVbMV07cnIuaXNUb3VjaCYmUmU9PT0iaG9sZCImJk5lJiYoWT1OZSksWT9yPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoLnNob3coKX0sWSk6aC5zaG93KCl9ZnVuY3Rpb24gVnQoQyl7aWYoaC5jbGVhckRlbGF5VGltZW91dHMoKSxPKCJvblVudHJpZ2dlciIsW2gsQ10pLCFoLnN0YXRlLmlzVmlzaWJsZSl7WigpO3JldHVybn1pZighKGgucHJvcHMudHJpZ2dlci5pbmRleE9mKCJtb3VzZWVudGVyIik+PTAmJmgucHJvcHMudHJpZ2dlci5pbmRleE9mKCJjbGljayIpPj0wJiZbIm1vdXNlbGVhdmUiLCJtb3VzZW1vdmUiXS5pbmRleE9mKEMudHlwZSk+PTAmJmkpKXt2YXIgWT1XKCExKTtZP289c2V0VGltZW91dChmdW5jdGlvbigpe2guc3RhdGUuaXNWaXNpYmxlJiZoLmhpZGUoKX0sWSk6YT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtoLmhpZGUoKX0pfX1mdW5jdGlvbiBJbigpe2guc3RhdGUuaXNFbmFibGVkPSEwfWZ1bmN0aW9uIFByKCl7aC5oaWRlKCksaC5zdGF0ZS5pc0VuYWJsZWQ9ITF9ZnVuY3Rpb24gUW4oKXtjbGVhclRpbWVvdXQociksY2xlYXJUaW1lb3V0KG8pLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGEpfWZ1bmN0aW9uIExyKEMpe2lmKCFoLnN0YXRlLmlzRGVzdHJveWVkKXtPKCJvbkJlZm9yZVVwZGF0ZSIsW2gsQ10pLEVlKCk7dmFyIFk9aC5wcm9wcyxhZT1ydyhlLE9iamVjdC5hc3NpZ24oe30sWSxaeShDKSx7aWdub3JlQXR0cmlidXRlczohMH0pKTtoLnByb3BzPWFlLGhlKCksWS5pbnRlcmFjdGl2ZURlYm91bmNlIT09YWUuaW50ZXJhY3RpdmVEZWJvdW5jZSYmKFMoKSx2PUp5KGNlLGFlLmludGVyYWN0aXZlRGVib3VuY2UpKSxZLnRyaWdnZXJUYXJnZXQmJiFhZS50cmlnZ2VyVGFyZ2V0P0ZhKFkudHJpZ2dlclRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihSZSl7UmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KTphZS50cmlnZ2VyVGFyZ2V0JiZlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpLE4oKSxzZSgpLFQmJlQoWSxhZSksaC5wb3BwZXJJbnN0YW5jZSYmKFZlKCksanQoKS5mb3JFYWNoKGZ1bmN0aW9uKFJlKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoUmUuX3RpcHB5LnBvcHBlckluc3RhbmNlLmZvcmNlVXBkYXRlKX0pKSxPKCJvbkFmdGVyVXBkYXRlIixbaCxDXSl9fWZ1bmN0aW9uIHVyKEMpe2guc2V0UHJvcHMoe2NvbnRlbnQ6Q30pfWZ1bmN0aW9uIG1lKCl7dmFyIEM9aC5zdGF0ZS5pc1Zpc2libGUsWT1oLnN0YXRlLmlzRGVzdHJveWVkLGFlPSFoLnN0YXRlLmlzRW5hYmxlZCxSZT1yci5pc1RvdWNoJiYhaC5wcm9wcy50b3VjaCxOZT1LcChoLnByb3BzLmR1cmF0aW9uLDAsam4uZHVyYXRpb24pO2lmKCEoQ3x8WXx8YWV8fFJlKSYmIVAoKS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikmJihPKCJvblNob3ciLFtoXSwhMSksaC5wcm9wcy5vblNob3coaCkhPT0hMSkpe2lmKGguc3RhdGUuaXNWaXNpYmxlPSEwLE0oKSYmKEUuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLHNlKCksUSgpLGguc3RhdGUuaXNNb3VudGVkfHwoRS5zdHlsZS50cmFuc2l0aW9uPSJub25lIiksTSgpKXt2YXIgUnQ9QigpLGhuPVJ0LmJveCxabz1SdC5jb250ZW50O1lwKFtobixab10sMCl9dT1mdW5jdGlvbigpe3ZhciBibztpZighKCFoLnN0YXRlLmlzVmlzaWJsZXx8ZCkpe2lmKGQ9ITAsRS5vZmZzZXRIZWlnaHQsRS5zdHlsZS50cmFuc2l0aW9uPWgucHJvcHMubW92ZVRyYW5zaXRpb24sTSgpJiZoLnByb3BzLmFuaW1hdGlvbil7dmFyIFpkPUIoKSxEcz1aZC5ib3gsZWE9WmQuY29udGVudDtZcChbRHMsZWFdLE5lKSxldyhbRHMsZWFdLCJ2aXNpYmxlIil9JCgpLE4oKSxYeShRcCxoKSwoYm89aC5wb3BwZXJJbnN0YW5jZSk9PW51bGx8fGJvLmZvcmNlVXBkYXRlKCksTygib25Nb3VudCIsW2hdKSxoLnByb3BzLmFuaW1hdGlvbiYmTSgpJiZyZShOZSxmdW5jdGlvbigpe2guc3RhdGUuaXNTaG93bj0hMCxPKCJvblNob3duIixbaF0pfSl9fSxfZSgpfX1mdW5jdGlvbiBXZSgpe3ZhciBDPSFoLnN0YXRlLmlzVmlzaWJsZSxZPWguc3RhdGUuaXNEZXN0cm95ZWQsYWU9IWguc3RhdGUuaXNFbmFibGVkLFJlPUtwKGgucHJvcHMuZHVyYXRpb24sMSxqbi5kdXJhdGlvbik7aWYoIShDfHxZfHxhZSkmJihPKCJvbkhpZGUiLFtoXSwhMSksaC5wcm9wcy5vbkhpZGUoaCkhPT0hMSkpe2lmKGguc3RhdGUuaXNWaXNpYmxlPSExLGguc3RhdGUuaXNTaG93bj0hMSxkPSExLGk9ITEsTSgpJiYoRS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxTKCksWigpLHNlKCEwKSxNKCkpe3ZhciBOZT1CKCksUnQ9TmUuYm94LGhuPU5lLmNvbnRlbnQ7aC5wcm9wcy5hbmltYXRpb24mJihZcChbUnQsaG5dLFJlKSxldyhbUnQsaG5dLCJoaWRkZW4iKSl9JCgpLE4oKSxoLnByb3BzLmFuaW1hdGlvbj9NKCkmJnEoUmUsaC51bm1vdW50KTpoLnVubW91bnQoKX19ZnVuY3Rpb24gYnQoQyl7eigpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdiksWHkoZmQsdiksdihDKX1mdW5jdGlvbiBNbigpe2guc3RhdGUuaXNWaXNpYmxlJiZoLmhpZGUoKSxoLnN0YXRlLmlzTW91bnRlZCYmKG50KCksanQoKS5mb3JFYWNoKGZ1bmN0aW9uKEMpe0MuX3RpcHB5LnVubW91bnQoKX0pLEUucGFyZW50Tm9kZSYmRS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEUpLFFwPVFwLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQyE9PWh9KSxoLnN0YXRlLmlzTW91bnRlZD0hMSxPKCJvbkhpZGRlbiIsW2hdKSl9ZnVuY3Rpb24gcHIoKXtoLnN0YXRlLmlzRGVzdHJveWVkfHwoaC5jbGVhckRlbGF5VGltZW91dHMoKSxoLnVubW91bnQoKSxFZSgpLGRlbGV0ZSBlLl90aXBweSxoLnN0YXRlLmlzRGVzdHJveWVkPSEwLE8oIm9uRGVzdHJveSIsW2hdKSl9fWZ1bmN0aW9uIFppKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPWpuLnBsdWdpbnMuY29uY2F0KHQucGx1Z2luc3x8W10pOyRFKCk7dmFyIHI9T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVnaW5zOm59KSxvPVBFKGUpO2lmKDApdmFyIGEsaTt2YXIgcz1vLnJlZHVjZShmdW5jdGlvbihsLGQpe3ZhciBjPWQmJlFFKGQscik7cmV0dXJuIGMmJmwucHVzaChjKSxsfSxbXSk7cmV0dXJuIGdkKGUpP3NbMF06c31aaS5kZWZhdWx0UHJvcHM9am47Wmkuc2V0RGVmYXVsdFByb3BzPVZFO1ppLmN1cnJlbnRJbnB1dD1ycjt2YXIgWEw9T2JqZWN0LmFzc2lnbih7fSxqaSx7ZWZmZWN0OmZ1bmN0aW9uKHQpe3ZhciBuPXQuc3RhdGUscj17cG9wcGVyOntwb3NpdGlvbjpuLm9wdGlvbnMuc3RyYXRlZ3ksbGVmdDoiMCIsdG9wOiIwIixtYXJnaW46IjAifSxhcnJvdzp7cG9zaXRpb246ImFic29sdXRlIn0scmVmZXJlbmNlOnt9fTtPYmplY3QuYXNzaWduKG4uZWxlbWVudHMucG9wcGVyLnN0eWxlLHIucG9wcGVyKSxuLnN0eWxlcz1yLG4uZWxlbWVudHMuYXJyb3cmJk9iamVjdC5hc3NpZ24obi5lbGVtZW50cy5hcnJvdy5zdHlsZSxyLmFycm93KX19KTtaaS5zZXREZWZhdWx0UHJvcHMoe3JlbmRlcjpmd30pO3ZhciBlcz1aaTt2YXIgVG49VSh5ZSgpLDEpO3ZhciB5dz1VKGVlKCksMSksdnc9e3RoZW1lOiJkYXNoYm9hcmQiLGR1cmF0aW9uOlsxMjAsODBdLGFycm93OiEwLG9mZnNldDpbMCw4XX07ZnVuY3Rpb24gdHMoe2NvbnRlbnQ6ZSxwbGFjZW1lbnQ6dCxpbnRlcmFjdGl2ZTpuLGNoaWxkcmVuOnIsLi4ub30pe2xldCBhPSgwLFRuLnVzZVJlZikobnVsbCksaT0oMCxUbi51c2VSZWYpKG51bGwpO3JldHVybigwLFRuLnVzZUVmZmVjdCkoKCk9PntpZihhLmN1cnJlbnQpcmV0dXJuIGkuY3VycmVudD1lcyhhLmN1cnJlbnQsey4uLnZ3LGNvbnRlbnQ6ZXx8IiIscGxhY2VtZW50OnR8fCJ0b3AiLGludGVyYWN0aXZlOm58fCExLGFsbG93SFRNTDohMCwuLi5vfSksKCk9PntpLmN1cnJlbnQ/LmRlc3Ryb3koKSxpLmN1cnJlbnQ9bnVsbH19LFtdKSwoMCxUbi51c2VFZmZlY3QpKCgpPT57aS5jdXJyZW50JiZlIT1udWxsJiZpLmN1cnJlbnQuc2V0Q29udGVudChlKX0sW2VdKSwoMCx5dy5qc3gpKCJzcGFuIix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImlubGluZSJ9LGNoaWxkcmVuOnJ9KX1mdW5jdGlvbiBucyhlPXt9KXtsZXQgdD0oMCxUbi51c2VSZWYpKG51bGwpLG49KDAsVG4udXNlUmVmKSh7d2lkdGg6MCxoZWlnaHQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0pLHI9KDAsVG4udXNlUmVmKShudWxsKSxvPSgwLFRuLnVzZVJlZikoZS5oaWRlRGVsYXl8fDMwMCksYT0oMCxUbi51c2VSZWYpKG51bGwpO2Z1bmN0aW9uIGkoKXtyLmN1cnJlbnQmJihjbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9bnVsbCl9ZnVuY3Rpb24gcyhjLHApe2koKSxwIT09dm9pZCAwJiYoYS5jdXJyZW50PXApLHIuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57ci5jdXJyZW50PW51bGwsdC5jdXJyZW50Py5oaWRlKCksYS5jdXJyZW50JiZhLmN1cnJlbnQoKX0sYz8/by5jdXJyZW50KX0oMCxUbi51c2VFZmZlY3QpKCgpPT57dC5jdXJyZW50PWVzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHsuLi52dyxnZXRSZWZlcmVuY2VDbGllbnRSZWN0OigpPT5uLmN1cnJlbnQsdHJpZ2dlcjoibWFudWFsIixoaWRlT25DbGljazohMSxhbGxvd0hUTUw6ITAsaW50ZXJhY3RpdmU6ISFlLmludGVyYWN0aXZlLHBsYWNlbWVudDplLnBsYWNlbWVudHx8InRvcCIsYXBwZW5kVG86KCk9PmRvY3VtZW50LmJvZHksLi4uZX0pO2xldCBjLHA7aWYoZS5pbnRlcmFjdGl2ZSl7bGV0IHU9dC5jdXJyZW50LnBvcHBlcjtjPSgpPT5pKCkscD0oKT0+cygpLHUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsYyksdS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixwKX1yZXR1cm4oKT0+e2lmKGUuaW50ZXJhY3RpdmUmJnQuY3VycmVudCl7bGV0IHU9dC5jdXJyZW50LnBvcHBlcjtjJiZ1LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGMpLHAmJnUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIscCl9aSgpLHQuY3VycmVudD8uZGVzdHJveSgpLHQuY3VycmVudD1udWxsfX0sW10pO2Z1bmN0aW9uIGwoYyxwLHUsZil7aSgpO2xldCB2PXQuY3VycmVudDtpZighdilyZXR1cm47bi5jdXJyZW50PXt3aWR0aDowLGhlaWdodDowLHRvcDp1LHJpZ2h0OnAsYm90dG9tOnUsbGVmdDpwfSx2LnNldENvbnRlbnQoYyk7bGV0IHc9Znx8e30sYj13LnBsYWNlbWVudHx8di5wcm9wcy5wbGFjZW1lbnQ7YiE9PXYucHJvcHMucGxhY2VtZW50JiZ2LnNldFByb3BzKHtwbGFjZW1lbnQ6Yn0pO2xldCBnPXYucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkO2cmJmcuY2xhc3NMaXN0LnRvZ2dsZSgiYmVsb3ctY2hhcnQiLCEhdy5iZWxvd0NoYXJ0KSx2LnN0YXRlLmlzVmlzaWJsZT92LnBvcHBlckluc3RhbmNlPy51cGRhdGUoKTp2LnNob3coKX1mdW5jdGlvbiBkKCl7aSgpLHQuY3VycmVudD8uaGlkZSgpfXJldHVybntzaG93OmwsaGlkZTpkLHNjaGVkdWxlSGlkZTpzLGNhbmNlbFNjaGVkdWxlZEhpZGU6aX19dmFyIHJzPXtzZXR0aW5nczp7fSxjb250ZXh0Ont9fTtmdW5jdGlvbiB3dyhlKXtlLnNldHRpbmdzJiYocnMuc2V0dGluZ3M9ZS5zZXR0aW5ncyksZS5jb250ZXh0JiYocnMuY29udGV4dD1lLmNvbnRleHQpfWZ1bmN0aW9uIFBlKCl7cmV0dXJuIHJzLnNldHRpbmdzfWZ1bmN0aW9uIG9zKCl7cmV0dXJuIHJzLmNvbnRleHR9ZnVuY3Rpb24gVm8oZSx0KXtycy5zZXR0aW5nc1tlXT10fXZhciByTj0yNTA7ZnVuY3Rpb24gRG4oZSx0LHtpbmNsdWRlRG9uZTpuPSExLG1heE5vdGVzOnI9ck59PXt9KXtyZXR1cm4gdD9lLmdldFRhc2tEb21haW5UYXNrcyh0KTpvTihlLG4scil9YXN5bmMgZnVuY3Rpb24gb04oZSx0LG4pe2xldCByPW5ldyBTZXQsbz1bXTtmb3IgYXdhaXQobGV0IHMgb2YgYXdhaXQgZS5maWx0ZXJOb3Rlcyh7Z3JvdXA6InRhc2tMaXN0cyJ9LCJjaGFuZ2VkIikpaWYoISghcz8udXVpZHx8ci5oYXMocy51dWlkKSkmJihyLmFkZChzLnV1aWQpLG8ucHVzaChzKSxvLmxlbmd0aD49bikpYnJlYWs7ayhgW2FsbC1ub3Rlcy10YXNrc10gTm8gdGFzayBkb21haW4gXHUyMDE0IHNjYW5uaW5nICR7by5sZW5ndGh9IHRhc2stbGlzdCBub3RlcyBmb3IgdGFza3NgKTtsZXQgYT1hd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoby5tYXAocz0+ZS5nZXROb3RlVGFza3Moe3V1aWQ6cy51dWlkfSx7aW5jbHVkZURvbmU6dH0pKSksaT1bXTtmb3IobGV0IHM9MDtzPGEubGVuZ3RoO3MrPTEpe2xldCBsPWFbc10sZD1vW3NdO2lmKCFsfHxsLnN0YXR1cz09PSJyZWplY3RlZCIpe2soIlthbGwtbm90ZXMtdGFza3NdIGdldE5vdGVUYXNrcyBmYWlsZWQ6IixsPy5yZWFzb24pO2NvbnRpbnVlfWxldCBjPUFycmF5LmlzQXJyYXkobC52YWx1ZSk/bC52YWx1ZTpbXTtmb3IobGV0IHAgb2YgYylwPy51dWlkJiZpLnB1c2goey4uLnAsbm90ZU5hbWU6cC5ub3RlTmFtZXx8cC5ub3RlVGl0bGV8fHAubm90ZT8ubmFtZXx8ZC5uYW1lfHxudWxsLG5vdGVVVUlEOnAubm90ZVVVSUR8fGQudXVpZH0pfXJldHVybiBrKGBbYWxsLW5vdGVzLXRhc2tzXSBHYXRoZXJlZCAke2kubGVuZ3RofSB0YXNrcyBhY3Jvc3MgYWxsIG5vdGVzIChubyB0YXNrIGRvbWFpbilgKSxpfWZ1bmN0aW9uIGR0KGUse3Rocm93T25JbnZhbGlkOnQ9ITB9PXt9KXtsZXQgbj0oKT0+e2lmKCF0KXJldHVybiBudWxsO3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGF0ZSBpbnB1dDogJHtTdHJpbmcoZSl9YCl9O2lmKGU9PW51bGx8fGU9PT0iIilyZXR1cm4gbigpO2lmKGUgaW5zdGFuY2VvZiBEYXRlKXtsZXQgbz1uZXcgRGF0ZShlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKG8uZ2V0VGltZSgpKT9uKCk6b31pZih0eXBlb2YgZT09Im51bWJlciIpe2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpcmV0dXJuIG4oKTtsZXQgbz1NYXRoLmFicyhlKTwxZTEwP2UqMWUzOmUsYT1uZXcgRGF0ZShvKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGEuZ2V0VGltZSgpKT9uKCk6YX1pZih0eXBlb2YgZT09InN0cmluZyIpe2xldCBvPWUudHJpbSgpO2lmKCFvKXJldHVybiBuKCk7aWYoL15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3QoZSkpe2xldFtzLGwsZF09ZS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpO3JldHVybiBuZXcgRGF0ZShzLGwtMSxkKX1sZXQgYT1OdW1iZXIobyk7aWYoIU51bWJlci5pc05hTihhKSlyZXR1cm4gZHQoYSx7dGhyb3dPbkludmFsaWQ6dH0pO2xldCBpPW5ldyBEYXRlKG8pO3JldHVybiBOdW1iZXIuaXNOYU4oaS5nZXRUaW1lKCkpP24oKTppfWxldCByPW5ldyBEYXRlKGUpO3JldHVybiBOdW1iZXIuaXNOYU4oci5nZXRUaW1lKCkpP24oKTpyfWZ1bmN0aW9uIEFuKGUpe2xldCB0PWR0KGUpLG49dC5nZXRGdWxsWWVhcigpLHI9U3RyaW5nKHQuZ2V0TW9udGgoKSsxKS5wYWRTdGFydCgyLCIwIiksbz1TdHJpbmcodC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gJHtufS0ke3J9LSR7b31gfWZ1bmN0aW9uIHplKGUpe3JldHVybiBBbihlKX1mdW5jdGlvbiBfbihlLHQ9MSl7bGV0IG49ZHQoZSksbz0obi5nZXREYXkoKS10KzcpJTcsYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLW8pO3JldHVybiBhLnNldEhvdXJzKDAsMCwwLDApLGF9ZnVuY3Rpb24gYncoZSx0PTEpe2xldCBuPV9uKGUsdCkscj1uZXcgRGF0ZShuKTtyZXR1cm4gci5zZXREYXRlKHIuZ2V0RGF0ZSgpKzYpLHIuc2V0SG91cnMoMjMsNTksNTksOTk5KSxyfWZ1bmN0aW9uIGt3KGUsdD0xKXtsZXQgbj1fbihlLHQpLHI9W107Zm9yKGxldCBvPTA7bzw3O28rKyl7bGV0IGE9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKStvKSxpPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkrbysxKTtyLnB1c2goe2Zyb206TWF0aC5mbG9vcihhLmdldFRpbWUoKS8xZTMpLHRvOk1hdGguZmxvb3IoaS5nZXRUaW1lKCkvMWUzKSxkYXRlS2V5OnplKGEpfSl9cmV0dXJue2JvdW5kYXJpZXM6cix3ZWVrU3RhcnRLZXk6emUobil9fWZ1bmN0aW9uIHh3KGUsdD0xKXtsZXQgbj1fbihlLHQpO3JldHVybiBBcnJheS5mcm9tKHtsZW5ndGg6N30sKHIsbyk9PntsZXQgYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpK28pO3JldHVybntkYXk6YS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHt3ZWVrZGF5OiJzaG9ydCJ9KSxkYXRlOmEudG9JU09TdHJpbmcoKSxkYXRlS2V5OnplKGEpfX0pfWZ1bmN0aW9uIHZkKGUpe3JldHVybiBlPT09InN1bmRheSI/MDoxfWZ1bmN0aW9uICRhKGUsdCl7cmV0dXJuIHQ9PT0iMjRoIj9gJHtTdHJpbmcoZSkucGFkU3RhcnQoMiwiMCIpfTowMGA6ZT09PTA/IjEyYW0iOmU8MTI/YCR7ZX1hbWA6ZT09PTEyPyIxMnBtIjpgJHtlLTEyfXBtYH1mdW5jdGlvbiBTdyhlLHQpe2xldCBuPU1hdGguZmxvb3IoZS82MCkscj1lJTYwO2lmKHQ9PT0iMjRoIilyZXR1cm5gJHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfToke1N0cmluZyhyKS5wYWRTdGFydCgyLCIwIil9YDtsZXQgbz1uPj0xMj8iUE0iOiJBTSI7cmV0dXJuYCR7bj09PTA/MTI6bj4xMj9uLTEyOm59OiR7U3RyaW5nKHIpLnBhZFN0YXJ0KDIsIjAiKX0gJHtvfWB9ZnVuY3Rpb24gRXcoZSl7cmV0dXJuIGR0KGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KX1mdW5jdGlvbiBhdChlLHQ9e30pe2lmKCEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cucGxhdXNpYmxlIT0iZnVuY3Rpb24iKSl0cnl7d2luZG93LnBsYXVzaWJsZSgiRGFzaGJvYXJkIEFjdGlvbiIse3Byb3BzOnthY3Rpb246ZSwuLi50fX0pfWNhdGNoKG4pe2soYFtQbGF1c2libGVdIEZhaWxlZCB0byBjYXB0dXJlIGRhc2hib2FyZCBhY3Rpb24gIiR7ZX0iOmAsbil9fWFzeW5jIGZ1bmN0aW9uIE53KGUsdCl7bGV0IG49bmV3IERhdGUscj1fbihuKSxvPWJ3KG4pLGE9UGUoKVtqLlRBU0tfRE9NQUlOU10saT17fTt0cnl7aT1hP0pTT04ucGFyc2UoYSk6e319Y2F0Y2h7aT17fX1pLnNlbGVjdGVkRG9tYWluVXVpZD10LGF3YWl0IGUuc2V0U2V0dGluZyhqLlRBU0tfRE9NQUlOUyxKU09OLnN0cmluZ2lmeShpKSk7bGV0IHM9YXdhaXQgc04oZSx0KTtyZXR1cm57dGFza3M6cyx0b2RheVRhc2tzOmxOKHMsbiksY29tcGxldGVkVGhpc1dlZWs6T3cocyxyLG8pLHdlZWtseVZpY3RvcnlWYWx1ZTpkTihzLHIsbyksZGFpbHlWaWN0b3J5VmFsdWVzOmNOKHMsciksYWN0aXZlVGFza0RvbWFpbjp0fX1mdW5jdGlvbiBhTihlLHQpe2xldCBuPUFycmF5LmlzQXJyYXkodCkscj1uP3QubGVuZ3RoOjAsbz10PT09bnVsbD8ibnVsbCI6QXJyYXkuaXNBcnJheSh0KT8iYXJyYXkiOnR5cGVvZiB0LGE9dCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhbj9PYmplY3Qua2V5cyh0KTpudWxsLGk7dHJ5e2k9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2h7aT1TdHJpbmcodCl9ayhgJHtlfSBnZXRUYXNrRG9tYWlucygpIHJldHVybmVkICR7cn0gZG9tYWlucyAodHlwZT0ke299JHthP2AsIGtleXM9WyR7YS5qb2luKCIsIil9XWA6IiJ9KWAse3Jhdzp0LHNlcmlhbGl6ZWQ6aX0pfWFzeW5jIGZ1bmN0aW9uIFR3KGUpe2soIltyZWZyZXNoVGFza0RvbWFpbnNdIFN0YXJ0aW5nIGRvbWFpbiByZWZyZXNoIik7bGV0IHQ9UGUoKVtqLlRBU0tfRE9NQUlOU107ayhgW3JlZnJlc2hUYXNrRG9tYWluc10gU3RvcmVkICR7ai5UQVNLX0RPTUFJTlN9IHNldHRpbmdgLHQpO2xldCBuPXt9O3RyeXtuPXQ/SlNPTi5wYXJzZSh0KTp7fX1jYXRjaChhKXtrKCJbcmVmcmVzaFRhc2tEb21haW5zXSBGYWlsZWQgdG8gcGFyc2Ugc3RvcmVkIHRhc2stZG9tYWlucyBzZXR0aW5nOyBzdGFydGluZyBmcmVzaCIse3Jhdzp0LGVycjphfSksbj17fX1sZXQgcjt0cnl7cj1hd2FpdCBlLmdldFRhc2tEb21haW5zKCl9Y2F0Y2goYSl7aygiW3JlZnJlc2hUYXNrRG9tYWluc10gZ2V0VGFza0RvbWFpbnMoKSB0aHJldyIsYSkscj1udWxsfXJldHVybiBhTigiW3JlZnJlc2hUYXNrRG9tYWluc10iLHIpLEFycmF5LmlzQXJyYXkocik/KG4uZG9tYWlucz1yLmZpbHRlcihhPT5hJiZhLnV1aWQpLm1hcChhPT4oe25hbWU6YS5uYW1lLHV1aWQ6YS51dWlkfSkpLG4ubGFzdFJldHJpZXZlZD1EYXRlLm5vdygpKTooaygiW3JlZnJlc2hUYXNrRG9tYWluc10gQVBJIHJldHVybmVkIG5vIHVzYWJsZSBkb21haW5zOyBrZWVwaW5nIHByZXZpb3VzbHkgc3RvcmVkIGRvbWFpbnMiKSxuLmRvbWFpbnM9QXJyYXkuaXNBcnJheShuLmRvbWFpbnMpP24uZG9tYWluczpbXSksbi5zZWxlY3RlZERvbWFpblV1aWQmJm4uZG9tYWlucy5zb21lKGE9PmEudXVpZD09PW4uc2VsZWN0ZWREb21haW5VdWlkKXx8KGsoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFByZXZpb3VzIHNlbGVjdGlvbiAke24uc2VsZWN0ZWREb21haW5VdWlkfSBubyBsb25nZXIgZXhpc3RzLCBwaWNraW5nIGRlZmF1bHRgKSxuLnNlbGVjdGVkRG9tYWluVXVpZD1pTihuLmRvbWFpbnMpKSxhd2FpdCBlLnNldFNldHRpbmcoai5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkobikpLGsoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFJlZnJlc2ggY29tcGxldGUgXHUyMDE0ICR7bi5kb21haW5zLmxlbmd0aH0gZG9tYWlucywgYWN0aXZlOiAke24uc2VsZWN0ZWREb21haW5VdWlkfWApLHtkb21haW5zOm4uZG9tYWlucyxhY3RpdmVUYXNrRG9tYWluOm4uc2VsZWN0ZWREb21haW5VdWlkfX1hc3luYyBmdW5jdGlvbiBEdyhlLHQpe2xldHtsYWJlbDpuLHllYXI6cixxdWFydGVyOm99PXQsYT1gJHtufSBQbGFuYCxpPVBlKClbai5QTEFOTklOR19OT1RFX1RBR118fFhsLHM9W0llLGldLGQ9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5OmF9KSkuZmluZCh1PT51Lm5hbWU9PT1hKTtpZihkKXJldHVybiBhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7ZC51dWlkfWApLHt1dWlkOmQudXVpZCxleGlzdGVkOiEwfTthdCgiY3JlYXRlUXVhcnRlcmx5UGxhbiIpO2xldCBjPWVmKG4sbykscD1hd2FpdCBlLmNyZWF0ZU5vdGUoYSxzKTtyZXR1cm4gYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpwfSxjKSxhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7cH1gKSx4biYmcD97ZGV2RWRpdDohMCxleGlzdGVkOiExLG5vdGVVVUlEOnB9Ont1dWlkOnAsZXhpc3RlZDohMX19YXN5bmMgZnVuY3Rpb24geWQoZSx0LG4pe2lmKCF0KXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCByPWF3YWl0IGUuZ2V0Tm90ZVNlY3Rpb25zKHt1dWlkOnR9KTtrKGBbZ2V0TW9udGhseVBsYW5Db250ZW50XSBub3RlVVVJRD0ke3R9IG1vbnRoTmFtZT0iJHtufSIgc2VjdGlvbnM6YCxyPy5tYXAocz0+cy5oZWFkaW5nPy50ZXh0KSk7bGV0IG89ci5maW5kKHM9PnMuaGVhZGluZyYmcy5oZWFkaW5nLnRleHQmJnMuaGVhZGluZy50ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09bi50b0xvd2VyQ2FzZSgpKTtpZihrKCJbZ2V0TW9udGhseVBsYW5Db250ZW50XSBtb250aFNlY3Rpb24gZm91bmQ6IiwhIW8pLCFvKXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCBhPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pLGk9TWEoYSxuKTtyZXR1cm4gayhgW2dldE1vbnRobHlQbGFuQ29udGVudF0gZXh0cmFjdGVkIGNvbnRlbnQgbGVuZ3RoOiAke2k/Lmxlbmd0aD8/MH1gKSx7Zm91bmQ6ITAsY29udGVudDppfHwiIn19YXN5bmMgZnVuY3Rpb24gQXcoZSx0LG4pe2xldHtsYWJlbDpyLHllYXI6byxxdWFydGVyOmF9PXQsaT1gJHtyfSBQbGFuYCxzPVBlKClbai5QTEFOTklOR19OT1RFX1RBR118fFhsLGw9W0llLHNdLGM9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Oml9KSkuZmluZChmPT5mLm5hbWU9PT1pKSxwO2lmKGMpcD1jLnV1aWQsYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpwfSxPcChuKSx7YXRFbmQ6ITB9KTtlbHNle2xldCBmPWVmKHIsYSk7YXQoImNyZWF0ZVF1YXJ0ZXJseVBsYW4iKSxwPWF3YWl0IGUuY3JlYXRlTm90ZShpLGwpLGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6cH0sZil9bGV0IHU9YXdhaXQgQ3coZSxwLG4pO3JldHVybntub3RlVVVJRDpwLGNvbnRlbnQ6dSxjcmVhdGVkOiFjfX1hc3luYyBmdW5jdGlvbiBfdyhlLHQsbil7bGV0e2xhYmVsOnIseWVhcjpvLHF1YXJ0ZXI6YX09dCxpPWAke3J9IFBsYW5gLHM9UGUoKVtqLlBMQU5OSU5HX05PVEVfVEFHXXx8WGwsbD1bSWUsc10sYz0oYXdhaXQgZS5maWx0ZXJOb3Rlcyh7cXVlcnk6aX0pKS5maW5kKGY9PmYubmFtZT09PWkpLHA7aWYoYylwPWMudXVpZCwoYXdhaXQgeWQoZSxwLG4pKS5mb3VuZHx8YXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpwfSxJcChuKSx7YXRFbmQ6ITB9KTtlbHNle2xldCBmPWVmKHIsYSk7cD1hd2FpdCBlLmNyZWF0ZU5vdGUoaSxsKSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOnB9LGYpLGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6cH0sSXAobikse2F0RW5kOiEwfSl9bGV0IHU9YXdhaXQgQ3coZSxwLG4pO3JldHVybntub3RlVVVJRDpwLGNvbnRlbnQ6dX19YXN5bmMgZnVuY3Rpb24gQ3coZSx0LG4se2F0dGVtcHRzOnI9MyxkZWxheU1zOm89NTAwfT17fSl7Zm9yKGxldCBhPTA7YTxyO2ErKyl7YT4wJiZhd2FpdCBuZXcgUHJvbWlzZShsPT5zZXRUaW1lb3V0KGwsbykpO2xldCBpPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pLHM9TWEoaSxuKTtpZihzKXJldHVybiBzfXJldHVybiBPcChuKS5zcGxpdChgCmApLmZpbHRlcihhPT5hJiYhYS5zdGFydHNXaXRoKCIjIikpLmpvaW4oYApgKX1mdW5jdGlvbiBpTihlKXtpZighZXx8ZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCB0PWUuZmluZChuPT5uLm5hbWU9PT0iV29yayIpO3JldHVybiB0P3QudXVpZDplWzBdLnV1aWR9YXN5bmMgZnVuY3Rpb24gc04oZSx0LG49ITEpe2xldCByPURhdGUubm93KCksbz1hd2FpdCBEbihlLHQse2luY2x1ZGVEb25lOm59KTtyZXR1cm4gayhgW19mZXRjaFRhc2tzRm9yRG9tYWluXSAke3Q/YGdldFRhc2tEb21haW5UYXNrcygke3R9KWA6ImFsbC1ub3RlcyBmYWxsYmFjayJ9IHJldHVybmVkICR7by5sZW5ndGh9IHRhc2tzIGluICR7RGF0ZS5ub3coKS1yfW1zYCksb31mdW5jdGlvbiBsTihlLHQpe2xldCBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLmdldFRpbWUoKSxyPW4rODY0ZTU7cmV0dXJuIGUuZmlsdGVyKG89PiFvLmNvbXBsZXRlZEF0JiYhby5kaXNtaXNzZWRBdCYmVm4oby5zdGFydEF0KSYmVm4oby5zdGFydEF0KT49biYmVm4oby5zdGFydEF0KTxyKS5zb3J0KChvLGEpPT4oVm4oby5zdGFydEF0KXx8MCktKFZuKGEuc3RhcnRBdCl8fDApKX1mdW5jdGlvbiBPdyhlLHQsbil7bGV0IHI9dC5nZXRUaW1lKCksbz1uLmdldFRpbWUoKTtyZXR1cm4gZS5maWx0ZXIoYT0+Vm4oYS5jb21wbGV0ZWRBdCkmJlZuKGEuY29tcGxldGVkQXQpPj1yJiZWbihhLmNvbXBsZXRlZEF0KTw9byl9ZnVuY3Rpb24gZE4oZSx0LG4pe3JldHVybiBPdyhlLHQsbikucmVkdWNlKChyLG8pPT5yKyhvLnZpY3RvcnlWYWx1ZXx8MCksMCl9ZnVuY3Rpb24gY04oZSx0KXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjd9LChyLG8pPT57bGV0IGE9bmV3IERhdGUodCk7YS5zZXREYXRlKGEuZ2V0RGF0ZSgpK28pO2xldCBpPW5ldyBEYXRlKGEpO2kuc2V0RGF0ZShpLmdldERhdGUoKSsxKTtsZXQgcz1lLmZpbHRlcihsPT5WbihsLmNvbXBsZXRlZEF0KSYmVm4obC5jb21wbGV0ZWRBdCk+PWEuZ2V0VGltZSgpJiZWbihsLmNvbXBsZXRlZEF0KTxpLmdldFRpbWUoKSk7cmV0dXJue2RheTpbIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdW29dLGRhdGU6YS50b0lTT1N0cmluZygpLHZhbHVlOnMucmVkdWNlKChsLGQpPT5sKyhkLnZpY3RvcnlWYWx1ZXx8MCksMCksdGFza0NvdW50OnMubGVuZ3RofX0pfWZ1bmN0aW9uIFZuKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIGUhPSJudW1iZXIiKXtsZXQgdD1OdW1iZXIoZSk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KT90PDFlMTA/dCoxZTM6dDpudWxsfXJldHVybiBlPDFlMTA/ZSoxZTM6ZX1mdW5jdGlvbiBlZihlLHQpe2xldCByPXsxOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giXSwyOlsiQXByaWwiLCJNYXkiLCJKdW5lIl0sMzpbIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiXSw0OlsiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXX1bdF18fFsiTW9udGggMSIsIk1vbnRoIDIiLCJNb250aCAzIl07cmV0dXJuYCMgUXVhcnRlciBUaGVtZQpbT25lIHNlbnRlbmNlIGRlc2NyaWJpbmcgdGhlIG1haW4gZm9jdXMgb2YgdGhpcyBxdWFydGVyLl0KCiMjIFN1Y2Nlc3MgTG9va3MgTGlrZQotIFsgXSBbVG9wIG91dGNvbWVdCi0gWyBdIFtUb3Agb3V0Y29tZV0KLSBbIF0gW1RvcCBvdXRjb21lXQoKIyBQcm9qZWN0cwoKIyMgW1Byb2plY3QgMV0KLSBPdXRjb21lOgotIFdoeSBub3c6Ci0gV2Vla2x5IHJoeXRobToKLSBEZWFkbGluZToKLSBDb25zdHJhaW50czoKLSBEb25lIGVub3VnaCB3aGVuOgoKIyMgW1Byb2plY3QgMl0KLSBPdXRjb21lOgotIFdoeSBub3c6Ci0gV2Vla2x5IHJoeXRobToKLSBEZWFkbGluZToKLSBDb25zdHJhaW50czoKLSBEb25lIGVub3VnaCB3aGVuOgoKIyMgW1Byb2plY3QgM10KLSBPdXRjb21lOgotIFdoeSBub3c6Ci0gV2Vla2x5IHJoeXRobToKLSBEZWFkbGluZToKLSBDb25zdHJhaW50czoKLSBEb25lIGVub3VnaCB3aGVuOgoKIyBOb3QgVGhpcyBRdWFydGVyCi0gWyBdIFtMb3dlci1wcmlvcml0eSBwcm9qZWN0XQotIFsgXSBbQ29tbWl0bWVudCB0byBkZWNsaW5lXQotIFsgXSBbQXJlYSB0byBpbnRlbnRpb25hbGx5IGlnbm9yZV0KCiMgRGF5LW9mLVdlZWsgQnJlYWtkb3duCkFueSBjYXRlZ29yeSBvZiB0YXNrIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgYmUgdGhlIGZvY3VzIGZvciBkaWZmZXJlbnQgZGF5cy1vZi13ZWVrIChzb21ldGltZXMgY2FsbGVkICJkYXkgc3RyaXBpbmciKT8KU2VwYXJhdGUgeW91ciB0YXNrIGNhdGVnb3JpZXMgd2l0aCBhIHNlbWljb2xvbiAoaS5lLiwgIjsiKS4gV2Ugd2lsbCBjb25zaWRlciB0aGVtIHdoZW4gcHJvcG9zaW5nIHBvc3NpYmxlIApkYWlseSBhZ2VuZGFzIGZyb20geW91ciBleGlzdGluZyB0YXNrcy4gIAoKLSBNb25kYXlzOiAKLSBUdWVzZGF5czogCi0gV2VkbmVzZGF5czogCi0gVGh1cnNkYXlzOiAKLSBGcmlkYXlzOiAKCltBbXBsZW5vdGUgbWVzc2FnZV0KWW91IGNhbiBhbHNvIGFkZCBTYXR1cmRheSBhbmQgU3VuZGF5IGlmIHlvdSBsaWtlOyB0aGV5J3JlIG5vdCBpbiB0aGUgbGlzdCBzaW5jZSBieSBkZWZhdWx0IGJlY2F1c2Ugd2Ugc3VzcGVjdCAKeW91J3JlIGJlc3Qgb2ZmIHByZXNlcnZpbmcgeW91ciB3ZWVrZW5kIGZvciB1bnBsYW5uZWQgZmFtaWx5ICYgcmVzdG9yYXRpb24gYWN0aXZpdGllcy4gICAKCiMgTW9udGgtYnktTW9udGggQnJlYWtkb3duCgojIyAke3JbMF19Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CgojIyAke3JbMV19Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CgojIyAke3JbMl19Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CgojIFdlZWtseSBQbGFubmluZyBQcm9tcHQKV2hpY2ggcHJvamVjdHMgbmVlZCB0aW1lIG9uIG15IGNhbGVuZGFyIHRoaXMgd2Vlaz8KCiMgUXVhcnRlcmx5IFJldmlldwotIEZpbmlzaGVkOgotIFByb2dyZXNzIG1hZGU6Ci0gTGVzc29ucyBsZWFybmVkOgotIENhcnJ5IGZvcndhcmQ6YH12YXIgV2E9VSh5ZSgpKTthc3luYyBmdW5jdGlvbiB3ZChlLHQpe3JldHVybiB4bj97ZGV2RWRpdDohMCxub3RlVVVJRDp0fTphd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dH1gKX1hc3luYyBmdW5jdGlvbiBJdyhlLHQpe3JldHVybiBhd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KX1hc3luYyBmdW5jdGlvbiBNdyhlLHQsbixyKXtyZXR1cm4gYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dH0sbixyKX12YXIgY289VShlZSgpKTtmdW5jdGlvbiB0Zih7YXBwOmUsbm90ZVVVSUQ6dCxvbkJhY2s6bn0pe2xldFtyLG9dPSgwLFdhLnVzZVN0YXRlKSgiIiksW2EsaV09KDAsV2EudXNlU3RhdGUpKCEwKSxbcyxsXT0oMCxXYS51c2VTdGF0ZSkoITEpOygwLFdhLnVzZUVmZmVjdCkoKCk9PntsZXQgYz0hMTtyZXR1cm4gSXcoZSx0KS50aGVuKHA9PntjfHwobyhwfHwiIiksaSghMSkpfSksKCk9PntjPSEwfX0sW3QsZV0pO2xldCBkPWFzeW5jKCk9PntsKCEwKSxhd2FpdCBNdyhlLHQsciksbCghMSl9O3JldHVybiBhPygwLGNvLmpzeCkoImRpdiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItbG9hZGluZyIsY2hpbGRyZW46IkxvYWRpbmcgbm90ZVx1MjAyNiJ9KTooMCxjby5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvciIsY2hpbGRyZW46WygwLGNvLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLXRvb2xiYXIiLGNoaWxkcmVuOlsoMCxjby5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLWJ0biBub3RlLWVkaXRvci1idG4tLWJhY2siLG9uQ2xpY2s6bixjaGlsZHJlbjoiXHUyMTkwIEJhY2sifSksKDAsY28uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1idG4gbm90ZS1lZGl0b3ItYnRuLS1zYXZlIixvbkNsaWNrOmQsZGlzYWJsZWQ6cyxjaGlsZHJlbjpzPyJTYXZpbmdcdTIwMjYiOiJTYXZlIn0pXX0pLCgwLGNvLmpzeCkoInRleHRhcmVhIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci10ZXh0YXJlYSIsdmFsdWU6cixvbkNoYW5nZTpjPT5vKGMudGFyZ2V0LnZhbHVlKX0pXX0pfXZhciBLbj1VKHllKCkpO2Z1bmN0aW9uIGFmKCl7cmV0dXJue2FzeW5jOiExLGJyZWFrczohMSxleHRlbnNpb25zOm51bGwsZ2ZtOiEwLGhvb2tzOm51bGwscGVkYW50aWM6ITEscmVuZGVyZXI6bnVsbCxzaWxlbnQ6ITEsdG9rZW5pemVyOm51bGwsd2Fsa1Rva2VuczpudWxsfX12YXIgWW89YWYoKTtmdW5jdGlvbiBGdyhlKXtZbz1lfXZhciBzcz17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gTGUoZSx0PSIiKXtsZXQgbj10eXBlb2YgZT09InN0cmluZyI/ZTplLnNvdXJjZSxyPXtyZXBsYWNlOihvLGEpPT57bGV0IGk9dHlwZW9mIGE9PSJzdHJpbmciP2E6YS5zb3VyY2U7cmV0dXJuIGk9aS5yZXBsYWNlKEJ0LmNhcmV0LCIkMSIpLG49bi5yZXBsYWNlKG8saSkscn0sZ2V0UmVnZXg6KCk9Pm5ldyBSZWdFeHAobix0KX07cmV0dXJuIHJ9dmFyIEJ0PXtjb2RlUmVtb3ZlSW5kZW50Oi9eKD86IHsxLDR9fCB7MCwzfVx0KS9nbSxvdXRwdXRMaW5rUmVwbGFjZTovXFwoW1xbXF1dKS9nLGluZGVudENvZGVDb21wZW5zYXRpb246L14oXHMrKSg/OmBgYCkvLGJlZ2lubmluZ1NwYWNlOi9eXHMrLyxlbmRpbmdIYXNoOi8jJC8sc3RhcnRpbmdTcGFjZUNoYXI6L14gLyxlbmRpbmdTcGFjZUNoYXI6LyAkLyxub25TcGFjZUNoYXI6L1teIF0vLG5ld0xpbmVDaGFyR2xvYmFsOi9cbi9nLHRhYkNoYXJHbG9iYWw6L1x0L2csbXVsdGlwbGVTcGFjZUdsb2JhbDovXHMrL2csYmxhbmtMaW5lOi9eWyBcdF0qJC8sZG91YmxlQmxhbmtMaW5lOi9cblsgXHRdKlxuWyBcdF0qJC8sYmxvY2txdW90ZVN0YXJ0Oi9eIHswLDN9Pi8sYmxvY2txdW90ZVNldGV4dFJlcGxhY2U6L1xuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxufCQpL2csYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOi9eIHswLDN9PlsgXHRdPy9nbSxsaXN0UmVwbGFjZVRhYnM6L15cdCsvLGxpc3RSZXBsYWNlTmVzdGluZzovXiB7MSw0fSg/PSggezR9KSpbXiBdKS9nLGxpc3RJc1Rhc2s6L15cW1sgeFhdXF0gLyxsaXN0UmVwbGFjZVRhc2s6L15cW1sgeFhdXF0gKy8sYW55TGluZTovXG4uKlxuLyxocmVmQnJhY2tldHM6L148KC4qKT4kLyx0YWJsZURlbGltaXRlcjovWzp8XS8sdGFibGVBbGlnbkNoYXJzOi9eXHx8XHwgKiQvZyx0YWJsZVJvd0JsYW5rTGluZTovXG5bIFx0XSokLyx0YWJsZUFsaWduUmlnaHQ6L14gKi0rOiAqJC8sdGFibGVBbGlnbkNlbnRlcjovXiAqOi0rOiAqJC8sdGFibGVBbGlnbkxlZnQ6L14gKjotKyAqJC8sc3RhcnRBVGFnOi9ePGEgL2ksZW5kQVRhZzovXjxcL2E+L2ksc3RhcnRQcmVTY3JpcHRUYWc6L148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2ksZW5kUHJlU2NyaXB0VGFnOi9ePFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2ksc3RhcnRBbmdsZUJyYWNrZXQ6L148LyxlbmRBbmdsZUJyYWNrZXQ6Lz4kLyxwZWRhbnRpY0hyZWZUaXRsZTovXihbXiciXSpbXlxzXSlccysoWyciXSkoLiopXDIvLHVuaWNvZGVBbHBoYU51bWVyaWM6L1tccHtMfVxwe059XS91LGVzY2FwZVRlc3Q6L1smPD4iJ10vLGVzY2FwZVJlcGxhY2U6L1smPD4iJ10vZyxlc2NhcGVUZXN0Tm9FbmNvZGU6L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLGVzY2FwZVJlcGxhY2VOb0VuY29kZTovWzw+IiddfCYoPyEoI1xkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFx3Kyk7KS9nLHVuZXNjYXBlVGVzdDovJigjKD86XGQrKXwoPzojeFswLTlBLUZhLWZdKyl8KD86XHcrKSk7Py9pZyxjYXJldDovKF58W15cW10pXF4vZyxwZXJjZW50RGVjb2RlOi8lMjUvZyxmaW5kUGlwZTovXHwvZyxzcGxpdFBpcGU6LyBcfC8sc2xhc2hQaXBlOi9cXFx8L2csY2FycmlhZ2VSZXR1cm46L1xyXG58XHIvZyxzcGFjZUxpbmU6L14gKyQvZ20sbm90U3BhY2VTdGFydDovXlxTKi8sZW5kaW5nTmV3bGluZTovXG4kLyxsaXN0SXRlbVJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4oIHswLDN9JHtlfSkoKD86WwkgXVteXFxuXSopPyg/OlxcbnwkKSlgKSxuZXh0QnVsbGV0UmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KD86WyorLV18XFxkezEsOX1bLildKSgoPzpbIAldW15cXG5dKik/KD86XFxufCQpKWApLGhyUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKWApLGZlbmNlc0JlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KD86XGBcYFxgfH5+filgKSxoZWFkaW5nQmVnaW5SZWdleDplPT5uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxlLTEpfX0jYCksaHRtbEJlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19PCg/OlthLXpdLio+fCEtLSlgLCJpIil9LHVOPS9eKD86WyBcdF0qKD86XG58JCkpKy8scE49L14oKD86IHs0fXwgezAsM31cdClbXlxuXSsoPzpcbig/OlsgXHRdKig/OlxufCQpKSopPykrLyxmTj0vXiB7MCwzfShgezMsfSg/PVteYFxuXSooPzpcbnwkKSl8fnszLH0pKFteXG5dKikoPzpcbnwkKSg/OnwoW1xzXFNdKj8pKD86XG58JCkpKD86IHswLDN9XDFbfmBdKiAqKD89XG58JCl8JCkvLGxzPS9eIHswLDN9KCg/Oi1bXHQgXSopezMsfXwoPzpfWyBcdF0qKXszLH18KD86XCpbIFx0XSopezMsfSkoPzpcbit8JCkvLGhOPS9eIHswLDN9KCN7MSw2fSkoPz1cc3wkKSguKikoPzpcbit8JCkvLHNmPS8oPzpbKistXXxcZHsxLDl9Wy4pXSkvLCR3PS9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86Lnxcbig/IVxzKj9cbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8sV3c9TGUoJHcpLnJlcGxhY2UoL2J1bGwvZyxzZikucmVwbGFjZSgvYmxvY2tDb2RlL2csLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cbj5dKz5cbi8pLnJlcGxhY2UoL1x8dGFibGUvZywiIikuZ2V0UmVnZXgoKSxnTj1MZSgkdykucmVwbGFjZSgvYnVsbC9nLHNmKS5yZXBsYWNlKC9ibG9ja0NvZGUvZywvKD86IHs0fXwgezAsM31cdCkvKS5yZXBsYWNlKC9mZW5jZXMvZywvIHswLDN9KD86YHszLH18fnszLH0pLykucmVwbGFjZSgvYmxvY2txdW90ZS9nLC8gezAsM30+LykucmVwbGFjZSgvaGVhZGluZy9nLC8gezAsM30jezEsNn0vKS5yZXBsYWNlKC9odG1sL2csLyB7MCwzfTxbXlxuPl0rPlxuLykucmVwbGFjZSgvdGFibGUvZywvIHswLDN9XHw/KD86WzpcLSBdKlx8KStbXDpcLSBdKlxuLykuZ2V0UmVnZXgoKSxsZj0vXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLyxtTj0vXlteXG5dKy8sZGY9Lyg/IVxzKlxdKSg/OlxcLnxbXlxbXF1cXF0pKy8sdk49TGUoL14gezAsM31cWyhsYWJlbClcXTogKig/OlxuWyBcdF0qKT8oW148XHNdW15cc10qfDwuKj8+KSg/Oig/OiArKD86XG5bIFx0XSopP3wgKlxuWyBcdF0qKSh0aXRsZSkpPyAqKD86XG4rfCQpLykucmVwbGFjZSgibGFiZWwiLGRmKS5yZXBsYWNlKCJ0aXRsZSIsLyg/OiIoPzpcXCI/fFteIlxcXSkqInwnW14nXG5dKig/OlxuW14nXG5dKykqXG4/J3xcKFteKCldKlwpKS8pLmdldFJlZ2V4KCkseU49TGUoL14oIHswLDN9YnVsbCkoWyBcdF1bXlxuXSs/KT8oPzpcbnwkKS8pLnJlcGxhY2UoL2J1bGwvZyxzZikuZ2V0UmVnZXgoKSxOZD0iYWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb258Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZXxsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9ufHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZXx0cnx0cmFja3x1bCIsY2Y9LzwhLS0oPzotPz58W1xzXFNdKj8oPzotLT58JCkpLyx3Tj1MZSgiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxzPl1bXFxzXFxTXSo/KD86PC9cXDE+W15cXG5dKlxcbit8JCl8Y29tbWVudFteXFxuXSooXFxuK3wkKXw8XFw/W1xcc1xcU10qPyg/OlxcPz5cXG4qfCQpfDwhW0EtWl1bXFxzXFxTXSo/KD86Plxcbip8JCl8PCFcXFtDREFUQVxcW1tcXHNcXFNdKj8oPzpcXF1cXF0+XFxuKnwkKXw8Lz8odGFnKSg/OiArfFxcbnwvPz4pW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcdy1dKlxccyo+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuWyAJXSopK1xcbnwkKSkiLCJpIikucmVwbGFjZSgiY29tbWVudCIsY2YpLnJlcGxhY2UoInRhZyIsTmQpLnJlcGxhY2UoImF0dHJpYnV0ZSIsLyArW2EtekEtWjpfXVtcdy46LV0qKD86ICo9ICoiW14iXG5dKiJ8ICo9IConW14nXG5dKid8ICo9ICpbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCksQnc9TGUobGYpLnJlcGxhY2UoImhyIixscykucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInx0YWJsZSIsIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixOZCkuZ2V0UmVnZXgoKSxiTj1MZSgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXG5dKikoPzpcbnwkKSkrLykucmVwbGFjZSgicGFyYWdyYXBoIixCdykuZ2V0UmVnZXgoKSx1Zj17YmxvY2txdW90ZTpiTixjb2RlOnBOLGRlZjp2TixmZW5jZXM6Zk4saGVhZGluZzpoTixocjpscyxodG1sOndOLGxoZWFkaW5nOld3LGxpc3Q6eU4sbmV3bGluZTp1TixwYXJhZ3JhcGg6QncsdGFibGU6c3MsdGV4dDptTn0sUnc9TGUoIl4gKihbXlxcbiBdLiopXFxuIHswLDN9KCg/OlxcfCAqKT86Py0rOj8gKig/OlxcfCAqOj8tKzo/ICopKig/OlxcfCAqKT8pKD86XFxuKCg/Oig/ISAqXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXG58JCkpKilcXG4qfCQpIikucmVwbGFjZSgiaHIiLGxzKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJjb2RlIiwiKD86IHs0fXwgezAsM30JKVteXFxuXSIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsTmQpLmdldFJlZ2V4KCksa049ey4uLnVmLGxoZWFkaW5nOmdOLHRhYmxlOlJ3LHBhcmFncmFwaDpMZShsZikucmVwbGFjZSgiaHIiLGxzKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgidGFibGUiLFJ3KS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsTmQpLmdldFJlZ2V4KCl9LHhOPXsuLi51ZixodG1sOkxlKGBeICooPzpjb21tZW50ICooPzpcXG58XFxzKiQpfDwodGFnKVtcXHNcXFNdKz88L1xcMT4gKig/OlxcbnsyLH18XFxzKiQpfDx0YWcoPzoiW14iXSoifCdbXiddKid8XFxzW14nIi8+XFxzXSopKj8vPz4gKig/OlxcbnsyLH18XFxzKiQpKWApLnJlcGxhY2UoImNvbW1lbnQiLGNmKS5yZXBsYWNlKC90YWcvZywiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6fFteXFx3XFxzQF0qQClcXGIiKS5nZXRSZWdleCgpLGRlZjovXiAqXFsoW15cXV0rKVxdOiAqPD8oW15ccz5dKyk+Pyg/OiArKFsiKF1bXlxuXStbIildKSk/ICooPzpcbit8JCkvLGhlYWRpbmc6L14oI3sxLDZ9KSguKikoPzpcbit8JCkvLGZlbmNlczpzcyxsaGVhZGluZzovXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLHBhcmFncmFwaDpMZShsZikucmVwbGFjZSgiaHIiLGxzKS5yZXBsYWNlKCJoZWFkaW5nIixgICojezEsNn0gKlteCl1gKS5yZXBsYWNlKCJsaGVhZGluZyIsV3cpLnJlcGxhY2UoInx0YWJsZSIsIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgifGZlbmNlcyIsIiIpLnJlcGxhY2UoInxsaXN0IiwiIikucmVwbGFjZSgifGh0bWwiLCIiKS5yZXBsYWNlKCJ8dGFnIiwiIikuZ2V0UmVnZXgoKX0sU049L15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvLEVOPS9eKGArKShbXmBdfFteYF1bXHNcU10qP1teYF0pXDEoPyFgKS8sSHc9L14oIHsyLH18XFwpXG4oPyFccyokKS8sTk49L14oYCt8W15gXSkoPzooPz0gezIsfVxuKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKl9dfFxiX3wkKXxbXiBdKD89IHsyLH1cbikpKS8sVGQ9L1tccHtQfVxwe1N9XS91LHBmPS9bXHNccHtQfVxwe1N9XS91LEd3PS9bXlxzXHB7UH1ccHtTfV0vdSxUTj1MZSgvXigoPyFbKl9dKXB1bmN0U3BhY2UpLywidSIpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxwZikuZ2V0UmVnZXgoKSxqdz0vKD8hfilbXHB7UH1ccHtTfV0vdSxETj0vKD8hfilbXHNccHtQfVxwe1N9XS91LEFOPS8oPzpbXlxzXHB7UH1ccHtTfV18fikvdSxfTj0vXFtbXltcXV0qP1xdXCgoPzpcXC58W15cXFwoXCldfFwoKD86XFwufFteXFxcKFwpXSkqXCkpKlwpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nLFZ3PS9eKD86XCorKD86KCg/IVwqKXB1bmN0KXxbXlxzKl0pKXxeXysoPzooKD8hXylwdW5jdCl8KFteXHNfXSkpLyxDTj1MZShWdywidSIpLnJlcGxhY2UoL3B1bmN0L2csVGQpLmdldFJlZ2V4KCksT049TGUoVncsInUiKS5yZXBsYWNlKC9wdW5jdC9nLGp3KS5nZXRSZWdleCgpLEt3PSJeW15fKl0qP19fW15fKl0qP1xcKlteXypdKj8oPz1fXyl8W14qXSsoPz1bXipdKXwoPyFcXCopcHVuY3QoXFwqKykoPz1bXFxzXXwkKXxub3RQdW5jdFNwYWNlKFxcKispKD8hXFwqKSg/PXB1bmN0U3BhY2V8JCl8KD8hXFwqKXB1bmN0U3BhY2UoXFwqKykoPz1ub3RQdW5jdFNwYWNlKXxbXFxzXShcXCorKSg/IVxcKikoPz1wdW5jdCl8KD8hXFwqKXB1bmN0KFxcKispKD8hXFwqKSg/PXB1bmN0KXxub3RQdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSkiLElOPUxlKEt3LCJndSIpLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZyxHdykucmVwbGFjZSgvcHVuY3RTcGFjZS9nLHBmKS5yZXBsYWNlKC9wdW5jdC9nLFRkKS5nZXRSZWdleCgpLE1OPUxlKEt3LCJndSIpLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZyxBTikucmVwbGFjZSgvcHVuY3RTcGFjZS9nLEROKS5yZXBsYWNlKC9wdW5jdC9nLGp3KS5nZXRSZWdleCgpLFJOPUxlKCJeW15fKl0qP1xcKlxcKlteXypdKj9fW15fKl0qPyg/PVxcKlxcKil8W15fXSsoPz1bXl9dKXwoPyFfKXB1bmN0KF8rKSg/PVtcXHNdfCQpfG5vdFB1bmN0U3BhY2UoXyspKD8hXykoPz1wdW5jdFNwYWNlfCQpfCg/IV8pcHVuY3RTcGFjZShfKykoPz1ub3RQdW5jdFNwYWNlKXxbXFxzXShfKykoPyFfKSg/PXB1bmN0KXwoPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpIiwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csR3cpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxwZikucmVwbGFjZSgvcHVuY3QvZyxUZCkuZ2V0UmVnZXgoKSxQTj1MZSgvXFwocHVuY3QpLywiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFRkKS5nZXRSZWdleCgpLExOPUxlKC9ePChzY2hlbWU6W15cc1x4MDAtXHgxZjw+XSp8ZW1haWwpPi8pLnJlcGxhY2UoInNjaGVtZSIsL1thLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0vKS5yZXBsYWNlKCJlbWFpbCIsL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLykuZ2V0UmVnZXgoKSxVTj1MZShjZikucmVwbGFjZSgiKD86LS0+fCQpIiwiLS0+IikuZ2V0UmVnZXgoKSx6Tj1MZSgiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFx3Oi1dKlxccyo+fF48W2EtekEtWl1bXFx3LV0qKD86YXR0cmlidXRlKSo/XFxzKi8/PnxePFxcP1tcXHNcXFNdKj9cXD8+fF48IVthLXpBLVpdK1xcc1tcXHNcXFNdKj8+fF48IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4iKS5yZXBsYWNlKCJjb21tZW50IixVTikucmVwbGFjZSgiYXR0cmlidXRlIiwvXHMrW2EtekEtWjpfXVtcdy46LV0qKD86XHMqPVxzKiJbXiJdKiJ8XHMqPVxzKidbXiddKid8XHMqPVxzKlteXHMiJz08PmBdKyk/LykuZ2V0UmVnZXgoKSx4ZD0vKD86XFsoPzpcXC58W15cW1xdXFxdKSpcXXxcXC58YFteYF0qYHxbXlxbXF1cXGBdKSo/LyxGTj1MZSgvXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/Oig/OlsgXHRdKig/OlxuWyBcdF0qKT8pKHRpdGxlKSk/XHMqXCkvKS5yZXBsYWNlKCJsYWJlbCIseGQpLnJlcGxhY2UoImhyZWYiLC88KD86XFwufFteXG48PlxcXSkrPnxbXiBcdFxuXHgwMC1ceDFmXSovKS5yZXBsYWNlKCJ0aXRsZSIsLyIoPzpcXCI/fFteIlxcXSkqInwnKD86XFwnP3xbXidcXF0pKid8XCgoPzpcXFwpP3xbXilcXF0pKlwpLykuZ2V0UmVnZXgoKSxZdz1MZSgvXiE/XFsobGFiZWwpXF1cWyhyZWYpXF0vKS5yZXBsYWNlKCJsYWJlbCIseGQpLnJlcGxhY2UoInJlZiIsZGYpLmdldFJlZ2V4KCkscXc9TGUoL14hP1xbKHJlZilcXSg/OlxbXF0pPy8pLnJlcGxhY2UoInJlZiIsZGYpLmdldFJlZ2V4KCksJE49TGUoInJlZmxpbmt8bm9saW5rKD8hXFwoKSIsImciKS5yZXBsYWNlKCJyZWZsaW5rIixZdykucmVwbGFjZSgibm9saW5rIixxdykuZ2V0UmVnZXgoKSxmZj17X2JhY2twZWRhbDpzcyxhbnlQdW5jdHVhdGlvbjpQTixhdXRvbGluazpMTixibG9ja1NraXA6X04sYnI6SHcsY29kZTpFTixkZWw6c3MsZW1TdHJvbmdMRGVsaW06Q04sZW1TdHJvbmdSRGVsaW1Bc3Q6SU4sZW1TdHJvbmdSRGVsaW1VbmQ6Uk4sZXNjYXBlOlNOLGxpbms6Rk4sbm9saW5rOnF3LHB1bmN0dWF0aW9uOlROLHJlZmxpbms6WXcscmVmbGlua1NlYXJjaDokTix0YWc6ek4sdGV4dDpOTix1cmw6c3N9LFdOPXsuLi5mZixsaW5rOkxlKC9eIT9cWyhsYWJlbClcXVwoKC4qPylcKS8pLnJlcGxhY2UoImxhYmVsIix4ZCkuZ2V0UmVnZXgoKSxyZWZsaW5rOkxlKC9eIT9cWyhsYWJlbClcXVxzKlxbKFteXF1dKilcXS8pLnJlcGxhY2UoImxhYmVsIix4ZCkuZ2V0UmVnZXgoKX0sbmY9ey4uLmZmLGVtU3Ryb25nUkRlbGltQXN0Ok1OLGVtU3Ryb25nTERlbGltOk9OLHVybDpMZSgvXigoPzpmdHB8aHR0cHM/KTpcL1wvfHd3d1wuKSg/OlthLXpBLVowLTlcLV0rXC4/KStbXlxzPF0qfF5lbWFpbC8sImkiKS5yZXBsYWNlKCJlbWFpbCIsL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlwuW2EtekEtWjAtOS1fXSpbYS16QS1aMC05XSkrKD8hWy1fXSkvKS5nZXRSZWdleCgpLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nIn4oKSZdK3xcKFteKV0qXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nIn4pXSsoPyEkKSkrLyxkZWw6L14ofn4/KSg/PVteXHN+XSkoKD86XFwufFteXFxdKSo/KD86XFwufFteXHN+XFxdKSlcMSg/PVtefl18JCkvLHRleHQ6L14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCl8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCp+X118XGJffGh0dHBzPzpcL1wvfGZ0cDpcL1wvfHd3d1wufCQpfFteIF0oPz0gezIsfVxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKSkpL30sQk49ey4uLm5mLGJyOkxlKEh3KS5yZXBsYWNlKCJ7Mix9IiwiKiIpLmdldFJlZ2V4KCksdGV4dDpMZShuZi50ZXh0KS5yZXBsYWNlKCJcXGJfIiwiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCIqIikuZ2V0UmVnZXgoKX0sYmQ9e25vcm1hbDp1ZixnZm06a04scGVkYW50aWM6eE59LGFzPXtub3JtYWw6ZmYsZ2ZtOm5mLGJyZWFrczpCTixwZWRhbnRpYzpXTn0sSE49eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LFB3PWU9PkhOW2VdO2Z1bmN0aW9uIG9yKGUsdCl7aWYodCl7aWYoQnQuZXNjYXBlVGVzdC50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2UoQnQuZXNjYXBlUmVwbGFjZSxQdyl9ZWxzZSBpZihCdC5lc2NhcGVUZXN0Tm9FbmNvZGUudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKEJ0LmVzY2FwZVJlcGxhY2VOb0VuY29kZSxQdyk7cmV0dXJuIGV9ZnVuY3Rpb24gTHcoZSl7dHJ5e2U9ZW5jb2RlVVJJKGUpLnJlcGxhY2UoQnQucGVyY2VudERlY29kZSwiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiBlfWZ1bmN0aW9uIFV3KGUsdCl7bGV0IG49ZS5yZXBsYWNlKEJ0LmZpbmRQaXBlLChhLGkscyk9PntsZXQgbD0hMSxkPWk7Zm9yKDstLWQ+PTAmJnNbZF09PT0iXFwiOylsPSFsO3JldHVybiBsPyJ8IjoiIHwifSkscj1uLnNwbGl0KEJ0LnNwbGl0UGlwZSksbz0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXIuYXQoLTEpPy50cmltKCkmJnIucG9wKCksdClpZihyLmxlbmd0aD50KXIuc3BsaWNlKHQpO2Vsc2UgZm9yKDtyLmxlbmd0aDx0OylyLnB1c2goIiIpO2Zvcig7bzxyLmxlbmd0aDtvKyspcltvXT1yW29dLnRyaW0oKS5yZXBsYWNlKEJ0LnNsYXNoUGlwZSwifCIpO3JldHVybiByfWZ1bmN0aW9uIGlzKGUsdCxuKXtsZXQgcj1lLmxlbmd0aDtpZihyPT09MClyZXR1cm4iIjtsZXQgbz0wO2Zvcig7bzxyOyl7bGV0IGE9ZS5jaGFyQXQoci1vLTEpO2lmKGE9PT10JiYhbilvKys7ZWxzZSBpZihhIT09dCYmbilvKys7ZWxzZSBicmVha31yZXR1cm4gZS5zbGljZSgwLHItbyl9ZnVuY3Rpb24gR04oZSx0KXtpZihlLmluZGV4T2YodFsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT0iXFwiKXIrKztlbHNlIGlmKGVbcl09PT10WzBdKW4rKztlbHNlIGlmKGVbcl09PT10WzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuIG4+MD8tMjotMX1mdW5jdGlvbiB6dyhlLHQsbixyLG8pe2xldCBhPXQuaHJlZixpPXQudGl0bGV8fG51bGwscz1lWzFdLnJlcGxhY2Uoby5vdGhlci5vdXRwdXRMaW5rUmVwbGFjZSwiJDEiKTtyLnN0YXRlLmluTGluaz0hMDtsZXQgbD17dHlwZTplWzBdLmNoYXJBdCgwKT09PSIhIj8iaW1hZ2UiOiJsaW5rIixyYXc6bixocmVmOmEsdGl0bGU6aSx0ZXh0OnMsdG9rZW5zOnIuaW5saW5lVG9rZW5zKHMpfTtyZXR1cm4gci5zdGF0ZS5pbkxpbms9ITEsbH1mdW5jdGlvbiBqTihlLHQsbil7bGV0IHI9ZS5tYXRjaChuLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO2lmKHI9PT1udWxsKXJldHVybiB0O2xldCBvPXJbMV07cmV0dXJuIHQuc3BsaXQoYApgKS5tYXAoYT0+e2xldCBpPWEubWF0Y2gobi5vdGhlci5iZWdpbm5pbmdTcGFjZSk7aWYoaT09PW51bGwpcmV0dXJuIGE7bGV0W3NdPWk7cmV0dXJuIHMubGVuZ3RoPj1vLmxlbmd0aD9hLnNsaWNlKG8ubGVuZ3RoKTphfSkuam9pbihgCmApfXZhciBTZD1jbGFzc3tvcHRpb25zO3J1bGVzO2xleGVyO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxZb31zcGFjZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhlKTtpZih0JiZ0WzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3OnRbMF19fWNvZGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoZSk7aWYodCl7bGV0IG49dFswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuY29kZVJlbW92ZUluZGVudCwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzp0WzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/bjppcyhuLGAKYCl9fX1mZW5jZXMoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhlKTtpZih0KXtsZXQgbj10WzBdLHI9ak4obix0WzNdfHwiIix0aGlzLnJ1bGVzKTtyZXR1cm57dHlwZToiY29kZSIscmF3Om4sbGFuZzp0WzJdP3RbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIik6dFsyXSx0ZXh0OnJ9fX1oZWFkaW5nKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKGUpO2lmKHQpe2xldCBuPXRbMl0udHJpbSgpO2lmKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KG4pKXtsZXQgcj1pcyhuLCIjIik7KHRoaXMub3B0aW9ucy5wZWRhbnRpY3x8IXJ8fHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QocikpJiYobj1yLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzp0WzBdLGRlcHRoOnRbMV0ubGVuZ3RoLHRleHQ6bix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUobil9fX1ocihlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaHIiLHJhdzppcyh0WzBdLGAKYCl9fWJsb2NrcXVvdGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoZSk7aWYodCl7bGV0IG49aXModFswXSxgCmApLnNwbGl0KGAKYCkscj0iIixvPSIiLGE9W107Zm9yKDtuLmxlbmd0aD4wOyl7bGV0IGk9ITEscz1bXSxsO2ZvcihsPTA7bDxuLmxlbmd0aDtsKyspaWYodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChuW2xdKSlzLnB1c2gobltsXSksaT0hMDtlbHNlIGlmKCFpKXMucHVzaChuW2xdKTtlbHNlIGJyZWFrO249bi5zbGljZShsKTtsZXQgZD1zLmpvaW4oYApgKSxjPWQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlLGAKICAgICQxYCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMiwiIik7cj1yP2Ake3J9CiR7ZH1gOmQsbz1vP2Ake299CiR7Y31gOmM7bGV0IHA9dGhpcy5sZXhlci5zdGF0ZS50b3A7aWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITAsdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjLGEsITApLHRoaXMubGV4ZXIuc3RhdGUudG9wPXAsbi5sZW5ndGg9PT0wKWJyZWFrO2xldCB1PWEuYXQoLTEpO2lmKHU/LnR5cGU9PT0iY29kZSIpYnJlYWs7aWYodT8udHlwZT09PSJibG9ja3F1b3RlIil7bGV0IGY9dSx2PWYucmF3K2AKYCtuLmpvaW4oYApgKSx3PXRoaXMuYmxvY2txdW90ZSh2KTthW2EubGVuZ3RoLTFdPXcscj1yLnN1YnN0cmluZygwLHIubGVuZ3RoLWYucmF3Lmxlbmd0aCkrdy5yYXcsbz1vLnN1YnN0cmluZygwLG8ubGVuZ3RoLWYudGV4dC5sZW5ndGgpK3cudGV4dDticmVha31lbHNlIGlmKHU/LnR5cGU9PT0ibGlzdCIpe2xldCBmPXUsdj1mLnJhdytgCmArbi5qb2luKGAKYCksdz10aGlzLmxpc3Qodik7YVthLmxlbmd0aC0xXT13LHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC11LnJhdy5sZW5ndGgpK3cucmF3LG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC1mLnJhdy5sZW5ndGgpK3cucmF3LG49di5zdWJzdHJpbmcoYS5hdCgtMSkucmF3Lmxlbmd0aCkuc3BsaXQoYApgKTtjb250aW51ZX19cmV0dXJue3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpyLHRva2VuczphLHRleHQ6b319fWxpc3QoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoZSk7aWYodCl7bGV0IG49dFsxXS50cmltKCkscj1uLmxlbmd0aD4xLG89e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOnIsc3RhcnQ6cj8rbi5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07bj1yP2BcXGR7MSw5fVxcJHtuLnNsaWNlKC0xKX1gOmBcXCR7bn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKG49cj9uOiJbKistXSIpO2xldCBhPXRoaXMucnVsZXMub3RoZXIubGlzdEl0ZW1SZWdleChuKSxpPSExO2Zvcig7ZTspe2xldCBsPSExLGQ9IiIsYz0iIjtpZighKHQ9YS5leGVjKGUpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KGUpKWJyZWFrO2Q9dFswXSxlPWUuc3Vic3RyaW5nKGQubGVuZ3RoKTtsZXQgcD10WzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYWJzLGc9PiIgIi5yZXBlYXQoMypnLmxlbmd0aCkpLHU9ZS5zcGxpdChgCmAsMSlbMF0sZj0hcC50cmltKCksdj0wO2lmKHRoaXMub3B0aW9ucy5wZWRhbnRpYz8odj0yLGM9cC50cmltU3RhcnQoKSk6Zj92PXRbMV0ubGVuZ3RoKzE6KHY9dFsyXS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpLHY9dj40PzE6dixjPXAuc2xpY2Uodiksdis9dFsxXS5sZW5ndGgpLGYmJnRoaXMucnVsZXMub3RoZXIuYmxhbmtMaW5lLnRlc3QodSkmJihkKz11K2AKYCxlPWUuc3Vic3RyaW5nKHUubGVuZ3RoKzEpLGw9ITApLCFsKXtsZXQgZz10aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleCh2KSxtPXRoaXMucnVsZXMub3RoZXIuaHJSZWdleCh2KSx5PXRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleCh2KSxoPXRoaXMucnVsZXMub3RoZXIuaGVhZGluZ0JlZ2luUmVnZXgodikseD10aGlzLnJ1bGVzLm90aGVyLmh0bWxCZWdpblJlZ2V4KHYpO2Zvcig7ZTspe2xldCBFPWUuc3BsaXQoYApgLDEpWzBdLFQ7aWYodT1FLHRoaXMub3B0aW9ucy5wZWRhbnRpYz8odT11LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZU5lc3RpbmcsIiAgIiksVD11KTpUPXUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsIiAgICAiKSx5LnRlc3QodSl8fGgudGVzdCh1KXx8eC50ZXN0KHUpfHxnLnRlc3QodSl8fG0udGVzdCh1KSlicmVhaztpZihULnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik+PXZ8fCF1LnRyaW0oKSljKz1gCmArVC5zbGljZSh2KTtlbHNle2lmKGZ8fHAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsIiAgICAiKS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj00fHx5LnRlc3QocCl8fGgudGVzdChwKXx8bS50ZXN0KHApKWJyZWFrO2MrPWAKYCt1fSFmJiYhdS50cmltKCkmJihmPSEwKSxkKz1FK2AKYCxlPWUuc3Vic3RyaW5nKEUubGVuZ3RoKzEpLHA9VC5zbGljZSh2KX19by5sb29zZXx8KGk/by5sb29zZT0hMDp0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KGQpJiYoaT0hMCkpO2xldCB3PW51bGwsYjt0aGlzLm9wdGlvbnMuZ2ZtJiYodz10aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2suZXhlYyhjKSx3JiYoYj13WzBdIT09IlsgXSAiLGM9Yy5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCIiKSkpLG8uaXRlbXMucHVzaCh7dHlwZToibGlzdF9pdGVtIixyYXc6ZCx0YXNrOiEhdyxjaGVja2VkOmIsbG9vc2U6ITEsdGV4dDpjLHRva2VuczpbXX0pLG8ucmF3Kz1kfWxldCBzPW8uaXRlbXMuYXQoLTEpO2lmKHMpcy5yYXc9cy5yYXcudHJpbUVuZCgpLHMudGV4dD1zLnRleHQudHJpbUVuZCgpO2Vsc2UgcmV0dXJuO28ucmF3PW8ucmF3LnRyaW1FbmQoKTtmb3IobGV0IGw9MDtsPG8uaXRlbXMubGVuZ3RoO2wrKylpZih0aGlzLmxleGVyLnN0YXRlLnRvcD0hMSxvLml0ZW1zW2xdLnRva2Vucz10aGlzLmxleGVyLmJsb2NrVG9rZW5zKG8uaXRlbXNbbF0udGV4dCxbXSksIW8ubG9vc2Upe2xldCBkPW8uaXRlbXNbbF0udG9rZW5zLmZpbHRlcihwPT5wLnR5cGU9PT0ic3BhY2UiKSxjPWQubGVuZ3RoPjAmJmQuc29tZShwPT50aGlzLnJ1bGVzLm90aGVyLmFueUxpbmUudGVzdChwLnJhdykpO28ubG9vc2U9Y31pZihvLmxvb3NlKWZvcihsZXQgbD0wO2w8by5pdGVtcy5sZW5ndGg7bCsrKW8uaXRlbXNbbF0ubG9vc2U9ITA7cmV0dXJuIG99fWh0bWwoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5odG1sLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaHRtbCIsYmxvY2s6ITAscmF3OnRbMF0scHJlOnRbMV09PT0icHJlInx8dFsxXT09PSJzY3JpcHQifHx0WzFdPT09InN0eWxlIix0ZXh0OnRbMF19fWRlZihlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwiICIpLHI9dFsyXT90WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsIiQxIikucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKToiIixvPXRbM10/dFszXS5zdWJzdHJpbmcoMSx0WzNdLmxlbmd0aC0xKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpOnRbM107cmV0dXJue3R5cGU6ImRlZiIsdGFnOm4scmF3OnRbMF0saHJlZjpyLHRpdGxlOm99fX10YWJsZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoZSk7aWYoIXR8fCF0aGlzLnJ1bGVzLm90aGVyLnRhYmxlRGVsaW1pdGVyLnRlc3QodFsyXSkpcmV0dXJuO2xldCBuPVV3KHRbMV0pLHI9dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNoYXJzLCIiKS5zcGxpdCgifCIpLG89dFszXT8udHJpbSgpP3RbM10ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlUm93QmxhbmtMaW5lLCIiKS5zcGxpdChgCmApOltdLGE9e3R5cGU6InRhYmxlIixyYXc6dFswXSxoZWFkZXI6W10sYWxpZ246W10scm93czpbXX07aWYobi5sZW5ndGg9PT1yLmxlbmd0aCl7Zm9yKGxldCBpIG9mIHIpdGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChpKT9hLmFsaWduLnB1c2goInJpZ2h0Iik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduQ2VudGVyLnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJjZW50ZXIiKTp0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25MZWZ0LnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJsZWZ0Iik6YS5hbGlnbi5wdXNoKG51bGwpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKWEuaGVhZGVyLnB1c2goe3RleHQ6bltpXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUobltpXSksaGVhZGVyOiEwLGFsaWduOmEuYWxpZ25baV19KTtmb3IobGV0IGkgb2YgbylhLnJvd3MucHVzaChVdyhpLGEuaGVhZGVyLmxlbmd0aCkubWFwKChzLGwpPT4oe3RleHQ6cyx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocyksaGVhZGVyOiExLGFsaWduOmEuYWxpZ25bbF19KSkpO3JldHVybiBhfX1saGVhZGluZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaGVhZGluZyIscmF3OnRbMF0sZGVwdGg6dFsyXS5jaGFyQXQoMCk9PT0iPSI/MToyLHRleHQ6dFsxXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUodFsxXSl9fXBhcmFncmFwaChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0uY2hhckF0KHRbMV0ubGVuZ3RoLTEpPT09YApgP3RbMV0uc2xpY2UoMCwtMSk6dFsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6dFswXSx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19dGV4dChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnRleHQuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOiJ0ZXh0IixyYXc6dFswXSx0ZXh0OnRbMF0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHRbMF0pfX1lc2NhcGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiZXNjYXBlIixyYXc6dFswXSx0ZXh0OnRbMV19fXRhZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhlKTtpZih0KXJldHVybiF0aGlzLmxleGVyLnN0YXRlLmluTGluayYmdGhpcy5ydWxlcy5vdGhlci5zdGFydEFUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmdGhpcy5ydWxlcy5vdGhlci5lbmRBVGFnLnRlc3QodFswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmdGhpcy5ydWxlcy5vdGhlci5zdGFydFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuZW5kUHJlU2NyaXB0VGFnLnRlc3QodFswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6dFswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDp0WzBdfX1saW5rKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiZ0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3Qobikpe2lmKCF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KG4pKXJldHVybjtsZXQgYT1pcyhuLnNsaWNlKDAsLTEpLCJcXCIpO2lmKChuLmxlbmd0aC1hLmxlbmd0aCklMj09PTApcmV0dXJufWVsc2V7bGV0IGE9R04odFsyXSwiKCkiKTtpZihhPT09LTIpcmV0dXJuO2lmKGE+LTEpe2xldCBzPSh0WzBdLmluZGV4T2YoIiEiKT09PTA/NTo0KSt0WzFdLmxlbmd0aCthO3RbMl09dFsyXS5zdWJzdHJpbmcoMCxhKSx0WzBdPXRbMF0uc3Vic3RyaW5nKDAscykudHJpbSgpLHRbM109IiJ9fWxldCByPXRbMl0sbz0iIjtpZih0aGlzLm9wdGlvbnMucGVkYW50aWMpe2xldCBhPXRoaXMucnVsZXMub3RoZXIucGVkYW50aWNIcmVmVGl0bGUuZXhlYyhyKTthJiYocj1hWzFdLG89YVszXSl9ZWxzZSBvPXRbM10/dFszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gcj1yLnRyaW0oKSx0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QocikmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KG4pP3I9ci5zbGljZSgxKTpyPXIuc2xpY2UoMSwtMSkpLHp3KHQse2hyZWY6ciYmci5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpLHRpdGxlOm8mJm8ucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKX0sdFswXSx0aGlzLmxleGVyLHRoaXMucnVsZXMpfX1yZWZsaW5rKGUsdCl7bGV0IG47aWYoKG49dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKGUpKXx8KG49dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoZSkpKXtsZXQgcj0oblsyXXx8blsxXSkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsIiAiKSxvPXRbci50b0xvd2VyQ2FzZSgpXTtpZighbyl7bGV0IGE9blswXS5jaGFyQXQoMCk7cmV0dXJue3R5cGU6InRleHQiLHJhdzphLHRleHQ6YX19cmV0dXJuIHp3KG4sbyxuWzBdLHRoaXMubGV4ZXIsdGhpcy5ydWxlcyl9fWVtU3Ryb25nKGUsdCxuPSIiKXtsZXQgcj10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ0xEZWxpbS5leGVjKGUpO2lmKCFyfHxyWzNdJiZuLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpcmV0dXJuO2lmKCEoclsxXXx8clsyXXx8IiIpfHwhbnx8dGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhuKSl7bGV0IGE9Wy4uLnJbMF1dLmxlbmd0aC0xLGkscyxsPWEsZD0wLGM9clswXVswXT09PSIqIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbUFzdDp0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtmb3IoYy5sYXN0SW5kZXg9MCx0PXQuc2xpY2UoLTEqZS5sZW5ndGgrYSk7KHI9Yy5leGVjKHQpKSE9bnVsbDspe2lmKGk9clsxXXx8clsyXXx8clszXXx8cls0XXx8cls1XXx8cls2XSwhaSljb250aW51ZTtpZihzPVsuLi5pXS5sZW5ndGgsclszXXx8cls0XSl7bCs9cztjb250aW51ZX1lbHNlIGlmKChyWzVdfHxyWzZdKSYmYSUzJiYhKChhK3MpJTMpKXtkKz1zO2NvbnRpbnVlfWlmKGwtPXMsbD4wKWNvbnRpbnVlO3M9TWF0aC5taW4ocyxzK2wrZCk7bGV0IHA9Wy4uLnJbMF1dWzBdLmxlbmd0aCx1PWUuc2xpY2UoMCxhK3IuaW5kZXgrcCtzKTtpZihNYXRoLm1pbihhLHMpJTIpe2xldCB2PXUuc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6ImVtIixyYXc6dSx0ZXh0OnYsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHYpfX1sZXQgZj11LnNsaWNlKDIsLTIpO3JldHVybnt0eXBlOiJzdHJvbmciLHJhdzp1LHRleHQ6Zix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoZil9fX19Y29kZXNwYW4oZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuY29kZS5leGVjKGUpO2lmKHQpe2xldCBuPXRbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm5ld0xpbmVDaGFyR2xvYmFsLCIgIikscj10aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KG4pLG89dGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KG4pJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KG4pO3JldHVybiByJiZvJiYobj1uLnN1YnN0cmluZygxLG4ubGVuZ3RoLTEpKSx7dHlwZToiY29kZXNwYW4iLHJhdzp0WzBdLHRleHQ6bn19fWJyKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmJyLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiYnIiLHJhdzp0WzBdfX1kZWwoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiZGVsIixyYXc6dFswXSx0ZXh0OnRbMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRbMl0pfX1hdXRvbGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5hdXRvbGluay5leGVjKGUpO2lmKHQpe2xldCBuLHI7cmV0dXJuIHRbMl09PT0iQCI/KG49dFsxXSxyPSJtYWlsdG86IituKToobj10WzFdLHI9bikse3R5cGU6ImxpbmsiLHJhdzp0WzBdLHRleHQ6bixocmVmOnIsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3Om4sdGV4dDpufV19fX11cmwoZSl7bGV0IHQ7aWYodD10aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhlKSl7bGV0IG4scjtpZih0WzJdPT09IkAiKW49dFswXSxyPSJtYWlsdG86IituO2Vsc2V7bGV0IG87ZG8gbz10WzBdLHRbMF09dGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKHRbMF0pPy5bMF0/PyIiO3doaWxlKG8hPT10WzBdKTtuPXRbMF0sdFsxXT09PSJ3d3cuIj9yPSJodHRwOi8vIit0WzBdOnI9dFswXX1yZXR1cm57dHlwZToibGluayIscmF3OnRbMF0sdGV4dDpuLGhyZWY6cix0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6bix0ZXh0Om59XX19fWlubGluZVRleHQoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKGUpO2lmKHQpe2xldCBuPXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaztyZXR1cm57dHlwZToidGV4dCIscmF3OnRbMF0sdGV4dDp0WzBdLGVzY2FwZWQ6bn19fX0sRHI9Y2xhc3MgcmZ7dG9rZW5zO29wdGlvbnM7c3RhdGU7dG9rZW5pemVyO2lubGluZVF1ZXVlO2NvbnN0cnVjdG9yKHQpe3RoaXMudG9rZW5zPVtdLHRoaXMudG9rZW5zLmxpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zPXR8fFlvLHRoaXMub3B0aW9ucy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcnx8bmV3IFNkLHRoaXMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXIsdGhpcy50b2tlbml6ZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50b2tlbml6ZXIubGV4ZXI9dGhpcyx0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMuc3RhdGU9e2luTGluazohMSxpblJhd0Jsb2NrOiExLHRvcDohMH07bGV0IG49e290aGVyOkJ0LGJsb2NrOmJkLm5vcm1hbCxpbmxpbmU6YXMubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KG4uYmxvY2s9YmQucGVkYW50aWMsbi5pbmxpbmU9YXMucGVkYW50aWMpOnRoaXMub3B0aW9ucy5nZm0mJihuLmJsb2NrPWJkLmdmbSx0aGlzLm9wdGlvbnMuYnJlYWtzP24uaW5saW5lPWFzLmJyZWFrczpuLmlubGluZT1hcy5nZm0pLHRoaXMudG9rZW5pemVyLnJ1bGVzPW59c3RhdGljIGdldCBydWxlcygpe3JldHVybntibG9jazpiZCxpbmxpbmU6YXN9fXN0YXRpYyBsZXgodCxuKXtyZXR1cm4gbmV3IHJmKG4pLmxleCh0KX1zdGF0aWMgbGV4SW5saW5lKHQsbil7cmV0dXJuIG5ldyByZihuKS5pbmxpbmVUb2tlbnModCl9bGV4KHQpe3Q9dC5yZXBsYWNlKEJ0LmNhcnJpYWdlUmV0dXJuLGAKYCksdGhpcy5ibG9ja1Rva2Vucyh0LHRoaXMudG9rZW5zKTtmb3IobGV0IG49MDtuPHRoaXMuaW5saW5lUXVldWUubGVuZ3RoO24rKyl7bGV0IHI9dGhpcy5pbmxpbmVRdWV1ZVtuXTt0aGlzLmlubGluZVRva2VucyhyLnNyYyxyLnRva2Vucyl9cmV0dXJuIHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy50b2tlbnN9YmxvY2tUb2tlbnModCxuPVtdLHI9ITEpe2Zvcih0aGlzLm9wdGlvbnMucGVkYW50aWMmJih0PXQucmVwbGFjZShCdC50YWJDaGFyR2xvYmFsLCIgICAgIikucmVwbGFjZShCdC5zcGFjZUxpbmUsIiIpKTt0Oyl7bGV0IG87aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKGk9PihvPWkuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyksITApOiExKSljb250aW51ZTtpZihvPXRoaXMudG9rZW5pemVyLnNwYWNlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCk7bGV0IGk9bi5hdCgtMSk7by5yYXcubGVuZ3RoPT09MSYmaSE9PXZvaWQgMD9pLnJhdys9YApgOm4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmNvZGUodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InBhcmFncmFwaCJ8fGk/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby50ZXh0LHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmZlbmNlcyh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5ocih0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5saXN0KHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuaHRtbCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmRlZih0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO2k/LnR5cGU9PT0icGFyYWdyYXBoInx8aT8udHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPWAKYCtvLnJhdyxpLnRleHQrPWAKYCtvLnJhdyx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTp0aGlzLnRva2Vucy5saW5rc1tvLnRhZ118fCh0aGlzLnRva2Vucy5saW5rc1tvLnRhZ109e2hyZWY6by5ocmVmLHRpdGxlOm8udGl0bGV9KTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLnRhYmxlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIubGhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9bGV0IGE9dDtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jayl7bGV0IGk9MS8wLHM9dC5zbGljZSgxKSxsO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaChkPT57bD1kLmNhbGwoe2xleGVyOnRoaXN9LHMpLHR5cGVvZiBsPT0ibnVtYmVyIiYmbD49MCYmKGk9TWF0aC5taW4oaSxsKSl9KSxpPDEvMCYmaT49MCYmKGE9dC5zdWJzdHJpbmcoMCxpKzEpKX1pZih0aGlzLnN0YXRlLnRvcCYmKG89dGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGEpKSl7bGV0IGk9bi5hdCgtMSk7ciYmaT8udHlwZT09PSJwYXJhZ3JhcGgiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKSxyPWEubGVuZ3RoIT09dC5sZW5ndGgsdD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIudGV4dCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO2k/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPWkudGV4dCk6bi5wdXNoKG8pO2NvbnRpbnVlfWlmKHQpe2xldCBpPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrdC5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3IoaSk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoaSl9fXJldHVybiB0aGlzLnN0YXRlLnRvcD0hMCxufWlubGluZSh0LG49W10pe3JldHVybiB0aGlzLmlubGluZVF1ZXVlLnB1c2goe3NyYzp0LHRva2VuczpufSksbn1pbmxpbmVUb2tlbnModCxuPVtdKXtsZXQgcj10LG89bnVsbDtpZih0aGlzLnRva2Vucy5saW5rcyl7bGV0IHM9T2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO2lmKHMubGVuZ3RoPjApZm9yKDsobz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKHIpKSE9bnVsbDspcy5pbmNsdWRlcyhvWzBdLnNsaWNlKG9bMF0ubGFzdEluZGV4T2YoIlsiKSsxLC0xKSkmJihyPXIuc2xpY2UoMCxvLmluZGV4KSsiWyIrImEiLnJlcGVhdChvWzBdLmxlbmd0aC0yKSsiXSIrci5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5sYXN0SW5kZXgpKX1mb3IoOyhvPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKHIpKSE9bnVsbDspcj1yLnNsaWNlKDAsby5pbmRleCkrIisrIityLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO2Zvcig7KG89dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKHIpKSE9bnVsbDspcj1yLnNsaWNlKDAsby5pbmRleCkrIlsiKyJhIi5yZXBlYXQob1swXS5sZW5ndGgtMikrIl0iK3Iuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO2xldCBhPSExLGk9IiI7Zm9yKDt0Oyl7YXx8KGk9IiIpLGE9ITE7bGV0IHM7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZShkPT4ocz1kLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpLCEwKTohMSkpY29udGludWU7aWYocz10aGlzLnRva2VuaXplci5lc2NhcGUodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci50YWcodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIucmVmbGluayh0LHRoaXMudG9rZW5zLmxpbmtzKSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpO2xldCBkPW4uYXQoLTEpO3MudHlwZT09PSJ0ZXh0IiYmZD8udHlwZT09PSJ0ZXh0Ij8oZC5yYXcrPXMucmF3LGQudGV4dCs9cy50ZXh0KTpuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5lbVN0cm9uZyh0LHIsaSkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5jb2Rlc3Bhbih0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmJyKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuZGVsKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuYXV0b2xpbmsodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYoIXRoaXMuc3RhdGUuaW5MaW5rJiYocz10aGlzLnRva2VuaXplci51cmwodCkpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWxldCBsPXQ7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0SW5saW5lKXtsZXQgZD0xLzAsYz10LnNsaWNlKDEpLHA7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaCh1PT57cD11LmNhbGwoe2xleGVyOnRoaXN9LGMpLHR5cGVvZiBwPT0ibnVtYmVyIiYmcD49MCYmKGQ9TWF0aC5taW4oZCxwKSl9KSxkPDEvMCYmZD49MCYmKGw9dC5zdWJzdHJpbmcoMCxkKzEpKX1pZihzPXRoaXMudG9rZW5pemVyLmlubGluZVRleHQobCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxzLnJhdy5zbGljZSgtMSkhPT0iXyImJihpPXMucmF3LnNsaWNlKC0xKSksYT0hMDtsZXQgZD1uLmF0KC0xKTtkPy50eXBlPT09InRleHQiPyhkLnJhdys9cy5yYXcsZC50ZXh0Kz1zLnRleHQpOm4ucHVzaChzKTtjb250aW51ZX1pZih0KXtsZXQgZD0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGQpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGQpfX1yZXR1cm4gbn19LEVkPWNsYXNze29wdGlvbnM7cGFyc2VyO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxZb31zcGFjZShlKXtyZXR1cm4iIn1jb2RlKHt0ZXh0OmUsbGFuZzp0LGVzY2FwZWQ6bn0pe2xldCByPSh0fHwiIikubWF0Y2goQnQubm90U3BhY2VTdGFydCk/LlswXSxvPWUucmVwbGFjZShCdC5lbmRpbmdOZXdsaW5lLCIiKStgCmA7cmV0dXJuIHI/JzxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLScrb3IocikrJyI+Jysobj9vOm9yKG8sITApKStgPC9jb2RlPjwvcHJlPgpgOiI8cHJlPjxjb2RlPiIrKG4/bzpvcihvLCEwKSkrYDwvY29kZT48L3ByZT4KYH1ibG9ja3F1b3RlKHt0b2tlbnM6ZX0pe3JldHVybmA8YmxvY2txdW90ZT4KJHt0aGlzLnBhcnNlci5wYXJzZShlKX08L2Jsb2NrcXVvdGU+CmB9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9aGVhZGluZyh7dG9rZW5zOmUsZGVwdGg6dH0pe3JldHVybmA8aCR7dH0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2gke3R9PgpgfWhyKGUpe3JldHVybmA8aHI+CmB9bGlzdChlKXtsZXQgdD1lLm9yZGVyZWQsbj1lLnN0YXJ0LHI9IiI7Zm9yKGxldCBpPTA7aTxlLml0ZW1zLmxlbmd0aDtpKyspe2xldCBzPWUuaXRlbXNbaV07cis9dGhpcy5saXN0aXRlbShzKX1sZXQgbz10PyJvbCI6InVsIixhPXQmJm4hPT0xPycgc3RhcnQ9IicrbisnIic6IiI7cmV0dXJuIjwiK28rYStgPgpgK3IrIjwvIitvK2A+CmB9bGlzdGl0ZW0oZSl7bGV0IHQ9IiI7aWYoZS50YXNrKXtsZXQgbj10aGlzLmNoZWNrYm94KHtjaGVja2VkOiEhZS5jaGVja2VkfSk7ZS5sb29zZT9lLnRva2Vuc1swXT8udHlwZT09PSJwYXJhZ3JhcGgiPyhlLnRva2Vuc1swXS50ZXh0PW4rIiAiK2UudG9rZW5zWzBdLnRleHQsZS50b2tlbnNbMF0udG9rZW5zJiZlLnRva2Vuc1swXS50b2tlbnMubGVuZ3RoPjAmJmUudG9rZW5zWzBdLnRva2Vuc1swXS50eXBlPT09InRleHQiJiYoZS50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ9bisiICIrb3IoZS50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQpLGUudG9rZW5zWzBdLnRva2Vuc1swXS5lc2NhcGVkPSEwKSk6ZS50b2tlbnMudW5zaGlmdCh7dHlwZToidGV4dCIscmF3Om4rIiAiLHRleHQ6bisiICIsZXNjYXBlZDohMH0pOnQrPW4rIiAifXJldHVybiB0Kz10aGlzLnBhcnNlci5wYXJzZShlLnRva2VucywhIWUubG9vc2UpLGA8bGk+JHt0fTwvbGk+CmB9Y2hlY2tib3goe2NoZWNrZWQ6ZX0pe3JldHVybiI8aW5wdXQgIisoZT8nY2hlY2tlZD0iIiAnOiIiKSsnZGlzYWJsZWQ9IiIgdHlwZT0iY2hlY2tib3giPid9cGFyYWdyYXBoKHt0b2tlbnM6ZX0pe3JldHVybmA8cD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUpfTwvcD4KYH10YWJsZShlKXtsZXQgdD0iIixuPSIiO2ZvcihsZXQgbz0wO288ZS5oZWFkZXIubGVuZ3RoO28rKyluKz10aGlzLnRhYmxlY2VsbChlLmhlYWRlcltvXSk7dCs9dGhpcy50YWJsZXJvdyh7dGV4dDpufSk7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzxlLnJvd3MubGVuZ3RoO28rKyl7bGV0IGE9ZS5yb3dzW29dO249IiI7Zm9yKGxldCBpPTA7aTxhLmxlbmd0aDtpKyspbis9dGhpcy50YWJsZWNlbGwoYVtpXSk7cis9dGhpcy50YWJsZXJvdyh7dGV4dDpufSl9cmV0dXJuIHImJihyPWA8dGJvZHk+JHtyfTwvdGJvZHk+YCksYDx0YWJsZT4KPHRoZWFkPgpgK3QrYDwvdGhlYWQ+CmArcitgPC90YWJsZT4KYH10YWJsZXJvdyh7dGV4dDplfSl7cmV0dXJuYDx0cj4KJHtlfTwvdHI+CmB9dGFibGVjZWxsKGUpe2xldCB0PXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKSxuPWUuaGVhZGVyPyJ0aCI6InRkIjtyZXR1cm4oZS5hbGlnbj9gPCR7bn0gYWxpZ249IiR7ZS5hbGlnbn0iPmA6YDwke259PmApK3QrYDwvJHtufT4KYH1zdHJvbmcoe3Rva2VuczplfSl7cmV0dXJuYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L3N0cm9uZz5gfWVtKHt0b2tlbnM6ZX0pe3JldHVybmA8ZW0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2VtPmB9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybmA8Y29kZT4ke29yKGUsITApfTwvY29kZT5gfWJyKGUpe3JldHVybiI8YnI+In1kZWwoe3Rva2VuczplfSl7cmV0dXJuYDxkZWw+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2RlbD5gfWxpbmsoe2hyZWY6ZSx0aXRsZTp0LHRva2VuczpufSl7bGV0IHI9dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUobiksbz1MdyhlKTtpZihvPT09bnVsbClyZXR1cm4gcjtlPW87bGV0IGE9JzxhIGhyZWY9IicrZSsnIic7cmV0dXJuIHQmJihhKz0nIHRpdGxlPSInK29yKHQpKyciJyksYSs9Ij4iK3IrIjwvYT4iLGF9aW1hZ2Uoe2hyZWY6ZSx0aXRsZTp0LHRleHQ6bix0b2tlbnM6cn0pe3ImJihuPXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHIsdGhpcy5wYXJzZXIudGV4dFJlbmRlcmVyKSk7bGV0IG89THcoZSk7aWYobz09PW51bGwpcmV0dXJuIG9yKG4pO2U9bztsZXQgYT1gPGltZyBzcmM9IiR7ZX0iIGFsdD0iJHtufSJgO3JldHVybiB0JiYoYSs9YCB0aXRsZT0iJHtvcih0KX0iYCksYSs9Ij4iLGF9dGV4dChlKXtyZXR1cm4idG9rZW5zImluIGUmJmUudG9rZW5zP3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKToiZXNjYXBlZCJpbiBlJiZlLmVzY2FwZWQ/ZS50ZXh0Om9yKGUudGV4dCl9fSxkcz1jbGFzc3tzdHJvbmcoe3RleHQ6ZX0pe3JldHVybiBlfWVtKHt0ZXh0OmV9KXtyZXR1cm4gZX1jb2Rlc3Bhbih7dGV4dDplfSl7cmV0dXJuIGV9ZGVsKHt0ZXh0OmV9KXtyZXR1cm4gZX1odG1sKHt0ZXh0OmV9KXtyZXR1cm4gZX10ZXh0KHt0ZXh0OmV9KXtyZXR1cm4gZX1saW5rKHt0ZXh0OmV9KXtyZXR1cm4iIitlfWltYWdlKHt0ZXh0OmV9KXtyZXR1cm4iIitlfWJyKCl7cmV0dXJuIiJ9fSxBcj1jbGFzcyBvZntvcHRpb25zO3JlbmRlcmVyO3RleHRSZW5kZXJlcjtjb25zdHJ1Y3Rvcih0KXt0aGlzLm9wdGlvbnM9dHx8WW8sdGhpcy5vcHRpb25zLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IEVkLHRoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyLHRoaXMucmVuZGVyZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy5yZW5kZXJlci5wYXJzZXI9dGhpcyx0aGlzLnRleHRSZW5kZXJlcj1uZXcgZHN9c3RhdGljIHBhcnNlKHQsbil7cmV0dXJuIG5ldyBvZihuKS5wYXJzZSh0KX1zdGF0aWMgcGFyc2VJbmxpbmUodCxuKXtyZXR1cm4gbmV3IG9mKG4pLnBhcnNlSW5saW5lKHQpfXBhcnNlKHQsbj0hMCl7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCBhPXRbb107aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2EudHlwZV0pe2xldCBzPWEsbD10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbcy50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30scyk7aWYobCE9PSExfHwhWyJzcGFjZSIsImhyIiwiaGVhZGluZyIsImNvZGUiLCJ0YWJsZSIsImJsb2NrcXVvdGUiLCJsaXN0IiwiaHRtbCIsInBhcmFncmFwaCIsInRleHQiXS5pbmNsdWRlcyhzLnR5cGUpKXtyKz1sfHwiIjtjb250aW51ZX19bGV0IGk9YTtzd2l0Y2goaS50eXBlKXtjYXNlInNwYWNlIjp7cis9dGhpcy5yZW5kZXJlci5zcGFjZShpKTtjb250aW51ZX1jYXNlImhyIjp7cis9dGhpcy5yZW5kZXJlci5ocihpKTtjb250aW51ZX1jYXNlImhlYWRpbmciOntyKz10aGlzLnJlbmRlcmVyLmhlYWRpbmcoaSk7Y29udGludWV9Y2FzZSJjb2RlIjp7cis9dGhpcy5yZW5kZXJlci5jb2RlKGkpO2NvbnRpbnVlfWNhc2UidGFibGUiOntyKz10aGlzLnJlbmRlcmVyLnRhYmxlKGkpO2NvbnRpbnVlfWNhc2UiYmxvY2txdW90ZSI6e3IrPXRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShpKTtjb250aW51ZX1jYXNlImxpc3QiOntyKz10aGlzLnJlbmRlcmVyLmxpc3QoaSk7Y29udGludWV9Y2FzZSJodG1sIjp7cis9dGhpcy5yZW5kZXJlci5odG1sKGkpO2NvbnRpbnVlfWNhc2UicGFyYWdyYXBoIjp7cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoaSk7Y29udGludWV9Y2FzZSJ0ZXh0Ijp7bGV0IHM9aSxsPXRoaXMucmVuZGVyZXIudGV4dChzKTtmb3IoO28rMTx0Lmxlbmd0aCYmdFtvKzFdLnR5cGU9PT0idGV4dCI7KXM9dFsrK29dLGwrPWAKYCt0aGlzLnJlbmRlcmVyLnRleHQocyk7bj9yKz10aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh7dHlwZToicGFyYWdyYXBoIixyYXc6bCx0ZXh0OmwsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OmwsdGV4dDpsLGVzY2FwZWQ6ITB9XX0pOnIrPWw7Y29udGludWV9ZGVmYXVsdDp7bGV0IHM9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksIiI7dGhyb3cgbmV3IEVycm9yKHMpfX19cmV0dXJuIHJ9cGFyc2VJbmxpbmUodCxuPXRoaXMucmVuZGVyZXIpe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXQgYT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthLnR5cGVdKXtsZXQgcz10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbYS50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sYSk7aWYocyE9PSExfHwhWyJlc2NhcGUiLCJodG1sIiwibGluayIsImltYWdlIiwic3Ryb25nIiwiZW0iLCJjb2Rlc3BhbiIsImJyIiwiZGVsIiwidGV4dCJdLmluY2x1ZGVzKGEudHlwZSkpe3IrPXN8fCIiO2NvbnRpbnVlfX1sZXQgaT1hO3N3aXRjaChpLnR5cGUpe2Nhc2UiZXNjYXBlIjp7cis9bi50ZXh0KGkpO2JyZWFrfWNhc2UiaHRtbCI6e3IrPW4uaHRtbChpKTticmVha31jYXNlImxpbmsiOntyKz1uLmxpbmsoaSk7YnJlYWt9Y2FzZSJpbWFnZSI6e3IrPW4uaW1hZ2UoaSk7YnJlYWt9Y2FzZSJzdHJvbmciOntyKz1uLnN0cm9uZyhpKTticmVha31jYXNlImVtIjp7cis9bi5lbShpKTticmVha31jYXNlImNvZGVzcGFuIjp7cis9bi5jb2Rlc3BhbihpKTticmVha31jYXNlImJyIjp7cis9bi5icihpKTticmVha31jYXNlImRlbCI6e3IrPW4uZGVsKGkpO2JyZWFrfWNhc2UidGV4dCI6e3IrPW4udGV4dChpKTticmVha31kZWZhdWx0OntsZXQgcz0nVG9rZW4gd2l0aCAiJytpLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihzKSwiIjt0aHJvdyBuZXcgRXJyb3Iocyl9fX1yZXR1cm4gcn19LGtkPWNsYXNze29wdGlvbnM7YmxvY2s7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fFlvfXN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzPW5ldyBTZXQoWyJwcmVwcm9jZXNzIiwicG9zdHByb2Nlc3MiLCJwcm9jZXNzQWxsVG9rZW5zIl0pO3ByZXByb2Nlc3MoZSl7cmV0dXJuIGV9cG9zdHByb2Nlc3MoZSl7cmV0dXJuIGV9cHJvY2Vzc0FsbFRva2VucyhlKXtyZXR1cm4gZX1wcm92aWRlTGV4ZXIoKXtyZXR1cm4gdGhpcy5ibG9jaz9Eci5sZXg6RHIubGV4SW5saW5lfXByb3ZpZGVQYXJzZXIoKXtyZXR1cm4gdGhpcy5ibG9jaz9Bci5wYXJzZTpBci5wYXJzZUlubGluZX19LFZOPWNsYXNze2RlZmF1bHRzPWFmKCk7b3B0aW9ucz10aGlzLnNldE9wdGlvbnM7cGFyc2U9dGhpcy5wYXJzZU1hcmtkb3duKCEwKTtwYXJzZUlubGluZT10aGlzLnBhcnNlTWFya2Rvd24oITEpO1BhcnNlcj1BcjtSZW5kZXJlcj1FZDtUZXh0UmVuZGVyZXI9ZHM7TGV4ZXI9RHI7VG9rZW5pemVyPVNkO0hvb2tzPWtkO2NvbnN0cnVjdG9yKC4uLmUpe3RoaXMudXNlKC4uLmUpfXdhbGtUb2tlbnMoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgZSlzd2l0Y2gobj1uLmNvbmNhdCh0LmNhbGwodGhpcyxyKSksci50eXBlKXtjYXNlInRhYmxlIjp7bGV0IG89cjtmb3IobGV0IGEgb2Ygby5oZWFkZXIpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsdCkpO2ZvcihsZXQgYSBvZiBvLnJvd3MpZm9yKGxldCBpIG9mIGEpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoaS50b2tlbnMsdCkpO2JyZWFrfWNhc2UibGlzdCI6e2xldCBvPXI7bj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoby5pdGVtcyx0KSk7YnJlYWt9ZGVmYXVsdDp7bGV0IG89cjt0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bby50eXBlXT90aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbby50eXBlXS5mb3JFYWNoKGE9PntsZXQgaT1vW2FdLmZsYXQoMS8wKTtuPW4uY29uY2F0KHRoaXMud2Fsa1Rva2VucyhpLHQpKX0pOm8udG9rZW5zJiYobj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoby50b2tlbnMsdCkpKX19cmV0dXJuIG59dXNlKC4uLmUpe2xldCB0PXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9uc3x8e3JlbmRlcmVyczp7fSxjaGlsZFRva2Vuczp7fX07cmV0dXJuIGUuZm9yRWFjaChuPT57bGV0IHI9ey4uLm59O2lmKHIuYXN5bmM9dGhpcy5kZWZhdWx0cy5hc3luY3x8ci5hc3luY3x8ITEsbi5leHRlbnNpb25zJiYobi5leHRlbnNpb25zLmZvckVhY2gobz0+e2lmKCFvLm5hbWUpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbmFtZSByZXF1aXJlZCIpO2lmKCJyZW5kZXJlciJpbiBvKXtsZXQgYT10LnJlbmRlcmVyc1tvLm5hbWVdO2E/dC5yZW5kZXJlcnNbby5uYW1lXT1mdW5jdGlvbiguLi5pKXtsZXQgcz1vLnJlbmRlcmVyLmFwcGx5KHRoaXMsaSk7cmV0dXJuIHM9PT0hMSYmKHM9YS5hcHBseSh0aGlzLGkpKSxzfTp0LnJlbmRlcmVyc1tvLm5hbWVdPW8ucmVuZGVyZXJ9aWYoInRva2VuaXplciJpbiBvKXtpZighby5sZXZlbHx8by5sZXZlbCE9PSJibG9jayImJm8ubGV2ZWwhPT0iaW5saW5lIil0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTtsZXQgYT10W28ubGV2ZWxdO2E/YS51bnNoaWZ0KG8udG9rZW5pemVyKTp0W28ubGV2ZWxdPVtvLnRva2VuaXplcl0sby5zdGFydCYmKG8ubGV2ZWw9PT0iYmxvY2siP3Quc3RhcnRCbG9jaz90LnN0YXJ0QmxvY2sucHVzaChvLnN0YXJ0KTp0LnN0YXJ0QmxvY2s9W28uc3RhcnRdOm8ubGV2ZWw9PT0iaW5saW5lIiYmKHQuc3RhcnRJbmxpbmU/dC5zdGFydElubGluZS5wdXNoKG8uc3RhcnQpOnQuc3RhcnRJbmxpbmU9W28uc3RhcnRdKSl9ImNoaWxkVG9rZW5zImluIG8mJm8uY2hpbGRUb2tlbnMmJih0LmNoaWxkVG9rZW5zW28ubmFtZV09by5jaGlsZFRva2Vucyl9KSxyLmV4dGVuc2lvbnM9dCksbi5yZW5kZXJlcil7bGV0IG89dGhpcy5kZWZhdWx0cy5yZW5kZXJlcnx8bmV3IEVkKHRoaXMuZGVmYXVsdHMpO2ZvcihsZXQgYSBpbiBuLnJlbmRlcmVyKXtpZighKGEgaW4gbykpdGhyb3cgbmV3IEVycm9yKGByZW5kZXJlciAnJHthfScgZG9lcyBub3QgZXhpc3RgKTtpZihbIm9wdGlvbnMiLCJwYXJzZXIiXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi5yZW5kZXJlcltpXSxsPW9baV07b1tpXT0oLi4uZCk9PntsZXQgYz1zLmFwcGx5KG8sZCk7cmV0dXJuIGM9PT0hMSYmKGM9bC5hcHBseShvLGQpKSxjfHwiIn19ci5yZW5kZXJlcj1vfWlmKG4udG9rZW5pemVyKXtsZXQgbz10aGlzLmRlZmF1bHRzLnRva2VuaXplcnx8bmV3IFNkKHRoaXMuZGVmYXVsdHMpO2ZvcihsZXQgYSBpbiBuLnRva2VuaXplcil7aWYoIShhIGluIG8pKXRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke2F9JyBkb2VzIG5vdCBleGlzdGApO2lmKFsib3B0aW9ucyIsInJ1bGVzIiwibGV4ZXIiXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi50b2tlbml6ZXJbaV0sbD1vW2ldO29baV09KC4uLmQpPT57bGV0IGM9cy5hcHBseShvLGQpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkobyxkKSksY319ci50b2tlbml6ZXI9b31pZihuLmhvb2tzKXtsZXQgbz10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcga2Q7Zm9yKGxldCBhIGluIG4uaG9va3Mpe2lmKCEoYSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoYGhvb2sgJyR7YX0nIGRvZXMgbm90IGV4aXN0YCk7aWYoWyJvcHRpb25zIiwiYmxvY2siXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi5ob29rc1tpXSxsPW9baV07a2QucGFzc1Rocm91Z2hIb29rcy5oYXMoYSk/b1tpXT1kPT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMuY2FsbChvLGQpKS50aGVuKHA9PmwuY2FsbChvLHApKTtsZXQgYz1zLmNhbGwobyxkKTtyZXR1cm4gbC5jYWxsKG8sYyl9Om9baV09KC4uLmQpPT57bGV0IGM9cy5hcHBseShvLGQpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkobyxkKSksY319ci5ob29rcz1vfWlmKG4ud2Fsa1Rva2Vucyl7bGV0IG89dGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zLGE9bi53YWxrVG9rZW5zO3Iud2Fsa1Rva2Vucz1mdW5jdGlvbihpKXtsZXQgcz1bXTtyZXR1cm4gcy5wdXNoKGEuY2FsbCh0aGlzLGkpKSxvJiYocz1zLmNvbmNhdChvLmNhbGwodGhpcyxpKSkpLHN9fXRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4ucn19KSx0aGlzfXNldE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uZX0sdGhpc31sZXhlcihlLHQpe3JldHVybiBEci5sZXgoZSx0Pz90aGlzLmRlZmF1bHRzKX1wYXJzZXIoZSx0KXtyZXR1cm4gQXIucGFyc2UoZSx0Pz90aGlzLmRlZmF1bHRzKX1wYXJzZU1hcmtkb3duKGUpe3JldHVybihuLHIpPT57bGV0IG89ey4uLnJ9LGE9ey4uLnRoaXMuZGVmYXVsdHMsLi4ub30saT10aGlzLm9uRXJyb3IoISFhLnNpbGVudCwhIWEuYXN5bmMpO2lmKHRoaXMuZGVmYXVsdHMuYXN5bmM9PT0hMCYmby5hc3luYz09PSExKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLiIpKTtpZih0eXBlb2Ygbj4idSJ8fG49PT1udWxsKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCIpKTtpZih0eXBlb2YgbiE9InN0cmluZyIpcmV0dXJuIGkobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgIitPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikrIiwgc3RyaW5nIGV4cGVjdGVkIikpO2EuaG9va3MmJihhLmhvb2tzLm9wdGlvbnM9YSxhLmhvb2tzLmJsb2NrPWUpO2xldCBzPWEuaG9va3M/YS5ob29rcy5wcm92aWRlTGV4ZXIoKTplP0RyLmxleDpEci5sZXhJbmxpbmUsbD1hLmhvb2tzP2EuaG9va3MucHJvdmlkZVBhcnNlcigpOmU/QXIucGFyc2U6QXIucGFyc2VJbmxpbmU7aWYoYS5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEuaG9va3M/YS5ob29rcy5wcmVwcm9jZXNzKG4pOm4pLnRoZW4oZD0+cyhkLGEpKS50aGVuKGQ9PmEuaG9va3M/YS5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKGQpOmQpLnRoZW4oZD0+YS53YWxrVG9rZW5zP1Byb21pc2UuYWxsKHRoaXMud2Fsa1Rva2VucyhkLGEud2Fsa1Rva2VucykpLnRoZW4oKCk9PmQpOmQpLnRoZW4oZD0+bChkLGEpKS50aGVuKGQ9PmEuaG9va3M/YS5ob29rcy5wb3N0cHJvY2VzcyhkKTpkKS5jYXRjaChpKTt0cnl7YS5ob29rcyYmKG49YS5ob29rcy5wcmVwcm9jZXNzKG4pKTtsZXQgZD1zKG4sYSk7YS5ob29rcyYmKGQ9YS5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKGQpKSxhLndhbGtUb2tlbnMmJnRoaXMud2Fsa1Rva2VucyhkLGEud2Fsa1Rva2Vucyk7bGV0IGM9bChkLGEpO3JldHVybiBhLmhvb2tzJiYoYz1hLmhvb2tzLnBvc3Rwcm9jZXNzKGMpKSxjfWNhdGNoKGQpe3JldHVybiBpKGQpfX19b25FcnJvcihlLHQpe3JldHVybiBuPT57aWYobi5tZXNzYWdlKz1gClBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vbWFya2VkanMvbWFya2VkLmAsZSl7bGV0IHI9IjxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPiIrb3Iobi5tZXNzYWdlKyIiLCEwKSsiPC9wcmU+IjtyZXR1cm4gdD9Qcm9taXNlLnJlc29sdmUocik6cn1pZih0KXJldHVybiBQcm9taXNlLnJlamVjdChuKTt0aHJvdyBufX19LEtvPW5ldyBWTjtmdW5jdGlvbiBDZShlLHQpe3JldHVybiBLby5wYXJzZShlLHQpfUNlLm9wdGlvbnM9Q2Uuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gS28uc2V0T3B0aW9ucyhlKSxDZS5kZWZhdWx0cz1Lby5kZWZhdWx0cyxGdyhDZS5kZWZhdWx0cyksQ2V9O0NlLmdldERlZmF1bHRzPWFmO0NlLmRlZmF1bHRzPVlvO0NlLnVzZT1mdW5jdGlvbiguLi5lKXtyZXR1cm4gS28udXNlKC4uLmUpLENlLmRlZmF1bHRzPUtvLmRlZmF1bHRzLEZ3KENlLmRlZmF1bHRzKSxDZX07Q2Uud2Fsa1Rva2Vucz1mdW5jdGlvbihlLHQpe3JldHVybiBLby53YWxrVG9rZW5zKGUsdCl9O0NlLnBhcnNlSW5saW5lPUtvLnBhcnNlSW5saW5lO0NlLlBhcnNlcj1BcjtDZS5wYXJzZXI9QXIucGFyc2U7Q2UuUmVuZGVyZXI9RWQ7Q2UuVGV4dFJlbmRlcmVyPWRzO0NlLkxleGVyPURyO0NlLmxleGVyPURyLmxleDtDZS5Ub2tlbml6ZXI9U2Q7Q2UuSG9va3M9a2Q7Q2UucGFyc2U9Q2U7dmFyIERVPUNlLm9wdGlvbnMsQVU9Q2Uuc2V0T3B0aW9ucyxfVT1DZS51c2UsQ1U9Q2Uud2Fsa1Rva2VucyxRdz1DZS5wYXJzZUlubGluZTt2YXIgT1U9QXIucGFyc2UsSVU9RHIubGV4O0NlLnVzZSh7YnJlYWtzOiEwLGdmbTohMCxyZW5kZXJlcjp7bGluayh7aHJlZjplLHRpdGxlOnQsdGV4dDpufSl7bGV0IHI9dD9gIHRpdGxlPSIke3R9ImA6IiI7cmV0dXJuYDxhIGhyZWY9IiR7ZX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiJHtyfT4ke259PC9hPmB9fX0pO2Z1bmN0aW9uIEJhKGUpe3JldHVybiBlP0NlLnBhcnNlSW5saW5lKGUpOiIifWZ1bmN0aW9uIGhmKGUpe3JldHVybiBlP0NlLnBhcnNlKGUpOiIifWZ1bmN0aW9uIEp3KGUpe2lmKCFlKXJldHVybiIiO2xldCB0PWUucmVwbGFjZSgvXFsoW15cXV0rKVxdXFtcXj9cZCtcXS9nLCIkMSIpLnJlcGxhY2UoL1xbXF5bXlxdXSpcXS9nLCIiKS5yZXBsYWNlKC89PShbXj1dKyk9PS9nLCIkMSIpO3JldHVybiBRdyh0LHtyZW5kZXJlcjpuZXcgZHN9KS50cmltKCl9dmFyIEFkPVUoeWUoKSk7dmFyIHR0PVUoeWUoKSksX3I9VShlZSgpKSxEZD0iZGFzaGJvYXJkOndpZGdldC1mb2N1cy1yZXF1ZXN0IixLTj0yZTMsZ2Y9ImRhc2hib2FyZDp3aWRnZXQtZHJhZy1yZWFkeSIsWHc9MjIwO2Z1bmN0aW9uIFlOKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudD8hIWUuY2xvc2VzdCgiYnV0dG9uLCBhLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgW3JvbGU9J2J1dHRvbiddIik6ITF9ZnVuY3Rpb24gY3MoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuITE7bGV0IGU9bmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsdD0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QoZSksbj1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM+MSYmL01hY2ludG9zaC8udGVzdChlKTtyZXR1cm4hdCYmIW4mJndpbmRvdy5pbm5lcldpZHRoPjgwMH1mdW5jdGlvbiBxTihlLHQsbil7aWYoIUFycmF5LmlzQXJyYXkoZSl8fCF0fHwhbnx8dD09PW4pcmV0dXJuIGU7bGV0IHI9ZS5maW5kSW5kZXgobD0+bD8ud2lkZ2V0SWQ9PT10KSxvPWUuZmluZEluZGV4KGw9Pmw/LndpZGdldElkPT09bik7aWYocjwwfHxvPDB8fHI9PT1vKXJldHVybiBlO2xldCBhPVsuLi5lXSxbaV09YS5zcGxpY2UociwxKSxzPXI8bz9vLTE6bztyZXR1cm4gYS5zcGxpY2UocywwLGkpLGF9ZnVuY3Rpb24gUU4oKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBuZXcgTWFwO2xldCBlPW5ldyBNYXA7cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpLmZvckVhY2gobj0+e2xldCByPW4uZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO3ImJmUuc2V0KHIsbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9KSxlfWZ1bmN0aW9uIEpOKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgTWFwKXx8ZS5zaXplPT09MHx8dHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm47bGV0IG49W107ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1ncmlkIC5ncmlkLWNlbGxbZGF0YS13aWRnZXQtaWRdIikuZm9yRWFjaChvPT57bGV0IGE9by5nZXRBdHRyaWJ1dGUoImRhdGEtd2lkZ2V0LWlkIik7aWYoIWF8fGE9PT10KXJldHVybjtsZXQgaT1lLmdldChhKTtpZighaSlyZXR1cm47bGV0IHM9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPWkubGVmdC1zLmxlZnQsZD1pLnRvcC1zLnRvcDtNYXRoLmFicyhsKTwxJiZNYXRoLmFicyhkKTwxfHwoby5zdHlsZS50cmFuc2l0aW9uPSJub25lIixvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteCIsYCR7bH1weGApLG8uc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC15IixgJHtkfXB4YCksbi5wdXNoKG8pKX0pLG4ubGVuZ3RoIT09MCYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e24uZm9yRWFjaChvPT57by5zdHlsZS50cmFuc2l0aW9uPWB0cmFuc2Zvcm0gJHtYd31tcyBlYXNlYCxvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteCIsIjBweCIpLG8uc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC15IiwiMHB4Iil9KSx3aW5kb3cuc2V0VGltZW91dCgoKT0+e24uZm9yRWFjaChvPT5vLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIikpfSxYdys0MCl9KX1mdW5jdGlvbiBadyhlKXtyZXR1cm4oZXx8W10pLm1hcCh0PT50Py53aWRnZXRJZCkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oInwiKX1mdW5jdGlvbiBlYihlLHQpe2xldFtuLHJdPSgwLHR0LnVzZVN0YXRlKShudWxsKSxbbyxhXT0oMCx0dC51c2VTdGF0ZSkoZSksaT0oMCx0dC51c2VSZWYpKGUpLHM9KDAsdHQudXNlUmVmKShudWxsKTsoMCx0dC51c2VFZmZlY3QpKCgpPT57bnx8YShlKX0sW2Usbl0pLCgwLHR0LnVzZUVmZmVjdCkoKCk9PntpLmN1cnJlbnQ9b30sW29dKSwoMCx0dC51c2VMYXlvdXRFZmZlY3QpKCgpPT57bGV0IGQ9cy5jdXJyZW50OyFufHwhZHx8KHMuY3VycmVudD1udWxsLEpOKGQsbikpfSxbbyxuXSksKDAsdHQudXNlRWZmZWN0KSgoKT0+e2xldCBkPWM9PntsZXQgcD1jPy5kZXRhaWw/LndpZGdldElkO3AmJihyKHApLGEodT0+QXJyYXkuaXNBcnJheSh1KSYmdS5sZW5ndGg/dTplKSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihnZixkKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZ2YsZCl9LFtlXSk7bGV0IGw9KDAsdHQudXNlQ2FsbGJhY2spKCgpPT57aWYoIW4pcmV0dXJuO2xldCBkPVp3KGUpLGM9WncoaS5jdXJyZW50KTtyKG51bGwpLGMmJmQhPT1jJiZ0KGkuY3VycmVudC5tYXAocD0+cC53aWRnZXRJZCkpfSxbZSxuLHRdKTtyZXR1cm4oMCx0dC51c2VFZmZlY3QpKCgpPT57aWYoIW4pcmV0dXJuO2xldCBkPXU9PntpZigodS5idXR0b25zJjEpIT09MSl7bCgpO3JldHVybn1sZXQgdz1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHUuY2xpZW50WCx1LmNsaWVudFkpPy5jbG9zZXN0Py4oIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpPy5nZXRBdHRyaWJ1dGU/LigiZGF0YS13aWRnZXQtaWQiKTtpZighd3x8dz09PW4pcmV0dXJuO2xldCBiPVFOKCk7YShnPT57bGV0IG09cU4oZyxuLHcpO3JldHVybiBtIT09ZyYmKHMuY3VycmVudD1iKSxtfSl9LGM9KCk9PmwoKSxwPSgpPT5sKCk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGQpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixjKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIscCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixkKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHApfX0sW24sbF0pLHtkcmFnZ2luZ1dpZGdldElkOm4sZGlzcGxheWVkQ29tcG9uZW50czpvfX1mdW5jdGlvbiBtZih7Y29uZmlndXJhYmxlOmUsaGVhZGVyQWN0aW9uczp0LGljb246bixvbkNvbmZpZ3VyZTpyLHN1YnRpdGxlOm8sdGl0bGU6YSx3aWRnZXRJZDppfSl7bGV0W3MsbF09KDAsdHQudXNlU3RhdGUpKCgpPT5jcygpKSxkPSgwLHR0LnVzZVJlZikobnVsbCksYz0oMCx0dC51c2VSZWYpKG51bGwpLHA9KDAsdHQudXNlUmVmKSghMSksdT0oMCx0dC51c2VNZW1vKSgoKT0+KHt3aWRnZXRJZDppfSksW2ldKTtyZXR1cm4oMCx0dC51c2VFZmZlY3QpKCgpPT57bGV0IGY9KCk9PmwoY3MoKSk7cmV0dXJuIGYoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZil9LFtdKSwoMCx0dC51c2VFZmZlY3QpKCgpPT57bGV0IGY9ZC5jdXJyZW50O2lmKCFmKXJldHVybjtsZXQgdj0oKT0+e2MuY3VycmVudCE9bnVsbCYmKHdpbmRvdy5jbGVhclRpbWVvdXQoYy5jdXJyZW50KSxjLmN1cnJlbnQ9bnVsbCl9LHc9bT0+e2YuY2xhc3NMaXN0LnRvZ2dsZSgid2lkZ2V0LWhlYWRpbmctYmFyLS1kcmFnLXJlYWR5IiwhIW0pfSxiPW09PnttLmJ1dHRvbj09PTAmJihZTihtLnRhcmdldCl8fChwLmN1cnJlbnQ9ITEsdyghMSksdigpLGMuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e3AuY3VycmVudD0hMCx3KCEwKSx3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZ2Yse2RldGFpbDp1fSkpfSxLTikpKX0sZz0oKT0+e3YoKSxwLmN1cnJlbnQ9ITEsdyghMSl9O3JldHVybiBmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsYiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGcpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixnKSwoKT0+e3YoKSx3KCExKSxmLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsYiksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGcpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixnKX19LFt1XSksKDAsX3IuanN4cykoImRpdiIse3JlZjpkLGNsYXNzTmFtZTpgd2lkZ2V0LWhlYWRlciB3aWRnZXQtaGVhZGluZy1iYXIke3M/IiB3aWRnZXQtaGVhZGluZy1iYXItLWZvY3VzYWJsZSI6IiJ9YCxjaGlsZHJlbjpbcz8oMCxfci5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1pY29uIHdpZGdldC1pY29uLWJ1dHRvbiIsdHlwZToiYnV0dG9uIix0aXRsZTpgRm9jdXMgJHthfWAsImFyaWEtbGFiZWwiOmBGb2N1cyAke2F9YCxvbkNsaWNrOigpPT53aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRGQse2RldGFpbDp1fSkpLGNoaWxkcmVuOm59KTooMCxfci5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaWNvbiIsY2hpbGRyZW46bn0pLCgwLF9yLmpzeHMpKCJoMyIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlIixjaGlsZHJlbjpbKDAsX3IuanN4KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19sYWJlbCIsY2hpbGRyZW46YX0pLG8/KDAsX3IuanN4KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19zdWJ0aXRsZSIsY2hpbGRyZW46b30pOm51bGxdfSksdHx8bnVsbCxlPygwLF9yLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWNvbmZpZ3VyZSIsb25DbGljazpyLGNoaWxkcmVuOiJcdTI2OTkgQ29uZmlndXJlIn0pOm51bGxdfSl9dmFyIHVzPVUoZWUoKSksdmY9KDAsQWQuY3JlYXRlQ29udGV4dCkobnVsbCk7ZnVuY3Rpb24gaWUoe2FwcDplLGNoaWxkcmVuOnQsY29uZmlndXJhYmxlOm4sZ3JpZEhlaWdodFNpemU6cixncmlkV2lkdGhTaXplOm8saGVhZGVyQWN0aW9uczphLGljb246aSxvbkNvbmZpZ3VyZTpzLHN1YnRpdGxlOmwsdGl0bGU6ZCx3aWRnZXRJZDpjfSl7bGV0IHA9KDAsQWQudXNlQ29udGV4dCkodmYpLHU9YXN5bmMoKT0+e3M/cygpOmUmJmF3YWl0IGUuY29uZmlndXJlKGMpJiZ3aW5kb3cubG9jYXRpb24ucmVsb2FkKCl9LGY9bz8/cD8uZ3JpZFdpZHRoU2l6ZSx2PXI/P3A/LmdyaWRIZWlnaHRTaXplLHc9TnVtYmVyKGYpPjA/TnVtYmVyKGYpOjEsYj1OdW1iZXIodik+MD9OdW1iZXIodik6MSxnPWBob3Jpem9udGFsLSR7d30tY2VsbCB2ZXJ0aWNhbC0ke2J9LWNlbGxgO3JldHVybigwLHVzLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6YHdpZGdldCB3aWRnZXQtJHtjfSAke2d9YCxjaGlsZHJlbjpbKDAsdXMuanN4KShtZix7Y29uZmlndXJhYmxlOm4saGVhZGVyQWN0aW9uczphLGljb246aSxzdWJ0aXRsZTpsLHRpdGxlOmQsd2lkZ2V0SWQ6YyxvbkNvbmZpZ3VyZTp1fSksKDAsdXMuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJ3aWRnZXQtYm9keSIsY2hpbGRyZW46dH0pXX0pfXZhciBiZT1VKGVlKCkpO2FzeW5jIGZ1bmN0aW9uIFhOKGUsdCl7cmV0dXJuIHQubm90ZVVVSUQ/YXdhaXQgd2QoZSx0Lm5vdGVVVUlEKTphd2FpdCBEdyhlLHQpfWFzeW5jIGZ1bmN0aW9uIHRiKGUsdCx7YWN0aXZlVGFiOm4sc2V0QWN0aXZlVGFiOnIsc2V0TW9udGhMb2FkaW5nOm8sc2V0TW9udGhDb250ZW50OmF9KXtpZihuPT09dC5pbmRleCl7cihudWxsKSxhKG51bGwpO3JldHVybn1yKHQuaW5kZXgpLG8oITApLGEobnVsbCk7bGV0IGk9dC5wbGFuLm5vdGVVVUlEO3RyeXtpZighaSlhKHtmb3VuZDohMSxwbGFuOnQucGxhbixtb250aE5hbWU6dC5mdWxsLHllYXI6dC5wbGFuLnllYXJ9KTtlbHNle2xldCBzPWF3YWl0IHlkKGUsaSx0LmZ1bGwpO2soYFtQbGFubmluZ10gUmF3IG1hcmtkb3duIGZvciAke3QuZnVsbH06YCxzPy5jb250ZW50KSxhKHsuLi5zLHBsYW46dC5wbGFuLG1vbnRoTmFtZTp0LmZ1bGwseWVhcjp0LnBsYW4ueWVhcn0pfX1jYXRjaHthKHtmb3VuZDohMSxwbGFuOnQucGxhbixtb250aE5hbWU6dC5mdWxsLHllYXI6dC5wbGFuLnllYXJ9KX1maW5hbGx5e28oITEpfX1hc3luYyBmdW5jdGlvbiBaTihlLHQse3NldE1vbnRoTG9hZGluZzpuLHNldE1vbnRoQ29udGVudDpyfSl7aWYodCl7bighMCk7dHJ5e2xldCBvPWF3YWl0IEF3KGUsdC5wbGFuLHQubW9udGhOYW1lKTtpZihvJiZvLm5vdGVVVUlEKXJldHVybiByKGE9Pih7Li4uYSxmb3VuZDohMCxjb250ZW50Om8uY29udGVudHx8IiJ9KSksYXdhaXQgd2QoZSxvLm5vdGVVVUlEKX1jYXRjaHt9ZmluYWxseXtuKCExKX19fWFzeW5jIGZ1bmN0aW9uIGVUKGUsdCxuLHIsbyl7cighMCk7dHJ5e2xldCBhPWF3YWl0IF93KGUsdCxuKTtpZihhPy5ub3RlVVVJRClyZXR1cm4gbyh7Zm91bmQ6ITAsY29udGVudDphLmNvbnRlbnR8fCIifSksYXdhaXQgd2QoZSxhLm5vdGVVVUlEKX1jYXRjaHt9ZmluYWxseXtyKCExKX19ZnVuY3Rpb24gdFQoe3BsYW46ZSxvbkNhcmRDbGljazp0fSl7bGV0IG49ISFlLm5vdGVVVUlELHI9ISFlLmhhc0FsbE1vbnRobHlEZXRhaWxzLG89InF1YXJ0ZXItY2FyZCIrKG4/IiBxdWFydGVyLWNhcmQtLWhhcy1wbGFuIjoiIiksYT1yPyJcdTI3MDUiOiJcdXsxRjZBN30iLGk9cj8iQWxsIDMgbW9udGhzIGluIHRoaXMgcXVhcnRlciBoYXZlIGJlZW4gcGxhbm5lZC4iOiJNb250aGx5IGRldGFpbHMgYXJlIG1pc3NpbmcgZm9yIG9uZSBvciBtb3JlIG1vbnRocyBcdTIwMTQgdGhpcyBwbGFuIGlzIGEgd29yayBpbiBwcm9ncmVzcy4iO3JldHVybigwLGJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6byxvbkNsaWNrOnQsY2hpbGRyZW46WygwLGJlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItbGFiZWwiLGNoaWxkcmVuOmUubGFiZWx9KSwoMCxiZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJxdWFydGVyLXN0YXR1cy1yb3ciLGNoaWxkcmVuOlsoMCxiZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxdWFydGVyLXN0YXR1cyIsY2hpbGRyZW46bj8iXHV7MUY0RER9IE9wZW4gUGxhbiI6IisgQ3JlYXRlIFBsYW4ifSksbj8oMCxiZS5qc3gpKHRzLHtjb250ZW50OmkscGxhY2VtZW50OiJib3R0b20iLGNoaWxkcmVuOigwLGJlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItcGxhbi1pbmRpY2F0b3IiLG9uQ2xpY2s6cz0+cy5zdG9wUHJvcGFnYXRpb24oKSxjaGlsZHJlbjphfSl9KTpudWxsXX0pXX0pfWZ1bmN0aW9uIG5UKHttb250aExvYWRpbmc6ZSxtb250aENvbnRlbnQ6dCxvbkNyZWF0ZVBsYW46bn0pe3JldHVybiBlPygwLGJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1sb2FkaW5nIixjaGlsZHJlbjoiTG9hZGluZ1x1MjAyNiJ9KTp0P3QuZm91bmQ/KDAsYmUuanN4cykoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCIsY2hpbGRyZW46WygwLGJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIiLGNoaWxkcmVuOnQubW9udGhOYW1lfSksKDAsYmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6aGYodC5jb250ZW50KXx8IjxwPihFbXB0eSBzZWN0aW9uKTwvcD4ifX0pXX0pOigwLGJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1lbXB0eSIsY2hpbGRyZW46KDAsYmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjcmVhdGUtbW9udGgtcGxhbi1saW5rIixvbkNsaWNrOm4sY2hpbGRyZW46YENyZWF0ZSBhIHBsYW4gZm9yICR7dC5tb250aE5hbWV9ICR7dC55ZWFyfWB9KX0pOm51bGx9ZnVuY3Rpb24gclQoe3dlZWtMYWJlbDplLHllYXI6dCx3ZWVrTG9hZGluZzpuLHdlZWtDb250ZW50OnIsb25DcmVhdGVXZWVrUGxhbjpvfSl7cmV0dXJuIG4/KDAsYmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJ3ZWVrbHktcGxhbi1zZWN0aW9uIixjaGlsZHJlbjooMCxiZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLWxvYWRpbmciLGNoaWxkcmVuOiJMb2FkaW5nXHUyMDI2In0pfSk6cj8uZm91bmQ/KDAsYmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWFyZWEiLGNoaWxkcmVuOigwLGJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQiLGNoaWxkcmVuOlsoMCxiZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtaGVhZGVyIixjaGlsZHJlbjplfSksKDAsYmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6aGYoci5jb250ZW50KXx8IjxwPihFbXB0eSBzZWN0aW9uKTwvcD4ifX0pXX0pfSk6KDAsYmUuanN4cykoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4tc2VjdGlvbiIsY2hpbGRyZW46WygwLGJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4taGVhZGVyIixjaGlsZHJlbjoiV2Vla2x5IFBsYW4ifSksKDAsYmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjcmVhdGUtd2Vlay1wbGFuLWxpbmsiLG9uQ2xpY2s6byxjaGlsZHJlbjpgQ3JlYXRlIGEgd2Vla2x5IHBsYW4gZm9yICR7ZX0sICR7dH1gfSldfSl9ZnVuY3Rpb24geWYoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQ9MSxxdWFydGVybHlQbGFuczpufSl7bGV0W3Isb109KDAsS24udXNlU3RhdGUpKG51bGwpLFthLGldPSgwLEtuLnVzZVN0YXRlKShudWxsKSxbcyxsXT0oMCxLbi51c2VTdGF0ZSkoITEpLFtkLGNdPSgwLEtuLnVzZVN0YXRlKShudWxsKSxbcCx1XT0oMCxLbi51c2VTdGF0ZSkoITEpLFtmLHZdPSgwLEtuLnVzZVN0YXRlKSghMSksW3csYl09KDAsS24udXNlU3RhdGUpKG51bGwpLGc9dD49MjtpZih3JiZ4bilyZXR1cm4oMCxiZS5qc3gpKGllLHt0aXRsZTpsZSgicGxhbm5pbmciKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJwbGFubmluZyIsY2hpbGRyZW46KDAsYmUuanN4KSh0Zix7YXBwOmUsbm90ZVVVSUQ6dyxvbkJhY2s6KCk9PmIobnVsbCl9KX0pO2lmKCFuPy5jdXJyZW50fHwhbj8ubmV4dClyZXR1cm4oMCxiZS5qc3gpKGllLHt0aXRsZTpsZSgicGxhbm5pbmciKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJwbGFubmluZyIsY2hpbGRyZW46KDAsYmUuanN4KSgicCIse2NsYXNzTmFtZToicGxhbm5pbmctZW1wdHkiLGNoaWxkcmVuOiJMb2FkaW5nIHF1YXJ0ZXJseSBwbGFuc1x1MjAyNiJ9KX0pO2xldCBtPUN5KG4uY3VycmVudCxuLm5leHQpLHk9e2FjdGl2ZVRhYjpyLHNldEFjdGl2ZVRhYjpvLHNldE1vbnRoTG9hZGluZzpsLHNldE1vbnRoQ29udGVudDppfSxoPXtzZXRNb250aExvYWRpbmc6bCxzZXRNb250aENvbnRlbnQ6aX0seD1EPT57RD8uZGV2RWRpdCYmRC5ub3RlVVVJRCYmYihELm5vdGVVVUlEKX0sRT1hZCgpLFQ9aWQoRSk7cmV0dXJuKDAsS24udXNlRWZmZWN0KSgoKT0+e2lmKGYpcmV0dXJuO2xldCBEPW0uZmluZChBPT5BLmN1cnJlbnQpO0QmJih2KCEwKSx0YihlLEQseSkpfSxbZl0pLCgwLEtuLnVzZUVmZmVjdCkoKCk9PntpZighZylyZXR1cm47bGV0IEQ9bi5jdXJyZW50Py5ub3RlVVVJRDtEJiYodSghMCkseWQoZSxELFQpLnRoZW4oQT0+e2soYFtQbGFubmluZ10gV2Vla2x5IHNlY3Rpb24gIiR7VH0iOmAsQSksYyhBKX0pLmNhdGNoKCgpPT5jKHtmb3VuZDohMSxjb250ZW50Om51bGx9KSkuZmluYWxseSgoKT0+dSghMSkpKX0sW2csbi5jdXJyZW50Py5ub3RlVVVJRCxUXSksKDAsYmUuanN4cykoaWUse3RpdGxlOmxlKCJwbGFubmluZyIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6InBsYW5uaW5nIixjaGlsZHJlbjpbKDAsYmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJwbGFubmluZy1xdWFydGVycyIsY2hpbGRyZW46W24uY3VycmVudCxuLm5leHRdLm1hcChEPT4oMCxiZS5qc3gpKHRULHtwbGFuOkQsb25DYXJkQ2xpY2s6YXN5bmMoKT0+e2xldCBBPWF3YWl0IFhOKGUsRCk7eChBKX19LEQubGFiZWwpKX0pLCgwLGJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtdGFicyIsY2hpbGRyZW46bS5tYXAoRD0+KDAsYmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJtb250aC10YWIiKyhELmluZGV4PT09cj8iIGFjdGl2ZSI6IiIpLG9uQ2xpY2s6KCk9PnRiKGUsRCx5KSxjaGlsZHJlbjpELnNob3J0fSxELmluZGV4KSl9KSxyIT09bnVsbD8oMCxiZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSIsY2hpbGRyZW46KDAsYmUuanN4KShuVCx7bW9udGhMb2FkaW5nOnMsbW9udGhDb250ZW50OmEsb25DcmVhdGVQbGFuOmFzeW5jKCk9PntsZXQgRD1hd2FpdCBaTihlLGEsaCk7eChEKX19KX0pOm51bGwsZz8oMCxiZS5qc3gpKHJULHt3ZWVrTGFiZWw6VCx5ZWFyOm4uY3VycmVudC55ZWFyLHdlZWtMb2FkaW5nOnAsd2Vla0NvbnRlbnQ6ZCxvbkNyZWF0ZVdlZWtQbGFuOmFzeW5jKCk9PntsZXQgRD1hd2FpdCBlVChlLG4uY3VycmVudCxULHUsYyk7eChEKX19KTpudWxsXX0pfXZhciBfZD1VKHllKCkpO2Z1bmN0aW9uIG5iKGUpe2lmKCFlKXJldHVybiBudWxsO2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBOdW1iZXIuaXNOYU4oZS5nZXRUaW1lKCkpP251bGw6bmV3IERhdGUoZS5nZXRUaW1lKCkpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIiYmdHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCB0PXR5cGVvZiBlPT0ibnVtYmVyIiYmZTwxZTEwP25ldyBEYXRlKGUqMWUzKTpuZXcgRGF0ZShlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHQuZ2V0VGltZSgpKT9udWxsOnR9ZnVuY3Rpb24gd2YoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5maWx0ZXIodD0+dCYmdHlwZW9mIHQ9PSJvYmplY3QiKS5tYXAodD0+KHsuLi50LGVuZDpuYih0LmVuZCksc3RhcnQ6bmIodC5zdGFydCl9KSk6W119ZnVuY3Rpb24gcmIoZSx0LG4pe2xldCByPXQ/e2RheXM6Myx0YXNrRG9tYWluVVVJRDp0fTp7ZGF5czozfTtlLmdldEV4dGVybmFsQ2FsZW5kYXJFdmVudHMocikudGhlbihvPT57aygiW3VzZUV4dGVybmFsQ2FsZW5kYXJFdmVudHNdIFJlY2VpdmVkIGNhbGVuZGFyIGV2ZW50cyIsbyksbih3ZihvKSl9KS5jYXRjaCgoKT0+e24oW10pfSl9ZnVuY3Rpb24gYmYoZSx0KXtsZXRbbixyXT0oMCxfZC51c2VTdGF0ZSkobnVsbCk7cmV0dXJuKDAsX2QudXNlRWZmZWN0KSgoKT0+e3IobnVsbCkscmIoZSx0LHIpO2Z1bmN0aW9uIG8oKXtkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU9PT0idmlzaWJsZSImJnJiKGUsdCxyKX1yZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsbyksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG8pfSxbZSx0XSkse2NhbGVuZGFyRXZlbnRzOm4sY2FsZW5kYXJFdmVudHNMb2FkZWQ6biE9PW51bGx9fXZhciBDZD0iZGFzaGJvYXJkOnRvZGF5LW9ibGlnYXRpb25zIixJZD0iZGFzaGJvYXJkOnRvZGF5LW9ibGlnYXRpb25zLXJlcXVlc3QiLG9UPTUwMCxhVD0xZTEwLGlUPTZlNDtmdW5jdGlvbiBrZihlLHQsbil7bGV0IHI9QW4obnx8bmV3IERhdGUpLG89KGV8fFtdKS5maWx0ZXIoaT0+aSYmIWkuY29tcGxldGVkQXQmJiFpLmRpc21pc3NlZEF0KS5maWx0ZXIoaT0+YWIoaS5zdGFydEF0fHxpLmRlYWRsaW5lLHIpKS5tYXAoaT0+aWIoe3NvdXJjZToidGFzayIsc3RhcnRNaW51dGVzOm9iKGkuc3RhcnRBdHx8aS5kZWFkbGluZSksdGFza1V1aWQ6aS51dWlkfHxudWxsLHRpdGxlOmkuY29udGVudH0pKSxhPSh0fHxbXSkuZmlsdGVyKGk9PmkmJiFpLmFsbERheSYmYWIoaS5zdGFydCxyKSkubWFwKGk9PmliKHtkdXJhdGlvbk1pbnV0ZXM6c1QoaSksc291cmNlOiJldmVudCIsc3RhcnRNaW51dGVzOm9iKGkuc3RhcnQpLHRpdGxlOmkudGl0bGV8fCJDYWxlbmRhciBldmVudCJ9KSk7cmV0dXJuWy4uLm8sLi4uYV0uZmlsdGVyKEJvb2xlYW4pLnNvcnQoKGkscyk9Pmkuc3RhcnRNaW51dGVzLXMuc3RhcnRNaW51dGVzKX1mdW5jdGlvbiBPZChlKXtpZighZSlyZXR1cm4gbnVsbDtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gTnVtYmVyLmlzTmFOKGUuZ2V0VGltZSgpKT9udWxsOmUuZ2V0VGltZSgpO2lmKHR5cGVvZiBlPT0ibnVtYmVyIilyZXR1cm4gZTxhVD9lKjFlMzplO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7bGV0IHQ9bmV3IERhdGUoZSkuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4odCk/bnVsbDp0fXJldHVybiBudWxsfWZ1bmN0aW9uIG9iKGUpe2xldCB0PU9kKGUpO2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7bGV0IG49bmV3IERhdGUodCk7cmV0dXJuIG4uZ2V0SG91cnMoKSo2MCtuLmdldE1pbnV0ZXMoKX1mdW5jdGlvbiBhYihlLHQpe2xldCBuPU9kKGUpO3JldHVybiBuIT1udWxsJiZBbihuZXcgRGF0ZShuKSk9PT10fWZ1bmN0aW9uIGliKHtkdXJhdGlvbk1pbnV0ZXM6ZT1udWxsLHNvdXJjZTp0LHN0YXJ0TWludXRlczpuLHRhc2tVdWlkOnI9bnVsbCx0aXRsZTpvfSl7bGV0IGE9U3RyaW5nKG98fCIiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKTtyZXR1cm4gbj09bnVsbHx8IWE/bnVsbDp7ZHVyYXRpb25NaW51dGVzOmV8fG51bGwsc291cmNlOnQsc3RhcnRNaW51dGVzOm4sdGFza1V1aWQ6cix0aXRsZTphfX1mdW5jdGlvbiBzVChlKXtsZXQgdD1PZChlPy5zdGFydCksbj1PZChlPy5lbmQpO3JldHVybiB0PT1udWxsfHxuPT1udWxsfHxuPD10P251bGw6TWF0aC5yb3VuZCgobi10KS9pVCl9YXN5bmMgZnVuY3Rpb24gc2IoZSx7Y3VycmVudERhdGU6dD1udWxsLGRvbWFpblV1aWQ6bj1udWxsfT17fSl7bGV0IHI9YXdhaXQgRG4oZSxuKS5jYXRjaCgoKT0+W10pLG89W107dHJ5e2xldCBpPW4/e2RheXM6MSx0YXNrRG9tYWluVVVJRDpufTp7ZGF5czoxfSxzPWF3YWl0IGUuZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyhpKTtvPXdmKHMpfWNhdGNoKGkpe2soIltwcm9wb3NlZC1hZ2VuZGFdIGRlcml2ZVRvZGF5T2JsaWdhdGlvbnM6IGNhbGVuZGFyIGZldGNoIGZhaWxlZCIsaSl9bGV0IGE9a2YocixvLHQpO3JldHVybiBrKCJbcHJvcG9zZWQtYWdlbmRhXSBkZXJpdmVUb2RheU9ibGlnYXRpb25zIix7Y291bnQ6YS5sZW5ndGgsZG9tYWluVXVpZDpufSksYX1mdW5jdGlvbiBsYihlLHtjdXJyZW50RGF0ZTp0PW51bGwsZG9tYWluVXVpZDpuPW51bGwsdGltZW91dE1zOnI9b1R9PXt9KXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSJ8fCF3aW5kb3cuZGlzcGF0Y2hFdmVudD9zYihlLHtjdXJyZW50RGF0ZTp0LGRvbWFpblV1aWQ6bn0pOm5ldyBQcm9taXNlKG89PntsZXQgYT0hMSxpPWM9PnthfHwoYT0hMCxsKCksbyhjKSl9LHM9Yz0+aShBcnJheS5pc0FycmF5KGM/LmRldGFpbD8ub2JsaWdhdGlvbnMpP2MuZGV0YWlsLm9ibGlnYXRpb25zOltdKTtmdW5jdGlvbiBsKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoQ2QscyksY2xlYXJUaW1lb3V0KGQpfXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKENkLHMpO2xldCBkPXNldFRpbWVvdXQoKCk9PntzYihlLHtjdXJyZW50RGF0ZTp0LGRvbWFpblV1aWQ6bn0pLnRoZW4oaSkuY2F0Y2goKCk9PmkoW10pKX0scik7d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KElkKSl9KX12YXIgcG89VSh5ZSgpKTt2YXIgbFQ9L1xbKFteXF1dKylcXVxbXF4/KFxkKylcXS9nLGRiPS9ccypcW1xePyhcZCspXF1bLjpdXHMqLyxkVD0vXiFcWyhbXlxdXSopXF1cKChbXildKylcKS8sY1Q9L15cWyhbXlxdXSopXF1cKChbXildKilcKS8sdVQ9L1wuKG1wNHx3ZWJtfG9nZykoXD98JCkvaSx1Yj0vKD86eW91dHViZVwuY29tXC93YXRjaFw/dj18eW91dHVcLmJlXC8pKFthLXpBLVowLTlfLV0rKS8scGI9L3ZpbWVvXC5jb21cLyhcZCspLztmdW5jdGlvbiBwVChlKXtyZXR1cm4gdVQudGVzdChlKXx8dWIudGVzdChlKXx8cGIudGVzdChlKX1mdW5jdGlvbiBwcyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7Iil9ZnVuY3Rpb24geGYoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9ZnVuY3Rpb24gZlQoZSx0KXtsZXQgbj1lLm1hdGNoKGRUKTtpZihuKXtsZXQgbz1uWzJdO3BUKG8pP3QudmlkZW9zLnB1c2goe2FsdDpuWzFdLHVybDpvfSk6dC5pbWFnZXMucHVzaCh7YWx0Om5bMV0sdXJsOm99KTtyZXR1cm59bGV0IHI9ZS5tYXRjaChjVCk7aWYocil7IXQuZGVzY3JpcHRpb24mJiF0LnVybD8odC5kZXNjcmlwdGlvbj1yWzFdfHwiIix0LnVybD1yWzJdfHwiIik6dC50ZXh0LnB1c2goZSk7cmV0dXJufWUmJnQudGV4dC5wdXNoKGUpfWZ1bmN0aW9uIGhUKGUpe2xldCB0PWUubWF0Y2goZGIpO2lmKCF0KXJldHVybntmb290bm90ZXM6e30sY2xlYW5lZE1hcmtkb3duOmV9O2xldCBuPWUuc3Vic3RyaW5nKDAsdC5pbmRleCkudHJpbUVuZCgpLHI9ZS5zdWJzdHJpbmcodC5pbmRleCksbz17fSxhPW5ldyBSZWdFeHAoZGIuc291cmNlLCJnIiksaT1udWxsLHM9MCxsO2Zvcig7KGw9YS5leGVjKHIpKSE9PW51bGw7KWkhPT1udWxsJiYob1tpXT1jYihyLnN1YnN0cmluZyhzLGwuaW5kZXgpKSksaT1sWzFdLHM9bC5pbmRleCtsWzBdLmxlbmd0aDtyZXR1cm4gaSE9PW51bGwmJihvW2ldPWNiKHIuc3Vic3RyaW5nKHMpKSkse2Zvb3Rub3RlczpvLGNsZWFuZWRNYXJrZG93bjpufX1mdW5jdGlvbiBjYihlKXtsZXQgdD17ZGVzY3JpcHRpb246IiIsdXJsOiIiLGltYWdlczpbXSx2aWRlb3M6W10sdGV4dDpbXX07Zm9yKGxldCBuIG9mIGUuc3BsaXQoYApgKSl7bGV0IHI9bi50cmltKCk7ciYmZlQocix0KX1yZXR1cm4gdH1mdW5jdGlvbiBnVChlKXtsZXQgdD1bXTtyZXR1cm4gZS5pbWFnZXMubGVuZ3RoJiZ0LnB1c2goe2NsczoiaW1hZ2UiLHRpdGxlOiJDb250YWlucyBpbWFnZSIsc3ltYm9sOiJcdXsxRjVCQ30ifSksZS52aWRlb3MubGVuZ3RoJiZ0LnB1c2goe2NsczoidmlkZW8iLHRpdGxlOiJDb250YWlucyB2aWRlbyIsc3ltYm9sOiJcdXsxRjNBQ30ifSksIWUuaW1hZ2VzLmxlbmd0aCYmIWUudmlkZW9zLmxlbmd0aCYmKGUudXJsP3QucHVzaCh7Y2xzOiJ1cmwiLHRpdGxlOiJDb250YWlucyBsaW5rIixzeW1ib2w6Ilx1ezFGNTE3fSJ9KTooZS5kZXNjcmlwdGlvbnx8ZS50ZXh0Lmxlbmd0aCkmJnQucHVzaCh7Y2xzOiJ0ZXh0Iix0aXRsZToiQ29udGFpbnMgZGV0YWlscyIsc3ltYm9sOiJcdXsxRjRERH0ifSkpLHR9ZnVuY3Rpb24gbVQoZSl7bGV0IHQ9Wyc8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwIj4nXTtlLnVybCYmdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLXVybCI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNiIvPjxwb2x5bGluZSBwb2ludHM9IjE1IDMgMjEgMyAyMSA5Ii8+PGxpbmUgeDE9IjEwIiB5MT0iMTQiIHgyPSIyMSIgeTI9IjMiLz48L3N2Zz48YSBocmVmPSIke3BzKGUudXJsKX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPiR7eGYoZS51cmwpfTwvYT48L2Rpdj5gKSxlLmRlc2NyaXB0aW9uJiZ0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtdGV4dCI+JHt4ZihlLmRlc2NyaXB0aW9uKX08L2Rpdj5gKTtmb3IobGV0IG4gb2YgZS50ZXh0KXQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC10ZXh0Ij4ke3hmKG4pfTwvZGl2PmApO2ZvcihsZXQgbiBvZiBlLmltYWdlcyl0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjxpbWcgc3JjPSIke3BzKG4udXJsKX0iIGFsdD0iJHtwcyhuLmFsdCl9IiBsb2FkaW5nPSJsYXp5Ii8+PC9kaXY+YCk7Zm9yKGxldCBuIG9mIGUudmlkZW9zKXtsZXQgcj1uLnVybC5tYXRjaCh1Yiksbz1uLnVybC5tYXRjaChwYik7cj90LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3JbMV19IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPjwvZGl2PmApOm8/dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aWZyYW1lIHNyYz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyR7b1sxXX0iIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+PC9kaXY+YCk6dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48dmlkZW8gc3JjPSIke3BzKG4udXJsKX0iIGNvbnRyb2xzPjwvdmlkZW8+PC9kaXY+YCl9cmV0dXJuIHQucHVzaCgnPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1hY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLWNsb3NlIiB0eXBlPSJidXR0b24iPkNMT1NFPC9idXR0b24+PC9kaXY+JyksdC5wdXNoKCI8L2Rpdj4iKSx0LmpvaW4oIiIpfWZ1bmN0aW9uIHZUKGUsdCl7bGV0IG49Z1QodCkscj1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe3VybDp0LnVybCxkZXNjcmlwdGlvbjp0LmRlc2NyaXB0aW9uLHRleHQ6dC50ZXh0LGltYWdlczp0LmltYWdlcyx2aWRlb3M6dC52aWRlb3N9KSksbz10LnVybHx8IiMiLGE9bi5tYXAoaT0+YDxzcGFuIGNsYXNzPSJyaWNoLWZvb3Rub3RlLWluZGljYXRvciByaWNoLWZvb3Rub3RlLWluZGljYXRvci0tJHtpLmNsc30iIHRpdGxlPSIke2kudGl0bGV9Ij4ke2kuc3ltYm9sfTwvc3Bhbj5gKS5qb2luKCIiKTtyZXR1cm5gPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS13cmFwIj48YSBjbGFzcz0icmljaC1mb290bm90ZS1saW5rIiBocmVmPSIke3BzKG8pfSIgZGF0YS1yaWNoLWZvb3Rub3RlPSIke3J9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4ke2V9PC9hPmArYSsiPC9kaXY+In1mdW5jdGlvbiBDcihlKXtpZighZSlyZXR1cm4iIjtsZXR7Zm9vdG5vdGVzOnQsY2xlYW5lZE1hcmtkb3duOm59PWhUKGUpO2lmKE9iamVjdC5rZXlzKHQpLmxlbmd0aD09PTApcmV0dXJuIEJhKGUpO2xldCByPVtdLG89bi5yZXBsYWNlKGxULChpLHMsbCk9PntpZighdFtsXSlyZXR1cm4gaTtsZXQgZD1yLmxlbmd0aDtyZXR1cm4gci5wdXNoKHt0ZXh0OnMsZm5JZDpsfSksYDwhLS1GTlJFRjoke2R9LS0+YH0pLGE9QmEobyk7cmV0dXJuIGE9YS5yZXBsYWNlKC88IS0tRk5SRUY6KFxkKyktLT4vZywoaSxzKT0+e2xldHt0ZXh0OmwsZm5JZDpkfT1yW3BhcnNlSW50KHMpXSxjPXRbZF07aWYoIWMpcmV0dXJuIGw7bGV0IHA9QmEobCk7cmV0dXJuIHZUKHAsYyl9KSxhfWZ1bmN0aW9uIHVvKGUpe2lmKCFlKXJldHVybjtsZXQgdD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yaWNoLWZvb3Rub3RlLWxpbmtbZGF0YS1yaWNoLWZvb3Rub3RlXSIpO2ZvcihsZXQgbiBvZiB0KXtpZihuLl90aXBweVJpY2hGb290bm90ZSljb250aW51ZTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChuLmRhdGFzZXQucmljaEZvb3Rub3RlKSl9Y2F0Y2h7Y29udGludWV9aWYoISEhKHIuZGVzY3JpcHRpb258fHIudGV4dD8ubGVuZ3RofHxyLmltYWdlcz8ubGVuZ3RofHxyLnZpZGVvcz8ubGVuZ3RoKSljb250aW51ZTtsZXQgYT1tVChyKSxpPWVzKG4se2NvbnRlbnQ6YSxhbGxvd0hUTUw6ITAsaW50ZXJhY3RpdmU6ITAsdHJpZ2dlcjoibWFudWFsIixwbGFjZW1lbnQ6ImJvdHRvbS1zdGFydCIsdGhlbWU6InJpY2gtZm9vdG5vdGUiLG1heFdpZHRoOjQyMCxhcnJvdzohMCxkdXJhdGlvbjpbMTUwLDEwMF0sYXBwZW5kVG86KCk9PmRvY3VtZW50LmJvZHksb25TaG93bigpe2xldCBzPWkucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoIi5yaWNoLWZvb3Rub3RlLXBvcHVwLWNsb3NlIik7cyYmcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PmkuaGlkZSgpLHtvbmNlOiEwfSl9fSk7bi5fdGlwcHlSaWNoRm9vdG5vdGU9aSxuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixzPT57aWYoaS5zdGF0ZS5pc1Zpc2libGUpe2kuaGlkZSgpO3JldHVybn1zLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSxpLnNob3coKX0pfX12YXIgamU9VShlZSgpKSxNZD0zO2Z1bmN0aW9uIGZiKGUsdCl7cmV0dXJuIUFycmF5LmlzQXJyYXkoZSl8fCF0P1tdOmUuZmlsdGVyKG49Pm4/LnN0YXJ0JiZBbihuLnN0YXJ0KT09PXQpfWZ1bmN0aW9uIFNmKHthcHA6ZSxjYWxlbmRhckV2ZW50czp0LGN1cnJlbnREYXRlOm4sc2VsZWN0ZWREYXRlOnIsdGFza3M6byx0aW1lRm9ybWF0OmF9KXtsZXRbaSxzXT0oMCxwby51c2VTdGF0ZSkoMCksbD0oMCxwby51c2VSZWYpKG51bGwpLGQ9QW4obnx8bmV3IERhdGUoKS50b0lTT1N0cmluZygpKSxjPU9iamVjdC5rZXlzKG98fHt9KS5zb3J0KCksdT1BcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD4wP2ZiKHQsZCk6W10sZj1BcnJheS5mcm9tKG5ldyBTZXQoWy4uLmMsLi4udS5sZW5ndGg+MD9bZF06W11dKSkuc29ydCgpLHY9ciYmIWYuaW5jbHVkZXMocik/Wy4uLmYscl0uc29ydCgpOmYsdz1NYXRoLm1heCgxLE1hdGguY2VpbCh2Lmxlbmd0aC9NZCkpOygwLHBvLnVzZUVmZmVjdCkoKCk9PntpZighcilyZXR1cm47bGV0IE89di5pbmRleE9mKHIpO08+PTAmJnMoTWF0aC5mbG9vcihPL01kKSl9LFtyXSksKDAscG8udXNlRWZmZWN0KSgoKT0+e3VvKGwuY3VycmVudCl9KSwoMCxwby51c2VFZmZlY3QpKCgpPT57bGV0IE89KCk9PntsZXQgJD1rZihvPy5bZF18fFtdLHUsbik7d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KENkLHtkZXRhaWw6e2RhdGVLZXk6ZCxvYmxpZ2F0aW9uczokfX0pKX07cmV0dXJuIE8oKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJZCxPKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoSWQsTyl9LFt0LG4sbyxkXSk7bGV0IGI9TWF0aC5taW4oaSx3LTEpLGc9di5zbGljZShiKk1kLChiKzEpKk1kKSxtPU89Pk8uaW1wb3J0YW50JiZPLnVyZ2VudD8icHJpb3JpdHktY3JpdGljYWwiOk8uaW1wb3J0YW50PyJwcmlvcml0eS1pbXBvcnRhbnQiOk8udXJnZW50PyJwcmlvcml0eS11cmdlbnQiOiJwcmlvcml0eS1ub3JtYWwiLHk9Tz0+e2lmKCFPKXJldHVybiBudWxsO2lmKE8gaW5zdGFuY2VvZiBEYXRlKXJldHVybiBPLmdldFRpbWUoKTtpZih0eXBlb2YgTz09Im51bWJlciIpcmV0dXJuIE88MWUxMD9PKjFlMzpPO2lmKHR5cGVvZiBPPT0ic3RyaW5nIil7bGV0ICQ9bmV3IERhdGUoTykuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4oJCk/bnVsbDokfXJldHVybiBudWxsfSxoPU89PntsZXQgJD15KE8/LmVuZCksTj15KE8/LnN0YXJ0KTtyZXR1cm4gJD09bnVsbHx8Tj09bnVsbHx8JDw9Tj9udWxsOk1hdGgucm91bmQoKCQtTikvNmU0KX0seD1PPT57bGV0ICQ9eShPKTtpZighJClyZXR1cm4iIjtsZXQgTj1hPT09IjI0aCI/e2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsaG91cjEyOiExfTp7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0In07cmV0dXJuIG5ldyBEYXRlKCQpLnRvTG9jYWxlVGltZVN0cmluZyhbXSxOKX0sRT1PPT5PLm5vdGVVVUlEfHxPLm5vdGVVdWlkfHxPLm5vdGU/LnV1aWR8fG51bGwsVD1PPT5PLm5vdGVOYW1lfHxPLm5vdGVUaXRsZXx8Ty5ub3RlPy5uYW1lfHwiT3BlbiBub3RlIixEPWFzeW5jIE89PntsZXQgJD1FKE8pOyEkfHwhTy51dWlkfHxhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7JH0/aGlnaGxpZ2h0VGFza1VVSUQ9JHtPLnV1aWR9YCl9LEE9YXN5bmMoTywkKT0+eyQuc3RvcFByb3BhZ2F0aW9uKCk7bGV0IE49RShPKTtOJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7Tn1gKX0sXz1PPT5uZXcgRGF0ZShgJHtPfVQwMDowMDowMGApLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pLEk9RGF0ZS5ub3coKSxNPU89Pk8uZmlsdGVyKCQ9PntsZXQgTj15KCQuaGlkZVVudGlsKTtyZXR1cm4gTj09bnVsbD8hMDpOPD1JfSksUD0oTywkKT0+e2lmKCQudHlwZT09PSJldmVudCImJiQuZXZlbnQuYWxsRGF5KXJldHVybiBuZXcgRGF0ZShgJHtPfVQwMDowMDowMGApLmdldFRpbWUoKTtsZXQgTj0kLnR5cGU9PT0iZXZlbnQiPyQuZXZlbnQuc3RhcnQ6JC50YXNrLnN0YXJ0QXR8fCQudGFzay5kZWFkbGluZSxTPXkoTik7cmV0dXJuIFM/P051bWJlci5QT1NJVElWRV9JTkZJTklUWX0sej0oTywkLE4pPT5bLi4uTi5tYXAoKFMsUik9Pih7aW5kZXg6Uixzb3J0TXM6UChPLHt0YXNrOlMsdHlwZToidGFzayJ9KSx0YXNrOlMsdHlwZToidGFzayJ9KSksLi4uJC5tYXAoKFMsUik9Pih7ZXZlbnQ6UyxpbmRleDpSLHNvcnRNczpQKE8se2V2ZW50OlMsdHlwZToiZXZlbnQifSksc291cmNlT3JkZXI6Ti5sZW5ndGgrUix0eXBlOiJldmVudCJ9KSldLm1hcCgoUyxSKT0+KHsuLi5TLHNvdXJjZU9yZGVyOlMuc291cmNlT3JkZXI/P1J9KSkuc29ydCgoUyxSKT0+Uy5zb3J0TXMtUi5zb3J0TXN8fFMuc291cmNlT3JkZXItUi5zb3VyY2VPcmRlciksQj13PjE/KDAsamUuanN4cykoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2luYXRpb24iLGNoaWxkcmVuOlsoMCxqZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdlLWFycm93IixvbkNsaWNrOigpPT5zKE89Pk1hdGgubWF4KDAsTy0xKSksZGlzYWJsZWQ6Yj09PTAsY2hpbGRyZW46Ilx1MjVDMCJ9KSwoMCxqZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnZS1pbmRpY2F0b3IiLGNoaWxkcmVuOmAke2IrMX0gLyAke3d9YH0pLCgwLGplLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2UtYXJyb3ciLG9uQ2xpY2s6KCk9PnMoTz0+TWF0aC5taW4ody0xLE8rMSkpLGRpc2FibGVkOmI+PXctMSxjaGlsZHJlbjoiXHUyNUI2In0pXX0pOm51bGwsVz1PPT57bGV0ICQ9eShPLnRhc2suc3RhcnRBdCksTj15KE8udGFzay5lbmRBdCksUz0kJiZOJiZOPiQ7cmV0dXJuKDAsamUuanN4cykoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWl0ZW0gYWdlbmRhLXRhc2stcm93IixvbkNsaWNrOlI9PntSLnRhcmdldC5jbG9zZXN0KCJhIil8fEQoTy50YXNrKX0sY2hpbGRyZW46WygwLGplLmpzeCkoImRpdiIse2NsYXNzTmFtZTpgYWdlbmRhLWluZGljYXRvciAke20oTy50YXNrKX1gfSksKDAsamUuanN4cykoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWNvbnRlbnQiLGNoaWxkcmVuOlsoMCxqZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGltZSIsdGl0bGU6YCR7Ty50YXNrLnN0YXJ0QXQ/IlN0YXJ0IjoiRGVhZGxpbmUifSB0aW1lIGZvciB0YXNrYCxjaGlsZHJlbjp4KE8udGFzay5zdGFydEF0fHxPLnRhc2suZGVhZGxpbmUpfSksKDAsamUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6Q3IoTy50YXNrLmNvbnRlbnQpfHwiVW50aXRsZWQgdGFzayJ9fSksRShPLnRhc2spPygwLGplLmpzeCkoImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsY2xhc3NOYW1lOiJhZ2VuZGEtbm90ZS1saW5rIixvbkNsaWNrOlI9PkEoTy50YXNrLFIpLGNoaWxkcmVuOlQoTy50YXNrKX0pOm51bGxdfSksUz8oMCxqZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtZHVyYXRpb24iLGNoaWxkcmVuOk1hdGgucm91bmQoKE4tJCkvNmU0KSsibSJ9KTpudWxsXX0sTy50YXNrLnV1aWQpfSxzZT1PPT57bGV0ICQ9aChPLmV2ZW50KTtyZXR1cm4oMCxqZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3ciLGNoaWxkcmVuOlsoMCxqZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1pbmRpY2F0b3IgcHJpb3JpdHktbm9ybWFsIn0pLCgwLGplLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1jb250ZW50IixjaGlsZHJlbjpbTy5ldmVudC5hbGxEYXk/KDAsamUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRpbWUiLGNoaWxkcmVuOiJBbGwgZGF5In0pOk8uZXZlbnQuc3RhcnQ/KDAsamUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRpbWUiLGNoaWxkcmVuOngoTy5ldmVudC5zdGFydCl9KTpudWxsLCgwLGplLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10ZXh0IixjaGlsZHJlbjpPLmV2ZW50LnRpdGxlfHwiQ2FsZW5kYXIgZXZlbnQifSksTy5ldmVudC5jYWxlbmRhcj8ubmFtZT8oMCxqZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtbm90ZS1saW5rIixjaGlsZHJlbjpPLmV2ZW50LmNhbGVuZGFyLm5hbWV9KTpudWxsXX0pLCQ/KDAsamUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLWR1cmF0aW9uIixjaGlsZHJlbjokKyJtIn0pOm51bGxdfSxgY2FsLSR7Ty5pbmRleH1gKX07cmV0dXJuKDAsamUuanN4KShpZSx7dGl0bGU6bGUoImFnZW5kYSIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6ImFnZW5kYSIsaGVhZGVyQWN0aW9uczpCLGNoaWxkcmVuOigwLGplLmpzeCkoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWxpc3QiLHJlZjpsLGNoaWxkcmVuOmcubWFwKE89PntsZXQgJD1vW09dfHxbXSxOPU0oJCksUz1mYih0LE8pLFI9eihPLFMsTik7cmV0dXJuKDAsamUuanN4cykoInNlY3Rpb24iLHtjbGFzc05hbWU6ImFnZW5kYS1kYXkiLGNoaWxkcmVuOlsoMCxqZS5qc3gpKCJoNCIse2NsYXNzTmFtZToiYWdlbmRhLWRhdGUtbGFiZWwiLGNoaWxkcmVuOl8oTyl9KSxOLmxlbmd0aD09PTAmJlMubGVuZ3RoPT09MD8oMCxqZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJhZ2VuZGEtZW1wdHktZGF5IixjaGlsZHJlbjpPPT09ZD8iTm8gdGFza3Mgc2NoZWR1bGVkIGZvciB0b2RheSI6Ik5vIHRhc2tzIHNjaGVkdWxlZCJ9KTpSLm1hcChGPT5GLnR5cGU9PT0idGFzayI/VyhGKTpzZShGKSldfSxPKX0pfSl9KX12YXIgaGI9VSh5ZSgpKTt2YXIgZG49VShlZSgpKTtmdW5jdGlvbiBFZih7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxjdXJyZW50RGF0ZTpuLGdyaWRIZWlnaHRTaXplOnIsZ3JpZFdpZHRoU2l6ZTpvLG9uRGF0ZVNlbGVjdDphLG9uT3BlblNldHRpbmdzOmksb3BlblRhc2tzOnMsc2VsZWN0ZWREYXRlOmwsd2Vla0Zvcm1hdDpkfSl7bGV0IGM9bmV3IERhdGUobiksW3AsdV09KDAsaGIudXNlU3RhdGUpKG5ldyBEYXRlKGMuZ2V0RnVsbFllYXIoKSxjLmdldE1vbnRoKCksMSkpLGY9ZD09PSJtb25kYXkiPzE6MCx2PW5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSxwLmdldE1vbnRoKCkrMSwwKS5nZXREYXRlKCksdz0obmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSwxKS5nZXREYXkoKS1mKzcpJTcsYj1mPT09MT9bIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSIsIlN1Il06WyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLGc9e30sbT1wLmdldEZ1bGxZZWFyKCkseT1wLmdldE1vbnRoKCksaD1gJHttfS0ke1N0cmluZyh5KzEpLnBhZFN0YXJ0KDIsIjAiKX0tYDtbcyx0XS5mb3JFYWNoKFA9PntPYmplY3Qua2V5cyhQfHx7fSkuZm9yRWFjaCh6PT57aWYoei5zdGFydHNXaXRoKGgpKXtsZXQgQj1wYXJzZUludCh6LnN1YnN0cmluZyg4KSwxMCk7Z1tCXT0oZ1tCXXx8MCkrKFBbel0/Lmxlbmd0aHx8MCl9fSl9KTtsZXQgeD0oKT0+dShuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkscC5nZXRNb250aCgpLTEsMSkpLEU9KCk9PnUobmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSsxLDEpKSxUPXAudG9Mb2NhbGVTdHJpbmcoImRlZmF1bHQiLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxEPVA9PlA9PT1jLmdldERhdGUoKSYmcC5nZXRNb250aCgpPT09Yy5nZXRNb250aCgpJiZwLmdldEZ1bGxZZWFyKCk9PT1jLmdldEZ1bGxZZWFyKCksQT1QPT57bGV0IHo9cC5nZXRGdWxsWWVhcigpLEI9U3RyaW5nKHAuZ2V0TW9udGgoKSsxKS5wYWRTdGFydCgyLCIwIiksVz1TdHJpbmcoUCkucGFkU3RhcnQoMiwiMCIpO3JldHVybmAke3p9LSR7Qn0tJHtXfWB9LF89UD0+bCYmQShQKT09PWwsST1QPT57aWYoYSl7bGV0IHo9QShQKTthKHo9PT1sP251bGw6eil9fSxNPVtdO2ZvcihsZXQgUD0wO1A8dztQKyspTS5wdXNoKCgwLGRuLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY2FsLWNlbGwgZW1wdHkifSwiZW1wdHktIitQKSk7Zm9yKGxldCBQPTE7UDw9djtQKyspe2xldCB6PWdbUF18fDAsQj16PT09MD8ibm9uZSI6ejw9Mj8iIzg2ZWZhYyI6ejw9NT8iI2ZiYmYyNCI6IiNmODcxNzEiLFc9ImNhbC1jZWxsIjtEKFApJiYoVys9IiB0b2RheSIpLF8oUCkmJihXKz0iIHNlbGVjdGVkIiksTS5wdXNoKCgwLGRuLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6VyxvbkNsaWNrOigpPT5JKFApLGNoaWxkcmVuOlsoMCxkbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJjYWwtZGF5IixjaGlsZHJlbjpQfSksQiE9PSJub25lIj8oMCxkbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJjYWwtZG90IixzdHlsZTp7YmFja2dyb3VuZENvbG9yOkJ9fSk6bnVsbF19LFApKX1yZXR1cm4oMCxkbi5qc3hzKShpZSx7Y29uZmlndXJhYmxlOiEwLGdyaWRIZWlnaHRTaXplOnIsZ3JpZFdpZHRoU2l6ZTpvLGljb246Ilx1ezFGNEM1fSIsb25Db25maWd1cmU6aSx0aXRsZTpsZSgiY2FsZW5kYXIiKSx3aWRnZXRJZDoiY2FsZW5kYXIiLGNoaWxkcmVuOlsoMCxkbi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtbmF2IixjaGlsZHJlbjpbKDAsZG4uanN4KSgiYnV0dG9uIix7b25DbGljazp4LGNsYXNzTmFtZToiY2FsLWFycm93IixjaGlsZHJlbjoiXHUyNUMwIn0pLCgwLGRuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1tb250aCIsY2hpbGRyZW46VH0pLCgwLGRuLmpzeCkoImJ1dHRvbiIse29uQ2xpY2s6RSxjbGFzc05hbWU6ImNhbC1hcnJvdyIsY2hpbGRyZW46Ilx1MjVCNiJ9KV19KSwoMCxkbi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtZ3JpZCIsY2hpbGRyZW46W2IubWFwKFA9PigwLGRuLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY2FsLWhlYWRlciIsY2hpbGRyZW46UH0sUCkpLE1dfSldfSl9dmFyIGNuPVUoeWUoKSk7dmFyIFJkPSgwLGNuLmNyZWF0ZUNvbnRleHQpKG51bGwpO2Z1bmN0aW9uIGdiKGUpe2xldCB0PWUuam9pbigifCIpLG49KDAsY24udXNlUmVmKSh7ZXJyb3JlZDpuZXcgU2V0LGV4cGVjdGVkOltdLGZpcmVkOiExLGtleTpudWxsLGxvYWRlZDpuZXcgU2V0fSk7bi5jdXJyZW50LmtleSE9PXQmJihuLmN1cnJlbnQ9e2Vycm9yZWQ6bmV3IFNldCxleHBlY3RlZDplLnNsaWNlKCksZmlyZWQ6ITEsa2V5OnQsbG9hZGVkOm5ldyBTZXR9KTtsZXQgcj0oMCxjbi51c2VDYWxsYmFjaykoKCk9PntsZXQgbz1uLmN1cnJlbnQ7aWYoIShvLmZpcmVkfHxvLmV4cGVjdGVkLmxlbmd0aD09PTApKXtmb3IobGV0IGEgb2Ygby5leHBlY3RlZClpZighby5sb2FkZWQuaGFzKGEpJiYhby5lcnJvcmVkLmhhcyhhKSlyZXR1cm47by5maXJlZD0hMCxvLmVycm9yZWQuc2l6ZT4wPyhrKGBbZGFzaGJvYXJkXSAke28uZXJyb3JlZC5zaXplfS8ke28uZXhwZWN0ZWQubGVuZ3RofSBjb21wb25lbnRzIGZhaWxlZCB0byBsb2FkOmAsWy4uLm8uZXJyb3JlZF0pLGF0KCJkYXNoYm9hcmRMb2FkRXJyb3IiLHtlcnJvckNvdW50Om8uZXJyb3JlZC5zaXplLHdpZGdldENvdW50Om8uZXhwZWN0ZWQubGVuZ3RofSkpOihrKGBbZGFzaGJvYXJkXSBhbGwgJHtvLmV4cGVjdGVkLmxlbmd0aH0gY29tcG9uZW50cyBmaW5pc2hlZCBsb2FkaW5nIHN1Y2Nlc3NmdWxseWApLGF0KCJkYXNoYm9hcmRMb2FkU3VjY2VzcyIse3dpZGdldENvdW50Om8uZXhwZWN0ZWQubGVuZ3RofSkpfX0sW10pO3JldHVybigwLGNuLnVzZU1lbW8pKCgpPT4oe3JlcG9ydEVycm9yOm89PntuLmN1cnJlbnQuZXJyb3JlZC5hZGQobykscigpfSxyZXBvcnRMb2FkZWQ6bz0+e24uY3VycmVudC5sb2FkZWQuYWRkKG8pLHIoKX19KSxbcl0pfWZ1bmN0aW9uIG1iKGUpe2xldCB0PSgwLGNuLnVzZUNvbnRleHQpKFJkKSxuPSgwLGNuLnVzZVJlZikoITEpOygwLGNuLnVzZUVmZmVjdCkoKCk9PntuLmN1cnJlbnR8fChuLmN1cnJlbnQ9ITAsdD8ucmVwb3J0TG9hZGVkKGUpKX0sW10pfXZhciB5VD0ibGF5b3V0LXBpY2tlciIsSGE9W3tpZDoiZ29hbC1vcmllbnRlZCIsbmFtZToiR29hbC1PcmllbnRlZCAoUmVjb21tZW5kZWQpIixpY29uOiJcdXsxRjNBRn0iLGRlc2NyaXB0aW9uOiJRdWFydGVybHkgcGxhbm5pbmcsIHZpY3RvcnkgdHJhY2tpbmcsIGFuZCBBSSBjb2FjaGluZyBhbG9uZ3NpZGUgeW91ciBkYWlseSB0YXNrIGxpc3QuIEJlc3QgZm9yIHVzZXJzIGFjdGl2ZWx5IHdvcmtpbmcgdG93YXJkIGxvbmctaG9yaXpvbiBnb2Fscy4iLHdpZGdldHM6W3t3aWRnZXRJZDoicGxhbm5pbmciLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiZHJlYW0tdGFzayIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJhZ2VuZGEiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJwcm9wb3NlZC1hZ2VuZGEiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJyZWNlbnQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJtb29kIixncmlkV2lkdGhTaXplOjF9LHt3aWRnZXRJZDoicXVvdGVzIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoicXVpY2stYWN0aW9ucyIsZ3JpZFdpZHRoU2l6ZToxfV19LHtpZDoiZGF5LXRvLWRheSIsbmFtZToiRGF5LXRvLURheSIsaWNvbjoiXHV7MUY0QzV9IixkZXNjcmlwdGlvbjoiRXhlY3V0aW5nIHRvZGF5J3Mgd29yayBcdTIwMTQgdGFza3MsIHNjaGVkdWxlLCBhbmQgZGFpbHkgcGxhbm5pbmcgd2l0aG91dCBsb25nZXItaG9yaXpvbiBub2lzZS4gTm8gbW9vZCB0cmFja2luZyBvciBnb2FsIHdpZGdldHMuIix3aWRnZXRzOlt7d2lkZ2V0SWQ6ImFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InByb3Bvc2VkLWFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJjYWxlbmRhciIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJxdW90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJyZWNlbnQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJwZWFrLWhvdXJzIixncmlkV2lkdGhTaXplOjJ9XX0se2lkOiJtaW5kZnVsLWFjaGlldmVyIixuYW1lOiJNaW5kZnVsIEFjaGlldmVyIixpY29uOiJcdXsxRjMzMX0iLGRlc2NyaXB0aW9uOiJGb3IgdGhvc2Ugd2hvIHRyYWNrIHdlbGxiZWluZyBhbG9uZ3NpZGUgdGFza3MuIEJhbGFuY2VzIG1vb2QsIGluc3BpcmF0aW9uLCBhbmQgdGFzayBoeWdpZW5lIFx1MjAxNCB3aXRob3V0IG92ZXJ3aGVsbWluZyB0aGUgdmlldyB3aXRoIHBsYW5uaW5nIHdpZGdldHMuIix3aWRnZXRzOlt7d2lkZ2V0SWQ6ImFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InBsYW5uaW5nIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoibW9vZCIsZ3JpZFdpZHRoU2l6ZToxfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLGdyaWRXaWR0aFNpemU6MX0se3dpZGdldElkOiJxdW90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJkcmVhbS10YXNrIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiY2FsZW5kYXIiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoicGVhay1ob3VycyIsZ3JpZFdpZHRoU2l6ZToyfV19XTtmdW5jdGlvbiBmcyhlKXtsZXQgdD1PYmplY3QuZnJvbUVudHJpZXMobG4ubWFwKG49PltuLndpZGdldElkLHtncmlkSGVpZ2h0U2l6ZToxLGdyaWRXaWR0aFNpemU6bi5kZWZhdWx0R3JpZFdpZHRoU2l6ZXx8MX1dKSk7cmV0dXJuKGU/LndpZGdldHN8fFtdKS5mb3JFYWNoKG49Pnt0W24ud2lkZ2V0SWRdJiYodFtuLndpZGdldElkXT17Li4udFtuLndpZGdldElkXSxncmlkV2lkdGhTaXplOk51bWJlcihuLmdyaWRXaWR0aFNpemUpfHx0W24ud2lkZ2V0SWRdLmdyaWRXaWR0aFNpemV9KX0pLHR9ZnVuY3Rpb24gdmIoZSx0KXtsZXQgcj0oQXJyYXkuaXNBcnJheShlKT9lOltdKS5maWx0ZXIoaT0+aS53aWRnZXRJZCE9PXlUKSxvPXQud2lkZ2V0cyxhPWZzKHQpO3JldHVybiByLmxlbmd0aCE9PW8ubGVuZ3RoPyExOm8uZXZlcnkoKGkscyk9PnJbc10/LndpZGdldElkPT09aS53aWRnZXRJZCYmTnVtYmVyKHJbc10/LmdyaWRXaWR0aFNpemUpPT09YVtpLndpZGdldElkXT8uZ3JpZFdpZHRoU2l6ZSl9ZnVuY3Rpb24geWIoZSl7cmV0dXJuIEhhLmZpbmQodD0+dC5pZD09PWUpfHxudWxsfXZhciBDbj1VKHllKCkpO3ZhciB0ZT1VKGVlKCkpO2Z1bmN0aW9uIE5mKGUsdCxuKXt0IT09biYmYXQobj8iYWRkRGFzaGJvYXJkQ29tcG9uZW50IjoicmVtb3ZlRGFzaGJvYXJkQ29tcG9uZW50Iix7d2lkZ2V0SWQ6ZX0pfWZ1bmN0aW9uIGtiKGUpe3JldHVybiBsbi5maW5kKHQ9PnQud2lkZ2V0SWQ9PT1lKX1mdW5jdGlvbiB3VChlLHQpe2xldCBuPW5ldyBTZXQodHx8W10pLHI9bG4ubWFwKHM9PnMud2lkZ2V0SWQpLmZpbHRlcihzPT4hbi5oYXMocykpLGE9KEFycmF5LmlzQXJyYXkoZSk/ZTpbXSkubWFwKHM9PnMud2lkZ2V0SWQpLmZpbHRlcihzPT5yLmluY2x1ZGVzKHMpKSxpPXIuZmlsdGVyKHM9PiFhLmluY2x1ZGVzKHMpKTtyZXR1cm57cmVuZGVyZWRJZHM6YSxoaWRkZW5JZHM6aX19ZnVuY3Rpb24gd2IoZSx0KXtsZXQgbj1uZXcgU2V0KHR8fFtdKSxyPXt9O3JldHVybiBsbi5maWx0ZXIoYT0+IW4uaGFzKGEud2lkZ2V0SWQpKS5mb3JFYWNoKGE9PntyW2Eud2lkZ2V0SWRdPXtncmlkV2lkdGhTaXplOmEuZGVmYXVsdEdyaWRXaWR0aFNpemV8fDEsZ3JpZEhlaWdodFNpemU6MX19KSwoQXJyYXkuaXNBcnJheShlKT9lOltdKS5mb3JFYWNoKGE9PntyW2Eud2lkZ2V0SWRdJiYoclthLndpZGdldElkXT17Z3JpZFdpZHRoU2l6ZTphLmdyaWRXaWR0aFNpemV8fHJbYS53aWRnZXRJZF0uZ3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZTphLmdyaWRIZWlnaHRTaXplfHwxfSl9KSxyfWZ1bmN0aW9uIGJUKGUsdCxuLHIpe2xldCBvPVsuLi5lLC4uLnRdLGE9by5pbmRleE9mKG4pO2lmKHI9PT0idXAiJiZhPT09MHx8cj09PSJkb3duIiYmYT09PW8ubGVuZ3RoLTEpcmV0dXJuIG51bGw7bGV0IGk9Wy4uLm9dLHM9cj09PSJ1cCI/YS0xOmErMTtyZXR1cm5baVthXSxpW3NdXT1baVtzXSxpW2FdXSx7cmVuZGVyZWRJZHM6aS5zbGljZSgwLGUubGVuZ3RoKSxoaWRkZW5JZHM6aS5zbGljZShlLmxlbmd0aCl9fWZ1bmN0aW9uIGtUKGUsdCxuLHIpe2xldCBvPWUuZmlsdGVyKGk9PmkhPT1uKSxhPXQuZmlsdGVyKGk9PmkhPT1uKTtyZXR1cm4gZS5pbmNsdWRlcyhyKT9vLnNwbGljZShvLmluZGV4T2YociksMCxuKTphLnNwbGljZShhLmluZGV4T2YociksMCxuKSx7cmVuZGVyZWRJZHM6byxoaWRkZW5JZHM6YX19ZnVuY3Rpb24geFQoZSx0LG4scil7bGV0IG89ZS5maWx0ZXIoaT0+aSE9PW4pLGE9dC5maWx0ZXIoaT0+aSE9PW4pO3JldHVybihyPT09InJlbmRlcmVkIj9vOmEpLnB1c2gobikse3JlbmRlcmVkSWRzOm8saGlkZGVuSWRzOmF9fWZ1bmN0aW9uIFNUKHt3aWRnZXRJZDplLGN0eDp0fSl7bGV0IG49a2IoZSk7aWYoIW4pcmV0dXJuIG51bGw7bGV0IHI9Wy4uLnQucmVuZGVyZWRJZHMsLi4udC5oaWRkZW5JZHNdLG89ci5pbmRleE9mKGUpLGE9WyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0iLHQuZHJhZ2dpbmdJZD09PWU/ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS0tZHJhZ2dpbmciOiIiLHQuZHJhZ092ZXJJZD09PWU/ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS0tZHJhZy1vdmVyIjoiIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKTtyZXR1cm4oMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOmEsZHJhZ2dhYmxlOiEwLG9uRHJhZ1N0YXJ0Omk9PnQub25EcmFnU3RhcnQoaSxlKSxvbkRyYWdFbmQ6dC5vbkRyYWdFbmQsb25EcmFnT3ZlcjppPT50Lm9uRHJhZ092ZXJJdGVtKGksZSksb25Ecm9wOmk9PnQub25Ecm9wT25JdGVtKGksZSksY2hpbGRyZW46WygwLHRlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1oYW5kbGUiLCJhcmlhLWhpZGRlbiI6InRydWUiLGNoaWxkcmVuOiJcdTI4M0YifSksKDAsdGUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUiLGNoaWxkcmVuOm4uaWNvbn0pLCgwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1pbmZvIixjaGlsZHJlbjpbKDAsdGUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLW5hbWUiLGNoaWxkcmVuOm4ubmFtZX0pLG4uZGVzY3JpcHRpb24mJigwLHRlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1kZXNjcmlwdGlvbiIsY2hpbGRyZW46bi5kZXNjcmlwdGlvbn0pXX0pLCgwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1hY3Rpb25zIixjaGlsZHJlbjpbKDAsdGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWFycm93LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpvPT09MCx0aXRsZToiTW92ZSB1cCIsImFyaWEtbGFiZWwiOmBNb3ZlICR7bi5uYW1lfSB1cGAsb25DbGljazppPT57aS5zdG9wUHJvcGFnYXRpb24oKSx0Lm9uTW92ZShlLCJ1cCIpfSxjaGlsZHJlbjoiXHUyMTkxIn0pLCgwLHRlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1hcnJvdy1idXR0b24iLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6bz09PXIubGVuZ3RoLTEsdGl0bGU6Ik1vdmUgZG93biIsImFyaWEtbGFiZWwiOmBNb3ZlICR7bi5uYW1lfSBkb3duYCxvbkNsaWNrOmk9PntpLnN0b3BQcm9wYWdhdGlvbigpLHQub25Nb3ZlKGUsImRvd24iKX0sY2hpbGRyZW46Ilx1MjE5MyJ9KV19KV19KX1mdW5jdGlvbiBiYih7c2VjdGlvbklkOmUsbGFiZWw6dCxpY29uOm4saXRlbXM6cixjdHg6b30pe2xldCBhPVsiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uIixvLmRyYWdPdmVyU2VjdGlvbj09PWU/ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi0tZHJhZy1vdmVyIjoiIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKTtyZXR1cm4oMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOmEsb25EcmFnT3ZlcjppPT5vLm9uRHJhZ092ZXJTZWN0aW9uKGksZSksb25EcmFnTGVhdmU6by5vbkRyYWdMZWF2ZVNlY3Rpb24sb25Ecm9wOmk9Pm8ub25Ecm9wT25TZWN0aW9uKGksZSksY2hpbGRyZW46WygwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi1oZWFkZXIiLGNoaWxkcmVuOlsoMCx0ZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46bn0pLCgwLHRlLmpzeCkoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24tdGl0bGUiLGNoaWxkcmVuOnR9KV19KSxyLmxlbmd0aD09PTA/KDAsdGUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWVtcHR5IixjaGlsZHJlbjplPT09InJlbmRlcmVkIj8iRHJhZyBjb21wb25lbnRzIGhlcmUgdG8gc2hvdyB0aGVtIG9uIHRoZSBkYXNoYm9hcmQiOiJBbGwgY29tcG9uZW50cyBhcmUgY3VycmVudGx5IHNob3duIn0pOigwLHRlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1saXN0IixjaGlsZHJlbjpyLm1hcChpPT4oMCx0ZS5qc3gpKFNULHt3aWRnZXRJZDppLGN0eDpvfSxpKSl9KV19KX1mdW5jdGlvbiBFVCh7d2lkZ2V0SWQ6ZSxzaXppbmc6dCxvblNpemluZ0NoYW5nZTpufSl7bGV0IHI9a2IoZSk7aWYoIXIpcmV0dXJuIG51bGw7bGV0IG89dFtlXT8uZ3JpZFdpZHRoU2l6ZT8/ci5kZWZhdWx0R3JpZFdpZHRoU2l6ZT8/MSxhPXRbZV0/LmdyaWRIZWlnaHRTaXplPz8xLGk9ci5tYXhIb3Jpem9udGFsVGlsZXN8fDQscz1yLm1heFZlcnRpY2FsVGlsZXN8fDI7cmV0dXJuKDAsdGUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbSIsY2hpbGRyZW46WygwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWl0ZW0taGVhZGVyIixjaGlsZHJlbjpbKDAsdGUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUiLGNoaWxkcmVuOnIuaWNvbn0pLCgwLHRlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1uYW1lIixjaGlsZHJlbjpyLm5hbWV9KV19KSwoMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtLWNvbnRyb2xzIixjaGlsZHJlbjpbKDAsdGUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctZmllbGQiLGNoaWxkcmVuOlsoMCx0ZS5qc3gpKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctbGFiZWwiLGNoaWxkcmVuOiJXaWR0aCJ9KSwoMCx0ZS5qc3gpKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLXNlbGVjdCIsdmFsdWU6byxvbkNoYW5nZTpsPT5uKGUsImdyaWRXaWR0aFNpemUiLE51bWJlcihsLnRhcmdldC52YWx1ZSkpLGNoaWxkcmVuOkFycmF5LmZyb20oe2xlbmd0aDppfSwobCxkKT0+KDAsdGUuanN4KSgib3B0aW9uIix7dmFsdWU6ZCsxLGNoaWxkcmVuOmAke2QrMX1gfSxkKzEpKX0pXX0pLCgwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWZpZWxkIixjaGlsZHJlbjpbKDAsdGUuanN4KSgibGFiZWwiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWxhYmVsIixjaGlsZHJlbjoiVmVydGljYWwgdGlsZXMifSksKDAsdGUuanN4KSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1zZWxlY3QiLHZhbHVlOmEsb25DaGFuZ2U6bD0+bihlLCJncmlkSGVpZ2h0U2l6ZSIsTnVtYmVyKGwudGFyZ2V0LnZhbHVlKSksY2hpbGRyZW46QXJyYXkuZnJvbSh7bGVuZ3RoOnN9LChsLGQpPT4oMCx0ZS5qc3gpKCJvcHRpb24iLHt2YWx1ZTpkKzEsY2hpbGRyZW46YCR7ZCsxfWB9LGQrMSkpfSldfSldfSldfSl9ZnVuY3Rpb24gTlQoZSx0KXtsZXR7cmVuZGVyZWRJZHM6bixoaWRkZW5JZHM6cn09d1QoZSx0KSxbbyxhXT0oMCxDbi51c2VTdGF0ZSkobiksW2ksc109KDAsQ24udXNlU3RhdGUpKHIpLFtsLGRdPSgwLENuLnVzZVN0YXRlKSgoKT0+d2IoZSx0KSksW2MscF09KDAsQ24udXNlU3RhdGUpKG51bGwpLFt1LGZdPSgwLENuLnVzZVN0YXRlKShudWxsKSxbdix3XT0oMCxDbi51c2VTdGF0ZSkobnVsbCksYj0oMCxDbi51c2VSZWYpKG51bGwpLFtnLG1dPSgwLENuLnVzZVN0YXRlKSghMSkseT0oKT0+e2IuY3VycmVudD1udWxsLHAobnVsbCksZihudWxsKSx3KG51bGwpfTtyZXR1cm57cmVuZGVyZWRJZHM6byxoaWRkZW5JZHM6aSxzaXppbmc6bCxkcmFnZ2luZ0lkOmMsZHJhZ092ZXJJZDp1LGRyYWdPdmVyU2VjdGlvbjp2LGhhc1Jlc2V0Omcsb25Nb3ZlOih6LEIpPT57bGV0IFc9YlQobyxpLHosQik7VyYmKE5mKHosby5pbmNsdWRlcyh6KSxXLnJlbmRlcmVkSWRzLmluY2x1ZGVzKHopKSxhKFcucmVuZGVyZWRJZHMpLHMoVy5oaWRkZW5JZHMpKX0sb25EcmFnU3RhcnQ6KHosQik9PntiLmN1cnJlbnQ9Qix6LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJtb3ZlIixyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnAoQikpfSxvbkRyYWdFbmQ6KCk9PnkoKSxvbkRyYWdPdmVySXRlbTooeixCKT0+e3oucHJldmVudERlZmF1bHQoKSx6LnN0b3BQcm9wYWdhdGlvbigpLHouZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiLGYoQiksdyhudWxsKX0sb25EcmFnT3ZlclNlY3Rpb246KHosQik9Pnt6LnByZXZlbnREZWZhdWx0KCksei5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0ibW92ZSIsdyhCKSxmKG51bGwpfSxvbkRyYWdMZWF2ZVNlY3Rpb246ej0+e3ouY3VycmVudFRhcmdldC5jb250YWlucyh6LnJlbGF0ZWRUYXJnZXQpfHx3KG51bGwpfSxvbkRyb3BPbkl0ZW06KHosQik9Pnt6LnByZXZlbnREZWZhdWx0KCksei5zdG9wUHJvcGFnYXRpb24oKTtsZXQgVz1iLmN1cnJlbnQ7aWYoeSgpLCFXfHxXPT09QilyZXR1cm47bGV0e3JlbmRlcmVkSWRzOnNlLGhpZGRlbklkczpPfT1rVChvLGksVyxCKTtOZihXLG8uaW5jbHVkZXMoVyksc2UuaW5jbHVkZXMoVykpLGEoc2UpLHMoTyl9LG9uRHJvcE9uU2VjdGlvbjooeixCKT0+e3oucHJldmVudERlZmF1bHQoKTtsZXQgVz1iLmN1cnJlbnQ7aWYoeSgpLCFXKXJldHVybjtsZXR7cmVuZGVyZWRJZHM6c2UsaGlkZGVuSWRzOk99PXhUKG8saSxXLEIpO05mKFcsby5pbmNsdWRlcyhXKSxzZS5pbmNsdWRlcyhXKSksYShzZSkscyhPKX0sb25TaXppbmdDaGFuZ2U6KHosQixXKT0+e2Qoc2U9Pih7Li4uc2UsW3pdOnsuLi5zZVt6XSxbQl06V319KSl9LG9uUmVzZXQ6ej0+e2xldCBCPW5ldyBTZXQodHx8W10pLFc9eWIoeik7aWYoVyl7bGV0IHNlPVcud2lkZ2V0cy5tYXAoJD0+JC53aWRnZXRJZCkuZmlsdGVyKCQ9PiFCLmhhcygkKSksTz1sbi5tYXAoJD0+JC53aWRnZXRJZCkuZmlsdGVyKCQ9PiFCLmhhcygkKSk7YShzZSkscyhPLmZpbHRlcigkPT4hc2UuaW5jbHVkZXMoJCkpKSxkKGZzKFcpKX1lbHNle2xldCBzZT1sbi5tYXAoTz0+Ty53aWRnZXRJZCkuZmlsdGVyKE89PiFCLmhhcyhPKSk7YShzZSkscyhbXSksZCh3YihudWxsLHQpKX1tKCEwKX19fWZ1bmN0aW9uIFRmKHtjdXJyZW50TGF5b3V0OmUsZXhjbHVkZVdpZGdldElkczp0LG9uU2F2ZTpuLG9uQ2FuY2VsOnIsc2VsZWN0ZWRMYXlvdXRQcm9maWxlOm99KXtsZXRbYSxpXT0oMCxDbi51c2VTdGF0ZSkoImNvbXBvbmVudHMiKSxbcyxsXT0oMCxDbi51c2VTdGF0ZSkob3x8bnVsbCksZD1OVChlLHQpLHtyZW5kZXJlZElkczpjLGhpZGRlbklkczpwLHNpemluZzp1LGhhc1Jlc2V0OmYsb25SZXNldDp2LG9uU2l6aW5nQ2hhbmdlOnd9PWQsYj1hPT09ImNvbXBvbmVudHMiPygwLHRlLmpzeHMpKHRlLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsdGUuanN4KShiYix7c2VjdGlvbklkOiJyZW5kZXJlZCIsbGFiZWw6IlJlbmRlcmVkIERhc2hib2FyZCBFbGVtZW50cyIsaWNvbjoiXHV7MUY0NDF9IixpdGVtczpjLGN0eDpkfSksKDAsdGUuanN4KShiYix7c2VjdGlvbklkOiJoaWRkZW4iLGxhYmVsOiJIaWRkZW4gRGFzaGJvYXJkIEVsZW1lbnRzIixpY29uOiJcdXsxRjZBQn0iLGl0ZW1zOnAsY3R4OmR9KV19KTpjLmxlbmd0aD09PTA/KDAsdGUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWVtcHR5IixjaGlsZHJlbjoiTm8gcmVuZGVyZWQgY29tcG9uZW50cy4gQWRkIGNvbXBvbmVudHMgaW4gdGhlIENvbXBvbmVudHMgdGFiLiJ9KTooMCx0ZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nIixjaGlsZHJlbjpjLm1hcChnPT4oMCx0ZS5qc3gpKEVULHt3aWRnZXRJZDpnLHNpemluZzp1LG9uU2l6aW5nQ2hhbmdlOnd9LGcpKX0pO3JldHVybigwLHRlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLW92ZXJsYXkiLG9uQ2xpY2s6Zz0+Zy50YXJnZXQ9PT1nLmN1cnJlbnRUYXJnZXQmJnIoKSxjaGlsZHJlbjooMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtY29udGFpbmVyIGRhc2hib2FyZC1sYXlvdXQtcG9wdXAiLGNoaWxkcmVuOlsoMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtaGVhZGVyIixjaGlsZHJlbjpbKDAsdGUuanN4KSgiaDMiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC10aXRsZSIsY2hpbGRyZW46Ilx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgTGF5b3V0In0pLCgwLHRlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZXhwbGFuYXRpb24tcGFyYWdyYXBoIixjaGlsZHJlbjoiQ3VzdG9taXplIHRoZSBvcmRlciBvZiB5b3VyIHdpZGdldHMgYnkgZHJhZ2dpbmcgb3Igc2l6aW5nIHRoZW0gaW4gdGhpcyBtZW51LiBZb3UgY2FuIGFsc28gcmVvcmRlciB3aWRnZXRzIG91dHNpZGUgdGhpcyBtZW51IGJ5IGNsaWNraW5nIG9uIHRoZWlyIGhlYWRlciBmb3IgMiBzZWNvbmRzIHRvIGVuZ2FnZSBkcmFnIHJlb3JkZXJpbmcuIn0pLCgwLHRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImV4cGxhbmF0aW9uLXBhcmFncmFwaCIsY2hpbGRyZW46WygwLHRlLmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXByb2ZpbGUtbGFiZWwiLGNoaWxkcmVuOiJEZWZhdWx0IGxheW91dCJ9KSwoMCx0ZS5qc3hzKSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXByb2ZpbGUtc2VsZWN0Iix2YWx1ZTpzfHwiIixvbkNoYW5nZTpnPT5sKGcudGFyZ2V0LnZhbHVlfHxudWxsKSxjaGlsZHJlbjpbKDAsdGUuanN4KSgib3B0aW9uIix7dmFsdWU6IiIsY2hpbGRyZW46IkN1c3RvbSAobm8gcHJlc2V0KSJ9KSxIYS5tYXAoZz0+KDAsdGUuanN4KSgib3B0aW9uIix7dmFsdWU6Zy5pZCxjaGlsZHJlbjpnLm5hbWV9LGcuaWQpKV19KV19KSwoMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXRhYnMiLGNoaWxkcmVuOlsoMCx0ZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtdGFiIisoYT09PSJjb21wb25lbnRzIj8iIGFjdGl2ZSI6IiIpLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+aSgiY29tcG9uZW50cyIpLGNoaWxkcmVuOiJDb21wb25lbnRzIn0pLCgwLHRlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC10YWIiKyhhPT09InNpemluZyI/IiBhY3RpdmUiOiIiKSx0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmkoInNpemluZyIpLGNoaWxkcmVuOiJTaXppbmcifSldfSldfSksKDAsdGUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYm9keSBkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWJvZHkiLGNoaWxkcmVuOmJ9KSwoMCx0ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYWN0aW9ucyIsY2hpbGRyZW46WygwLHRlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWxpbmsiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+dihzKSxjaGlsZHJlbjoiUmVzZXQgdG8gZGVmYXVsdHMifSksKDAsdGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOnIsY2hpbGRyZW46IkNhbmNlbCJ9KSwoMCx0ZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PnthdCgic2F2ZURhc2hib2FyZExheW91dCIse3dpZGdldENvdW50OmMubGVuZ3RofSksbihjLGYsdSxzKX0sY2hpbGRyZW46IlNhdmUgTGF5b3V0In0pXX0pXX0pfSl9dmFyIHhiPSJNaXNzaW9uIENvbnRyb2wgRGFzaGJvYXJkOiBwbHVnaW4gc2V0dGluZ3MiO2Z1bmN0aW9uIFNiKCl7dHJ5e2xldHtob3VyQ3ljbGU6ZX09bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodm9pZCAwLHtob3VyOiJudW1lcmljIn0pLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBlPT09ImgyMyJ8fGU9PT0iaDI0Ij8iMjRoIjoibWVyaWRpYW4ifWNhdGNoe3JldHVybiJtZXJpZGlhbiJ9fWZ1bmN0aW9uIEViKCl7dHJ5e2xldCBlPW5ldyBJbnRsLkxvY2FsZShuYXZpZ2F0b3IubGFuZ3VhZ2UpLHQ9ZS53ZWVrSW5mb3x8ZS5nZXRXZWVrSW5mbz8uKCk7cmV0dXJuIHQ/LmZpcnN0RGF5PT09N3x8dD8uZmlyc3REYXk9PT0wPyJzdW5kYXkiOiJtb25kYXkifWNhdGNoe3JldHVybiJtb25kYXkifX1mdW5jdGlvbiBUVChlKXtsZXQgdD17fTtpZighZSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZS5zcGxpdChgCmApKXtsZXQgcj1uLm1hdGNoKC9eKFteOl0rKTpccyooLispLyk7aWYoIXIpY29udGludWU7bGV0IG89clsxXS50cmltKCkudG9Mb3dlckNhc2UoKSxhPXJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7bz09PSJ0aW1lIGZvcm1hdCImJih0LnRpbWVGb3JtYXQ9YSksbz09PSJ3ZWVrIGZvcm1hdCImJih0LndlZWtGb3JtYXQ9YSl9cmV0dXJuIHR9ZnVuY3Rpb24gTmIoZSl7bGV0IHQ9W107cmV0dXJuIGUudGltZUZvcm1hdCYmdC5wdXNoKGBUaW1lIGZvcm1hdDogJHtlLnRpbWVGb3JtYXR9YCksZS53ZWVrRm9ybWF0JiZ0LnB1c2goYFdlZWsgZm9ybWF0OiAke2Uud2Vla0Zvcm1hdH1gKSx0LmpvaW4oYApgKX12YXIgaHM9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fYXBwPXQsdGhpcy5fbm90ZVVVSUQ9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfWFzeW5jIGxvYWQoKXtsZXQgdD1hd2FpdCB0aGlzLl9hcHAuZmluZE5vdGUoe25hbWU6eGIsdGFnczpbSWVdfSk7aWYodD8udXVpZCl7dGhpcy5fbm90ZVVVSUQ9dC51dWlkO2xldCByPWF3YWl0IHRoaXMuX2FwcC5nZXROb3RlQ29udGVudCh7dXVpZDp0LnV1aWR9KTtyZXR1cm4gdGhpcy5fc2V0dGluZ3M9VFQociksdGhpcy5fc2V0dGluZ3MudGltZUZvcm1hdHx8KHRoaXMuX3NldHRpbmdzLnRpbWVGb3JtYXQ9U2IoKSksdGhpcy5fc2V0dGluZ3Mud2Vla0Zvcm1hdHx8KHRoaXMuX3NldHRpbmdzLndlZWtGb3JtYXQ9RWIoKSksaygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBsb2FkZWQgc2V0dGluZ3M6Iix0aGlzLl9zZXR0aW5ncyksey4uLnRoaXMuX3NldHRpbmdzfX10aGlzLl9zZXR0aW5ncz17dGltZUZvcm1hdDpTYigpLHdlZWtGb3JtYXQ6RWIoKX07bGV0IG49YXdhaXQgdGhpcy5fYXBwLmNyZWF0ZU5vdGUoeGIsW0llXSx7YXJjaGl2ZTohMH0pO3JldHVybiB0aGlzLl9ub3RlVVVJRD10eXBlb2Ygbj09Im9iamVjdCI/bi51dWlkOm4sYXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sTmIodGhpcy5fc2V0dGluZ3MpKSxrKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIGNyZWF0ZWQgc2V0dGluZ3Mgbm90ZToiLHRoaXMuX25vdGVVVUlEKSx7Li4udGhpcy5fc2V0dGluZ3N9fWFzeW5jIHNhdmUodCl7aWYodGhpcy5fc2V0dGluZ3M9ey4uLnRoaXMuX3NldHRpbmdzLC4uLnR9LCF0aGlzLl9ub3RlVVVJRCl7aygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBubyBub3RlVVVJRDsgY2Fubm90IHNhdmUiKTtyZXR1cm59YXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sTmIodGhpcy5fc2V0dGluZ3MpKSxrKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIHNhdmVkIHNldHRpbmdzOiIsdGhpcy5fc2V0dGluZ3MpfWdldCBzZXR0aW5ncygpe3JldHVybiB0aGlzLl9zZXR0aW5ncz97Li4udGhpcy5fc2V0dGluZ3N9Om51bGx9fTt2YXIgUGQ9VSh5ZSgpKTt2YXIgYXI9VShlZSgpKTtmdW5jdGlvbiBPcih7dGl0bGU6ZSxvblN1Ym1pdDp0LG9uQ2FuY2VsOm4sc3VibWl0TGFiZWw6cj0iU3VibWl0IixjaGlsZHJlbjpvLHNjcm9sbFRvcDphfSl7bGV0IGk9KDAsUGQudXNlUmVmKShudWxsKTtyZXR1cm4oMCxQZC51c2VFZmZlY3QpKCgpPT57aWYoYT09PXZvaWQgMClyZXR1cm47bGV0IGw9ZD0+e2kuY3VycmVudCYmIWkuY3VycmVudC5jb250YWlucyhkLnRhcmdldCkmJm4oKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsbCksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsbCl9LFthLG5dKSwoMCxhci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1vdmVybGF5IixzdHlsZTphIT09dm9pZCAwP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDphLGxlZnQ6MCxyaWdodDowLG1pbkhlaWdodDoiMTAwdmgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHBhZGRpbmc6IjE2cHgifTp2b2lkIDAsb25DbGljazphPT09dm9pZCAwP2w9PntsLnRhcmdldD09PWwuY3VycmVudFRhcmdldCYmbigpfTp2b2lkIDAsY2hpbGRyZW46KDAsYXIuanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWNvbnRhaW5lciIscmVmOmksc3R5bGU6YSE9PXZvaWQgMD97cG9pbnRlckV2ZW50czoiYXV0byJ9OnZvaWQgMCxjaGlsZHJlbjpbZT8oMCxhci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1oZWFkZXIiLGNoaWxkcmVuOigwLGFyLmpzeCkoImgzIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtdGl0bGUiLGNoaWxkcmVuOmV9KX0pOm51bGwsKDAsYXIuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYm9keSIsY2hpbGRyZW46b30pLCgwLGFyLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1hY3Rpb25zIixjaGlsZHJlbjpbKDAsYXIuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsb25DbGljazpuLGNoaWxkcmVuOiJDYW5jZWwifSksKDAsYXIuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLXN1Ym1pdCIsb25DbGljazp0LGNoaWxkcmVuOnJ9KV19KV19KX0pfXZhciBEVD01MCoxMDI0KjQ7dmFyIFRiPXthbnRocm9waWM6Imh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL3NldHRpbmdzL2tleXMiLCJhbnRocm9waWMtc29ubmV0IjoiaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vc2V0dGluZ3Mva2V5cyIsZGVlcHNlZWs6Imh0dHBzOi8vcGxhdGZvcm0uZGVlcHNlZWsuY29tL2FwaV9rZXlzIixnZW1pbmk6Imh0dHBzOi8vYWlzdHVkaW8uZ29vZ2xlLmNvbS9hcHAvYXBpLWtleXMiLGdyb2s6Imh0dHBzOi8vY29uc29sZS54LmFpL3RlYW0vZGVmYXVsdC9hcGkta2V5cyIsb3BlbmFpOiJodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vYXBpLWtleXMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vd3d3LnBlcnBsZXhpdHkuYWkvYWNjb3VudC9hcGkva2V5cyJ9LFh0PXthbnRocm9waWM6ImNsYXVkZS1vcHVzLTQtNiIsImFudGhyb3BpYy1zb25uZXQiOiJjbGF1ZGUtc29ubmV0LTQtNiIsZGVlcHNlZWs6ImRlZXBzZWVrLWNoYXQiLGdlbWluaToiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsZ3JvazoiZ3Jvay00LjIwIixvcGVuYWk6ImdwdC01LjQiLHBlcnBsZXhpdHk6InNvbmFyLXBybyJ9O3ZhciBEZj17YW50aHJvcGljOiJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIiwiYW50aHJvcGljLXNvbm5ldCI6Imh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiLGRlZXBzZWVrOiJodHRwczovL2FwaS5kZWVwc2Vlay5jb20vdjEvY2hhdC9jb21wbGV0aW9ucyIsZ2VtaW5pOiJodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzL3ttb2RlbC1uYW1lfTpnZW5lcmF0ZUNvbnRlbnQiLGdyb2s6Imh0dHBzOi8vYXBpLnguYWkvdjEvY2hhdC9jb21wbGV0aW9ucyIsb3BlbmFpOiJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkvY2hhdC9jb21wbGV0aW9ucyJ9LHR6PU9iamVjdC5rZXlzKERmKSxEYj17ImNsYXVkZS1vcHVzLTQtNiI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTYiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtNS0yMDI1MDkyOSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNS0yMDI1MTAwMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTUtMjAyNTExMDEiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0xLTIwMjUwODA1IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtMCI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy03LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTAiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMjAyNTA1MTQiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTUtaGFpa3UtbGF0ZXN0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LWhhaWt1LTIwMjQxMDIyIjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLWhhaWt1LTIwMjQwMzA3IjoyMDAqMTAyNCo0fSxBYj17ImRlZXBzZWVrLWNoYXQiOjY0KjEwMjQqNCwiZGVlcHNlZWstcmVhc29uZXIiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEtMDUyOCI6NjQqMTAyNCo0fSxfYj17ImdlbWluaS0zLWZsYXNoIjo2NCoxMDI0KjQsImdlbWluaS0zLWZsYXNoLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLXByZXZpZXciOjEwMjQqMTAyNCo0LCJnZW1pbmktMy4xLXByby1wcmV2aWV3IjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLWltYWdlLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTIuNS1wcm8iOjEwMjQqMTAyNCo0LCJnZW1pbmktMi41LWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlLXByZXZpZXctMDYtMTciOjEwMjQqMTAyNCo0LCJnZW1pbmktMi4wLWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuMC1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNH0sQ2I9eyJncm9rLTQtMS1mYXN0IjoyMDQ4KjEwMjQqNCwiZ3Jvay00LWZhc3QiOjIwNDgqMTAyNCo0LCJncm9rLTQiOjI1NioxMDI0KjQsImdyb2stNC4yMCI6MjU2KjEwMjQqNCwiZ3Jvay00LTA3MDkiOjI1NioxMDI0KjQsImdyb2stMyI6MTI4KjEwMjQqNCwiZ3Jvay0zLWJldGEiOjEyOCoxMDI0KjQsImdyb2stMy1taW5pIjoxMjgqMTAyNCo0LCJncm9rLTMtbWluaS1iZXRhIjoxMjgqMTAyNCo0LCJncm9rLTItdmlzaW9uLTEyMTIiOjgqMTAyNCo0LCJncm9rLTItaW1hZ2UtMTIxMiI6MTI4KjEwMjQqNCwiZ3Jvay0yLTEyMTIiOjEyOCoxMDI0KjR9LE9iPXsiZ3B0LTUuNCI6NDAwKjEwMjQqNCwiZ3B0LTUuMiI6NDAwKjEwMjQqNCwiZ3B0LTUuMSI6NDAwKjEwMjQqNCwiZ3B0LTUuMS1jb2RleC1tYXgiOjQwMCoxMDI0KjQsImdwdC01Ijo0MDAqMTAyNCo0LCJncHQtNS1mYXN0Ijo0MDAqMTAyNCo0LCJncHQtNS10aGlua2luZyI6NDAwKjEwMjQqNCwiZ3B0LTQuMSI6MWUzKjEwMjQqNCwiZ3B0LTQuMS1taW5pIjoxMjgqMTAyNCo0LCJncHQtNG8iOjEyOCoxMDI0KjQsImdwdC00by1taW5pIjoxMjgqMTAyNCo0LG8zOjIwMCoxMDI0KjQsIm8zLW1pbmkiOjIwMCoxMDI0KjQsIm8zLXBybyI6MjAwKjEwMjQqNCwibzQtbWluaSI6MjAwKjEwMjQqNCwiZ3B0LTQiOjgqMTAyNCo0LCJncHQtNC0xMTA2LXByZXZpZXciOjEyOCoxMDI0KjQsImdwdC00LTMyayI6MzIqMTAyNCo0LCJncHQtNC0zMmstMDYxMyI6MzIqMTAyNCo0LCJncHQtNC12aXNpb24tcHJldmlldyI6MTI4KjEwMjQqNH0sbno9eyJzb25hci1wcm8iOjIwMCoxMDI0KjQsc29uYXI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nLXBybyI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nIjoxMjgqMTAyNCo0LCJzb25hci1kZWVwLXJlc2VhcmNoIjoxMjgqMTAyNCo0fSxBVD17Li4uRGIsLi4uQWIsLi4uX2IsLi4uQ2IsLi4uT2J9LEFmPXthbnRocm9waWM6T2JqZWN0LmtleXMoRGIpLGRlZXBzZWVrOk9iamVjdC5rZXlzKEFiKSxnZW1pbmk6T2JqZWN0LmtleXMoX2IpLGdyb2s6T2JqZWN0LmtleXMoQ2IpLG9wZW5haTpPYmplY3Qua2V5cyhPYil9O3ZhciBadD1VKHllKCkpO2Z1bmN0aW9uIF9UKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2xldCByPW5ldyBGaWxlUmVhZGVyO3Iub25sb2FkPW89PnQoby50YXJnZXQucmVzdWx0KSxyLm9uZXJyb3I9bz0+e3IuYWJvcnQoKSxuKG8udGFyZ2V0LmVycm9yKX0sci5yZWFkQXNEYXRhVVJMKGUpfSl9ZnVuY3Rpb24gX2Yoe2FwcDplLHBsdWdpbk5vdGVVVUlEOnQsaW5pdGlhbEltYWdlVXJsOm49IiIsaW5pdGlhbE1vZGU6cj0iY292ZXIifT17fSl7bGV0W28sYV09KDAsWnQudXNlU3RhdGUpKG4pLFtpLHNdPSgwLFp0LnVzZVN0YXRlKShyKSxbbCxkXT0oMCxadC51c2VTdGF0ZSkoITEpLFtjLHBdPSgwLFp0LnVzZVN0YXRlKSghMSksdT0oMCxadC51c2VSZWYpKG51bGwpLGY9KDAsWnQudXNlQ2FsbGJhY2spKGFzeW5jIHk9PntpZigheXx8IXkudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSl7aygiW2JnLXVwbG9hZF0gcmVqZWN0ZWQgZmlsZSAobm90IGFuIGltYWdlIG9yIG1pc3NpbmcpOiIseT8udHlwZSk7cmV0dXJufWsoIltiZy11cGxvYWRdIHN0YXJ0aW5nIHVwbG9hZCBmb3I6Iix5Lm5hbWUseS50eXBlLHkuc2l6ZSwiYnl0ZXMiKSxkKCEwKTt0cnl7bGV0IGg9YXdhaXQgX1QoeSk7aygiW2JnLXVwbG9hZF0gZmlsZSBjb252ZXJ0ZWQgdG8gZGF0YSBVUkwsIGxlbmd0aDoiLGgubGVuZ3RoKTtsZXQgeD1hd2FpdCBlLmF0dGFjaE5vdGVNZWRpYSh7dXVpZDp0fSxoKTtrKCJbYmctdXBsb2FkXSBhdHRhY2hOb3RlTWVkaWEgcmV0dXJuZWQgVVJMOiIseCkseD9hKHgpOmsoIltiZy11cGxvYWRdIGF0dGFjaE5vdGVNZWRpYSByZXR1cm5lZCBmYWxzeSBVUkwgXHUyMDE0IHVwbG9hZCBtYXkgaGF2ZSBmYWlsZWQgc2lsZW50bHkiKX1jYXRjaChoKXtrKCJbYmctdXBsb2FkXSB1cGxvYWQgRkFJTEVEIHdpdGggZXhjZXB0aW9uOiIsaCl9ZmluYWxseXtkKCExKSxrKCJbYmctdXBsb2FkXSB1cGxvYWQgZmxvdyBjb21wbGV0ZSIpfX0sW10pLHY9KDAsWnQudXNlQ2FsbGJhY2spKHk9Pnt5LnByZXZlbnREZWZhdWx0KCkseS5zdG9wUHJvcGFnYXRpb24oKSxwKCExKTtsZXQgaD15LmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtoJiZmKGgpfSxbZl0pLHc9KDAsWnQudXNlQ2FsbGJhY2spKHk9Pnt5LnByZXZlbnREZWZhdWx0KCkseS5zdG9wUHJvcGFnYXRpb24oKSxwKCEwKX0sW10pLGI9KDAsWnQudXNlQ2FsbGJhY2spKHk9Pnt5LnByZXZlbnREZWZhdWx0KCkseS5zdG9wUHJvcGFnYXRpb24oKSxwKCExKX0sW10pLGc9KDAsWnQudXNlQ2FsbGJhY2spKHk9PntsZXQgaD15LnRhcmdldC5maWxlcz8uWzBdO2gmJmYoaCl9LFtmXSksbT0oMCxadC51c2VDYWxsYmFjaykoKCk9PnthKCIiKX0sW10pO3JldHVybntiYWNrZ3JvdW5kSW1hZ2VVcmw6byxiYWNrZ3JvdW5kTW9kZTppLHNldEJhY2tncm91bmRNb2RlOnMsdXBsb2FkaW5nOmwsZHJhZ092ZXI6YyxmaWxlSW5wdXRSZWY6dSxoYW5kbGVEcm9wOnYsaGFuZGxlRHJhZ092ZXI6dyxoYW5kbGVEcmFnTGVhdmU6YixoYW5kbGVGaWxlSW5wdXRDaGFuZ2U6ZyxoYW5kbGVSZW1vdmVJbWFnZTptfX12YXIgcW89VSh5ZSgpKTt2YXIgbmU9VShlZSgpKSxmbz1be3ZhbHVlOiJub25lIixsYWJlbDoiTm9uZSAoZGlzYWJsZSBBSSBmZWF0dXJlcykiLGFwaUtleVByb3ZpZGVyOm51bGx9LHt2YWx1ZToib3BlbmFpIixsYWJlbDoiT3BlbkFJIENoYXRHUFQiLGFwaUtleVByb3ZpZGVyOiJvcGVuYWkifSx7dmFsdWU6ImFudGhyb3BpYyIsbGFiZWw6IkFudGhyb3BpYyBPcHVzIixhcGlLZXlQcm92aWRlcjoiYW50aHJvcGljIn0se3ZhbHVlOiJhbnRocm9waWMtc29ubmV0IixsYWJlbDoiQW50aHJvcGljIFNvbm5ldCIsYXBpS2V5UHJvdmlkZXI6ImFudGhyb3BpYyJ9LHt2YWx1ZToiZ2VtaW5pIixsYWJlbDoiR29vZ2xlIEdlbWluaSIsYXBpS2V5UHJvdmlkZXI6ImdlbWluaSJ9LHt2YWx1ZToiZ3JvayIsbGFiZWw6Ikdyb2siLGFwaUtleVByb3ZpZGVyOiJncm9rIn1dO2Z1bmN0aW9uIENUKCl7bGV0IGU9bmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsdD1uYXZpZ2F0b3IucGxhdGZvcm18fCIiLG49L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KGUpLHI9bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjEmJi9NYWNpbnRvc2gvLnRlc3QoZSk7cmV0dXJuIG58fHI/e2xpbmtQYXJlbnRoZXRpY2FsOiJsb25nLXByZXNzLCBPcGVuIGluIE5ldyBUYWIiLG5vdGU6IkxvbmctcHJlc3MgdGhlIGZvbGxvd2luZyBsaW5rLCB0aGVuIGNob29zZSBPcGVuIGluIE5ldyBUYWIgb3IgT3BlbiBpbiBCcm93c2VyLiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdC4ifTovTWFjfGlQaG9uZXxpUG9kfGlQYWQvLnRlc3QodCl8fC9NYWMgT1MgWC8udGVzdChlKT97bGlua1BhcmVudGhldGljYWw6IkNtZCtjbGljayIsbm90ZToiQ21kLWNsaWNrIHRoZSBmb2xsb3dpbmcgbGluayB0byBvcGVuIGl0LiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdC4ifTovV2luLy50ZXN0KHQpP3tsaW5rUGFyZW50aGV0aWNhbDoiQ3RybCtjbGljayIsbm90ZToiQ3RybC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06e2xpbmtQYXJlbnRoZXRpY2FsOiJDdHJsK2NsaWNrIixub3RlOiJDdHJsLWNsaWNrIHRoZSBmb2xsb3dpbmcgbGluayB0byBvcGVuIGl0LiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCJ9fWZ1bmN0aW9uIE9UKHthcGlLZXk6ZSxhcGlLZXlWaXNpYmxlOnQsbGlua1BhcmVudGhldGljYWw6bixub3RlOnIsb25BcGlLZXlDaGFuZ2U6byxvblByb3ZpZGVyQ2hhbmdlOmEsb25Ub2dnbGVLZXlWaXNpYmlsaXR5OmkscHJvdmlkZXJBcGlLZXlVcmw6cyxwcm92aWRlck5hbWU6bCxzZWxlY3RlZFByb3ZpZGVyOmR9KXtyZXR1cm4oMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIixjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIixjaGlsZHJlbjpbKDAsbmUuanN4KSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIixjaGlsZHJlbjoiQUkgUHJvdmlkZXIifSksKDAsbmUuanN4KSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyIsY2hpbGRyZW46IkVuYWJsZSBhbmFseXNpcyBvZiBxdWFydGVybHkgcGxhbiAmIHN1Z2dlc3RlZCB0YXNrcy4ifSldfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIixjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkxMTSBQcm92aWRlciJ9KSwoMCxuZS5qc3gpKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWxlY3QiLGlkOiJsbG0tcHJvdmlkZXItc2VsZWN0Iix2YWx1ZTpkLG9uQ2hhbmdlOmM9PmEoYy50YXJnZXQudmFsdWUpLGNoaWxkcmVuOmZvLm1hcChjPT4oMCxuZS5qc3gpKCJvcHRpb24iLHt2YWx1ZTpjLnZhbHVlLGNoaWxkcmVuOmMubGFiZWx9LGMudmFsdWUpKX0pXX0pLCgwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIixjaGlsZHJlbjpbKDAsbmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwiLGNoaWxkcmVuOiJBUEkgS2V5In0pLCgwLG5lLmpzeCkoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWhpbnQiLGNoaWxkcmVuOnJ9KSwoMCxuZS5qc3gpKCJhIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1saW5rIixocmVmOnMsdGFyZ2V0OiJfYmxhbmsiLHJlbDoibm9vcGVuZXIgbm9yZWZlcnJlciIsY2hpbGRyZW46YFJldHJpZXZlIHlvdXIgJHtsfSBBUEkga2V5ICgke259KSBcdTIxOTJgfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktaW5wdXQtcm93IixjaGlsZHJlbjpbKDAsbmUuanN4KSgiaW5wdXQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWlucHV0Iix0eXBlOnQ/InRleHQiOiJwYXNzd29yZCIsdmFsdWU6ZSxvbkNoYW5nZTpjPT5vKGMudGFyZ2V0LnZhbHVlKSxwbGFjZWhvbGRlcjoiUGFzdGUgeW91ciBBUEkga2V5IGhlcmUiLGF1dG9Db21wbGV0ZToib2ZmIixzcGVsbENoZWNrOiExfSksKDAsbmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS10b2dnbGUiLHR5cGU6ImJ1dHRvbiIsb25DbGljazppLHRpdGxlOnQ/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSIsImFyaWEtbGFiZWwiOnQ/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSIsY2hpbGRyZW46dD8iXHV7MUY2NDh9IjoiXHV7MUY0NDF9XHVGRTBGIn0pXX0pXX0pXX0pXX0pfWZ1bmN0aW9uIElUKHtiYWNrZ3JvdW5kSW1hZ2VVcmw6ZSxiYWNrZ3JvdW5kTW9kZTp0LGRyYWdPdmVyOm4sZmlsZUlucHV0UmVmOnIsb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTpvLG9uRHJhZ0xlYXZlOmEsb25EcmFnT3ZlcjppLG9uRHJvcDpzLG9uRmlsZUlucHV0Q2hhbmdlOmwsb25SZW1vdmVJbWFnZTpkLHVwbG9hZGluZzpjfSl7cmV0dXJuKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24gc2VjdGlvbiIsY2hpbGRyZW46WygwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWhlYWRlciIsY2hpbGRyZW46WygwLG5lLmpzeCkoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSIsY2hpbGRyZW46IkJhY2tncm91bmQgSW1hZ2UifSksKDAsbmUuanN4KSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyIsY2hpbGRyZW46IlVwbG9hZCBhbiBpbWFnZSB0byB1c2UgYXMgeW91ciBkYXNoYm9hcmQgYmFja2dyb3VuZC4ifSldfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIixjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lJHtuPyIgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLS1hY3RpdmUiOiIifSR7Yz8iIGRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS0tdXBsb2FkaW5nIjoiIn1gLG9uRHJvcDpzLG9uRHJhZ092ZXI6aSxvbkRyYWdMZWF2ZTphLG9uQ2xpY2s6KCk9PiFjJiZyLmN1cnJlbnQ/LmNsaWNrKCksY2hpbGRyZW46WygwLG5lLmpzeCkoImlucHV0Iix7cmVmOnIsdHlwZToiZmlsZSIsYWNjZXB0OiJpbWFnZS8qIixjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1pbnB1dCIsb25DaGFuZ2U6bH0pLGM/KDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQiLGNoaWxkcmVuOiJVcGxvYWRpbmcuLi4ifSk6ZT8oMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtcHJldmlldyIsY2hpbGRyZW46WygwLG5lLmpzeCkoImltZyIse3NyYzplLGFsdDoiQmFja2dyb3VuZCBwcmV2aWV3IixjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1wcmV2aWV3LWltZyIsb25Mb2FkOigpPT5rKCJbc2V0dGluZ3MtcG9wdXBdIGJhY2tncm91bmQgcHJldmlldyBpbWFnZSBsb2FkZWQgT0s6IixlKSxvbkVycm9yOnU9PmsoIltzZXR0aW5ncy1wb3B1cF0gYmFja2dyb3VuZCBwcmV2aWV3IGltYWdlIEZBSUxFRCB0byBsb2FkOiIsZSx1LnR5cGUpfSksKDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQiLGNoaWxkcmVuOiJEcm9wIGEgbmV3IGltYWdlIG9yIGNsaWNrIHRvIHJlcGxhY2UifSldfSk6KDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQiLGNoaWxkcmVuOiJEcmFnICYgZHJvcCBhbiBpbWFnZSBoZXJlLCBvciBjbGljayB0byB1cGxvYWQifSldfSksZSYmKDAsbmUuanN4KSgiYSIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXJlbW92ZS1pbWFnZSIsaHJlZjoiIyIsb25DbGljazp1PT57dS5wcmV2ZW50RGVmYXVsdCgpLGQoKX0sY2hpbGRyZW46IlJlbW92ZSBpbWFnZSJ9KV19KSxlJiYoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkRpc3BsYXkgTW9kZSJ9KSwoMCxuZS5qc3gpKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWxlY3QiLHZhbHVlOnQsb25DaGFuZ2U6dT0+byh1LnRhcmdldC52YWx1ZSksY2hpbGRyZW46aHkubWFwKHU9PigwLG5lLmpzeCkoIm9wdGlvbiIse3ZhbHVlOnUudmFsdWUsY2hpbGRyZW46dS5sYWJlbH0sdS52YWx1ZSkpfSldfSldfSl9ZnVuY3Rpb24gTVQoe29uVGltZUZvcm1hdENoYW5nZTplLG9uV2Vla0Zvcm1hdENoYW5nZTp0LHRpbWVGb3JtYXQ6bix3ZWVrRm9ybWF0OnJ9KXtyZXR1cm4oMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIixjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIixjaGlsZHJlbjpbKDAsbmUuanN4KSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIixjaGlsZHJlbjoiVGltZSAmIERhdGUgRm9ybWF0In0pLCgwLG5lLmpzeCkoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWRlc2MiLGNoaWxkcmVuOiJDaG9vc2UgaG93IHRpbWVzIGFuZCB3ZWVrcyBhcmUgZGlzcGxheWVkIGFjcm9zcyB0aGUgZGFzaGJvYXJkLiJ9KV19KSwoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSIsY2hpbGRyZW46WygwLG5lLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIixjaGlsZHJlbjoiVGltZSBGb3JtYXQifSksKDAsbmUuanN4cykoImxhYmVsIix7Y2hpbGRyZW46WygwLG5lLmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InRpbWUtZm9ybWF0Iix2YWx1ZToibWVyaWRpYW4iLGNoZWNrZWQ6bj09PSJtZXJpZGlhbiIsb25DaGFuZ2U6KCk9PmUoIm1lcmlkaWFuIil9KSwiVXNlIG1lcmlkaWFuIChhbS9wbSkgdGltZXMiXX0pLCgwLG5lLmpzeHMpKCJsYWJlbCIse2NoaWxkcmVuOlsoMCxuZS5qc3gpKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ0aW1lLWZvcm1hdCIsdmFsdWU6IjI0aCIsY2hlY2tlZDpuPT09IjI0aCIsb25DaGFuZ2U6KCk9PmUoIjI0aCIpfSksIjI0IGhvdXIgdGltZSJdfSldfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IldlZWsgRm9ybWF0In0pLCgwLG5lLmpzeHMpKCJsYWJlbCIse2NoaWxkcmVuOlsoMCxuZS5qc3gpKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ3ZWVrLWZvcm1hdCIsdmFsdWU6InN1bmRheSIsY2hlY2tlZDpyPT09InN1bmRheSIsb25DaGFuZ2U6KCk9PnQoInN1bmRheSIpfSksIldlZWsgYmVnaW5zIG9uIFN1bmRheSJdfSksKDAsbmUuanN4cykoImxhYmVsIix7Y2hpbGRyZW46WygwLG5lLmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6IndlZWstZm9ybWF0Iix2YWx1ZToibW9uZGF5IixjaGVja2VkOnI9PT0ibW9uZGF5IixvbkNoYW5nZTooKT0+dCgibW9uZGF5Iil9KSwiV2VlayBiZWdpbnMgb24gTW9uZGF5Il19KV19KV19KV19KX1mdW5jdGlvbiBJYihlLHQpe2lmKCF0KXJldHVybiIiO2xldCBuPSR0KHQpO3JldHVybiBuJiZlPy5bbl18fCIifWZ1bmN0aW9uIENmKHthcHA6ZSxjb25maWdQYXJhbXM6dCxvbkNhbmNlbDpuLG9uU2F2ZTpyLHBsdWdpbk5vdGVVVUlEOm8sdGltZUZvcm1hdDphLHdlZWtGb3JtYXQ6aX0pe2xldFtzXT0oMCxxby51c2VTdGF0ZSkoKCk9PnR5cGVvZiB3aW5kb3c+InUiPzA6d2luZG93LnNjcm9sbFk/P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A/PzApLGw9dD8uW2ouTExNX1BST1ZJREVSX01PREVMXSxkPXQ/LltqLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXSxjPXQ/LltqLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV0scD1mby5maW5kKEY9PkYudmFsdWU9PT1sKXx8Zm9bMF0sW3UsZl09KDAscW8udXNlU3RhdGUpKEliKHQscC5hcGlLZXlQcm92aWRlcikpLFt2LHddPSgwLHFvLnVzZVN0YXRlKSghMSksW2IsZ109KDAscW8udXNlU3RhdGUpKGx8fCJvcGVuYWkiKSxbbSx5XT0oMCxxby51c2VTdGF0ZSkoYXx8Im1lcmlkaWFuIiksW2gseF09KDAscW8udXNlU3RhdGUpKGl8fCJzdW5kYXkiKTtrKCJbc2V0dGluZ3MtcG9wdXBdIHJlbmRlcmluZyBEYXNoYm9hcmRTZXR0aW5nc1BvcHVwLCBjdXJyZW50QmFja2dyb3VuZEltYWdlVXJsOiIsZCk7bGV0e2JhY2tncm91bmRJbWFnZVVybDpFLGJhY2tncm91bmRNb2RlOlQsc2V0QmFja2dyb3VuZE1vZGU6RCx1cGxvYWRpbmc6QSxkcmFnT3ZlcjpfLGZpbGVJbnB1dFJlZjpJLGhhbmRsZURyb3A6TSxoYW5kbGVEcmFnT3ZlcjpQLGhhbmRsZURyYWdMZWF2ZTp6LGhhbmRsZUZpbGVJbnB1dENoYW5nZTpCLGhhbmRsZVJlbW92ZUltYWdlOld9PV9mKHthcHA6ZSxwbHVnaW5Ob3RlVVVJRDpvLGluaXRpYWxJbWFnZVVybDpkLGluaXRpYWxNb2RlOmN9KSxzZT1mby5maW5kKEY9PkYudmFsdWU9PT1iKXx8Zm9bMF0sTz1UYltzZS5hcGlLZXlQcm92aWRlcl0sJD1mby5maW5kKEY9PkYudmFsdWU9PT1iKT8ubGFiZWwsTj1GPT57ZyhGKTtsZXQgWD1mby5maW5kKFo9PloudmFsdWU9PT1GKXx8Zm9bMF0sUT1JYih0LFguYXBpS2V5UHJvdmlkZXIpO2YoUSl9LHtsaW5rUGFyZW50aGV0aWNhbDpTLG5vdGU6Un09Q1QoKTtyZXR1cm4oMCxuZS5qc3gpKE9yLHt0aXRsZToiXHUyNjk5XHVGRTBGIERhc2hib2FyZCBTZXR0aW5ncyIsc2Nyb2xsVG9wOnMsb25TdWJtaXQ6KCk9PnIoe2FwaUtleTp1LGFwaUtleVByb3ZpZGVyOnNlLmFwaUtleVByb3ZpZGVyLGJhY2tncm91bmRJbWFnZVVybDpFLGJhY2tncm91bmRNb2RlOlQsbGxtUHJvdmlkZXI6Yix0aW1lRm9ybWF0Om0sd2Vla0Zvcm1hdDpofSksb25DYW5jZWw6bixzdWJtaXRMYWJlbDoiU2F2ZSBTZXR0aW5ncyIsY2hpbGRyZW46KDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWNvbnRhaW5lciIsY2hpbGRyZW46WygwLG5lLmpzeCkoSVQse2JhY2tncm91bmRJbWFnZVVybDpFLGJhY2tncm91bmRNb2RlOlQsZHJhZ092ZXI6XyxmaWxlSW5wdXRSZWY6SSxvbkJhY2tncm91bmRNb2RlQ2hhbmdlOkQsb25EcmFnTGVhdmU6eixvbkRyYWdPdmVyOlAsb25Ecm9wOk0sb25GaWxlSW5wdXRDaGFuZ2U6QixvblJlbW92ZUltYWdlOlcsdXBsb2FkaW5nOkF9KSwoMCxuZS5qc3gpKE9ULHthcGlLZXk6dSxhcGlLZXlWaXNpYmxlOnYsbGlua1BhcmVudGhldGljYWw6Uyxub3RlOlIsb25BcGlLZXlDaGFuZ2U6ZixvblByb3ZpZGVyQ2hhbmdlOk4sb25Ub2dnbGVLZXlWaXNpYmlsaXR5OigpPT53KEY9PiFGKSxwcm92aWRlckFwaUtleVVybDpPLHByb3ZpZGVyTmFtZTokLHNlbGVjdGVkUHJvdmlkZXI6Yn0pLCgwLG5lLmpzeCkoTVQse29uVGltZUZvcm1hdENoYW5nZTp5LG9uV2Vla0Zvcm1hdENoYW5nZTp4LHRpbWVGb3JtYXQ6bSx3ZWVrRm9ybWF0Omh9KV19KX0pfXZhciBPZj17fTsoZnVuY3Rpb24gZSh0LG4scixvKXt2YXIgYT0hISh0LldvcmtlciYmdC5CbG9iJiZ0LlByb21pc2UmJnQuT2Zmc2NyZWVuQ2FudmFzJiZ0Lk9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCYmdC5IVE1MQ2FudmFzRWxlbWVudCYmdC5IVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudHJhbnNmZXJDb250cm9sVG9PZmZzY3JlZW4mJnQuVVJMJiZ0LlVSTC5jcmVhdGVPYmplY3RVUkwpLGk9dHlwZW9mIFBhdGgyRD09ImZ1bmN0aW9uIiYmdHlwZW9mIERPTU1hdHJpeD09ImZ1bmN0aW9uIixzPWZ1bmN0aW9uKCl7aWYoIXQuT2Zmc2NyZWVuQ2FudmFzKXJldHVybiExO3RyeXt2YXIgTj1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksUz1OLmdldENvbnRleHQoIjJkIik7Uy5maWxsUmVjdCgwLDAsMSwxKTt2YXIgUj1OLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1MuY3JlYXRlUGF0dGVybihSLCJuby1yZXBlYXQiKX1jYXRjaHtyZXR1cm4hMX1yZXR1cm4hMH0oKTtmdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGQoTil7dmFyIFM9bi5leHBvcnRzLlByb21pc2UsUj1TIT09dm9pZCAwP1M6dC5Qcm9taXNlO3JldHVybiB0eXBlb2YgUj09ImZ1bmN0aW9uIj9uZXcgUihOKTooTihsLGwpLG51bGwpfXZhciBjPWZ1bmN0aW9uKE4sUyl7cmV0dXJue3RyYW5zZm9ybTpmdW5jdGlvbihSKXtpZihOKXJldHVybiBSO2lmKFMuaGFzKFIpKXJldHVybiBTLmdldChSKTt2YXIgRj1uZXcgT2Zmc2NyZWVuQ2FudmFzKFIud2lkdGgsUi5oZWlnaHQpLFg9Ri5nZXRDb250ZXh0KCIyZCIpO3JldHVybiBYLmRyYXdJbWFnZShSLDAsMCksUy5zZXQoUixGKSxGfSxjbGVhcjpmdW5jdGlvbigpe1MuY2xlYXIoKX19fShzLG5ldyBNYXApLHA9ZnVuY3Rpb24oKXt2YXIgTj1NYXRoLmZsb29yKDE2LjY2NjY2NjY2NjY2NjY2OCksUyxSLEY9e30sWD0wO3JldHVybiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI/KFM9ZnVuY3Rpb24oUSl7dmFyIFo9TWF0aC5yYW5kb20oKTtyZXR1cm4gRltaXT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gcShyZSl7WD09PXJlfHxYK04tMTxyZT8oWD1yZSxkZWxldGUgRltaXSxRKCkpOkZbWl09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHEpfSksWn0sUj1mdW5jdGlvbihRKXtGW1FdJiZjYW5jZWxBbmltYXRpb25GcmFtZShGW1FdKX0pOihTPWZ1bmN0aW9uKFEpe3JldHVybiBzZXRUaW1lb3V0KFEsTil9LFI9ZnVuY3Rpb24oUSl7cmV0dXJuIGNsZWFyVGltZW91dChRKX0pLHtmcmFtZTpTLGNhbmNlbDpSfX0oKSx1PWZ1bmN0aW9uKCl7dmFyIE4sUyxSPXt9O2Z1bmN0aW9uIEYoWCl7ZnVuY3Rpb24gUShaLHEpe1gucG9zdE1lc3NhZ2Uoe29wdGlvbnM6Wnx8e30sY2FsbGJhY2s6cX0pfVguaW5pdD1mdW5jdGlvbihxKXt2YXIgcmU9cS50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbigpO1gucG9zdE1lc3NhZ2Uoe2NhbnZhczpyZX0sW3JlXSl9LFguZmlyZT1mdW5jdGlvbihxLHJlLHBlKXtpZihTKXJldHVybiBRKHEsbnVsbCksUzt2YXIgZ2U9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7cmV0dXJuIFM9ZChmdW5jdGlvbihoZSl7ZnVuY3Rpb24gRWUoQWUpe0FlLmRhdGEuY2FsbGJhY2s9PT1nZSYmKGRlbGV0ZSBSW2dlXSxYLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEVlKSxTPW51bGwsYy5jbGVhcigpLHBlKCksaGUoKSl9WC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixFZSksUShxLGdlKSxSW2dlXT1FZS5iaW5kKG51bGwse2RhdGE6e2NhbGxiYWNrOmdlfX0pfSksU30sWC5yZXNldD1mdW5jdGlvbigpe1gucG9zdE1lc3NhZ2Uoe3Jlc2V0OiEwfSk7Zm9yKHZhciBxIGluIFIpUltxXSgpLGRlbGV0ZSBSW3FdfX1yZXR1cm4gZnVuY3Rpb24oKXtpZihOKXJldHVybiBOO2lmKCFyJiZhKXt2YXIgWD1bInZhciBDT05GRVRUSSwgU0laRSA9IHt9LCBtb2R1bGUgPSB7fTsiLCIoIitlLnRvU3RyaW5nKCkrIikodGhpcywgbW9kdWxlLCB0cnVlLCBTSVpFKTsiLCJvbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2cpIHsiLCIgIGlmIChtc2cuZGF0YS5vcHRpb25zKSB7IiwiICAgIENPTkZFVFRJKG1zZy5kYXRhLm9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKCkgeyIsIiAgICAgIGlmIChtc2cuZGF0YS5jYWxsYmFjaykgeyIsIiAgICAgICAgcG9zdE1lc3NhZ2UoeyBjYWxsYmFjazogbXNnLmRhdGEuY2FsbGJhY2sgfSk7IiwiICAgICAgfSIsIiAgICB9KTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzZXQpIHsiLCIgICAgQ09ORkVUVEkgJiYgQ09ORkVUVEkucmVzZXQoKTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzaXplKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5yZXNpemUud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEucmVzaXplLmhlaWdodDsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEuY2FudmFzKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5jYW52YXMud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEuY2FudmFzLmhlaWdodDsiLCIgICAgQ09ORkVUVEkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGUobXNnLmRhdGEuY2FudmFzKTsiLCIgIH0iLCJ9Il0uam9pbihgCmApO3RyeXtOPW5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbWF0pKSl9Y2F0Y2goUSl7cmV0dXJuIHR5cGVvZiBjb25zb2xlPCJ1IiYmdHlwZW9mIGNvbnNvbGUud2Fybj09ImZ1bmN0aW9uIiYmY29uc29sZS53YXJuKCJcdXsxRjM4QX0gQ291bGQgbm90IGxvYWQgd29ya2VyIixRKSxudWxsfUYoTil9cmV0dXJuIE59fSgpLGY9e3BhcnRpY2xlQ291bnQ6NTAsYW5nbGU6OTAsc3ByZWFkOjQ1LHN0YXJ0VmVsb2NpdHk6NDUsZGVjYXk6LjksZ3Jhdml0eToxLGRyaWZ0OjAsdGlja3M6MjAwLHg6LjUseTouNSxzaGFwZXM6WyJzcXVhcmUiLCJjaXJjbGUiXSx6SW5kZXg6MTAwLGNvbG9yczpbIiMyNmNjZmYiLCIjYTI1YWZkIiwiI2ZmNWU3ZSIsIiM4OGZmNWEiLCIjZmNmZjQyIiwiI2ZmYTYyZCIsIiNmZjM2ZmYiXSxkaXNhYmxlRm9yUmVkdWNlZE1vdGlvbjohMSxzY2FsYXI6MX07ZnVuY3Rpb24gdihOLFMpe3JldHVybiBTP1MoTik6Tn1mdW5jdGlvbiB3KE4pe3JldHVybiBOIT1udWxsfWZ1bmN0aW9uIGIoTixTLFIpe3JldHVybiB2KE4mJncoTltTXSk/TltTXTpmW1NdLFIpfWZ1bmN0aW9uIGcoTil7cmV0dXJuIE48MD8wOk1hdGguZmxvb3IoTil9ZnVuY3Rpb24gbShOLFMpe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKFMtTikpK059ZnVuY3Rpb24geShOKXtyZXR1cm4gcGFyc2VJbnQoTiwxNil9ZnVuY3Rpb24gaChOKXtyZXR1cm4gTi5tYXAoeCl9ZnVuY3Rpb24geChOKXt2YXIgUz1TdHJpbmcoTikucmVwbGFjZSgvW14wLTlhLWZdL2dpLCIiKTtyZXR1cm4gUy5sZW5ndGg8NiYmKFM9U1swXStTWzBdK1NbMV0rU1sxXStTWzJdK1NbMl0pLHtyOnkoUy5zdWJzdHJpbmcoMCwyKSksZzp5KFMuc3Vic3RyaW5nKDIsNCkpLGI6eShTLnN1YnN0cmluZyg0LDYpKX19ZnVuY3Rpb24gRShOKXt2YXIgUz1iKE4sIm9yaWdpbiIsT2JqZWN0KTtyZXR1cm4gUy54PWIoUywieCIsTnVtYmVyKSxTLnk9YihTLCJ5IixOdW1iZXIpLFN9ZnVuY3Rpb24gVChOKXtOLndpZHRoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxOLmhlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIEQoTil7dmFyIFM9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtOLndpZHRoPVMud2lkdGgsTi5oZWlnaHQ9Uy5oZWlnaHR9ZnVuY3Rpb24gQShOKXt2YXIgUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyZXR1cm4gUy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLFMuc3R5bGUudG9wPSIwcHgiLFMuc3R5bGUubGVmdD0iMHB4IixTLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLFMuc3R5bGUuekluZGV4PU4sU31mdW5jdGlvbiBfKE4sUyxSLEYsWCxRLFoscSxyZSl7Ti5zYXZlKCksTi50cmFuc2xhdGUoUyxSKSxOLnJvdGF0ZShRKSxOLnNjYWxlKEYsWCksTi5hcmMoMCwwLDEsWixxLHJlKSxOLnJlc3RvcmUoKX1mdW5jdGlvbiBJKE4pe3ZhciBTPU4uYW5nbGUqKE1hdGguUEkvMTgwKSxSPU4uc3ByZWFkKihNYXRoLlBJLzE4MCk7cmV0dXJue3g6Ti54LHk6Ti55LHdvYmJsZTpNYXRoLnJhbmRvbSgpKjEwLHdvYmJsZVNwZWVkOk1hdGgubWluKC4xMSxNYXRoLnJhbmRvbSgpKi4xKy4wNSksdmVsb2NpdHk6Ti5zdGFydFZlbG9jaXR5Ki41K01hdGgucmFuZG9tKCkqTi5zdGFydFZlbG9jaXR5LGFuZ2xlMkQ6LVMrKC41KlItTWF0aC5yYW5kb20oKSpSKSx0aWx0QW5nbGU6KE1hdGgucmFuZG9tKCkqKC43NS0uMjUpKy4yNSkqTWF0aC5QSSxjb2xvcjpOLmNvbG9yLHNoYXBlOk4uc2hhcGUsdGljazowLHRvdGFsVGlja3M6Ti50aWNrcyxkZWNheTpOLmRlY2F5LGRyaWZ0Ok4uZHJpZnQscmFuZG9tOk1hdGgucmFuZG9tKCkrMix0aWx0U2luOjAsdGlsdENvczowLHdvYmJsZVg6MCx3b2JibGVZOjAsZ3Jhdml0eTpOLmdyYXZpdHkqMyxvdmFsU2NhbGFyOi42LHNjYWxhcjpOLnNjYWxhcixmbGF0Ok4uZmxhdH19ZnVuY3Rpb24gTShOLFMpe1MueCs9TWF0aC5jb3MoUy5hbmdsZTJEKSpTLnZlbG9jaXR5K1MuZHJpZnQsUy55Kz1NYXRoLnNpbihTLmFuZ2xlMkQpKlMudmVsb2NpdHkrUy5ncmF2aXR5LFMudmVsb2NpdHkqPVMuZGVjYXksUy5mbGF0PyhTLndvYmJsZT0wLFMud29iYmxlWD1TLngrMTAqUy5zY2FsYXIsUy53b2JibGVZPVMueSsxMCpTLnNjYWxhcixTLnRpbHRTaW49MCxTLnRpbHRDb3M9MCxTLnJhbmRvbT0xKTooUy53b2JibGUrPVMud29iYmxlU3BlZWQsUy53b2JibGVYPVMueCsxMCpTLnNjYWxhcipNYXRoLmNvcyhTLndvYmJsZSksUy53b2JibGVZPVMueSsxMCpTLnNjYWxhcipNYXRoLnNpbihTLndvYmJsZSksUy50aWx0QW5nbGUrPS4xLFMudGlsdFNpbj1NYXRoLnNpbihTLnRpbHRBbmdsZSksUy50aWx0Q29zPU1hdGguY29zKFMudGlsdEFuZ2xlKSxTLnJhbmRvbT1NYXRoLnJhbmRvbSgpKzIpO3ZhciBSPVMudGljaysrL1MudG90YWxUaWNrcyxGPVMueCtTLnJhbmRvbSpTLnRpbHRDb3MsWD1TLnkrUy5yYW5kb20qUy50aWx0U2luLFE9Uy53b2JibGVYK1MucmFuZG9tKlMudGlsdENvcyxaPVMud29iYmxlWStTLnJhbmRvbSpTLnRpbHRTaW47aWYoTi5maWxsU3R5bGU9InJnYmEoIitTLmNvbG9yLnIrIiwgIitTLmNvbG9yLmcrIiwgIitTLmNvbG9yLmIrIiwgIisoMS1SKSsiKSIsTi5iZWdpblBhdGgoKSxpJiZTLnNoYXBlLnR5cGU9PT0icGF0aCImJnR5cGVvZiBTLnNoYXBlLnBhdGg9PSJzdHJpbmciJiZBcnJheS5pc0FycmF5KFMuc2hhcGUubWF0cml4KSlOLmZpbGwoc2UoUy5zaGFwZS5wYXRoLFMuc2hhcGUubWF0cml4LFMueCxTLnksTWF0aC5hYnMoUS1GKSouMSxNYXRoLmFicyhaLVgpKi4xLE1hdGguUEkvMTAqUy53b2JibGUpKTtlbHNlIGlmKFMuc2hhcGUudHlwZT09PSJiaXRtYXAiKXt2YXIgcT1NYXRoLlBJLzEwKlMud29iYmxlLHJlPU1hdGguYWJzKFEtRikqLjEscGU9TWF0aC5hYnMoWi1YKSouMSxnZT1TLnNoYXBlLmJpdG1hcC53aWR0aCpTLnNjYWxhcixoZT1TLnNoYXBlLmJpdG1hcC5oZWlnaHQqUy5zY2FsYXIsRWU9bmV3IERPTU1hdHJpeChbTWF0aC5jb3MocSkqcmUsTWF0aC5zaW4ocSkqcmUsLU1hdGguc2luKHEpKnBlLE1hdGguY29zKHEpKnBlLFMueCxTLnldKTtFZS5tdWx0aXBseVNlbGYobmV3IERPTU1hdHJpeChTLnNoYXBlLm1hdHJpeCkpO3ZhciBBZT1OLmNyZWF0ZVBhdHRlcm4oYy50cmFuc2Zvcm0oUy5zaGFwZS5iaXRtYXApLCJuby1yZXBlYXQiKTtBZS5zZXRUcmFuc2Zvcm0oRWUpLE4uZ2xvYmFsQWxwaGE9MS1SLE4uZmlsbFN0eWxlPUFlLE4uZmlsbFJlY3QoUy54LWdlLzIsUy55LWhlLzIsZ2UsaGUpLE4uZ2xvYmFsQWxwaGE9MX1lbHNlIGlmKFMuc2hhcGU9PT0iY2lyY2xlIilOLmVsbGlwc2U/Ti5lbGxpcHNlKFMueCxTLnksTWF0aC5hYnMoUS1GKSpTLm92YWxTY2FsYXIsTWF0aC5hYnMoWi1YKSpTLm92YWxTY2FsYXIsTWF0aC5QSS8xMCpTLndvYmJsZSwwLDIqTWF0aC5QSSk6XyhOLFMueCxTLnksTWF0aC5hYnMoUS1GKSpTLm92YWxTY2FsYXIsTWF0aC5hYnMoWi1YKSpTLm92YWxTY2FsYXIsTWF0aC5QSS8xMCpTLndvYmJsZSwwLDIqTWF0aC5QSSk7ZWxzZSBpZihTLnNoYXBlPT09InN0YXIiKWZvcih2YXIgY2U9TWF0aC5QSS8yKjMsb2U9NCpTLnNjYWxhcixLPTgqUy5zY2FsYXIsZmU9Uy54LFZlPVMueSxudD01LF9lPU1hdGguUEkvbnQ7bnQtLTspZmU9Uy54K01hdGguY29zKGNlKSpLLFZlPVMueStNYXRoLnNpbihjZSkqSyxOLmxpbmVUbyhmZSxWZSksY2UrPV9lLGZlPVMueCtNYXRoLmNvcyhjZSkqb2UsVmU9Uy55K01hdGguc2luKGNlKSpvZSxOLmxpbmVUbyhmZSxWZSksY2UrPV9lO2Vsc2UgTi5tb3ZlVG8oTWF0aC5mbG9vcihTLngpLE1hdGguZmxvb3IoUy55KSksTi5saW5lVG8oTWF0aC5mbG9vcihTLndvYmJsZVgpLE1hdGguZmxvb3IoWCkpLE4ubGluZVRvKE1hdGguZmxvb3IoUSksTWF0aC5mbG9vcihaKSksTi5saW5lVG8oTWF0aC5mbG9vcihGKSxNYXRoLmZsb29yKFMud29iYmxlWSkpO3JldHVybiBOLmNsb3NlUGF0aCgpLE4uZmlsbCgpLFMudGljazxTLnRvdGFsVGlja3N9ZnVuY3Rpb24gUChOLFMsUixGLFgpe3ZhciBRPVMuc2xpY2UoKSxaPU4uZ2V0Q29udGV4dCgiMmQiKSxxLHJlLHBlPWQoZnVuY3Rpb24oZ2Upe2Z1bmN0aW9uIGhlKCl7cT1yZT1udWxsLFouY2xlYXJSZWN0KDAsMCxGLndpZHRoLEYuaGVpZ2h0KSxjLmNsZWFyKCksWCgpLGdlKCl9ZnVuY3Rpb24gRWUoKXtyJiYhKEYud2lkdGg9PT1vLndpZHRoJiZGLmhlaWdodD09PW8uaGVpZ2h0KSYmKEYud2lkdGg9Ti53aWR0aD1vLndpZHRoLEYuaGVpZ2h0PU4uaGVpZ2h0PW8uaGVpZ2h0KSwhRi53aWR0aCYmIUYuaGVpZ2h0JiYoUihOKSxGLndpZHRoPU4ud2lkdGgsRi5oZWlnaHQ9Ti5oZWlnaHQpLFouY2xlYXJSZWN0KDAsMCxGLndpZHRoLEYuaGVpZ2h0KSxRPVEuZmlsdGVyKGZ1bmN0aW9uKEFlKXtyZXR1cm4gTShaLEFlKX0pLFEubGVuZ3RoP3E9cC5mcmFtZShFZSk6aGUoKX1xPXAuZnJhbWUoRWUpLHJlPWhlfSk7cmV0dXJue2FkZEZldHRpczpmdW5jdGlvbihnZSl7cmV0dXJuIFE9US5jb25jYXQoZ2UpLHBlfSxjYW52YXM6Tixwcm9taXNlOnBlLHJlc2V0OmZ1bmN0aW9uKCl7cSYmcC5jYW5jZWwocSkscmUmJnJlKCl9fX1mdW5jdGlvbiB6KE4sUyl7dmFyIFI9IU4sRj0hIWIoU3x8e30sInJlc2l6ZSIpLFg9ITEsUT1iKFMsImRpc2FibGVGb3JSZWR1Y2VkTW90aW9uIixCb29sZWFuKSxaPWEmJiEhYihTfHx7fSwidXNlV29ya2VyIikscT1aP3UoKTpudWxsLHJlPVI/VDpELHBlPU4mJnE/ISFOLl9fY29uZmV0dGlfaW5pdGlhbGl6ZWQ6ITEsZ2U9dHlwZW9mIG1hdGNoTWVkaWE9PSJmdW5jdGlvbiImJm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSIpLm1hdGNoZXMsaGU7ZnVuY3Rpb24gRWUoY2Usb2UsSyl7Zm9yKHZhciBmZT1iKGNlLCJwYXJ0aWNsZUNvdW50IixnKSxWZT1iKGNlLCJhbmdsZSIsTnVtYmVyKSxudD1iKGNlLCJzcHJlYWQiLE51bWJlciksX2U9YihjZSwic3RhcnRWZWxvY2l0eSIsTnVtYmVyKSxqdD1iKGNlLCJkZWNheSIsTnVtYmVyKSxPbj1iKGNlLCJncmF2aXR5IixOdW1iZXIpLFZ0PWIoY2UsImRyaWZ0IixOdW1iZXIpLEluPWIoY2UsImNvbG9ycyIsaCksUHI9YihjZSwidGlja3MiLE51bWJlciksUW49YihjZSwic2hhcGVzIiksTHI9YihjZSwic2NhbGFyIiksdXI9ISFiKGNlLCJmbGF0IiksbWU9RShjZSksV2U9ZmUsYnQ9W10sTW49Ti53aWR0aCptZS54LHByPU4uaGVpZ2h0Km1lLnk7V2UtLTspYnQucHVzaChJKHt4Ok1uLHk6cHIsYW5nbGU6VmUsc3ByZWFkOm50LHN0YXJ0VmVsb2NpdHk6X2UsY29sb3I6SW5bV2UlSW4ubGVuZ3RoXSxzaGFwZTpRblttKDAsUW4ubGVuZ3RoKV0sdGlja3M6UHIsZGVjYXk6anQsZ3Jhdml0eTpPbixkcmlmdDpWdCxzY2FsYXI6THIsZmxhdDp1cn0pKTtyZXR1cm4gaGU/aGUuYWRkRmV0dGlzKGJ0KTooaGU9UChOLGJ0LHJlLG9lLEspLGhlLnByb21pc2UpfWZ1bmN0aW9uIEFlKGNlKXt2YXIgb2U9UXx8YihjZSwiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLEs9YihjZSwiekluZGV4IixOdW1iZXIpO2lmKG9lJiZnZSlyZXR1cm4gZChmdW5jdGlvbihfZSl7X2UoKX0pO1ImJmhlP049aGUuY2FudmFzOlImJiFOJiYoTj1BKEspLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoTikpLEYmJiFwZSYmcmUoTik7dmFyIGZlPXt3aWR0aDpOLndpZHRoLGhlaWdodDpOLmhlaWdodH07cSYmIXBlJiZxLmluaXQoTikscGU9ITAscSYmKE4uX19jb25mZXR0aV9pbml0aWFsaXplZD0hMCk7ZnVuY3Rpb24gVmUoKXtpZihxKXt2YXIgX2U9e2dldEJvdW5kaW5nQ2xpZW50UmVjdDpmdW5jdGlvbigpe2lmKCFSKXJldHVybiBOLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfX07cmUoX2UpLHEucG9zdE1lc3NhZ2Uoe3Jlc2l6ZTp7d2lkdGg6X2Uud2lkdGgsaGVpZ2h0Ol9lLmhlaWdodH19KTtyZXR1cm59ZmUud2lkdGg9ZmUuaGVpZ2h0PW51bGx9ZnVuY3Rpb24gbnQoKXtoZT1udWxsLEYmJihYPSExLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixWZSkpLFImJk4mJihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKE4pJiZkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKE4pLE49bnVsbCxwZT0hMSl9cmV0dXJuIEYmJiFYJiYoWD0hMCx0LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsVmUsITEpKSxxP3EuZmlyZShjZSxmZSxudCk6RWUoY2UsZmUsbnQpfXJldHVybiBBZS5yZXNldD1mdW5jdGlvbigpe3EmJnEucmVzZXQoKSxoZSYmaGUucmVzZXQoKX0sQWV9dmFyIEI7ZnVuY3Rpb24gVygpe3JldHVybiBCfHwoQj16KG51bGwse3VzZVdvcmtlcjohMCxyZXNpemU6ITB9KSksQn1mdW5jdGlvbiBzZShOLFMsUixGLFgsUSxaKXt2YXIgcT1uZXcgUGF0aDJEKE4pLHJlPW5ldyBQYXRoMkQ7cmUuYWRkUGF0aChxLG5ldyBET01NYXRyaXgoUykpO3ZhciBwZT1uZXcgUGF0aDJEO3JldHVybiBwZS5hZGRQYXRoKHJlLG5ldyBET01NYXRyaXgoW01hdGguY29zKFopKlgsTWF0aC5zaW4oWikqWCwtTWF0aC5zaW4oWikqUSxNYXRoLmNvcyhaKSpRLFIsRl0pKSxwZX1mdW5jdGlvbiBPKE4pe2lmKCFpKXRocm93IG5ldyBFcnJvcigicGF0aCBjb25mZXR0aSBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTt2YXIgUyxSO3R5cGVvZiBOPT0ic3RyaW5nIj9TPU46KFM9Ti5wYXRoLFI9Ti5tYXRyaXgpO3ZhciBGPW5ldyBQYXRoMkQoUyksWD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxRPVguZ2V0Q29udGV4dCgiMmQiKTtpZighUil7Zm9yKHZhciBaPTFlMyxxPVoscmU9WixwZT0wLGdlPTAsaGUsRWUsQWU9MDtBZTxaO0FlKz0yKWZvcih2YXIgY2U9MDtjZTxaO2NlKz0yKVEuaXNQb2ludEluUGF0aChGLEFlLGNlLCJub256ZXJvIikmJihxPU1hdGgubWluKHEsQWUpLHJlPU1hdGgubWluKHJlLGNlKSxwZT1NYXRoLm1heChwZSxBZSksZ2U9TWF0aC5tYXgoZ2UsY2UpKTtoZT1wZS1xLEVlPWdlLXJlO3ZhciBvZT0xMCxLPU1hdGgubWluKG9lL2hlLG9lL0VlKTtSPVtLLDAsMCxLLC1NYXRoLnJvdW5kKGhlLzIrcSkqSywtTWF0aC5yb3VuZChFZS8yK3JlKSpLXX1yZXR1cm57dHlwZToicGF0aCIscGF0aDpTLG1hdHJpeDpSfX1mdW5jdGlvbiAkKE4pe3ZhciBTLFI9MSxGPSIjMDAwMDAwIixYPSciQXBwbGUgQ29sb3IgRW1vamkiLCAiU2Vnb2UgVUkgRW1vamkiLCAiU2Vnb2UgVUkgU3ltYm9sIiwgIk5vdG8gQ29sb3IgRW1vamkiLCAiRW1vamlPbmUgQ29sb3IiLCAiQW5kcm9pZCBFbW9qaSIsICJUd2Vtb2ppIE1vemlsbGEiLCAic3lzdGVtIGVtb2ppIiwgc2Fucy1zZXJpZic7dHlwZW9mIE49PSJzdHJpbmciP1M9TjooUz1OLnRleHQsUj0ic2NhbGFyImluIE4/Ti5zY2FsYXI6UixYPSJmb250RmFtaWx5ImluIE4/Ti5mb250RmFtaWx5OlgsRj0iY29sb3IiaW4gTj9OLmNvbG9yOkYpO3ZhciBRPTEwKlIsWj0iIitRKyJweCAiK1gscT1uZXcgT2Zmc2NyZWVuQ2FudmFzKFEsUSkscmU9cS5nZXRDb250ZXh0KCIyZCIpO3JlLmZvbnQ9Wjt2YXIgcGU9cmUubWVhc3VyZVRleHQoUyksZ2U9TWF0aC5jZWlsKHBlLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQrcGUuYWN0dWFsQm91bmRpbmdCb3hMZWZ0KSxoZT1NYXRoLmNlaWwocGUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQrcGUuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50KSxFZT0yLEFlPXBlLmFjdHVhbEJvdW5kaW5nQm94TGVmdCtFZSxjZT1wZS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCtFZTtnZSs9RWUrRWUsaGUrPUVlK0VlLHE9bmV3IE9mZnNjcmVlbkNhbnZhcyhnZSxoZSkscmU9cS5nZXRDb250ZXh0KCIyZCIpLHJlLmZvbnQ9WixyZS5maWxsU3R5bGU9RixyZS5maWxsVGV4dChTLEFlLGNlKTt2YXIgb2U9MS9SO3JldHVybnt0eXBlOiJiaXRtYXAiLGJpdG1hcDpxLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLG1hdHJpeDpbb2UsMCwwLG9lLC1nZSpvZS8yLC1oZSpvZS8yXX19bi5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIFcoKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4uZXhwb3J0cy5yZXNldD1mdW5jdGlvbigpe1coKS5yZXNldCgpfSxuLmV4cG9ydHMuY3JlYXRlPXosbi5leHBvcnRzLnNoYXBlRnJvbVBhdGg9TyxuLmV4cG9ydHMuc2hhcGVGcm9tVGV4dD0kfSkoZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXN8fHt9fSgpLE9mLCExKTt2YXIgTGQ9T2YuZXhwb3J0cyxnej1PZi5leHBvcnRzLmNyZWF0ZTt2YXIgaXI9IkFtcGxlIEFnZW50IFBybyIsSWY9IlhyeGhHV1BiYm1nU0JKNmZTQ1ZuczU3ayI7ZnVuY3Rpb24gVWQoKXtsZXQgZT1QZSgpW2ouTExNX1BST1ZJREVSX01PREVMXTtpZighZXx8ZT09PSJub25lIilyZXR1cm5bXTtsZXQgdD1vbyhlKXx8ZSxuPUFmW3RdO2lmKCFufHxuLmxlbmd0aD09PTApcmV0dXJuW107bGV0IHI9WHRbdF07cmV0dXJuIHI/W3IsLi4ubi5maWx0ZXIobz0+byE9PXIpXTpbLi4ubl19ZnVuY3Rpb24gTWIoZSx0KXtsZXQgbj1QZSgpLHI9JHQodCk7aWYociYmbltyXSlyZXR1cm4gbltyXS50cmltKCk7bGV0IG89blsiTExNIEFQSSBLZXkiXTtpZihvKXJldHVybiBvLnRyaW0oKTtpZih1eSl0aHJvdyBuZXcgRXJyb3IoYENvdWxkbnQgZmluZCBhICR7dH0ga2V5IGluICR7SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMobikpfWApO3JldHVybiBlLmFsZXJ0KCJQbGVhc2UgY29uZmlndXJlIHlvdXIgQVBJIGtleSBpbiBwbHVnaW4gc2V0dGluZ3MuIiksbnVsbH1mdW5jdGlvbiBSYihlLHQpe2xldCBuPWhvKGUpLHI9RGZbbl07cmV0dXJuIHI9ci5yZXBsYWNlKCJ7bW9kZWwtbmFtZX0iLGUpLG49PT0iZ2VtaW5pIiYmKHI9YCR7cn0/a2V5PSR7dH1gKSxyfWZ1bmN0aW9uIGhvKGUpe2ZvcihsZXRbdCxuXW9mIE9iamVjdC5lbnRyaWVzKEFmKSlpZihuLmluY2x1ZGVzKGUpKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgTW9kZWwgJHtlfSBub3QgZm91bmQgaW4gYW55IHByb3ZpZGVyYCl9ZnVuY3Rpb24gR2EoZSl7cmV0dXJue2FudGhyb3BpYzoiQW50aHJvcGljIixkZWVwc2VlazoiRGVlcFNlZWsiLGdlbWluaToiR2VtaW5pIixncm9rOiJHcm9rIixvcGVuYWk6Ik9wZW5BSSIscGVycGxleGl0eToiUGVycGxleGl0eSJ9W2VdfHxlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9ZnVuY3Rpb24gUGIoZSl7bGV0IHQsbj1lLnRyaW0oKSxyPW4uaW5kZXhPZigiWyIpLG89bi5pbmRleE9mKCJ7IiksYT1uLmluY2x1ZGVzKCJ9IiksaT1uLmluY2x1ZGVzKCJdIikscz0hMSxsPS0xO2EmJm89PT0tMSYmKGU9YHske2V9YCxvPTApLGkmJnI9PT0tMSYmKGU9YFske2V9YCxyPTApLHI9ZS5pbmRleE9mKCJbIiksbz1lLmluZGV4T2YoInsiKSxyIT09LTEmJihvPT09LTF8fHI8byk/KHM9ITAsbD1yKTpvIT09LTE/KHM9ITEsbD1vKTooZT1geyR7ZX19YCxsPTAscz0hMSk7bGV0IGQ9cz8iXSI6In0iLGM9ZS5sYXN0SW5kZXhPZihkKTtpZihjPT09LTEpe2VbZS5sZW5ndGgtMV09PT0iLCImJihlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtMSkpO2xldCBwPWUuaW5jbHVkZXMoIlsiKSYmIWUuaW5jbHVkZXMoIl0iKSx1PWUuaW5jbHVkZXMoInsiKSYmIWUuaW5jbHVkZXMoIn0iKTtwJiZ1P2UrPSJ9XSI6cD9lKz0iXSI6dT9lKz0ifSI6ZT1zP2Ake2V9XWA6YCR7ZX19YH1lbHNlIGU9ZS5zdWJzdHJpbmcobCxjKzEpO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2gocCl7bGV0IHU9ZTtlPVJUKGUpLGsoYEZhaWxlZCB0byBwYXJzZSBqc29uVGV4dCBTVEFSVDoKJHt1fQpFTkQKIGR1ZSB0byAke3B9LiBBdHRlbXB0ZWQgcmViYWxhbmNlIHlpZWxkZWQ6ICR7ZX0gKG9yaWdpbmFsIHNpemUgJHt1Lmxlbmd0aHx8IihudWxsKSJ9LCByZWJhbGFuY2Ugc2l6ZSAke2U/Lmxlbmd0aHx8IigwKSJ9KWApO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2godil7aygiUmViYWxhbmNlZCBqc29uVGV4dCBzdGlsbCBmYWlscyIsdil9bGV0IGY9ZS5yZXBsYWNlKC8iIiIvZywnIlxcIiInKS5yZXBsYWNlKC8iXG4vZywnIlxcbicpO2lmKGY9Zi5yZXBsYWNlKC8oW3ssXVxzKikoW2EtekEtWl8kXVthLXpBLVowLTlfJF0qKSI6L2csJyQxIiQyIjonKSxmPWYucmVwbGFjZSgvXG5ccypbJ+KAnOKAnV0vZyxgCiJgKS5yZXBsYWNlKC9bJ+KAnOKAnV0sXHMqXG4vZyxgIiwKYCkucmVwbGFjZSgvWyfigJzigJ1dXHMqKFtcblxdXSkvLCciJDEnKSxmIT09ZSl0cnl7cmV0dXJuIHQ9SlNPTi5wYXJzZShmKSx0fWNhdGNoKHYpe2soIlJlZm9ybWF0dGVkIHRleHQgc3RpbGwgZmFpbHMiLHYpfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBSVChlKXtsZXQgdD1lLmluZGV4T2YoInsiKTtpZih0PT09LTEpcmV0dXJuIG51bGw7bGV0IG49ZS5zdWJzdHJpbmcodCkudHJpbSgpLHI9W10sbz0iIjtmb3IobGV0IGEgb2YgbilpZihvKz1hLGE9PT0ieyI/ci5wdXNoKCJ9Iik6YT09PSJ9Ij9yW3IubGVuZ3RoLTFdPT09In0iJiZyLnBvcCgpOmE9PT0iWyI/ci5wdXNoKCJdIik6YT09PSJdIiYmcltyLmxlbmd0aC0xXT09PSJdIiYmci5wb3AoKSxyLmxlbmd0aD09PTApYnJlYWs7cmV0dXJuIHIubGVuZ3RoJiYoaygiRm91bmQiLHIubGVuZ3RoLCJjaGFyYWN0ZXJzIHRvIGFwcGVuZCB0byBiYWxhbmNlIixvLCIuIEFkZGluZyAiLHIucmV2ZXJzZSgpLmpvaW4oIiIpKSxvKz1yLnJldmVyc2UoKS5qb2luKCIiKSksb312YXIgTGI9MjtmdW5jdGlvbiB6ZChlKXtsZXQgdD1lLnRyaW0oKTt0LmluZGV4T2YoInsiKT09PS0xJiYodD0ieyIrdCk7bGV0IHI7dC5zcGxpdCgifXsiKS5sZW5ndGg+MT8ocj10LnNwbGl0KCJ9eyIpLm1hcChpPT5gJHtpWzBdPT09InsiPyIiOiJ7In0ke2l9JHtpW2kubGVuZ3RoLTFdPT09In0iPyIiOiJ9In1gKSxrKCJSZWNlaXZlZCBtdWx0aXBsZSByZXNwb25zZXMgZnJvbSBBSSwgZXZhbHVhdGluZyBlYWNoIG9mIixyKSk6cj1bdF07bGV0IGE9ci5tYXAoaT0+UGIoaSkpLmZpbHRlcihpPT5pKTtpZihhLmxlbmd0aClpZihhLmxlbmd0aD4xKXtsZXQgaT1hWzBdO3JldHVybiBPYmplY3QuZW50cmllcyhpKS5mb3JFYWNoKChbcyxsXSk9Pntmb3IobGV0IGQgb2YgYS5zbGljZSgxKSl7bGV0IGM9ZFtzXTtjJiZBcnJheS5pc0FycmF5KGMpJiZBcnJheS5pc0FycmF5KGwpJiYoaVtzXT1bLi4ubmV3IFNldChbLi4ubCwuLi5jXSldLmZpbHRlcihwPT5wKSl9fSksaX1lbHNlIHJldHVybiBhWzBdO3JldHVybiBudWxsfWZ1bmN0aW9uIFBUKGUsdCl7bGV0IG47c3dpdGNoKGUpe2Nhc2UiYW50aHJvcGljIjpuPXQ/LmNvbnRlbnQ/LmF0KDApPy50ZXh0O2JyZWFrO2Nhc2UiZ2VtaW5pIjpuPXQ/LmNhbmRpZGF0ZXM/LmF0KDApPy5jb250ZW50Py5wYXJ0cz8uYXQoMCk/LnRleHQ7YnJlYWs7Y2FzZSJvbGxhbWEiOm49dD8ubWVzc2FnZT8uY29udGVudHx8dD8ucmVzcG9uc2U7YnJlYWs7Y2FzZSJkZWVwc2VlayI6Y2FzZSJncm9rIjpjYXNlIm9wZW5haSI6Y2FzZSJwZXJwbGV4aXR5IjpkZWZhdWx0Om49dD8uY2hvaWNlcz8uYXQoMCk/Lm1lc3NhZ2U/LmNvbnRlbnR8fHQ/LmNob2ljZXM/LmF0KDApPy5tZXNzYWdlPy50b29sX2NhbGxzPy5hdCgwKT8uZnVuY3Rpb24/LmFyZ3VtZW50czticmVha31yZXR1cm4gbnx8ayhgQ291bGQgbm90IGV4dHJhY3QgY29udGVudCBmcm9tICR7ZX0gcmVzcG9uc2U6YCxKU09OLnN0cmluZ2lmeSh0LG51bGwsMikpLG58fG51bGx9YXN5bmMgZnVuY3Rpb24gVWIoZSx0LG4scixvLGEse3RpbWVvdXRTZWNvbmRzOmk9MzB9PXt9KXtsZXQgcz1obyhuKSxsO2lmKG8pbD1hd2FpdCBMVChlLHQsbiwhMCxvKSxlLmFsZXJ0KGwse3Njcm9sbFRvRW5kOiEwfSk7ZWxzZSB0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFtuZXcgUHJvbWlzZShhc3luYyhjLHApPT57bGV0IHU9YXdhaXQgdC5qc29uKCk7bD1QVChzLHUpLGMobCl9KSxuZXcgUHJvbWlzZSgoYyxwKT0+c2V0VGltZW91dCgoKT0+cChuZXcgRXJyb3IoYCR7c30gVGltZW91dGApKSxpKjFlMykpXSl9Y2F0Y2goYyl7dGhyb3cgaygiRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGZyb20iLG4sImVycm9yIixjKSxjfWxldCBkPWw7cmV0dXJuIGw9emQobCksIWF8fGEobCk/bDooZCYmaygiUmVjZWl2ZWQiLGQsImJ1dCBjb3VsZCBub3QgcGFyc2UgYXMgYSB2YWxpZCByZXN1bHQiKSxudWxsKX1hc3luYyBmdW5jdGlvbiBMVChlLHQsbixyLG8pe3JldHVybiB0eXBlb2YgZ2xvYmFsPCJ1IiYmdHlwZW9mIGdsb2JhbC5mZXRjaDwidSI/YXdhaXQgVVQoZSx0LG4scixvKTphd2FpdCB6VChlLHQsbixyLG8pfWFzeW5jIGZ1bmN0aW9uIFVUKGUsdCxuLHIsbyl7bGV0IGE9dC5ib2R5LGk9ITEscz0iIixsLGQ7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChjLHApPT57bGV0IHU9KCk9PntsZXQgZj0wLHY9KCk9PntsZXQgdz1hLnJlYWQoKTtpZih3KXtmPTA7bGV0IGI9dy50b1N0cmluZygpO2lmKHthYm9ydDppLGZhaWxlZFBhcnNlQ29udGVudDpsLGluY3JlbWVudGFsQ29udGVudHM6ZCxyZWNlaXZlZENvbnRlbnQ6c309byhlLGIscyxuLHIsbCksaXx8IXpiKGQscykpe2MoKTtyZXR1cm59digpfWVsc2UgZis9MSxmPDM/c2V0VGltZW91dCh2LExiKjFlMyk6YygpfTt2KCl9O2Eub24oInJlYWRhYmxlIix1KX0pLHN9YXN5bmMgZnVuY3Rpb24gelQoZSx0LG4scixvKXtsZXQgYT10LmJvZHkuZ2V0UmVhZGVyKCksaT1uZXcgVGV4dERlY29kZXIscyxsLGQsYyxwPTAsdT0iIjtmb3IoOyFsOyl7bGV0IGY9bnVsbCx2PSExO3RyeXthd2FpdCBQcm9taXNlLnJhY2UoW3tkb25lOnYsdmFsdWU6Zn09YXdhaXQgYS5yZWFkKCksbmV3IFByb21pc2UoKHcsYik9PnNldFRpbWVvdXQoKCk9PmIobmV3IEVycm9yKCJUaW1lb3V0IikpLExiKjFlMykpXSl9Y2F0Y2godyl7bD13LGsoIkZhaWxlZCB0byByZWNlaXZlIGZ1cnRoZXIgc3RyZWFtIGRhdGEgaW4gdGltZSIsdyk7YnJlYWt9aWYodnx8cD4zKXtrKCJDb21wbGV0ZWQgZ2VuZXJhdGluZyByZXNwb25zZSBsZW5ndGgiKTticmVha31lbHNlIGlmKGYpe2xldCB3PWkuZGVjb2RlKGYse3N0cmVhbTohMH0pO3RyeXtpZih0eXBlb2Ygdz09InN0cmluZyIpe3A9MDtsZXQgYj1vKGUsdyx1LG4scixkKTtpZihiKXtpZih7YWJvcnQ6cyxmYWlsZWRQYXJzZUNvbnRlbnQ6ZCxpbmNyZW1lbnRhbENvbnRlbnRzOmMscmVjZWl2ZWRDb250ZW50OnV9PWIsc3x8IXpiKGMsdSkpYnJlYWt9ZWxzZSBrKCJGYWlsZWQgdG8gcGFyc2Ugc3RyZWFtIGZyb20iLGYsImFzIEpTT04iKSxwKz0xfWVsc2UgaygiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSBmcm9tIixmLCJhcyBKU09OIikscCs9MX1jYXRjaChiKXtrKCJUaGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgcmVzcG9uc2UgZnJvbSBzdHJlYW06IixiKTticmVha319ZWxzZSBwKz0xfXJldHVybiB1fWZ1bmN0aW9uIHpiKGUsdCl7bGV0IG47aWYoZT8ubGVuZ3RoJiYodD8ubGVuZ3RofHwwKT49a3Ape2xldCByPXQucmVwbGFjZSgvXG4vZywiICIpO249ci5zdWJzdHJpbmcoci5sZW5ndGgta3ApLnRyaW0oKT09PSIiLG4mJmsoIlJlc3BvbnNlIGV4Y2VlZHMgZW1wdHkgc3BhY2UgdGhyZXNob2xkLiBBYm9ydGluZyIpfXJldHVybiFufXZhciBGVD0zMCxGYj01MDthc3luYyBmdW5jdGlvbiAkVChlLHQsbixyLG8sYSxpKXtsZXQgcz1VZCgpO3ImJihzPXMuZmlsdGVyKHY9PnYhPT1yKSxzLnVuc2hpZnQocikpO2xldCBsPXMuc2hpZnQoKTtrKCJbbGxtUHJvbXB0XSBtb2RlbCByZXNvbHV0aW9uIix7YWlNb2RlbE92ZXJyaWRlOnIsbW9kZWxUb1VzZTpsPz9udWxsLHJlbWFpbmluZ0NhbmRpZGF0ZUNvdW50OnMubGVuZ3RoLGFwaUtleU92ZXJyaWRlUHJlc2VudDohIW99KTtsZXQgZD1be3JvbGU6InVzZXIiLGNvbnRlbnQ6bn1dLGM9aT97dGltZW91dFNlY29uZHM6aX06e307byYmKGMuYXBpS2V5PW8pO2xldCBwPWF3YWl0IEhUKGUsZCxsLGMpLGY9YXdhaXQgVWIoZSxwLGwsYT8ibGxtUHJvbXB0SnNvbiI6bnVsbCxudWxsLG51bGwpO3JldHVybiBmJiZhJiZ0eXBlb2YgZj09InN0cmluZyI/emQoZik6Zn1hc3luYyBmdW5jdGlvbiBGZChlLHQse2pzb25SZXNwb25zZTpuLGFpTW9kZWw6cixhcGlLZXk6byx0aW1lb3V0U2Vjb25kczphfT17fSl7bGV0IGk9cGVyZm9ybWFuY2Uubm93KCk7aygiW2xsbVByb21wdF0gc3RhcnRpbmciLHtwcm9tcHRMZW5ndGg6dD8ubGVuZ3RoPz8wLGFtcGxlQWdlbnRQcm9VdWlkOklmLGhhc0NhbGxQbHVnaW46dHlwZW9mIGU/LmNhbGxQbHVnaW49PSJmdW5jdGlvbiIsanNvblJlc3BvbnNlOiEhbixhaU1vZGVsT3ZlcnJpZGU6cj8/bnVsbCxhcGlLZXlPdmVycmlkZVByZXNlbnQ6ISFvfSk7dHJ5e2xldCBkPWF3YWl0IGUuY2FsbFBsdWdpbih7c291cmNlOklmfSwiIix0LHIpO2lmKHR5cGVvZiBkPiJ1Iil7bGV0IHA9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTppcn0pO2soIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gcmV0dXJuZWQgdW5kZWZpbmVkOyBjaGVja2luZyBmb3IgQW1wbGUgQWdlbnQgUHJvIG5vdGUgZXhpc3RlbmNlLCBnb3QiLHApLHAmJihkPWF3YWl0IGUuY2FsbFBsdWdpbih7dXVpZDpwLnV1aWR9LCIiLHQsciksayhgW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gQXR0ZW1wdCB0byBjYWxsUGx1Z2luIGZvciBub3RlIHV1aWQgJHtwLnV1aWR9IHlpZWxkZWRgLGQpKX1sZXQgYz1OdW1iZXIoKHBlcmZvcm1hbmNlLm5vdygpLWkpLnRvRml4ZWQoMSkpO2lmKGQpe2xldCB1PXR5cGVvZiBkPT0ic3RyaW5nIj9kLnN1YnN0cmluZygwLDMwMCk6SlNPTi5zdHJpbmdpZnkoZCkuc3Vic3RyaW5nKDAsMzAwKTtrKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHJhdyByZXN1bHQiLHtkdXJhdGlvbk1zOmMscmVzdWx0VHlwZTp0eXBlb2YgZCxyZXN1bHRMZW5ndGg6dHlwZW9mIGQ9PSJzdHJpbmciP2QubGVuZ3RoOm51bGwscmVzdWx0U25pcHBldDp1fSk7bGV0IGY9biYmdHlwZW9mIGQ9PSJzdHJpbmciP3pkKGQpOmQ7cmV0dXJuIGsoIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gcGFyc2VkIHJlc3VsdCIse3BhcnNlZFR5cGU6Zj09PW51bGw/Im51bGwiOnR5cGVvZiBmLGhhc1Rhc2tzRmllbGQ6ISEoZiYmdHlwZW9mIGY9PSJvYmplY3QiJiYidGFza3MiaW4gZiksdGFza3NMZW5ndGg6QXJyYXkuaXNBcnJheShmPy50YXNrcyk/Zi50YXNrcy5sZW5ndGg6bnVsbCxoYXNHb2Fsc1N1bW1hcnk6ISEoZiYmdHlwZW9mIGY9PSJvYmplY3QiJiZmLmdvYWxzU3VtbWFyeSl9KSxmfWsoYFtsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gcmV0dXJuZWQgJyR7ZH0nICh0eXBlb2YgJHt0eXBlb2YgZH0pIFx1MjAxNCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IExMTWAse2R1cmF0aW9uTXM6YyxwbHVnaW5SZXN1bHRWYWx1ZTpkLHBsdWdpblJlc3VsdFR5cGU6dHlwZW9mIGR9KX1jYXRjaChkKXtrKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHRocmV3IFx1MjAxNCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IExMTSIse2R1cmF0aW9uTXM6TnVtYmVyKChwZXJmb3JtYW5jZS5ub3coKS1pKS50b0ZpeGVkKDEpKSxlcnJvck1lc3NhZ2U6ZD8ubWVzc2FnZSxlcnJvck5hbWU6ZD8ubmFtZX0pfWxldCBzPXBlcmZvcm1hbmNlLm5vdygpLGw9YXdhaXQgJFQoZSxudWxsLHQscixvLG4sYSk7cmV0dXJuIGsoIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGxsbVByb21wdCBmYWxsYmFjayBjb21wbGV0ZSIse2R1cmF0aW9uTXM6TnVtYmVyKChwZXJmb3JtYW5jZS5ub3coKS1zKS50b0ZpeGVkKDEpKSxyZXN1bHRUeXBlOmw9PT1udWxsPyJudWxsIjp0eXBlb2YgbCxoYXNUYXNrc0ZpZWxkOiEhKGwmJnR5cGVvZiBsPT0ib2JqZWN0IiYmInRhc2tzImluIGwpfSksbH1mdW5jdGlvbiBNZihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLm1hcCh0PT5NZih0KSk6IWV8fHR5cGVvZiBlIT0ib2JqZWN0Ij9lOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhlKS5tYXAoKFt0LG5dKT0+dD09PSJjb250ZW50IiYmdHlwZW9mIG49PSJzdHJpbmciJiZuLmxlbmd0aD5GYj9bdCxgJHtuLnNsaWNlKDAsRmItMyl9Li4uYF06W3QsTWYobildKSl9ZnVuY3Rpb24gV1QoZSx0KXtsZXQgbj17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifTtzd2l0Y2goZSl7Y2FzZSJhbnRocm9waWMiOnJldHVybnsuLi5uLCJ4LWFwaS1rZXkiOnQsImFudGhyb3BpYy1kYW5nZXJvdXMtZGlyZWN0LWJyb3dzZXItYWNjZXNzIjoidHJ1ZSIsImFudGhyb3BpYy12ZXJzaW9uIjoiMjAyMy0wNi0wMSJ9O2Nhc2UiZ2VtaW5pIjpyZXR1cm4gbjtkZWZhdWx0OnJldHVybnsuLi5uLEF1dGhvcml6YXRpb246YEJlYXJlciAke3R9YH19fWZ1bmN0aW9uIEJUKGUsdCxuLHIse3Byb21wdEtleTpvPW51bGx9PXt9KXtsZXQgYTtzd2l0Y2goaG8odCkpe2Nhc2UiYW50aHJvcGljIjp7bGV0IHM9ZS5maW5kKGQ9PmQucm9sZT09PSJzeXN0ZW0iKSxsPWUuZmlsdGVyKGQ9PmQucm9sZSE9PSJzeXN0ZW0iKTthPXttYXhfdG9rZW5zOjQwOTYsbW9kZWw6dCxtZXNzYWdlczpsfSxuJiYoYS5zdHJlYW09bikscyYmKGEuc3lzdGVtPXMuY29udGVudCk7YnJlYWt9Y2FzZSJnZW1pbmkiOntsZXQgcz1lLmZpbmQoZD0+ZC5yb2xlPT09InN5c3RlbSIpO2E9e2NvbnRlbnRzOmUuZmlsdGVyKGQ9PmQucm9sZSE9PSJzeXN0ZW0iKS5tYXAoZD0+KHtyb2xlOmQucm9sZT09PSJhc3Npc3RhbnQiPyJtb2RlbCI6InVzZXIiLHBhcnRzOlt7dGV4dDpkLmNvbnRlbnR9XX0pKX0scyYmKGEuc3lzdGVtSW5zdHJ1Y3Rpb249e3BhcnRzOlt7dGV4dDpzLmNvbnRlbnR9XX0pLGEuZ2VuZXJhdGlvbkNvbmZpZz17cmVzcG9uc2VNaW1lVHlwZToiYXBwbGljYXRpb24vanNvbiJ9O2JyZWFrfWNhc2UiZ3JvayI6Y2FzZSJwZXJwbGV4aXR5IjphPXttb2RlbDp0LG1lc3NhZ2VzOmV9LG4mJihhLnN0cmVhbT1uKSxyJiYoYS50b29scz1yKTticmVhaztjYXNlImRlZXBzZWVrIjp7YT17bW9kZWw6dCxtZXNzYWdlczplfSxuJiYoYS5zdHJlYW09biksciYmKGEudG9vbHM9ciksYS5yZXNwb25zZV9mb3JtYXQ9e3R5cGU6Impzb25fb2JqZWN0In07YnJlYWt9Y2FzZSJvcGVuYWkiOmRlZmF1bHQ6e2E9e21vZGVsOnQsbWVzc2FnZXM6ZX0sbiYmKGEuc3RyZWFtPW4pLHImJihhLnRvb2xzPXIpLGEucmVzcG9uc2VfZm9ybWF0PXt0eXBlOiJqc29uX29iamVjdCJ9O2JyZWFrfX1yZXR1cm4gYX1hc3luYyBmdW5jdGlvbiBIVChlLHQsbix7YXBpS2V5OnI9bnVsbCxhdHRlbXB0TnVtYmVyOm89MSxwcm9tcHRLZXk6YT1udWxsLHN0cmVhbTppPW51bGwsdGltZW91dFNlY29uZHM6cz1GVCx0b29sczpsPW51bGx9PXt9KXtsZXQgZD1obyhuKTtvPjAmJmsoYEF0dGVtcHQgIyR7b306IFRyeWluZyAke259IHdpdGggJHthfHwibm8gcHJvbXB0S2V5In1gKSxyfHwocj1NYihlLGQpKTtsZXQgYz1CVCh0LG4saSxsLHtwcm9tcHRLZXk6YX0pLHA9UmIobixyKTtrKGBDYWxsaW5nICR7ZH0gYXQgJHtwfSB3aXRoIGJvZHkgJHtKU09OLnN0cmluZ2lmeShNZihjKSl9IGF0ICR7bmV3IERhdGV9YCk7bGV0IHU9V1QoZCxyKSxmPWF3YWl0IFByb21pc2UucmFjZShbZmV0Y2gocCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnUsYm9keTpKU09OLnN0cmluZ2lmeShjKX0pLG5ldyBQcm9taXNlKCh2LHcpPT5zZXRUaW1lb3V0KCgpPT53KG5ldyBFcnJvcigiVGltZW91dCIpKSxzKjFlMykpXSk7aWYoIWYub2spe2xldCB2PW5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtmLnN0YXR1c31gKTt0aHJvdyB2LnJlc3BvbnNlPWYsdn1yZXR1cm4gZn12YXIgR1Q9WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGpUPTUwLFZUPTJlMyxLVD0zZTMsWVQ9MWUzLHFUPTFlMyxCYj01MDAsJGI9ODY0MDAsZ3M9MWUxMCxRVD02MCxKVD0zLFhUPTIwMCxaVD00MDEsZUQ9NDAzLHREPTEsbkQ9MTAsckQ9NSxvRD03LGFEPTUsaUQ9LjUsc0Q9MyxsRD0yMCxkRD0xNSxjRD0xNSx1RD04LHBEPTI1LGZEPTIwLGhEPTEyLGdEPTUsbUQ9NSx2RD0zLHlEPTE1LHdEPTEwLGJEPTUsV2I9MSxrRD0zLHhEPTcsU0Q9InN1ZyIsRUQ9MWU2LE5EPS4xO2FzeW5jIGZ1bmN0aW9uIEhiKGUse2V4Y2x1ZGVVdWlkczp0LGV4aXN0aW5nTm90ZUhhbmRsZTpuLG1pbmltdW1UYXNrQ291bnQ6cj0xLG5vdGVOYW1lOm89YERhc2hib2FyZCBwcm9wb3NlZCB0YXNrcyBmb3IgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFtdLHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0pfWAscHJvdmlkZXJFbU92ZXJyaWRlOmF9PXt9KXtsZXQgaT1NYXRoLm1heCgxLHBhcnNlSW50KHIsMTApfHwxKSxzPXQgaW5zdGFuY2VvZiBTZXQ/dDpudWxsLGw9bmV3IERhdGUsZD1HVFtsLmdldERheSgpXSxjPWlvW2wuZ2V0TW9udGgoKV0scD1sLmdldERheSgpPT09MHx8bC5nZXREYXkoKT09PTY7aygiW2RyZWFtLXRhc2tdIGFuYWx5emVEcmVhbVRhc2tzIGVudHJ5Iix7bm90ZU5hbWU6byxtaW5pbXVtU3VnZ2VzdGlvbkNvdW50OmksZXhjbHVkZVV1aWRzU2l6ZTpzPy5zaXplPz8wLHByb3ZpZGVyRW1PdmVycmlkZTphPz9udWxsLGV4aXN0aW5nTm90ZUhhbmRsZVV1aWQ6bj8udXVpZD8/bnVsbH0pO2xldCB1PWF3YWl0IEREKGUsbyxuKSxmPXUuY2FjaGVkLnRhc2tzLmZpbHRlcih4PT4hJGQoeCkpLmxlbmd0aDtpZihrKCJbZHJlYW0tdGFza10gY2FjaGVkLW5vdGUgc3RhdGUiLHtub3RlVVVJRDp1Lm5vdGVIYW5kbGU/LnV1aWQ/P251bGwsZXhpc3RpbmdDb250ZW50TGVuZ3RoOnUuZXhpc3RpbmdDb250ZW50Py5sZW5ndGg/PzAsY2FjaGVkVGFza0NvdW50OnUuY2FjaGVkLnRhc2tzLmxlbmd0aCx1bmRpc21pc3NlZENvdW50OmYsbWluaW11bVN1Z2dlc3Rpb25Db3VudDppLHdpbGxVc2VDYWNoZTpmPj1pfSksZj49aSl7bGV0IHg9YXdhaXQgX0QoZSx1LmNhY2hlZC50YXNrcyk7cmV0dXJuIE9EKHUseCl9bGV0IHY9YXdhaXQgQ0QoZSksdz1NYXRoLm1heChKVCxpLXUuY2FjaGVkLnRhc2tzLmxlbmd0aCksYj1JRCh2Lm9wZW5UYXNrcyxzKSxnPWF3YWl0IE1EKGUsYyx1LmV4aXN0aW5nQ29udGVudCksbT1URChsLGQsYyk7aWYoISEhKGcucXVhcnRlcmx5Q29udGVudHx8Zy5tb250aGx5Q29udGVudHx8Zy53ZWVrbHlDb250ZW50KSYmYi5sZW5ndGg9PT0wKXJldHVybiBrKGBbZHJlYW0tdGFza10gTm8gcGxhbm5pbmcgZGF0YSBlcnJvciBmb3IgJHttfS4gcGxhbm5pbmdDb250ZXh0IGlzICR7Z30gKGtleXMgJHtPYmplY3Qua2V5cyhnKX0pLCBjYW5kaWRhdGVUYXNrcyBsZW5ndGggJHtiLmxlbmd0aH0uIFBsYW4gbm90ZSAnJHtSZigpfScgZmluZE5vdGUgeWllbGRzICR7YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpSZigpfSl9YCkse3Rhc2tzOltdLGVycm9yOiJObyBwbGFubmluZyBkYXRhIG9yIHRhc2tzIGZvdW5kIHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zIGZyb20uIFBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIixlcnJvckNvZGU6Im5vX3BsYW5uaW5nX2RhdGEiLG5vdGVVVUlEOnUubm90ZUhhbmRsZS51dWlkfTtsZXQgaD1hd2FpdCBSRCh7YXBwOmUsY2FuZGlkYXRlVGFza3M6YixkYXRlSGVhZGluZzptLGRheU5hbWU6ZCxpc1dlZWtlbmQ6cCxub3RlVXVpZEZyb21UYXNrVXVpZDp2Lm5vdGVVdWlkRnJvbVRhc2tVdWlkLHByb3ZpZGVyRW1PdmVycmlkZTphLHBsYW5uaW5nQ29udGV4dDpnLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDp3fSk7cmV0dXJuIGguZXJyb3I/e3Rhc2tzOltdLGVycm9yOmguZXJyb3IsZXJyb3JDb2RlOmguZXJyb3JDb2RlLGVycm9yRGV0YWlsOmguZXJyb3JEZXRhaWwsbm90ZVVVSUQ6dS5ub3RlSGFuZGxlLnV1aWR9Oihhd2FpdCB6RChlLHUuZXhpc3RpbmdDb250ZW50LGguZ29hbHNTdW1tYXJ5LGgubGxtQXR0cmlidXRpb25Gb290ZXIsdS5ub3RlSGFuZGxlLGguZW5mb3JjZWRUYXNrcyksRkQodSx2LGgpKX1mdW5jdGlvbiBURChlLHQsbil7cmV0dXJuYCR7dH0gJHtufSAke2UuZ2V0RGF0ZSgpfSwgJHtlLmdldEZ1bGxZZWFyKCl9YH1hc3luYyBmdW5jdGlvbiBERChlLHQsbil7bGV0IHI9YXdhaXQgQUQoZSx0LG4pLG89YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpyLnV1aWR9KSxhPXR5cGVvZiBvPT0ic3RyaW5nIj9vLnJlcGxhY2UoL1xyXG4vZyxgCmApOiIiO3JldHVybntub3RlSGFuZGxlOnIsZXhpc3RpbmdDb250ZW50OmEsY2FjaGVkOkhEKGEpfX1hc3luYyBmdW5jdGlvbiBBRChlLHQsbil7aWYobj8udXVpZClyZXR1cm4gaygiW2RyZWFtLXRhc2tdIF9yZXNvbHZlRHJlYW1UYXNrTm90ZUhhbmRsZTogdXNpbmcgZXhpc3RpbmdOb3RlSGFuZGxlIixuLnV1aWQpLG47bGV0IHI9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W0llXX0pO2lmKHIpcmV0dXJuIGsoIltkcmVhbS10YXNrXSBfcmVzb2x2ZURyZWFtVGFza05vdGVIYW5kbGU6IGZpbmROb3RlIGxvY2F0ZWQiLHIudXVpZCwiZm9yIix0KSxyO2xldCBvPWF3YWl0IGUuY3JlYXRlTm90ZSh0LFtJZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gayhgW2RyZWFtLXRhc2tdIENyZWF0ZWQgZGFpbHkgbm90ZSAiJHt0fSIgd2l0aCB1dWlkICR7b31gKSx7dXVpZDpvfX1hc3luYyBmdW5jdGlvbiBfRChlLHQpe2xldCBuPXQuZmlsdGVyKHM9PnMudXVpZCYmISRkKHMpKS5tYXAocz0+cy51dWlkKSxyPShhd2FpdCBQcm9taXNlLmFsbChuLm1hcChzPT5lLmdldFRhc2socykuY2F0Y2goKCk9Pm51bGwpKSkpLmZpbHRlcihCb29sZWFuKSxvPVZiKHIpLGE9amIociksaT1hd2FpdCBHYihlLHIpO3JldHVybntuYXRpdmVUYXNrRnJvbVRhc2tVdWlkOm8sbm90ZU5hbWVGcm9tTm90ZVV1aWQ6aSxub3RlVXVpZEZyb21UYXNrVXVpZDphLGRlZmF1bHROb3RlVVVJRDpudWxsfX1hc3luYyBmdW5jdGlvbiBDRChlKXtsZXQgdD1hd2FpdCBXRChlKSxuPWF3YWl0IERuKGUsdCkscj1uLmZpbHRlcihsPT4hbC5jb21wbGV0ZWRBdCYmIWwuZGlzbWlzc2VkQXQpO2soYFtkcmVhbS10YXNrXSBGb3VuZCAke3IubGVuZ3RofSBvcGVuIHRhc2tzIGZyb20gJHt0P2Bkb21haW4gJHt0fWA6ImFsbCBub3RlcyAoY291bGRuJ3QgZmluZCBhIGRvbWFpblV1aWQpIn1gKTtsZXQgbz1hd2FpdCBHYihlLHIpLGE9VmIociksaT1qYihyKSxzPUJEKG4pO3JldHVybiBrKGBbZHJlYW0tdGFza10gRGVmYXVsdCBub3RlIGZvciBuZXcgdGFza3M6ICR7c31gKSx7YWxsVGFza3M6bixkZWZhdWx0Tm90ZVVVSUQ6cyxkb21haW5VdWlkOnQsbmF0aXZlVGFza0Zyb21UYXNrVXVpZDphLG5vdGVOYW1lRnJvbU5vdGVVdWlkOm8sbm90ZVV1aWRGcm9tVGFza1V1aWQ6aSxvcGVuVGFza3M6cn19YXN5bmMgZnVuY3Rpb24gR2IoZSx0KXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgbyBvZiB0KW8ubm90ZVVVSUQmJm4uYWRkKG8ubm90ZVVVSUQpO2xldCByPW5ldyBNYXA7Zm9yKGxldCBvIG9mIHQpe2lmKCFvLm5vdGVVVUlEKWNvbnRpbnVlO2xldCBhPShvLm5vdGVOYW1lfHxvLm5vdGVUaXRsZXx8IiIpLnRyaW0oKTthJiZyLnNldChvLm5vdGVVVUlELGEpfXJldHVybiBhd2FpdCBQcm9taXNlLmFsbChbLi4ubl0ubWFwKGFzeW5jIG89PntpZighci5oYXMobykpdHJ5e2xldCBhPWF3YWl0IGUuZmluZE5vdGUoe3V1aWQ6b30pO2E/Lm5hbWUmJnIuc2V0KG8sYS5uYW1lKX1jYXRjaChhKXtrKCJbZHJlYW0tdGFza10gZmluZE5vdGUoeyB1dWlkIH0pIGZhaWxlZDoiLG8sYSl9fSkpLHJ9ZnVuY3Rpb24gamIoZSl7bGV0IHQ9bmV3IE1hcDtmb3IobGV0IG4gb2YgZSluLnV1aWQmJm4ubm90ZVVVSUQmJnQuc2V0KG4udXVpZCxuLm5vdGVVVUlEKTtyZXR1cm4gdH1mdW5jdGlvbiBWYihlKXtsZXQgdD1uZXcgTWFwO2ZvcihsZXQgbiBvZiBlKW4udXVpZCYmdC5zZXQobi51dWlkLG4pO3JldHVybiB0fWZ1bmN0aW9uIE9EKGUsdCl7ayhgW2RyZWFtLXRhc2tdIFVzaW5nICR7ZS5jYWNoZWQudGFza3MubGVuZ3RofSBjYWNoZWQgZGFpbHkgc3VnZ2VzdGlvbnMgZnJvbSBub3RlYCk7bGV0e25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6bixub3RlTmFtZUZyb21Ob3RlVXVpZDpyLG5vdGVVdWlkRnJvbVRhc2tVdWlkOm99PXQ7cmV0dXJue3Rhc2tzOmUuY2FjaGVkLnRhc2tzLmZpbHRlcihpPT4hJGQoaSkpLm1hcChpPT5LYihxYihpKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpuLG5vdGVOYW1lRnJvbU5vdGVVdWlkOnIsbm90ZVV1aWRGcm9tVGFza1V1aWQ6b30pKSxnb2Fsc1N1bW1hcnk6ZS5jYWNoZWQuZ29hbHNTdW1tYXJ5LGNhY2hlZDohMCxub3RlVVVJRDplLm5vdGVIYW5kbGUudXVpZCxkZWZhdWx0Tm90ZVVVSUQ6dC5kZWZhdWx0Tm90ZVVVSUQsc2hvd25VdWlkczpbXSxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpVRChlLmV4aXN0aW5nQ29udGVudCl9fWZ1bmN0aW9uIEtiKGUse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6dCxub3RlTmFtZUZyb21Ob3RlVXVpZDpuLG5vdGVVdWlkRnJvbVRhc2tVdWlkOnJ9KXtsZXQgbz1lLnV1aWQmJnQuZ2V0KGUudXVpZCl8fG51bGwsYT1lLnV1aWQmJnIuZ2V0KGUudXVpZCl8fG51bGwsaT1lLmlzRXhpc3RpbmchPT12b2lkIDA/ZS5pc0V4aXN0aW5nOiEhZS51dWlkLHM9YSYmbiYmbi5nZXQoYSl8fG51bGw7cmV0dXJuey4uLmUsbm90ZVVVSUQ6YSxpc0V4aXN0aW5nOmksbmF0aXZlVGFzazpvLHNvdXJjZU5vdGVOYW1lOnN9fWZ1bmN0aW9uIElEKGUsdCl7bGV0IG49dCYmdC5zaXplPjA/ZS5maWx0ZXIocj0+IXQuaGFzKHIudXVpZCkpOmU7cmV0dXJuIGsoYFtkcmVhbS10YXNrXSBBZnRlciBleGNsdXNpb246ICR7bi5sZW5ndGh9IGNhbmRpZGF0ZSB0YXNrcyAoJHtlLmxlbmd0aC1uLmxlbmd0aH0gZXhjbHVkZWQpYCksbn1hc3luYyBmdW5jdGlvbiBNRChlLHQsbil7bGV0IHI9UmYoKSxhPShhd2FpdCBlLmZpbHRlck5vdGVzKHtxdWVyeTpyfSkpLmZpbmQoYz0+Yy5uYW1lPT09ciksaT1udWxsLHM9bnVsbCxsPW51bGw7aWYoYSl7bGV0IGM9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDphLnV1aWR9KTtpZihjKXtpPWMscz1NYShjLHQpO2xldCBwPWlkKGFkKCkpO2w9TWEoYyxwKX1lbHNlIGsoYFtkcmVhbS10YXNrXSBFcnJvcjogUGxhbiBub3RlICIke3J9IiBmb3VuZCBidXQgY29udGVudCBpcyBlbXB0eWApfWVsc2UgayhgW2RyZWFtLXRhc2tdIE5vIHBsYW4gbm90ZSBmb3VuZCBmb3IgIiR7cn0iYCk7bGV0IGQ9bj9uLnN1YnN0cmluZygwLFZUKTpudWxsO3JldHVybntxdWFydGVybHlDb250ZW50OmksbW9udGhseUNvbnRlbnQ6cyx3ZWVrbHlDb250ZW50OmwscHJldmlvdXNBbmFseXNlczpkfX1hc3luYyBmdW5jdGlvbiBSRChlKXtsZXR7YXBwOnQsY2FuZGlkYXRlVGFza3M6bixkYXRlSGVhZGluZzpyLGRheU5hbWU6byxpc1dlZWtlbmQ6YSxub3RlVXVpZEZyb21UYXNrVXVpZDppLHByb3ZpZGVyRW1PdmVycmlkZTpzLHBsYW5uaW5nQ29udGV4dDpsLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDpkfT1lLGM9c3x8UGUoKVtqLkxMTV9QUk9WSURFUl9NT0RFTF07aWYoISghIWMmJmMhPT0ibm9uZSIpKXtsZXQgeD1hd2FpdCB0LmZpbmROb3RlKHtuYW1lOmlyfSk7aWYoaygiW2RyZWFtLXRhc2tdIG5vIHByb3ZpZGVyIGNvbmZpZ3VyZWQgXHUyMDE0IGNoZWNraW5nIGZvciBBbXBsZSBBZ2VudCBQcm8gZmFsbGJhY2siLHthbXBsZUFnZW50Tm90ZUZvdW5kOiEheCxhbXBsZUFnZW50Tm90ZVV1aWQ6eD8udXVpZD8/bnVsbH0pLCF4KXJldHVybntlcnJvcjoiTm8gQUkgcHJvdmlkZXIgY29uZmlndXJlZC4gUGxlYXNlIHNlbGVjdCBhIHByb3ZpZGVyIGluIHRoZSBwbHVnaW4gc2V0dGluZ3MuIixlcnJvckNvZGU6Im5vX3Byb3ZpZGVyX2NvbmZpZ3VyZWQifX1sZXQgdT1ZRChuKSxmPXUubWFwKHg9PnFEKHgpKTtrKGBbZHJlYW0tdGFza10gU2VsZWN0ZWQgJHtmLmxlbmd0aH0gdG9wIHRhc2tzIGZyb20gJHtuLmxlbmd0aH0gY2FuZGlkYXRlIHRhc2tzIGZvciBMTE0gYW5hbHlzaXNgKTtsZXQgdj1RRCh7ZGF0ZUhlYWRpbmc6cixkYXlOYW1lOm8saXNXZWVrZW5kOmEsdGFza0pzb25PYmplY3RzOmYscXVhcnRlcmx5Q29udGVudDpsLnF1YXJ0ZXJseUNvbnRlbnQsbW9udGhseUNvbnRlbnQ6bC5tb250aGx5Q29udGVudCx3ZWVrbHlDb250ZW50Omwud2Vla2x5Q29udGVudCxwcmV2aW91c0FuYWx5c2VzOmwucHJldmlvdXNBbmFseXNlcyxvcGVuVGFza0NvdW50Om4ubGVuZ3RoLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDpkfSksdyxiPXBlcmZvcm1hbmNlLm5vdygpO3RyeXtrKCJbZHJlYW0tdGFza10gU2VuZGluZyBwcm9tcHQgdG8gTExNLCBsZW5ndGg6Iix2Lmxlbmd0aCk7bGV0e2FpTW9kZWw6eCxhcGlLZXk6RSxqc29uUmVzcG9uc2U6VCx0aW1lb3V0U2Vjb25kczpEfT1ZYihzKTt3PWF3YWl0IEZkKHQsdix7YWlNb2RlbDp4LGFwaUtleTpFLGpzb25SZXNwb25zZTpULHRpbWVvdXRTZWNvbmRzOkR9KSxrKCJbZHJlYW0tdGFza10gbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrIHJldHVybmVkIix7ZHVyYXRpb25NczpOdW1iZXIoKHBlcmZvcm1hbmNlLm5vdygpLWIpLnRvRml4ZWQoMSkpLHJlc3VsdFR5cGU6dz09PW51bGw/Im51bGwiOnR5cGVvZiB3LHJlc3VsdElzQXJyYXk6QXJyYXkuaXNBcnJheSh3KSxoYXNUYXNrc0ZpZWxkOiEhKHcmJnR5cGVvZiB3PT0ib2JqZWN0IiYmInRhc2tzImluIHcpLHRhc2tzTGVuZ3RoOkFycmF5LmlzQXJyYXkodz8udGFza3MpP3cudGFza3MubGVuZ3RoOm51bGwsZ29hbHNTdW1tYXJ5UHJlc2VudDohISh3JiZ0eXBlb2Ygdz09Im9iamVjdCImJncuZ29hbHNTdW1tYXJ5KX0pfWNhdGNoKHgpe2NvbnNvbGUuZXJyb3IoIltkcmVhbS10YXNrXSBMTE0gcHJvbXB0Iix2LCJjYWxsIGZhaWxlZCIseCksaygiW2RyZWFtLXRhc2tdIGxsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFjayB0aHJldyIse2R1cmF0aW9uTXM6TnVtYmVyKChwZXJmb3JtYW5jZS5ub3coKS1iKS50b0ZpeGVkKDEpKSxzdGF0dXM6eD8ucmVzcG9uc2U/LnN0YXR1cyxtZXNzYWdlOng/Lm1lc3NhZ2V9KTtsZXQgRT14LnJlc3BvbnNlPy5zdGF0dXM7cmV0dXJuIEU9PT1aVHx8RT09PWVEP3tlcnJvcjoiVGhlIEFQSSBrZXkgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC4iLGVycm9yQ29kZToiaW52YWxpZF9hcGlfa2V5In06e2Vycm9yOmBMTE0gcmVxdWVzdCBmYWlsZWQgKCR7eC5tZXNzYWdlfHwidW5rbm93biBlcnJvciJ9KS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5gLGVycm9yQ29kZToibGxtX2Vycm9yIixlcnJvckRldGFpbDp4Lm1lc3NhZ2V8fG51bGx9fWlmKCF3fHwhdy50YXNrcylyZXR1cm4gaygiW2RyZWFtLXRhc2tdIExMTSByZXR1cm5lZCBpbnZhbGlkIHJlc3BvbnNlOiIsdykse2Vycm9yOiJVbmFibGUgdG8gcHJvY2VzcyB0aGUgQUkgcHJvdmlkZXIncyByZXNwb25zZSBpbnRvIHRhc2sgc3VnZ2VzdGlvbnMuIixlcnJvckNvZGU6InBhcnNlX2Vycm9yIixlcnJvckRldGFpbDp3P0pTT04uc3RyaW5naWZ5KHcpLnN1YnN0cmluZygwLFhUKToiZW1wdHkgcmVzcG9uc2UifTtsZXQgZz1uZXcgU2V0KG4ubWFwKHg9PngudXVpZCkuZmlsdGVyKEJvb2xlYW4pKSxtPUdEKHcudGFza3MsZyxkKSx5PWpEKEtEKGksbSx1KSksaD1WRCh3LmdvYWxzU3VtbWFyeSk7cmV0dXJue2VuZm9yY2VkVGFza3M6eSxnb2Fsc1N1bW1hcnk6aCxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpMRChzKX19ZnVuY3Rpb24gWWIoZT1udWxsKXtsZXQgdD1QZSgpLG49e2pzb25SZXNwb25zZTohMCx0aW1lb3V0U2Vjb25kczpRVH0scj1lO2lmKHIpe2xldCBzPVh0W3JdfHxudWxsLGw9JHQociksZD1sPyh0Py5bbF18fCIiKS50cmltKCk6IiI7aWYocyYmZClyZXR1cm4gbi5haU1vZGVsPXMsbi5hcGlLZXk9ZCxufWxldCBvPXRbai5MTE1fUFJPVklERVJfTU9ERUxdLGE9b28obyksaT1lZChYdCk7aWYoaSluLmFpTW9kZWw9aS5tb2RlbCxuLmFwaUtleT1pLmFwaUtleSxrKGBbZHJlYW0tdGFza10gRGV2IG1vZGU6IHVzaW5nICR7aS5wcm92aWRlcn0gZGV2IHRva2VuIChtb2RlbCAke2kubW9kZWx9KWApO2Vsc2UgaWYobyYmWHRbb10pe24uYWlNb2RlbD1YdFtvXTtsZXQgcz0kdChhKTtpZihzKXtsZXQgbD0odFtzXXx8IiIpLnRyaW0oKTtsJiYobi5hcGlLZXk9bCl9aygiW2RyZWFtLXRhc2tdIF9idWlsZExsbU9wdGlvbnMgcmVzb2x2ZWQgcHJvdmlkZXI6IixvLCJcdTIxOTIgbW9kZWw6IixuLmFpTW9kZWwpfXJldHVybiBufWZ1bmN0aW9uIFJmKCl7cmV0dXJuYCR7R2koKS5sYWJlbH0gUGxhbmB9ZnVuY3Rpb24gUEQoZT1udWxsKXtsZXQgdD1ZYihlKSxuPVVkKCkscj10LmFpTW9kZWw/P251bGw7cmV0dXJuIHImJihuPW4uZmlsdGVyKG89Pm8hPT1yKSxuLnVuc2hpZnQocikpLG5bMF0/P251bGx9ZnVuY3Rpb24gTEQoZT1udWxsKXtsZXQgdD1QRChlKTtpZighdClyZXR1cm4gbnVsbDtsZXQgbj1obyh0KTtyZXR1cm5gR2VuZXJhdGVkIGJ5ICR7R2Eobil9IFx4QjcgJHt0fWB9ZnVuY3Rpb24gVUQoZSl7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtsZXQgbj1lLnJlcGxhY2UoL1xyXG4vZyxgCmApLm1hdGNoKC9cbi0tLVxzKlxuXG4+XHMqKFteXG5dKykvKTtyZXR1cm4gbj9uWzFdLnRyaW0oKTpudWxsfWFzeW5jIGZ1bmN0aW9uIHpEKGUsdCxuLHIsbyxhKXtsZXQgaT1gRHJlYW1UYXNrIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0In0pfWAscz1KRChpLG4scixhKSxsPSREKHMsdCk7dHJ5e2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KG8sbCksaygiW2RyZWFtLXRhc2tdIFByZXBlbmRlZCBnZW5lcmF0ZWQgc3VnZ2VzdGlvbnMgdG8gZGFpbHkgbm90ZSIpLGsoIltkcmVhbS10YXNrXSBQZXJzaXN0ZWQgTExNIGF0dHJpYnV0aW9uIGluIGRhaWx5IG5vdGUgKGRhdGEgc3RvcmUpOiIscj8/Iihub25lKSIpfWNhdGNoKGQpe2soIltkcmVhbS10YXNrXSBGYWlsZWQgdG8gd3JpdGUgdG8gZGFpbHkgbm90ZToiLGQpfX1mdW5jdGlvbiBGRChlLHQsbil7bGV0IHI9bi5lbmZvcmNlZFRhc2tzLmZpbHRlcihsPT5sLnV1aWQpLm1hcChsPT5sLnV1aWQpLHtuYXRpdmVUYXNrRnJvbVRhc2tVdWlkOm8sbm90ZU5hbWVGcm9tTm90ZVV1aWQ6YSxub3RlVXVpZEZyb21UYXNrVXVpZDppfT10O3JldHVybnt0YXNrczpbLi4ubi5lbmZvcmNlZFRhc2tzLC4uLmUuY2FjaGVkLnRhc2tzXS5maWx0ZXIobD0+ISRkKGwpKS5tYXAobD0+S2IocWIobCkse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6byxub3RlTmFtZUZyb21Ob3RlVXVpZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOml9KSksZ29hbHNTdW1tYXJ5Om4uZ29hbHNTdW1tYXJ5LGNhY2hlZDohMSxub3RlVVVJRDplLm5vdGVIYW5kbGUudXVpZCxkZWZhdWx0Tm90ZVVVSUQ6dC5kZWZhdWx0Tm90ZVVVSUQsc2hvd25VdWlkczpyLGxsbUF0dHJpYnV0aW9uRm9vdGVyOm4ubGxtQXR0cmlidXRpb25Gb290ZXI/P251bGx9fWZ1bmN0aW9uICRkKGUpe3JldHVybiEhKGU/LmNvbXBsZXRlZEF0fHxlPy5yZW1vdmVkQXQpfWZ1bmN0aW9uIHFiKGUpe3JldHVybiBlPy5zdWdnZXN0aW9uSWQ/ZTp7Li4uZSxzdWdnZXN0aW9uSWQ6UWIoKX19ZnVuY3Rpb24gJEQoZSx0KXtyZXR1cm4hdHx8IXQudHJpbSgpP2U6YCR7ZX0KJHt0LnRyaW0oKX0KYH1hc3luYyBmdW5jdGlvbiBXRChlKXtsZXQgdD1QZSgpW2ouVEFTS19ET01BSU5TXSxuPXQ/SlNPTi5wYXJzZSh0KTp7fTtpZihuLnNlbGVjdGVkRG9tYWluVXVpZClyZXR1cm4gbi5zZWxlY3RlZERvbWFpblV1aWQ7bGV0IHI9YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpO2lmKCFBcnJheS5pc0FycmF5KHIpfHxyLmxlbmd0aD09PTApcmV0dXJuIG51bGw7bGV0IG89ci5maW5kKGE9PmEubmFtZT09PSJXb3JrIik7cmV0dXJuIG8/by51dWlkOnJbMF0udXVpZH1mdW5jdGlvbiBCRChlKXtsZXQgdD17fTtmb3IobGV0IG8gb2YgZSlvLm5vdGVVVUlEJiYodFtvLm5vdGVVVUlEXT0odFtvLm5vdGVVVUlEXXx8MCkrMSk7bGV0IG49MCxyPW51bGw7Zm9yKGxldFtvLGFdb2YgT2JqZWN0LmVudHJpZXModCkpYT5uJiYobj1hLHI9byk7cmV0dXJuIHJ9ZnVuY3Rpb24gSEQoZSl7bGV0IHQ9W10sbj0vIyMjIFxkK1wuXHMrKC4rPylccytcKFJhdGluZzpccyooXGQrKVwvMTBcKVxuKFtcc1xTXSo/KSg/PVxuIyMjIHxcbi0tLXwkKS9nLHI7Zm9yKDsocj1uLmV4ZWMoZSkpIT09bnVsbDspe2xldCBpPXJbM10scz1pLm1hdGNoKC88IS0tIHRhc2s6KFxTKykgLS0+Lyl8fGkubWF0Y2goL1wqXFt0YXNrOihbXlxdXSspXF1cKi8pLGw9aS5tYXRjaCgvPCEtLSBzdWdnZXN0aW9uOihcUyspIC0tPi8pLGQ9LzwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4vLnRlc3QoaSksYz1pLm1hdGNoKC88IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDooW15cbl0rKSAtLT4vKSxwPWkubWF0Y2goLzwhLS0gZHJlYW0tcmVtb3ZlZC1hdDooW15cbl0rKSAtLT4vKSx1PXM/c1sxXTpudWxsLGY9bD9sWzFdOm51bGwsdj1pLnJlcGxhY2UoLzwhLS0gdGFzazpcUysgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gc3VnZ2VzdGlvbjpcUysgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6W15cbl0rIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIGRyZWFtLXJlbW92ZWQtYXQ6W15cbl0rIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC9cKlxbdGFzazpbXlxdXStcXVwqXG4/L2csIiIpLnRyaW0oKTt0LnB1c2goe3RpdGxlOnJbMV0udHJpbSgpLHJhdGluZzpwYXJzZUludChyWzJdLDEwKSx1dWlkOnUsc3VnZ2VzdGlvbklkOmYsaXNFeGlzdGluZzohIXUscHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6ZCxjb21wbGV0ZWRBdDpjP2NbMV0udHJpbSgpOm51bGwscmVtb3ZlZEF0OnA/cFsxXS50cmltKCk6bnVsbCxleHBsYW5hdGlvbjp2fSl9bGV0IG89bnVsbCxhPWUuc2VhcmNoKC8jIyMgXGQrXC4vKTtpZihhPjApe2xldCBzPWUuc3Vic3RyaW5nKDAsYSkudHJpbSgpLm1hdGNoKC9cKlwqWW91ciBnb2FscyB0aGlzIHF1YXJ0ZXJcL21vbnRoXC93ZWVrOlwqXCpccyooW1xzXFNdKikvKTtzJiYobz1zWzFdLnRyaW0oKSl9cmV0dXJue3Rhc2tzOnQsZ29hbHNTdW1tYXJ5Om99fWZ1bmN0aW9uIEdEKGUsdCxuPWFEKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmZpbHRlcihyPT5yJiZ0eXBlb2Ygci50aXRsZT09InN0cmluZyImJnIudGl0bGUudHJpbSgpLmxlbmd0aD4wKS5tYXAocj0+e2xldCBvPXIudXVpZCYmdCYmdC5oYXMoci51dWlkKT9yLnV1aWQ6bnVsbDtyZXR1cm57dGl0bGU6U3RyaW5nKHIudGl0bGUpLnRyaW0oKSxleHBsYW5hdGlvbjpTdHJpbmcoci5leHBsYW5hdGlvbnx8IiIpLnRyaW0oKSxyYXRpbmc6TWF0aC5taW4obkQsTWF0aC5tYXgodEQscGFyc2VJbnQoci5yYXRpbmcsMTApfHxyRCkpLHV1aWQ6byxpc0V4aXN0aW5nOiEhb319KS5zbGljZSgwLE1hdGgubWF4KDEsbikpOltdfWZ1bmN0aW9uIGpEKGUpe3JldHVybiBlLm1hcCh0PT4oey4uLnQsc3VnZ2VzdGlvbklkOnQuc3VnZ2VzdGlvbklkfHxRYigpfSkpfWZ1bmN0aW9uIFFiKCl7bGV0IGU9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKkVEKS50b1N0cmluZygzNikucGFkU3RhcnQoNCwiMCIpO3JldHVybmAke1NEfS0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke2V9YH1mdW5jdGlvbiBWRChlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCB0PWUudHJpbSgpO3JldHVybiB0P3Quc3Vic3RyaW5nKDAsQmIpOm51bGx9ZnVuY3Rpb24gS0QoZSx0LG4pe2xldCByPXQuZmlsdGVyKGQ9PmQuaXNFeGlzdGluZykubGVuZ3RoLG89TWF0aC5jZWlsKHQubGVuZ3RoKmlEKTtpZihyPj1vKXJldHVybiB0Lm1hcChkPT4oey4uLmQsbm90ZVVVSUQ6ZC51dWlkJiZlLmdldChkLnV1aWQpfHxudWxsfSkpO2xldCBhPW5ldyBTZXQodC5maWx0ZXIoZD0+ZC51dWlkKS5tYXAoZD0+ZC51dWlkKSksaT1uLmZpbHRlcihkPT5kLnV1aWQmJiFhLmhhcyhkLnV1aWQpKS5zbGljZSgwLG8tcikubWFwKGQ9Pih7dGl0bGU6ZC5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsZXhwbGFuYXRpb246IkhpZ2hseS1yYW5rZWQgdGFzayBmcm9tIHlvdXIgdGFzayBsaXN0IHRoYXQgYWxpZ25zIHdpdGggeW91ciBjdXJyZW50IHByaW9yaXRpZXMuIixyYXRpbmc6b0QsdXVpZDpkLnV1aWQsaXNFeGlzdGluZzohMCxub3RlVVVJRDplLmdldChkLnV1aWQpfHxudWxsfSkpLHM9Wy4uLnRdLm1hcChkPT4oey4uLmQsbm90ZVVVSUQ6ZC51dWlkJiZlLmdldChkLnV1aWQpfHxudWxsfSkpLGw9cy5tYXAoKGQsYyk9Pih7aW5kZXg6YyxyYXRpbmc6ZC5yYXRpbmcsaXNFeGlzdGluZzpkLmlzRXhpc3Rpbmd9KSkuZmlsdGVyKGQ9PiFkLmlzRXhpc3RpbmcpLnNvcnQoKGQsYyk9PmQucmF0aW5nLWMucmF0aW5nKTtmb3IobGV0IGQ9MDtkPGkubGVuZ3RoJiZkPGwubGVuZ3RoO2QrKylzW2xbZF0uaW5kZXhdPWlbZF07cmV0dXJuIHN9ZnVuY3Rpb24gWUQoZSl7bGV0IHQ9ZS5tYXAocj0+e2xldCBvPTAsYT1yLnNjb3JlPz9yLnZpY3RvcnlWYWx1ZT8/MDtpZihyLmltcG9ydGFudCYmKG8rPWxEKSxyLnVyZ2VudCYmKG8rPWREKSxhPndEP28rPWNEOmE+YkQmJihvKz11RCksci5kZWFkbGluZSl7bGV0IGk9RGF0ZS5ub3coKS8xZTMsbD0oKHIuZGVhZGxpbmU8Z3M/ci5kZWFkbGluZTpyLmRlYWRsaW5lLzFlMyktaSkvJGI7bDwwP28rPXBEOmw8PVdiP28rPWZEOmw8PWtEP28rPWhEOmw8PXhEJiYobys9Z0QpfWlmKHIuc3RhcnRBdCl7bGV0IGk9RGF0ZS5ub3coKS8xZTMscz1yLnN0YXJ0QXQ8Z3M/ci5zdGFydEF0OnIuc3RhcnRBdC8xZTM7czw9aT9vKz1tRDoocy1pKS8kYjw9V2ImJihvKz12RCl9cmV0dXJuIG8rPU1hdGgubWluKGEseUQpLHt0YXNrOnIscmFuazpvfX0pO3Quc29ydCgocixvKT0+by5yYW5rLXIucmFuayk7bGV0IG49TWF0aC5taW4oTWF0aC5jZWlsKGUubGVuZ3RoKk5EKSxqVCk7cmV0dXJuIHQuc2xpY2UoMCxNYXRoLm1heChuLHNEKSkubWFwKHI9PnIudGFzayl9ZnVuY3Rpb24gcUQoZSl7bGV0IHQ9e2NvbnRlbnQ6ZS5jb250ZW50LHV1aWQ6ZS51dWlkfTtlLmltcG9ydGFudCYmKHQuaW1wb3J0YW50PSEwKSxlLnVyZ2VudCYmKHQudXJnZW50PSEwKTtsZXQgbj1lLnNjb3JlPz9lLnZpY3RvcnlWYWx1ZTtyZXR1cm4gbiE9bnVsbCYmKHQuc2NvcmU9biksZS5kZWFkbGluZSYmKHQuZGVhZGxpbmU9ZS5kZWFkbGluZSx0LmRlYWRsaW5lRm9ybWF0dGVkPW5ldyBEYXRlKGUuZGVhZGxpbmU8Z3M/ZS5kZWFkbGluZSoxZTM6ZS5kZWFkbGluZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIseWVhcjoibnVtZXJpYyJ9KSksZS5zdGFydEF0JiYodC5zdGFydEF0PWUuc3RhcnRBdCx0LnN0YXJ0QXRGb3JtYXR0ZWQ9bmV3IERhdGUoZS5zdGFydEF0PGdzP2Uuc3RhcnRBdCoxZTM6ZS5zdGFydEF0KS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pKSxlLmhpZGVVbnRpbCYmKHQuaGlkZGVuVW50aWxGb3JtYXR0ZWQ9bmV3IERhdGUoZS5oaWRlVW50aWw8Z3M/ZS5oaWRlVW50aWwqMWUzOmUuaGlkZVVudGlsKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSkpLGUuaXNSZXBlYXRpbmcmJih0LmlzUmVwZWF0aW5nPSEwKSx0fWZ1bmN0aW9uIFFEKHtkYXRlSGVhZGluZzplLGRheU5hbWU6dCxpc1dlZWtlbmQ6bix0YXNrSnNvbk9iamVjdHM6cixxdWFydGVybHlDb250ZW50Om8sbW9udGhseUNvbnRlbnQ6YSx3ZWVrbHlDb250ZW50OmkscHJldmlvdXNBbmFseXNlczpzLG9wZW5UYXNrQ291bnQ6bCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6ZH0pe2xldCBjPWBZb3UgYXJlIGEgcHJvZHVjdGl2aXR5IGNvYWNoIGFuYWx5emluZyBhIHVzZXIncyB0YXNrIGxpc3QgYW5kIGdvYWxzIHRvIHN1Z2dlc3QgdGhlIG1vc3QgaW1wYWN0ZnVsIHRhc2tzIGZvciB0b2RheS4KClRvZGF5IGlzICR7ZX0uYDtyZXR1cm4gbj9jKz1gCkl0IGlzICR7dH0gXHUyMDE0IGEgd2Vla2VuZCBkYXkuIExlYW4gdG93YXJkIGNyZWF0aXZlLCBleHBsb3JhdG9yeSwgb3IgZW5qb3lhYmxlIHRhc2tzIHRoYXQgc3RpbGwgYWR2YW5jZSB0aGUgdXNlcidzIGdvYWxzLiBGdW4gc2lkZS1wcm9qZWN0cywgbGVhcm5pbmcsIGFuZCByZWZsZWN0aW9uIGFyZSBncmVhdCB3ZWVrZW5kIHBpY2tzLmA6Yys9YApJdCBpcyAke3R9IFx1MjAxNCBhIHdlZWtkYXkuIFByaW9yaXRpemUgaGlnaC1pbXBhY3QsIGdvYWwtYWR2YW5jaW5nIHdvcmsgdGhhdCBtb3ZlcyBpbXBvcnRhbnQgcHJvamVjdHMgZm9yd2FyZC5gLG8/Yys9YAoKIyMgVXNlcidzIFF1YXJ0ZXJseSBQbGFuCiR7by5zdWJzdHJpbmcoMCxLVCl9YDpjKz1gCgojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KTm8gcXVhcnRlcmx5IHBsYW4gZm91bmQuYCxhJiYoYys9YAoKIyMgVXNlcidzIE1vbnRobHkgRm9jdXMKJHthLnN1YnN0cmluZygwLFlUKX1gKSxpJiYoYys9YAoKIyMgVXNlcidzIFdlZWtseSBQbGFuCiR7aS5zdWJzdHJpbmcoMCxxVCl9YCkscyYmKGMrPWAKCiMjIFByZXZpb3VzIFRhc2sgU3VnZ2VzdGlvbnMgVGhpcyBNb250aCAoYXZvaWQgcmVwZWF0aW5nIHRoZXNlIHZlcmJhdGltKQoke3N9YCksYys9YAoKIyMgVG9wIENhbmRpZGF0ZSBUYXNrcyAoJHtsfSBvcGVuIHRvdGFsLCAke3IubGVuZ3RofSBoaWdoZXN0LXJhbmtlZCBzaG93biBhcyBKU09OKQpgLHIubGVuZ3RoPjA/KGMrPWBFYWNoIHRhc2sgb2JqZWN0IGZvbGxvd3MgdGhlIEFtcGxlbm90ZSB0YXNrIHR5cGUgc2NoZW1hLiBUaGUgInNjb3JlIiBmaWVsZCByZWZsZWN0cyBob3cgbG9uZyB0aGUgdGFzayBoYXMgYmVlbiBhY2N1bXVsYXRpbmcgdmFsdWUgXHUyMDE0IGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgdGFza3MgdGhhdCBoYXZlIGJlZW4gd2FpdGluZyBsb25nZXIgb3IgYXJlIG92ZXJkdWUuIFRhc2tzIG1hcmtlZCAiaW1wb3J0YW50IiBvciAidXJnZW50IiBkZXNlcnZlIHNwZWNpYWwgY29uc2lkZXJhdGlvbi4KCmAsYys9ci5tYXAocD0+SlNPTi5zdHJpbmdpZnkocCkpLmpvaW4oYApgKSk6Yys9Ik5vIG9wZW4gdGFza3MgZm91bmQuIixjKz1gCgpZb3VyIHJlc3BvbnNlIG11c3QgaW5jbHVkZSB0d28gcGFydHM6CgoxLiAqKmdvYWxzU3VtbWFyeSoqOiBBIGNvbmNpc2Ugc3VtbWFyeSBvZiB0aGUgdXNlcidzIGtub3duIGdvYWxzIGZvciB0aGlzIHF1YXJ0ZXIsIG1vbnRoLCBhbmQgd2Vlay4gV3JpdGUgYXQgbGVhc3Qgb25lIHNlbnRlbmNlIHBlciB0aW1lIGhvcml6b24gdGhhdCBoYXMgY29udGVudCBhdmFpbGFibGUgKHF1YXJ0ZXIsIG1vbnRoLCB3ZWVrKS4gTWF4aW11bSA1IHNlbnRlbmNlcyBhbmQgJHtCYn0gY2hhcmFjdGVycyB0b3RhbC4gSWYgYSB0aW1lIGhvcml6b24gaGFzIG5vIHBsYW4sIG5vdGUgdGhhdCBicmllZmx5LiBUaGlzIHN1bW1hcnkgY2FwdHVyZXMgdGhlIGVzc2VuY2Ugb2Ygd2hhdCB0aGUgdXNlciBpcyBzZWVraW5nIHRvIGFjY29tcGxpc2ggaW4gdGhlIG5lYXIgdGVybS4KCjIuICoqdGFza3MqKjogZXhhY3RseSAke2R9IHRhc2tzIHRoYXQgYXJlIGVzcGVjaWFsbHkgd2VsbC1hbGlnbmVkIHdpdGggdGhvc2UgZ29hbHMuICoqQXQgbGVhc3QgaGFsZiBvZiB0aGUgdGFza3MgTVVTVCBiZSBleGlzdGluZyB0YXNrcyBjaG9zZW4gZnJvbSB0aGUgY2FuZGlkYXRlIGxpc3QgYWJvdmUqKiBcdTIwMTQgaW5jbHVkZSB0aGVpciBleGFjdCAidXVpZCIgZnJvbSB0aGUgSlNPTiBvYmplY3RzLiBUaGUgcmVtYWluaW5nIHRhc2tzIHNob3VsZCBiZSB5b3VyIG93biBpbnZlbnRlZCBzdWdnZXN0aW9ucyBpbnNwaXJlZCBieSB0aGUgdXNlcidzIHF1YXJ0ZXJseSwgbW9udGhseSwgYW5kIHdlZWtseSBnb2FscyBhbmQgYXBwcm9wcmlhdGUgZm9yICR7dH0uIEZvciBlYWNoIHRhc2sgcHJvdmlkZToKICAgLSBBIGNsZWFyLCBhY3Rpb25hYmxlIHRhc2sgdGl0bGUgKGZvciBleGlzdGluZyB0YXNrcywgeW91IG1heSByZXBocmFzZSB0aGUgY29udGVudCBmb3IgY2xhcml0eSkKICAgLSBBIDItMyBzZW50ZW5jZSBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyB0YXNrIGRlc2VydmVzIGF0dGVudGlvbiB0b2RheSwgcmVmZXJlbmNpbmcgc3BlY2lmaWMgZ29hbHMgYW5kIHRoZSBkYXkgb2YgdGhlIHdlZWsKICAgLSBBIHJhdGluZyBmcm9tIDEtMTAgZm9yIGhvdyByZWxldmFudCBhbmQgaW1wYWN0ZnVsIHRoaXMgdGFzayBpcyByaWdodCBub3cKICAgLSAidXVpZCI6IHRoZSBleGFjdCBVVUlEIHN0cmluZyBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdCBpZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHRhc2ssIG9yIG51bGwgaWYgdGhpcyBpcyBhIG5ldyBzdWdnZXN0aW9uCgpSZXR1cm4gT05MWSB2YWxpZCBKU09OIGluIHRoaXMgZXhhY3QgZm9ybWF0IChubyBtYXJrZG93biBmZW5jZXMpOgp7ImdvYWxzU3VtbWFyeSI6IlN1bW1hcnkgb2YgcXVhcnRlci9tb250aC93ZWVrIGdvYWxzLi4uIiwidGFza3MiOlt7InRpdGxlIjoiVGFzayB0aXRsZSIsImV4cGxhbmF0aW9uIjoiV2h5IHRoaXMgdGFzayBtYXR0ZXJzIHRvZGF5Li4uIiwicmF0aW5nIjo4LCJ1dWlkIjoiZXhpc3RpbmctdGFzay11dWlkLW9yLW51bGwifV19YCxjfWZ1bmN0aW9uIEpEKGUsdCxuLHIpe2xldCBvPWAjIyAke2V9CgpgO3JldHVybiB0JiYobys9YCoqWW91ciBnb2FscyB0aGlzIHF1YXJ0ZXIvbW9udGgvd2VlazoqKgoke3R9CgpgKSxyLmZvckVhY2goKGEsaSk9PntvKz1gIyMjICR7aSsxfS4gJHthLnRpdGxlfSAoUmF0aW5nOiAke2EucmF0aW5nfS8xMCkKYCxhLnV1aWQmJihvKz1gPCEtLSB0YXNrOiR7YS51dWlkfSAtLT4KYCksYS5zdWdnZXN0aW9uSWQmJihvKz1gPCEtLSBzdWdnZXN0aW9uOiR7YS5zdWdnZXN0aW9uSWR9IC0tPgpgKSxhLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93JiYobys9YDwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4KYCksYS5jb21wbGV0ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDoke2EuY29tcGxldGVkQXR9IC0tPgpgKSxhLnJlbW92ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLXJlbW92ZWQtYXQ6JHthLnJlbW92ZWRBdH0gLS0+CmApLG8rPWAke2EuZXhwbGFuYXRpb259CgpgfSksbys9YC0tLQoKYCxuJiYobys9YD4gJHtufQoKYCksb312YXIgSmI9ImRhc2hib2FyZF9kcmVhbS10YXNrX3NlZW5fdXVpZHMiLFhEPTcsWkQ9InByZXNlcnZlVGhyb3VnaFRvbW9ycm93IixlQT0iY29tcGxldGVkQXQiLHRBPSJyZW1vdmVkQXQiLG5BPSJ0YXNrVXVpZCI7ZnVuY3Rpb24gWGIoZSx0KXtyZXR1cm4oZXx8MSkqKHR8fDEpfWZ1bmN0aW9uIFpiKGUsdCl7cmV0dXJuKGV8fDEpKih0fHwxKSsxfWZ1bmN0aW9uIG1zKCl7bGV0IGU9UGUoKVtKYl0sdD17fTtpZihlKXRyeXt0PXR5cGVvZiBlPT0ic3RyaW5nIj9KU09OLnBhcnNlKGUpOmV9Y2F0Y2h7dD17fX1sZXQgbj1uZXcgRGF0ZTtuLnNldERhdGUobi5nZXREYXRlKCktWEQpO2xldCByPXt9O2ZvcihsZXRbbyxhXW9mIE9iamVjdC5lbnRyaWVzKHQpKW5ldyBEYXRlKG8pPj1uJiYocltvXT1hKTtyZXR1cm4gcn1mdW5jdGlvbiByQShlKXtsZXQgdD1uZXcgU2V0O2ZvcihsZXQgbiBvZiBPYmplY3QudmFsdWVzKGUpKWZvcihsZXQgciBvZiBuKXQuYWRkKHIpO3JldHVybiB0fWZ1bmN0aW9uIG9BKCl7cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKX1mdW5jdGlvbiBlMCgpe3JldHVybmBEYXNoYm9hcmQgcHJvcG9zZWQgdGFza3MgZm9yICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7eWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KX1gfWFzeW5jIGZ1bmN0aW9uIHQwKGUsdCxuKXtsZXQgcj1vQSgpLG89dFtyXXx8W10sYT1BcnJheS5mcm9tKG5ldyBTZXQoWy4uLm8sLi4ubl0pKSxpPXsuLi50LFtyXTphfTtyZXR1cm4gYXdhaXQgZS5zZXRTZXR0aW5nKEpiLEpTT04uc3RyaW5naWZ5KGkpKSxpfWFzeW5jIGZ1bmN0aW9uIG4wKGUsdCxuKXtpZih0LmlzRXhpc3RpbmcmJnQudXVpZCYmdC5ub3RlVVVJRClhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dC5ub3RlVVVJRH0/aGlnaGxpZ2h0VGFza1VVSUQ9JHt0LnV1aWR9YCk7ZWxzZSBpZihuKXtsZXQgcj1hd2FpdCBlLmluc2VydFRhc2soe3V1aWQ6bn0se2NvbnRlbnQ6dC50aXRsZX0pO3ImJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtufT9oaWdobGlnaHRUYXNrVVVJRD0ke3J9YCl9fWFzeW5jIGZ1bmN0aW9uIHIwKGUsdCxuLHIpe2lmKCF0fHwhbnx8IXJ8fHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgbz1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KTtpZighb3x8dHlwZW9mIG8hPSJzdHJpbmciKXJldHVybiExO2xldCBhPW8ucmVwbGFjZSgvXHJcbi9nLGAKYCksaT1hQShhLG4scik7cmV0dXJuISghaXx8IWF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnR9LGkuc2VjdGlvbkJvZHkse3NlY3Rpb246e2hlYWRpbmc6e3RleHQ6aS5zZWN0aW9uSGVhZGluZ319fSkpfWZ1bmN0aW9uIGFBKGUsdCxuKXtsZXQgcj0vKF4jI1xzKyguKz8pXG4pKFtcc1xTXSo/KSg/PV4jI1xzKy4rP1xufCg/IVtcc1xTXSkpL2dtLG87Zm9yKDsobz1yLmV4ZWMoZSkpIT09bnVsbDspe2xldCBhPShvWzJdfHwiIikudHJpbSgpLGk9b1szXXx8IiIscz1pQShpLHQsbik7aWYocylyZXR1cm57c2VjdGlvbkJvZHk6cyxzZWN0aW9uSGVhZGluZzphfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpQShlLHQsbil7bGV0IHI9ITEsbz1lLnJlcGxhY2UoLygjIyMgXGQrXC5ccysuKz9ccytcKFJhdGluZzpccypcZCtcLzEwXClcbltcc1xTXSo/KSg/PVxuIyMjIHxcbi0tLXwkKS9nLGE9PnJ8fCFzQShhLHQpP2E6KHI9ITAsbEEoYSxuKSkpO3JldHVybiByP286bnVsbH1mdW5jdGlvbiBzQShlLHQpe3JldHVybiB0LnN1Z2dlc3Rpb25JZCYmZS5pbmNsdWRlcyhgPCEtLSBzdWdnZXN0aW9uOiR7dC5zdWdnZXN0aW9uSWR9IC0tPmApfHx0LnV1aWQmJmUuaW5jbHVkZXMoYDwhLS0gdGFzazoke3QudXVpZH0gLS0+YCk/ITA6dC50aXRsZT9uZXcgUmVnRXhwKGBeIyMjIFxcZCtcXC5cXHMrJHtkQSh0LnRpdGxlKX1cXHMrXFwoUmF0aW5nOlxccypcXGQrXFwvMTBcXCkkYCwibSIpLnRlc3QoZSk6ITF9ZnVuY3Rpb24gbEEoZSx0KXtsZXQgbj1lLnNwbGl0KGAKYCkscj1uWzBdfHwiIixvPXRbbkFdLGE9bi5zbGljZSgxKS5maWx0ZXIoZj0+ISgvXjwhLS0gZHJlYW0tKHByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3d8Y29tcGxldGVkLWF0OnxyZW1vdmVkLWF0OikvLnRlc3QoZil8fG8mJi9ePCEtLSB0YXNrOi8udGVzdChmKSkpLGk9MDtmb3IoO2k8YS5sZW5ndGgmJi9ePCEtLSAodGFzazp8c3VnZ2VzdGlvbjopLy50ZXN0KGFbaV0pOylpKz0xO2xldCBzPVtdLGw9dFtaRF0sZD10W2VBXSxjPXRbdEFdO2wmJnMucHVzaCgiPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPiIpLGQmJnMucHVzaChgPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6JHtkfSAtLT5gKSxjJiZzLnB1c2goYDwhLS0gZHJlYW0tcmVtb3ZlZC1hdDoke2N9IC0tPmApO2xldCB1PVsuLi5vP1tgPCEtLSB0YXNrOiR7b30gLS0+YF06W10sLi4uYS5zbGljZSgwLGkpLC4uLnMsLi4uYS5zbGljZShpKV07cmV0dXJuYCR7cn0KJHt1LmpvaW4oYApgKX1gfWZ1bmN0aW9uIGRBKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKX1mdW5jdGlvbiBvMChlKXtlJiZlKCl9YXN5bmMgZnVuY3Rpb24gYTAoZSx7cHJvcG9zZWRUYXNrc05vdGVOYW1lOnQsZXhjbHVkZVV1aWRzOm4sb3B0aW9uczpyLG1heFRhc2tzOm99KXtsZXQgYT1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbSWVdfSk7cmV0dXJuIEhiKGUse2V4Y2x1ZGVVdWlkczpuLG1pbmltdW1UYXNrQ291bnQ6ci5taW5pbXVtVGFza0NvdW50fHxvLHByb3ZpZGVyRW1PdmVycmlkZTpyLnByb3ZpZGVyRW1PdmVycmlkZXx8bnVsbCxub3RlTmFtZTp0LGV4aXN0aW5nTm90ZUhhbmRsZTphfSl9YXN5bmMgZnVuY3Rpb24gaTAoZSx7cHJvdmlkZXJOYW1lOnQsYXBwOm4scmVjb3JkVGFza1V1aWRzOnIsc2V0RXJyb3I6byxzZXRUYXNrczphLHNldE5vdGVVVUlEOmksc2V0RGVmYXVsdE5vdGVVVUlEOnMsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6bH0pe2lmKGU/LmVycm9yKXtsJiZsKG51bGwpLG8oe2Vycm9yOmUuZXJyb3IsZXJyb3JDb2RlOmUuZXJyb3JDb2RlLGVycm9yRGV0YWlsOmUuZXJyb3JEZXRhaWwscHJvdmlkZXJOYW1lOnR9KTtyZXR1cm59aWYoZT8udGFza3Mpe2EoZS50YXNrcyksbCYmbChlLmxsbUF0dHJpYnV0aW9uRm9vdGVyPz9udWxsKTtsZXQgZD1tcygpO2F3YWl0IHIoZS5zaG93blV1aWRzfHxbXSxkKX1lPy5ub3RlVVVJRCYmaShlLm5vdGVVVUlEKSxlPy5kZWZhdWx0Tm90ZVVVSUQmJnMoZS5kZWZhdWx0Tm90ZVVVSUQpfWZ1bmN0aW9uIHMwKHttYXhUYXNrczplLHByZXZpb3VzTWF4VGFza3M6dCx0YXNrczpufSl7cmV0dXJuIShlPD10fHwhbnx8bi5sZW5ndGg+PWUpfWZ1bmN0aW9uIFBmKGUsdCxuPXt9KXtsZXQgcj1tcygpLG89ckEocik7ZShvLHttaW5pbXVtVGFza0NvdW50OnQsLi4ubn0pfXZhciBsMD0yMixMZj02LGNBPTIwLHVBPTI0KjYwKjYwKjFlMyxwQT02MCxqYT0zMDtmdW5jdGlvbiBkMChlKXtsZXQgdD1NYXRoLmZsb29yKGUvNjApLG49ZSU2MCxyPXQ+PTEyPyJQTSI6IkFNIjtyZXR1cm5gJHt0PT09MD8xMjp0PjEyP3QtMTI6dH06JHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfSAke3J9YH1hc3luYyBmdW5jdGlvbiBmQShlKXtsZXQgdD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCk7aWYoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPT09MClyZXR1cm4oYXdhaXQgRG4oZSxudWxsKSkuZmlsdGVyKG89Pm8/LnN0YXJ0QXQmJiFvLmNvbXBsZXRlZEF0JiYhby5kaXNtaXNzZWRBdCk7bGV0IG49W107Zm9yKGxldCByIG9mIHQpaWYocj8udXVpZCl0cnl7bGV0IG89YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3Moci51dWlkKTtmb3IobGV0IGEgb2Ygb3x8W10pYT8uc3RhcnRBdCYmIWEuY29tcGxldGVkQXQmJiFhLmRpc21pc3NlZEF0JiZuLnB1c2goYSl9Y2F0Y2gobyl7aygiW0RyZWFtVGFza10gZ2V0VGFza0RvbWFpblRhc2tzIGZhaWxlZCBmb3IgZG9tYWluIixyLnV1aWQsbyl9cmV0dXJuIG59ZnVuY3Rpb24gaEEoZSx0LG4pe2xldCByPWUrdUEsbz1uZXcgU2V0LGE9KGkscyk9PntpZighKHM8PWV8fGk+PXIpKWZvcihsZXQgbD1MZio2MDtsPGwwKjYwO2wrPWphKXtsZXQgZD1lK2wqNjAqMWUzO2QramEqNjAqMWUzPmkmJmQ8cyYmby5hZGQobCl9fTtmb3IobGV0IGkgb2YgdHx8W10pe2lmKCFpfHxpLmFsbERheSljb250aW51ZTtsZXQgcz1pLnN0YXJ0IGluc3RhbmNlb2YgRGF0ZT9pLnN0YXJ0LmdldFRpbWUoKTppLnN0YXJ0P25ldyBEYXRlKGkuc3RhcnQpLmdldFRpbWUoKTpudWxsO2lmKHM9PW51bGx8fE51bWJlci5pc05hTihzKSljb250aW51ZTtsZXQgbD1pLmVuZCBpbnN0YW5jZW9mIERhdGU/aS5lbmQuZ2V0VGltZSgpOmkuZW5kP25ldyBEYXRlKGkuZW5kKS5nZXRUaW1lKCk6cytqYSo2MCoxZTM7YShzLGwpfWZvcihsZXQgaSBvZiBufHxbXSl7aWYoIWk/LnN0YXJ0QXQpY29udGludWU7bGV0IHM9aS5zdGFydEF0KjFlMzthKHMscytqYSo2MCoxZTMpfXJldHVybiBvfWZ1bmN0aW9uIGMwKGUsdCxuKXtsZXQgcj1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpLG89bmV3IERhdGUoci5nZXRGdWxsWWVhcigpLHIuZ2V0TW9udGgoKSxyLmdldERhdGUoKSwwLDAsMCkuZ2V0VGltZSgpLGE9bmV3IERhdGUsaT1uZXcgRGF0ZShhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpLDAsMCwwKS5nZXRUaW1lKCkscz1vPT09aT9hLmdldEhvdXJzKCkqNjArYS5nZXRNaW51dGVzKCk6LTEsbD1oQShvLHQsbiksZD1bXTtmb3IobGV0IGM9TGYqNjA7YzxsMCo2MDtjKz1qYSljPD1zfHxsLmhhcyhjKXx8ZC5wdXNoKHtsYWJlbDpkMChjKSx2YWx1ZTpjfSk7cmV0dXJuIGR9ZnVuY3Rpb24gdTAoKXtsZXQgZT1bXTtmb3IobGV0IHQ9TGYqNjA7dDw9Y0EqNjA7dCs9amEpZS5wdXNoKHtsYWJlbDpkMCh0KSx2YWx1ZTp0fSk7cmV0dXJuIGV9YXN5bmMgZnVuY3Rpb24gcDAoZSl7bGV0W3Qsbl09YXdhaXQgUHJvbWlzZS5hbGwoW2UuZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyh7ZGF5czozMH0pLmNhdGNoKCgpPT5bXSksZkEoZSldKTtyZXR1cm57ZXZlbnRzOkFycmF5LmlzQXJyYXkodCk/dDpbXSx0YXNrczpufX1hc3luYyBmdW5jdGlvbiBmMChlLHQsbixyKXtsZXQgbz1OdW1iZXIobik7aWYoIU51bWJlci5pc0Zpbml0ZShvKSlyZXR1cm57cmVhc29uOiJpbnZhbGlkX3N0YXJ0X2F0In07aWYoci5pc0V4aXN0aW5nJiZyLnV1aWQpcmV0dXJuIGF3YWl0IGUudXBkYXRlVGFzayhyLnV1aWQse3N0YXJ0QXQ6TWF0aC5mbG9vcihvKX0pP3tub3RlVVVJRDpyLm5vdGVVVUlEfHxudWxsLHN0YXJ0QXQ6TWF0aC5mbG9vcihvKSx0YXNrVXVpZDpyLnV1aWR9OntyZWFzb246InVwZGF0ZV9mYWlsZWQiLHRhc2tVdWlkOnIudXVpZH07bGV0IGE9ci5ub3RlVVVJRHx8dDtpZighYSlyZXR1cm57cmVhc29uOiJtaXNzaW5nX25vdGUifTtsZXQgaT1hd2FpdCBlLmluc2VydFRhc2soe3V1aWQ6YX0se2NvbnRlbnQ6ci50aXRsZSxzdGFydEF0Ok1hdGguZmxvb3Iobyl9KTtyZXR1cm4gaT97bm90ZVVVSUQ6YSxzdGFydEF0Ok1hdGguZmxvb3IobyksdGFza1V1aWQ6aX06e3JlYXNvbjoiaW5zZXJ0X2ZhaWxlZCJ9fWZ1bmN0aW9uIFVmKGUsdCl7bGV0IG49ZHQoZSx7dGhyb3dPbkludmFsaWQ6ITF9KTtpZighbilyZXR1cm4gbnVsbDtsZXQgcj1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLDAsMCwwKSxvPU51bWJlcih0KTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKG8pP01hdGguZmxvb3Ioci5nZXRUaW1lKCkvMWUzKStvKnBBOm51bGx9dmFyIHZzPVt7ZGVzY3JpcHRpb246IkNsYXVkZSBcdTIwMTQgbnVhbmNlZCByZWFzb25pbmcsIGNhcmVmdWwgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nLCBhbmQgc3Ryb25nIHdyaXRpbmcuIixsYWJlbDoiQW50aHJvcGljIixwcm92aWRlckVtOiJhbnRocm9waWMifSx7ZGVzY3JpcHRpb246IkdQVCBcdTIwMTQgd2VsbC1yb3VuZGVkIGdlbmVyYWwgcGVyZm9ybWFuY2Ugd2l0aCB0aGUgYnJvYWRlc3QgdG9vbGluZyBlY29zeXN0ZW0uIixsYWJlbDoiT3BlbkFJIixwcm92aWRlckVtOiJvcGVuYWkifSx7ZGVzY3JpcHRpb246IkdlbWluaSBcdTIwMTQgdmVyeSBsYXJnZSBjb250ZXh0IHdpbmRvd3MgYW5kIHN0cm9uZyBsb25nLWRvY3VtZW50IC8gbXVsdGltb2RhbCBoYW5kbGluZy4iLGxhYmVsOiJHb29nbGUiLHByb3ZpZGVyRW06ImdlbWluaSJ9LHtkZXNjcmlwdGlvbjoiRGVlcFNlZWsgXHUyMDE0IGNvc3QtZWZmaWNpZW50LCB3aXRoIHN0cm9uZyBjb2RpbmcgYW5kIG1hdGggcmVhc29uaW5nLiIsbGFiZWw6IkRlZXBTZWVrIixwcm92aWRlckVtOiJkZWVwc2VlayJ9XSxnQT12c1swXS5wcm92aWRlckVtO2Z1bmN0aW9uIG1BKGUpe3JldHVybiB2cy5maW5kKHQ9PnQucHJvdmlkZXJFbT09PWUpfWZ1bmN0aW9uIGgwKGUpe3JldHVybiBtQShlKT9lOmdBfWZ1bmN0aW9uIGcwKHthbGxvd0tleWxlc3M6ZT0hMSxjb25maWd1cmVkUHJvdmlkZXJFbXM6dD1bXSxjdXJyZW50UHJvdmlkZXJFbTpuPW51bGx9PXt9KXtpZihlKXJldHVybiB2cztsZXQgcj1uZXcgU2V0KHQpLG89dnMuZmlsdGVyKGE9PnIuaGFzKGEucHJvdmlkZXJFbSl8fGEucHJvdmlkZXJFbT09PW4pO3JldHVybiBvLmxlbmd0aD4wP286dnN9dmFyIG0wPVUoeWUoKSksdjA9VSh3cCgpKTt2YXIgSXI9VShlZSgpKTtmdW5jdGlvbiB5cyh7YWxsb3dLZXlsZXNzUHJvdmlkZXJzOmU9ITEsY29uZmlndXJlZFByb3ZpZGVyRW1zOnQ9W10sY3VycmVudFByb3ZpZGVyRW06bixvbkNhbmNlbDpyLG9uU2VsZWN0Om8sc3VibWl0TGFiZWw6YT0iU3VibWl0Iix0aXRsZTppPSJHZW5lcmF0ZSB3aXRoIHdoaWNoIEFJIHByb3ZpZGVyPyJ9KXtsZXQgcz1nMCh7YWxsb3dLZXlsZXNzOmUsY29uZmlndXJlZFByb3ZpZGVyRW1zOnQsY3VycmVudFByb3ZpZGVyRW06bn0pLFtsLGRdPSgwLG0wLnVzZVN0YXRlKSgoKT0+e2xldCBwPWgwKG4pO3JldHVybiBzLnNvbWUodT0+dS5wcm92aWRlckVtPT09cCk/cDpzWzBdLnByb3ZpZGVyRW19KSxjPSgwLElyLmpzeCkoT3Ise3RpdGxlOmksc3VibWl0TGFiZWw6YSxvbkNhbmNlbDpyLG9uU3VibWl0OigpPT5vKGwpLGNoaWxkcmVuOigwLElyLmpzeCkoImRpdiIse2NsYXNzTmFtZToibGxtLXByb3ZpZGVyLW9wdGlvbnMiLGNoaWxkcmVuOnMubWFwKHA9PigwLElyLmpzeHMpKCJsYWJlbCIse2NsYXNzTmFtZToibGxtLXByb3ZpZGVyLW9wdGlvbiIsY2hpbGRyZW46WygwLElyLmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6ImxsbS1wcm92aWRlciIsdmFsdWU6cC5wcm92aWRlckVtLGNoZWNrZWQ6bD09PXAucHJvdmlkZXJFbSxvbkNoYW5nZTooKT0+ZChwLnByb3ZpZGVyRW0pfSksKDAsSXIuanN4cykoInNwYW4iLHtjbGFzc05hbWU6ImxsbS1wcm92aWRlci1vcHRpb24tdGV4dCIsY2hpbGRyZW46WygwLElyLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImxsbS1wcm92aWRlci1vcHRpb24tbmFtZSIsY2hpbGRyZW46cC5sYWJlbH0pLCgwLElyLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImxsbS1wcm92aWRlci1vcHRpb24tZGVzYyIsY2hpbGRyZW46cC5kZXNjcmlwdGlvbn0pXX0pXX0scC5wcm92aWRlckVtKSl9KX0pO3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5ib2R5PygwLHYwLmNyZWF0ZVBvcnRhbCkoYyxkb2N1bWVudC5ib2R5KTpjfXZhciBOdD1VKGVlKCkpLHkwPSJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL3BsdWdpbnMvYW1wbGVfYWdlbnRfcHJvIix2QT0iVW5sb2NrIDIxIEFJIGZlYXR1cmVzIFx1MjAxNCBubyBBUEkga2V5IG5lZWRlZCIseUE9IkFtcGxlbm90ZSBwcm92aWRlcyBmcmVlIGFjY2VzcyB0byBmcm9udGllciBtb2RlbHMgZm9yIHdyaXRpbmcsIHRhc2sgbWFuYWdlbWVudCwgcmVzZWFyY2gsIGFuZCBtb3JlLiI7ZnVuY3Rpb24gd3Moe2FwcDplLGZlYXR1cmVzOnQ9W10saGVhZGxpbmU6bj12QSxpY29uOnIsbW9yZUZlYXR1cmVzTGFiZWw6bz1udWxsLHN1YmhlYWQ6YT15QSx0aXRsZTppLHdpZGdldElkOnN9KXtyZXR1cm4oMCxOdC5qc3gpKGllLHt0aXRsZTppLGljb246cix3aWRnZXRJZDpzLGNoaWxkcmVuOigwLE50LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwiLGNoaWxkcmVuOlsoMCxOdC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWJhZGdlcyIsY2hpbGRyZW46WygwLE50LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtYmFkZ2Ugbm8tY29uZmlnLXVwc2VsbC1iYWRnZS0tYnJhbmQiLGNoaWxkcmVuOiJBbXBsZSBBZ2VudCBQcm8ifSksKDAsTnQuanN4KSgic3BhbiIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1iYWRnZSBuby1jb25maWctdXBzZWxsLWJhZGdlLS1wcmljZSIsY2hpbGRyZW46IkVhcmx5IEFkb3B0ZXJzICQ4L21vIFNwZWNpYWwifSldfSksKDAsTnQuanN4KSgiaDMiLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtaGVhZGxpbmUiLGNoaWxkcmVuOm59KSwoMCxOdC5qc3gpKCJwIix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLXN1YmhlYWQiLGNoaWxkcmVuOmF9KSwoMCxOdC5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtZmVhdHVyZXMiLGNoaWxkcmVuOnQubWFwKGw9PigwLE50LmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWZlYXR1cmUiLGNoaWxkcmVuOlsoMCxOdC5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWZlYXR1cmUtaWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46bC5pY29ufSksbC5sYWJlbF19LGwubGFiZWwpKX0pLG8/KDAsTnQuanN4KSgicCIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1tb3JlIixjaGlsZHJlbjpvfSk6bnVsbCwoMCxOdC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxOdC5qc3gpKCJhIix7aHJlZjoiIzAiLG9uQ2xpY2s6KCk9PmUubmF2aWdhdGUoeTApLGNsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1idXR0b24gbm8tY29uZmlnLXVwc2VsbC1idXR0b24tLXByaW1hcnkiLGNoaWxkcmVuOiJcdTI2QTEgU3RhcnQgZm9yICQ4L21vbnRoIn0pLCgwLE50LmpzeCkoImEiLHtocmVmOiIjMCIsb25DbGljazooKT0+ZS5uYXZpZ2F0ZSh5MCksY2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWJ1dHRvbiBuby1jb25maWctdXBzZWxsLWJ1dHRvbi0tc2Vjb25kYXJ5IixjaGlsZHJlbjoiU2VlIGFsbCBmZWF0dXJlcyBcdTIxOTIifSldfSksKDAsTnQuanN4KSgicCIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1mb290bm90ZSIsY2hpbGRyZW46Ilx1MjcxMyBObyBBUEkga2V5IHJlcXVpcmVkIGZvciBjb3JlIGZlYXR1cmVzIn0pXX0pfSl9dmFyIGtlPVUoeWUoKSk7dmFyIHcwPVUoeWUoKSk7dmFyIFZhPSJkYXNoYm9hcmQ6dGFza3MtdXBkYXRlZCI7ZnVuY3Rpb24gd0EoZSx0KXtsZXQgbj1PYmplY3QudmFsdWVzKGV8fHt9KS5mbGF0KCk7aWYoIXQ/LnRhc2tVdWlkKXJldHVybiBuO2xldCByPXtjb250ZW50OnQuY29udGVudHx8IlVudGl0bGVkIHRhc2siLG5vdGVVVUlEOnQubm90ZVVVSUR8fG51bGwsc3RhcnRBdDp0LnN0YXJ0QXQsdXVpZDp0LnRhc2tVdWlkfTtyZXR1cm5bLi4ubi5maWx0ZXIobz0+by51dWlkIT09ci51dWlkKSxyXX1mdW5jdGlvbiB6Zih7YWN0aXZlVGFza0RvbWFpbjplLGFwcDp0LG9uRG9tYWluQ2hhbmdlOm4sb3BlblRhc2tzOnJ9KXsoMCx3MC51c2VFZmZlY3QpKCgpPT57bGV0IG89YXN5bmMgYT0+e24obnVsbCxlLHt0YXNrczp3QShyLGEuZGV0YWlsKX0pO3RyeXtsZXQgaT1hd2FpdCBEbih0LGUpO0FycmF5LmlzQXJyYXkoaSkmJm4obnVsbCxlLHt0YXNrczppfSl9Y2F0Y2goaSl7aygiW2Rhc2hib2FyZF0gZmFpbGVkIHRvIHJlZnJlc2ggdGFzayBkb21haW4gdGFza3MgYWZ0ZXIgdXBkYXRlIixpKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihWYSxvKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoVmEsbyl9LFtlLHQsbixyXSl9dmFyIGIwPSJkYWlseS1qb3RzIjtmdW5jdGlvbiBiQShlLHQpe3JldHVybmAKLSBbeF0gJHtTdHJpbmcodD8udGl0bGV8fHQ/LmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIikucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCl9IDwhLS0gJHtKU09OLnN0cmluZ2lmeSh7Y29tcGxldGVkQXQ6ZX0pfSAtLT4KYH1hc3luYyBmdW5jdGlvbiBrMChlKXtsZXQgdD14QSgpLG49YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W2IwXX0pO3JldHVybiBuPy51dWlkP24udXVpZDplLmNyZWF0ZU5vdGUodCxbYjBdKX1hc3luYyBmdW5jdGlvbiB4MChlLHQsbil7aWYoIW4pcmV0dXJuITE7bGV0IHI9TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyk7aWYobi51dWlkKWF3YWl0IGUudXBkYXRlVGFzayhuLnV1aWQse2NvbXBsZXRlZEF0OnJ9KTtlbHNlIGlmKHQpYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDp0fSxiQShyLG4pLHthdEVuZDohMH0pO2Vsc2UgcmV0dXJuITE7cmV0dXJuIHJ9ZnVuY3Rpb24ga0EoZSl7bGV0IHQ9ZSUxMDA7aWYodD49MTEmJnQ8PTEzKXJldHVybiJ0aCI7c3dpdGNoKGUlMTApe2Nhc2UgMTpyZXR1cm4ic3QiO2Nhc2UgMjpyZXR1cm4ibmQiO2Nhc2UgMzpyZXR1cm4icmQiO2RlZmF1bHQ6cmV0dXJuInRoIn19ZnVuY3Rpb24geEEoKXtsZXQgZT1uZXcgRGF0ZSx0PWUudG9Mb2NhbGVTdHJpbmcoW10se21vbnRoOiJsb25nIn0pLG49ZS5nZXREYXRlKCkscj1lLmdldEZ1bGxZZWFyKCk7cmV0dXJuYCR7dH0gJHtufSR7a0Eobil9LCAke3J9YH12YXIgSj1VKGVlKCkpLFNBPTIzMCxZbj0iZHJlYW0tdGFzayIsRUE9MjgwLE5BPW5ldyBTZXQoWyJsbG1fZXJyb3IiLCJub19wcm92aWRlcl9jb25maWd1cmVkIiwicGFyc2VfZXJyb3IiLCJpbnZhbGlkX2FwaV9rZXkiXSk7ZnVuY3Rpb24gVEEoZSx0LG4scil7bGV0IG89ZT8uc2V0dGluZ3N8fHt9LGE9b1tqLkxMTV9QUk9WSURFUl9NT0RFTF0/P251bGwsaT10PyR0KHQpOm51bGwscz1jPT57bGV0IHA9Yz9vW2NdOm51bGw7cmV0dXJuIHR5cGVvZiBwPT0ic3RyaW5nIj9wLnRyaW0oKS5sZW5ndGg6MH0sbD17YW50aHJvcGljOnMoai5MTE1fQVBJX0tFWV9BTlRIUk9QSUMpLGdlbWluaTpzKGouTExNX0FQSV9LRVlfR0VNSU5JKSxncm9rOnMoai5MTE1fQVBJX0tFWV9HUk9LKSxvcGVuYWk6cyhqLkxMTV9BUElfS0VZX09QRU5BSSl9LGQ9T2JqZWN0LmVudHJpZXMobCkuZmlsdGVyKChbLGNdKT0+Yz4wKS5tYXAoKFtjXSk9PmMpO3JldHVybntwcm9wUHJvdmlkZXJFbTp0Pz9udWxsLHByb3BQcm92aWRlckFwaUtleUxlbmd0aDp0eXBlb2Ygbj09InN0cmluZyI/bi50cmltKCkubGVuZ3RoOjAsaGFzRGV2VG9rZW46ISFyLHNldHRpbmdzTGxtUHJvdmlkZXI6YSxwcm9wUHJvdmlkZXJTZXR0aW5nS2V5Omksc2V0dGluZ3NLZXlMZW5ndGhGb3JQcm9wOnMoaSksYXBpS2V5TGVuZ3RoQnlQcm92aWRlcjpsLGNvbmZpZ3VyZWRQcm92aWRlckJ1Y2tldHM6ZCxoYXNDYWxsUGx1Z2luOnR5cGVvZiBlPy5jYWxsUGx1Z2luPT0iZnVuY3Rpb24ifX1mdW5jdGlvbiBEQShlLHQpe3JldHVyblsuLi5lXS5zb3J0KChyLG8pPT5vLnJhdGluZy1yLnJhdGluZykuc2xpY2UoMCx0KX1mdW5jdGlvbiBBQShlKXtyZXR1cm4gZT49OD8iaGlnaCI6ZT49NT8ibWVkaXVtIjoibG93In1mdW5jdGlvbiBnbyhlKXtyZXR1cm4gZT8uc3VnZ2VzdGlvbklkfHxlPy51dWlkfHxgJHtlPy50aXRsZXx8InVudGl0bGVkIn06OiR7ZT8ucmF0aW5nfHwwfTo6JHtlPy5leHBsYW5hdGlvbnx8IiJ9YH1hc3luYyBmdW5jdGlvbiBfQShlLHQsbil7bGV0IHI9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSwwLDAsMCksbz1NYXRoLmZsb29yKHIuZ2V0VGltZSgpLzFlMyk7aWYobi5sZW5ndGg+MCl7bGV0IGE9YXdhaXQgZS5wcm9tcHQoIlBpY2sgd2hlbiB0byBzY2hlZHVsZSB0aGlzIHRhc2suIE9ubHkgZnJlZSB0aW1lcyBzdGlsbCBhaGVhZCB0b2RheSBhcmUgbGlzdGVkIFx1MjAxNCB1c2UgdGhlIGJ1dHRvbiBiZWxvdyB0byBjaG9vc2UgYSBmdXR1cmUgZGF0ZSBpbnN0ZWFkLiIse2lucHV0czpbe2xhYmVsOiJEYXRlIix0eXBlOiJzdHJpbmciLHZhbHVlOiJUb2RheSJ9LHtsYWJlbDoiVGltZSIsb3B0aW9uczpuLHR5cGU6InNlbGVjdCIsdmFsdWU6blswXS52YWx1ZX1dLGFjdGlvbnM6W3tpY29uOiJldmVudCIsbGFiZWw6IlNjaGVkdWxlIGZvciBhIGZ1dHVyZSBkYXRlIix2YWx1ZToiZnV0dXJlIn1dfSk7aWYoIWEpcmV0dXJuIG51bGw7aWYoYVthLmxlbmd0aC0xXSE9PSJmdXR1cmUiKXtsZXQgaT1VZihvLGFbMV0pO3JldHVybiBpPT1udWxsJiYoaygiW0RyZWFtVGFza10gU2NoZWR1bGU6IGludmFsaWQgdG9kYXkgdGltZSByZXR1cm5lZCBieSBwcm9tcHQiLHt0b2RheVJlc3VsdDphfSksYXdhaXQgZS5hbGVydCgiQ291bGQgbm90IHNjaGVkdWxlOiB0aGUgc2VsZWN0ZWQgdGltZSB3YXMgaW52YWxpZC4iKSksaX19cmV0dXJuIENBKGUscil9YXN5bmMgZnVuY3Rpb24gQ0EoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKzEsMCwwLDApLHI9dTAoKSxvPWF3YWl0IGUucHJvbXB0KCJQaWNrIGEgZnV0dXJlIGRhdGUgYW5kIHRpbWUgdG8gc2NoZWR1bGUgdGhpcyB0YXNrLiIse2lucHV0czpbe2xhYmVsOiJEYXRlIix0eXBlOiJkYXRlIix2YWx1ZTpNYXRoLmZsb29yKG4uZ2V0VGltZSgpLzFlMyl9LHtsYWJlbDoiVGltZSIsb3B0aW9uczpyLHR5cGU6InNlbGVjdCIsdmFsdWU6clswXS52YWx1ZX1dfSk7aWYoIW8pcmV0dXJuIG51bGw7bGV0W2EsaV09bztpZihhPT1udWxsfHxpPT1udWxsKXJldHVybiBudWxsO2xldCBzPVVmKGEsaSk7cmV0dXJuIHM9PW51bGwmJihrKCJbRHJlYW1UYXNrXSBTY2hlZHVsZTogaW52YWxpZCBmdXR1cmUgZGF0ZS90aW1lIHJldHVybmVkIGJ5IHByb21wdCIse2RhdGVTZWM6YSx0aW1lTWludXRlczppfSksYXdhaXQgZS5hbGVydCgiQ291bGQgbm90IHNjaGVkdWxlOiB0aGUgc2VsZWN0ZWQgZGF0ZSBvciB0aW1lIHdhcyBpbnZhbGlkLiIpKSxzfWZ1bmN0aW9uIGJzKCl7cmV0dXJuIGd5KFluKS5pY29ufWZ1bmN0aW9uIE9BKHtpc0NsaWNrYWJsZTplLHRhc2s6dH0pe3JldHVybiB0LmlzRXhpc3RpbmcmJnQuc291cmNlTm90ZU5hbWU/KDAsSi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXNvdXJjZS1ub3RlLWJhZGdlIix0aXRsZTp0LnNvdXJjZU5vdGVOYW1lP2BUYXNrIGluIG5vdGU6ICR7dC5zb3VyY2VOb3RlTmFtZX1gOiJPcGVuIHRoaXMgdGFzayIsY2hpbGRyZW46dC5zb3VyY2VOb3RlTmFtZX0pOiF0LmlzRXhpc3RpbmcmJmU/KDAsSi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5ldy1iYWRnZSIsdGl0bGU6Ik5ldyB0YXNrIFx1MjAxNCBjbGljayB0byBjcmVhdGUiLGNoaWxkcmVuOiIrbmV3In0pOm51bGx9ZnVuY3Rpb24gUzAoe25vdGVVVUlEOmUsb25PcGVuTm90ZTp0fSl7cmV0dXJuIGU/KDAsSi5qc3gpKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsb25DbGljazp0LHRpdGxlOiJPcGVuIHRvZGF5J3MgcHJvcG9zZWQgdGFza3Mgbm90ZSIsY2hpbGRyZW46Ilx1ezFGNUQyfVx1RkUwRiBOb3RlIn0pOm51bGx9ZnVuY3Rpb24gSUEoe29uUmVzZWVkOmV9KXtyZXR1cm4oMCxKLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOmUsdGl0bGU6IkdldCBuZXcgdGFzayBzdWdnZXN0aW9ucyAoZXhjbHVkZXMgdGFza3Mgc2hvd24gdG9kYXkpIixjaGlsZHJlbjoiXHV7MUY1MDR9IFJlc2VlZCJ9KX1mdW5jdGlvbiBNQSgpe3JldHVybigwLEouanN4KShpZSx7dGl0bGU6bGUoWW4pLGljb246YnMoKSx3aWRnZXRJZDpZbixjaGlsZHJlbjooMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbG9hZGluZyIsY2hpbGRyZW46WygwLEouanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXNwaW5uZXIifSksKDAsSi5qc3gpKCJwIix7Y2hpbGRyZW46IkFuYWx5emluZyB0aGUgZmluZXN0IHRhc2tzIFx1MjAyNiJ9KV19KX0pfXZhciBSQT1be2ljb246Ilx1ezFGM0FGfSIsbGFiZWw6IkhpZ2hsaWdodCBnb2FsLW1hdGNoZWQgdGFza3MifSx7aWNvbjoiXHUyNjk2XHVGRTBGIixsYWJlbDoiU29ydCB0YXNrcyAoZnVuLCBmYXN0LCBldGMpIn0se2ljb246Ilx1ezFGNTc1fSIsbGFiZWw6IkRlZXAgbm90ZSBzZWFyY2gifSx7aWNvbjoiXHV7MUY0QUF9IixsYWJlbDoiVGFzayBjb21wbGV0aW9uIGFnZW50In0se2ljb246Ilx1ezFGNTJDfSIsbGFiZWw6Ik11bHRpLWFnZW50IGRlZXAgcmVzZWFyY2gifSx7aWNvbjoiXHUyNzBGXHVGRTBGIixsYWJlbDoiRmluaXNoIGEgbm90ZSBpbiBwcm9ncmVzcyJ9XTtmdW5jdGlvbiBQQSh7ZXJyb3JJbmZvOmUsbm90ZUxpbms6dCxvblJldHJ5Om4sb25TZXR0aW5nc0NsaWNrOnJ9KXtsZXR7ZXJyb3I6byxlcnJvckNvZGU6YSxlcnJvckRldGFpbDppLHByb3ZpZGVyTmFtZTpzfT1lLGw7c3dpdGNoKGEpe2Nhc2UiaW52YWxpZF9hcGlfa2V5IjpsPSgwLEouanN4cykoSi5GcmFnbWVudCx7Y2hpbGRyZW46WygwLEouanN4KSgicCIse2NoaWxkcmVuOmBUaGUgQVBJIGtleSBmb3IgJHtzfHwieW91ciBBSSBwcm92aWRlciJ9IGFwcGVhcnMgdG8gYmUgaW52YWxpZCBvciB1bmF1dGhvcml6ZWQuYH0pLCgwLEouanN4cykoInAiLHtjaGlsZHJlbjpbIlBsZWFzZSBjaGVjayB5b3VyIEFQSSBrZXkgaW4gIiwoMCxKLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stc2V0dGluZ3MtbGluayIsb25DbGljazpyLGNoaWxkcmVuOiJBSSBzZXR0aW5ncyJ9KSwiLiJdfSldfSk7YnJlYWs7Y2FzZSJub19wbGFubmluZ19kYXRhIjpsPSgwLEouanN4cykoSi5GcmFnbWVudCx7Y2hpbGRyZW46WygwLEouanN4KSgicCIse2NoaWxkcmVuOiJEcmVhbVRhc2sgbmVlZHMgcGxhbm5pbmcgY29udGV4dCB0byBnZW5lcmF0ZSBzdWdnZXN0aW9ucy4ifSksKDAsSi5qc3gpKCJwIix7Y2hpbGRyZW46IlBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIn0pXX0pO2JyZWFrO2Nhc2UicGFyc2VfZXJyb3IiOmw9KDAsSi5qc3hzKShKLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsSi5qc3gpKCJwIix7Y2hpbGRyZW46IlVuYWJsZSB0byBzdWNjZXNzZnVsbHkgcHJvY2VzcyB0aGUgQUkgcHJvdmlkZXIncyByZXNwb25zZS4ifSksKDAsSi5qc3hzKSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lcnJvci1kZXRhaWwiLGNoaWxkcmVuOlsiSWYgdGhpcyBwZXJzaXN0cywgcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBhbXBsZW5vdGUuY29tIixpP2Agd2l0aCB0aGlzIGRldGFpbDogJHtpfWA6IiJdfSldfSk7YnJlYWs7ZGVmYXVsdDpsPSgwLEouanN4KSgicCIse2NoaWxkcmVuOm98fCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiJ9KX1yZXR1cm4oMCxKLmpzeCkoaWUse3RpdGxlOmxlKFluKSxpY29uOmJzKCksd2lkZ2V0SWQ6WW4saGVhZGVyQWN0aW9uczp0LGNoaWxkcmVuOigwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lcnJvciIsY2hpbGRyZW46W2wsKDAsSi5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stcmV0cnkiLG9uQ2xpY2s6bixjaGlsZHJlbjoiUmV0cnkifSldfSl9KX1mdW5jdGlvbiBMQSh7bm90ZUxpbms6ZSxvblJldHJ5OnR9KXtyZXR1cm4oMCxKLmpzeCkoaWUse3RpdGxlOmxlKFluKSxpY29uOmJzKCksd2lkZ2V0SWQ6WW4saGVhZGVyQWN0aW9uczplLGNoaWxkcmVuOigwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lbXB0eSIsY2hpbGRyZW46WygwLEouanN4KSgicCIse2NoaWxkcmVuOiJObyB0YXNrIHN1Z2dlc3Rpb25zIGF2YWlsYWJsZS4ifSksKDAsSi5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stcmV0cnkiLG9uQ2xpY2s6dCxjaGlsZHJlbjoiUmVmcmVzaCJ9KV19KX0pfWZ1bmN0aW9uIFVBKHtkcmVhbVRhc2tzOmUsbWF4VGFza3M6dCxoZWFkZXJBY3Rpb25zOm4sb25UYXNrQ2xpY2s6cixsaXN0UmVmOm8sbGxtQXR0cmlidXRpb25Gb290ZXI6YSxhY3Rpb25IYW5kbGVyczppfSl7bGV0IHM9cGVyZm9ybWFuY2Uubm93KCksbD1EQShlLHQpO2soYFtEcmVhbVRhc2tdIF9zZWxlY3REaXNwbGF5VGFza3M6ICR7KHBlcmZvcm1hbmNlLm5vdygpLXMpLnRvRml4ZWQoMSl9bXMgKCR7ZS5sZW5ndGh9IFx1MjE5MiAke2wubGVuZ3RofSB0YXNrcylgKTtsZXR7ZGlzbWlzc2luZ1Rhc2tLZXlzOmQsZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6YyxvbkNvbXBsZXRlOnAsb25QcmVzZXJ2ZTp1LG9uUmVtb3ZlOmYsb25TY2hlZHVsZTp2LG9uVG9nZ2xlRXhwbGFuYXRpb246d309aTtyZXR1cm4oMCxKLmpzeCkoaWUse2hlYWRlckFjdGlvbnM6bixzdWJ0aXRsZToiV2hhdCBpZiB5b3UgZGlkIGl0IHRvZGF5PyIsdGl0bGU6bGUoWW4pLGljb246YnMoKSx3aWRnZXRJZDpZbixjaGlsZHJlbjooMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbGlzdCIscmVmOm8sY2hpbGRyZW46W2wubWFwKChiLGcpPT57bGV0IG09ISFyLGg9KGIubmF0aXZlVGFza3x8bnVsbCk/LnN0YXJ0QXQhPW51bGx8fGIuc3RhcnRBdCE9bnVsbCx4PWdvKGIpLEU9ZC5oYXMoeCksVD1DcihiLnRpdGxlKXx8Yi50aXRsZSxEPUNyKGIuZXhwbGFuYXRpb24pfHwiIixBPWBkcmVhbS10YXNrLWNhcmQke2IuaXNFeGlzdGluZz8iIjoiIGRyZWFtLXRhc2stY2FyZC0taW52ZW50ZWQifSR7RT8iIGRyZWFtLXRhc2stY2FyZC0tZGlzbWlzc2luZyI6IiJ9YCxfPWBkcmVhbS10YXNrLWNhcmQtdGl0bGUke20/IiBkcmVhbS10YXNrLWNhcmQtdGl0bGUtLWNsaWNrYWJsZSI6IiJ9YCxJPWBkcmVhbS10YXNrLWNhcmQtZXhwbGFuYXRpb24ke2MuaGFzKHgpPyIgZHJlYW0tdGFzay1jYXJkLWV4cGxhbmF0aW9uLS1leHBhbmRlZCI6IiJ9YDtyZXR1cm4oMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6QSxjaGlsZHJlbjpbKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtaGVhZGVyIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOl8sb25DbGljazptPygpPT5yKGIpOnZvaWQgMCxyb2xlOm0/ImJ1dHRvbiI6dm9pZCAwLHRhYkluZGV4Om0/MDp2b2lkIDAsb25LZXlEb3duOm0/TT0+eyhNLmtleT09PSJFbnRlciJ8fE0ua2V5PT09IiAiKSYmKE0ucHJldmVudERlZmF1bHQoKSxyKGIpKX06dm9pZCAwLHRpdGxlOmIuaXNFeGlzdGluZz8iT3BlbiB0aGlzIHRhc2siOiJDbGljayB0byBjcmVhdGUgdGhpcyB0YXNrIixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOlR9fSksKDAsSi5qc3gpKE9BLHtpc0NsaWNrYWJsZTptLHRhc2s6Yn0pLCgwLEouanN4KSgic3BhbiIse2NsYXNzTmFtZTpgZHJlYW0tdGFzay1yYXRpbmcgZHJlYW0tdGFzay1yYXRpbmctLSR7QUEoYi5yYXRpbmcpfWAsdGl0bGU6YFJlbGV2YW5jZTogJHtiLnJhdGluZ30vMTBgLGNoaWxkcmVuOmAke2IucmF0aW5nfS8xMGB9KV19KSwoMCxKLmpzeCkoInAiLHtjbGFzc05hbWU6SSx0aXRsZTpiLmV4cGxhbmF0aW9uPy5sZW5ndGg+U0E/Yi5leHBsYW5hdGlvbjpudWxsLG9uQ2xpY2s6KCk9PncoYiksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpEfX0pLCgwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxKLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6TT0+dShNLGIpLHRpdGxlOmIucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c/IkNsaWNraW5nIHRoaXMgd2lsbCByZW1vdmUgcHJlc2VydmUgc3RhdHVzIHNvIHRoZSB0YXNrIGNhbiByZXNlZWQgbm9ybWFsbHkiOiJDbGlja2luZyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHRhc2sgcmVtYWlucyBwcmVzZW50IGluIHlvdXIgRHJlYW0gVGFzayBsaXN0IHRocm91Z2ggdG9tb3Jyb3cgKG5vcm1hbGx5IHRhc2tzIHJlc2VlZCBkYWlseSkiLGNoaWxkcmVuOmIucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c/Ilx1ezFGNkFCfSBSZW1vdmUgcHJlc2VydmUiOiJcdXsxRjRDRX0gUHJlc2VydmUifSksKDAsSi5qc3gpKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOk09PnAoTSxiKSx0aXRsZToiTWFyayB0aGlzIHRhc2sgY29tcGxldGUgYW5kIHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyIHN1Z2dlc3Rpb24gd2hlbiBhdmFpbGFibGUiLGNoaWxkcmVuOiJcdTI3MDUgQ29tcGxldGVkIn0pLGg/bnVsbDooMCxKLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6TT0+dihNLGIpLHRpdGxlOiJTY2hlZHVsZSB0aGlzIHRhc2sgZm9yIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSIsY2hpbGRyZW46Ilx1ezFGNEM1fSBTY2hlZHVsZSJ9KSwoMCxKLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6TT0+ZihNLGIpLHRpdGxlOiJSZW1vdmUgdGhpcyB0YXNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdWdnZXN0aW9uIHdoZW4gYXZhaWxhYmxlIixjaGlsZHJlbjoiXHUyNzRDIFJlbW92ZSJ9KV19KV19LHh8fGcpfSksYT8oMCxKLmpzeCkoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbGxtLWF0dHJpYnV0aW9uIixjaGlsZHJlbjphfSk6bnVsbF19KX0pfWZ1bmN0aW9uIHpBKHtsb2FkaW5nOmUsZXJyb3I6dCx0YXNrczpuLG1heFRhc2tzOnIsbm90ZUxpbms6byxoZWFkZXJBY3Rpb25zOmEsb25TZXR0aW5nc0NsaWNrOmkscnVuQW5hbHlzaXM6cyxvblRhc2tDbGljazpsLGxpc3RSZWY6ZCxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpjLGFjdGlvbkhhbmRsZXJzOnB9KXtyZXR1cm4gZT8oMCxKLmpzeCkoTUEse30pOnQ/KDAsSi5qc3gpKFBBLHtlcnJvckluZm86dCxub3RlTGluazpvLG9uUmV0cnk6KCk9PnMobnVsbCksb25TZXR0aW5nc0NsaWNrOml9KTohbnx8bi5sZW5ndGg9PT0wPygwLEouanN4KShMQSx7bm90ZUxpbms6byxvblJldHJ5OigpPT5zKG51bGwpfSk6KDAsSi5qc3gpKFVBLHtkcmVhbVRhc2tzOm4sbWF4VGFza3M6cixoZWFkZXJBY3Rpb25zOmEsb25UYXNrQ2xpY2s6bCxsaXN0UmVmOmQsbGxtQXR0cmlidXRpb25Gb290ZXI6YyxhY3Rpb25IYW5kbGVyczpwfSl9ZnVuY3Rpb24gRkEoe25vdGVVVUlEOmUsb25PcGVuTm90ZTp0LG9uUmVzZWVkOm59KXtyZXR1cm4oMCxKLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWhlYWRlci1hY3Rpb25zIixjaGlsZHJlbjpbKDAsSi5qc3gpKElBLHtvblJlc2VlZDpufSksKDAsSi5qc3gpKFMwLHtub3RlVVVJRDplLG9uT3Blbk5vdGU6dH0pXX0pfWZ1bmN0aW9uICRBKGUsdCxuLHIpe2xldFtvLGFdPSgwLGtlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksW2ksc109KDAsa2UudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxsPSgwLGtlLnVzZUNhbGxiYWNrKSgoKT0+e2EobmV3IFNldCkscyhuZXcgU2V0KX0sW10pLGQ9KDAsa2UudXNlQ2FsbGJhY2spKGFzeW5jKGcsbSk9Pnthd2FpdCByMChlLG4sZyxtKX0sW2Usbl0pLGM9KDAsa2UudXNlQ2FsbGJhY2spKGc9PntsZXQgbT1nbyhnKTthKHk9PntsZXQgaD1uZXcgU2V0KHkpO3JldHVybiBoLmFkZChtKSxofSksc2V0VGltZW91dCgoKT0+e3IoeT0+KHl8fFtdKS5maWx0ZXIoaD0+Z28oaCkhPT1tKSksYSh5PT57bGV0IGg9bmV3IFNldCh5KTtyZXR1cm4gaC5kZWxldGUobSksaH0pLHMoeT0+e2xldCBoPW5ldyBTZXQoeSk7cmV0dXJuIGguZGVsZXRlKG0pLGh9KX0sRUEpfSxbcl0pLHA9KDAsa2UudXNlQ2FsbGJhY2spKGc9PntsZXQgbT1nLmN1cnJlbnRUYXJnZXQ/LmNsb3Nlc3Q/LigiLmRyZWFtLXRhc2stY2FyZCIpO2lmKCFtfHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm47bGV0IHk9bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsheS53aWR0aHx8IXkuaGVpZ2h0fHxMZCh7b3JpZ2luOnt4Oih5LmxlZnQreS53aWR0aC8yKS93aW5kb3cuaW5uZXJXaWR0aCx5Oih5LnRvcCt5LmhlaWdodC8yKS93aW5kb3cuaW5uZXJIZWlnaHR9LHBhcnRpY2xlQ291bnQ6OTAsc3ByZWFkOjc1LHN0YXJ0VmVsb2NpdHk6NDJ9KX0sW10pLHU9KDAsa2UudXNlQ2FsbGJhY2spKGFzeW5jKGcsbSk9PntnLnByZXZlbnREZWZhdWx0KCksYXQoImFwcHJvdmVEcmVhbVRhc2siLHt2aWE6ImNvbXBsZXRlIn0pLHAoZyk7bGV0IHk9bS51dWlkP251bGw6YXdhaXQgazAoZSksaD1hd2FpdCB4MChlLHksbSk7aCYmYXdhaXQgZChtLHtjb21wbGV0ZWRBdDpoLHJlbW92ZWRBdDpudWxsfSksYyhtKX0sW2UscCxkLGNdKSxmPSgwLGtlLnVzZUNhbGxiYWNrKShhc3luYyhnLG0pPT57Zy5wcmV2ZW50RGVmYXVsdCgpO2xldCB5PWdvKG0pLGg9IW0ucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c7cih4PT4oeHx8W10pLm1hcChFPT5nbyhFKT09PXk/ey4uLkUscHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6aH06RSkpLGF3YWl0IGQobSx7cHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6aH0pfSxbZCxyXSksdj0oMCxrZS51c2VDYWxsYmFjaykoYXN5bmMoZyxtKT0+e2cucHJldmVudERlZmF1bHQoKTtsZXQgeT1uZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7YXdhaXQgZChtLHtjb21wbGV0ZWRBdDpudWxsLHJlbW92ZWRBdDp5fSksYyhtKX0sW2QsY10pLHc9KDAsa2UudXNlQ2FsbGJhY2spKGFzeW5jKGcsbSk9PntnLnByZXZlbnREZWZhdWx0KCk7bGV0e2V2ZW50czp5LHRhc2tzOmh9PWF3YWl0IHAwKGUpLHg9bmV3IERhdGUsRT1jMCh4LHksaCksVD1hd2FpdCBfQShlLHgsRSk7aWYoVD09bnVsbClyZXR1cm47bGV0IEQ9YXdhaXQgZjAoZSx0LFQsbSk7aWYoIUQudGFza1V1aWQpe2soIltEcmVhbVRhc2tdIFNjaGVkdWxlIGZhaWxlZCIsRCk7bGV0IF89RC5yZWFzb249PT0ibWlzc2luZ19ub3RlIj8iQ291bGQgbm90IHNjaGVkdWxlOiBubyB0YXJnZXQgbm90ZSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgc3VnZ2VzdGlvbi4iOiJDb3VsZCBub3Qgc2NoZWR1bGUgdGhpcyB0YXNrLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHNjaGVkdWxlIGl0IG1hbnVhbGx5LiI7YXdhaXQgZS5hbGVydChfKTtyZXR1cm59YXQoImFwcHJvdmVEcmVhbVRhc2siLHt2aWE6InNjaGVkdWxlIn0pLGF3YWl0IGQobSx7dGFza1V1aWQ6RC50YXNrVXVpZH0pO2xldCBBPWdvKG0pO2lmKHIoXz0+KF98fFtdKS5tYXAoST0+Z28oSSk9PT1BP3suLi5JLGlzRXhpc3Rpbmc6ITAsbm90ZVVVSUQ6RC5ub3RlVVVJRHx8SS5ub3RlVVVJRHx8dCxzdGFydEF0OkQuc3RhcnRBdHx8VCx1dWlkOkQudGFza1V1aWR9OkkpKSx0eXBlb2Ygd2luZG93PCJ1Iil7bGV0IF89bmV3IEN1c3RvbUV2ZW50KFZhLHtjb250ZW50Om0udGl0bGUsbm90ZVVVSUQ6RC5ub3RlVVVJRHx8bS5ub3RlVVVJRHx8dCxzdGFydEF0OlQsdGFza1V1aWQ6RC50YXNrVXVpZH0pO3dpbmRvdy5kaXNwYXRjaEV2ZW50KF8pfX0sW2UsdCxkLHJdKSxiPSgwLGtlLnVzZUNhbGxiYWNrKShnPT57bGV0IG09Z28oZyk7cyh5PT57bGV0IGg9bmV3IFNldCh5KTtyZXR1cm4gaC5oYXMobSk/aC5kZWxldGUobSk6aC5hZGQobSksaH0pfSxbXSk7cmV0dXJue2Rpc21pc3NpbmdUYXNrS2V5czpvLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOmksb25Db21wbGV0ZVRhc2s6dSxvblByZXNlcnZlVGFzazpmLG9uUmVtb3ZlVGFzazp2LG9uU2NoZWR1bGVUYXNrOncsb25Ub2dnbGVFeHBsYW5hdGlvbjpiLHJlc2V0QWN0aW9uU3RhdGU6bH19ZnVuY3Rpb24gRmYoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQsZ3JpZFdpZHRoU2l6ZTpuLG9uT3BlblNldHRpbmdzOnIscHJvdmlkZXJBcGlLZXk6byxwcm92aWRlckVtOmF9KXtsZXRbaSxzXT0oMCxrZS51c2VTdGF0ZSkoITEpLFtsLGRdPSgwLGtlLnVzZVN0YXRlKShudWxsKSxbYyxwXT0oMCxrZS51c2VTdGF0ZSkobnVsbCksW3UsZl09KDAsa2UudXNlU3RhdGUpKG51bGwpLFt2LHddPSgwLGtlLnVzZVN0YXRlKShudWxsKSxbYixnXT0oMCxrZS51c2VTdGF0ZSkobnVsbCksW20seV09KDAsa2UudXNlU3RhdGUpKCExKSxbaCx4XT0oMCxrZS51c2VTdGF0ZSkoITEpLFssRV09KDAsa2UudXNlU3RhdGUpKCgpPT5tcygpKSxUPSgwLGtlLnVzZVJlZikobnVsbCksRD0oMCxrZS51c2VSZWYpKDApO0QuY3VycmVudCs9MTtsZXQgQT1meSgpLF89ISEoQXx8byksST1hP0dhKGEpOm51bGwsTT1YYihuLHQpLFA9WmIobix0KSx6PWUwKCksQj0oMCxrZS51c2VSZWYpKFApLHtkaXNtaXNzaW5nVGFza0tleXM6VyxleHBhbmRlZEV4cGxhbmF0aW9uS2V5czpzZSxvbkNvbXBsZXRlVGFzazpPLG9uUHJlc2VydmVUYXNrOiQsb25SZW1vdmVUYXNrOk4sb25TY2hlZHVsZVRhc2s6UyxvblRvZ2dsZUV4cGxhbmF0aW9uOlIscmVzZXRBY3Rpb25TdGF0ZTpGfT0kQShlLHYsdSxkKSxYPSgwLGtlLnVzZUNhbGxiYWNrKShhc3luYyhLLGZlKT0+e2xldCBWZT0oS3x8W10pLmZpbHRlcihCb29sZWFuKTtpZihWZS5sZW5ndGg9PT0wKXJldHVybiBmZTtsZXQgbnQ9YXdhaXQgdDAoZSxmZSxWZSk7cmV0dXJuIEUobnQpLG50fSxbZV0pLFE9KDAsa2UudXNlQ2FsbGJhY2spKGFzeW5jKEssZmU9e30pPT57bGV0IFZlPWZlLnByb3ZpZGVyRW1PdmVycmlkZT9HYShmZS5wcm92aWRlckVtT3ZlcnJpZGUpOkk7aygiW0RyZWFtVGFza10gcnVuQW5hbHlzaXMgZW50cnkiLHtoYXNMbG1Db25maWc6Xyxwcm92aWRlck5hbWU6VmUsZXhjbHVkZVV1aWRzU2l6ZTpLPy5zaXplPz8wLG9wdGlvbnM6ZmUsdGFza0dlbmVyYXRlQ291bnQ6UCxwcm9wb3NlZFRhc2tzTm90ZU5hbWU6en0pLHMoITApLHAobnVsbCksZyhudWxsKTt0cnl7bGV0IG50PXBlcmZvcm1hbmNlLm5vdygpLF9lPWF3YWl0IGEwKGUse2V4Y2x1ZGVVdWlkczpLLG9wdGlvbnM6ZmUscHJvcG9zZWRUYXNrc05vdGVOYW1lOnosbWF4VGFza3M6UH0pO2soYFtEcmVhbVRhc2tdIGZldGNoRHJlYW1UYXNrU3VnZ2VzdGlvbnMgdG9vayAkeyhwZXJmb3JtYW5jZS5ub3coKS1udCkudG9GaXhlZCgxKX1tc2Ase2NhY2hlZDpfZT8uY2FjaGVkLHRhc2tDb3VudDpfZT8udGFza3M/Lmxlbmd0aD8/MCxlcnJvckNvZGU6X2U/LmVycm9yQ29kZT8/bnVsbCxub3RlVVVJRDpfZT8ubm90ZVVVSUQ/P251bGx9KSwhX2U/LmNhY2hlZCYmIV9lPy5lcnJvckNvZGUmJl9lPy50YXNrcz8ubGVuZ3RoJiZhdCgiZ2VuZXJhdGVEcmVhbVRhc2tzIix7Y291bnQ6X2UudGFza3MubGVuZ3RofSk7bGV0IGp0PXBlcmZvcm1hbmNlLm5vdygpO2F3YWl0IGkwKF9lLHtwcm92aWRlck5hbWU6VmUsYXBwOmUscmVjb3JkVGFza1V1aWRzOlgsc2V0RXJyb3I6cCxzZXRUYXNrczpkLHNldE5vdGVVVUlEOmYsc2V0RGVmYXVsdE5vdGVVVUlEOncsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6Z30pLGsoYFtEcmVhbVRhc2tdIGFwcGx5RHJlYW1UYXNrQW5hbHlzaXNSZXN1bHQgdG9vayAkeyhwZXJmb3JtYW5jZS5ub3coKS1qdCkudG9GaXhlZCgxKX1tc2ApfWNhdGNoKG50KXtrKCJbRHJlYW1UYXNrXSBydW5BbmFseXNpcyBjYXVnaHQgdW5leHBlY3RlZCBlcnJvciIsbnQpLHAoe2Vycm9yOm50Lm1lc3NhZ2V8fCJBbmFseXNpcyBmYWlsZWQiLGVycm9yQ29kZToibGxtX2Vycm9yIixwcm92aWRlck5hbWU6VmV9KX1maW5hbGx5e3MoITEpfX0sW1gsUCx6LEksX10pOygwLGtlLnVzZUVmZmVjdCkoKCk9PntFKG1zKCkpfSxbXSksKDAsa2UudXNlRWZmZWN0KSgoKT0+e2l8fGw/Lmxlbmd0aHx8UShudWxsLHttaW5pbXVtVGFza0NvdW50OlB9KX0sW19dKSwoMCxrZS51c2VFZmZlY3QpKCgpPT57bGV0IEs9VEEoZSxhLG8sQSk7aygiW0RyZWFtVGFza10gY29uZmlnIHNuYXBzaG90Iix7aGFzTGxtQ29uZmlnOl8scHJvdmlkZXJOYW1lOkkscmVuZGVyQ291bnQ6RC5jdXJyZW50LC4uLkt9KX0sW18sYSxvLEEsSV0pLCgwLGtlLnVzZUVmZmVjdCkoKCk9PntsZXQgSz0hMTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUuZmluZE5vdGUoe25hbWU6aXJ9KSkudGhlbihmZT0+e0t8fHgoISFmZSl9KSwoKT0+e0s9ITB9fSxbZV0pLCgwLGtlLnVzZUVmZmVjdCkoKCk9PntpZighXylyZXR1cm47bGV0IEs9Qi5jdXJyZW50O0IuY3VycmVudD1QLHMwKHttYXhUYXNrczpQLHByZXZpb3VzTWF4VGFza3M6Syx0YXNrczpsfSkmJlBmKFEsUCl9LFtfLFAsbF0pLCgwLGtlLnVzZUVmZmVjdCkoKCk9PntsZXQgSz1wZXJmb3JtYW5jZS5ub3coKTt1byhULmN1cnJlbnQpLGsoYFtEcmVhbVRhc2tdIGF0dGFjaEZvb3Rub3RlUG9wdXBzOiAkeyhwZXJmb3JtYW5jZS5ub3coKS1LKS50b0ZpeGVkKDEpfW1zYCl9LFtsLGMsaV0pO2xldCBaPWFzeW5jIEs9PntLLnByZXZlbnREZWZhdWx0KCksdSYmYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3V9YCl9LHE9Sz0+e0sucHJldmVudERlZmF1bHQoKSxvMChyKX0scmU9Sz0+e0sucHJldmVudERlZmF1bHQoKSx5KCEwKX0scGU9Sz0+e3koITEpLGQobnVsbCksRigpLGcobnVsbCksUGYoUSxQLEs/e3Byb3ZpZGVyRW1PdmVycmlkZTpLfTp7fSl9LGdlPSFpJiYhbCYmIWMsaGU9ISFjJiZOQS5oYXMoYy5lcnJvckNvZGUpO3JldHVybiFfJiYhaSYmKCFsfHxsLmxlbmd0aD09PTApJiYoZ2V8fGhlKT8oaygiW0RyZWFtVGFza10gcmVuZGVyaW5nIG5vLWNvbmZpZyBzdGF0ZSIse3Byb3ZpZGVyTmFtZTpJLGhhc0Vycm9yOiEhYyxlcnJvckNvZGU6Yz8uZXJyb3JDb2RlPz9udWxsLHRhc2tDb3VudDpsPy5sZW5ndGg/PzB9KSwoMCxKLmpzeCkod3Mse2FwcDplLGZlYXR1cmVzOlJBLGljb246YnMoKSxtb3JlRmVhdHVyZXNMYWJlbDoiKyAxNSBtb3JlIGZlYXR1cmVzIGluY2x1ZGVkIix0aXRsZTpsZShZbiksd2lkZ2V0SWQ6WW59KSk6KDAsSi5qc3hzKShKLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsSi5qc3gpKHpBLHtlcnJvcjpjLGhlYWRlckFjdGlvbnM6KDAsSi5qc3gpKEZBLHtub3RlVVVJRDp1LG9uT3Blbk5vdGU6WixvblJlc2VlZDpyZX0pLGxpc3RSZWY6VCxsb2FkaW5nOmksbGxtQXR0cmlidXRpb25Gb290ZXI6YixtYXhUYXNrczpNLG5vdGVMaW5rOigwLEouanN4KShTMCx7bm90ZVVVSUQ6dSxvbk9wZW5Ob3RlOlp9KSxvblRhc2tDbGljazpLPT5uMChlLEssdiksdGFza3M6bCxvblNldHRpbmdzQ2xpY2s6cSxydW5BbmFseXNpczpRLGFjdGlvbkhhbmRsZXJzOntkaXNtaXNzaW5nVGFza0tleXM6VyxleHBhbmRlZEV4cGxhbmF0aW9uS2V5czpzZSxvbkNvbXBsZXRlOk8sb25QcmVzZXJ2ZTokLG9uUmVtb3ZlOk4sb25TY2hlZHVsZTpTLG9uVG9nZ2xlRXhwbGFuYXRpb246Un19KSxtPygwLEouanN4KSh5cyx7YWxsb3dLZXlsZXNzUHJvdmlkZXJzOmgsY29uZmlndXJlZFByb3ZpZGVyRW1zOlpsKFBlKCkpLGN1cnJlbnRQcm92aWRlckVtOmEsb25DYW5jZWw6KCk9PnkoITEpLG9uU2VsZWN0OnBlLHN1Ym1pdExhYmVsOiJSZXNlZWQiLHRpdGxlOiJSZXNlZWQgc3VnZ2VzdGlvbnMgd2l0aCB3aGljaCBBSSBwcm92aWRlcj8ifSk6bnVsbF19KX12YXIgTXI9VSh5ZSgpKTt2YXIgV0E9MS4wMixCQT0uOSxFMD05NjtmdW5jdGlvbiBOMChlLHQpe3JldHVybiBNYXRoLmFicyhlKTwxPzA6dC9NYXRoLmFicyhlKX1mdW5jdGlvbiBIQShlLHQsbil7cmV0dXJuIG4/ISEoZXx8dCE9PUZ0LkRFRkFVTFR8fCFjcygpKTohMX1mdW5jdGlvbiBHQShlKXtpZihlKXJldHVybnsiLS1mb2N1cy1ibHVyIjplLmJsdXIsIi0tZm9jdXMtb3BhY2l0eSI6YCR7ZS5vcGFjaXR5fWAsIi0tZm9jdXMtc2NhbGUiOmAke2Uuc2NhbGV9YCwiLS1mb2N1cy14IjplLngsIi0tZm9jdXMteSI6ZS55fX1mdW5jdGlvbiBqQShlLHQpe2xldCBuPWUubGVmdCtlLndpZHRoLzIscj1lLnRvcCtlLmhlaWdodC8yO3JldHVybntibHVyOiIwcHgiLG9wYWNpdHk6MSxzY2FsZTpXQSx4OmAke3QueC1ufXB4YCx5OmAke3QueS1yfXB4YH19ZnVuY3Rpb24gVkEoZSx0KXtsZXQgbj1lLmxlZnQrZS53aWR0aC8yLHI9ZS50b3ArZS5oZWlnaHQvMixvPW4tdC54LGE9ci10Lnk7TWF0aC5hYnMobyk8MSYmTWF0aC5hYnMoYSk8MSYmKGE9LTEpO2xldCBpPXQueCtlLndpZHRoLzIrRTAscz10LnkrZS5oZWlnaHQvMitFMCxsPU1hdGgubWF4KE4wKG8saSksTjAoYSxzKSwxLjM1KTtyZXR1cm57Ymx1cjoiMnB4IixvcGFjaXR5OjAsc2NhbGU6QkEseDpgJHtvKihsLTEpfXB4YCx5OmAke2EqKGwtMSl9cHhgfX1mdW5jdGlvbiBLQShlKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gbnVsbDtsZXQgdD1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpKTtpZighdC5sZW5ndGgpcmV0dXJuIG51bGw7bGV0IG49e3g6d2luZG93LmlubmVyV2lkdGgvMix5OndpbmRvdy5pbm5lckhlaWdodC8yfSxyPXt9O3JldHVybiB0LmZvckVhY2gobz0+e2xldCBhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO2lmKCFhKXJldHVybjtsZXQgaT1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JbYV09YT09PWU/akEoaSxuKTpWQShpLG4pfSkscn1mdW5jdGlvbiBUMChlLHQsbil7cmV0dXJue2NsYXNzTmFtZXM6W2U/ImdyaWQtY2VsbC0tZm9jdXMtbW9kZSI6IiIsZSYmZT09PW4/ImdyaWQtY2VsbC0tZm9jdXNlZCI6IiIsZSYmZSE9PW4/ImdyaWQtY2VsbC0tZm9jdXMtaGlkZGVuIjoiIl0uZmlsdGVyKEJvb2xlYW4pLHN0eWxlOkdBKHQpfX1mdW5jdGlvbiBEMChlLHQpe2xldFtuLHJdPSgwLE1yLnVzZVN0YXRlKShudWxsKSxbbyxhXT0oMCxNci51c2VTdGF0ZSkoe30pLGk9KDAsTXIudXNlQ2FsbGJhY2spKCgpPT57cihudWxsKSxhKHt9KX0sW10pO3JldHVybigwLE1yLnVzZUVmZmVjdCkoKCk9PntsZXQgcz1sPT57aWYodCE9PUZ0LkRFRkFVTFR8fGV8fCFjcygpKXJldHVybjtsZXQgZD1sPy5kZXRhaWw/LndpZGdldElkO2lmKCFkKXJldHVybjtpZihkPT09bil7aSgpO3JldHVybn1sZXQgYz1LQShkKTtjJiYoYShjKSxyKGQpKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKERkLHMpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihEZCxzKX0sW2ksZSxuLHRdKSwoMCxNci51c2VFZmZlY3QpKCgpPT57SEEoZSx0LG4pJiZpKCl9LFtpLGUsbix0XSksKDAsTXIudXNlRWZmZWN0KSgoKT0+e2lmKCFuKXJldHVybjtsZXQgcz1kPT57ZC5rZXk9PT0iRXNjYXBlIiYmaSgpfSxsPSgpPT5pKCk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixsKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixzKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixsKX19LFtpLG5dKSx7Y2xlYXJGb2N1c2VkV2lkZ2V0OmksZm9jdXNlZFdpZGdldElkOm4saXNXaWRnZXRGb2N1c01vZGU6ISEobiYmdD09PUZ0LkRFRkFVTFQmJiFlKSx3aWRnZXRGb2N1c1RyYW5zZm9ybXM6b319dmFyIFlBPTAscUE9MiwkZj0yLFFBPTEsSkE9MzAsWEE9NyxaQT1KQSxlXz05LEEwPTI0LHRfPTEwMCxfMD1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sQzA9NjAsV2Y9MWUzLE8wPTYwLG5fPVhBKkEwKkMwKk8wKldmLHJfPVpBKkEwKkMwKk8wKldmO2Z1bmN0aW9uIG9fKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIGUpZm9yKGxldCByIG9mIG4udXVpZHMpdC5hZGQocik7cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gYV8oZSl7bGV0IHQ9aV8obmV3IERhdGUpO2soIltHcmF2ZXlhcmRdIGZpbmRPckNyZWF0ZUdyYXZleWFyZE5vdGU6IGxvb2tpbmcgZm9yIG5vdGUgbmFtZWQiLEpTT04uc3RyaW5naWZ5KHQpLCJ3aXRoIHRhZyIsSWUpO2xldCBuPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6dCx0YWdzOltJZV19KTtpZihrKCJbR3JhdmV5YXJkXSBmaW5kT3JDcmVhdGVHcmF2ZXlhcmROb3RlOiBmaW5kTm90ZSByZXN1bHQ6IixuP2B1dWlkPSR7bi51dWlkfWA6Im51bGwvdW5kZWZpbmVkIiksbj8udXVpZClyZXR1cm4gbjtrKCJbR3JhdmV5YXJkXSBmaW5kT3JDcmVhdGVHcmF2ZXlhcmROb3RlOiBub3RlIG5vdCBmb3VuZCwgY3JlYXRpbmcgbmV3IG5vdGUiKTtsZXQgcj1hd2FpdCBlLmNyZWF0ZU5vdGUodCxbSWVdLHthcmNoaXZlOiEwfSk7cmV0dXJuIGsoIltHcmF2ZXlhcmRdIGZpbmRPckNyZWF0ZUdyYXZleWFyZE5vdGU6IGNyZWF0ZWQgbm90ZSB3aXRoIHV1aWQ6IixyKSxhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDpyfSxJMChbXSkpLHtuYW1lOnQsdXVpZDpyfX1mdW5jdGlvbiBJMChlKXtsZXQgdD1gIyBHcmF2ZXlhcmQgdGFzayBjYW5kaWRhdGVzCgp8IERhdGUgfCBUYXNrIFVVSURzIHwgVGFzayBub3RlIG1ldGFkYXRhIHwKfC0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CmAsbj1lLm1hcChyPT57bGV0IG89QXJyYXkuaXNBcnJheShyLnRhc2tFbnRyaWVzKSYmci50YXNrRW50cmllcy5sZW5ndGg+MD9yLnRhc2tFbnRyaWVzOnIudXVpZHMubWFwKGk9Pih7bm90ZU5hbWU6bnVsbCxub3RlVVVJRDpudWxsLHV1aWQ6aX0pKSxhPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvLm1hcChpPT4oe25vdGVOYW1lOmkubm90ZU5hbWV8fG51bGwsbm90ZVVVSUQ6aS5ub3RlVVVJRHx8bnVsbCx1dWlkOmkudXVpZH0pKSkpO3JldHVybmB8ICR7ci5kYXRlS2V5fSB8ICR7ci51dWlkcy5qb2luKCIsIil9IHwgJHthfSB8YH0pLmpvaW4oYApgKTtyZXR1cm4gdCtuKyhuP2AKYDoiIil9ZnVuY3Rpb24gaV8oZSl7bGV0IHQ9ZSBpbnN0YW5jZW9mIERhdGU/ZTpuZXcgRGF0ZShlKTtyZXR1cm5gVGFzayBncmF2ZXlhcmQgZGF0YTogJHtfMFt0LmdldE1vbnRoKCldfSAke3QuZ2V0RnVsbFllYXIoKX1gfWZ1bmN0aW9uIHNfKGUpe2xldCB0PWUgaW5zdGFuY2VvZiBEYXRlP2U6bmV3IERhdGUoZSk7cmV0dXJuYFN1Y2Nlc3NmdWxseSByZXRpcmVkIHRhc2tzOiAke18wW3QuZ2V0TW9udGgoKV19ICR7dC5nZXRGdWxsWWVhcigpfWB9ZnVuY3Rpb24gbF8oZSl7bGV0IHQ9W10sbj0oZXx8IiIpLnNwbGl0KGAKYCkscj0wLG89MCxhPTAsaT0wO2ZvcihsZXQgcyBvZiBuKXtsZXQgbD1zLnRyaW0oKTtpZighbC5zdGFydHNXaXRoKCJ8Iikpe3IrKztjb250aW51ZX1sZXQgZD1sLnNsaWNlKDEsLTEpLnNwbGl0KCJ8IikubWFwKGY9PmYudHJpbSgpKTtpZihkLmxlbmd0aDxxQSl7YSsrO2NvbnRpbnVlfWxldCBjPWRbWUFdO2lmKGM9PT0iRGF0ZSJ8fC9eLSskLy50ZXN0KGMpKXtvKys7Y29udGludWV9bGV0IHA9ZFtRQV0uc3BsaXQoIiwiKS5tYXAoZj0+Zi50cmltKCkpLmZpbHRlcihCb29sZWFuKSx1PXAubWFwKGY9Pih7bm90ZU5hbWU6bnVsbCxub3RlVVVJRDpudWxsLHV1aWQ6Zn0pKTtpZihkWyRmXSl0cnl7bGV0IGY9SlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoZFskZl0pKTtBcnJheS5pc0FycmF5KGYpP3U9Zi5maWx0ZXIodj0+dj8udXVpZCkubWFwKHY9Pih7bm90ZU5hbWU6di5ub3RlTmFtZXx8bnVsbCxub3RlVVVJRDp2Lm5vdGVVVUlEfHxudWxsLHV1aWQ6di51dWlkfSkpOmsoIltHcmF2ZXlhcmRdIHJvd3NGcm9tR3JhdmV5YXJkQ29udGVudDogdGFza0VudHJpZXMgY29sdW1uIHdhcyBub3QgYW4gYXJyYXkgYWZ0ZXIgcGFyc2UsIHZhbHVlOiIsZil9Y2F0Y2goZil7aygiW0dyYXZleWFyZF0gZmFpbGVkIHRvIHBhcnNlIGNhY2hlZCB0YXNrIG5vdGUgbWV0YWRhdGE6IixmLCJcdTIwMTQgcmF3IGNlbGwgdmFsdWU6IixkWyRmXT8uc2xpY2UoMCwxMjApKX1lbHNlIGsoYFtHcmF2ZXlhcmRdIHJvd3NGcm9tR3JhdmV5YXJkQ29udGVudDogbm8gdGFza0VudHJpZXMgY29sdW1uIGZvciBkYXRlS2V5PSR7SlNPTi5zdHJpbmdpZnkoYyl9LCBmYWxsaW5nIGJhY2sgdG8gdXVpZC1vbmx5IGVudHJpZXNgKTtjJiZwLmxlbmd0aD4wP3QucHVzaCh7ZGF0ZUtleTpjLHRhc2tFbnRyaWVzOnUsdXVpZHM6cH0pOmkrK31yZXR1cm4gdH1hc3luYyBmdW5jdGlvbiBkXyhlLHQsbil7bGV0IHI9YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKG4ubWFwKGE9PmUuZ2V0Tm90ZVRhc2tzKHt1dWlkOmEudXVpZH0se2luY2x1ZGVEb25lOiExfSkudGhlbihpPT4oe25vdGVIYW5kbGU6YSx0YXNrczppfHxbXX0pKSkpLG89W107Zm9yKGxldCBhIG9mIHIpe2lmKGEuc3RhdHVzPT09InJlamVjdGVkIil7aygiW0dyYXZleWFyZF0gZ2V0Tm90ZVRhc2tzIGZhaWxlZDoiLGEucmVhc29uKTtjb250aW51ZX1sZXR7bm90ZUhhbmRsZTppLHRhc2tzOnN9PWEudmFsdWUsbD0wO2ZvcihsZXQgZCBvZiBzKSFkPy51dWlkfHx0LmhhcyhkLnV1aWQpfHxkLmNvbXBsZXRlZEF0fHxkLmRpc21pc3NlZEF0fHwoby5wdXNoKHsuLi5kLG5vdGVOYW1lOmQubm90ZU5hbWV8fGQubm90ZVRpdGxlfHxkLm5vdGU/Lm5hbWV8fGkubmFtZXx8bnVsbCxub3RlVVVJRDpkLm5vdGVVVUlEfHxpLnV1aWR9KSxsKyspfXJldHVybiBvfWFzeW5jIGZ1bmN0aW9uIGNfKGUsdCxuLHIpe2xldCBvPXI/e3Rhc2tEb21haW5VVUlEOnJ9Ont9O289ey4uLm8sZ3JvdXA6InRhc2tMaXN0cyJ9O2xldCBhPVtdO2ZvciBhd2FpdChsZXQgZCBvZiBhd2FpdCBlLmZpbHRlck5vdGVzKG8sIm9wZW5lZCIpKWEucHVzaChkKTtsZXQgaT1bLi4uYV0ucmV2ZXJzZSgpLnNsaWNlKDAsdF8pO2soYFtHcmF2ZXlhcmRdIHNjYW5uaW5nICR7aS5sZW5ndGh9IG5vdGVzIGZvciB0YXNrc2ApO2xldCBzPWF3YWl0IGRfKGUsbixpKSxsPU0wKHQscyk7cmV0dXJuIGsoYFtHcmF2ZXlhcmRdIHRhc2sgY291bnRzIFx1MjAxNCB0b3RhbCBzY29yZWQ6ICR7cy5sZW5ndGh9LCBzZWxlY3RlZDogJHtsLmxlbmd0aH0gKG5lZWQgJHt0fSlgKSxsfWZ1bmN0aW9uIHVfKGUpe2xldCB0PU51bWJlcihlPy5zY29yZT8/ZT8udmljdG9yeVZhbHVlPz8wKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpP3Q6MH1mdW5jdGlvbiBwXyhlLHQpe2xldCBuPVIwKHQpLHI9bj09PW51bGw/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOk1hdGguYWJzKG4tZSkvbl87cmV0dXJuIHVfKHQpLU1hdGgubG9nKDErcil9YXN5bmMgZnVuY3Rpb24gZl8oZSx0LG4pe2lmKGsoIltHcmF2ZXlhcmRdIGh5ZHJhdGVkVGFza3NGcm9tVXVpZHM6IGNhbGxlZCB3aXRoIHV1aWRDb3VudDoiLG4/Lmxlbmd0aCwidGFza0VudHJ5Q291bnQ6Iix0Py5sZW5ndGgpLCFufHxuLmxlbmd0aD09PTApcmV0dXJuW107bGV0IHI9bmV3IE1hcCgodHx8W10pLmZpbHRlcihkPT5kPy51dWlkKS5tYXAoZD0+W2QudXVpZCxkXSkpLG89YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKG4ubWFwKGQ9PmUuZ2V0VGFzayhkKSkpLGE9MCxpPTAscz0wLGw9by5tYXAoKGQsYyk9PntsZXQgcD1uW2NdO2lmKGQuc3RhdHVzPT09InJlamVjdGVkInx8IWQudmFsdWUpcmV0dXJuIGErKyxrKCJbR3JhdmV5YXJkXSBoeWRyYXRlZFRhc2tzRnJvbVV1aWRzOiB1dWlkIG5vdCBmb3VuZDoiLHApLG51bGw7bGV0IHU9ZC52YWx1ZTtpZih1LmNvbXBsZXRlZEF0fHx1LmRpc21pc3NlZEF0KXJldHVybiBpKyssaygiW0dyYXZleWFyZF0gaHlkcmF0ZWRUYXNrc0Zyb21VdWlkczogdXVpZCBmaWx0ZXJlZCBcdTIwMTQgY29tcGxldGVkQXQ6Iix1LmNvbXBsZXRlZEF0LCJkaXNtaXNzZWRBdDoiLHUuZGlzbWlzc2VkQXQsInV1aWQ6IixwKSxudWxsO3MrKztsZXQgZj1yLmdldChwKTtyZXR1cm57Li4udSxub3RlTmFtZTp1Lm5vdGVOYW1lfHx1Lm5vdGVUaXRsZXx8dS5ub3RlPy5uYW1lfHxmPy5ub3RlTmFtZXx8bnVsbCxub3RlVVVJRDp1Lm5vdGVVVUlEfHxmPy5ub3RlVVVJRHx8bnVsbH19KS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGsoYFtHcmF2ZXlhcmRdIGh5ZHJhdGVkVGFza3NGcm9tVXVpZHM6IHJlc3VsdHMgXHUyMDE0IGFjY2VwdGVkPSR7c30gbWlzc2luZz0ke2F9IGNvbXBsZXRlZE9yRGlzbWlzc2VkPSR7aX0gdG90YWw9JHtsLmxlbmd0aH1gKSxsfWZ1bmN0aW9uIGhfKGUsdCl7bGV0IG49UjAodCk7cmV0dXJuIG4hPT1udWxsJiZuPD1lfWZ1bmN0aW9uIE0wKGUsdCl7aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldCBuPW5ldyBEYXRlLHI9Z18obiksbz1uLmdldFRpbWUoKS1yXyxhPXQuZmlsdGVyKHM9PmhfKG8scykpO2lmKGEubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgaT1hLm1hcCgocyxsKT0+KHsuLi5zLGdyYXZleWFyZEhldXJpc3RpY1JhbmtJbmRleDpsLGdyYXZleWFyZEhldXJpc3RpY1Njb3JlOnBfKHIscyl9KSk7cmV0dXJuIGkuc29ydCgocyxsKT0+cy5ncmF2ZXlhcmRIZXVyaXN0aWNTY29yZSE9PWwuZ3JhdmV5YXJkSGV1cmlzdGljU2NvcmU/bC5ncmF2ZXlhcmRIZXVyaXN0aWNTY29yZT5zLmdyYXZleWFyZEhldXJpc3RpY1Njb3JlPzE6LTE6cy5ncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXgtbC5ncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXgpLGkuc2xpY2UoMCxlKS5tYXAoKHtncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXg6cywuLi5sfSk9PmwpfWZ1bmN0aW9uIFIwKGUpe2xldCB0PU51bWJlcihlPy5jcmVhdGVkQXQ/P2U/LmNyZWF0ZWQpO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIG51bGw7bGV0IG49dDwxZTEwP3QqV2Y6dCxyPW5ldyBEYXRlKG4pO3JldHVybiBOdW1iZXIuaXNOYU4oci5nZXRUaW1lKCkpP251bGw6bn1mdW5jdGlvbiBnXyhlKXtsZXQgdD1uZXcgRGF0ZShlKTtyZXR1cm4gdC5zZXRNb250aCh0LmdldE1vbnRoKCktZV8pLHQuZ2V0VGltZSgpfWFzeW5jIGZ1bmN0aW9uIFAwKGUsdCl7bGV0IG49c18obmV3IERhdGUpLHI9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpuLHRhZ3M6W0llXX0pLmNhdGNoKCgpPT5udWxsKTtpZighcj8udXVpZCl7bGV0IHM9YXdhaXQgZS5jcmVhdGVOb3RlKG4sW0llXSx7YXJjaGl2ZTohMH0pO3I9e25hbWU6bix1dWlkOnN9LGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHIsYCMgU3VjY2Vzc2Z1bGx5IHJldGlyZWQgdGFza3MKCmApLmNhdGNoKCgpPT57fSl9bGV0IG89dC50aXRsZXx8dC5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsYT16ZShuZXcgRGF0ZSksaT1gLSBbeF0gJHtvfSA8IS0tIHsicmV0aXJlZEF0IjoiJHthfSJ9IC0tPgpgO2F3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQocixpLHthdEVuZDohMH0pLmNhdGNoKHM9PmsoIltHcmF2ZXlhcmRdIGFwcGVuZFRhc2tUb1JldGlyZWROb3RlIGZhaWxlZDoiLHMpKX1hc3luYyBmdW5jdGlvbiBMMChlLHQsbixyPXt9KXtsZXQgbz0hIXI/LmZvcmNlUmVmcmVzaDtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogc3RhcnQgXHUyMDE0IGNvdW50OiIsdCwidGFza0RvbWFpblVVSUQ6IixuLCJmb3JjZVJlZnJlc2g6IixvKTtsZXQgYT1hd2FpdCBhXyhlKTtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogdXNpbmcgZGF0YSBub3RlOiIsYT8udXVpZCxhPy5uYW1lKTtsZXQgaT0iIjt0cnl7aT1hd2FpdCBlLmdldE5vdGVDb250ZW50KGEpLGsoIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBmZXRjaGVkIG5vdGUgY29udGVudCwgbGVuZ3RoOiIsaT8ubGVuZ3RoPz8ibnVsbC91bmRlZmluZWQiKSxpPWl8fCIifWNhdGNoKGYpe2soIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBnZXROb3RlQ29udGVudCB0aHJldzoiLGYsIlx1MjAxNCB0cmVhdGluZyBhcyBlbXB0eSIpLGk9IiJ9bGV0IHM9bF8oaSk7aygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IHBhcnNlZCIscy5sZW5ndGgsInJvd3MgZnJvbSBub3RlOyBkYXRlS2V5czoiLHMubWFwKGY9PmYuZGF0ZUtleSkpO2xldCBsPXplKG5ldyBEYXRlKTtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogdG9kYXlLZXkgPSIsbCk7bGV0IGQ9cy5maW5kKGY9PmYuZGF0ZUtleT09PWwpO2lmKGsoIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiB0b2RheVJvdyBmb3VuZDoiLCEhZCxkP2B1dWlkcz0ke2QudXVpZHMubGVuZ3RofWA6IiIpLCFvJiZkPy51dWlkcy5sZW5ndGg+MCl7aygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGNhY2hlIGhpdCBcdTIwMTQgaHlkcmF0aW5nIixkLnV1aWRzLmxlbmd0aCwidXVpZHM6IixkLnV1aWRzKTtsZXQgZj1hd2FpdCBmXyhlLGQudGFza0VudHJpZXMsZC51dWlkcyksdj1NMCh0LGYpO2lmKGsoIltHcmF2ZXlhcmRdIGxvYWRlZCBjYWNoZWQgY2FuZGlkYXRlczoiLHYubGVuZ3RoKSx2Lmxlbmd0aD4wKXJldHVybntjYW5kaWRhdGVzOnYsbm90ZUhhbmRsZTphfTtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogY2FjaGVkIFVVSURzIGFsbCBtaXNzaW5nIGZyb20gZG9tYWluIFx1MjAxNCBkaXNjYXJkaW5nIHN0YWxlIHRvZGF5IHJvdyBhbmQgcmVkaXNjb3ZlcmluZyIpfWVsc2UgbyYmaygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGZvcmNlUmVmcmVzaCByZXF1ZXN0ZWQgXHUyMDE0IGJ5cGFzc2luZyB0b2RheSBjYWNoZSByb3ciKTtsZXQgYz1vP3M6cy5maWx0ZXIoZj0+Zi5kYXRlS2V5IT09bCkscD1vXyhjKSx1PWF3YWl0IGNfKGUsdCxwLG4pO2lmKHUubGVuZ3RoPjApe2xldCBmPXUubWFwKHc9Pih7bm90ZU5hbWU6dy5ub3RlTmFtZXx8dy5ub3RlVGl0bGV8fHcubm90ZT8ubmFtZSxub3RlVVVJRDp3Lm5vdGVVVUlELHV1aWQ6dy51dWlkfSkpLHY9W3tkYXRlS2V5OmwsdGFza0VudHJpZXM6Zix1dWlkczp1Lm1hcCh3PT53LnV1aWQpfSwuLi5zLmZpbHRlcih3PT53LmRhdGVLZXkhPT1sKV07YXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoYSxJMCh2KSkuY2F0Y2godz0+aygiW0dyYXZleWFyZF0gZmFpbGVkIHRvIHBlcnNpc3QgY2FuZGlkYXRlczoiLHcpKX1yZXR1cm4gaygiW0dyYXZleWFyZF0gZGlzY292ZXJlZCBmcmVzaCBjYW5kaWRhdGVzOiIsdS5sZW5ndGgpLHtjYW5kaWRhdGVzOnUsbm90ZUhhbmRsZTphfX12YXIgSHQ9VSh5ZSgpKTt2YXIgVTA9WyJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjkwNTkyNTM0Ni0yMWJkYTRkMzJkZjQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDA3MTQ1OTYwNC0zYjVlYzNhN2ZlMDUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMTc4NTg4ODA0MS1hZjNlZjI4NWI0NzAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDgyMjc1OTAyMy1mZWQ2MjJmZjJjM2IiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTY4MTM5Mzc4NC1kMTIwMjY3OTMzYmEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NTkyNDE1NjczNC00OTZmNmNhYzZlYzEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5MDczMDE0MTEwMy02Y2FjMjdhYWFiOTQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzMzA4Njk2NjM1OC01NDg1OWQwZWQ3MTYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MjIxNDEwMzQ1MS05Mzc0YmQxYzc5OGUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQxNDYwOTI0NTIyNC1hZmEwMmJmYjNmZGEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2OTQ3NDk2ODAyOC01NjYyM2YwMmU0MmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQyNjYwNDk2Njg0OC1kN2FkYWM0MDJiZmYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTE0NjM0NDQyNS1mMDBkNWY1YzhmMDciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5MTU1Mzg5NTkxMS0wMDU1ZWNhNjQwMmQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDc3MDg0MTA3Mi1mOTc4Y2Y0ZDAxOWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDgyMzA2MzUzMC0wOGYxMGVkMWEyZGQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzOTg1Mzk0OTEyNy1mYTY0NzgyMWViYTAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MjM5Njk2MTY5My0xNDJlNmUyNjkwMjciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzMTc5NDA2MjIzMi0yYTk5YTU0MzFjNmMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Njc3NjgxMTk1My1iMjNkNTdiZDIxYWEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjc0NDAzODEzNi00NjI3MzgzNGIzZmIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTU3MjI5MzA3MTI3Ny1lZjFiM2U3NjEwNDUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQxODA2NTQ2MDQ4Ny0zZTQxYTZjODRkYzUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDI0Njk3MzkxOC0yOWE5MzIyMWM0NTUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MzExNjc2MzI0OS0yZmFhZWY4MWNjZGEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzOTc5MjY3NTEwNS03MDFlNmE0YWI2ZjAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2MzMyMDcyNjI4MS02OTZhNDg1OTI4YzciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5OTAwMjIzODQ0MC1kMjY0ZWRkNTk2ZWMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxMDc5ODgzMTk3MS02NjFlYjA0YjM3MzkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNzUyNTQyODAzNC1iNzIzY2Y5NjFkM2UiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0MTk3NDIzMTUzMS1jNjIyN2RiNzZiNmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1ODY2ODM4Mzk3MC04ZGRkMzkyN2RlZWQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDc3MDkwMzY3Ni02OWI5ODIwMWVhMWMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDAzNzg2NjU1Ni02ODEyYzlkMWM3MmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1NTIxODg3MzUwOS04MDk3MzA1ZWUzNzgiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTkxOTI5MjI3NS1jNjBiYTQ5ZGE2YWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0ODM3NTI0MDU4Ni04ODI3MDdkYjg4OGIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1MTE4NzU4MDQ1OS00MzQ5MDI3OWMwZmEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTEwMTA0NjUzMC03MzM5OGM3ZjI4Y2EiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQyMTc4OTY2NTIwOS1jOWIyYTQzNWUzZGMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NzQxNDM0ODQ2My1jMGViN2YxMzU5YjYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMDUzMDg1NTY5Ny1iNTg2ZDg5YmEzZWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1NTE1NjIxODM4OC01ZTYxYjUyNjgxOGIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Nzc1Mjg3NTIxNS1iMjc2MWFjYjNjNWQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Mzg5MDkyMzQyMi03ODE5ZWQ0MTAxYzAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5NDc4MzM2NzE5My0xNDkwMzRjMDVlOGYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTYwODk1MzAyOTYwMS03YTZlNWU3ZmQ1NDgiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMjA4MjU1MzA0OC1mMDA5YzM3MTI5YjkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTkwNDk4MTA2My1iMGNmNDQ4ZDQ3OWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NjIzMTY4MjgyOC0zN2U1NzFiYzE3MmYiXSx6MD1bImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTAwNTM0MzE0MjA5LWEyNWRkYjJiZDQyOSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTAxODU0MTQwODAxLTUwZDAxNjk4OTUwYiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTU5ODI3MjYwLWRjNjZkNTJiZWYxOSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTMwOTA4Mjk1NDE4LWExMmUzMjY5NjZiYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTkyMjkwNDM1MzM4LTY4MmM0MDBjYjZmOCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTIwOTYyODgwMjQ3LWNmYWY1NDFjODcyNCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQ0MjEwOTcxMDQ4LTYxMzBjZjBjNDZjZiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTI4MzYwOTgzMjc3LTEzZDQwMWNkYzE4NiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNjA3MTM2MTA0MDgwLTc4YmJmZTJkMTIzNCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQwMzQyMzU5NzQzLTg0ZmNiOGMyMWYyMSJdLFdkPXtzbWFsbDp7d2lkdGg6NjAwLGhlaWdodDo2MDB9LGxhcmdlOnt3aWR0aDoxOTIwLGhlaWdodDoxMDgwfX07ZnVuY3Rpb24gRjAoZSl7bGV0IHQ9U3RyaW5nKGU/PyJkZWZhdWx0LXNlZWQiKSxuPTA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKz0xKW49KG48PDUpLW4rdC5jaGFyQ29kZUF0KHIpLG58PTA7cmV0dXJuIE1hdGguYWJzKG4pfWZ1bmN0aW9uICQwKGU9InNtYWxsIix0PSJncmF2ZXlhcmQiKXtsZXQgbj1XZFtlXXx8V2Quc21hbGw7cmV0dXJuYCR7ejBbRjAodCklejAubGVuZ3RoXX0/dz0ke24ud2lkdGh9Jmg9JHtuLmhlaWdodH0mZml0PWNyb3AmYXV0bz1mb3JtYXRgfWZ1bmN0aW9uIEJkKGU9InNtYWxsIix0PSJkZWZhdWx0IixuPTApe2xldCByPVdkW2VdfHxXZC5zbWFsbCxvPWAke3R9OiR7bn1gLGE9RjAobyklVTAubGVuZ3RoLGk9VTBbYV0scz1gP3c9JHtyLndpZHRofSZoPSR7ci5oZWlnaHR9JmZpdD1jcm9wJmF1dG89Zm9ybWF0YDtyZXR1cm5gJHtpfSR7c31gfXZhciBNZT1VKGVlKCkpLG1fPTUsdl89NTAwLG1vPSJncmF2ZXlhcmQiO2Z1bmN0aW9uIHlfKHtoZWFkZXJBY3Rpb25zOmV9KXtyZXR1cm4oMCxNZS5qc3gpKGllLHtoZWFkZXJBY3Rpb25zOmUsaWNvbjoiXHV7MUY0NzV9Iix0aXRsZTpsZShtbyksd2lkZ2V0SWQ6bW8sY2hpbGRyZW46KDAsTWUuanN4KSgicCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWVtcHR5IixjaGlsZHJlbjoiTm8gbmVnbGVjdGVkIHRhc2tzIGZvdW5kIFx1MjAxNCBldmVyeXRoaW5nIGxvb2tzIGN1cnJlbnQhIn0pfSl9ZnVuY3Rpb24gd18oe2Vycm9yTWVzc2FnZTplLGhlYWRlckFjdGlvbnM6dCxvblJldHJ5Om59KXtyZXR1cm4oMCxNZS5qc3gpKGllLHtoZWFkZXJBY3Rpb25zOnQsaWNvbjoiXHV7MUY0NzV9Iix0aXRsZTpsZShtbyksd2lkZ2V0SWQ6bW8sY2hpbGRyZW46KDAsTWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWVycm9yIixjaGlsZHJlbjpbKDAsTWUuanN4KSgicCIse2NoaWxkcmVuOmV8fCJGYWlsZWQgdG8gbG9hZCB0YXNrcy4ifSksKDAsTWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtcmV0cnkiLG9uQ2xpY2s6bix0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJSZXRyeSJ9KV19KX0pfWZ1bmN0aW9uIGJfKHtoZWFkZXJBY3Rpb25zOmV9KXtyZXR1cm4oMCxNZS5qc3gpKGllLHtoZWFkZXJBY3Rpb25zOmUsaWNvbjoiXHV7MUY0NzV9Iix0aXRsZTpsZShtbyksd2lkZ2V0SWQ6bW8sY2hpbGRyZW46KDAsTWUuanN4KSgicCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWxvYWRpbmciLGNoaWxkcmVuOiJTZWFyY2hpbmcgZm9yIGZvcmdvdHRlbiB0YXNrc1x1MjAyNiJ9KX0pfWZ1bmN0aW9uIGtfKHtpc1JlZnJlc2hpbmc6ZSxvblJlZnJlc2g6dH0pe3JldHVybigwLE1lLmpzeCkoImEiLHsiYXJpYS1kaXNhYmxlZCI6ZT8idHJ1ZSI6ImZhbHNlIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixocmVmOiIjIixvbkNsaWNrOnQsdGFiSW5kZXg6ZT8tMTowLHRpdGxlOmU/IlJlZnJlc2hpbmcgZ3JhdmV5YXJkIGNhbmRpZGF0ZXMiOiJGaW5kIGEgbmV3IHNldCBvZiBncmF2ZXlhcmQgY2FuZGlkYXRlcyIsY2hpbGRyZW46ZT8iXHUyMUJCIFJlZnJlc2hpbmdcdTIwMjYiOiJcdTIxQkIgUmVmcmVzaCJ9KX1mdW5jdGlvbiBXMChlKXtpZighZT8uY3JlYXRlZEF0KXJldHVybiBudWxsO2xldCB0PU51bWJlcihlLmNyZWF0ZWRBdCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gbnVsbDtsZXQgbj10PDFlMTA/dCoxZTM6dCxyPW5ldyBEYXRlKG4pO3JldHVybiBOdW1iZXIuaXNOYU4oci5nZXRUaW1lKCkpP251bGw6cn1mdW5jdGlvbiB4XyhlLHQpe2xldCBuPVcwKGUpO2lmKCFuKXJldHVybiBudWxsO2xldCByPW4udG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0Iix5ZWFyOiJudW1lcmljIn0pO3JldHVybiB0P3I6YENyZWF0ZWQgJHtyfWB9ZnVuY3Rpb24gQjAoZSl7bGV0IHQ9TnVtYmVyKGU/LnNjb3JlPz9lPy52aWN0b3J5VmFsdWU/PzApO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDowfWZ1bmN0aW9uIFNfKGUpe2xldCB0PUIwKGUpO3JldHVybiB0PD0zPyJtdXRlZCI6dDw9NT8iY29vbCI6dDwxMD8id2FybSI6ImhvdCJ9ZnVuY3Rpb24gQmYoZSl7cmV0dXJuYCR7ZT8/IiJ9YC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBFXyhlLHQpe2lmKCFOdW1iZXIuaXNGaW5pdGUodCl8fHQ8PTApcmV0dXJuIDA7bGV0IG49bmV3IERhdGUsbz1gJHtgJHtuLmdldEZ1bGxZZWFyKCl9OiR7bi5nZXRNb250aCgpfToke24uZ2V0RGF0ZSgpfToke24uZ2V0SG91cnMoKX1gfToke2U/PyIifWAsYT0wO2ZvcihsZXQgaT0wO2k8by5sZW5ndGg7aSs9MSlhPWEqMzErby5jaGFyQ29kZUF0KGkpPj4+MDtyZXR1cm4gYSV0fWZ1bmN0aW9uIE5fKGUpe2xldCB0PVcwKGUpLG49QjAoZSkscj1OdW1iZXIuaXNJbnRlZ2VyKG4pP2Ake259YDpuLnRvRml4ZWQoMikucmVwbGFjZSgvXC4/MCskLywiIiksbz1lPy5ub3RlTmFtZXx8ZT8ubm90ZVRpdGxlfHxlPy5ub3RlPy5uYW1lfHwiVW5rbm93biBub3RlIixhPVNfKGUpLGk9dD90LnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse2RhdGVTdHlsZToibWVkaXVtIn0pOiJVbmtub3duIjtyZXR1cm5gCiAgICA8ZGl2IGNsYXNzPSJncmF2ZXlhcmQtdGFzay10b29sdGlwIiByb2xlPSJ0b29sdGlwIj4KICAgICAgPGRpdiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1tZXRhIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1ub3RlIj4ke0JmKG8pfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1jcmVhdGVkIj5DcmVhdGVkICR7QmYoaSl9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1jb250ZW50Ij4KICAgICAgICAke0NyKGUuY29udGVudHx8ZS50aXRsZXx8IlVudGl0bGVkIHRhc2siKX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtZm9vdGVyIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stc2NvcmUgZ3JhdmV5YXJkLXRhc2stc2NvcmUtLSR7YX0iPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImdyYXZleWFyZC10YXNrLXNjb3JlLWRvdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KICAgICAgICAgIDxzcGFuPlNjb3JlICR7QmYocil9PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgfWZ1bmN0aW9uIFRfKGUpe2xldCB0PWUuY3VycmVudFRhcmdldD8uY2xvc2VzdD8uKCIuZ3JhdmV5YXJkLXRhc2staXRlbSIpO2lmKCF0fHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm47bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTshbi53aWR0aHx8IW4uaGVpZ2h0fHxMZCh7b3JpZ2luOnt4OihuLmxlZnQrbi53aWR0aC8yKS93aW5kb3cuaW5uZXJXaWR0aCx5OihuLnRvcCtuLmhlaWdodC8yKS93aW5kb3cuaW5uZXJIZWlnaHR9LHBhcnRpY2xlQ291bnQ6ODAsc3ByZWFkOjcwLHN0YXJ0VmVsb2NpdHk6Mzh9KX1mdW5jdGlvbiBEXyh7aXNEaXNtaXNzaW5nOmUsaXNTaW5nbGVDb2x1bW46dCx0YXNrSW5kZXg6bixvbk9wZW5Ob3RlOnIsb25HcmF2ZXlhcmQ6byxvbktlZXA6YSx0YXNrOml9KXtsZXQgcz1pLnRpdGxlfHxpLmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixsPXhfKGksdCksZD1gZ3JhdmV5YXJkLXRhc2staXRlbSR7ZT8iIGdyYXZleWFyZC10YXNrLWl0ZW0tLWRpc21pc3NpbmciOiIifWAsYz1bIkRpc21pc3MiLCJTZW5kIHRvIGEgZmFybSB1cHN0YXRlIiwiUmV0aXJlIiwiTGV0IGdvIiwiRXhpbGUiLCJCdXJ5IiwiU2VuZCBvZmYiLCJSZWxlYXNlIGludG8gdGhlIHdpbGQiLCJQdXQgb3V0IHRvIHBhc3R1cmUiLCJMYXkgdG8gcmVzdCIsIkRlY29tbWlzc2lvbiIsIlJlbGVhc2UgdG8gdGhlIGdyZWF0IGJleW9uZCIsIlNlbmQgdG8gdGhlIGV0ZXJuYWwgcmVzdCIsIkEgc29sZW1uIGZhcmV3ZWxsIiwiUGF5IGEgZmluYWwgdHJpYnV0ZSIsIlNlbmQgdG8gdGhlIGhlcmVhZnRlciJdLHA9Y1tFXyhuLGMubGVuZ3RoKV07cmV0dXJuKDAsTWUuanN4cykoImxpIix7Y2xhc3NOYW1lOmQsY2hpbGRyZW46WygwLE1lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWhlYWRlciIsY2hpbGRyZW46WygwLE1lLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stdGl0bGUtd3JhcCIsY2hpbGRyZW46KDAsTWUuanN4KSh0cyx7Y29udGVudDpOXyhpKSxkZWxheTpbdl8sMF0saW50ZXJhY3RpdmU6ITAsbWF4V2lkdGg6dD8yODA6MzQwLG9uU2hvd246dT0+dW8odT8ucG9wcGVyKSxwbGFjZW1lbnQ6ImJvdHRvbS1zdGFydCIsY2hpbGRyZW46KDAsTWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stdGl0bGUiLGlkOmBncmF2ZXlhcmQtdGl0bGUtJHtpLnV1aWR9YCx0YWJJbmRleDowLGNoaWxkcmVuOnN9KX0pfSksbD8oMCxNZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hZ2UiLGNoaWxkcmVuOmx9KTpudWxsXX0pLCgwLE1lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxNZS5qc3gpKCJhIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hY3Rpb24gZ3JhdmV5YXJkLXRhc2stYWN0aW9uLS1zZW5kIixocmVmOiIjIixvbkNsaWNrOnU9Pnt1LnByZXZlbnREZWZhdWx0KCksbyh1LGkpfSx0aXRsZToiRGlzbWlzcyB0aGlzIHRhc2sgXHUyMDE0IHJlbW92ZXMgaXQgZnJvbSB5b3VyIHRhc2sgZG9tYWluIGFuZCBwbGFjZXMgaXQgaW4gYW4gYXJjaGl2ZWQgbm90ZSB5b3UgY2FuIHJldmlzaXQgbGF0ZXIgaWYgZGVzaXJlZCIsY2hpbGRyZW46YFx1ezFGNUQxfVx1RkUwRiAke3B9YH0pLCgwLE1lLmpzeCkoImEiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWFjdGlvbiBncmF2ZXlhcmQtdGFzay1hY3Rpb24tLWtlZXAiLGhyZWY6IiMiLG9uQ2xpY2s6dT0+e3UucHJldmVudERlZmF1bHQoKSxhKGkpfSx0aXRsZToiUHJlc2VydmUgdGhpcyB0YXNrIFx1MjAxNCByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3Qgd2l0aG91dCBkaXNtaXNzaW5nIGl0IixjaGlsZHJlbjoiXHV7MUY5RjJ9IEtlZXAifSksKDAsTWUuanN4KSgiYSIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stYWN0aW9uIGdyYXZleWFyZC10YXNrLWFjdGlvbi0tbm90ZSIsaHJlZjoiIyIsb25DbGljazp1PT57dS5wcmV2ZW50RGVmYXVsdCgpLHIoaSl9LHRpdGxlOiJPcGVuIHRoZSBub3RlIHdoZXJlIHRoaXMgdGFzayBsaXZlcyIsY2hpbGRyZW46Ilx1ezFGNEQzfSBOb3RlIn0pXX0pXX0pfWZ1bmN0aW9uIEFfKHtkaXNtaXNzaW5nVXVpZHM6ZSxoZWFkZXJBY3Rpb25zOnQsaXNTaW5nbGVDb2x1bW46bixtZWFkb3dPcGFjaXR5OnIsbWVhZG93VXJsOm8sb25PcGVuTm90ZTphLG9uR3JhdmV5YXJkOmksb25LZWVwOnMsdGFza3M6bH0pe3JldHVybigwLE1lLmpzeCkoaWUse2hlYWRlckFjdGlvbnM6dCxpY29uOiJcdXsxRjQ3NX0iLHRpdGxlOmxlKG1vKSx3aWRnZXRJZDptbyxjaGlsZHJlbjooMCxNZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtbWVhZG93LXdyYXBwZXIiLGNoaWxkcmVuOlsoMCxNZS5qc3gpKCJpbWciLHthbHQ6IiIsY2xhc3NOYW1lOiJncmF2ZXlhcmQtbWVhZG93LWJnIixzcmM6byxzdHlsZTp7b3BhY2l0eTpyfX0pLCgwLE1lLmpzeCkoInVsIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1saXN0IixjaGlsZHJlbjpsLm1hcCgoZCxjKT0+KDAsTWUuanN4KShEXyx7aXNEaXNtaXNzaW5nOmUuaGFzKGQudXVpZCksaXNTaW5nbGVDb2x1bW46bix0YXNrSW5kZXg6Yyxvbk9wZW5Ob3RlOmEsb25HcmF2ZXlhcmQ6aSxvbktlZXA6cyx0YXNrOmR9LGQudXVpZCkpfSldfSl9KX1mdW5jdGlvbiBIZih7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLGdyaWRXaWR0aFNpemU6bj0yLHRhc2tEb21haW5VVUlEOnJ9KXtsZXQgbz0odHx8MSkqbV8sYT1OdW1iZXIobik9PT0xLFtpLHNdPSgwLEh0LnVzZVN0YXRlKSgoKT0+bmV3IFNldCksW2wsZF09KDAsSHQudXNlU3RhdGUpKG51bGwpLFtjLHBdPSgwLEh0LnVzZVN0YXRlKSghMCksW3UsZl09KDAsSHQudXNlU3RhdGUpKG51bGwpLHY9KDAsSHQudXNlTWVtbykoKCk9PiQwKCJzbWFsbCIsbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSksW10pLHc9aS5zaXplPjA/MTowLGI9KDAsSHQudXNlQ2FsbGJhY2spKGFzeW5jKEU9e30pPT57bGV0IFQ9ISFFPy5mb3JjZVJlZnJlc2g7aygiW0dyYXZleWFyZF0gbG9hZENhbmRpZGF0ZXMgZmlyZWQsIHRhc2tEb21haW5VVUlEOiIsciwiZm9yY2VSZWZyZXNoOiIsVCksZChudWxsKSxUJiZzKG5ldyBTZXQpLHAoITApO3RyeXtsZXR7Y2FuZGlkYXRlczpEfT1hd2FpdCBMMChlLG8scix7Zm9yY2VSZWZyZXNoOlR9KSxBPUQuZmlsdGVyKF89PiFfLmlzUGFyZW50KS5zbGljZSgwLG8pO2YoQSl9Y2F0Y2goRCl7aygiW0dyYXZleWFyZF0gbG9hZCBmYWlsZWQ6IixEKSxkKEQubWVzc2FnZXx8IkZhaWxlZCB0byBsb2FkIHRhc2tzIil9ZmluYWxseXtwKCExKX19LFtlLG8scl0pOygwLEh0LnVzZUVmZmVjdCkoKCk9PntiKCl9LFtiXSk7bGV0IGc9KDAsSHQudXNlQ2FsbGJhY2spKEU9PntFLnByZXZlbnREZWZhdWx0KCksIWMmJmIoe2ZvcmNlUmVmcmVzaDohMH0pfSxbYixjXSksbT0oMCxIdC51c2VDYWxsYmFjaykoYXN5bmMoRSxUKT0+e1RfKEUpLHMoRD0+e2xldCBBPW5ldyBTZXQoRCk7cmV0dXJuIEEuYWRkKFQudXVpZCksQX0pLGUudXBkYXRlVGFzayhULnV1aWQse2Rpc21pc3NlZEF0Ok1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpfSkuY2F0Y2goRD0+aygiW0dyYXZleWFyZF0gdXBkYXRlVGFzayBmYWlsZWQ6IixEKSksUDAoZSxUKS5jYXRjaChEPT5rKCJbR3JhdmV5YXJkXSBhcHBlbmRUYXNrVG9SZXRpcmVkTm90ZSBmYWlsZWQ6IixEKSksYXQoImRpc21pc3NHcmF2ZXlhcmRUYXNrIil9LFtlXSkseT0oMCxIdC51c2VDYWxsYmFjaykoRT0+e3MoVD0+e2xldCBEPW5ldyBTZXQoVCk7cmV0dXJuIEQuYWRkKEUudXVpZCksRH0pfSxbXSksaD0oMCxIdC51c2VDYWxsYmFjaykoYXN5bmMgRT0+e0U/Lm5vdGVVVUlEJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7RS5ub3RlVVVJRH1gKX0sW2VdKSx4PSgwLE1lLmpzeCkoa18se2lzUmVmcmVzaGluZzpjLG9uUmVmcmVzaDpnfSk7cmV0dXJuIGM/KDAsTWUuanN4KShiXyx7aGVhZGVyQWN0aW9uczp4fSk6bD8oMCxNZS5qc3gpKHdfLHtlcnJvck1lc3NhZ2U6bCxoZWFkZXJBY3Rpb25zOngsb25SZXRyeTpifSk6dT09PW51bGx8fHUubGVuZ3RoPT09MCYmaS5zaXplPT09MD8oMCxNZS5qc3gpKHlfLHtoZWFkZXJBY3Rpb25zOnh9KTooMCxNZS5qc3gpKEFfLHtkaXNtaXNzaW5nVXVpZHM6aSxoZWFkZXJBY3Rpb25zOngsaXNTaW5nbGVDb2x1bW46YSxtZWFkb3dPcGFjaXR5OncsbWVhZG93VXJsOnYsb25PcGVuTm90ZTpoLG9uR3JhdmV5YXJkOm0sb25LZWVwOnksdGFza3M6dX0pfXZhciBIMD1VKHllKCkpO3ZhciBlbj1VKGVlKCkpLEdmPSJsYXlvdXQtcGlja2VyIjthc3luYyBmdW5jdGlvbiBqZih7YXBwOmUsaXNSZXNldDp0LG9uTGF5b3V0UGVyc2lzdDpuLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOnIscHJvZmlsZUlkOm8sc2l6aW5nOmEsd2lkZ2V0SWRzOml9KXthd2FpdCBuKGksdCxhKSxvIT1udWxsPyhlLnNldFNldHRpbmcoai5TRUxFQ1RFRF9MQVlPVVRfUFJPRklMRSxvKSxyKG8pKTpvPT09bnVsbCYmKGUuc2V0U2V0dGluZyhqLlNFTEVDVEVEX0xBWU9VVF9QUk9GSUxFLCIiKSxyKG51bGwpKX1mdW5jdGlvbiBfXyh7cHJvZmlsZTplLG9uQXBwbHk6dCxhcHBseWluZ0lkOm4saXNNYXRjaDpyfSl7bGV0IG89bj09PWUuaWQsYT0hIW4saT1vPyJBcHBseWluZ1x1MjAyNiI6cj8iQXBwbHkiOiJBcHBseSBcdTIwMTQgcmVwbGFjZXMgYWxsIHdpZGdldHMgXHUyMTkyIixzPWBsYXlvdXQtcGlja2VyLXByb2ZpbGUtYnV0dG9uJHtvPyIgbGF5b3V0LXBpY2tlci1wcm9maWxlLWJ1dHRvbi0tYXBwbHlpbmciOiIifSR7cj8iIGxheW91dC1waWNrZXItcHJvZmlsZS1idXR0b24tLWN1cnJlbnQiOiIifWAsbD1gbGF5b3V0LXBpY2tlci1wcm9maWxlLWFjdGlvbiR7cj8iIGxheW91dC1waWNrZXItcHJvZmlsZS1hY3Rpb24tLWN1cnJlbnQiOiIifWA7cmV0dXJuKDAsZW4uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUiLGNoaWxkcmVuOigwLGVuLmpzeHMpKCJidXR0b24iLHtjbGFzc05hbWU6cyxkaXNhYmxlZDphLG9uQ2xpY2s6KCk9PnQoZSksdHlwZToiYnV0dG9uIixjaGlsZHJlbjpbKDAsZW4uanN4cykoImRpdiIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlLWhlYWRlciIsY2hpbGRyZW46WygwLGVuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImxheW91dC1waWNrZXItcHJvZmlsZS1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIixjaGlsZHJlbjplLmljb259KSwoMCxlbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUtbmFtZSIsY2hpbGRyZW46ZS5uYW1lfSksKDAsZW4uanN4KSgic3BhbiIse2NsYXNzTmFtZTpsLGNoaWxkcmVuOml9KV19KSwoMCxlbi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUtZGVzY3JpcHRpb24iLGNoaWxkcmVuOmUuZGVzY3JpcHRpb259KV19KX0pfWZ1bmN0aW9uIFZmKHthcHA6ZSxjdXJyZW50TGF5b3V0OnQsb25MYXlvdXRBcHBseTpuLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOnJ9KXtsZXRbbyxhXT0oMCxIMC51c2VTdGF0ZSkobnVsbCksaT1IYS5tYXAocD0+dmIodCxwKSkscz1pLnNvbWUoQm9vbGVhbiksbD1hc3luYyBwPT57aWYoIW8pe2EocC5pZCk7dHJ5e2xldCB1PXAud2lkZ2V0cy5tYXAodj0+di53aWRnZXRJZCksZj1mcyhwKTthd2FpdCBqZih7YXBwOmUsaXNSZXNldDohMCxvbkxheW91dFBlcnNpc3Q6bixvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpyLHByb2ZpbGVJZDpwLmlkLHNpemluZzpmLHdpZGdldElkczp1fSl9ZmluYWxseXthKG51bGwpfX19O3JldHVybigwLGVuLmpzeHMpKGllLHtoZWFkZXJBY3Rpb25zOigwLGVuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOigpPT57bGV0IHU9KEFycmF5LmlzQXJyYXkodCk/dDpbXSkuZmlsdGVyKGY9PmYud2lkZ2V0SWQhPT1HZikubWFwKGY9PmYud2lkZ2V0SWQpO24odSwhMSxudWxsKX0sY2hpbGRyZW46Ilx1MjcxNSBEaXNtaXNzIn0pLGljb246Ilx1ezFGNUMyfVx1RkUwRiIsdGl0bGU6bGUoR2YpLHdpZGdldElkOkdmLGNoaWxkcmVuOltzP251bGw6KDAsZW4uanN4KSgicCIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci13YXJuaW5nIixjaGlsZHJlbjoiXHUyNkEwXHVGRTBGIENsaWNraW5nIGEgcHJvZmlsZSByZW9yZGVycyBhbGwgZGFzaGJvYXJkIHdpZGdldHMuIn0pLCgwLGVuLmpzeCkoImRpdiIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlcyIsY2hpbGRyZW46SGEubWFwKChwLHUpPT4oMCxlbi5qc3gpKF9fLHtwcm9maWxlOnAsb25BcHBseTpsLGFwcGx5aW5nSWQ6byxpc01hdGNoOmlbdV19LHAuaWQpKX0pXX0pfXZhciBGZT1VKHllKCkpO3ZhciBxbj1VKGVlKCkpLEcwPSJkYXktc2tldGNoIixLZj02LFYwPTIxLENfPTFlNCxPXz0zMDAsdm89QXJyYXkuZnJvbSh7bGVuZ3RoOlYwLUtmKzF9LChlLHQpPT5LZit0KTtmdW5jdGlvbiBLMChlKXtyZXR1cm4gZS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToibG9uZyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyIseWVhcjoibnVtZXJpYyJ9KX1mdW5jdGlvbiBJXyhlKXtyZXR1cm5gRGF5IFNrZXRjaCAke0swKGUpfWB9ZnVuY3Rpb24gTV8oZSl7bGV0IHQ9e30sbj1uZXcgU2V0O2lmKCFlKXJldHVybntlbnRyaWVzOnQsaHVtYW5FZGl0ZWRIb3VyczpufTtmb3IobGV0IHIgb2YgZS5zcGxpdChgCmApKXtsZXQgbz1yLm1hdGNoKC9eaHVtYW4tZWRpdGVkOlxzKihbXGQsXHNdKikvaSk7aWYobyl7b1sxXS5zcGxpdCgiLCIpLmZvckVhY2goZD0+e2xldCBjPXBhcnNlSW50KGQudHJpbSgpLDEwKTtpc05hTihjKXx8bi5hZGQoYyl9KTtjb250aW51ZX1sZXQgYT1yLm1hdGNoKC9eKFxkezEsMn0oPzphbXxwbSkpOlxzKiguKikvaSk7aWYoIWEpY29udGludWU7bGV0IGk9YVsxXS50b0xvd2VyQ2FzZSgpLHM9YVsyXS5yZXBsYWNlKC9cXCskLywiIikudHJpbSgpLGw9Ul8oaSk7bCE9PW51bGwmJnZvLmluY2x1ZGVzKGwpJiYodFtsXT1zKX1yZXR1cm57ZW50cmllczp0LGh1bWFuRWRpdGVkSG91cnM6bn19ZnVuY3Rpb24gUl8oZSl7bGV0IHQ9ZS5tYXRjaCgvXihcZHsxLDJ9KShhbXxwbSkkL2kpO2lmKCF0KXJldHVybiBudWxsO2xldCBuPXBhcnNlSW50KHRbMV0sMTApLHI9dFsyXS50b0xvd2VyQ2FzZSgpO3JldHVybiByPT09ImFtIiYmbj09PTEyP249MDpyPT09InBtIiYmbiE9PTEyJiYobis9MTIpLG59ZnVuY3Rpb24gUF8oZSx0KXtsZXQgbj12by5tYXAocj0+e2xldCBvPSRhKHIpLGE9ZVtyXXx8IiI7cmV0dXJuYCR7b306ICR7YX1gfSk7aWYodC5zaXplPjApe2xldCByPVsuLi50XS5zb3J0KChvLGEpPT5vLWEpO24ucHVzaChgaHVtYW4tZWRpdGVkOiAke3Iuam9pbigiLCIpfWApfXJldHVybiBuLmpvaW4oYApgKX1mdW5jdGlvbiBIZCgpe2xldCBlPXt9O3JldHVybiB2by5mb3JFYWNoKHQ9PntlW3RdPSIifSksZX1mdW5jdGlvbiBqMChlKXtyZXR1cm4gZT9lIGluc3RhbmNlb2YgRGF0ZT9lLmdldFRpbWUoKTp0eXBlb2YgZT09Im51bWJlciI/ZTwxZTEwP2UqMWUzOmU6bnVsbDpudWxsfWZ1bmN0aW9uIExfKGUpe2xldCB0PWowKGU/LnN0YXJ0QXQpO2lmKCF0KXJldHVybltdO2xldCBuPW5ldyBEYXRlKHQpLmdldEhvdXJzKCkscj1bbl0sbz1qMChlPy5lbmRBdCk7aWYoIW98fG88PXQpcmV0dXJuIHI7bGV0IGE9TWF0aC5mbG9vcigoby10KS8oNjAqNjAqMWUzKSk7Zm9yKGxldCBpPTE7aTxhO2krPTEpci5wdXNoKG4raSk7cmV0dXJuIHJ9ZnVuY3Rpb24gVV8oZSl7aWYoIWU/LnN0YXJ0fHwhKGUuc3RhcnQgaW5zdGFuY2VvZiBEYXRlKXx8ZS5hbGxEYXkpcmV0dXJuW107bGV0IHQ9ZS5zdGFydC5nZXRIb3VycygpO2lmKCFlLmVuZHx8IShlLmVuZCBpbnN0YW5jZW9mIERhdGUpfHxlLmVuZDw9ZS5zdGFydClyZXR1cm5bdF07bGV0IG49ZS5lbmQuZ2V0SG91cnMoKSsoZS5lbmQuZ2V0TWludXRlcygpPjA/MTowKSxyPVtdO2ZvcihsZXQgbz10O288bjtvKyspci5wdXNoKG8pO3JldHVybiByLmxlbmd0aD4wP3I6W3RdfWZ1bmN0aW9uIHpfKGUpe2xldCB0PShlPy5jb250ZW50fHwiIikuc3BsaXQoYApgKVswXTtyZXR1cm4gSncodCl9ZnVuY3Rpb24gRl8oZSx0KXtyZXR1cm4gdCE9PW51bGwmJkpTT04uc3RyaW5naWZ5KGUpIT09SlNPTi5zdHJpbmdpZnkodCl9ZnVuY3Rpb24gJF8oZSx0LG4pe2xldCByPXsuLi5lfTtyZXR1cm4gdC5mb3JFYWNoKG89PntsZXQgYT16XyhvKTthJiZMXyhvKS5mb3JFYWNoKGk9Pnt2by5pbmNsdWRlcyhpKSYmIXJbaV0mJiFuLmhhcyhpKSYmKHJbaV09YSl9KX0pLHJ9ZnVuY3Rpb24gV18oZSx0LG4scil7aWYoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gZTtsZXQgbz16ZShuKSxhPXsuLi5lfTtyZXR1cm4gdC5mb3JFYWNoKGk9PnshaT8udGl0bGV8fGkuYWxsRGF5fHwhKGkuc3RhcnQgaW5zdGFuY2VvZiBEYXRlKXx8emUoaS5zdGFydCkhPT1vfHxVXyhpKS5mb3JFYWNoKHM9Pnt2by5pbmNsdWRlcyhzKSYmIWFbc10mJiFyLmhhcyhzKSYmKGFbc109aS50aXRsZSl9KX0pLGF9ZnVuY3Rpb24gQl8oe2FwcDplLG5vdGVOYW1lOnR9KXtsZXRbbixyXT0oMCxGZS51c2VTdGF0ZSkoSGQpLFtvLGFdPSgwLEZlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksW2ksc109KDAsRmUudXNlU3RhdGUpKCEwKSxbbCxkXT0oMCxGZS51c2VTdGF0ZSkobnVsbCksW2MscF09KDAsRmUudXNlU3RhdGUpKG51bGwpLHU9KDAsRmUudXNlUmVmKShudWxsKSxmPSgwLEZlLnVzZVJlZikobiksdj0oMCxGZS51c2VSZWYpKG8pO2YuY3VycmVudD1uLHYuY3VycmVudD1vO2xldCB3PSgwLEZlLnVzZUNhbGxiYWNrKShhc3luYyhtLHkpPT57aWYoIWUpcmV0dXJuO2xldCBoPVBfKG0seSk7dHJ5e2xldCB4PWw7eHx8KHg9KGF3YWl0IGUuZmluZE5vdGUoe25hbWU6dH0pKT8udXVpZHx8YXdhaXQgZS5jcmVhdGVOb3RlKHQsW0llXSx7YXJjaGl2ZTohMH0pLGQoeCkpLGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnh9LGgpLHAoey4uLm19KSxrKGBbRGF5U2tldGNoXSBwZXJzaXN0ZWQgJHt0fWApfWNhdGNoKHgpe2soIltEYXlTa2V0Y2hdIHNhdmUgZmFpbGVkIix4KX19LFtlLHQsbF0pLGI9KDAsRmUudXNlQ2FsbGJhY2spKChtPUNfKT0+e3UuY3VycmVudCYmY2xlYXJUaW1lb3V0KHUuY3VycmVudCksdS5jdXJyZW50PXNldFRpbWVvdXQoKCk9Pnt3KGYuY3VycmVudCx2LmN1cnJlbnQpfSxtKX0sW3ddKSxnPSgwLEZlLnVzZUNhbGxiYWNrKSgoKT0+e3UuY3VycmVudCYmY2xlYXJUaW1lb3V0KHUuY3VycmVudCksdyhmLmN1cnJlbnQsdi5jdXJyZW50KX0sW3ddKTtyZXR1cm4oMCxGZS51c2VFZmZlY3QpKCgpPT57bGV0IG09ITE7cmV0dXJuKGFzeW5jKCk9PntzKCEwKTt0cnl7bGV0IHk9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0fSk7aWYobSlyZXR1cm47aWYoeT8udXVpZCl7ZCh5LnV1aWQpO2xldCBoPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6eS51dWlkfSk7aWYobSlyZXR1cm47bGV0e2VudHJpZXM6eCxodW1hbkVkaXRlZEhvdXJzOkV9PU1fKGgpLFQ9SGQoKTtFLmZvckVhY2goRD0+e3hbRF0hPT12b2lkIDAmJihUW0RdPXhbRF0pfSkscihUKSxhKEUpLHAoey4uLlR9KX1lbHNle2xldCBoPUhkKCk7cihoKSxhKG5ldyBTZXQpLHAoaCl9fWNhdGNoKHkpe2lmKGsoIltEYXlTa2V0Y2hdIGxvYWQgZmFpbGVkIix5KSwhbSl7bGV0IGg9SGQoKTtyKGgpLGEobmV3IFNldCkscChoKX19ZmluYWxseXttfHxzKCExKX19KSgpLCgpPT57bT0hMH19LFtlLHRdKSwoMCxGZS51c2VFZmZlY3QpKCgpPT4oKT0+e3UuY3VycmVudCYmY2xlYXJUaW1lb3V0KHUuY3VycmVudCl9LFtdKSx7ZW50cmllczpuLGh1bWFuRWRpdGVkSG91cnM6byxpc0RpcnR5OkZfKG4sYyksbG9hZGluZzppLHNhdmVOb3c6ZyxzY2hlZHVsZVNhdmU6YixzZXRFbnRyaWVzOnIsc2V0SHVtYW5FZGl0ZWRIb3VyczphfX1mdW5jdGlvbiBIXyh7YWdlbmRhVGFza3M6ZSxjdXJyZW50RGF0ZTp0LGh1bWFuRWRpdGVkSG91cnM6bixsb2FkaW5nOnIsc2V0RW50cmllczpvfSl7KDAsRmUudXNlRWZmZWN0KSgoKT0+e2lmKCFlfHwhdHx8cilyZXR1cm47bGV0IGE9emUodCksaT1lW2FdfHxbXTtpLmxlbmd0aCE9PTAmJm8ocz0+e2xldCBsPSRfKHMsaSxuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobCk9PT1KU09OLnN0cmluZ2lmeShzKT9zOmx9KX0sW2UsdCxuLHIsb10pfWZ1bmN0aW9uIEdfKHtjYWxlbmRhckV2ZW50czplLGN1cnJlbnREYXRlOnQsaHVtYW5FZGl0ZWRIb3VyczpuLGxvYWRpbmc6cixzZXRFbnRyaWVzOm99KXsoMCxGZS51c2VFZmZlY3QpKCgpPT57IWV8fCF0fHxyfHxvKGE9PntsZXQgaT1XXyhhLGUsdCxuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSk9PT1KU09OLnN0cmluZ2lmeShhKT9hOml9KX0sW2UsdCxuLHIsb10pfWZ1bmN0aW9uIGpfKGUsdCl7aWYoIWUpcmV0dXJuIDA7bGV0IG49ZS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ob3VyPSIke3R9Il1gKTtyZXR1cm4gbj9NYXRoLm1heCgwLG4ub2Zmc2V0VG9wLShlLmNsaWVudEhlaWdodC1uLmNsaWVudEhlaWdodCkvMik6MH1mdW5jdGlvbiBWXyh7Y3VycmVudERhdGU6ZSxsb2FkaW5nOnQsbm90ZWJvb2tSZWY6bn0pe2xldCByPSgwLEZlLnVzZVJlZikobnVsbCksbz0oMCxGZS51c2VSZWYpKG51bGwpOygwLEZlLnVzZUVmZmVjdCkoKCk9PntsZXQgYT16ZShlKTtpZighYSlyZXR1cm47aWYodCl7ci5jdXJyZW50PWE7cmV0dXJufWlmKHIuY3VycmVudCE9PWF8fG8uY3VycmVudD09PWEpcmV0dXJuO2xldCBpPXNldFRpbWVvdXQoKCk9PntsZXQgcz1uLmN1cnJlbnQ7aWYoIXMpcmV0dXJuO2xldCBsPU1hdGgubWluKFYwLE1hdGgubWF4KEtmLG5ldyBEYXRlKCkuZ2V0SG91cnMoKSkpO3Muc2Nyb2xsVG9wPWpfKHMsbCksci5jdXJyZW50PW51bGwsby5jdXJyZW50PWF9LDApO3JldHVybigpPT5jbGVhclRpbWVvdXQoaSl9LFtlLHQsbl0pfWZ1bmN0aW9uIEtfKCl7bGV0IGU9KDAsRmUudXNlUmVmKSh7fSksdD0oMCxGZS51c2VDYWxsYmFjaykoKHIsbyk9PntvP2UuY3VycmVudFtyXT1vOmRlbGV0ZSBlLmN1cnJlbnRbcl19LFtdKTtyZXR1cm57aGFuZGxlSW5wdXRLZXlEb3duOigwLEZlLnVzZUNhbGxiYWNrKSgocixvKT0+e2lmKG8ua2V5IT09IkFycm93RG93biImJm8ua2V5IT09IkFycm93VXAiKXJldHVybjtpZihvLnByZXZlbnREZWZhdWx0KCksby5zaGlmdEtleSl7bGV0IHc9by5jdXJyZW50VGFyZ2V0LGI9dy52YWx1ZS5sZW5ndGg7by5rZXk9PT0iQXJyb3dVcCI/dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImJhY2t3YXJkIik6dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImZvcndhcmQiKTtyZXR1cm59bGV0IGE9dm8uaW5kZXhPZihyKTtpZihhPT09LTEpcmV0dXJuO2xldCBpPW8ua2V5PT09IkFycm93RG93biI/MTotMSxzPXZvW2EraV07aWYoIXMpcmV0dXJuO2xldCBsPW8uY3VycmVudFRhcmdldCxkPWUuY3VycmVudFtzXTtpZighZClyZXR1cm47bGV0IGM9bC5zZWxlY3Rpb25TdGFydCxwPWwuc2VsZWN0aW9uRW5kLHU9ZC52YWx1ZS5sZW5ndGgsZj1jPT09bnVsbD91Ok1hdGgubWluKGMsdSksdj1wPT09bnVsbD9mOk1hdGgubWluKHAsdSk7ZC5mb2N1cygpLGQuc2V0U2VsZWN0aW9uUmFuZ2UoZix2KX0sW10pLHNldElucHV0UmVmOnR9fWZ1bmN0aW9uIFlfKHtlbnRyaWVzOmUsaGFuZGxlQmx1cjp0LGhhbmRsZUlucHV0Q2hhbmdlOm4saGFuZGxlSW5wdXRLZXlEb3duOnIsaG91cjpvLHNldElucHV0UmVmOmEsdGltZUZvcm1hdDppfSl7cmV0dXJuKDAscW4uanN4cykoImRpdiIse2NsYXNzTmFtZToiZGF5LXNrZXRjaC1saW5lIiwiZGF0YS1ob3VyIjpvLGNoaWxkcmVuOlsoMCxxbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLWhvdXItbGFiZWwiLGNoaWxkcmVuOiRhKG8saSl9KSwoMCxxbi5qc3gpKCJpbnB1dCIse3R5cGU6InRleHQiLGNsYXNzTmFtZToiZGF5LXNrZXRjaC1pbnB1dCIsdmFsdWU6ZVtvXXx8IiIscmVmOnM9PmEobyxzKSxvbkNoYW5nZTpzPT5uKG8scy50YXJnZXQudmFsdWUpLG9uS2V5RG93bjpzPT5yKG8scyksb25CbHVyOnQscGxhY2Vob2xkZXI6IiIsImFyaWEtbGFiZWwiOmAkeyRhKG8saSl9IGVudHJ5YH0pXX0pfWZ1bmN0aW9uIHFfKHtpc0RpcnR5OmUsb25TYXZlQ2xpY2s6dH0pe3JldHVybigwLHFuLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZTpgZGF5LXNrZXRjaC1zYXZlLWJ0biR7ZT8iIjoiIGRheS1za2V0Y2gtc2F2ZS1idG4tLWRpc2FibGVkIn1gLGRpc2FibGVkOiFlLG9uQ2xpY2s6dCx0aXRsZTplPyJTYXZlIGNoYW5nZXMiOiJObyB1bnNhdmVkIGNoYW5nZXMiLGNoaWxkcmVuOmU/IlNhdmUiOiJTYXZlZCJ9KX1mdW5jdGlvbiBZZih7YWdlbmRhVGFza3M6ZSxhcHA6dCxjYWxlbmRhckV2ZW50czpuLGN1cnJlbnREYXRlOnIsdGltZUZvcm1hdDpvfSl7bGV0IGE9KDAsRmUudXNlUmVmKShudWxsKSxpPWR0KHIpLHM9SV8oaSkse2hhbmRsZUlucHV0S2V5RG93bjpsLHNldElucHV0UmVmOmR9PUtfKCkse2VudHJpZXM6YyxodW1hbkVkaXRlZEhvdXJzOnAsaXNEaXJ0eTp1LGxvYWRpbmc6ZixzYXZlTm93OnYsc2NoZWR1bGVTYXZlOncsc2V0RW50cmllczpiLHNldEh1bWFuRWRpdGVkSG91cnM6Z309Ql8oe2FwcDp0LG5vdGVOYW1lOnN9KTtIXyh7YWdlbmRhVGFza3M6ZSxjdXJyZW50RGF0ZTpyLGh1bWFuRWRpdGVkSG91cnM6cCxsb2FkaW5nOmYsc2V0RW50cmllczpifSksR18oe2NhbGVuZGFyRXZlbnRzOm4sY3VycmVudERhdGU6cixodW1hbkVkaXRlZEhvdXJzOnAsbG9hZGluZzpmLHNldEVudHJpZXM6Yn0pLFZfKHtjdXJyZW50RGF0ZTpyLGxvYWRpbmc6Zixub3RlYm9va1JlZjphfSk7bGV0IG09KDAsRmUudXNlQ2FsbGJhY2spKCgpPT57dyhPXyl9LFt3XSkseT0oMCxGZS51c2VDYWxsYmFjaykoKGgseCk9PntiKEU9Pih7Li4uRSxbaF06eH0pKSxnKEU9Pm5ldyBTZXQoWy4uLkUsaF0pKSx3KCl9LFt3LGIsZ10pO3JldHVybigwLHFuLmpzeCkoaWUse3RpdGxlOmxlKEcwKSxzdWJ0aXRsZTpLMChpKSxpY29uOiJcdXsxRjVEMn1cdUZFMEYiLHdpZGdldElkOkcwLGhlYWRlckFjdGlvbnM6KDAscW4uanN4KShxXyx7aXNEaXJ0eTp1LG9uU2F2ZUNsaWNrOnZ9KSxjaGlsZHJlbjooMCxxbi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtbm90ZWJvb2siLHJlZjphLGNoaWxkcmVuOmY/KDAscW4uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLWxvYWRpbmciLGNoaWxkcmVuOiJMb2FkaW5nXHUyMDI2In0pOnZvLm1hcChoPT4oMCxxbi5qc3gpKFlfLHtlbnRyaWVzOmMsaGFuZGxlQmx1cjptLGhhbmRsZUlucHV0Q2hhbmdlOnksaGFuZGxlSW5wdXRLZXlEb3duOmwsaG91cjpoLHNldElucHV0UmVmOmQsdGltZUZvcm1hdDpvfSxoKSl9KX0pfXZhciBRbz1VKHllKCkpO3ZhciBScj1VKGVlKCkpLFkwPSJkZWJ1Zy1jb25zb2xlIjtmdW5jdGlvbiBRXyhlKXtyZXR1cm4gZS5tYXAodD0+e2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZih0IGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuYCR7dC5uYW1lfTogJHt0Lm1lc3NhZ2V9YDt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfWNhdGNoe3JldHVybiBTdHJpbmcodCl9fSkuam9pbigiICIpfWZ1bmN0aW9uIHFmKCl7bGV0W2UsdF09KDAsUW8udXNlU3RhdGUpKCgpPT5teSgpKSxuPSgwLFFvLnVzZVJlZikobnVsbCk7KDAsUW8udXNlRWZmZWN0KSgoKT0+e2Z1bmN0aW9uIGEoaSl7dChzPT57bGV0IGw9Wy4uLnMsaV07cmV0dXJuIGwubGVuZ3RoPjIwMD9sLnNsaWNlKC0yMDApOmx9KX1yZXR1cm4gdnkoYSksKCk9Pnl5KGEpfSxbXSksKDAsUW8udXNlRWZmZWN0KSgoKT0+e24uY3VycmVudCYmKG4uY3VycmVudC5zY3JvbGxUb3A9bi5jdXJyZW50LnNjcm9sbEhlaWdodCl9LFtlXSk7bGV0IG89KDAsUnIuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkZWJ1Zy1jb25zb2xlX19jbGVhci1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+dChbXSksdGl0bGU6IkNsZWFyIGxvZyBlbnRyaWVzIixjaGlsZHJlbjoiQ2xlYXIifSk7cmV0dXJuKDAsUnIuanN4KShpZSx7dGl0bGU6bGUoWTApLHdpZGdldElkOlkwLGhlYWRlckFjdGlvbnM6byxjaGlsZHJlbjooMCxSci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGUiLHJlZjpuLGNoaWxkcmVuOmUubGVuZ3RoPT09MD8oMCxSci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2VtcHR5IixjaGlsZHJlbjoiTm8gbG9nIG1lc3NhZ2VzIHlldC4gRW5hYmxlIENvbnNvbGUgTG9nZ2luZyBpbiBTZXR0aW5ncyB0byBzdGFydCBjYXB0dXJpbmcgbWVzc2FnZXMuIn0pOmUubWFwKGE9PigwLFJyLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2VudHJ5IixjaGlsZHJlbjpbKDAsUnIuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGVidWctY29uc29sZV9fdGltZXN0YW1wIixjaGlsZHJlbjpuZXcgRGF0ZShhLnRzKS50b0lTT1N0cmluZygpLnNsaWNlKDExLDIzKX0pLCgwLFJyLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX21lc3NhZ2UiLGNoaWxkcmVuOlFfKGEuYXJncyl9KV19LGEuaWQpKX0pfSl9dmFyIHNyPVUoeWUoKSk7ZnVuY3Rpb24gSl8oZSl7bGV0IHQ9e307Zm9yKGxldHtkYXRlS2V5Om4sdGFza3M6cn1vZiBlKXRbbl09cjtyZXR1cm4gdH1mdW5jdGlvbiBRZihlKXtsZXRbdCxuXT0oMCxzci51c2VTdGF0ZSkoe30pLHI9KDAsc3IudXNlUmVmKSghMSksbz0oMCxzci51c2VSZWYpKG51bGwpLGE9KDAsc3IudXNlUmVmKShuZXcgU2V0KSxpPSgwLHNyLnVzZVJlZikobnVsbCkscz0oMCxzci51c2VSZWYpKHt9KSxsPSgwLHNyLnVzZUNhbGxiYWNrKShhc3luYyhkLGMpPT57aS5jdXJyZW50IT09YyYmKGkuY3VycmVudD1jLGEuY3VycmVudD1uZXcgU2V0LHMuY3VycmVudD17fSk7bGV0e2JvdW5kYXJpZXM6cCx3ZWVrU3RhcnRLZXk6dX09a3coZCksZj1gJHt1fTo6JHtjfHwiIn1gO2lmKGEuY3VycmVudC5oYXMoZikpcmV0dXJuIHMuY3VycmVudDtyLmN1cnJlbnQ9ITAsby5jdXJyZW50PW51bGw7dHJ5e2xldCB2PWF3YWl0IFByb21pc2UuYWxsKHAubWFwKGFzeW5jKHtmcm9tOmcsdG86bSxkYXRlS2V5Onl9KT0+e2xldCBoPWF3YWl0IGUuZ2V0Q29tcGxldGVkVGFza3MoZyxtKTtyZXR1cm57ZGF0ZUtleTp5LHRhc2tzOmh8fFtdfX0pKSx3PUpfKHYpLGI9ey4uLnMuY3VycmVudCwuLi53fTtyZXR1cm4gbihiKSxzLmN1cnJlbnQ9YixhLmN1cnJlbnQuYWRkKGYpLGJ9Y2F0Y2godil7cmV0dXJuIGsoInVzZUNvbXBsZXRlZFRhc2tzOiBmYWlsZWQgdG8gZmV0Y2ggY29tcGxldGVkIHRhc2tzIix2KSxvLmN1cnJlbnQ9dixzLmN1cnJlbnR9ZmluYWxseXtyLmN1cnJlbnQ9ITF9fSxbXSk7cmV0dXJue2NvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZ2V0IGxvYWRpbmcoKXtyZXR1cm4gci5jdXJyZW50fSxnZXQgZXJyb3IoKXtyZXR1cm4gby5jdXJyZW50fSxmZXRjaENvbXBsZXRlZFRhc2tzOmx9fXZhciBxMD1VKHllKCkpO2Z1bmN0aW9uIEpmKHtjb25maWdQYXJhbXM6ZX0pe3JldHVybnthY3RpdmVDb21wb25lbnRzOigwLHEwLnVzZU1lbW8pKCgpPT57aWYoIWUpcmV0dXJuW107bGV0IG49ZVtqLkRBU0hCT0FSRF9DT01QT05FTlRTXTtyZXR1cm4gQXJyYXkuaXNBcnJheShuKSYmbi5sZW5ndGg+MD9uOmFvfSxbZV0pfX12YXIgbHI9VSh5ZSgpKTtmdW5jdGlvbiBHZChlKXtyZXR1cm4gZS5zdGFydEF0fHxlLmRlYWRsaW5lfWZ1bmN0aW9uIFhmKGUsdCxuPSgpPT4hMCl7bGV0IHI9e30sbz0wLGE9bmV3IERhdGU7cmV0dXJuIGUuZm9yRWFjaChpPT57aWYobys9MSwhbihpKSlyZXR1cm47bGV0IHM9dChpKTtpZighcylyZXR1cm47bGV0IGw9QW4ocyk7cltsXXx8KHJbbF09W10pLHJbbF0ucHVzaChpKX0pLGsoYEFuYWx5emVkICR7b30gdGFza3MsIGdyb3VwZWQgaW50byAke09iamVjdC5rZXlzKHIpLmxlbmd0aH0gZGF0ZSBrZXlzIGluICR7bmV3IERhdGUtYX1tc2ApLHJ9ZnVuY3Rpb24gUTAoZSl7cmV0dXJuIFhmKGUsR2QsdD0+IXQuY29tcGxldGVkQXQmJiF0LmRpc21pc3NlZEF0KX1mdW5jdGlvbiBKMChlKXtyZXR1cm4gWGYoZSx0PT50LmNvbXBsZXRlZEF0LHQ9PiEhdC5jb21wbGV0ZWRBdCl9ZnVuY3Rpb24gWF8oZSx0KXtsZXQgbj1lLmZpbHRlcihvPT5vPnQpLHI9ZS5maWx0ZXIobz0+bzx0KTtyZXR1cm57dXBjb21pbmdEYXRlS2V5czpuLG9sZGVyRGF0ZUtleXM6cn19ZnVuY3Rpb24gWl8oZSx0KXtsZXQgbj17fTtyZXR1cm4gdC5mb3JFYWNoKHI9PntuW3JdPWVbcl18fFtdfSksbn1mdW5jdGlvbiBaZigpe2xldFtlLHRdPSgwLGxyLnVzZVN0YXRlKShbXSksW24scl09KDAsbHIudXNlU3RhdGUpKG51bGwpLFtvLGFdPSgwLGxyLnVzZVN0YXRlKShudWxsKSxbaSxzXT0oMCxsci51c2VTdGF0ZSkoe30pLFtsLGRdPSgwLGxyLnVzZVN0YXRlKSh7fSksYz1uZXcgRGF0ZSxwPSgwLGxyLnVzZUNhbGxiYWNrKSh2PT57aWYoIXYpcmV0dXJuO3Qodi50YXNrRG9tYWluc3x8W10pLHIodi5hY3RpdmVUYXNrRG9tYWlufHxudWxsKTtsZXQgdz12LnRhc2tzfHxbXTtzKFEwKHcpKSxkKEowKHcpKSxhKERhdGUubm93KCkpfSxbXSksdT0oMCxsci51c2VDYWxsYmFjaykoKHYsdyxiKT0+e2lmKHYmJnQodiksdyYmcih3KSxiKXtsZXQgZz1iLnRhc2tzfHxbXTtzKFEwKGcpKSxkKEowKGcpKSxhKERhdGUubm93KCkpfX0sW10pLGY9KDAsbHIudXNlQ2FsbGJhY2spKHY9PntsZXQgdz12P25ldyBEYXRlKHYpOm5ldyBEYXRlLGI9QW4odyksZz1PYmplY3QudmFsdWVzKGkpLmZsYXQoKSxtPWcuZmlsdGVyKFQ9PiEhKFQuc3RhcnRBdHx8VC5kZWFkbGluZSkpLnNvcnQoKFQsRCk9PkdkKFQpLUdkKEQpKTtrKGBBZ2VuZGEgd2lsbCByZXZpZXdlZCAke2cubGVuZ3RofSBvcGVuIHRhc2tzYCxnLm1hcChUPT4oe2RlYWRsaW5lVGV4dDpULmRlYWRsaW5lP0FuKFQuZGVhZGxpbmUpOiJOL0EiLHN0YXJ0VGV4dDpULnN0YXJ0QXQ/QW4oVC5zdGFydEF0KToiTm9uZSJ9KSkpLGsoYCR7bS5sZW5ndGh9IHJlbGV2YW50IHBlbmRpbmcgdGFza3MgZm91bmQgKHdpdGggc3RhcnRBdClgKTtsZXQgeT1YZihtLEdkKSxoPU9iamVjdC5rZXlzKHkpLnNvcnQoKSx7dXBjb21pbmdEYXRlS2V5czp4fT1YXyhoLGIpLEU9W2IsLi4ueF07cmV0dXJuIFpfKHksRSl9LFtpXSk7cmV0dXJuIGsoYHVzZURvbWFpblRhc2tzIGluaXRpYWxpemVkIHdpdGggYWN0aXZlIGRvbWFpbiAke259IGluICR7bmV3IERhdGUtY31tc2ApLHt0YXNrRG9tYWluczplLGFjdGl2ZVRhc2tEb21haW46bix0YXNrc0ZldGNoZWRBdDpvLG9wZW5UYXNrczppLGNvbXBsZXRlZFRhc2tzOmwsaW5pdGlhbGl6ZURvbWFpblRhc2tzOnAsb25Eb21haW5DaGFuZ2U6dSxidWlsZEFnZW5kYVRhc2tzQnlEYXRlOmZ9fXZhciBpdD1VKHllKCkpO3ZhciBEZT1VKGVlKCkpLGVDPTVlMyxyaz03LHRDPTMsJGU9MjIwLG9rPTE0LGFrPTIsbkM9NCxyQz03OCxvQz00MCxYMD00LGFDPTQ4LGlDPTk1LHNDPTE2LGxDPS4wNCxkQz0xMixjQz0xMixaMD0uNSx1Qz0xLjgscEM9LTQsZkM9NSxlaz0uNyxoQz0zLjMsZ0M9MTgsbUM9MjIsdkM9LTUseUM9MTEsd0M9MTMsYkM9MjYsa0M9MTAseEM9MzAsU0M9NDQsRUM9NSxqZD0xLzMsTkM9MS4zLFRDPVtbMCwiIzI3QUU2MDUwIl0sWy41LCIjRjJDOTRDMjAiXSxbMSwiI0U4NDUzQzA4Il1dLERDPTIsQUM9My41LF9DPTEuMixDQz04LHRrPS4zLE9DPTIsSUM9MSxNQz0xNixSQz0yOCxuaz0uNyxQQz0zLExDPS0xMSxVQz0xNCx6Qz01NixGQz00NiwkQz0xNixXQz04LEJDPTMzLEhDPTEyLEdDPS4yNSxqQz0uNzUsVkM9MjUsS0M9MTIwMCxZQz0xZTMsaWs9MyxWZD1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYzNX1cdTIwMERcdXsxRjRBQn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUZBRTR9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjQyfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2MDB9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjkyOX0iLGxhYmVsOiJHcmVhdCJ9XSxxQz17Ii0yIjoiI0U4NDUzQyIsIi0xIjoiI0YyOTk0QSIsMDoiI0YyQzk0QyIsMToiIzZGQ0Y5NyIsMjoiIzI3QUU2MCJ9LFFDPU9iamVjdC5mcm9tRW50cmllcyhWZC5tYXAoZT0+W2UudmFsdWUsZS5lbW9qaV0pKTtmdW5jdGlvbiBLYShlKXtyZXR1cm4gcUNbTWF0aC5yb3VuZChlKV18fCIjY2NjIn1mdW5jdGlvbiBzayhlKXtyZXR1cm4gUUNbTWF0aC5yb3VuZChlKV18fCJcdTI3NTMifWZ1bmN0aW9uIEpDKGUpe2xldCB0PVZkLmZpbmQobj0+bi52YWx1ZT09PWUpO3JldHVybiB0P3QubGFiZWw6IiJ9ZnVuY3Rpb24gbGsoZSl7aWYoIWUpcmV0dXJuIiI7bGV0e2Z1bGxEYXRlOnQsZW50cmllczpufT1lLHI9W2A8ZGl2IGNsYXNzPSJtb29kLXZpei10b29sdGlwLWRhdGUiPiR7dH08L2Rpdj5gXTtmb3IobGV0IG8gb2Ygbil7bGV0IGE9VmQuZmluZChsPT5sLnZhbHVlPT09by5yYXRpbmcpPy5lbW9qaXx8Ilx1Mjc1MyIsaT1KQyhvLnJhdGluZykscz1gPGRpdiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1lbnRyeSI+PHNwYW4gY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtdGltZSI+JHtvLnRpbWV9PC9zcGFuPjxzcGFuIGNsYXNzPSJtb29kLXZpei10b29sdGlwLW1vb2QiPiR7YX0gPHNwYW4gY2xhc3M9Im1vb2Qtdml6LWxhYmVsIj4ke2l9ICgke28ucmF0aW5nPjA/YCske28ucmF0aW5nfWA6by5yYXRpbmd9KTwvc3Bhbj48L3NwYW4+YDtvLm5vdGVzJiYocys9YDxkaXYgY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtbm90ZSI+JHtvLm5vdGVzfTwvZGl2PmApLHMrPSI8L2Rpdj4iLHIucHVzaChzKX1yZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBYQyhlLHQsbixyKXt0fHxufHxyKGUpfWZ1bmN0aW9uIFpDKGUsdCxuLHIsbyxhLGkpe3Qua2V5PT09IkVudGVyIiYmKHQuY3RybEtleXx8dC5tZXRhS2V5KSYmKHQucHJldmVudERlZmF1bHQoKSxkayhlLG4scixvLGEsaSkpfWFzeW5jIGZ1bmN0aW9uIGRrKGUsdCxuLHIsbyxhKXtyKCEwKSxrKCJSZWNvcmRpbmcgbW9vZCByYXRpbmcgd2l0aCB2YWx1ZToiLHQudmFsdWUpO2xldCBpPWF3YWl0IGUucmVjb3JkTW9vZFJhdGluZyh0LnZhbHVlKTthdCgic3VibWl0TW9vZFJhdGluZyIse3JhdGluZzp0LnZhbHVlfSk7bGV0IHM9bi50cmltKCk7ayhgTW9vZCByYXRpbmcgdXVpZCAke2l9IHJlY2VpdmVkLCB0cmltbWVkIG5vdGVzIHNpemUgJHtzLmxlbmd0aH0gY2hhcmFjdGVyc2ApLHMmJihhd2FpdCBlLnVwZGF0ZU1vb2RSYXRpbmcoaSx7bm90ZTpzfSksayhgTW9vZCByYXRpbmcgdXVpZCAke2l9IHVwZGF0ZWQgd2l0aCBub3Rlc2ApKSxvKCEwKSxhPyhrKCJSZXRyaWV2ZWQgbW9vZCByYXRpbmcgVVVJRDoiLGksImNhbGxpbmcgb25Nb29kUmVjb3JkZWQiKSxhKHtyYXRpbmc6dC52YWx1ZSx0aW1lc3RhbXA6TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyksbm90ZTpzfHxudWxsfSksaygib25Nb29kUmVjb3JkZWQgY2FsbGJhY2sgY29tcGxldGUiKSk6aygib25Nb29kUmVjb3JkZWQgY2FsbGJhY2sgbm90IHByb3ZpZGVkLCBza2lwcGluZyIpLHIoITEpfWZ1bmN0aW9uIGVPKGUpe2xldCB0PShlfHxbXSkuc2xpY2UoLXJrKTtpZighdC5sZW5ndGgpcmV0dXJue3JlY2VudE1vb2RzOnQsYXZlcmFnZU1vb2Q6Ilx1MjAxNCJ9O2xldCBuPSh0LnJlZHVjZSgocixvKT0+citvLnJhdGluZywwKS90Lmxlbmd0aCkudG9GaXhlZCgxKTtyZXR1cm57cmVjZW50TW9vZHM6dCxhdmVyYWdlTW9vZDpufX1mdW5jdGlvbiBjaygpe2xldCBlPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSx0PW49PmUuZ2V0UHJvcGVydHlWYWx1ZShuKS50cmltKCk7cmV0dXJue2JnQ2FyZDp0KCItLWRhc2hib2FyZC1jb2xvci1iZy1jYXJkIiksYmdQYWdlOnQoIi0tZGFzaGJvYXJkLWNvbG9yLWJnLXBhZ2UiKSxib3JkZXI6dCgiLS1kYXNoYm9hcmQtY29sb3ItYm9yZGVyIiksdGV4dFNlY29uZGFyeTp0KCItLWRhc2hib2FyZC1jb2xvci10ZXh0LXNlY29uZGFyeSIpLHRleHRNdXRlZDp0KCItLWRhc2hib2FyZC1jb2xvci10ZXh0LW11dGVkIil9fWZ1bmN0aW9uIGVoKGUsdCl7cmV0dXJuIGUuc3RhcnRzV2l0aCgiIyIpJiZlLmxlbmd0aD09PTc/ZSt0OmV9ZnVuY3Rpb24gdE8oe21vb2REYXRhOmV9KXtsZXQgdD0oMCxpdC51c2VSZWYpKG51bGwpLG49KDAsaXQudXNlUmVmKShudWxsKSxbcixvXT0oMCxpdC51c2VTdGF0ZSkoMCksYT1ucygpLGk9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuKDAsaXQudXNlRWZmZWN0KSgoKT0+e28oMCk7bGV0IGQsYz1udWxsLHA9S0MsdT1mPT57Y3x8KGM9Zik7bGV0IHY9TWF0aC5taW4oKGYtYykvcCwxKSx3PTEtTWF0aC5wb3coMS12LGlrKTtvKHcpLHY8MSYmKGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHUpKX07cmV0dXJuIGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHUpLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShkKX0sW2ldKSwoMCxpdC51c2VFZmZlY3QpKCgpPT57bGV0IGQ9dC5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgYz1kLmdldENvbnRleHQoIjJkIikscD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8YWs7ZC53aWR0aD0kZSpwLGQuaGVpZ2h0PSRlKnAsYy5zY2FsZShwLHApLGMuY2xlYXJSZWN0KDAsMCwkZSwkZSk7bGV0IHU9Y2soKSxmPSRlLzIsdj0kZS8yK25DLHc9ckMsYj1vQztjLmZpbGxTdHlsZT11LmJnQ2FyZCxjLmJlZ2luUGF0aCgpLGMucm91bmRSZWN0KDAsMCwkZSwkZSxvayksYy5maWxsKCksYy5zdHJva2VTdHlsZT1laCh1LmJvcmRlciwiMjgiKSxjLmxpbmVXaWR0aD0xO2ZvcihsZXQgeD1hQzt4PD1pQzt4Kz1zQyljLmJlZ2luUGF0aCgpLGMuYXJjKGYsdix4LDAsTWF0aC5QSSoyKSxjLnN0cm9rZSgpO2xldCBnPWUubWFwKHg9Pih7bGFiZWw6eC5kYXlMYWJlbCxkYXRlTGFiZWw6eC5kYXRlTGFiZWwsdmFsOngucmF0aW5nfSkpLG09TWF0aC5tYXgoZy5sZW5ndGgsMSkseT1NYXRoLlBJKjIvbSxoPWcubGVuZ3RoPjE/bEM6MDtpZihuLmN1cnJlbnQ9e2NlbnRlclg6ZixjZW50ZXJZOnYsaW5uZXJSYWRpdXM6YixvdXRlclJhZGl1czp3LHNlZ21lbnRDb3VudDpnLmxlbmd0aCxzZWdtZW50QW5nbGU6eSxnYXBBbmdsZTpofSxnLmZvckVhY2goKHtsYWJlbDp4LGRhdGVMYWJlbDpFLHZhbDpUfSxEKT0+e2xldCBBPS1NYXRoLlBJLzIrRCp5K2gsXz1BKyh5LWgqMikqcixJPUthKFQpO2Muc2hhZG93Q29sb3I9SSxjLnNoYWRvd0JsdXI9ZEMqcixjLmJlZ2luUGF0aCgpLGMuYXJjKGYsdix3LEEsXyksYy5hcmMoZix2LGIsXyxBLCEwKSxjLmNsb3NlUGF0aCgpO2xldCBNPWMuY3JlYXRlUmFkaWFsR3JhZGllbnQoZix2LGIsZix2LHcpO2lmKE0uYWRkQ29sb3JTdG9wKDAsSSsiOTkiKSxNLmFkZENvbG9yU3RvcCgxLEkrImZmIiksYy5maWxsU3R5bGU9TSxjLmZpbGwoKSxjLnNoYWRvd0JsdXI9MCxyPlowKXtsZXQgUD1BKyh5LWgqMikvMix6PXcrY0MsQj1mK01hdGguY29zKFApKnosVz12K01hdGguc2luKFApKno7Yy5maWxsU3R5bGU9dS50ZXh0U2Vjb25kYXJ5LGMuZ2xvYmFsQWxwaGE9KHItWjApKnVDLGMuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsYy5maWxsVGV4dCh4LEIsVytwQyksYy5mb250PSI3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsU3R5bGU9dS50ZXh0TXV0ZWQsYy5maWxsVGV4dChFLEIsVytmQyksYy5nbG9iYWxBbHBoYT0xfWlmKHI+ZWspe2xldCBQPUErKHktaCoyKS8yLHo9KHcrYikvMixCPWYrTWF0aC5jb3MoUCkqeixXPXYrTWF0aC5zaW4oUCkqejtjLmZvbnQ9IjEzcHggc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGMuZ2xvYmFsQWxwaGE9TWF0aC5taW4oKHItZWspKmhDLDEpLGMuZmlsbFRleHQoc2soVCksQixXKSxjLmdsb2JhbEFscGhhPTF9fSksYy5iZWdpblBhdGgoKSxjLmFyYyhmLHYsYi1YMCwwLE1hdGguUEkqMiksYy5maWxsU3R5bGU9dS5iZ1BhZ2UsYy5maWxsKCksZy5sZW5ndGg+MCl7bGV0IHg9KGcucmVkdWNlKChFLFQpPT5FK1QudmFsLDApL2cubGVuZ3RoKS50b0ZpeGVkKDEpO2MuZmlsbFN0eWxlPUthKE1hdGgucm91bmQoTnVtYmVyKHgpKSksYy5mb250PWBib2xkICR7bUN9cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZmAsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsYy5nbG9iYWxBbHBoYT1yLGMuZmlsbFRleHQoeCxmLHYrdkMpLGMuZmlsbFN0eWxlPXUudGV4dE11dGVkLGMuZm9udD0iYm9sZCA3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsVGV4dCgiNy1EQVkgQVZHIixmLHYreUMpLGMuZ2xvYmFsQWxwaGE9MX1jLmZpbGxTdHlsZT11LnRleHRNdXRlZCxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixjLmZpbGxUZXh0KCJXIEUgRSBLICAgUiBJIE4gRyIsZix3Qyl9LFtpLHJdKSwoMCxEZS5qc3gpKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixsaW5lSGVpZ2h0OjB9LGNoaWxkcmVuOigwLERlLmpzeCkoImNhbnZhcyIse3JlZjp0LGNsYXNzTmFtZToibW9vZC12aXotY2FudmFzIixvbk1vdXNlTW92ZTpkPT57bGV0IGM9bi5jdXJyZW50LHA9dC5jdXJyZW50O2lmKCFjfHwhYy5zZWdtZW50Q291bnR8fCFwKXthLmhpZGUoKTtyZXR1cm59bGV0IHU9cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPShkLmNsaWVudFgtdS5sZWZ0KSooJGUvdS53aWR0aCksdj0oZC5jbGllbnRZLXUudG9wKSooJGUvdS5oZWlnaHQpLHc9Zi1jLmNlbnRlclgsYj12LWMuY2VudGVyWSxnPU1hdGguc3FydCh3KncrYipiKTtpZihnPGMuaW5uZXJSYWRpdXMtWDB8fGc+Yy5vdXRlclJhZGl1cytnQyl7YS5oaWRlKCk7cmV0dXJufWxldCBtPU1hdGguYXRhbjIoYix3KStNYXRoLlBJLzI7bTwwJiYobSs9TWF0aC5QSSoyKTtsZXQgeT1NYXRoLmZsb29yKG0vYy5zZWdtZW50QW5nbGUpO2lmKHk+PTAmJnk8Yy5zZWdtZW50Q291bnQpe2xldCBoPWVbeV0seD11LmxlZnQrZi8kZSp1LndpZHRoLEU9dS50b3Ardi8kZSp1LmhlaWdodDthLnNob3cobGsoe2Z1bGxEYXRlOmguZnVsbERhdGUsZW50cmllczpoLmVudHJpZXN8fFtoXX0pLHgsRSl9ZWxzZSBhLmhpZGUoKX0sb25Nb3VzZUxlYXZlOigpPT5hLmhpZGUoKX0pfSl9ZnVuY3Rpb24gbk8oe21vb2REYXRhOmV9KXtsZXQgdD0oMCxpdC51c2VSZWYpKG51bGwpLG49KDAsaXQudXNlUmVmKShbXSksW3Isb109KDAsaXQudXNlU3RhdGUpKDApLGE9bnMoKSxpPUpTT04uc3RyaW5naWZ5KGUpO3JldHVybigwLGl0LnVzZUVmZmVjdCkoKCk9PntvKDApO2xldCBkLGM9bnVsbCxwPVlDLHU9Zj0+e2N8fChjPWYpO2xldCB2PU1hdGgubWluKChmLWMpL3AsMSk7bygxLU1hdGgucG93KDEtdixpaykpLHY8MSYmKGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHUpKX07cmV0dXJuIGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHUpLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShkKX0sW2ldKSwoMCxpdC51c2VFZmZlY3QpKCgpPT57bGV0IGQ9dC5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgYz1kLmdldENvbnRleHQoIjJkIikscD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8YWs7ZC53aWR0aD0kZSpwLGQuaGVpZ2h0PSRlKnAsYy5zY2FsZShwLHApLGMuY2xlYXJSZWN0KDAsMCwkZSwkZSk7bGV0IHU9Y2soKTtjLmJlZ2luUGF0aCgpLGMucm91bmRSZWN0KDAsMCwkZSwkZSxvayksYy5maWxsU3R5bGU9dS5iZ0NhcmQsYy5maWxsKCk7bGV0IGY9YkMsdj1rQyx3PXhDLGI9U0MsZz0kZS1mLXYsbT0kZS13LWIseT13K207Zm9yKGxldCBBPS0yO0E8PTI7QSsrKXtsZXQgXz13K20tKEErMikvNCptO2Muc3Ryb2tlU3R5bGU9ZWgodS5ib3JkZXIsIjUwIiksYy5saW5lV2lkdGg9MSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKGYsXyksYy5saW5lVG8oJGUtdixfKSxjLnN0cm9rZSgpLGMuZmlsbFN0eWxlPXUudGV4dE11dGVkLGMuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249InJpZ2h0IixjLnRleHRCYXNlbGluZT0ibWlkZGxlIixjLmZpbGxUZXh0KEE+MD9gKyR7QX1gOkEsZi1FQyxfKX1sZXQgaD1lLm1hcChBPT4oe2xhYmVsOkEuZGF5TGFiZWwsZGF0ZUxhYmVsOkEuZGF0ZUxhYmVsLHZhbDpBLnJhdGluZ30pKSx4PShBLF8pPT5fPT09MT9mK2cvMjpfPT09Mj9mK2cqKEE9PT0wP0dDOmpDKTpmK0EvKF8tMSkqZyxFPWgubWFwKChBLF8pPT4oe3g6eChfLGgubGVuZ3RoKSx5OncrbS0oQS52YWwrMikvNCptLHZhbDpBLnZhbCxsYWJlbDpBLmxhYmVsLGRhdGVMYWJlbDpBLmRhdGVMYWJlbH0pKTtuLmN1cnJlbnQ9RTtsZXQgVD1FLm1hcChBPT4oey4uLkEseTp3K20tKEEudmFsKzIpLzQqbSpNYXRoLm1pbihyKk5DLDEpfSkpLEQ9KEEsXyk9PntjLmJlZ2luUGF0aCgpLGMubW92ZVRvKEFbMF0ueCxBWzBdLnkpO2ZvcihsZXQgST0wO0k8QS5sZW5ndGgtMTtJKyspe2xldCBNPUFbSSsxXS54LUFbSV0ueCxQPUFbSV0ueCtNKmpkLHo9QVtJKzFdLngtTSpqZDtjLmJlemllckN1cnZlVG8oUCxBW0ldLnkseixBW0krMV0ueSxBW0krMV0ueCxBW0krMV0ueSl9XyYmKGMubGluZVRvKEFbQS5sZW5ndGgtMV0ueCx5KSxjLmxpbmVUbyhBWzBdLngseSksYy5jbG9zZVBhdGgoKSl9O2lmKFQubGVuZ3RoPj0yKXtsZXQgQT1jLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsdywwLHkpO2ZvcihsZXRbXyxJXW9mIFRDKUEuYWRkQ29sb3JTdG9wKF8sSSk7RChULCEwKSxjLmZpbGxTdHlsZT1BLGMuZmlsbCgpLGMubGluZVdpZHRoPURDLGMubGluZUNhcD0icm91bmQiO2ZvcihsZXQgXz0wO188VC5sZW5ndGgtMTtfKyspe2xldCBJPVRbX10sTT1UW18rMV0sUD1jLmNyZWF0ZUxpbmVhckdyYWRpZW50KEkueCxJLnksTS54LE0ueSk7UC5hZGRDb2xvclN0b3AoMCxLYShJLnZhbCkpLFAuYWRkQ29sb3JTdG9wKDEsS2EoTS52YWwpKSxjLnN0cm9rZVN0eWxlPVAsYy5iZWdpblBhdGgoKTtsZXQgej1NLngtSS54LEI9SS54K3oqamQsVz1NLngteipqZDtjLm1vdmVUbyhJLngsSS55KSxjLmJlemllckN1cnZlVG8oQixJLnksVyxNLnksTS54LE0ueSksYy5zdHJva2UoKX19aWYocj50ayYmVC5mb3JFYWNoKEE9PntsZXQgXz1NYXRoLm1pbigoci10aykqT0MsMSksST1LYShBLnZhbCk7Yy5zaGFkb3dDb2xvcj1JLGMuc2hhZG93Qmx1cj1DQyxjLmJlZ2luUGF0aCgpLGMuYXJjKEEueCxBLnksQUMsMCxNYXRoLlBJKjIpLGMuZmlsbFN0eWxlPUksYy5nbG9iYWxBbHBoYT1fLGMuZmlsbCgpLGMuc2hhZG93Qmx1cj0wLGMuYmVnaW5QYXRoKCksYy5hcmMoQS54LEEueSxfQywwLE1hdGguUEkqMiksYy5maWxsU3R5bGU9dS5iZ0NhcmQsYy5maWxsKCksYy5nbG9iYWxBbHBoYT0xLGMuZmlsbFN0eWxlPXUudGV4dFNlY29uZGFyeSxjLmdsb2JhbEFscGhhPV8qSUMsYy5mb250PSJib2xkIDEwcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGMuZmlsbFRleHQoQS5sYWJlbCxBLngseStNQyksYy5mb250PSI5cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsVGV4dChBLmRhdGVMYWJlbCxBLngseStSQyksYy5nbG9iYWxBbHBoYT0xLHI+bmsmJihjLmdsb2JhbEFscGhhPU1hdGgubWluKChyLW5rKSpQQywxKSxjLmZvbnQ9IjExcHggc2VyaWYiLGMuZmlsbFRleHQoc2soQS52YWwpLEEueCxBLnkrTEMpLGMuZ2xvYmFsQWxwaGE9MSl9KSxjLmZpbGxTdHlsZT11LnRleHRNdXRlZCxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixjLmZpbGxUZXh0KCJNIE8gTyBEICAgVyBBIFYgRSIsJGUvMixVQyksaC5sZW5ndGg+MCl7bGV0IEE9KGgucmVkdWNlKChJLE0pPT5JK00udmFsLDApL2gubGVuZ3RoKS50b0ZpeGVkKDEpLF89S2EoTWF0aC5yb3VuZChOdW1iZXIoQSkpKTtjLmZpbGxTdHlsZT1laChfLCIyMiIpLGMuYmVnaW5QYXRoKCksYy5yb3VuZFJlY3QoJGUtekMsNCxGQywkQyxXQyksYy5maWxsKCksYy5maWxsU3R5bGU9XyxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGMuZmlsbFRleHQoYEF2ZyAke0F9YCwkZS1CQyxIQyl9fSxbaSxyXSksKDAsRGUuanN4KSgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGluZUhlaWdodDowfSxjaGlsZHJlbjooMCxEZS5qc3gpKCJjYW52YXMiLHtyZWY6dCxjbGFzc05hbWU6Im1vb2Qtdml6LWNhbnZhcyIsb25Nb3VzZU1vdmU6ZD0+e2xldCBjPXQuY3VycmVudDtpZighYylyZXR1cm47bGV0IHA9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1PShkLmNsaWVudFgtcC5sZWZ0KSooJGUvcC53aWR0aCksZj0oZC5jbGllbnRZLXAudG9wKSooJGUvcC5oZWlnaHQpLHY9bi5jdXJyZW50O2lmKCF2fHwhdi5sZW5ndGgpe2EuaGlkZSgpO3JldHVybn1sZXQgdz0tMSxiPVZDO2ZvcihsZXQgZz0wO2c8di5sZW5ndGg7ZysrKXtsZXQgbT11LXZbZ10ueCx5PWYtdltnXS55LGg9TWF0aC5zcXJ0KG0qbSt5KnkpO2g8YiYmKGI9aCx3PWcpfWlmKHc+PTApe2xldCBnPXZbd10sbT1lW3ddLHk9cC5sZWZ0K2cueC8kZSpwLndpZHRoLGg9cC50b3ArZy55LyRlKnAuaGVpZ2h0O2Euc2hvdyhsayh7ZnVsbERhdGU6bS5mdWxsRGF0ZSxlbnRyaWVzOm0uZW50cmllc3x8W21dfSkseSxoKX1lbHNlIGEuaGlkZSgpfSxvbk1vdXNlTGVhdmU6KCk9PmEuaGlkZSgpfSl9KX1mdW5jdGlvbiByTyhlKXtsZXQgdD1bIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG49Wy4uLmV8fFtdXS5zb3J0KChhLGkpPT4oYS50aW1lc3RhbXB8fDApLShpLnRpbWVzdGFtcHx8MCkpO2lmKG4ubGVuZ3RoKWNvbnNvbGUubG9nKCJGb3VuZCBleGlzdGluZyByYXRpbmdzIik7ZWxzZSByZXR1cm4gY29uc29sZS5sb2coIk5vIHJhdGluZ3MgZm91bmQsIHJldHVybmluZyBbXSIpLFtdO2xldCByPW5ldyBNYXA7Zm9yKGxldCBhIG9mIG4pe2xldCBpPWEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUscz1gJHtpLmdldEZ1bGxZZWFyKCl9LSR7aS5nZXRNb250aCgpKzF9LSR7aS5nZXREYXRlKCl9YDtyLmhhcyhzKXx8ci5zZXQocyx7ZGF5TGFiZWw6dFtpLmdldERheSgpXSxkYXRlTGFiZWw6YCR7aS5nZXRNb250aCgpKzF9LyR7aS5nZXREYXRlKCl9YCxkYXRlS2V5OnMsZnVsbERhdGU6aS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToibG9uZyIseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KSxlbnRyaWVzOltdLHJhdGluZ1N1bTowLHJhdGluZ0NvdW50OjB9KTtsZXQgbD1yLmdldChzKTtsLmVudHJpZXMucHVzaCh7cmF0aW5nOmEucmF0aW5nLHRpbWU6KGEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUpLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLHtob3VyOiJudW1lcmljIixtaW51dGU6IjItZGlnaXQifSksbm90ZXM6YS5ub3Rlc3x8YS5ub3RlfHxudWxsLHRpbWVzdGFtcDphLnRpbWVzdGFtcH0pLGwucmF0aW5nU3VtKz1hLnJhdGluZyxsLnJhdGluZ0NvdW50Kz0xfXJldHVyblsuLi5yLnZhbHVlcygpXS5zbGljZSgtcmspLm1hcChhPT4oe3JhdGluZzphLnJhdGluZ1N1bS9hLnJhdGluZ0NvdW50LGRheUxhYmVsOmEuZGF5TGFiZWwsZGF0ZUxhYmVsOmEuZGF0ZUxhYmVsLGRhdGVLZXk6YS5kYXRlS2V5LGZ1bGxEYXRlOmEuZnVsbERhdGUsdGltZTphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lLHRpbWVzdGFtcDphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lc3RhbXAsbm90ZXM6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0ubm90ZXMsZW50cmllczphLmVudHJpZXN9KSl9ZnVuY3Rpb24gb08oe21vb2RSYXRpbmdzOmUsYXZlcmFnZU1vb2Q6dCx2aXN1YWxpemF0aW9uTW9kZTpuLHZpc3VhbGl6YXRpb25LZXk6cixvbkNvbmZpZ3VyZTpvfSl7aWYoIShlfHxbXSkubGVuZ3RoKXJldHVybigwLERlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC1zdW1tYXJ5IixjaGlsZHJlbjooMCxEZS5qc3gpKCJzcGFuIix7Y2hpbGRyZW46IkF2ZyBtb29kICg3ZCk6ICIrdH0pfSk7bGV0IGE9ck8oZSk7cmV0dXJuKDAsRGUuanN4cykoImRpdiIse2NsYXNzTmFtZToibW9vZC12aXotc2VjdGlvbiIsY2hpbGRyZW46WygwLERlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC12aXotY2FudmFzLXdyYXAiLGNoaWxkcmVuOm49PT0id2F2ZSI/KDAsRGUuanN4KShuTyx7bW9vZERhdGE6YX0scik6KDAsRGUuanN4KSh0Tyx7bW9vZERhdGE6YX0scil9KSwoMCxEZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZ3VyZS1saW5rIixvbkNsaWNrOm8sY2hpbGRyZW46Ilx1MjY5OSBDb25maWd1cmUifSldfSl9ZnVuY3Rpb24gdGgoe2FwcDplLG1vb2RSYXRpbmdzOnQsb25Nb29kUmVjb3JkZWQ6bn0pe2xldFtyLG9dPSgwLGl0LnVzZVN0YXRlKShudWxsKSxbYSxpXT0oMCxpdC51c2VTdGF0ZSkoIiIpLFtzLGxdPSgwLGl0LnVzZVN0YXRlKSghMSksW2QsY109KDAsaXQudXNlU3RhdGUpKCExKSx1PXRkKFBlKCksIm1vb2QiKVswXXx8InJpbmciLFtmLHZdPSgwLGl0LnVzZVN0YXRlKSh1KSxbdyxiXT0oMCxpdC51c2VTdGF0ZSkodSksW2csbV09KDAsaXQudXNlU3RhdGUpKDApLFt5LGhdPSgwLGl0LnVzZVN0YXRlKSghMSk7KDAsaXQudXNlRWZmZWN0KSgoKT0+e2lmKCFkKXJldHVybjtrKCJTZXR0aW5nIHRpbWVvdXQgdG8gcmVzZXQgbW9vZCBjb21wb25lbnQgYWZ0ZXIgc3VibWlzc2lvbiIpO2xldCBNPXNldFRpbWVvdXQoKCk9PntjKCExKSxvKG51bGwpLGkoIiIpfSxlQyk7cmV0dXJuKCk9PmNsZWFyVGltZW91dChNKX0sW2RdKTtsZXQgeD0oKT0+e2IoZiksaCghMCl9LEU9KCk9Pnt2KHcpLG0oTT0+TSsxKSxoKCExKSxlLnNldFNldHRpbmcoT2EoIm1vb2QiKSxKU09OLnN0cmluZ2lmeShbd10pKX0sVD0oKT0+e2IoZiksaCghMSl9LEQ9KCk9PntvKG51bGwpLGkoIiIpfSx7YXZlcmFnZU1vb2Q6QX09ZU8odCksXz0oMCxEZS5qc3gpKG9PLHttb29kUmF0aW5nczp0LGF2ZXJhZ2VNb29kOkEsdmlzdWFsaXphdGlvbk1vZGU6Zix2aXN1YWxpemF0aW9uS2V5Omcsb25Db25maWd1cmU6eH0pLEk9eT8oMCxEZS5qc3gpKE9yLHt0aXRsZToiTW9vZCBWaXN1YWxpemF0aW9uIixvblN1Ym1pdDpFLG9uQ2FuY2VsOlQsc3VibWl0TGFiZWw6IkFwcGx5IixjaGlsZHJlbjooMCxEZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxEZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkRpc3BsYXkgc3R5bGUifSksW1sicmluZyIsIlJpbmciXSxbIndhdmUiLCJXYXZlIl1dLm1hcCgoW00sUF0pPT4oMCxEZS5qc3hzKSgibGFiZWwiLHtjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZy1vcHRpb24iLGNoaWxkcmVuOlsoMCxEZS5qc3gpKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJtb29kLXZpei1tb2RlIix2YWx1ZTpNLGNoZWNrZWQ6dz09PU0sb25DaGFuZ2U6KCk9PmIoTSl9KSxQXX0sTSkpXX0pfSk6bnVsbDtyZXR1cm4gZD8oMCxEZS5qc3hzKShpZSx7dGl0bGU6bGUoIm1vb2QiKSxpY29uOiJcdXsxRjNBRH0iLHdpZGdldElkOiJtb29kIixjaGlsZHJlbjpbSSwoMCxEZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWNvbmZpcm1hdGlvbiIsY2hpbGRyZW46WygwLERlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC1jb25maXJtYXRpb24taWNvbiIsY2hpbGRyZW46ci5lbW9qaX0pLCgwLERlLmpzeCkoInAiLHtjbGFzc05hbWU6Im1vb2QtY29uZmlybWF0aW9uLXRleHQiLGNoaWxkcmVuOiJNb29kIHJhdGluZyByZWNvcmRlZCJ9KV19KSxfXX0pOigwLERlLmpzeHMpKGllLHt0aXRsZTpsZSgibW9vZCIpLGljb246Ilx1ezFGM0FEfSIsd2lkZ2V0SWQ6Im1vb2QiLGNoaWxkcmVuOltJLCgwLERlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC1zZWxlY3RvciIsY2hpbGRyZW46VmQubWFwKE09PigwLERlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1idG4iKyhyPy52YWx1ZT09PU0udmFsdWU/IiBtb29kLWJ0bi0tc2VsZWN0ZWQiOiIiKSx0aXRsZTpNLmxhYmVsLG9uQ2xpY2s6KCk9PlhDKE0scyxkLG8pLGNoaWxkcmVuOigwLERlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6Im1vb2QtZW1vamkiLGNoaWxkcmVuOk0uZW1vaml9KX0sTS52YWx1ZSkpfSksciE9PW51bGwmJigwLERlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2QtZGV0YWlscyIsY2hpbGRyZW46WygwLERlLmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJtb29kLWRldGFpbHMtbGFiZWwiLGNoaWxkcmVuOiJNb3JlIGRldGFpbHMgKG9wdGlvbmFsKSJ9KSwoMCxEZS5qc3gpKCJ0ZXh0YXJlYSIse2NsYXNzTmFtZToibW9vZC1kZXRhaWxzLXRleHRhcmVhIix2YWx1ZTphLG9uQ2hhbmdlOk09PmkoTS50YXJnZXQudmFsdWUpLG9uS2V5RG93bjpNPT5aQyhlLE0scixhLGwsYyxuKSxwbGFjZWhvbGRlcjoiV2hhdCdzIG9uIHlvdXIgbWluZD8iLHJvd3M6dEN9KV19KSxyIT09bnVsbCYmKDAsRGUuanN4cykoImRpdiIse2NsYXNzTmFtZToibW9vZC1zdWJtaXQtcm93IixjaGlsZHJlbjpbKDAsRGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJtb29kLWNhbmNlbC1idG4iLG9uQ2xpY2s6RCxkaXNhYmxlZDpzLGNoaWxkcmVuOiJDYW5jZWwifSksKDAsRGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJtb29kLXN1Ym1pdC1idG4iLG9uQ2xpY2s6KCk9PmRrKGUscixhLGwsYyxuKSxkaXNhYmxlZDpzLGNoaWxkcmVuOnM/IlJlY29yZGluZy4uLiI6IlN1Ym1pdCJ9KV19KSxyPT09bnVsbCYmX119KX12YXIgR3Q9VSh5ZSgpKTt2YXIgQmU9VShlZSgpKSxLZD0icGVhay1ob3VycyI7ZnVuY3Rpb24gYU8oZSl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDoyNH0sKHQsbik9PiRhKG4sZSkpfWZ1bmN0aW9uIHVrKGUpe3JldHVybiBlP2UgaW5zdGFuY2VvZiBEYXRlP2U6dHlwZW9mIGU9PSJudW1iZXIiP25ldyBEYXRlKGU8MWUxMj9lKjFlMzplKTpuZXcgRGF0ZShlKTpudWxsfWZ1bmN0aW9uIGlPKGUpe2xldCB0PWR0KGUpLG49dC5nZXRGdWxsWWVhcigpLHI9dC5nZXRNb250aCgpLG89bmV3IERhdGUobixyLDEsMCwwLDAsMCksYT1uZXcgRGF0ZShuLHIrMSwxLDAsMCwwLDApO3JldHVybntmcm9tOk1hdGguZmxvb3Ioby5nZXRUaW1lKCkvMWUzKSx0bzpNYXRoLmZsb29yKGEuZ2V0VGltZSgpLzFlMyksbW9udGhLZXk6YCR7bn0tJHtTdHJpbmcocisxKS5wYWRTdGFydCgyLCIwIil9YH19ZnVuY3Rpb24gc08oZSl7bGV0IHQ9bmV3IEFycmF5KDI0KS5maWxsKDApLG49bmV3IEFycmF5KDI0KS5maWxsKDApLHI9MDtmb3IobGV0IGkgb2YgZSl7bGV0IHM9aS52aWN0b3J5VmFsdWV8fDEsbD11ayhpLmNyZWF0ZWRBdHx8aS5zdGFydEF0KTtsJiYhaXNOYU4obCkmJih0W2wuZ2V0SG91cnMoKV0rPXMscisrKTtsZXQgZD11ayhpLmNvbXBsZXRlZEF0KTtkJiYhaXNOYU4oZCkmJihuW2QuZ2V0SG91cnMoKV0rPXMpfWxldCBvPXQuaW5kZXhPZihNYXRoLm1heCguLi50KSksYT1uLmluZGV4T2YoTWF0aC5tYXgoLi4ubikpO3JldHVybntjb21wbGV0ZWRCeUhvdXI6bixjcmVhdGVkQnlIb3VyOnQscGVha0NvbXBsZXRlSG91ckluZGV4OmEscGVha0NyZWF0ZUhvdXJJbmRleDpvLHRvdGFsVGFza3M6cn19ZnVuY3Rpb24gbE8oZSl7bGV0IHQ9Z2V0Q29tcHV0ZWRTdHlsZShlKTtyZXR1cm57YmFyQ3JlYXRlZDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWJsdWUiKS50cmltKCl8fCIjNWI3YmJmIixiYXJDb21wbGV0ZWQ6dC5nZXRQcm9wZXJ0eVZhbHVlKCItLWRhc2hib2FyZC1jb2xvci1hY2NlbnQiKS50cmltKCl8fCIjZTg4NTNkIixheGlzVGV4dDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtc2Vjb25kYXJ5IikudHJpbSgpfHwiIzdhODY5OSIsZ3JpZExpbmU6dC5nZXRQcm9wZXJ0eVZhbHVlKCItLWRhc2hib2FyZC1jb2xvci1ib3JkZXIiKS50cmltKCl8fCIjZDhkZGU2In19ZnVuY3Rpb24gcGsoZSx0LG4scil7bGV0IG89ZS5nZXRDb250ZXh0KCIyZCIpLGE9d2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsaT1lLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1pLndpZHRoLGw9aS5oZWlnaHQ7aWYoczw9MHx8bDw9MClyZXR1cm47ZS53aWR0aD1zKmEsZS5oZWlnaHQ9bCphLGUuc3R5bGUud2lkdGg9YCR7c31weGAsZS5zdHlsZS5oZWlnaHQ9YCR7bH1weGAsby5zY2FsZShhLGEpO2xldCBkPWxPKGUpLGM9NDgscD0xMix1PTEyLGY9NDAsdj1zLWMtcCx3PWwtdS1mLGI9TWF0aC5tYXgoLi4udCwuLi5uLDEpLGc9TWF0aC5jZWlsKGIvMTApKjEwfHwxMDtvLmNsZWFyUmVjdCgwLDAscyxsKTtsZXQgbT01O28uZm9udD0iMTFweCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiIsby50ZXh0QWxpZ249InJpZ2h0IixvLnRleHRCYXNlbGluZT0ibWlkZGxlIjtmb3IobGV0IEQ9MDtEPD1tO0QrKyl7bGV0IEE9TWF0aC5yb3VuZChnL20qRCksXz11K3ctdypEL207by5maWxsU3R5bGU9ZC5heGlzVGV4dCxvLmZpbGxUZXh0KGAke0F9YCxjLTgsXyksRD4wJiYoby5zdHJva2VTdHlsZT1kLmdyaWRMaW5lLG8uZ2xvYmFsQWxwaGE9LjQsby5saW5lV2lkdGg9LjUsby5iZWdpblBhdGgoKSxvLm1vdmVUbyhjLF8pLG8ubGluZVRvKGMrdixfKSxvLnN0cm9rZSgpLG8uZ2xvYmFsQWxwaGE9MSl9bGV0IHk9MjQsaD12L3kseD1oKi4zMixFPWgqLjA0O2ZvcihsZXQgRD0wO0Q8eTtEKyspe2xldCBBPWMrRCpoKyhoLXgqMi1FKS8yLF89dFtEXS9nKncsST1uW0RdL2cqdztvLmZpbGxTdHlsZT1kLmJhckNyZWF0ZWQsZmsobyxBLHUrdy1fLHgsXywyKSxvLmZpbGxTdHlsZT1kLmJhckNvbXBsZXRlZCxmayhvLEEreCtFLHUrdy1JLHgsSSwyKX1vLmZpbGxTdHlsZT1kLmF4aXNUZXh0LG8uZm9udD0iMTBweCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiIsby50ZXh0QWxpZ249ImNlbnRlciIsby50ZXh0QmFzZWxpbmU9InRvcCI7bGV0IFQ9djwzMDA/NDoyO2ZvcihsZXQgRD0wO0Q8eTtEKz1UKXtsZXQgQT1jK0QqaCtoLzI7by5maWxsVGV4dChyW0RdLEEsdSt3KzgpfX1mdW5jdGlvbiBmayhlLHQsbixyLG8sYSl7bzwxfHwoYT1NYXRoLm1pbihhLG8vMixyLzIpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odCthLG4pLGUubGluZVRvKHQrci1hLG4pLGUuYXJjVG8odCtyLG4sdCtyLG4rYSxhKSxlLmxpbmVUbyh0K3IsbitvKSxlLmxpbmVUbyh0LG4rbyksZS5saW5lVG8odCxuK2EpLGUuYXJjVG8odCxuLHQrYSxuLGEpLGUuY2xvc2VQYXRoKCksZS5maWxsKCkpfWZ1bmN0aW9uIGRPKGUsdCl7bGV0IG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXQuY2xpZW50WC1uLmxlZnQsbz1uLndpZHRoLGE9NDgscz1vLWEtMTIsbD1yLWE7cmV0dXJuIGw8MHx8bD5zPy0xOk1hdGguZmxvb3IobC9zKjI0KX1mdW5jdGlvbiBuaCh7bGFiZWw6ZSx2YWx1ZTp0fSl7cmV0dXJuKDAsQmUuanN4cykoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtY2FyZCIsY2hpbGRyZW46WygwLEJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtbGFiZWwiLGNoaWxkcmVuOmV9KSwoMCxCZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbWV0cmljLXZhbHVlIixjaGlsZHJlbjp0fSldfSl9ZnVuY3Rpb24gaGsoe21vZGlmaWVyQ2xhc3M6ZSxsYWJlbDp0fSl7cmV0dXJuKDAsQmUuanN4cykoInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kLWl0ZW0iLGNoaWxkcmVuOlsoMCxCZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOmBwZWFrLWhvdXJzLWxlZ2VuZC1zd2F0Y2ggJHtlfWB9KSx0XX0pfWZ1bmN0aW9uIHJoKHthcHA6ZSxjdXJyZW50RGF0ZTp0LHNlbGVjdGVkRGF0ZTpuLHRpbWVGb3JtYXQ6cn0pe2xldCBvPSgwLEd0LnVzZVJlZikobnVsbCksW2EsaV09KDAsR3QudXNlU3RhdGUpKG51bGwpLFtzLGxdPSgwLEd0LnVzZVN0YXRlKShbXSksZD0oMCxHdC51c2VSZWYpKG51bGwpLGM9bnx8dDsoMCxHdC51c2VFZmZlY3QpKCgpPT57aWYoIWN8fCFlKXJldHVybjtsZXR7ZnJvbTpULHRvOkQsbW9udGhLZXk6QX09aU8oYyk7aWYoZC5jdXJyZW50PT09QSlyZXR1cm47ZC5jdXJyZW50PUE7bGV0IF89ITE7cmV0dXJuIGUuZ2V0Q29tcGxldGVkVGFza3MoVCxEKS50aGVuKEk9PntffHxsKEFycmF5LmlzQXJyYXkoSSk/STpbXSl9KS5jYXRjaChJPT57aygiW3BlYWstaG91cnNdIGZhaWxlZCB0byBmZXRjaCBtb250aCB0YXNrcyIsSSksX3x8bChbXSl9KSwoKT0+e189ITB9fSxbZSxjXSk7bGV0IHA9YU8ocikse2NvbXBsZXRlZEJ5SG91cjp1LGNyZWF0ZWRCeUhvdXI6ZixwZWFrQ29tcGxldGVIb3VySW5kZXg6dixwZWFrQ3JlYXRlSG91ckluZGV4OncsdG90YWxUYXNrczpifT0oMCxHdC51c2VNZW1vKSgoKT0+c08ocyksW3NdKSxnPXBbd10sbT1wW3ZdLHttb250aFN1YnRpdGxlOnksZGF0ZVJhbmdlOmh9PSgwLEd0LnVzZU1lbW8pKCgpPT57aWYoIWMpcmV0dXJue21vbnRoU3VidGl0bGU6bnVsbCxkYXRlUmFuZ2U6bnVsbH07bGV0IFQ9ZHQoYyksRD1ULmdldEZ1bGxZZWFyKCksQT1ULmdldE1vbnRoKCk7cmV0dXJue21vbnRoU3VidGl0bGU6VC50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxkYXRlUmFuZ2U6e3N0YXJ0Om5ldyBEYXRlKEQsQSwxKSxlbmQ6bmV3IERhdGUoRCxBKzEsMCl9fX0sW2NdKTsoMCxHdC51c2VFZmZlY3QpKCgpPT57aWYoIW8uY3VycmVudClyZXR1cm47cGsoby5jdXJyZW50LGYsdSxwKTtsZXQgVD0oKT0+e28uY3VycmVudCYmcGsoby5jdXJyZW50LGYsdSxwKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLFQpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixUKX0sW3UsZixwXSk7bGV0IHg9KDAsR3QudXNlQ2FsbGJhY2spKFQ9PntsZXQgRD1kTyhvLmN1cnJlbnQsVCk7aWYoRDwwfHxEPjIzKXtpKG51bGwpO3JldHVybn1sZXQgQT1vLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aSh7eDpULmNsaWVudFgtQS5sZWZ0LHk6VC5jbGllbnRZLUEudG9wLTYwLGhvdXI6cFtEXSxjcmVhdGVkOmZbRF0sY29tcGxldGVkOnVbRF19KX0sW2YsdV0pLEU9KDAsR3QudXNlQ2FsbGJhY2spKCgpPT5pKG51bGwpLFtdKTtyZXR1cm4gYj09PTA/KDAsQmUuanN4KShpZSx7dGl0bGU6bGUoS2QpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6S2Qsc3VidGl0bGU6eSxjaGlsZHJlbjooMCxCZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtZW1wdHkiLGNoaWxkcmVuOigwLEJlLmpzeCkoInAiLHtjaGlsZHJlbjoiTm8gY29tcGxldGVkIHRhc2sgZGF0YSBhdmFpbGFibGUgeWV0LiJ9KX0pfSk6KDAsQmUuanN4cykoaWUse3RpdGxlOmxlKEtkKSxpY29uOiJcdTIzRjAiLHdpZGdldElkOktkLHN1YnRpdGxlOnksY2hpbGRyZW46WygwLEJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbWV0cmljcy1ncmlkIixjaGlsZHJlbjpbKDAsQmUuanN4KShuaCx7bGFiZWw6IlRhc2tzIGFuYWx5emVkIix2YWx1ZTpifSksKDAsQmUuanN4KShuaCx7bGFiZWw6IlBlYWsgY3JlYXRlIGhvdXIiLHZhbHVlOmd9KSwoMCxCZS5qc3gpKG5oLHtsYWJlbDoiUGVhayBjb21wbGV0ZSBob3VyIix2YWx1ZTptfSldfSksKDAsQmUuanN4cykoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1sZWdlbmQiLGNoaWxkcmVuOlsoMCxCZS5qc3gpKGhrLHttb2RpZmllckNsYXNzOiJwZWFrLWhvdXJzLWxlZ2VuZC1zd2F0Y2gtLWNyZWF0ZWQiLGxhYmVsOiJDcmVhdGVkIHZhbHVlIn0pLCgwLEJlLmpzeCkoaGsse21vZGlmaWVyQ2xhc3M6InBlYWstaG91cnMtbGVnZW5kLXN3YXRjaC0tY29tcGxldGVkIixsYWJlbDoiQ29tcGxldGVkIHZhbHVlIn0pXX0pLCgwLEJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtY2hhcnQtY29udGFpbmVyIixjaGlsZHJlbjpbKDAsQmUuanN4KSgiY2FudmFzIix7cmVmOm8sY2xhc3NOYW1lOiJwZWFrLWhvdXJzLWNhbnZhcyIsb25Nb3VzZU1vdmU6eCxvbk1vdXNlTGVhdmU6RX0pLGEmJigwLEJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcCIsc3R5bGU6e2xlZnQ6YS54LHRvcDphLnksdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC01MCUpIn0sY2hpbGRyZW46WygwLEJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLWhlYWRlciIsY2hpbGRyZW46YS5ob3VyfSksKDAsQmUuanN4cykoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLXJvdyIsY2hpbGRyZW46WygwLEJlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1sYWJlbCBwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwtLWNyZWF0ZWQiLGNoaWxkcmVuOiJDcmVhdGVkOiJ9KSxgICR7YS5jcmVhdGVkfSBwdHNgXX0pLCgwLEJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1yb3ciLGNoaWxkcmVuOlsoMCxCZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwgcGVhay1ob3Vycy10b29sdGlwLWxhYmVsLS1jb21wbGV0ZWQiLGNoaWxkcmVuOiJDb21wbGV0ZWQ6In0pLGAgJHthLmNvbXBsZXRlZH0gcHRzYF19KV19KV19KSxoJiYoMCxCZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtZm9vdGVyIixjaGlsZHJlbjp5fSldfSl9dmFyIE90PXtESVNNSVNTRUQ6ImRpc21pc3NlZCIsUEVORElORzoicGVuZGluZyIsU0NIRURVTEVEOiJzY2hlZHVsZWQifSxjTz0iRGFzaGJvYXJkIFByb3Bvc2VkIFRhc2tzIjtmdW5jdGlvbiB1TyhlKXtsZXQgdD1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpO3JldHVybmAke2lvW3QuZ2V0TW9udGgoKV19ICR7dC5nZXRGdWxsWWVhcigpfSAke2NPfWB9ZnVuY3Rpb24gWWEoZSl7cmV0dXJuYCR7ZS5zdGFydE1pbnV0ZXN9Ojoke2UudGFza1V1aWR8fGUudGl0bGV9YH1mdW5jdGlvbiBvaChlLHtkYXRlS2V5OnQscHJpb3JpdHlLZXk6bixwcm92aWRlckVtOnJ9KXtyZXR1cm4gZS5kYXRlS2V5PT09dCYmZS5wcmlvcml0eUtleT09PW4mJmUucHJvdmlkZXJFbT09PXJ9ZnVuY3Rpb24gcE8oZSl7cmV0dXJue2R1cmF0aW9uTWludXRlczplLmR1cmF0aW9uTWludXRlc3x8MCxpc0V4aXN0aW5nOiEhZS5pc0V4aXN0aW5nLG5vdGVVdWlkOmUubm90ZVV1aWR8fG51bGwscmVhc29uOmUucmVhc29ufHwiIixzY2hlZHVsZWRFbTplLnNjaGVkdWxlZEVtfHxPdC5QRU5ESU5HLHN0YXJ0TWludXRlczplLnN0YXJ0TWludXRlcyx0YXJnZXRNaWRuaWdodFNlY29uZHM6ZS50YXJnZXRNaWRuaWdodFNlY29uZHM/P251bGwsdGFza1V1aWQ6ZS50YXNrVXVpZHx8bnVsbCx0aW1lOmUuc3RhcnRUaW1lLHRpdGxlOmUudGl0bGV9fWZ1bmN0aW9uIGZPKGUpe3JldHVybntkdXJhdGlvbk1pbnV0ZXM6ZS5kdXJhdGlvbk1pbnV0ZXN8fDAsaXNFeGlzdGluZzohIWUuaXNFeGlzdGluZyxub3RlVXVpZDplLm5vdGVVdWlkfHxudWxsLHJlYXNvbjplLnJlYXNvbnx8IiIsc2NoZWR1bGVkRW06ZS5zY2hlZHVsZWRFbXx8T3QuUEVORElORyxzb3VyY2U6InByb3Bvc2VkIixzdGFydE1pbnV0ZXM6ZS5zdGFydE1pbnV0ZXMsc3RhcnRUaW1lOmUudGltZSx0YXJnZXRNaWRuaWdodFNlY29uZHM6ZS50YXJnZXRNaWRuaWdodFNlY29uZHM/P251bGwsdGFza1V1aWQ6ZS50YXNrVXVpZHx8bnVsbCx0aXRsZTplLnRpdGxlfX1mdW5jdGlvbiBoTyhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybntyZWNvcmRzOltdfTtsZXQgdD1lLm1hdGNoKC9gYGBqc29uXHMqKFtcc1xTXSo/KWBgYC9pKSxuPXQ/dFsxXTplO3RyeXtsZXQgcj1KU09OLnBhcnNlKG4pO3JldHVybntyZWNvcmRzOkFycmF5LmlzQXJyYXkocj8ucmVjb3Jkcyk/ci5yZWNvcmRzOltdfX1jYXRjaHtyZXR1cm57cmVjb3JkczpbXX19fWZ1bmN0aW9uIGFoKGUsdCl7cmV0dXJuW2AjIFByb3Bvc2VkIGFnZW5kYSByZWNvcmRzIGZvciAke3R9YCwiIiwiVGhpcyBhcmNoaXZlZCBub3RlIGlzIG1haW50YWluZWQgYnkgdGhlIGRhc2hib2FyZCBwbHVnaW4uIEVhY2ggcmVjb3JkIGJlbG93IGNhcHR1cmVzIHdoaWNoIHRhc2tzIHRoZSBQcm9wb3NlZCBBZ2VuZGEgd2lkZ2V0IHJlY29tbWVuZGVkIGZvciBhIGdpdmVuIGRhdGUsIHByaW9yaXR5LCBhbmQgQUkgcHJvdmlkZXIgXHUyMDE0IGFuZCB3aGF0IGJlY2FtZSBvZiBlYWNoLiIsIiIsImBgYGpzb24iLEpTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSwiYGBgIiwiIl0uam9pbihgCmApfWFzeW5jIGZ1bmN0aW9uIGloKGUsdCl7bGV0IG49dU8odCkscj1gJHtpb1t0LmdldE1vbnRoKCldfSAke3QuZ2V0RnVsbFllYXIoKX1gLG89YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpuLHRhZ3M6W0llXX0pLmNhdGNoKCgpPT5udWxsKTtpZihvPy51dWlkKXtsZXQgcz1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOm8udXVpZH0pLmNhdGNoKCgpPT4iIik7cmV0dXJue21vbnRoTGFiZWw6cixub3RlSGFuZGxlOm8sc3RhdGU6aE8ocyl9fWxldCBhPWF3YWl0IGUuY3JlYXRlTm90ZShuLFtJZV0se2FyY2hpdmU6ITB9KTtvPXtuYW1lOm4sdXVpZDp0eXBlb2YgYT09Im9iamVjdCI/YS51dWlkOmF9O2xldCBpPXtyZWNvcmRzOltdfTtyZXR1cm4gYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQobyxhaChpLHIpKS5jYXRjaChzPT5rKCJbcHJvcG9zZWQtYWdlbmRhLWFyY2hpdmVdIGZhaWxlZCB0byBpbml0aWFsaXplIG5vdGU6IixzKSksayhgW3Byb3Bvc2VkLWFnZW5kYS1hcmNoaXZlXSBjcmVhdGVkIG1vbnRobHkgbm90ZSAiJHtufSIgdXVpZCAke28udXVpZH1gKSx7bW9udGhMYWJlbDpyLG5vdGVIYW5kbGU6byxzdGF0ZTppfX1hc3luYyBmdW5jdGlvbiBnayhlLHtkYXRlOnQscHJpb3JpdHlLZXk6bixwcm92aWRlckVtOnJ9KXtsZXQgbz17ZGF0ZUtleTp6ZSh0KSxwcmlvcml0eUtleTpuLHByb3ZpZGVyRW06cn0se3N0YXRlOmF9PWF3YWl0IGloKGUsdCksaT1hLnJlY29yZHMuZmluZChjPT5vaChjLG8pKTtpZighaXx8IUFycmF5LmlzQXJyYXkoaS5wcm9wb3NlZFRhc2tzKXx8aS5wcm9wb3NlZFRhc2tzLmxlbmd0aD09PTApcmV0dXJuIG51bGw7bGV0IHM9aS5wcm9wb3NlZFRhc2tzLm1hcChmTyksbD1pLnByb3Bvc2VkVGFza3MuZmlsdGVyKGM9PmMuc2NoZWR1bGVkRW09PT1PdC5TQ0hFRFVMRUQpLm1hcChZYSksZD1pLnByb3Bvc2VkVGFza3MuZmlsdGVyKGM9PmMuc2NoZWR1bGVkRW09PT1PdC5ESVNNSVNTRUQpLm1hcChZYSk7cmV0dXJuIGsoIltwcm9wb3NlZC1hZ2VuZGEtYXJjaGl2ZV0gY2FjaGUgaGl0Iix7Li4ubyx0YXNrQ291bnQ6cy5sZW5ndGh9KSx7YWN0aXZpdGllczpzLGRpc21pc3NlZEtleXM6ZCxsbG1BdHRyaWJ1dGlvbkZvb3RlcjppLmxsbUF0dHJpYnV0aW9uRm9vdGVyfHxudWxsLHNjaGVkdWxlZEtleXM6bH19YXN5bmMgZnVuY3Rpb24gc2goZSx7YWN0aXZpdGllczp0LGRhdGU6bixsbG1BdHRyaWJ1dGlvbkZvb3RlcjpyPW51bGwscHJpb3JpdHlLZXk6byxwcm92aWRlckVtOmF9KXtsZXQgaT17ZGF0ZUtleTp6ZShuKSxwcmlvcml0eUtleTpvLHByb3ZpZGVyRW06YX0se21vbnRoTGFiZWw6cyxub3RlSGFuZGxlOmwsc3RhdGU6ZH09YXdhaXQgaWgoZSxuKSxjPXsuLi5pLGxsbUF0dHJpYnV0aW9uRm9vdGVyOnIscHJvcG9zZWRUYXNrczoodHx8W10pLm1hcChwTyl9LHA9W2MsLi4uZC5yZWNvcmRzLmZpbHRlcih1PT4hb2godSxpKSldO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KGwsYWgoe3JlY29yZHM6cH0scykpLGsoIltwcm9wb3NlZC1hZ2VuZGEtYXJjaGl2ZV0gc3RvcmVkIHJlY29yZCIsey4uLmksdGFza0NvdW50OmMucHJvcG9zZWRUYXNrcy5sZW5ndGh9KX1hc3luYyBmdW5jdGlvbiBtayhlLHthY3Rpdml0eUtleXM6dCxkYXRlOm4scHJpb3JpdHlLZXk6cixwcm92aWRlckVtOm8sc2NoZWR1bGVkRW06YX0pe2xldCBpPW5ldyBTZXQodHx8W10pO2lmKGkuc2l6ZT09PTApcmV0dXJuO2xldCBzPXtkYXRlS2V5OnplKG4pLHByaW9yaXR5S2V5OnIscHJvdmlkZXJFbTpvfSx7bW9udGhMYWJlbDpsLG5vdGVIYW5kbGU6ZCxzdGF0ZTpjfT1hd2FpdCBpaChlLG4pLHA9Yy5yZWNvcmRzLmZpbmQoZj0+b2goZixzKSk7aWYoIXB8fCFBcnJheS5pc0FycmF5KHAucHJvcG9zZWRUYXNrcykpcmV0dXJuO2xldCB1PSExO3AucHJvcG9zZWRUYXNrcz1wLnByb3Bvc2VkVGFza3MubWFwKGY9PiFpLmhhcyhZYShmKSl8fGYuc2NoZWR1bGVkRW09PT1hP2Y6KHU9ITAsey4uLmYsc2NoZWR1bGVkRW06YX0pKSx1JiYoYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoZCxhaChjLGwpKSxrKCJbcHJvcG9zZWQtYWdlbmRhLWFyY2hpdmVdIHVwZGF0ZWQgc3RhdHVzZXMiLHsuLi5zLHNjaGVkdWxlZEVtOmEsY291bnQ6aS5zaXplfSkpfXZhciBrcz1be2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHRoYXQgZGlyZWN0bHkgYWR2YW5jZSB0aGUgdXNlcidzIHF1YXJ0ZXJseSBwbGFuIGFuZCBzdGF0ZWQgZ29hbHMuIFNlcXVlbmNlIHRoZSBoaWdoZXN0LWxldmVyYWdlIGdvYWwgd29yayBpbnRvIHRoZSBtb3N0IHByb2R1Y3RpdmUgcGFydHMgb2YgdGhlIGRheSBzbyBtZWFzdXJhYmxlIHByb2dyZXNzIGlzIG1hZGUuIixrZXk6ImdvYWwtcHJvZ3Jlc3MiLGxhYmVsOiJHb2FsIHByb2dyZXNzIn0se2Jhcm5hY2xlOiEwLGluc3RydWN0aW9uOiJQcmlvcml0aXplICdiYXJuYWNsZScgdGFza3MgXHUyMDE0IHRhc2tzIHRoYXQgaGF2ZSBsaW5nZXJlZCBvbiB0aGUgdG8tZG8gbGlzdCBmb3IgYW4gdW51c3VhbGx5IGxvbmcgdGltZS4gU3Ryb25nbHkgcHJlZmVyIHRhc2tzIGRyYXduIGZyb20gbm90ZXMgdGhhdCBjYXJyeSBodW5kcmVkcyBvZiBvcGVuIHRhc2tzLCBiZWNhdXNlIHRob3NlIGxhcmdlIGJhY2tsb2dzIGFyZSB3aGVyZSBiYXJuYWNsZXMgYWNjdW11bGF0ZS4gVGhlIGdvYWwgb2YgdG9kYXkgaXMgdG8gZmluYWxseSBjbGVhciBsb25nLXN0YWxlIG9ibGlnYXRpb25zLiIsa2V5OiJiYXJuYWNsZS1jbGVhbnVwIixsYWJlbDoiQmFybmFjbGUgY2xlYW51cCJ9LHtpbnN0cnVjdGlvbjoiQXNzdW1lIHRoZSB1c2VyIGhhcyBsb3cgZW5lcmd5IHRvZGF5LiBGYXZvciBsaWdodCwgc2hvcnQsIGxvdy1jb2duaXRpdmUtbG9hZCB0YXNrczsgYXZvaWQgZGVtYW5kaW5nIGRlZXAtZm9jdXMgd29yaywgYW5kIGtlZXAgYWN0aXZpdGllcyBicmllZiB3aXRoIGdlbmVyb3VzIHJlY292ZXJ5IGJyZWFrcyBiZXR3ZWVuIHRoZW0uIixrZXk6Imxvdy1lbmVyZ3kiLGxhYmVsOiJMb3cgZW5lcmd5In0se2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHdob3NlIHBheW9mZiBjb21wb3VuZHMgb3ZlciB0aGUgbG9uZyB0ZXJtIFx1MjAxNCBsZWFybmluZywgc3lzdGVtcywgYXV0b21hdGlvbiwgZG9jdW1lbnRhdGlvbiwgYW5kIHJlbGF0aW9uc2hpcHMgXHUyMDE0IGV2ZW4gd2hlbiB0aGV5IGZlZWwgbGVzcyB1cmdlbnQgdGhhbiB0b2RheSdzIG5vaXNlLiIsa2V5OiJsb25nLXRlcm0tYmVuZWZpdCIsbGFiZWw6IkxvbmctdGVybSBiZW5lZml0In0se2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHRoZSB1c2VyIGlzIG1vc3QgbGlrZWx5IHRvIGZpbmQgZW5lcmdpemluZyBhbmQgZW5qb3lhYmxlLiBTZXF1ZW5jZSB0aGUgZGF5IHRvIHN1c3RhaW4gbW90aXZhdGlvbiBhbmQgcG9zaXRpdmUgbW9tZW50dW0sIGZyb250LWxvYWRpbmcgYSBzYXRpc2Z5aW5nIGVhcmx5IHdpbi4iLGtleToiaGFwcGluZXNzLW1heGltaXplciIsbGFiZWw6IkhhcHBpbmVzcyBtYXhpbWl6ZXIifV0sdms9a3NbMF0ua2V5O2Z1bmN0aW9uIHlrKGUpe3JldHVybiBrcy5maW5kKHQ9PnQua2V5PT09ZSl8fGtzWzBdfXZhciBnTz0yMDAsbU89MWUzLHZPPTMwLHlPPTIwMCxsaD0xZTEwLGRoPTI0KjYwKjYwKjFlMyx3az02MCx3Tz02MCxiTz00ZTMsYms9NjAsa089MjAwLHhPPTQwMSxTTz00MDMsRU89MTYsTk89MCxUTz02O2FzeW5jIGZ1bmN0aW9uIGtrKGUse2FpTW9kZWxPdmVycmlkZTp0PW51bGwsZm9yY2VSZWdlbmVyYXRlOm49ITEsb2JsaWdhdGlvbnM6cj1bXSxwcmlvcml0eUtleTpvPW51bGwscHJvdmlkZXJFbU92ZXJyaWRlOmE9bnVsbCx0YXJnZXREYXRlOmk9bnVsbH09e30pe2xldCBzPWk/TU8oaSk6T08oKSxsPXMudG9Mb2NhbGVEYXRlU3RyaW5nKFtdLHt3ZWVrZGF5OiJsb25nIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pLGQ9Q08ocyksYz0hU2socyxuZXcgRGF0ZSkscD15ayhvKSx1PVFPKGEpO2lmKGsoIltwcm9wb3NlZC1hZ2VuZGFdIGdlbmVyYXRlUHJvcG9zZWRBZ2VuZGEgZW50cnkiLHtkYXRlTGFiZWw6bCxkYXlXb3JkOmQsaXNGdXR1cmVEYXk6Yyxwcmlvcml0eTpwLmtleSxvYmxpZ2F0aW9uQ291bnQ6ci5sZW5ndGgscHJvdmlkZXJFbTp1LGZvcmNlUmVnZW5lcmF0ZTpufSksIW4pe2xldCB2PWF3YWl0IGdrKGUse2RhdGU6cyxwcmlvcml0eUtleTpwLmtleSxwcm92aWRlckVtOnV9KS5jYXRjaCh3PT4oaygiW3Byb3Bvc2VkLWFnZW5kYV0gY2FjaGUgbG9va3VwIGZhaWxlZCIsdz8ubWVzc2FnZSksbnVsbCkpO2lmKHYpcmV0dXJuIERPKGUse2FpTW9kZWxPdmVycmlkZTp0LGNhY2hlZDp2LGRhdGVMYWJlbDpsLGRheVdvcmQ6ZCxpc0Z1dHVyZURheTpjLG9ibGlnYXRpb25zOnIscHJpb3JpdHlPcHRpb246cCxwcm92aWRlckVtOnUscHJvdmlkZXJFbU92ZXJyaWRlOmEsdGFyZ2V0RGF0ZTpzfSl9bGV0IGY9YXdhaXQgeGsoZSx7YWlNb2RlbE92ZXJyaWRlOnQsZGF0ZUxhYmVsOmwsZGF5V29yZDpkLGlzRnV0dXJlRGF5OmMsb2JsaWdhdGlvbnM6cixwcmlvcml0eU9wdGlvbjpwLHByb3ZpZGVyRW1PdmVycmlkZTphLHRhcmdldERhdGU6c30pO3JldHVybiFmLmVycm9yJiZBcnJheS5pc0FycmF5KGYuYWN0aXZpdGllcykmJmYuYWN0aXZpdGllcy5sZW5ndGg+MCYmYXdhaXQgc2goZSx7YWN0aXZpdGllczpmLmFjdGl2aXRpZXMsZGF0ZTpzLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmYubGxtQXR0cmlidXRpb25Gb290ZXIscHJpb3JpdHlLZXk6cC5rZXkscHJvdmlkZXJFbTp1fSkuY2F0Y2godj0+aygiW3Byb3Bvc2VkLWFnZW5kYV0gZmFpbGVkIHRvIHN0b3JlIHJlY29yZCIsdj8ubWVzc2FnZSkpLHsuLi5mLGZyb21DYWNoZTohMSxwcm92aWRlckVtOnV9fWFzeW5jIGZ1bmN0aW9uIHhrKGUse2FpTW9kZWxPdmVycmlkZTp0LGRhdGVMYWJlbDpuLGRheVdvcmQ6cixpc0Z1dHVyZURheTpvLG9ibGlnYXRpb25zOmEscHJpb3JpdHlPcHRpb246aSxwcm92aWRlckVtT3ZlcnJpZGU6cyx0YXJnZXREYXRlOmx9KXtsZXQgZD1hd2FpdCBSTyhlLGksbCksYz1hd2FpdCBCTyhlKTtyZXR1cm4gaygiW3Byb3Bvc2VkLWFnZW5kYV0gY29udGV4dCBsb2FkZWQiLHt0YXNrQ291bnQ6ZC5sZW5ndGgscXVhcnRlcmx5Q2hhcnM6Yz8ubGVuZ3RoPz8wfSksZC5sZW5ndGg9PT0wP3thY3Rpdml0aWVzOltdLGVycm9yOiJObyB0YXNrcyBmb3VuZCBhdmFpbGFibGUgdG8gc2NoZWR1bGUgaW4gVGFzayBEb21haW4uIixlcnJvckNvZGU6Im5vX3Rhc2tzIn06SE8oZSx7YWlNb2RlbE92ZXJyaWRlOnQsZGF0ZUxhYmVsOm4sZGF5V29yZDpyLGlzRnV0dXJlRGF5Om8sb2JsaWdhdGlvbnM6YSxwcmlvcml0eU9wdGlvbjppLHByb3ZpZGVyRW1PdmVycmlkZTpzLHF1YXJ0ZXJseUNvbnRlbnQ6Yyx0YXJnZXREYXRlOmwsdGFza3M6ZH0pfWFzeW5jIGZ1bmN0aW9uIERPKGUse2FpTW9kZWxPdmVycmlkZTp0LGNhY2hlZDpuLGRhdGVMYWJlbDpyLGRheVdvcmQ6byxpc0Z1dHVyZURheTphLG9ibGlnYXRpb25zOmkscHJpb3JpdHlPcHRpb246cyxwcm92aWRlckVtOmwscHJvdmlkZXJFbU92ZXJyaWRlOmQsdGFyZ2V0RGF0ZTpjfSl7bGV0IHA9YXdhaXQgQU8oZSxuLmFjdGl2aXRpZXMpO2lmKHAuc2l6ZT09PTApcmV0dXJue2FjdGl2aXRpZXM6bi5hY3Rpdml0aWVzLGRhdGVMYWJlbDpyLGRheVdvcmQ6byxpc0Z1dHVyZURheTphLGRpc21pc3NlZEtleXM6bi5kaXNtaXNzZWRLZXlzLGZyb21DYWNoZTohMCxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpuLmxsbUF0dHJpYnV0aW9uRm9vdGVyLHByb3ZpZGVyRW06bCxzY2hlZHVsZWRLZXlzOm4uc2NoZWR1bGVkS2V5c307bGV0IHU9bi5hY3Rpdml0aWVzLmZpbHRlcihtPT4hKG0udGFza1V1aWQmJnAuaGFzKG0udGFza1V1aWQpKSksZj1uLmFjdGl2aXRpZXMuZmlsdGVyKG09Pm0udGFza1V1aWQmJnAuaGFzKG0udGFza1V1aWQpKTtrKCJbcHJvcG9zZWQtYWdlbmRhXSByZWNvbmNpbGU6IGRyb3BwaW5nIGNvbXBsZXRlZC9yZW1vdmVkIHN1Z2dlc3Rpb25zLCByZS1xdWVyeWluZyByZXBsYWNlbWVudHMiLHtzdGFsZUNvdW50OmYubGVuZ3RoLGtlcHRDb3VudDp1Lmxlbmd0aH0pO2xldCB2PWF3YWl0IHhrKGUse2FpTW9kZWxPdmVycmlkZTp0LGRhdGVMYWJlbDpyLGRheVdvcmQ6byxpc0Z1dHVyZURheTphLG9ibGlnYXRpb25zOmkscHJpb3JpdHlPcHRpb246cyxwcm92aWRlckVtT3ZlcnJpZGU6ZCx0YXJnZXREYXRlOmN9KSx3PV9PKHYsdSxwLGYpLGI9Wy4uLnUsLi4ud10uc29ydCgobSx5KT0+bS5zdGFydE1pbnV0ZXMteS5zdGFydE1pbnV0ZXMpLGc9bi5sbG1BdHRyaWJ1dGlvbkZvb3Rlcnx8di5sbG1BdHRyaWJ1dGlvbkZvb3Rlcnx8bnVsbDtyZXR1cm4gYXdhaXQgc2goZSx7YWN0aXZpdGllczpiLGRhdGU6YyxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpnLHByaW9yaXR5S2V5OnMua2V5LHByb3ZpZGVyRW06bH0pLHthY3Rpdml0aWVzOmIsZGF0ZUxhYmVsOnIsZGF5V29yZDpvLGlzRnV0dXJlRGF5OmEsZnJvbUNhY2hlOiEwLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmcscHJvdmlkZXJFbTpsLGRpc21pc3NlZEtleXM6Yi5maWx0ZXIobT0+bS5zY2hlZHVsZWRFbT09PU90LkRJU01JU1NFRCkubWFwKFlhKSxzY2hlZHVsZWRLZXlzOmIuZmlsdGVyKG09Pm0uc2NoZWR1bGVkRW09PT1PdC5TQ0hFRFVMRUQpLm1hcChZYSl9fWFzeW5jIGZ1bmN0aW9uIEFPKGUsdCl7aWYodHlwZW9mIGUuZ2V0VGFzayE9ImZ1bmN0aW9uIilyZXR1cm4gbmV3IFNldDtsZXQgbj0odHx8W10pLmZpbHRlcihvPT5vLnRhc2tVdWlkJiZvLmlzRXhpc3RpbmcmJihvLnNjaGVkdWxlZEVtfHxPdC5QRU5ESU5HKT09PU90LlBFTkRJTkcpLHI9YXdhaXQgUHJvbWlzZS5hbGwobi5tYXAoYXN5bmMgbz0+e2xldCBhPWF3YWl0IFByb21pc2UucmVzb2x2ZShlLmdldFRhc2soby50YXNrVXVpZCkpO3JldHVybiFhfHwhIWEuY29tcGxldGVkQXR8fCEhYS5kaXNtaXNzZWRBdD9vLnRhc2tVdWlkOm51bGx9KSk7cmV0dXJuIG5ldyBTZXQoci5maWx0ZXIoQm9vbGVhbikpfWZ1bmN0aW9uIF9PKGUsdCxuLHIpe2lmKGUuZXJyb3J8fCFBcnJheS5pc0FycmF5KGUuYWN0aXZpdGllcyl8fGUuYWN0aXZpdGllcy5sZW5ndGg9PT0wKXJldHVybltdO2xldCBvPW5ldyBTZXQodC5maWx0ZXIoaT0+aS50YXNrVXVpZCkubWFwKGk9PmkudGFza1V1aWQpKSxhPVtdO2ZvcihsZXQgaSBvZiByKXtsZXQgcz1lLmFjdGl2aXRpZXMuZmluZChsPT5sLnRhc2tVdWlkJiYhby5oYXMobC50YXNrVXVpZCkmJiFuLmhhcyhsLnRhc2tVdWlkKSk7aWYoIXMpYnJlYWs7by5hZGQocy50YXNrVXVpZCksYS5wdXNoKHtkdXJhdGlvbk1pbnV0ZXM6aS5kdXJhdGlvbk1pbnV0ZXN8fDAsaXNFeGlzdGluZzohMCxub3RlVXVpZDpzLm5vdGVVdWlkfHxudWxsLHJlYXNvbjpzLnJlYXNvbnx8IiIsc2NoZWR1bGVkRW06T3QuUEVORElORyxzb3VyY2U6InByb3Bvc2VkIixzdGFydE1pbnV0ZXM6aS5zdGFydE1pbnV0ZXMsc3RhcnRUaW1lOmkuc3RhcnRUaW1lLHRhcmdldE1pZG5pZ2h0U2Vjb25kczppLnRhcmdldE1pZG5pZ2h0U2Vjb25kcz8/bnVsbCx0YXNrVXVpZDpzLnRhc2tVdWlkLHRpdGxlOnMudGl0bGV9KX1yZXR1cm4gYX1mdW5jdGlvbiBDTyhlLHQ9bmV3IERhdGUpe2xldCBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCksMCwwLDApLHI9TWF0aC5yb3VuZCgoZS5nZXRUaW1lKCktbi5nZXRUaW1lKCkpL2RoKTtyZXR1cm4gcjw9MD8idG9kYXkiOnI9PT0xPyJ0b21vcnJvdyI6YG9uICR7ZS50b0xvY2FsZURhdGVTdHJpbmcoW10se3dlZWtkYXk6ImxvbmcifSl9YH1mdW5jdGlvbiBPTyhlPW5ldyBEYXRlKXtsZXQgdD1lLmdldEhvdXJzKCk+PUVPPzE6MCxuPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCkrdCwwLDAsMCk7cmV0dXJuIElPKG4pfWZ1bmN0aW9uIElPKGUpe2xldCB0PWUuZ2V0RGF5KCksbj10PT09VE8/Mjp0PT09Tk8/MTowO3JldHVybiBuPT09MD9lOm5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCkrbiwwLDAsMCl9ZnVuY3Rpb24gTU8oZSl7cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCksMCwwLDApfWZ1bmN0aW9uIFNrKGUsdCl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKT09PXQuZ2V0RnVsbFllYXIoKSYmZS5nZXRNb250aCgpPT09dC5nZXRNb250aCgpJiZlLmdldERhdGUoKT09PXQuZ2V0RGF0ZSgpfWFzeW5jIGZ1bmN0aW9uIFJPKGUsdCxuKXtsZXQgcj1hd2FpdCBXTyhlKSxvPWF3YWl0IERuKGUsciksYT0oQXJyYXkuaXNBcnJheShvKT9vOltdKS5maWx0ZXIodj0+diYmIXYuY29tcGxldGVkQXQmJiF2LmRpc21pc3NlZEF0KSxpPUxPKGEpLHM9YS5zbGljZSgpLnNvcnQoKHYsdyk9PllkKHcpLVlkKHYpKSxsPU1hdGguZmxvb3IoKERhdGUubm93KCktdk8qZGgpLzFlMyksZD1zLmZpbHRlcih2PT5ZZCh2KT49bCksYz1NYXRoLm1pbihtTyxNYXRoLm1heChkLmxlbmd0aCxnTykpLHA9dD8uYmFybmFjbGU/VU8oYSxpKTpzLHU9cy5maWx0ZXIodj0+RWsodixuKSksZj1QTyhbLi4ucC5zbGljZSgwLGMpLC4uLnVdKTtyZXR1cm4gaygiW3Byb3Bvc2VkLWFnZW5kYV0gX3NlbGVjdFJlbGV2YW50VGFza3MiLHtiYXJuYWNsZTohIXQ/LmJhcm5hY2xlLGRvbWFpblV1aWQ6cixvcGVuVGFza0NvdW50OmEubGVuZ3RoLHJlY2VudFdpbmRvd0NvdW50OmQubGVuZ3RoLHNjaGVkdWxlZE9uVGFyZ2V0Q291bnQ6dS5sZW5ndGgsc2VsZWN0ZWRDb3VudDpmLmxlbmd0aH0pLGYubWFwKHY9PnpPKHYsaSxuKSkuZmlsdGVyKEJvb2xlYW4pfWZ1bmN0aW9uIFBPKGUpe2xldCB0PW5ldyBTZXQ7cmV0dXJuIGUuZmlsdGVyKG49PiFuPy51dWlkfHx0LmhhcyhuLnV1aWQpPyExOih0LmFkZChuLnV1aWQpLCEwKSl9ZnVuY3Rpb24gRWsoZSx0KXtpZighZT8uc3RhcnRBdClyZXR1cm4hMTtsZXQgbj1lLnN0YXJ0QXQ8bGg/ZS5zdGFydEF0KjFlMzplLnN0YXJ0QXQ7cmV0dXJuIFNrKG5ldyBEYXRlKG4pLHQpfWZ1bmN0aW9uIExPKGUpe2xldCB0PW5ldyBNYXA7Zm9yKGxldCBuIG9mIGUpe2xldCByPW4ubm90ZVVVSUR8fG51bGw7ciYmdC5zZXQociwodC5nZXQocil8fDApKzEpfXJldHVybiB0fWZ1bmN0aW9uIFVPKGUsdCl7bGV0IG49cj0+KHQuZ2V0KHIubm90ZVVVSUR8fCIiKXx8MCkqMWU2LVlkKHIpLzFlNDtyZXR1cm4gZS5zbGljZSgpLnNvcnQoKHIsbyk9Pm4obyktbihyKSl9ZnVuY3Rpb24gek8oZSx0LG4pe2xldCByPVN0cmluZyhlLmNvbnRlbnR8fCIiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKS5zdWJzdHJpbmcoMCx5Tyk7aWYoIXJ8fCFlLnV1aWQpcmV0dXJuIG51bGw7bGV0IG89ZS5ub3RlVVVJRHx8bnVsbDtyZXR1cm57YWdlRGF5czpGTyhlKSxkdXJhdGlvbjplLmR1cmF0aW9uPz9udWxsLGltcG9ydGFudDohIWUuaW1wb3J0YW50LG5vdGVPcGVuQ291bnQ6byYmdC5nZXQobyl8fDAsbm90ZVV1aWQ6byxzY2hlZHVsZWRPblRhcmdldDpFayhlLG4pLHRhc2tUZXh0OnIsdGFza1V1aWQ6ZS51dWlkfX1mdW5jdGlvbiBGTyhlKXtsZXQgdD0kTyhlPy5jcmVhdGVkQXQpO3JldHVybiB0P01hdGgubWF4KDAsTWF0aC5mbG9vcigoRGF0ZS5ub3coKS8xZTMtdCkvKGRoLzFlMykpKTpudWxsfWZ1bmN0aW9uICRPKGUpe3JldHVybiBlP2U8bGg/ZTpNYXRoLmZsb29yKGUvMWUzKTowfWZ1bmN0aW9uIFlkKGUpe2xldCB0PWU/LnVwZGF0ZWRBdD8/ZT8uc3RhcnRBdD8/ZT8uY3JlYXRlZEF0Pz8wO3JldHVybiB0P3Q8bGg/dDpNYXRoLmZsb29yKHQvMWUzKTowfWFzeW5jIGZ1bmN0aW9uIFdPKGUpe2xldCB0PVBlKClbai5UQVNLX0RPTUFJTlNdLG49dD9KU09OLnBhcnNlKHQpOnt9O2lmKG4uc2VsZWN0ZWREb21haW5VdWlkKXJldHVybiBuLnNlbGVjdGVkRG9tYWluVXVpZDtsZXQgcj1hd2FpdCBlLmdldFRhc2tEb21haW5zKCkuY2F0Y2goKCk9Pm51bGwpO2lmKCFBcnJheS5pc0FycmF5KHIpfHxyLmxlbmd0aD09PTApcmV0dXJuIG51bGw7bGV0IG89ci5maW5kKGE9PmEubmFtZT09PSJXb3JrIik7cmV0dXJuIG8/by51dWlkOnJbMF0udXVpZH1hc3luYyBmdW5jdGlvbiBCTyhlKXtsZXQgdD1gJHtHaSgpLmxhYmVsfSBQbGFuYCxyPShhd2FpdCBlLmZpbHRlck5vdGVzKHtxdWVyeTp0fSl8fFtdKS5maW5kKGE9PmEubmFtZT09PXQpO2lmKCFyKXJldHVybiBudWxsO2xldCBvPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6ci51dWlkfSk7cmV0dXJuIG8/by5zdWJzdHJpbmcoMCxiTyk6bnVsbH1hc3luYyBmdW5jdGlvbiBITyhlLHthaU1vZGVsT3ZlcnJpZGU6dCxkYXRlTGFiZWw6bixkYXlXb3JkOnIsaXNGdXR1cmVEYXk6byxvYmxpZ2F0aW9uczphPVtdLHByaW9yaXR5T3B0aW9uOmkscHJvdmlkZXJFbU92ZXJyaWRlOnMscXVhcnRlcmx5Q29udGVudDpsLHRhcmdldERhdGU6ZCx0YXNrczpjfSl7bGV0IHA9c3x8UGUoKVtqLkxMTV9QUk9WSURFUl9NT0RFTF07aWYoISghIXAmJnAhPT0ibm9uZSIpJiYhYXdhaXQgZS5maW5kTm90ZSh7bmFtZTppcn0pKXJldHVybnthY3Rpdml0aWVzOltdLGVycm9yOiJObyBBSSBwcm92aWRlciBjb25maWd1cmVkLiBQbGVhc2Ugc2VsZWN0IGEgcHJvdmlkZXIgaW4gcGx1Z2luIHNldHRpbmdzLiIsZXJyb3JDb2RlOiJub19wcm92aWRlcl9jb25maWd1cmVkIn07bGV0IGY9bmV3IFNldChbLi4uYS5tYXAoeD0+eC50YXNrVXVpZCkuZmlsdGVyKEJvb2xlYW4pLC4uLmMuZmlsdGVyKHg9Pnguc2NoZWR1bGVkT25UYXJnZXQpLm1hcCh4PT54LnRhc2tVdWlkKV0pLHY9Yy5maWx0ZXIoeD0+IWYuaGFzKHgudGFza1V1aWQpKTtrKCJbcHJvcG9zZWQtYWdlbmRhXSBleGNsdWRlZCBhbHJlYWR5LXNjaGVkdWxlZCB0YXNrcyBmcm9tIGNhbmRpZGF0ZXMiLHtjYW5kaWRhdGVDb3VudDpjLmxlbmd0aCxwcm9wb3NhYmxlQ291bnQ6di5sZW5ndGgsYWxyZWFkeVNjaGVkdWxlZENvdW50OmYuc2l6ZX0pO2xldCB3PUdPKHtkYXRlTGFiZWw6bixpc0Z1dHVyZURheTpvLG9ibGlnYXRpb25zOmEscHJpb3JpdHlPcHRpb246aSxxdWFydGVybHlDb250ZW50OmwsdGFyZ2V0RGF0ZTpkLHRhc2tzOnZ9KSxiPXBlcmZvcm1hbmNlLm5vdygpLGc7dHJ5e2soIltwcm9wb3NlZC1hZ2VuZGFdIHNlbmRpbmcgcHJvbXB0IHRvIExMTSwgbGVuZ3RoOiIsdy5sZW5ndGgpO2xldHthaU1vZGVsOngsYXBpS2V5OkUsanNvblJlc3BvbnNlOlQsdGltZW91dFNlY29uZHM6RH09VGsocyx0KTtnPWF3YWl0IEZkKGUsdyx7YWlNb2RlbDp4LGFwaUtleTpFLGpzb25SZXNwb25zZTpULHRpbWVvdXRTZWNvbmRzOkR9KSxrKCJbcHJvcG9zZWQtYWdlbmRhXSBMTE0gcmV0dXJuZWQiLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktYikudG9GaXhlZCgxKSksYWN0aXZpdHlDb3VudDpBcnJheS5pc0FycmF5KGc/LmFjdGl2aXRpZXMpP2cuYWN0aXZpdGllcy5sZW5ndGg6bnVsbH0pfWNhdGNoKHgpe2soIltwcm9wb3NlZC1hZ2VuZGFdIExMTSBjYWxsIHRocmV3Iix7bWVzc2FnZTp4Py5tZXNzYWdlLHN0YXR1czp4Py5yZXNwb25zZT8uc3RhdHVzfSk7bGV0IEU9eC5yZXNwb25zZT8uc3RhdHVzO3JldHVybiBFPT09eE98fEU9PT1TTz97YWN0aXZpdGllczpbXSxlcnJvcjoiVGhlIEFQSSBrZXkgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC4iLGVycm9yQ29kZToiaW52YWxpZF9hcGlfa2V5In06e2FjdGl2aXRpZXM6W10sZXJyb3I6YExMTSByZXF1ZXN0IGZhaWxlZCAoJHt4Lm1lc3NhZ2V8fCJ1bmtub3duIGVycm9yIn0pLmAsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLGVycm9yRGV0YWlsOngubWVzc2FnZXx8bnVsbH19aWYoIWd8fCFBcnJheS5pc0FycmF5KGcuYWN0aXZpdGllcykpe2xldCB4PWc/SlNPTi5zdHJpbmdpZnkoZykuc3Vic3RyaW5nKDAsa08pOiJlbXB0eSByZXNwb25zZSI7cmV0dXJue2FjdGl2aXRpZXM6W10sZXJyb3I6IlVuYWJsZSB0byBwcm9jZXNzIHRoZSBBSSBwcm92aWRlcidzIHJlc3BvbnNlIGludG8gYSBzY2hlZHVsZS4iLGVycm9yQ29kZToicGFyc2VfZXJyb3IiLGVycm9yRGV0YWlsOnh9fWxldCBtPW5ldyBTZXQodi5tYXAoeD0+eC50YXNrVXVpZCkpLHk9bmV3IE1hcCh2Lm1hcCh4PT5beC50YXNrVXVpZCx4Lm5vdGVVdWlkXSkpO3JldHVybnthY3Rpdml0aWVzOmpPKGcuYWN0aXZpdGllcyxtLHksZCksZGF0ZUxhYmVsOm4sZGF5V29yZDpyLGlzRnV0dXJlRGF5Om8sbGxtQXR0cmlidXRpb25Gb290ZXI6Sk8ocyl9fWZ1bmN0aW9uIEdPKHtkYXRlTGFiZWw6ZSxpc0Z1dHVyZURheTp0LG9ibGlnYXRpb25zOm49W10scHJpb3JpdHlPcHRpb246cixxdWFydGVybHlDb250ZW50Om8sdGFyZ2V0RGF0ZTphLHRhc2tzOml9KXtsZXQgcz1hLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToibG9uZyJ9KSxkPWBZb3UgYXJlIGEgcHJvZHVjdGl2aXR5IGNvYWNoLiBCdWlsZCBhIHJlYWxpc3RpYyBob3VyLWJ5LWhvdXIgc2NoZWR1bGUgZm9yICR7ZX0sIHdoaWNoIGlzIGEgJHtzfS4ke3Q/IiBUaGlzIGFnZW5kYSBpcyBmb3IgYW4gdXBjb21pbmcgZGF5IHJhdGhlciB0aGFuIHRvZGF5LCBzbyBwbGFuIGl0IGFzIGEgZnJlc2ggc3RhcnQgdG8gdGhhdCBkYXkuIjoiIn0KCiMjIFRvZGF5J3MgcHJpb3JpdHkKJHtyPy5pbnN0cnVjdGlvbnx8IkJ1aWxkIGEgYmFsYW5jZWQsIGhpZ2gtbGV2ZXJhZ2UgZGF5LiJ9CgojIyBTY2hlZHVsaW5nIHJ1bGVzCi0gVGFrZSB0aGUgZGF5IG9mIHRoZSB3ZWVrIGludG8gYWNjb3VudDogJHtzfSBtYXkgYmUgYSB3ZWVrZW5kIG9yIGNhcnJ5IGRpZmZlcmVudCB3b3JraW5nIGhvdXJzIGFuZCBlbmVyZ3kgdGhhbiBhIHdlZWtkYXkgXHUyMDE0IHBsYW4gYWNjb3JkaW5nbHkuCi0gQ29uc2lkZXIgd2hldGhlciAke2V9IGlzIGEgcHVibGljIGhvbGlkYXkgb3IgYSBkYXkgcGVvcGxlIGNvbW1vbmx5IHRha2Ugb2ZmOyBpZiBzbywgbGlnaHRlbiB0aGUgc2NoZWR1bGUgb3Igc2tpcCB3b3JrLWZvY3VzZWQgYmxvY2tzIGFzIGFwcHJvcHJpYXRlLgotIFByb3Bvc2Ugc3BlY2lmaWMgY2xvY2sgdGltZXMgaW4gMjQtaG91ciAiSEg6TU0iIGZvcm1hdCwgb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHkgYWNyb3NzIGEgbm9ybWFsIHdvcmtpbmcgZGF5LgotIExlYXZlIEFUIExFQVNUICR7Ymt9IG1pbnV0ZXMgb2YgdW5zY2hlZHVsZWQgYnVmZmVyIGJldHdlZW4gdGhlIGVuZCBvZiBvbmUgYWN0aXZpdHkgYW5kIHRoZSBzdGFydCBvZiB0aGUgbmV4dC4KLSBXb3JrIEFST1VORCB0aGUgYWxyZWFkeS1zY2hlZHVsZWQgb2JsaWdhdGlvbnMgYmVsb3c6IG5ldmVyIG92ZXJsYXAgdGhlbSBhbmQgbmV2ZXIgcmUtcHJvcG9zZSB0aGVtLgotIFRoZSBDYW5kaWRhdGUgdGFza3MgYmVsb3cgYXJlIE5PVCB5ZXQgc2NoZWR1bGVkIGZvciAke2V9OyBhbnl0aGluZyBhbHJlYWR5IGNvbW1pdHRlZCB0byB0aGUgZGF5IGFwcGVhcnMgb25seSBpbiB0aGUgb2JsaWdhdGlvbnMgc2VjdGlvbiBhbmQgbXVzdCBub3QgYmUgcHJvcG9zZWQgYWdhaW4uCi0gT05MWSBwcm9wb3NlIGFjdGl2aXRpZXMgZm9yIHRhc2tzIHRoYXQgYXBwZWFyIGluIHRoZSBDYW5kaWRhdGUgdGFza3MgSlNPTiBiZWxvdy4KLSBFdmVyeSByZXR1cm5lZCBhY3Rpdml0eSBNVVNUIHVzZSB0aGUgZXhhY3QgInRhc2tVdWlkIiBmcm9tIG9uZSBjYW5kaWRhdGUgdGFzazsgbmV2ZXIgaW52ZW50IHRhc2tzIG9yIFVVSURzLgotIERvIG5vdCBwcm9wb3NlIGJyZWFrcywgcGxhbm5pbmcsIHJldmlldywgY2FsZW5kYXIgYmxvY2tzLCBvciBvdGhlciBzdXBwb3J0aW5nIGFjdGl2aXRpZXMgdW5sZXNzIHRoZXkgYXJlIGNhbmRpZGF0ZSB0YXNrcy4KLSBGYXZvciB0aGUgdXNlcidzICJpbXBvcnRhbnQiIHRhc2tzIGFuZCB0YXNrcyB0aGF0IGFkdmFuY2UgdGhlIHF1YXJ0ZXJseSBwbGFuLCB3ZWlnaHRlZCBieSB0b2RheSdzIHByaW9yaXR5LgotIFJlc3BlY3QgZWFjaCB0YXNrJ3MgImR1cmF0aW9uIiAoc2Vjb25kcykgd2hlbiBwcmVzZW50OyBvdGhlcndpc2UgZXN0aW1hdGUgYSBzZW5zaWJsZSBkdXJhdGlvbi4KYDtyZXR1cm4gZCs9YAojIyBBbHJlYWR5LXNjaGVkdWxlZCBvYmxpZ2F0aW9ucyAoaW1tb3ZhYmxlOyBkbyBub3QgcmUtcHJvcG9zZSkKYCxkKz1uLmxlbmd0aD4wP24ubWFwKGM9PmAtICR7Y2goYy5zdGFydE1pbnV0ZXMpfSAke2MudGl0bGV9JHtjLmR1cmF0aW9uTWludXRlcz9gICgke2MuZHVyYXRpb25NaW51dGVzfW0pYDoiIn1gKS5qb2luKGAKYCk6Ik5vbmUuIixkKz1gCmAsbz9kKz1gCiMjIFVzZXIncyBRdWFydGVybHkgUGxhbgoke299CmA6ZCs9YAojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KTm8gcXVhcnRlcmx5IHBsYW4gZm91bmQuCmAsZCs9YAojIyBDYW5kaWRhdGUgdGFza3MgKEpTT047ICR7aS5sZW5ndGh9IHRvdGFsKQpgLGQrPWkubGVuZ3RoPjA/aS5tYXAoYz0+SlNPTi5zdHJpbmdpZnkoYykpLmpvaW4oYApgKToiTm8gY2FuZGlkYXRlIHRhc2tzLiIsZCs9YAoKUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiAobm8gbWFya2Rvd24gZmVuY2VzKSBpbiBleGFjdGx5IHRoaXMgc2hhcGU6CnsiYWN0aXZpdGllcyI6W3sic3RhcnRUaW1lIjoiMDk6MDAiLCJkdXJhdGlvbk1pbnV0ZXMiOjYwLCJ0aXRsZSI6IkFjdGl2aXR5IHRpdGxlIiwidGFza1V1aWQiOiJleGlzdGluZy10YXNrLXV1aWQiLCJyZWFzb24iOiJPbmUgc2VudGVuY2Ugb24gd2h5IHRoaXMgc2xvdCBtYXR0ZXJzIHRvZGF5In1dfQotICJzdGFydFRpbWUiOiAyNC1ob3VyICJISDpNTSIuCi0gImR1cmF0aW9uTWludXRlcyI6IGludGVnZXIgbWludXRlcy4KLSAidGFza1V1aWQiOiB0aGUgZXhhY3QgInRhc2tVdWlkIiBmcm9tIGEgY2FuZGlkYXRlIHRhc2suIEFjdGl2aXRpZXMgd2l0aG91dCBhIGNhbmRpZGF0ZSB0YXNrVXVpZCB3aWxsIGJlIGRpc2NhcmRlZC4KLSBLZWVwIHRpdGxlcyBjb25jaXNlLiBQcm92aWRlIGJldHdlZW4gNCBhbmQgMTAgYWN0aXZpdGllcy5gLGR9ZnVuY3Rpb24gak8oZSx0LG4scil7bGV0IG89TWF0aC5mbG9vcihyLmdldFRpbWUoKS8xZTMpLGE9ZS5tYXAoaT0+e2xldCBzPVlPKGk/LnN0YXJ0VGltZSksbD1TdHJpbmcoaT8udGl0bGV8fCIiKS50cmltKCksZD1WTyhpLHQpO3JldHVybiBzPT1udWxsfHwhbHx8IWQ/bnVsbDp7ZHVyYXRpb25NaW51dGVzOk1hdGgubWF4KDAscGFyc2VJbnQoaT8uZHVyYXRpb25NaW51dGVzLDEwKXx8MCksaXNFeGlzdGluZzohMCxub3RlVXVpZDpuLmdldChkKXx8bnVsbCxyZWFzb246U3RyaW5nKGk/LnJlYXNvbnx8IiIpLnRyaW0oKSxzb3VyY2U6InByb3Bvc2VkIixzdGFydE1pbnV0ZXM6cyxzdGFydFRpbWU6Y2gocyksdGFyZ2V0TWlkbmlnaHRTZWNvbmRzOm8sdGFza1V1aWQ6ZCx0aXRsZTpsfX0pLmZpbHRlcihCb29sZWFuKS5zb3J0KChpLHMpPT5pLnN0YXJ0TWludXRlcy1zLnN0YXJ0TWludXRlcyk7cmV0dXJuIEtPKGEpfWZ1bmN0aW9uIFZPKGUsdCl7bGV0IG49dHlwZW9mIGU/LnRhc2tVdWlkPT0ic3RyaW5nIj9lLnRhc2tVdWlkLnRyaW0oKToiIjtyZXR1cm4gbiYmdC5oYXMobik/bjooaygiW3Byb3Bvc2VkLWFnZW5kYV0gZGlzY2FyZGluZyBMTE0gYWN0aXZpdHkgd2l0aG91dCBleHRhbnQgdGFza1V1aWQiLHt0YXNrVXVpZDpufHxudWxsLHRpdGxlOlN0cmluZyhlPy50aXRsZXx8IiIpLnRyaW0oKXx8bnVsbH0pLG51bGwpfWZ1bmN0aW9uIEtPKGUpe2xldCB0PVtdLG49MDtmb3IobGV0IHIgb2YgZSl7bGV0IG89TWF0aC5tYXgoci5zdGFydE1pbnV0ZXMsbik7aWYobz49MjQqNjApY29udGludWU7bGV0IGE9ey4uLnIsc3RhcnRNaW51dGVzOm8sc3RhcnRUaW1lOmNoKG8pfTt0LnB1c2goYSksbj1vK2EuZHVyYXRpb25NaW51dGVzK2JrfXJldHVybiB0fWZ1bmN0aW9uIFlPKGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtsZXQgdD1lLnRyaW0oKS5tYXRjaCgvXihcZHsxLDJ9KTooXGR7Mn0pJC8pO2lmKCF0KXJldHVybiBudWxsO2xldCBuPXBhcnNlSW50KHRbMV0sMTApLHI9cGFyc2VJbnQodFsyXSwxMCk7cmV0dXJuIG48MHx8bj4yM3x8cjwwfHxyPjU5P251bGw6bio2MCtyfWZ1bmN0aW9uIGNoKGUpe2xldCB0PU1hdGguZmxvb3IoZS82MCksbj1lJTYwO3JldHVybmAke1N0cmluZyh0KS5wYWRTdGFydCgyLCIwIil9OiR7U3RyaW5nKG4pLnBhZFN0YXJ0KDIsIjAiKX1gfWZ1bmN0aW9uIHFPKGUsdD1udWxsKXtpZih0IT1udWxsKXJldHVybiB0K2Uqd2s7bGV0IG49bmV3IERhdGUscj1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLDAsMCwwKTtyZXR1cm4gTWF0aC5mbG9vcihyLmdldFRpbWUoKS8xZTMpK2Uqd2t9YXN5bmMgZnVuY3Rpb24gdWgoZSx0LG4pe2xldCByPXFPKHQuc3RhcnRNaW51dGVzLHQudGFyZ2V0TWlkbmlnaHRTZWNvbmRzPz9udWxsKTtpZih0LmlzRXhpc3RpbmcmJnQudGFza1V1aWQpcmV0dXJuIGF3YWl0IGUudXBkYXRlVGFzayh0LnRhc2tVdWlkLHtzdGFydEF0OnJ9KT97c3RhcnRBdDpyLHRhc2tVdWlkOnQudGFza1V1aWR9OntyZWFzb246InVwZGF0ZV9mYWlsZWQiLHRhc2tVdWlkOnQudGFza1V1aWR9O2xldCBvPXQubm90ZVV1aWR8fG47aWYoIW8pcmV0dXJue3JlYXNvbjoibWlzc2luZ19ub3RlIn07bGV0IGE9YXdhaXQgZS5pbnNlcnRUYXNrKHt1dWlkOm99LHtjb250ZW50OnQudGl0bGUsc3RhcnRBdDpyfSk7cmV0dXJuIGE/e25vdGVVdWlkOm8sc3RhcnRBdDpyLHRhc2tVdWlkOmF9OntyZWFzb246Imluc2VydF9mYWlsZWQifX1hc3luYyBmdW5jdGlvbiBOayhlLHQsbil7bGV0IHI9MCxvPTA7Zm9yKGxldCBhIG9mIHQpKGF3YWl0IHVoKGUsYSxuKSkudGFza1V1aWQ/bys9MTpyKz0xO3JldHVybiBrKCJbcHJvcG9zZWQtYWdlbmRhXSBhcHByb3ZlUHJvcG9zZWRBZ2VuZGEgY29tcGxldGUiLHtmYWlsZWQ6cixzY2hlZHVsZWQ6b30pLHtmYWlsZWQ6cixzY2hlZHVsZWQ6b319ZnVuY3Rpb24gUU8oZT1udWxsKXtyZXR1cm4gZXx8UGUoKVtqLkxMTV9QUk9WSURFUl9NT0RFTF18fCJkZWZhdWx0In1mdW5jdGlvbiBUayhlPW51bGwsdD1udWxsKXtsZXQgbj1QZSgpLHI9e2pzb25SZXNwb25zZTohMCx0aW1lb3V0U2Vjb25kczp3T30sbz0oKT0+e3QmJihyLmFpTW9kZWw9dCl9O2lmKGUpe2xldCBsPVh0W2VdfHxudWxsLGQ9JHQoZSksYz1kPyhuPy5bZF18fCIiKS50cmltKCk6IiI7aWYobCYmYylyZXR1cm4gci5haU1vZGVsPWwsci5hcGlLZXk9YyxvKCkscn1sZXQgYT1uW2ouTExNX1BST1ZJREVSX01PREVMXSxpPW9vKGEpLHM9ZWQoWHQpO2lmKHMpci5haU1vZGVsPXMubW9kZWwsci5hcGlLZXk9cy5hcGlLZXksayhgW3Byb3Bvc2VkLWFnZW5kYV0gRGV2IG1vZGU6IHVzaW5nICR7cy5wcm92aWRlcn0gZGV2IHRva2VuIChtb2RlbCAke3MubW9kZWx9KWApO2Vsc2UgaWYoYSYmWHRbYV0pe3IuYWlNb2RlbD1YdFthXTtsZXQgbD0kdChpKSxkPWw/KG5bbF18fCIiKS50cmltKCk6IiI7ZCYmKHIuYXBpS2V5PWQpfXJldHVybiBvKCkscn1mdW5jdGlvbiBKTyhlPW51bGwpe2xldCB0PVRrKGUpLmFpTW9kZWw7cmV0dXJuIHQ/YFNjaGVkdWxlIHByb3Bvc2VkIGJ5ICR7dH1gOm51bGx9ZnVuY3Rpb24gSXQoZSl7cmV0dXJuYCR7ZS5zdGFydE1pbnV0ZXN9Ojoke2UudGFza1V1aWR8fGUudGl0bGV9YH1hc3luYyBmdW5jdGlvbiB4cyhlLHQsbixyKXshdD8ucHJvdmlkZXJFbXx8IXQ/LmRhdGV8fCFuPy5sZW5ndGh8fGF3YWl0IG1rKGUse2FjdGl2aXR5S2V5czpuLGRhdGU6dC5kYXRlLHByaW9yaXR5S2V5OnQucHJpb3JpdHlLZXkscHJvdmlkZXJFbTp0LnByb3ZpZGVyRW0sc2NoZWR1bGVkRW06cn0pLmNhdGNoKG89PmsoIltwcm9wb3NlZC1hZ2VuZGFdIGZhaWxlZCB0byBwZXJzaXN0IHRhc2sgc3RhdHVzIixvPy5tZXNzYWdlKSl9YXN5bmMgZnVuY3Rpb24gRGsoZSx7ZGVmYXVsdE5vdGVVdWlkOnQsZGlzbWlzc2VkS2V5czpuLGxsbURhdGVSZWNvcmQ6cixwcm9wb3NlZDpvLHNjaGVkdWxlZEtleXM6YSxzZXRBcHByb3Zpbmc6aSxzZXRTY2hlZHVsZWRLZXlzOnN9KXtsZXQgbD1vLmZpbHRlcihkPT4hYS5oYXMoSXQoZCkpJiYhbi5oYXMoSXQoZCkpKTtpZihsLmxlbmd0aCE9PTApe2koITApO3RyeXtsZXR7ZmFpbGVkOmQsc2NoZWR1bGVkOmN9PWF3YWl0IE5rKGUsbCx0KTtzKHA9PklrKHAsbC5tYXAoSXQpKSksYz4wJiZPaygpLGF3YWl0IHhzKGUscixsLm1hcChJdCksT3QuU0NIRURVTEVEKSxhd2FpdCBlLmFsZXJ0KGQ+MD9gU2NoZWR1bGVkICR7Y30gYWN0aXZpdGllczsgJHtkfSBjb3VsZCBub3QgYmUgc2NoZWR1bGVkLmA6YFNjaGVkdWxlZCBhbGwgJHtjfSBhY3Rpdml0aWVzLmApfWZpbmFsbHl7aSghMSl9fX1mdW5jdGlvbiBBayhlLHQsbil7bGV0IHI9KGV8fFtdKS5tYXAoYT0+KHsuLi5hLGlzT2JsaWdhdGlvbjohMH0pKSxvPSh0fHxbXSkuZmlsdGVyKGE9PiFuLmhhcyhJdChhKSkpLm1hcChhPT4oey4uLmEsaXNPYmxpZ2F0aW9uOiExfSkpO3JldHVyblsuLi5yLC4uLm9dLnNvcnQoKGEsaSk9PmEuc3RhcnRNaW51dGVzLWkuc3RhcnRNaW51dGVzKX1mdW5jdGlvbiBwaChlLHQsbil7cmV0dXJuKGV8fFtdKS5maWx0ZXIocj0+IXQuaGFzKEl0KHIpKSYmIW4uaGFzKEl0KHIpKSkubGVuZ3RofWFzeW5jIGZ1bmN0aW9uIF9rKGUse2N1cnJlbnREYXRlOnQsZG9tYWluVXVpZDpuLGZvcmNlUmVnZW5lcmF0ZTpyPSExLHByaW9yaXR5S2V5Om8scHJvdmlkZXJFbTphLHNldEFwcHJvdmluZzppLHNldEF0dHJpYnV0aW9uOnMsc2V0RGF0ZUxhYmVsOmwsc2V0RGlzbWlzc2VkS2V5czpkLHNldEVycm9yOmMsc2V0TG9hZGluZzpwLHNldE9ibGlnYXRpb25zOnUsc2V0UHJvcG9zZWQ6ZixzZXRSZWNvcmRQcm92aWRlckVtOnYsc2V0U2NoZWR1bGVkS2V5czp3fSl7cCghMCksYyhudWxsKSxpKCExKSx3KG5ldyBTZXQpLGQobmV3IFNldCk7dHJ5e2xldCBiPWF3YWl0IGxiKGUse2N1cnJlbnREYXRlOnQsZG9tYWluVXVpZDpufSk7dShiKTtsZXQgZz1hd2FpdCBrayhlLHtmb3JjZVJlZ2VuZXJhdGU6cixvYmxpZ2F0aW9uczpiLHByaW9yaXR5S2V5Om8scHJvdmlkZXJFbU92ZXJyaWRlOmF8fG51bGx9KTtnLmVycm9yPyhjKHtlcnJvcjpnLmVycm9yLGVycm9yQ29kZTpnLmVycm9yQ29kZXx8bnVsbH0pLGYoW10pKTooZihnLmFjdGl2aXRpZXMpLGwoZy5kYXRlTGFiZWwpLHMoZy5sbG1BdHRyaWJ1dGlvbkZvb3RlciksdiYmdihnLnByb3ZpZGVyRW18fG51bGwpLGcuc2NoZWR1bGVkS2V5cz8ubGVuZ3RoJiZ3KG5ldyBTZXQoZy5zY2hlZHVsZWRLZXlzKSksZy5kaXNtaXNzZWRLZXlzPy5sZW5ndGgmJmQobmV3IFNldChnLmRpc21pc3NlZEtleXMpKSxnLmZyb21DYWNoZXx8YXQoImdlbmVyYXRlUHJvcG9zZWRBZ2VuZGEiLHtjb3VudDpnLmFjdGl2aXRpZXM/Lmxlbmd0aHx8MH0pKX1jYXRjaChiKXtrKCJbcHJvcG9zZWQtYWdlbmRhXSBydW5Qcm9wb3NlZEFnZW5kYUdlbmVyYXRpb24gY2F1Z2h0IixiKSxjKHtlcnJvcjoiQ291bGRuJ3QgYnVpbGQgYSBzY2hlZHVsZSByaWdodCBub3cuIFBsZWFzZSB0cnkgYWdhaW4uIixlcnJvckNvZGU6ImxsbV9lcnJvciJ9KX1maW5hbGx5e3AoITEpfX1hc3luYyBmdW5jdGlvbiBDayhlLHQsbixyLG89bnVsbCl7bGV0IGE9YXdhaXQgdWgoZSx0LG4pO2lmKCFhLnRhc2tVdWlkKXthd2FpdCBlLmFsZXJ0KCJDb3VsZCBub3Qgc2NoZWR1bGUgdGhpcyBhY3Rpdml0eS4gUGxlYXNlIHRyeSBhZ2FpbiBvciBzY2hlZHVsZSBpdCBtYW51YWxseS4iKTtyZXR1cm59cihpPT5JayhpLFtJdCh0KV0pKSxPayh7Y29udGVudDp0LnRpdGxlLG5vdGVVVUlEOmEubm90ZVV1aWR8fHQubm90ZVV1aWR8fG51bGwsc3RhcnRBdDphLnN0YXJ0QXQsdGFza1V1aWQ6YS50YXNrVXVpZH0pLGF3YWl0IHhzKGUsbyxbSXQodCldLE90LlNDSEVEVUxFRCl9ZnVuY3Rpb24gT2soZT17fSl7dHlwZW9mIHdpbmRvdz4idSJ8fCF3aW5kb3cuZGlzcGF0Y2hFdmVudHx8d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFZhLHtkZXRhaWw6ZX0pKX1mdW5jdGlvbiBJayhlLHQpe2xldCBuPW5ldyBTZXQoZSk7cmV0dXJuIHQuZm9yRWFjaChyPT5uLmFkZChyKSksbn12YXIgU2U9VSh5ZSgpKTt2YXIgZGU9VShlZSgpKSx5bz0icHJvcG9zZWQtYWdlbmRhIixYTz1uZXcgU2V0KFsiaW52YWxpZF9hcGlfa2V5IiwibGxtX2Vycm9yIiwibm9fcHJvdmlkZXJfY29uZmlndXJlZCIsInBhcnNlX2Vycm9yIl0pLFpPPVt7aWNvbjoiXHV7MUY1RDN9XHVGRTBGIixsYWJlbDoiQXV0by1kcmFmdCB5b3VyIGRheSJ9LHtpY29uOiJcdTI2OTZcdUZFMEYiLGxhYmVsOiJCYWxhbmNlIHdvcmsgYnkgcHJpb3JpdHkifSx7aWNvbjoiXHV7MUYzQUZ9IixsYWJlbDoiQWxpZ24gdGhlIGRheSB0byBnb2FscyJ9LHtpY29uOiJcdTIzRjAiLGxhYmVsOiJTY2hlZHVsZSBhcm91bmQgb2JsaWdhdGlvbnMifSx7aWNvbjoiXHV7MUY1MDR9IixsYWJlbDoiUmVzZWVkIHdpdGggYW55IG1vZGVsIn0se2ljb246Ilx1ezFGOUUwfSIsbGFiZWw6IkZyb250aWVyIG1vZGVscywgbm8ga2V5In1dO2Z1bmN0aW9uIGUyKGUpe3JldHVybiBYdFtlXXx8ZXx8ImRlZmF1bHQgbW9kZWwifWZ1bmN0aW9uIHQyKCl7cmV0dXJuKDAsZGUuanN4KShpZSx7dGl0bGU6bGUoeW8pLGljb246Ilx1ezFGNUQzfVx1RkUwRiIsd2lkZ2V0SWQ6eW8sY2hpbGRyZW46KDAsZGUuanN4cykoImRpdiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLWxvYWRpbmciLGNoaWxkcmVuOlsoMCxkZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1zcGlubmVyIn0pLCgwLGRlLmpzeCkoInAiLHtjaGlsZHJlbjoiRHJhZnRpbmcgeW91ciBob3VyLWJ5LWhvdXIgc2NoZWR1bGUgXHUyMDI2In0pXX0pfSl9ZnVuY3Rpb24gTWsoe21lc3NhZ2U6ZSxvblJldHJ5OnR9KXtyZXR1cm4oMCxkZS5qc3gpKGllLHt0aXRsZTpsZSh5byksaWNvbjoiXHV7MUY1RDN9XHVGRTBGIix3aWRnZXRJZDp5byxjaGlsZHJlbjooMCxkZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtbWVzc2FnZSIsY2hpbGRyZW46WygwLGRlLmpzeCkoInAiLHtjaGlsZHJlbjplfSksKDAsZGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtcmV0cnkiLG9uQ2xpY2s6dCxjaGlsZHJlbjoiVHJ5IGFnYWluIn0pXX0pfSl9ZnVuY3Rpb24gbjIoe21vZGVsTmFtZTplLG9uQ2hhbmdlTW9kZWw6dCxvblByaW9yaXR5Q2hhbmdlOm4scHJpb3JpdHlLZXk6cn0pe3JldHVybigwLGRlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1jb250cm9scyIsY2hpbGRyZW46WygwLGRlLmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtcHJpb3JpdHktbGFiZWwiLGNoaWxkcmVuOiJUb2RheSdzIHByaW9yaXR5In0pLCgwLGRlLmpzeCkoInNlbGVjdCIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXByaW9yaXR5LXNlbGVjdCIsdmFsdWU6cixvbkNoYW5nZTpuLGNoaWxkcmVuOmtzLm1hcChvPT4oMCxkZS5qc3gpKCJvcHRpb24iLHt2YWx1ZTpvLmtleSxjaGlsZHJlbjpvLmxhYmVsfSxvLmtleSkpfSksKDAsZGUuanN4cykoInNwYW4iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1tb2RlbCIsdGl0bGU6IkFJIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBhZ2VuZGEiLGNoaWxkcmVuOlsiXHV7MUYzMTB9ICIsZV19KSwoMCxkZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1tb2RlbC1jaGFuZ2UiLHRpdGxlOiJDaGFuZ2UgQUkgcHJvdmlkZXIiLG9uQ2xpY2s6dCxjaGlsZHJlbjoiXHUyMUM1In0pXX0pfWZ1bmN0aW9uIHIyKHtvbkRpc21pc3M6ZSxvbk9wZW5Ob3RlOnQsb25TY2hlZHVsZTpuLHJvdzpyLHNjaGVkdWxlZEtleXM6byx0aW1lRm9ybWF0OmF9KXtsZXQgaT1yLmlzT2JsaWdhdGlvbnx8by5oYXMoSXQocikpLHM9Q3Ioci50aXRsZSl8fHIudGl0bGUsbD0hIShyLm5vdGVVdWlkfHxyLnRhc2tVdWlkKTtyZXR1cm4oMCxkZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOmBwcm9wb3NlZC1hZ2VuZGEtaXRlbSR7aT8iIHByb3Bvc2VkLWFnZW5kYS1pdGVtLS1zY2hlZHVsZWQiOiIifWAsY2hpbGRyZW46WygwLGRlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtdGltZS1jb2wiLGNoaWxkcmVuOlsoMCxkZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOmBwcm9wb3NlZC1hZ2VuZGEtdGltZSR7aT8iIHByb3Bvc2VkLWFnZW5kYS10aW1lLS1tdXRlZCI6IiJ9YCxjaGlsZHJlbjpTdyhyLnN0YXJ0TWludXRlcyxhKX0pLGw/KDAsZGUuanN4KSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLW5vdGUtbGluayIsdGl0bGU6Ik9wZW4gdGhlIG5vdGUgZm9yIHRoaXMgdGFzayIsb25DbGljazpkPT50KGQsciksY2hpbGRyZW46Ik5vdGUifSk6bnVsbF19KSwoMCxkZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtY29udGVudCIsY2hpbGRyZW46WygwLGRlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS10ZXh0IixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOnN9fSksIXIuaXNPYmxpZ2F0aW9uJiZyLnJlYXNvbj8oMCxkZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtcmVhc29uIixjaGlsZHJlbjpyLnJlYXNvbn0pOm51bGxdfSksci5kdXJhdGlvbk1pbnV0ZXM/KDAsZGUuanN4KSgic3BhbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLWR1cmF0aW9uIixjaGlsZHJlbjpgJHtyLmR1cmF0aW9uTWludXRlc31tYH0pOm51bGwsaT8oMCxkZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtc2NoZWR1bGVkLWJhZGdlIix0aXRsZToiQWxyZWFkeSBzY2hlZHVsZWQgdG9kYXkiLGNoaWxkcmVuOiJTY2hlZHVsZWQifSk6KDAsZGUuanN4cykoInNwYW4iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1hY3Rpb25zIixjaGlsZHJlbjpbKDAsZGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYWRkIix0aXRsZTpgU2NoZWR1bGUgZm9yICR7ci5zdGFydFRpbWV9IHRvZGF5YCxvbkNsaWNrOmQ9Pm4oZCxyKSxjaGlsZHJlbjoiXHV7MUY0QzV9IEFkZCB0byBzY2hlZHVsZSJ9KSwoMCxkZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1kaXNtaXNzIix0aXRsZToiRGlzbWlzcyB0aGlzIHN1Z2dlc3Rpb24iLG9uQ2xpY2s6ZD0+ZShkLHIpLGNoaWxkcmVuOiJceEQ3In0pXX0pXX0pfWZ1bmN0aW9uIGZoKHthcHA6ZSxjdXJyZW50RGF0ZTp0LGRlZmF1bHROb3RlVXVpZDpuLHByb3ZpZGVyQXBpS2V5OnIscHJvdmlkZXJFbTpvLHRhc2tEb21haW5VVUlEOmEsdGltZUZvcm1hdDppfSl7bGV0IHM9UGUoKVtqLlBST1BPU0VEX0FHRU5EQV9QUklPUklUWV18fG51bGwsbD1QZSgpW2ouUFJPUE9TRURfQUdFTkRBX0xMTV18fG51bGwsW2QsY109KDAsU2UudXNlU3RhdGUpKCExKSxbcCx1XT0oMCxTZS51c2VTdGF0ZSkoITEpLFtmLHZdPSgwLFNlLnVzZVN0YXRlKShudWxsKSxbdyxiXT0oMCxTZS51c2VTdGF0ZSkobnVsbCksW2csbV09KDAsU2UudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxbeSxoXT0oMCxTZS51c2VTdGF0ZSkobnVsbCksW3gsRV09KDAsU2UudXNlU3RhdGUpKCEwKSxbVCxEXT0oMCxTZS51c2VTdGF0ZSkobHx8b3x8bnVsbCksW0EsX109KDAsU2UudXNlU3RhdGUpKFtdKSxbSSxNXT0oMCxTZS51c2VTdGF0ZSkoc3x8dmspLFtQLHpdPSgwLFNlLnVzZVN0YXRlKShbXSksW0IsV109KDAsU2UudXNlU3RhdGUpKCExKSxbc2UsT109KDAsU2UudXNlU3RhdGUpKG51bGwpLFskLE5dPSgwLFNlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksUz0oMCxTZS51c2VSZWYpKG51bGwpLFI9KDAsU2UudXNlTWVtbykoKCk9Pih7ZGF0ZTp0LHByaW9yaXR5S2V5OkkscHJvdmlkZXJFbTpzZX0pLFt0LEksc2VdKSxGPSgwLFNlLnVzZUNhbGxiYWNrKSgoe2ZvcmNlUmVnZW5lcmF0ZTpvZT0hMX09e30pPT5fayhlLHtjdXJyZW50RGF0ZTp0LGRvbWFpblV1aWQ6YSxmb3JjZVJlZ2VuZXJhdGU6b2UscHJpb3JpdHlLZXk6SSxwcm92aWRlckVtOlQsc2V0QXBwcm92aW5nOmMsc2V0QXR0cmlidXRpb246dixzZXREYXRlTGFiZWw6YixzZXREaXNtaXNzZWRLZXlzOm0sc2V0RXJyb3I6aCxzZXRMb2FkaW5nOkUsc2V0T2JsaWdhdGlvbnM6XyxzZXRQcm9wb3NlZDp6LHNldFJlY29yZFByb3ZpZGVyRW06TyxzZXRTY2hlZHVsZWRLZXlzOk59KSxbZSx0LFQsSSxyLGFdKSxYPSgwLFNlLnVzZUNhbGxiYWNrKSgoKT0+VyghMCksW10pLFE9KDAsU2UudXNlQ2FsbGJhY2spKG9lPT57VyghMSksb2UmJm9lIT09VCYmKEQob2UpLGUuc2V0U2V0dGluZyhqLlBST1BPU0VEX0FHRU5EQV9MTE0sb2UpLFZvKGouUFJPUE9TRURfQUdFTkRBX0xMTSxvZSkpfSxbZSxUXSksWj0oMCxTZS51c2VDYWxsYmFjaykob2U9PntsZXQgSz1vZS50YXJnZXQudmFsdWU7TShLKSxlLnNldFNldHRpbmcoai5QUk9QT1NFRF9BR0VOREFfUFJJT1JJVFksSyksVm8oai5QUk9QT1NFRF9BR0VOREFfUFJJT1JJVFksSyl9LFtlXSkscT0oMCxTZS51c2VDYWxsYmFjaykoKG9lLEspPT57b2UucHJldmVudERlZmF1bHQoKSxtKGZlPT5uZXcgU2V0KGZlKS5hZGQoSXQoSykpKSx4cyhlLFIsW0l0KEspXSxPdC5ESVNNSVNTRUQpfSxbZSxSXSkscmU9KDAsU2UudXNlQ2FsbGJhY2spKCgpPT57bGV0IG9lPVAuZmlsdGVyKEs9PiEkLmhhcyhJdChLKSkpLm1hcChJdCk7bShLPT57bGV0IGZlPW5ldyBTZXQoSyk7cmV0dXJuIG9lLmZvckVhY2goVmU9PmZlLmFkZChWZSkpLGZlfSkseHMoZSxSLG9lLE90LkRJU01JU1NFRCl9LFtlLFIsUCwkXSkscGU9KDAsU2UudXNlQ2FsbGJhY2spKChvZSxLKT0+KG9lLnByZXZlbnREZWZhdWx0KCksYXQoInNjaGVkdWxlUHJvcG9zZWRBZ2VuZGFSb3ciLHtoYXNUYXNrOiEhSy50YXNrVXVpZH0pLENrKGUsSyxuLE4sUikpLFtlLG4sUl0pLGdlPSgwLFNlLnVzZUNhbGxiYWNrKShhc3luYyhvZSxLKT0+e29lLnByZXZlbnREZWZhdWx0KCk7bGV0IGZlPUsubm90ZVV1aWR8fChhd2FpdCBlLmdldFRhc2soSy50YXNrVXVpZCkpLm5vdGVVVUlEO2F3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtmZX1gKX0sW2VdKSxoZT0oMCxTZS51c2VDYWxsYmFjaykoKCk9PihhdCgic2NoZWR1bGVBbGxQcm9wb3NlZEFnZW5kYSIse2NvdW50OnBoKFAsJCxnKX0pLERrKGUse2RlZmF1bHROb3RlVXVpZDpuLGRpc21pc3NlZEtleXM6ZyxsbG1EYXRlUmVjb3JkOlIscHJvcG9zZWQ6UCxzY2hlZHVsZWRLZXlzOiQsc2V0QXBwcm92aW5nOmMsc2V0U2NoZWR1bGVkS2V5czpOfSkpLFtlLG4sZyxSLFAsJF0pO2lmKCgwLFNlLnVzZUVmZmVjdCkoKCk9PntGKCl9LFtGXSksKDAsU2UudXNlRWZmZWN0KSgoKT0+e3VvKFMuY3VycmVudCl9LFtBLFBdKSwoMCxTZS51c2VFZmZlY3QpKCgpPT57bHx8byYmbyE9PVQmJkQobyl9LFtvLGxdKSwoMCxTZS51c2VFZmZlY3QpKCgpPT57bGV0IG9lPSExO3JldHVybiBQcm9taXNlLnJlc29sdmUoZS5maW5kTm90ZSh7bmFtZTppcn0pKS50aGVuKEs9PntvZXx8dSghIUspfSksKCk9PntvZT0hMH19LFtlXSkseClyZXR1cm4oMCxkZS5qc3gpKHQyLHt9KTtpZih5KXJldHVybiEhISh0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MuZW52Py5PUEVOX0FJX0FDQ0VTU19UT0tFTnx8IiJ8fHIpJiZYTy5oYXMoeS5lcnJvckNvZGUpPygwLGRlLmpzeCkod3Mse2FwcDplLGZlYXR1cmVzOlpPLGljb246Ilx1ezFGNUQzfVx1RkUwRiIsbW9yZUZlYXR1cmVzTGFiZWw6IisgMTUgbW9yZSBmZWF0dXJlcyBpbmNsdWRlZCIsdGl0bGU6bGUoeW8pLHdpZGdldElkOnlvfSk6KDAsZGUuanN4KShNayx7bWVzc2FnZTp5LmVycm9yLG9uUmV0cnk6KCk9PkYoKX0pO2xldCBFZT1BayhBLFAsZyk7aWYoRWUubGVuZ3RoPT09MClyZXR1cm4oMCxkZS5qc3gpKE1rLHttZXNzYWdlOiJObyBzY2hlZHVsZSBjb3VsZCBiZSBwcm9wb3NlZCB5ZXQuIixvblJldHJ5OigpPT5GKCl9KTtsZXQgQWU9cGgoUCwkLGcpLGNlPSgwLGRlLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIix0aXRsZToiUHJvcG9zZSBhIGZyZXNoIHNjaGVkdWxlIChyZXBsYWNlcyB0b2RheSdzIHNhdmVkIHNldCkiLG9uQ2xpY2s6b2U9PntvZS5wcmV2ZW50RGVmYXVsdCgpLEYoe2ZvcmNlUmVnZW5lcmF0ZTohMH0pfSxjaGlsZHJlbjoiXHV7MUY1MDR9IFJlc2VlZCJ9KTtyZXR1cm4oMCxkZS5qc3hzKShkZS5GcmFnbWVudCx7Y2hpbGRyZW46WygwLGRlLmpzeHMpKGllLHt0aXRsZTpsZSh5byksc3VidGl0bGU6dyxpY29uOiJcdXsxRjVEM31cdUZFMEYiLHdpZGdldElkOnlvLGhlYWRlckFjdGlvbnM6Y2UsY2hpbGRyZW46WygwLGRlLmpzeCkobjIse21vZGVsTmFtZTplMihUKSxvbkNoYW5nZU1vZGVsOlgsb25Qcmlvcml0eUNoYW5nZTpaLHByaW9yaXR5S2V5Okl9KSwoMCxkZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1saXN0IixyZWY6UyxjaGlsZHJlbjpFZS5tYXAob2U9PigwLGRlLmpzeCkocjIse29uRGlzbWlzczpxLG9uT3Blbk5vdGU6Z2Usb25TY2hlZHVsZTpwZSxyb3c6b2Usc2NoZWR1bGVkS2V5czokLHRpbWVGb3JtYXQ6aX0sSXQob2UpKSl9KSwoMCxkZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtZm9vdGVyIixjaGlsZHJlbjpbKDAsZGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYXBwcm92ZSIsb25DbGljazpoZSxkaXNhYmxlZDpkfHxBZT09PTAsY2hpbGRyZW46ZD8iQXBwcm92aW5nIFx1MjAyNiI6IkFwcHJvdmUgc2NoZWR1bGUifSksKDAsZGUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtZGlzbWlzcy1hbGwiLG9uQ2xpY2s6cmUsZGlzYWJsZWQ6QWU9PT0wLGNoaWxkcmVuOiJEaXNtaXNzIGFsbCJ9KV19KSwoMCxkZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtcGVuZGluZyIsY2hpbGRyZW46YCR7QWV9IHBlbmRpbmdgfSksZj8oMCxkZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYXR0cmlidXRpb24iLGNoaWxkcmVuOmZ9KTpudWxsXX0pLEI/KDAsZGUuanN4KSh5cyx7YWxsb3dLZXlsZXNzUHJvdmlkZXJzOnAsY29uZmlndXJlZFByb3ZpZGVyRW1zOlpsKFBlKCkpLGN1cnJlbnRQcm92aWRlckVtOlQsb25DYW5jZWw6KCk9PlcoITEpLG9uU2VsZWN0OlEsc3VibWl0TGFiZWw6IlN1Ym1pdCIsdGl0bGU6IkdlbmVyYXRlIHRoZSBhZ2VuZGEgd2l0aCB3aGljaCBBSSBwcm92aWRlcj8ifSk6bnVsbF19KX12YXIgSm89VSh5ZSgpKTt2YXIgbzI9W3t0ZXh0OiJUaGUgc2VjcmV0IG9mIGdldHRpbmcgYWhlYWQgaXMgZ2V0dGluZyBzdGFydGVkLiIsYXV0aG9yOiJNYXJrIFR3YWluIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGdyZWF0IHRvIHN0YXJ0LCBidXQgeW91IGhhdmUgdG8gc3RhcnQgdG8gYmUgZ3JlYXQuIixhdXRob3I6IlppZyBaaWdsYXIifSx7dGV4dDoiQWN0aW9uIGlzIHRoZSBmb3VuZGF0aW9uYWwga2V5IHRvIGFsbCBzdWNjZXNzLiIsYXV0aG9yOiJQYWJsbyBQaWNhc3NvIn0se3RleHQ6IkRvbmUgaXMgYmV0dGVyIHRoYW4gcGVyZmVjdC4iLGF1dGhvcjoiU2hlcnlsIFNhbmRiZXJnIn0se3RleHQ6IkFtYXRldXJzIHNpdCBhbmQgd2FpdCBmb3IgaW5zcGlyYXRpb247IHRoZSByZXN0IG9mIHVzIGp1c3QgZ2V0IHVwIGFuZCBnbyB0byB3b3JrLiIsYXV0aG9yOiJTdGVwaGVuIEtpbmcifSx7dGV4dDoiVGhlIHdheSB0byBnZXQgc3RhcnRlZCBpcyB0byBxdWl0IHRhbGtpbmcgYW5kIGJlZ2luIGRvaW5nLiIsYXV0aG9yOiJXYWx0IERpc25leSJ9LHt0ZXh0OiJGb2N1cyBvbiBiZWluZyBwcm9kdWN0aXZlIGluc3RlYWQgb2YgYnVzeS4iLGF1dGhvcjoiVGltIEZlcnJpc3MifSx7dGV4dDoiSXQncyBub3QgYWJvdXQgaGF2aW5nIHRpbWUuIEl0J3MgYWJvdXQgbWFraW5nIHRpbWUuIixhdXRob3I6IiJ9LHt0ZXh0OiJXb3JrIGV4cGFuZHMgdG8gZmlsbCB0aGUgdGltZSBhdmFpbGFibGUgZm9yIGl0cyBjb21wbGV0aW9uLiIsYXV0aG9yOiJDeXJpbCBOb3J0aGNvdGUgUGFya2luc29uIn0se3RleHQ6IlN0b3Agd2FpdGluZyBmb3IgdGhlIHJpZ2h0IHRpbWUuIFRoZSB0aW1lIHdpbGwgbmV2ZXIgYmUganVzdCByaWdodC4iLGF1dGhvcjoiTmFwb2xlb24gSGlsbCJ9LHt0ZXh0OiJNb3RpdmF0aW9uIGlzIHdoYXQgZ2V0cyB5b3Ugc3RhcnRlZC4gSGFiaXQgaXMgd2hhdCBrZWVwcyB5b3UgZ29pbmcuIixhdXRob3I6IkppbSBSeXVuIn0se3RleHQ6IklmIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lIHRoaW5raW5nIGFib3V0IGEgdGhpbmcsIHlvdSdsbCBuZXZlciBnZXQgaXQgZG9uZS4iLGF1dGhvcjoiQnJ1Y2UgTGVlIn0se3RleHQ6IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JkaW5hcnkgYW5kIGV4dHJhb3JkaW5hcnkgaXMgdGhhdCBsaXR0bGUgJ2V4dHJhJy4iLGF1dGhvcjoiIn0se3RleHQ6IkVmZmljaWVuY3kgaXMgZG9pbmcgdGhpbmdzIHJpZ2h0LiBFZmZlY3RpdmVuZXNzIGlzIGRvaW5nIHRoZSByaWdodCB0aGluZ3MuIixhdXRob3I6IlBldGVyIERydWNrZXIifSx7dGV4dDoiWW91IGFyZSBuZXZlciB0b28gb2xkIHRvIHNldCBhbm90aGVyIGdvYWwgb3IgdG8gZHJlYW0gYSBuZXcgZHJlYW0uIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiU21hbGwgZGFpbHkgaW1wcm92ZW1lbnRzIGFyZSB0aGUga2V5IHRvIHN0YWdnZXJpbmcgbG9uZy10ZXJtIHJlc3VsdHMuIixhdXRob3I6IlJvYmluIFNoYXJtYSJ9LHt0ZXh0OiJEcmVhbXMgZG9uJ3Qgd29yayB1bmxlc3MgeW91IGRvLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifSx7dGV4dDoiVGhlIG1vc3QgZWZmZWN0aXZlIHdheSB0byBkbyBpdCBpcyB0byBkbyBpdC4iLGF1dGhvcjoiQW1lbGlhIEVhcmhhcnQifSx7dGV4dDoiVGFrZSB0aW1lIHRvIGRlbGliZXJhdGUsIGJ1dCB3aGVuIHRoZSB0aW1lIGZvciBhY3Rpb24gYXJyaXZlcywgc3RvcCB0aGlua2luZyBhbmQgZ28gaW4uIixhdXRob3I6Ik5hcG9sZW9uIEJvbmFwYXJ0ZSJ9LHt0ZXh0OiJTdHJpdmluZyBmb3IgZXhjZWxsZW5jZSBtb3RpdmF0ZXMgeW91OyBzdHJpdmluZyBmb3IgcGVyZmVjdGlvbiBpcyBkZW1vcmFsaXppbmcuIixhdXRob3I6IkhhcnJpZXQgQnJhaWtlciJ9LHt0ZXh0OiJUaGUgam91cm5leSBvZiBhIHRob3VzYW5kIG1pbGVzIGJlZ2lucyB3aXRoIGEgc2luZ2xlIHN0ZXAuIixhdXRob3I6IkxhbyBUenUifSx7dGV4dDoiQSB5ZWFyIGZyb20gbm93IHlvdSBtYXkgd2lzaCB5b3UgaGFkIHN0YXJ0ZWQgdG9kYXkuIixhdXRob3I6IkthcmVuIExhbWIifSx7dGV4dDoiVGhlIGJlZ2lubmluZyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGUgd29yay4iLGF1dGhvcjoiUGxhdG8ifSx7dGV4dDoiWW91IGRvbid0IG5lZWQgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UsIGp1c3QgdGFrZSB0aGUgZmlyc3Qgc3RlcC4iLGF1dGhvcjoiTWFydGluIEx1dGhlciBLaW5nIEpyLiJ9LHt0ZXh0OiJTdGFydCB3aGVyZSB5b3UgYXJlLiBVc2Ugd2hhdCB5b3UgaGF2ZS4gRG8gd2hhdCB5b3UgY2FuLiIsYXV0aG9yOiJBcnRodXIgQXNoZSJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBpcyB5b3UgaGF2ZSB0byBzYXkgdGhhdCB5b3UgY2FuLiIsYXV0aG9yOiJXaWxsIFNtaXRoIn0se3RleHQ6IkluIHRoZSBtaWRkbGUgb2YgZXZlcnkgZGlmZmljdWx0eSBsaWVzIG9wcG9ydHVuaXR5LiIsYXV0aG9yOiJBbGJlcnQgRWluc3RlaW4ifSx7dGV4dDoiRXZlbiB0aGUgbG9uZ2VzdCBqb3VybmV5IHN0YXJ0cyB3aXRoIHB1dHRpbmcgb25lIGZvb3QgaW4gZnJvbnQgb2YgdGhlIG90aGVyLiIsYXV0aG9yOiIifSx7dGV4dDoiWW91IGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdCB0byBzdGFydCwgYnV0IHlvdSBoYXZlIHRvIHN0YXJ0IHRvIGJlIHBlcmZlY3QuIixhdXRob3I6IiJ9LHt0ZXh0OiJDb3VyYWdlIGlzIG5vdCB0aGUgYWJzZW5jZSBvZiBmZWFyLCBidXQgdGhlIGp1ZGdtZW50IHRoYXQgc29tZXRoaW5nIGVsc2UgaXMgbW9yZSBpbXBvcnRhbnQuIixhdXRob3I6IkFtYnJvc2UgUmVkbW9vbiJ9LHt0ZXh0OiJXaGF0ZXZlciB5b3UgY2FuIGRvLCBvciBkcmVhbSB5b3UgY2FuIFx1MjAxNCBiZWdpbiBpdC4gQm9sZG5lc3MgaGFzIGdlbml1cywgcG93ZXIsIGFuZCBtYWdpYyBpbiBpdC4iLGF1dGhvcjoiSm9oYW5uIFdvbGZnYW5nIHZvbiBHb2V0aGUifSx7dGV4dDoiVGhlIGhhcmRlc3QgcGFydCBpcyBzdGFydGluZy4gT25jZSB5b3UgZ2V0IHRoYXQgb3V0IG9mIHRoZSB3YXksIHlvdSdsbCBmaW5kIHRoZSByZXN0IG9mIHRoZSBqb3VybmV5IG11Y2ggZWFzaWVyLiIsYXV0aG9yOiIifSx7dGV4dDoiSW5hY3Rpb24gYnJlZWRzIGRvdWJ0IGFuZCBmZWFyLiBBY3Rpb24gYnJlZWRzIGNvbmZpZGVuY2UgYW5kIGNvdXJhZ2UuIixhdXRob3I6IkRhbGUgQ2FybmVnaWUifSx7dGV4dDoiVGhlIGJlc3QgdGltZSB0byBwbGFudCBhIHRyZWUgd2FzIHR3ZW50eSB5ZWFycyBhZ28uIFRoZSBzZWNvbmQgYmVzdCB0aW1lIGlzIG5vdy4iLGF1dGhvcjoiQ2hpbmVzZSBQcm92ZXJiIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGZlYXJsZXNzLiBKdXN0IGRvbid0IGxldCBmZWFyIHN0b3AgeW91LiIsYXV0aG9yOiIifSx7dGV4dDoiUHJvZ3Jlc3MsIG5vdCBwZXJmZWN0aW9uLCBpcyB0aGUgZ29hbC4iLGF1dGhvcjoiIn0se3RleHQ6Ik5vdGhpbmcgd2lsbCB3b3JrIHVubGVzcyB5b3UgZG8uIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJMZWFwIGFuZCB0aGUgbmV0IHdpbGwgYXBwZWFyLiIsYXV0aG9yOiJKb2huIEJ1cnJvdWdocyJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBiaW5kcyBvbmUgdG8gdGhlIHNlY29uZC4iLGF1dGhvcjoiRnJlbmNoIFByb3ZlcmIifSx7dGV4dDoiVGFrZSB0aGUgZmlyc3Qgc3RlcCBpbiBmYWl0aC4gWW91IGRvbid0IGhhdmUgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UuIixhdXRob3I6Ik1hcnRpbiBMdXRoZXIgS2luZyBKci4ifSx7dGV4dDoiVG9kYXkgaXMgYSBuZXcgZGF5LiBEb24ndCBsZXQgeWVzdGVyZGF5J3MgZmFpbHVyZXMgaGF1bnQgaXQuIixhdXRob3I6IiJ9LHt0ZXh0OiJFdmVyeSBtb3JuaW5nIHdlIGFyZSBib3JuIGFnYWluLiBXaGF0IHdlIGRvIHRvZGF5IG1hdHRlcnMgbW9zdC4iLGF1dGhvcjoiQnVkZGhhIn0se3RleHQ6IldpdGggdGhlIG5ldyBkYXkgY29tZXMgbmV3IHN0cmVuZ3RoIGFuZCBuZXcgdGhvdWdodHMuIixhdXRob3I6IkVsZWFub3IgUm9vc2V2ZWx0In0se3RleHQ6IlRvZGF5IGlzIGFub3RoZXIgY2hhbmNlIHRvIGdldCBiZXR0ZXIuIixhdXRob3I6IiJ9LHt0ZXh0OiJZZXN0ZXJkYXkgaXMgbm90IG91cnMgdG8gcmVjb3ZlciwgYnV0IHRvbW9ycm93IGlzIG91cnMgdG8gd2luIG9yIGxvc2UuIixhdXRob3I6Ikx5bmRvbiBCLiBKb2huc29uIn0se3RleHQ6IlRoZSBzdW4gaXMgYSBkYWlseSByZW1pbmRlciB0aGF0IHdlIHRvbyBjYW4gcmlzZSBhZ2FpbiBmcm9tIHRoZSBkYXJrbmVzcy4iLGF1dGhvcjoiUy4gQWpuYSJ9LHt0ZXh0OiJFdmVyeSBkYXkgaXMgYSBzZWNvbmQgY2hhbmNlLiIsYXV0aG9yOiIifSx7dGV4dDoiVG9kYXkncyBhY2NvbXBsaXNobWVudHMgd2VyZSB5ZXN0ZXJkYXkncyBpbXBvc3NpYmlsaXRpZXMuIixhdXRob3I6IlJvYmVydCBILiBTY2h1bGxlciJ9LHt0ZXh0OiJFYWNoIG5ldyBkYXkgaXMgYSBibGFuayBwYWdlIGluIHRoZSBkaWFyeSBvZiB5b3VyIGxpZmUuIixhdXRob3I6IiJ9LHt0ZXh0OiJBbiBvcHRpbWlzdCBzZWVzIGFuIG9wcG9ydHVuaXR5IGluIGV2ZXJ5IGNhbGFtaXR5OyBhIHBlc3NpbWlzdCBzZWVzIGEgY2FsYW1pdHkgaW4gZXZlcnkgb3Bwb3J0dW5pdHkuIixhdXRob3I6IldpbnN0b24gQ2h1cmNoaWxsIn0se3RleHQ6Ik9wcG9ydHVuaXRpZXMgZG9uJ3QgaGFwcGVuLiBZb3UgY3JlYXRlIHRoZW0uIixhdXRob3I6IkNocmlzIEdyb3NzZXIifSx7dGV4dDoiVGhpcyBpcyBhIHdvbmRlcmZ1bCBkYXkuIEkndmUgbmV2ZXIgc2VlbiB0aGlzIG9uZSBiZWZvcmUuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJZb3UgaGF2ZSBleGFjdGx5IG9uZSBsaWZlIGluIHdoaWNoIHRvIGRvIGV2ZXJ5dGhpbmcgeW91J2xsIGV2ZXIgZG8uIEFjdCBhY2NvcmRpbmdseS4iLGF1dGhvcjoiQ29saW4gV3JpZ2h0In0se3RleHQ6IkxpZmUgaXMgd2hhdCBoYXBwZW5zIHdoZW4geW91J3JlIGJ1c3kgbWFraW5nIG90aGVyIHBsYW5zLiIsYXV0aG9yOiJKb2huIExlbm5vbiJ9LHt0ZXh0OiJZb3VyIGxpZmUgZG9lcyBub3QgZ2V0IGJldHRlciBieSBjaGFuY2UsIGl0IGdldHMgYmV0dGVyIGJ5IGNoYW5nZS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiRG9uJ3Qgd2F0Y2ggdGhlIGNsb2NrOyBkbyB3aGF0IGl0IGRvZXMuIEtlZXAgZ29pbmcuIixhdXRob3I6IlNhbSBMZXZlbnNvbiJ9LHt0ZXh0OiJCZWxpZXZlIHlvdSBjYW4gYW5kIHlvdSdyZSBoYWxmd2F5IHRoZXJlLiIsYXV0aG9yOiJUaGVvZG9yZSBSb29zZXZlbHQifSx7dGV4dDoiSXQgZG9lcyBub3QgbWF0dGVyIGhvdyBzbG93bHkgeW91IGdvIGFzIGxvbmcgYXMgeW91IGRvIG5vdCBzdG9wLiIsYXV0aG9yOiJDb25mdWNpdXMifSx7dGV4dDoiVGhlIG9ubHkgbGltaXQgdG8gb3VyIHJlYWxpemF0aW9uIG9mIHRvbW9ycm93IHdpbGwgYmUgb3VyIGRvdWJ0cyBvZiB0b2RheS4iLGF1dGhvcjoiRnJhbmtsaW4gRC4gUm9vc2V2ZWx0In0se3RleHQ6IlRoZSBmdXR1cmUgYmVsb25ncyB0byB0aG9zZSB3aG8gYmVsaWV2ZSBpbiB0aGUgYmVhdXR5IG9mIHRoZWlyIGRyZWFtcy4iLGF1dGhvcjoiRWxlYW5vciBSb29zZXZlbHQifSx7dGV4dDoiSWYgeW91J3JlIGdvaW5nIHRocm91Z2ggaGVsbCwga2VlcCBnb2luZy4iLGF1dGhvcjoiV2luc3RvbiBDaHVyY2hpbGwifSx7dGV4dDoiUGVyc2lzdGVuY2UgZ3VhcmFudGVlcyB0aGF0IHJlc3VsdHMgYXJlIGluZXZpdGFibGUuIixhdXRob3I6IlBhcmFtYWhhbnNhIFlvZ2FuYW5kYSJ9LHt0ZXh0OiJTdWNjZXNzIGlzIG5vdCBmaW5hbCwgZmFpbHVyZSBpcyBub3QgZmF0YWw6IGl0IGlzIHRoZSBjb3VyYWdlIHRvIGNvbnRpbnVlIHRoYXQgY291bnRzLiIsYXV0aG9yOiJXaW5zdG9uIENodXJjaGlsbCJ9LHt0ZXh0OiJZb3UgbWlzcyAxMDAlIG9mIHRoZSBzaG90cyB5b3UgZG9uJ3QgdGFrZS4iLGF1dGhvcjoiV2F5bmUgR3JldHpreSJ9LHt0ZXh0OiJJdCBhbHdheXMgc2VlbXMgaW1wb3NzaWJsZSB1bnRpbCBpdCdzIGRvbmUuIixhdXRob3I6Ik5lbHNvbiBNYW5kZWxhIn0se3RleHQ6IldlIG1heSBlbmNvdW50ZXIgbWFueSBkZWZlYXRzLCBidXQgd2UgbXVzdCBub3QgYmUgZGVmZWF0ZWQuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJJIG5ldmVyIGRyZWFtZWQgYWJvdXQgc3VjY2Vzcy4gSSB3b3JrZWQgZm9yIGl0LiIsYXV0aG9yOiJFc3RceEU5ZSBMYXVkZXIifSx7dGV4dDoiVGhlIG9ubHkgd2F5IG91dCBpcyB0aHJvdWdoLiIsYXV0aG9yOiJSb2JlcnQgRnJvc3QifSx7dGV4dDoiSGFyZHNoaXBzIG9mdGVuIHByZXBhcmUgb3JkaW5hcnkgcGVvcGxlIGZvciBhbiBleHRyYW9yZGluYXJ5IGRlc3RpbnkuIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiQWN0IGFzIGlmIHdoYXQgeW91IGRvIG1ha2VzIGEgZGlmZmVyZW5jZS4gSXQgZG9lcy4iLGF1dGhvcjoiV2lsbGlhbSBKYW1lcyJ9LHt0ZXh0OiJJbiB0aGUgbWlkZGxlIG9mIGRpZmZpY3VsdHkgbGllcyBvcHBvcnR1bml0eS4iLGF1dGhvcjoiQWxiZXJ0IEVpbnN0ZWluIn0se3RleHQ6IllvdSBhcmUgYnJhdmVyIHRoYW4geW91IGJlbGlldmUsIHN0cm9uZ2VyIHRoYW4geW91IHNlZW0sIGFuZCBzbWFydGVyIHRoYW4geW91IHRoaW5rLiIsYXV0aG9yOiJBLkEuIE1pbG5lIn0se3RleHQ6IktlZXAgeW91ciBleWVzIG9uIHRoZSBzdGFycyBhbmQgeW91ciBmZWV0IG9uIHRoZSBncm91bmQuIixhdXRob3I6IlRoZW9kb3JlIFJvb3NldmVsdCJ9LHt0ZXh0OiJXaGF0IHlvdSBkbyB0b2RheSBjYW4gaW1wcm92ZSBhbGwgeW91ciB0b21vcnJvd3MuIixhdXRob3I6IlJhbHBoIE1hcnN0b24ifSx7dGV4dDoiRG9uJ3QgYmUgcHVzaGVkIGFyb3VuZCBieSB0aGUgZmVhcnMgaW4geW91ciBtaW5kLiBCZSBsZWQgYnkgdGhlIGRyZWFtcyBpbiB5b3VyIGhlYXJ0LiIsYXV0aG9yOiJSb3kgVC4gQmVubmV0dCJ9LHt0ZXh0OiJUaGUgb25seSBwZXJzb24geW91IHNob3VsZCB0cnkgdG8gYmUgYmV0dGVyIHRoYW4gaXMgd2hvIHlvdSB3ZXJlIHllc3RlcmRheS4iLGF1dGhvcjoiIn0se3RleHQ6IklmIHlvdSB3YW50IHRvIGFjaGlldmUgZ3JlYXRuZXNzLCBzdG9wIGFza2luZyBmb3IgcGVybWlzc2lvbi4iLGF1dGhvcjoiIn0se3RleHQ6IlRoaW5ncyB3b3JrIG91dCBiZXN0IGZvciB0aG9zZSB3aG8gbWFrZSB0aGUgYmVzdCBvZiBob3cgdGhpbmdzIHdvcmsgb3V0LiIsYXV0aG9yOiJKb2huIFdvb2RlbiJ9LHt0ZXh0OiJUbyBsaXZlIGEgY3JlYXRpdmUgbGlmZSwgd2UgbXVzdCBsb3NlIG91ciBmZWFyIG9mIGJlaW5nIHdyb25nLiIsYXV0aG9yOiJKb3NlcGggQ2hpbHRvbiBQZWFyY2UifSx7dGV4dDoiSWYgeW91IGFyZSBub3Qgd2lsbGluZyB0byByaXNrIHRoZSB1c3VhbCwgeW91IHdpbGwgaGF2ZSB0byBzZXR0bGUgZm9yIHRoZSBvcmRpbmFyeS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiVHJ1c3QgeW91cnNlbGYuIFlvdSBrbm93IG1vcmUgdGhhbiB5b3UgdGhpbmsgeW91IGRvLiIsYXV0aG9yOiJCZW5qYW1pbiBTcG9jayJ9LHt0ZXh0OiJXaGF0IHNlZW1zIHRvIHVzIGFzIGJpdHRlciB0cmlhbHMgYXJlIG9mdGVuIGJsZXNzaW5ncyBpbiBkaXNndWlzZS4iLGF1dGhvcjoiT3NjYXIgV2lsZGUifSx7dGV4dDoiVGhlIG9ubHkgcGxhY2Ugd2hlcmUgc3VjY2VzcyBjb21lcyBiZWZvcmUgd29yayBpcyBpbiB0aGUgZGljdGlvbmFyeS4iLGF1dGhvcjoiVmlkYWwgU2Fzc29vbiJ9LHt0ZXh0OiJUb28gbWFueSBvZiB1cyBhcmUgbm90IGxpdmluZyBvdXIgZHJlYW1zIGJlY2F1c2Ugd2UgYXJlIGxpdmluZyBvdXIgZmVhcnMuIixhdXRob3I6IkxlcyBCcm93biJ9LHt0ZXh0OiJJIGZpbmQgdGhhdCB0aGUgaGFyZGVyIEkgd29yaywgdGhlIG1vcmUgbHVjayBJIHNlZW0gdG8gaGF2ZS4iLGF1dGhvcjoiVGhvbWFzIEplZmZlcnNvbiJ9LHt0ZXh0OiJTdWNjZXNzIHVzdWFsbHkgY29tZXMgdG8gdGhvc2Ugd2hvIGFyZSB0b28gYnVzeSB0byBiZSBsb29raW5nIGZvciBpdC4iLGF1dGhvcjoiSGVucnkgRGF2aWQgVGhvcmVhdSJ9LHt0ZXh0OiJJZiB5b3UgcmVhbGx5IGxvb2sgY2xvc2VseSwgbW9zdCBvdmVybmlnaHQgc3VjY2Vzc2VzIHRvb2sgYSBsb25nIHRpbWUuIixhdXRob3I6IlN0ZXZlIEpvYnMifSx7dGV4dDoiTmV2ZXIgZ2l2ZSB1cCBvbiBhIGRyZWFtIGp1c3QgYmVjYXVzZSBvZiB0aGUgdGltZSBpdCB3aWxsIHRha2UgdG8gYWNjb21wbGlzaCBpdC4iLGF1dGhvcjoiRWFybCBOaWdodGluZ2FsZSJ9LHt0ZXh0OiJZb3UndmUgZ290IHRvIGdldCB1cCBldmVyeSBtb3JuaW5nIHdpdGggZGV0ZXJtaW5hdGlvbiBpZiB5b3UncmUgZ29pbmcgdG8gZ28gdG8gYmVkIHdpdGggc2F0aXNmYWN0aW9uLiIsYXV0aG9yOiJHZW9yZ2UgTG9yaW1lciJ9LHt0ZXh0OiJUaGUgc2VjcmV0IG9mIHlvdXIgc3VjY2VzcyBpcyBkZXRlcm1pbmVkIGJ5IHlvdXIgZGFpbHkgYWdlbmRhLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifV07ZnVuY3Rpb24gU3MoZT0yKXtyZXR1cm5bLi4ubzJdLnNvcnQoKCk9Pk1hdGgucmFuZG9tKCktLjUpLnNsaWNlKDAsZSl9dmFyIGRyPVUoZWUoKSk7ZnVuY3Rpb24gaGgoe2dyaWRIZWlnaHRTaXplOmUscGxhbkNvbnRlbnQ6dCxxdW90ZXM6bn0pe2xldCByPShlfHwxKT49Mj80OjIsW28sYV09KDAsSm8udXNlU3RhdGUpKG58fCh0P1tdOlNzKHIpKSksW2ksc109KDAsSm8udXNlU3RhdGUpKCFuJiYhIXQpLFtsXT0oMCxKby51c2VTdGF0ZSkoKCk9PmAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gKTsoMCxKby51c2VFZmZlY3QpKCgpPT57bnx8YShTcyhyKSl9LFtdKSwoMCxKby51c2VFZmZlY3QpKCgpPT57IWkmJm8ubGVuZ3RoPHImJmEoU3MocikpfSxbcl0pO2xldCBjPSgwLGRyLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6KCk9PnthKFNzKHIpKX0sdGl0bGU6IlJlc2VlZCBxdW90ZXMiLGNoaWxkcmVuOiJcdTIxQkIgUmVzZWVkIn0pO3JldHVybiBpPygwLGRyLmpzeCkoaWUse3RpdGxlOmxlKCJxdW90ZXMiKSxpY29uOiJcdXsxRjRBMX0iLHdpZGdldElkOiJxdW90ZXMiLGNoaWxkcmVuOigwLGRyLmpzeCkoImRpdiIse2NsYXNzTmFtZToicXVvdGVzLWxvYWRpbmciLGNoaWxkcmVuOiJHZW5lcmF0aW5nIHF1b3Rlcy4uLiJ9KX0pOigwLGRyLmpzeCkoaWUse3RpdGxlOmxlKCJxdW90ZXMiKSxpY29uOiJcdXsxRjRBMX0iLHdpZGdldElkOiJxdW90ZXMiLGhlYWRlckFjdGlvbnM6YyxjaGlsZHJlbjooMCxkci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InF1b3Rlcy1ncmlkIixjaGlsZHJlbjpvLnNsaWNlKDAscikubWFwKChwLHUpPT4oMCxkci5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJxdW90ZS10aWxlIixzdHlsZTp7YmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDAuNikpLCB1cmwoIitCZCgic21hbGwiLGwsdSkrIikifSxjaGlsZHJlbjpbKDAsZHIuanN4KSgicCIse2NsYXNzTmFtZToicXVvdGUtdGV4dCIsY2hpbGRyZW46JyInK3AudGV4dCsnIid9KSxwLmF1dGhvcj8oMCxkci5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxdW90ZS1hdXRob3IiLGNoaWxkcmVuOiJcdTIwMTQgIitwLmF1dGhvcn0pOm51bGxdfSx1KSl9KX0pfXZhciBYbz1VKGVlKCkpLGEyPXtkYWlseUpvdDoiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy9qb3RzIixqb3VybmFsOiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzL2pvdHMiLGNhbGVuZGFyOiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzL2NhbGVuZGFyIn07YXN5bmMgZnVuY3Rpb24gaTIoZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpfWNhdGNoe3JldHVybn1sZXQgbj0oQXJyYXkuaXNBcnJheSh0KT90OltdKS5maWx0ZXIobz0+byE9bnVsbCkuZmxhdE1hcChvPT5vLm5vdGVzfHxbXSk7aWYoIW4ubGVuZ3RoKXJldHVybjtsZXQgcj1uW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpuLmxlbmd0aCldO3I/LnV1aWQmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtyLnV1aWR9YCl9ZnVuY3Rpb24gZ2goe2FwcDplfSl7bGV0IHQ9W3tsYWJlbDoiRGFpbHkgSm90IixpY29uOiJcdXsxRjRERH0iLGFjdGlvbjoiZGFpbHlKb3QifSx7bGFiZWw6IkpvdXJuYWwiLGljb246Ilx1ezFGNEQzfSIsYWN0aW9uOiJqb3VybmFsIn0se2xhYmVsOiJDYWxlbmRhciIsaWNvbjoiXHV7MUY0QzV9IixhY3Rpb246ImNhbGVuZGFyIn0se2xhYmVsOiJSYW5kb20gTm90ZSIsaWNvbjoiXHV7MUYzQjJ9IixhY3Rpb246InJhbmRvbU5vdGUifV0sbj1hc3luYyByPT57aWYocj09PSJyYW5kb21Ob3RlIil7YXdhaXQgaTIoZSk7cmV0dXJufWxldCBvPWEyW3JdO28mJmF3YWl0IGUubmF2aWdhdGUobyl9O3JldHVybigwLFhvLmpzeCkoaWUse3RpdGxlOmxlKCJxdWljay1hY3Rpb25zIiksaWNvbjoiXHUyNkExIix3aWRnZXRJZDoicXVpY2stYWN0aW9ucyIsY2hpbGRyZW46KDAsWG8uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJxYS1ncmlkIixjaGlsZHJlbjp0Lm1hcChyPT4oMCxYby5qc3hzKSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJxYS1idXR0b24iLG9uQ2xpY2s6KCk9Pm4oci5hY3Rpb24pLGNoaWxkcmVuOlsoMCxYby5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1pY29uIixjaGlsZHJlbjpyLmljb259KSwoMCxYby5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1sYWJlbCIsY2hpbGRyZW46ci5sYWJlbH0pXX0sci5hY3Rpb24pKX0pfSl9dmFyIHdvPVUoeWUoKSk7dmFyIHMyPTcqMjQqNjAqNjAqMWUzLFVrPTMsbDI9NSxkMj01LHprPTUwLGMyPTI1MCxtaD0yNTAsRms9Nyx1Mj0xO2Z1bmN0aW9uICRrKGUpe3JldHVybiBwMihgJHt6ZShuZXcgRGF0ZSl9LSR7ZX1gKX1hc3luYyBmdW5jdGlvbiBSayhlLHQsbj1uZXcgU2V0KXtsZXQgcj1uZXcgU2V0LG89W10sYT10P3tncm91cDoidGFza0xpc3RzIix0YXNrRG9tYWluVVVJRDp0fTp7Z3JvdXA6InRhc2tMaXN0cyJ9O2ZvciBhd2FpdChsZXQgaSBvZiBhd2FpdCBlLmZpbHRlck5vdGVzKGEsImNoYW5nZWQiKSlpZighbi5oYXMoaT8udXVpZCkmJmk/LnV1aWQmJiFyLmhhcyhpLnV1aWQpJiYoci5hZGQoaS51dWlkKSxvLnB1c2goaSksby5sZW5ndGg+PWMyKSlyZXR1cm4gbztyZXR1cm4gb31hc3luYyBmdW5jdGlvbiBXayhlLHQsbil7bGV0IHI9ZHQobi5kYXRlS2V5KSxvPWcyKG4sSGsocikpO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHQsbyl9YXN5bmMgZnVuY3Rpb24gQmsoe2FwcDplLG1heE5vdGVzOnQ9bDIsc2VlZDpuLHRhc2tEb21haW5VVUlEOnI9bnVsbH0pe2xldCBvPWF3YWl0IG0yKGUpLGE9aDIoby5zdGF0ZSxyLG8uc3RhdGUuZGF0ZUtleSksaT1hLnNlbGVjdGVkTm90ZXM7aWYoYS5zZWxlY3Rpb25TZWVkPT09biYmaS5sZW5ndGg+PU1hdGgubWluKFVrLHQpKXJldHVybiBQayhlLGkuc2xpY2UoMCx0KSk7bGV0IHM9YXdhaXQgYjIoZSxhLHIpLGw9cWQoWy4uLmEuc3RhbGVDYW5kaWRhdGVzLC4uLnMuc3RhbGVDYW5kaWRhdGVzXSksZD1hLmhpc3RvcnlCeURheSxjPWwuZmlsdGVyKHc9PiFWayhkKS5oYXMody51dWlkKSk7bC5sZW5ndGg+MCYmYy5sZW5ndGg9PT0wJiYoZD17fSxjPWwpO2xldCBwPXkyKGMsdCxuKSx1PWF3YWl0IFBrKGUscCksZj13Mih1KSx2PWYubWFwKHc9PncudXVpZCkuZmlsdGVyKEJvb2xlYW4pO2E9cWEoey4uLmEsaGlzdG9yeUJ5RGF5OkxrKGQsYS5kYXRlS2V5LHYsbWgpLHNlbGVjdGlvblNlZWQ6bixzZWxlY3RlZE5vdGVzOmYsc3RhbGVDYW5kaWRhdGVzOmwsdGFza0RvbWFpblVVSUQ6cix2aXNpdGVkQnlEYXk6TGsoYS52aXNpdGVkQnlEYXksYS5kYXRlS2V5LHMudmlzaXRlZFV1aWRzLG1oKX0sYS5kYXRlS2V5KTt0cnl7YXdhaXQgV2soZSxvLm5vdGVIYW5kbGUsYSl9Y2F0Y2godyl7aygiW1JlY2VudE5vdGVzXSBGYWlsZWQgdG8gcGVyc2lzdCByZWNlbnQtbm90ZSBzdGF0ZToiLHcpfXJldHVybiB1fWZ1bmN0aW9uIHAyKGUpe2xldCB0PTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdD0odCtlLmNoYXJDb2RlQXQobikqKG4rMSkpJTEwMDAwMDM7cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gUGsoZSx0KXtsZXQgbj1BcnJheS5pc0FycmF5KHQpP3Q6W107cmV0dXJuIFByb21pc2UuYWxsKG4ubWFwKHI9PmUuZmluZE5vdGUoe3V1aWQ6ci51dWlkfSkudGhlbihvPT4oe2xhdGVzdFRhc2tUaW1lc3RhbXA6ci5sYXRlc3RUYXNrVGltZXN0YW1wLG5vdGVIYW5kbGU6b3x8e25hbWU6ci5uYW1lLHV1aWQ6ci51dWlkfSx0YXNrQ291bnQ6ci50YXNrQ291bnR9KSkuY2F0Y2goKCk9Pih7bGF0ZXN0VGFza1RpbWVzdGFtcDpyLmxhdGVzdFRhc2tUaW1lc3RhbXAsbm90ZUhhbmRsZTp7bmFtZTpyLm5hbWUsdXVpZDpyLnV1aWR9LHRhc2tDb3VudDpyLnRhc2tDb3VudH0pKSkpfWZ1bmN0aW9uIGYyKGUpe2xldCB0PU51bWJlci5pc0Zpbml0ZShlKT9NYXRoLmFicyhNYXRoLmZsb29yKGUpKToxO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0PSh0KjkzMDErNDkyOTcpJTIzMzI4MCx0LzIzMzI4MH19ZnVuY3Rpb24gTGsoZSx0LG4scil7bGV0IG89UWQoZSx0KSxhPW9bdF18fFtdLGk9KEFycmF5LmlzQXJyYXkobik/bjpbXSkuZmlsdGVyKGw9PnR5cGVvZiBsPT0ic3RyaW5nIiYmbC5sZW5ndGg+MCkscz1bLi4ubmV3IFNldChbLi4uYSwuLi5pXSldLnNsaWNlKC1yKTtyZXR1cm4gUWQoey4uLm8sW3RdOnN9LHQpfWZ1bmN0aW9uIHFkKGUpe2xldCB0PW5ldyBTZXQsbj1bXTtmb3IobGV0IHIgb2YgQXJyYXkuaXNBcnJheShlKT9lOltdKXtsZXQgbz1yPy51dWlkfHxyPy5ub3RlSGFuZGxlPy51dWlkO2lmKCEoIW98fHQuaGFzKG8pKSYmKHQuYWRkKG8pLG4ucHVzaCh7bGF0ZXN0VGFza1RpbWVzdGFtcDpOdW1iZXIoci5sYXRlc3RUYXNrVGltZXN0YW1wKXx8MCxuYW1lOnIubmFtZXx8ci5ub3RlSGFuZGxlPy5uYW1lfHwiVW50aXRsZWQiLHRhc2tDb3VudDpOdW1iZXIoci50YXNrQ291bnQpfHwwLHV1aWQ6b30pLG4ubGVuZ3RoPj16aykpYnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gUWQoZSx0KXtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QifHxBcnJheS5pc0FycmF5KGUpKXJldHVybnt9O2xldCBuPWR0KHQpO24uc2V0RGF0ZShuLmdldERhdGUoKS1GaysxKTtsZXQgcj16ZShuKSxvPXt9O2ZvcihsZXRbYSxpXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtpZighL15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3QoYSl8fGE8ciljb250aW51ZTtsZXQgcz1BcnJheS5pc0FycmF5KGkpP2kuZmlsdGVyKGw9PnR5cGVvZiBsPT0ic3RyaW5nIiYmbC5sZW5ndGg+MCk6W107b1thXT1bLi4ubmV3IFNldChzKV0uc2xpY2UoLW1oKX1yZXR1cm4gb31mdW5jdGlvbiBxYShlLHQpe2xldCBuPWUmJnR5cGVvZiBlPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoZSk/ZTp7fTtyZXR1cm57ZGF0ZUtleTp0LGhpc3RvcnlCeURheTpRZChuLmhpc3RvcnlCeURheSx0KSxzY2hlbWFWZXJzaW9uOnUyLHNlbGVjdGlvblNlZWQ6TnVtYmVyLmlzRmluaXRlKG4uc2VsZWN0aW9uU2VlZCk/bi5zZWxlY3Rpb25TZWVkOm51bGwsc2VsZWN0ZWROb3RlczpxZChuLnNlbGVjdGVkTm90ZXMpLHN0YWxlQ2FuZGlkYXRlczpxZChuLnN0YWxlQ2FuZGlkYXRlcyksdGFza0RvbWFpblVVSUQ6dHlwZW9mIG4udGFza0RvbWFpblVVSUQ9PSJzdHJpbmciJiZuLnRhc2tEb21haW5VVUlELmxlbmd0aD4wP24udGFza0RvbWFpblVVSUQ6bnVsbCx2aXNpdGVkQnlEYXk6UWQobi52aXNpdGVkQnlEYXksdCl9fWZ1bmN0aW9uIGgyKGUsdCxuKXtyZXR1cm4oZT8udGFza0RvbWFpblVVSUR8fG51bGwpPT09KHR8fG51bGwpP2U6cWEoe3NlbGVjdGlvblNlZWQ6bnVsbCx0YXNrRG9tYWluVVVJRDp0fSxuKX1mdW5jdGlvbiBIayhlKXtyZXR1cm4gZS50b0xvY2FsZVN0cmluZyhbXSx7ZGF5OiJudW1lcmljIixtb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KX1mdW5jdGlvbiBnMihlLHQpe3JldHVybltgIyBSZWNlbnQgTm90ZXMgZGF0YSBmb3IgJHt0fWAsIiIsIlRoaXMgYXJjaGl2ZWQgbm90ZSBpcyBtYWludGFpbmVkIGJ5IHRoZSBkYXNoYm9hcmQgcGx1Z2luLiIsIiIsImBgYGpzb24iLEpTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSwiYGBgIiwiIl0uam9pbihgCmApfWZ1bmN0aW9uIEdrKGUpe3JldHVybmBEYXNoYm9hcmQgcmVjZW50IG5vdGVzIGZvciAke0hrKGUpfWB9ZnVuY3Rpb24gamsoZSx0KXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBxYSh7fSx0KTtsZXQgbj1lLm1hdGNoKC9gYGBqc29uXHMqKFtcc1xTXSo/KWBgYC9pKSxyPW4/blsxXTplO3RyeXtyZXR1cm4gcWEoSlNPTi5wYXJzZShyKSx0KX1jYXRjaHtyZXR1cm4gcWEoe30sdCl9fWFzeW5jIGZ1bmN0aW9uIG0yKGUpe2xldCB0PW5ldyBEYXRlLG49emUodCkscj1Hayh0KSxvPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6cix0YWdzOltJZV19KTtpZihvPy51dWlkKXtsZXQgbD1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOm8udXVpZH0pO3JldHVybntub3RlSGFuZGxlOm8sc3RhdGU6amsobCxuKX19bGV0IGE9YXdhaXQgdjIoZSx0KSxpPXFhKHsuLi5hLHNlbGVjdGVkTm90ZXM6W119LG4pLHM9YXdhaXQgZS5jcmVhdGVOb3RlKHIsW0llXSx7YXJjaGl2ZTohMH0pO3JldHVybiBvPXt1dWlkOnR5cGVvZiBzPT0ib2JqZWN0Ij9zLnV1aWQ6c30sYXdhaXQgV2soZSxvLGkpLGsoYFtSZWNlbnROb3Rlc10gQ3JlYXRlZCBkYWlseSBub3RlICIke3J9IiB3aXRoIHV1aWQgJHtvLnV1aWR9YCkse25vdGVIYW5kbGU6byxzdGF0ZTppfX1hc3luYyBmdW5jdGlvbiB2MihlLHQpe2ZvcihsZXQgbj0xO248PUZrO24rKyl7bGV0IHI9bmV3IERhdGUodCk7ci5zZXREYXRlKHIuZ2V0RGF0ZSgpLW4pO2xldCBvPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6R2sociksdGFnczpbSWVdfSk7aWYoIW8/LnV1aWQpY29udGludWU7bGV0IGE9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpvLnV1aWR9KTtyZXR1cm4gamsoYSx6ZSh0KSl9cmV0dXJue319ZnVuY3Rpb24geTIoZSx0LG4pe2xldCByPWYyKG4pLG89W10sYT1bXTtmb3IobGV0IGkgb2YgZSl7aWYoby5sZW5ndGg+PXQpYnJlYWs7YS5sZW5ndGg8ZDImJnIoKTwuNT9hLnB1c2goaSk6by5wdXNoKGkpfXJldHVybiBvLmxlbmd0aD49VWs/bzpbLi4ubywuLi5hXS5zbGljZSgwLHQpfWZ1bmN0aW9uIHcyKGUpe3JldHVybiBxZCgoQXJyYXkuaXNBcnJheShlKT9lOltdKS5tYXAodD0+KHtsYXRlc3RUYXNrVGltZXN0YW1wOnQubGF0ZXN0VGFza1RpbWVzdGFtcCxuYW1lOnQubm90ZUhhbmRsZT8ubmFtZXx8IlVudGl0bGVkIix0YXNrQ291bnQ6dC50YXNrQ291bnQsdXVpZDp0Lm5vdGVIYW5kbGU/LnV1aWR9KSkpfWFzeW5jIGZ1bmN0aW9uIGIyKGUsdCxuKXtsZXQgcj1Wayh0LnZpc2l0ZWRCeURheSksbz1hd2FpdCBSayhlLG4sciksYT1yO28ubGVuZ3RoPT09MCYmdC5zdGFsZUNhbmRpZGF0ZXMubGVuZ3RoPT09MCYmKGE9bmV3IFNldCxvPWF3YWl0IFJrKGUsbixhKSk7bGV0IGk9W10scz1bXSxsPW5ldyBTZXQodC5zdGFsZUNhbmRpZGF0ZXMubWFwKGQ9PmQudXVpZCkpO2ZvcihsZXQgZCBvZiBvKWlmKCEoIWQ/LnV1aWR8fGEuaGFzKGQudXVpZCkpKXRyeXtsZXQgYz1hd2FpdCBlLmdldE5vdGVUYXNrcyh7dXVpZDpkLnV1aWR9LHtpbmNsdWRlRG9uZTohMX0pO2lmKHMucHVzaChkLnV1aWQpLCFBcnJheS5pc0FycmF5KGMpfHxjLmxlbmd0aD09PTApY29udGludWU7bGV0IHA9Yy5yZWR1Y2UoKHUsZik9PntsZXQgdj1mLnN0YXJ0QXQ/Zi5zdGFydEF0KjFlMzowO3JldHVybiBNYXRoLm1heCh1LHYpfSwwKTtpZihwIT09MCYmcD49RGF0ZS5ub3coKS1zMiljb250aW51ZTtpZihsLmhhcyhkLnV1aWQpfHwoaS5wdXNoKHtsYXRlc3RUYXNrVGltZXN0YW1wOnAsbmFtZTpkLm5hbWUsdGFza0NvdW50OmMubGVuZ3RoLHV1aWQ6ZC51dWlkfSksbC5hZGQoZC51dWlkKSksdC5zdGFsZUNhbmRpZGF0ZXMubGVuZ3RoK2kubGVuZ3RoPj16aylicmVha31jYXRjaChjKXtrKGBbUmVjZW50Tm90ZXNdIEZhaWxlZCB0byBmZXRjaCB0YXNrcyBmb3Igbm90ZSAke2QudXVpZH06YCxjKX1yZXR1cm57c3RhbGVDYW5kaWRhdGVzOmksdmlzaXRlZFV1aWRzOnN9fWZ1bmN0aW9uIFZrKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIE9iamVjdC52YWx1ZXMoZXx8e30pKUFycmF5LmlzQXJyYXkobikmJm4uZm9yRWFjaChyPT50LmFkZChyKSk7cmV0dXJuIHR9dmFyIHVuPVUoZWUoKSksazI9Myx4Mj01O2Z1bmN0aW9uIHZoKHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTp0PTEsdGFza0RvbWFpblVVSUQ6bj1udWxsfSl7bGV0W3Isb109KDAsd28udXNlU3RhdGUpKDApLFthLGldPSgwLHdvLnVzZVN0YXRlKShudWxsKSxbcyxsXT0oMCx3by51c2VTdGF0ZSkobnVsbCksZD10Pj0yPzEwOngyLGM9KDAsd28udXNlTWVtbykoKCk9PiRrKHIpLFtyXSk7KDAsd28udXNlRWZmZWN0KSgoKT0+e2xldCB2PSEwO3JldHVybiBpKG51bGwpLGwobnVsbCksQmsoe2FwcDplLG1heE5vdGVzOmQsc2VlZDpjLHRhc2tEb21haW5VVUlEOm59KS50aGVuKHc9Pnt2JiYoaSh3KSxrKCJbUmVjZW50Tm90ZXNdIHN0YWxlTm90ZXM6Iix3LCJzZWVkOiIsYywicmVzZWVkQ291bnQ6IixyKSl9KS5jYXRjaCh3PT57diYmKGsoIltSZWNlbnROb3Rlc10gZmV0Y2ggZXJyb3I6Iix3KSxsKHcubWVzc2FnZXx8IkZhaWxlZCB0byBsb2FkIG5vdGVzIikpfSksKCk9Pnt2PSExfX0sW2UsZCxyLGMsbl0pO2xldCB1PSgwLHVuLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byh2PT52KzEpLHRpdGxlOiJTaG93IGEgZGlmZmVyZW50IHNldCBvZiBub3RlcyIsY2hpbGRyZW46Ilx1MjFCQiBSZXNlZWQifSksZj0oKT0+cz8oMCx1bi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVycm9yIixjaGlsZHJlbjpgRXJyb3I6ICR7c31gfSk6YT09PW51bGw/KDAsdW4uanN4KSgicCIse2NsYXNzTmFtZToibm90ZS1sb2FkaW5nIixjaGlsZHJlbjoiTG9hZGluZ1x1MjAyNiJ9KTphLmxlbmd0aDxrMj8oMCx1bi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVtcHR5IixjaGlsZHJlbjoiTm8gbm90ZXMgd2l0aCBzdGFsZSB0YXNrcyBmb3VuZC4ifSk6KDAsdW4uanN4KSgidWwiLHtjbGFzc05hbWU6Im5vdGUtbGlzdCIsY2hpbGRyZW46YS5tYXAoKHtub3RlSGFuZGxlOnYsdGFza0NvdW50Ond9KT0+KDAsdW4uanN4cykoImxpIix7Y2xhc3NOYW1lOiJub3RlLWl0ZW0iLGNoaWxkcmVuOlsoMCx1bi5qc3hzKSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWxpbmsiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+ZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3YudXVpZH1gKSx0aXRsZTpgT3BlbiAiJHt2Lm5hbWV8fCJVbnRpdGxlZCJ9ImAsY2hpbGRyZW46WygwLHVuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6Im5vdGUtbmFtZSIsY2hpbGRyZW46di5uYW1lfHwiVW50aXRsZWQifSksKDAsdW4uanN4KSgic3BhbiIse2NsYXNzTmFtZToibm90ZS1jb3VudCIsY2hpbGRyZW46YCR7d30gb3BlbiB0YXNrJHt3IT09MT8icyI6IiJ9YH0pXX0pLCgwLHVuLmpzeCkoImRpdiIse2NsYXNzTmFtZToibm90ZS1tZXRhZGF0YSIsY2hpbGRyZW46di5jaGFuZ2VkP2BMYXN0IHVwZGF0ZWQ6ICR7bmV3IERhdGUodi5jaGFuZ2VkKS50b0xvY2FsZURhdGVTdHJpbmcoKX1gOiJObyB1cGRhdGUgZGF0ZSJ9KV19LHYudXVpZCkpfSk7cmV0dXJuKDAsdW4uanN4KShpZSx7aGVhZGVyQWN0aW9uczp1LGljb246Ilx1ezFGNEREfSIsdGl0bGU6bGUoInJlY2VudC1ub3RlcyIpLHdpZGdldElkOiJyZWNlbnQtbm90ZXMiLGNoaWxkcmVuOmYoKX0pfXZhciBwbj1VKHllKCkpO3ZhciB5aD02MCoxZTMsd2g9NjAqeWgsRXM9MjQqd2gsUzI9MzY1KkVzO2Z1bmN0aW9uIEUyKGUpe3JldHVybiBlPyJ0YXNrTGlzdHMiOiIifWZ1bmN0aW9uIFFhKGUpe2lmKGU9PW51bGwpcmV0dXJuIDA7aWYodHlwZW9mIGU9PSJudW1iZXIiKXJldHVybiBOdW1iZXIuaXNGaW5pdGUoZSk/ZTowO2xldCB0PW5ldyBEYXRlKGUpLmdldFRpbWUoKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpP3Q6MH1mdW5jdGlvbiBOMihlKXtsZXQgdD1RYShlLnVwZGF0ZWQpLG49UWEoZS5jaGFuZ2VkKSxyPVFhKGUuYWN0aXZlKTtyZXR1cm4gdD5ufHx0PnJ9ZnVuY3Rpb24gVDIoZSl7bGV0IHQ9bmV3IE1hcDtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZSl7bGV0IHI9bj8uc2hhcmluZz8ubm90ZXM7aWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IG8gb2Ygcil7aWYoIW8pY29udGludWU7bGV0IGE9dC5nZXQobyk7YT9hLnNvbWUoaT0+aS51dWlkPT09bi51dWlkKXx8YS5wdXNoKG4pOnQuc2V0KG8sW25dKX19cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gRDIoZSl7bGV0IHQ9RGF0ZS5ub3coKSxuPWF3YWl0IGUuZ2V0UGVvcGxlKCkscj1UMihuKSxvPUFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6MCxhPUFycmF5LmlzQXJyYXkobik/bi5maWx0ZXIoaT0+QXJyYXkuaXNBcnJheShpPy5zaGFyaW5nPy5ub3RlcykmJmkuc2hhcmluZy5ub3Rlcy5sZW5ndGg+MCkubGVuZ3RoOjA7cmV0dXJuIGNvbnNvbGUubG9nKGBbU2hhcmVkTm90ZXNdIEJ1aWx0IG5vdGU8PnBlcnNvbiBpbmRleCBmcm9tICR7b30gcGVvcGxlICgke2F9IHdpdGggYSBub3RlcyBhcnJheSkgYWNyb3NzICR7ci5zaXplfSBub3RlcyBpbiAke0RhdGUubm93KCktdH1tc2ApLHJ9ZnVuY3Rpb24gS2soZSl7bGV0IHQ9U3RyaW5nKGV8fCIiKS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gdC5sZW5ndGg9PT0wPyI/Ijp0Lmxlbmd0aD09PTE/dFswXS5zbGljZSgwLDIpLnRvVXBwZXJDYXNlKCk6KHRbMF1bMF0rdFt0Lmxlbmd0aC0xXVswXSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBBMih7bm90ZUhhbmRsZTplLHBlb3BsZUluZGV4OnR9KXtsZXQgbj10Py5nZXQ/LihlLnV1aWQpO3JldHVybiBBcnJheS5pc0FycmF5KG4pP24ubWFwKHI9Pih7YXZhdGFyOnIuYXZhdGFyfHxudWxsLG5hbWU6ci5uYW1lfHxyLnV1aWR9KSk6W119ZnVuY3Rpb24gYmgoZSx0KXtpZighZSlyZXR1cm4iIjtsZXQgbj10LWU7cmV0dXJuIG48eWg/Imp1c3Qgbm93IjpuPHdoP2Ake01hdGguZmxvb3Iobi95aCl9bSBhZ29gOm48RXM/YCR7TWF0aC5mbG9vcihuL3doKX1oIGFnb2A6bjw3KkVzP2Ake01hdGguZmxvb3Iobi9Fcyl9ZCBhZ29gOm48MzAqRXM/bmV3IERhdGUoZSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pOm5ldyBEYXRlKGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3llYXI6Im51bWVyaWMiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pfWFzeW5jIGZ1bmN0aW9uIF8yKGUsdCl7bGV0IG49RTIoITApLHI9dD97Z3JvdXA6bix0YXNrRG9tYWluVVVJRDp0fTp7Z3JvdXA6bn0sbz1uZXcgU2V0O2ZvciBhd2FpdChsZXQgYSBvZiBhd2FpdCBlLmZpbHRlck5vdGVzKHIsInVwZGF0ZWQiKSlhPy51dWlkJiZvLmFkZChhLnV1aWQpO3JldHVybiBvfWFzeW5jIGZ1bmN0aW9uIFlrKHthcHA6ZSxtYXhOb3Rlczp0PTEvMCx0YXNrRG9tYWluVVVJRDpuPW51bGwsb25seVdpdGhUYXNrczpyPSExfSl7bGV0IG89RGF0ZS5ub3coKSxbYSxpXT1hd2FpdCBQcm9taXNlLmFsbChbRDIoZSkscj9fMihlLG4pOlByb21pc2UucmVzb2x2ZShudWxsKV0pLHM9Wy4uLmEua2V5cygpXSxsPWF3YWl0IFByb21pc2UuYWxsKHMubWFwKHY9PmUuZmluZE5vdGUoe3V1aWQ6dn0pLmNhdGNoKCgpPT5udWxsKSkpLGQ9W10sYz1bXSxwPTA7Zm9yKGxldCB2PTA7djxsLmxlbmd0aDt2Kyspe2xldCB3PWxbdl07aWYoIXc/LnV1aWQpe2QucHVzaChzW3ZdKTtjb250aW51ZX1pZihpJiYhaS5oYXMody51dWlkKSljb250aW51ZTtsZXQgYj1BMih7bm90ZUhhbmRsZTp3LHBlb3BsZUluZGV4OmF9KSxnPU4yKHcpO2cmJnArKyxjLnB1c2goey4uLncsYWN0aXZlTXM6UWEody5hY3RpdmUpLGNvbGxhYm9yYXRvcnM6YixvcGVuZWRBdDp3LmFjdGl2ZXx8bnVsbCx1cGRhdGVkTXM6UWEody51cGRhdGVkKSx1cGRhdGVkU2luY2VTZWVuOmd9KX1jLnNvcnQoKHYsdyk9PncudXBkYXRlZE1zLXYudXBkYXRlZE1zKTtsZXQgdT1OdW1iZXIuaXNGaW5pdGUodCk/Yy5zbGljZSgwLHQpOmMsZj1PMih1LG8tUzIpO3JldHVybiBjb25zb2xlLmxvZyhgW1NoYXJlZE5vdGVzXSBzaGFyZWQ6JHtzLmxlbmd0aH0gcmVzb2x2ZWQ6JHtsLmxlbmd0aC1kLmxlbmd0aH0gdW5yZXNvbHZlZDoke2QubGVuZ3RofSB1cGRhdGVkU2luY2VTZWVuOiR7cH0gcmV0dXJuZWQ6JHt1Lmxlbmd0aH0gc2hhcmVyczoke2YubGVuZ3RofSBvbmx5V2l0aFRhc2tzOiR7cn0gaW4gJHtEYXRlLm5vdygpLW99bXNgKSxkLmxlbmd0aD4wJiYoayhgW1NoYXJlZE5vdGVzXSAke2QubGVuZ3RofSBzaGFyZWQgbm90ZShzKSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYnkgZmluZE5vdGU6YCxkKSxrKCJbU2hhcmVkTm90ZXNdIGtub3duIG5vdGUgVVVJRHMgcGVyIHBlcnNvbiAoZnJvbSBnZXRQZW9wbGUpOiIsQzIoYSkpKSx7bm90ZXM6dSxzaGFyZXJOYW1lczpmfX1mdW5jdGlvbiBDMihlKXtsZXQgdD1uZXcgTWFwO2lmKGUmJnR5cGVvZiBlLmVudHJpZXM9PSJmdW5jdGlvbiIpZm9yKGxldFtuLHJdb2YgZS5lbnRyaWVzKCkpZm9yKGxldCBvIG9mIHIpe2xldCBhPW8/Lm5hbWV8fG8/LnV1aWR8fCIodW5rbm93bikiO3QuaGFzKGEpfHx0LnNldChhLFtdKSx0LmdldChhKS5wdXNoKG4pfXJldHVyblsuLi50LmVudHJpZXMoKV0ubWFwKChbbixyXSk9Pih7bmFtZTpuLGNvdW50OnIubGVuZ3RoLG5vdGVVdWlkczpyfSkpLnNvcnQoKG4scik9PnIuY291bnQtbi5jb3VudCl9ZnVuY3Rpb24gTzIoZSx0PTApe2xldCBuPW5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuW107Zm9yKGxldCByIG9mIGUpaWYoISh0JiZRYShyLnVwZGF0ZWRNcz8/ci51cGRhdGVkKTx0KSlmb3IobGV0IG8gb2Ygci5jb2xsYWJvcmF0b3JzfHxbXSlvLm5hbWUmJm4uYWRkKG8ubmFtZSk7cmV0dXJuWy4uLm5dLnNvcnQoKHIsbyk9PnIubG9jYWxlQ29tcGFyZShvLHZvaWQgMCx7c2Vuc2l0aXZpdHk6ImJhc2UifSkpfWZ1bmN0aW9uIGtoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP1suLi5uZXcgU2V0KGUuZmlsdGVyKHQ9PnR5cGVvZiB0PT0ic3RyaW5nIiYmdCkpXTpbXX1mdW5jdGlvbiBxayhlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2xldCBuPXQgaW5zdGFuY2VvZiBTZXQ/dDpuZXcgU2V0KHR8fFtdKSxyPVtdLG89W107Zm9yKGxldCBhIG9mIGUpKG4uaGFzKGEudXVpZCk/cjpvKS5wdXNoKGEpO3JldHVyblsuLi5yLC4uLm9dfXZhciBOcz0iRGFzaGJvYXJkIFNoYXJlZCBOb3RlcyBQaW5zIjtmdW5jdGlvbiBRayhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybltdO2xldCB0PWUubWF0Y2goL2BgYGpzb25ccyooW1xzXFNdKj8pYGBgL2kpLG49dD90WzFdOmUscj1KU09OLnBhcnNlKG4pO3JldHVybiByJiZraChyLnBpbm5lZFV1aWRzKX1mdW5jdGlvbiBKayhlKXtyZXR1cm5bIiMgU2hhcmVkIE5vdGVzIHBpbnMiLCIiLCJUaGlzIGFyY2hpdmVkIG5vdGUgaXMgbWFpbnRhaW5lZCBieSB0aGUgZGFzaGJvYXJkIHBsdWdpbi4gSXQgcmVjb3JkcyB3aGljaCBub3RlcyB5b3UgaGF2ZSBwaW5uZWQgdG8gdGhlIHRvcCBvZiB0aGUgU2hhcmVkIE5vdGVzIHdpZGdldC4iLCIiLCJgYGBqc29uIixKU09OLnN0cmluZ2lmeSh7cGlubmVkVXVpZHM6ZX0sbnVsbCwyKSwiYGBgIiwiIl0uam9pbihgCmApfWFzeW5jIGZ1bmN0aW9uIEkyKGUpe2xldCB0PWF3YWl0IGUuZmluZE5vdGUoe25hbWU6TnMsdGFnczpbSWVdfSkuY2F0Y2goKCk9Pm51bGwpO2lmKHQ/LnV1aWQpe2xldCByPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dC51dWlkfSkuY2F0Y2goKCk9PiIiKTtyZXR1cm57bm90ZUhhbmRsZTp0LHBpbm5lZFV1aWRzOlFrKHIpfX1sZXQgbj1hd2FpdCBlLmNyZWF0ZU5vdGUoTnMsW0llXSx7YXJjaGl2ZTohMH0pO3JldHVybiB0PXtuYW1lOk5zLHV1aWQ6dHlwZW9mIG49PSJvYmplY3QiP24udXVpZDpufSxhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh0LEprKFtdKSkuY2F0Y2gocj0+aygiW3NoYXJlZC1ub3Rlcy1hcmNoaXZlXSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwaW5zIG5vdGU6IixyKSksayhgW3NoYXJlZC1ub3Rlcy1hcmNoaXZlXSBjcmVhdGVkIHBpbnMgbm90ZSAiJHtOc30iIHV1aWQgJHt0LnV1aWR9YCkse25vdGVIYW5kbGU6dCxwaW5uZWRVdWlkczpbXX19YXN5bmMgZnVuY3Rpb24gWGsoZSl7bGV0IHQ9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpOcyx0YWdzOltJZV19KTtpZighdD8udXVpZClyZXR1cm5bXTtsZXQgbj1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnQudXVpZH0pO3JldHVybiBRayhuKX1hc3luYyBmdW5jdGlvbiBaayhlLHQpe2xldCBuPWtoKHQpLHtub3RlSGFuZGxlOnJ9PWF3YWl0IEkyKGUpO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHIsSmsobikpLGsoIltzaGFyZWQtbm90ZXMtYXJjaGl2ZV0gc3RvcmVkIHBpbnMiLHtjb3VudDpuLmxlbmd0aH0pfXZhciB1ZT1VKGVlKCkpLHhoPSIiLE0yPTUsUjI9MTAsUDI9NCxMMj01O2Z1bmN0aW9uIFUyKHtjb2xsYWJvcmF0b3I6ZX0pe2xldHthdmF0YXI6dCxuYW1lOm59PWU7cmV0dXJuIHQ/LmltYWdlPygwLHVlLmpzeCkoImltZyIse2NsYXNzTmFtZToiY29sbGFib3JhdG9yLWF2YXRhciIsc3JjOnQuaW1hZ2UsYWx0Om4sdGl0bGU6bn0pOigwLHVlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImNvbGxhYm9yYXRvci1hdmF0YXIgY29sbGFib3JhdG9yLWF2YXRhci10ZXh0Iix0aXRsZTpuLGNoaWxkcmVuOnQ/LnRleHR8fEtrKG4pfSl9ZnVuY3Rpb24gejIoe2FwcDplLG9ubHlXaXRoVGFza3M6dCx0YXNrRG9tYWluVVVJRDpufSl7bGV0W3Isb109KDAscG4udXNlU3RhdGUpKG51bGwpLFthLGldPSgwLHBuLnVzZVN0YXRlKShbXSk7cmV0dXJuKDAscG4udXNlRWZmZWN0KSgoKT0+e2xldCBzPSEwO3JldHVybiBvKG51bGwpLFlrKHthcHA6ZSxvbmx5V2l0aFRhc2tzOnQsdGFza0RvbWFpblVVSUQ6bn0pLnRoZW4oKHtub3RlczpsLHNoYXJlck5hbWVzOmR9KT0+e3MmJihvKGwpLGkoZCksaygiW1NoYXJlZE5vdGVzXSBub3RlczoiLGwsIm9ubHlXaXRoVGFza3M6Iix0KSl9KSwoKT0+e3M9ITF9fSxbZSx0LG5dKSx7bm90ZXM6cixzaGFyZXJOYW1lczphfX1mdW5jdGlvbiBGMihlKXtsZXRbdCxuXT0oMCxwbi51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpOygwLHBuLnVzZUVmZmVjdCkoKCk9PntsZXQgbz0hMDtyZXR1cm4gWGsoZSkudGhlbihhPT57byYmbihuZXcgU2V0KGEpKX0pLCgpPT57bz0hMX19LFtlXSk7bGV0IHI9KDAscG4udXNlQ2FsbGJhY2spKG89PntuKGE9PntsZXQgaT1uZXcgU2V0KGEpO3JldHVybiBpLmhhcyhvKT9pLmRlbGV0ZShvKTppLmFkZChvKSxaayhlLFsuLi5pXSkuY2F0Y2gocz0+aygiW1NoYXJlZE5vdGVzXSBwZXJzaXN0IHBpbnMgZmFpbGVkOiIscykpLGl9KX0sW2VdKTtyZXR1cm57cGlubmVkVXVpZHM6dCx0b2dnbGVQaW46cn19ZnVuY3Rpb24gJDIoe25vdGVzOmUscGFnZTp0LHBhZ2VTaXplOm4scGlubmVkVXVpZHM6cixzZWxlY3RlZFNoYXJlcjpvfSl7bGV0IGE9ZT09PW51bGw/bnVsbDpvPT09eGg/ZS5maWx0ZXIoYz0+Yy51cGRhdGVkU2luY2VTZWVuKTplLmZpbHRlcigoe2NvbGxhYm9yYXRvcnM6Y30pPT5jLnNvbWUocD0+cC5uYW1lPT09bykpLGk9YT09PW51bGw/bnVsbDpxayhhLHIpLHM9aT09PW51bGw/MTpNYXRoLm1pbihMMixNYXRoLm1heCgxLE1hdGguY2VpbChpLmxlbmd0aC9uKSkpLGw9TWF0aC5taW4odCxzLTEpLGQ9aT09PW51bGw/bnVsbDppLnNsaWNlKGwqbiwobCsxKSpuKTtyZXR1cm57Y3VycmVudFBhZ2U6bCx0b3RhbFBhZ2VzOnMsdmlzaWJsZU5vdGVzOmR9fWZ1bmN0aW9uIFcyKHtpbkhlYWRlcjplLG9uQ2hhbmdlOnQsb25seVdpdGhUYXNrczpufSl7cmV0dXJuKDAsdWUuanN4cykoImxhYmVsIix7Y2xhc3NOYW1lOmBzaGFyZWQtbm90ZXMtdG9nZ2xlJHtlPyIgd2lkZ2V0LWhlYWRlci1hY3Rpb24iOiIifWAsdGl0bGU6Ik9ubHkgc2hvdyBzaGFyZWQgbm90ZXMgdGhhdCBoYXZlIHRhc2tzIixjaGlsZHJlbjpbKDAsdWUuanN4KSgiaW5wdXQiLHt0eXBlOiJjaGVja2JveCIsY2hlY2tlZDpuLG9uQ2hhbmdlOnI9PnQoci50YXJnZXQuY2hlY2tlZCl9KSwiSGFzIHRhc2tzIl19KX1mdW5jdGlvbiBCMih7b25TZWxlY3RTaGFyZXI6ZSxzZWxlY3RlZFNoYXJlcjp0LHNoYXJlck5hbWVzOm4sdGFza3NUb2dnbGU6cn0pe3JldHVybigwLHVlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1maWx0ZXIiLGNoaWxkcmVuOlsoMCx1ZS5qc3hzKSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZXMtc2hhcmVyLXNlbGVjdCIsdmFsdWU6dCxvbkNoYW5nZTpvPT5lKG8udGFyZ2V0LnZhbHVlKSxjaGlsZHJlbjpbKDAsdWUuanN4KSgib3B0aW9uIix7dmFsdWU6eGgsY2hpbGRyZW46IkFsbCBjb2xsYWJvcmF0b3JzIn0pLG4ubWFwKG89PigwLHVlLmpzeCkoIm9wdGlvbiIse3ZhbHVlOm8sY2hpbGRyZW46b30sbykpXX0pLHIoITEpXX0pfWZ1bmN0aW9uIEgyKHtjdXJyZW50UGFnZTplLG9uUGFnZUNoYW5nZTp0LHRvdGFsUGFnZXM6bn0pe3JldHVybiBuPD0xP251bGw6KDAsdWUuanN4cykoImRpdiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGVzLXBhZ2luYXRpb24iLGNoaWxkcmVuOlsoMCx1ZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1wYWdlLWFycm93Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PnQocj0+TWF0aC5tYXgoMCxyLTEpKSxkaXNhYmxlZDplPT09MCxjaGlsZHJlbjoiXHUyNUMwIn0pLCgwLHVlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1wYWdlLWluZGljYXRvciIsY2hpbGRyZW46YCR7ZSsxfSAvICR7bn1gfSksKDAsdWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZXMtcGFnZS1hcnJvdyIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT50KHI9Pk1hdGgubWluKG4tMSxyKzEpKSxkaXNhYmxlZDplPj1uLTEsY2hpbGRyZW46Ilx1MjVCNiJ9KV19KX1mdW5jdGlvbiBHMih7aXNQaW5uZWQ6ZSxub3RlOnQsbm93TXM6bixvbk5hdmlnYXRlOnIsb25Ub2dnbGVQaW46b30pe2xldHthY3RpdmVNczphLGNvbGxhYm9yYXRvcnM6aSxuYW1lOnMsb3BlbmVkQXQ6bCx1cGRhdGVkTXM6ZCx1dWlkOmN9PXQ7cmV0dXJuKDAsdWUuanN4cykoImxpIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1pdGVtIixjaGlsZHJlbjpbKDAsdWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOmBzaGFyZWQtbm90ZS1waW4ke2U/IiBzaGFyZWQtbm90ZS1waW4tYWN0aXZlIjoiIn1gLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byhjKSx0aXRsZTplPyJVbnBpbiB0aGlzIG5vdGUiOiJQaW4gdGhpcyBub3RlIHRvIHRoZSB0b3AiLCJhcmlhLXByZXNzZWQiOmUsY2hpbGRyZW46Ilx1ezFGNENDfSJ9KSwoMCx1ZS5qc3hzKSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1saW5rIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PnIoYyksdGl0bGU6YE9wZW4gIiR7c3x8IlVudGl0bGVkIn0iYCxjaGlsZHJlbjpbKDAsdWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGUtdGl0bGUiLGNoaWxkcmVuOnN8fCJVbnRpdGxlZCJ9KSwoMCx1ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1tZXRhIixjaGlsZHJlbjpbaS5sZW5ndGg+MCYmKDAsdWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGUtYXZhdGFycyIsY2hpbGRyZW46aS5zbGljZSgwLFAyKS5tYXAoKHAsdSk9PigwLHVlLmpzeCkoVTIse2NvbGxhYm9yYXRvcjpwfSx1KSl9KSwoMCx1ZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1jb2xsYWJvcmF0b3JzIixjaGlsZHJlbjppLmxlbmd0aD4wP2kubWFwKHA9PnAubmFtZSkuam9pbigiLCAiKToiU2hhcmVkIHdpdGggY29sbGFib3JhdG9ycyJ9KV19KSwoMCx1ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1kYXRlcyIsY2hpbGRyZW46WygwLHVlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS11cGRhdGVkIix0aXRsZToiV2hlbiBhIGNvbGxhYm9yYXRvciBsYXN0IHVwZGF0ZWQgdGhpcyBub3RlIixjaGlsZHJlbjpbIlVwZGF0ZWQgIixiaChkLG4pXX0pLCgwLHVlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1vcGVuZWQiLHRpdGxlOmBZb3UgbGFzdCBvcGVuZWQgdGhpcyBub3RlICR7bH1gLGNoaWxkcmVuOlsiWW91IGxhc3Qgb3BlbmVkICIsYmgoYSxuKXx8Ilx1MjAxNCJdfSldfSldfSldfSl9ZnVuY3Rpb24gajIoe2N1cnJlbnRQYWdlOmUsb25OYXZpZ2F0ZTp0LG9uUGFnZUNoYW5nZTpuLG9uVG9nZ2xlUGluOnIscGlubmVkVXVpZHM6byxzaGFyZXJGaWx0ZXI6YSx0b3RhbFBhZ2VzOmksdmlzaWJsZU5vdGVzOnN9KXtpZihzPT09bnVsbClyZXR1cm4oMCx1ZS5qc3hzKSh1ZS5GcmFnbWVudCx7Y2hpbGRyZW46W2EsKDAsdWUuanN4KSgicCIse2NsYXNzTmFtZToibm90ZS1sb2FkaW5nIixjaGlsZHJlbjoiTG9hZGluZ1x1MjAyNiJ9KV19KTtpZihzLmxlbmd0aD09PTApcmV0dXJuKDAsdWUuanN4cykodWUuRnJhZ21lbnQse2NoaWxkcmVuOlthLCgwLHVlLmpzeCkoInAiLHtjbGFzc05hbWU6Im5vdGUtZW1wdHkiLGNoaWxkcmVuOiJObyBub3RlcyByZWNlbnRseSB1cGRhdGVkIGJ5IGNvbGxhYm9yYXRvcnMuIn0pXX0pO2xldCBsPURhdGUubm93KCk7cmV0dXJuKDAsdWUuanN4cykodWUuRnJhZ21lbnQse2NoaWxkcmVuOlthLCgwLHVlLmpzeCkoInVsIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1saXN0IixjaGlsZHJlbjpzLm1hcChkPT4oMCx1ZS5qc3gpKEcyLHtub3RlOmQsbm93TXM6bCxvblRvZ2dsZVBpbjpyLG9uTmF2aWdhdGU6dCxpc1Bpbm5lZDpvLmhhcyhkLnV1aWQpfSxkLnV1aWQpKX0pLCgwLHVlLmpzeCkoSDIse2N1cnJlbnRQYWdlOmUsdG90YWxQYWdlczppLG9uUGFnZUNoYW5nZTpufSldfSl9ZnVuY3Rpb24gU2goe2FwcDplLGdyaWRIZWlnaHRTaXplOnQ9MSx0YXNrRG9tYWluVVVJRDpuPW51bGx9KXtsZXRbcixvXT0oMCxwbi51c2VTdGF0ZSkoITEpLFthLGldPSgwLHBuLnVzZVN0YXRlKSh4aCksW3MsbF09KDAscG4udXNlU3RhdGUpKDApLGQ9dD49Mj9SMjpNMix7bm90ZXM6YyxzaGFyZXJOYW1lczpwfT16Mih7YXBwOmUsb25seVdpdGhUYXNrczpyLHRhc2tEb21haW5VVUlEOm59KSx7cGlubmVkVXVpZHM6dSx0b2dnbGVQaW46Zn09RjIoZSkse2N1cnJlbnRQYWdlOnYsdG90YWxQYWdlczp3LHZpc2libGVOb3RlczpifT0kMih7bm90ZXM6YyxwYWdlOnMscGFnZVNpemU6ZCxwaW5uZWRVdWlkczp1LHNlbGVjdGVkU2hhcmVyOmF9KTsoMCxwbi51c2VFZmZlY3QpKCgpPT57bCgwKX0sW2EscixuXSk7bGV0IGc9cC5sZW5ndGg+PTIsbT1oPT4oMCx1ZS5qc3gpKFcyLHtpbkhlYWRlcjpoLG9uQ2hhbmdlOm8sb25seVdpdGhUYXNrczpyfSkseT1nPygwLHVlLmpzeCkoQjIse29uU2VsZWN0U2hhcmVyOmksc2VsZWN0ZWRTaGFyZXI6YSxzaGFyZXJOYW1lczpwLHRhc2tzVG9nZ2xlOm19KTpudWxsO3JldHVybigwLHVlLmpzeCkoaWUse2hlYWRlckFjdGlvbnM6Zz9udWxsOm0oITApLGljb246Ilx1ezFGOTFEfSIsdGl0bGU6bGUoInNoYXJlZC1ub3RlcyIpLHdpZGdldElkOiJzaGFyZWQtbm90ZXMiLGNoaWxkcmVuOigwLHVlLmpzeCkoajIse2N1cnJlbnRQYWdlOnYscGlubmVkVXVpZHM6dSxzaGFyZXJGaWx0ZXI6eSx0b3RhbFBhZ2VzOncsdmlzaWJsZU5vdGVzOmIsb25OYXZpZ2F0ZTpoPT5lLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7aH1gKSxvblBhZ2VDaGFuZ2U6bCxvblRvZ2dsZVBpbjpmfSl9KX12YXIgZXg9VSh5ZSgpKTt2YXIgZm49VShlZSgpKTtmdW5jdGlvbiBFaCh7YWN0aXZlVGFza0RvbWFpbjplLGFwcDp0LGRvbWFpbnM6bixvbkRvbWFpbkNoYW5nZTpyfSl7bGV0W28sYV09KDAsZXgudXNlU3RhdGUpKCExKSxpPWFzeW5jKCk9PntrKCJbVGFza0RvbWFpbnNdIFJlZnJlc2ggdHJpZ2dlcmVkIiksYSghMCk7dHJ5e2xldCBsPWF3YWl0IFR3KHQpO2soIltUYXNrRG9tYWluc10gUmVmcmVzaCByZXN1bHQiLGwpLGwmJnImJnIobC5kb21haW5zLGwuYWN0aXZlVGFza0RvbWFpbil9Y2F0Y2gobCl7dGhyb3cgaygiW1Rhc2tEb21haW5zXSBSZWZyZXNoIGZhaWxlZCIsbCksbH1maW5hbGx5e2EoITEpfX0scz1hc3luYyBsPT57aWYobD09PWUpcmV0dXJuO2xldCBkPWF3YWl0IE53KHQsbCk7ZCYmciYmcihudWxsLGwsZCl9O3JldHVybiFufHxuLmxlbmd0aD09PTA/KDAsZm4uanN4cykoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zIHRhc2stZG9tYWlucy0tZW1wdHkiLGNoaWxkcmVuOlsoMCxmbi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1saXN0IixjaGlsZHJlbjooMCxmbi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWluLWl0ZW0gdGFzay1kb21haW4tZW50cnkgYWN0aXZlIix0aXRsZToiTm8gdGFzayBkb21haW4gZm91bmQgXFx1MjAxNCBzaG93aW5nIHRhc2tzIGZyb20gYWxsIG5vdGVzIixjaGlsZHJlbjooMCxmbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbi1uYW1lIixjaGlsZHJlbjoiQWxsIE5vdGVzIn0pfSl9KSwoMCxmbi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1lbXB0eSB0YXNrLWRvbWFpbi1lbnRyeSIsY2hpbGRyZW46J1Rhc2sgRG9tYWlucyBpbiAiU2V0dGluZ3MiJ30pLCgwLGZuLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLXJlZnJlc2giLG9uQ2xpY2s6aSxkaXNhYmxlZDpvLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46bz8iUmVmcmVzaGluZy4uLiI6Ilx1MjFCQiBSZWZyZXNoIn0pXX0pOigwLGZuLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucyIsY2hpbGRyZW46WygwLGZuLmpzeCkoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLWxpc3QiLGNoaWxkcmVuOm4ubWFwKGw9PigwLGZuLmpzeCkoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW4taXRlbSIrKGwudXVpZD09PWU/IiBhY3RpdmUiOiIiKSxvbkNsaWNrOigpPT5zKGwudXVpZCksY2hpbGRyZW46KDAsZm4uanN4KSgic3BhbiIse2NsYXNzTmFtZToidGFzay1kb21haW4tbmFtZSIsY2hpbGRyZW46bC5uYW1lfSl9LGwudXVpZCkpfSksKDAsZm4uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsb25DbGljazppLGRpc2FibGVkOm8sY2hpbGRyZW46bz8iUmVmcmVzaGluZy4uLiI6Ilx1MjFCQiBSZWZyZXNoIFRhc2sgRG9tYWlucyJ9KV19KX12YXIgSmQ9VSh5ZSgpKTtmdW5jdGlvbiB0eChlKXtsZXQgdD0oMCxKZC51c2VSZWYpKG51bGwpO3QuY3VycmVudD09PW51bGwmJih0LmN1cnJlbnQ9cGVyZm9ybWFuY2Uubm93KCkpLCgwLEpkLnVzZUVmZmVjdCkoKCk9Pnt0LmN1cnJlbnQhPT1udWxsJiYoayhgW2Rhc2hib2FyZF0gV2lkZ2V0ICIke2V9IiBmaW5pc2hlZCBsb2FkaW5nIGluICR7KHBlcmZvcm1hbmNlLm5vdygpLXQuY3VycmVudCkudG9GaXhlZCgxKX1tc2ApLHQuY3VycmVudD1udWxsKX0sW10pfXZhciBjcj1VKHllKCkpO3ZhciBKZT1VKGVlKCkpLFYyPVt7dmFsdWU6LTIsZW1vamk6Ilx1ezFGNjIyfSIsbGFiZWw6IkF3ZnVsIn0se3ZhbHVlOi0xLGVtb2ppOiJcdXsxRjYxRn0iLGxhYmVsOiJCYWQifSx7dmFsdWU6MCxlbW9qaToiXHV7MUY2MTB9IixsYWJlbDoiT2theSJ9LHt2YWx1ZToxLGVtb2ppOiJcdXsxRjY0Mn0iLGxhYmVsOiJHb29kIn0se3ZhbHVlOjIsZW1vamk6Ilx1ezFGNjA0fSIsbGFiZWw6IkdyZWF0In1dO2Z1bmN0aW9uIEsyKGUpe2lmKCFlfHxlLmxlbmd0aDw3KXJldHVybiIiO2xldCB0PWR0KGVbMF0uZGF0ZSksbj1kdChlWzZdLmRhdGUpLHI9bz0+by50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KTtyZXR1cm5gJHtyKHQpfSBcdTIwMTMgJHtyKG4pfWB9ZnVuY3Rpb24gbngoZSx0KXtsZXQgbj1kdChlKTtyZXR1cm4gbi5zZXREYXRlKG4uZ2V0RGF0ZSgpK3QqNyksemUobil9ZnVuY3Rpb24gWTIoZSx0KXtsZXQgbj1fbihlLHQpLHI9X24obmV3IERhdGUsdCk7cmV0dXJuIG4+PXJ9ZnVuY3Rpb24gcTIoZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wP1tdOiF0fHx0eXBlb2YgdCE9Im9iamVjdCI/ZTplLm1hcChuPT57bGV0IHI9emUobi5kYXRlKSxvPUFycmF5LmlzQXJyYXkodFtyXSk/dFtyXTpbXSxhPW8ucmVkdWNlKChpLHMpPT5pKyhzLnZpY3RvcnlWYWx1ZXx8MCksMCk7cmV0dXJuey4uLm4sdmFsdWU6YSx0YXNrQ291bnQ6by5sZW5ndGh9fSl9ZnVuY3Rpb24gUTIoZSx0LG4scil7bGV0IG89eHcoZSxyKTtyZXR1cm4hbnx8dHlwZW9mIG4hPSJvYmplY3QiP3EyKHQsbik6by5tYXAoYT0+e2xldCBpPUFycmF5LmlzQXJyYXkoblthLmRhdGVLZXldKT9uW2EuZGF0ZUtleV06W10scz1pLnJlZHVjZSgobCxkKT0+bCsoZC52aWN0b3J5VmFsdWV8fDApLDApO3JldHVybntkYXk6YS5kYXksZGF0ZTphLmRhdGUsdmFsdWU6cyx0YXNrQ291bnQ6aS5sZW5ndGh9fSl9YXN5bmMgZnVuY3Rpb24gSjIoZSx0LG4scil7bGV0IG89W3QsU3RyaW5nKG4pXTthd2FpdCBlLnNldFNldHRpbmcoT2EoInZpY3RvcnktdmFsdWUiKSxKU09OLnN0cmluZ2lmeShvKSkscighMSl9ZnVuY3Rpb24gcngoZSl7cmV0dXJuIGU9PW51bGw/ITA6ZT09PSJ0cnVlInx8ZT09PSEwfWZ1bmN0aW9uIFgyKGUsdCxuLHIpe3QoZVswXXx8IndlZWsiKSxuKHJ4KGVbMV0pKSxyKCExKX1mdW5jdGlvbiBaMihlLHQsbil7bGV0IHI9ZS5jdXJyZW50O2lmKCFyKXJldHVybjtsZXQgbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9bi5jbGllbnRYLW8ubGVmdCxzPShvLndpZHRoLTgwKS83O2ZvcihsZXQgbD0wO2w8NztsKyspe2xldCBkPTQwK2wqcyxjPWQrcztpZihhPj1kJiZhPGMpe3QobCk7cmV0dXJufX10KG51bGwpfWZ1bmN0aW9uIGVJKGUsdCl7bGV0IG49ZS5jdXJyZW50O2lmKCFuKXJldHVybiAwO2xldCBvPShuLm9mZnNldFdpZHRoLTgwKS83O3JldHVybiA0MCt0Km8rbyouNX1mdW5jdGlvbiB0SShlLHQsbixyKXtsZXQgbz1lLmN1cnJlbnQ7aWYoIW8pcmV0dXJuIDA7bGV0IGE9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPW8ub2Zmc2V0SGVpZ2h0LTUwLGQ9KG5bdF0/LnZhbHVlfHwwKS9yKnMqLjg1O3JldHVybiBhLnRvcCtzLWQrMTB9ZnVuY3Rpb24gbkkoZSx0LG4pe2lmKCFufHwhdFtlXSlyZXR1cm5bXTtsZXQgcj16ZSh0W2VdLmRhdGUpO3JldHVybihuW3JdfHxbXSkuc2xpY2UoKS5zb3J0KChvLGEpPT4oYS52aWN0b3J5VmFsdWV8fDApLShvLnZpY3RvcnlWYWx1ZXx8MCkpfWZ1bmN0aW9uIHJJKGUsdCl7aWYoIWV8fCFBcnJheS5pc0FycmF5KGUpfHwhdClyZXR1cm5bXTtsZXQgbj17fTtmb3IobGV0IHIgb2YgZSl7aWYoIXJ8fHIudGltZXN0YW1wPT1udWxsKWNvbnRpbnVlO2xldCBvPW5ldyBEYXRlKHIudGltZXN0YW1wKjFlMyksYT16ZShvKTsoIW5bYV18fHIudGltZXN0YW1wPm5bYV0udGltZXN0YW1wKSYmKG5bYV09cil9cmV0dXJuIHQubWFwKHI9PntsZXQgbz16ZShyLmRhdGUpO3JldHVybiBuW29dfHxudWxsfSl9ZnVuY3Rpb24gb0koZSx0LG4pe2lmKCF0fHwhdFtlXSlyZXR1cm4gbnVsbDtpZihuJiZuW2VdKXtsZXQgbz1uZXcgRGF0ZTtpZihvLnNldEhvdXJzKDIzLDU5LDU5LDk5OSksZHQobltlXS5kYXRlKT5vKXJldHVybiBudWxsfWxldCByPXRbZV0ucmF0aW5nO3JldHVybiBWMi5maW5kKG89Pm8udmFsdWU9PT1yKXx8bnVsbH1mdW5jdGlvbiBhSShlLHQsbixyLG8sYSl7dC5mb3JFYWNoKChpLHMpPT57bGV0IGw9aS52YWx1ZS9uKm8qLjg1LGQ9NDArcypyK3IqLjE1LGM9by1sKzEwO2UuZmlsbFN0eWxlPWkudmFsdWU+MD8iIzYzNjZmMSI6IiNlNWU3ZWIiLGUuYmVnaW5QYXRoKCksZS5yb3VuZFJlY3QoZCxjLHIqLjcsbCxbNCw0LDAsMF0pLGUuZmlsbCgpLGUuZmlsbFN0eWxlPSIjNmI3MjgwIixlLmZvbnQ9IjExcHggc3lzdGVtLXVpIixlLnRleHRBbGlnbj0iY2VudGVyIixlLmZpbGxUZXh0KGkuZGF5LGQrciouMzUsYS0xNSk7bGV0IHU9ZHQoaS5kYXRlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KTtlLmZpbGxTdHlsZT0iIzljYTNhZiIsZS5mb250PSI5cHggc3lzdGVtLXVpIixlLmZpbGxUZXh0KHUsZCtyKi4zNSxhLTMpLGkudmFsdWU+MCYmKGUuZmlsbFN0eWxlPSIjZmZmZmZmIixlLmZvbnQ9ImJvbGQgMTBweCBzeXN0ZW0tdWkiLGUuZmlsbFRleHQoaUkoaS52YWx1ZSksZCtyKi4zNSxjKzE0KSl9KX1mdW5jdGlvbiBpSShlKXtyZXR1cm4oTWF0aC5yb3VuZCgoZXx8MCkqMTApLzEwKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIHNJKGUsdCxuLHIsbyl7bGV0IGE9bmV3IERhdGU7YS5zZXRIb3VycygyMyw1OSw1OSw5OTkpO2xldCBpPVtdO2lmKHQuZm9yRWFjaCgocyxsKT0+e2lmKCFzfHwhbltsXXx8ZHQobltsXS5kYXRlKT5hKXJldHVybjtsZXQgYz1vLShzLnJhdGluZysyKS80Km8rMTAscD00MCtsKnIrciouNTtpLnB1c2goe2luZGV4OmwseDpwLHk6Y30pfSksaS5sZW5ndGghPT0wKXtlLnN0cm9rZVN0eWxlPSIjZjU5ZTBiIixlLmxpbmVXaWR0aD0yO2ZvcihsZXQgcz0xO3M8aS5sZW5ndGg7cysrKXtsZXQgbD1pW3MtMV0sZD1pW3NdO2Uuc2V0TGluZURhc2goZC5pbmRleD09PWwuaW5kZXgrMT9bXTpbMyw0XSksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyhsLngsbC55KSxlLmxpbmVUbyhkLngsZC55KSxlLnN0cm9rZSgpfWUuc2V0TGluZURhc2goW10pLGkuZm9yRWFjaCgoe3g6cyx5Omx9KT0+e2UuZmlsbFN0eWxlPSIjZjU5ZTBiIixlLmJlZ2luUGF0aCgpLGUuYXJjKHMsbCwzLDAsTWF0aC5QSSoyKSxlLmZpbGwoKX0pfX1mdW5jdGlvbiBsSShlLHQsbixyLG8pe2xldCBhPWUuY3VycmVudDtpZighYSlyZXR1cm47bGV0IGk9YS5nZXRDb250ZXh0KCIyZCIpLHM9YS53aWR0aD1hLm9mZnNldFdpZHRoKjIsbD1hLmhlaWdodD1hLm9mZnNldEhlaWdodCoyO2kuc2NhbGUoMiwyKTtsZXQgZD1zLzIsYz1sLzIscD0oZC04MCkvNyx1PWMtNTA7aS5jbGVhclJlY3QoMCwwLGQsYyksYUkoaSx0LG4scCx1LGMpLG8mJnImJnIuc29tZShmPT5mIT09bnVsbCkmJnNJKGkscix0LHAsdSl9ZnVuY3Rpb24gZEkoZSx0LG4scil7bGV0IG89bkkoZSx0LG4pLGE9b0koZSxyLHQpLHM9W2A8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1oZWFkZXIiPiR7dFtlXT9Fdyh0W2VdLmRhdGUpOiIifTwvZGl2PmBdO2lmKGEmJnMucHVzaChgPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtc2VjdGlvbiI+JHthLmVtb2ppfSAke2EubGFiZWx9PC9kaXY+YCksby5sZW5ndGg+MClmb3IobGV0IGwgb2YgbylzLnB1c2goYDxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdyI+PHNwYW4gY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdy1sYWJlbCI+JHtCYShsLmNvbnRlbnQpfTwvc3Bhbj48c3BhbiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtcm93LXZhbHVlIj4ke2wudmljdG9yeVZhbHVlfHwwfSBwdHM8L3NwYW4+PC9kaXY+YCk7ZWxzZSBzLnB1c2goJzxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLWVtcHR5Ij5ObyBjb21wbGV0ZWQgdGFza3M8L2Rpdj4nKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiBjSSh7dGltZVJhbmdlOmUsc2V0VGltZVJhbmdlOnR9KXtyZXR1cm4oMCxKZS5qc3gpKEplLkZyYWdtZW50LHtjaGlsZHJlbjpbIndlZWsiLCJtb250aCIsIjMwZGF5cyJdLm1hcChuPT4oMCxKZS5qc3hzKSgibGFiZWwiLHtjaGlsZHJlbjpbKDAsSmUuanN4KSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToidnYtdGltZS1yYW5nZSIsdmFsdWU6bixjaGVja2VkOmU9PT1uLG9uQ2hhbmdlOnQuYmluZChudWxsLG4pfSksbj09PSJ3ZWVrIj8iVGhpcyB3ZWVrIjpuPT09Im1vbnRoIj8iVGhpcyBtb250aCI6Ikxhc3QgMzAgZGF5cyJdfSxuKSl9KX1mdW5jdGlvbiBOaCh7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxkYWlseVZhbHVlczpuLG1vb2RSYXRpbmdzOnIsb25SZWZlcmVuY2VEYXRlQ2hhbmdlOm8scmVmZXJlbmNlRGF0ZTphLHdlZWtGb3JtYXQ6aSx3ZWVrbHlUb3RhbDpzfSl7bGV0IGw9KDAsY3IudXNlUmVmKShudWxsKSxkPXZkKGkpLGM9UTIoYSxuLHQsZCkscD1NYXRoLm1heCguLi5jLm1hcChCPT5CLnZhbHVlKSwxKSx1PWMucmVkdWNlKChCLFcpPT5CKyhXLnZhbHVlfHwwKSwwKSxmPU1hdGgucm91bmQodXx8c3x8MCksdj1ySShyLGMpLFt3LGJdPSgwLGNyLnVzZVN0YXRlKSghMSksW2csbV09KDAsY3IudXNlU3RhdGUpKG51bGwpLHk9dGQoUGUoKSwidmljdG9yeS12YWx1ZSIpLFtoLHhdPSgwLGNyLnVzZVN0YXRlKSh5WzBdfHwid2VlayIpLFtFLFRdPSgwLGNyLnVzZVN0YXRlKShyeCh5WzFdKSksRD1iLmJpbmQobnVsbCwhMCksQT1KMi5iaW5kKG51bGwsZSxoLEUsYiksXz1YMi5iaW5kKG51bGwseSx4LFQsYiksST1LMihjKSxNPW5zKHtpbnRlcmFjdGl2ZTohMH0pLFA9Qj0+e00uY2FuY2VsU2NoZWR1bGVkSGlkZSgpLFoyKGwsbSxCKX0sej0oKT0+TS5zY2hlZHVsZUhpZGUoMzAwLCgpPT5tKG51bGwpKTtyZXR1cm4oMCxjci51c2VFZmZlY3QpKCgpPT57bEkobCxjLHAsdixFKX0sW2MscCx2LEVdKSwoMCxjci51c2VFZmZlY3QpKCgpPT57aWYoZz09PW51bGwpe00uaGlkZSgpO3JldHVybn1sZXQgQj1sLmN1cnJlbnQ7aWYoIUIpcmV0dXJuO2xldCBXPUIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksc2U9ZUkobCxnKSxPPVcubGVmdCtzZSwkPXRJKGwsZyxjLHApLE49JCxTPXdpbmRvdy5pbm5lckhlaWdodC1XLmJvdHRvbSxSPWRJKGcsYyx0LHYpO1M+Tj9NLnNob3coUixPLFcuYm90dG9tLHtwbGFjZW1lbnQ6ImJvdHRvbSIsYmVsb3dDaGFydDohMH0pOk0uc2hvdyhSLE8sJCx7cGxhY2VtZW50OiJ0b3AifSl9LFtnXSksKDAsSmUuanN4cykoaWUse3RpdGxlOmxlKCJ2aWN0b3J5LXZhbHVlIiksaWNvbjoiXHV7MUYzQzZ9Iix3aWRnZXRJZDoidmljdG9yeS12YWx1ZSIsY29uZmlndXJhYmxlOiEwLG9uQ29uZmlndXJlOkQsY2hpbGRyZW46W3c/KDAsSmUuanN4cykoT3Ise3RpdGxlOiJDb25maWd1cmUgVmljdG9yeSBWYWx1ZSIsb25TdWJtaXQ6QSxvbkNhbmNlbDpfLGNoaWxkcmVuOlsoMCxKZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxKZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IlRpbWUgcmFuZ2UifSksKDAsSmUuanN4KShjSSx7dGltZVJhbmdlOmgsc2V0VGltZVJhbmdlOnh9KV19KSwoMCxKZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxKZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46Ik1vb2Qgb3ZlcmxheSJ9KSwoMCxKZS5qc3hzKSgibGFiZWwiLHtjaGlsZHJlbjpbKDAsSmUuanN4KSgiaW5wdXQiLHt0eXBlOiJjaGVja2JveCIsY2hlY2tlZDpFLG9uQ2hhbmdlOkI9PlQoQi50YXJnZXQuY2hlY2tlZCl9KSwiU2hvdyBtb29kIG92ZXJsYXkiXX0pXX0pXX0pOm51bGwsKDAsSmUuanN4cykoImRpdiIse2NsYXNzTmFtZToidnYtaGVhZGVyIixjaGlsZHJlbjpbKDAsSmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToidnYtdG90YWwiLGNoaWxkcmVuOmZ9KSwoMCxKZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ2di1sYWJlbCIsY2hpbGRyZW46YHBvaW50cyAke0l9YH0pXX0pLCgwLEplLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InZ2LWNoYXJ0LWNvbnRhaW5lciIsY2hpbGRyZW46WygwLEplLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToidnYtbmF2LWFycm93Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9Pm8mJm8obngoYSwtMSkpLHRpdGxlOiJQcmV2aW91cyB3ZWVrIiwiYXJpYS1sYWJlbCI6IlByZXZpb3VzIHdlZWsiLGNoaWxkcmVuOiJcdTIwMzkifSksKDAsSmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJ2di1jaGFydC13cmFwIixjaGlsZHJlbjooMCxKZS5qc3gpKCJjYW52YXMiLHtyZWY6bCxjbGFzc05hbWU6InZ2LWNoYXJ0Iixvbk1vdXNlTW92ZTpQLG9uTW91c2VMZWF2ZTp6fSl9KSwoMCxKZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6InZ2LW5hdi1hcnJvdyIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpZMihhLGQpLG9uQ2xpY2s6KCk9Pm8mJm8obngoYSwxKSksdGl0bGU6Ik5leHQgd2VlayIsImFyaWEtbGFiZWwiOiJOZXh0IHdlZWsiLGNoaWxkcmVuOiJcdTIwM0EifSldfSldfSl9dmFyIE9lPVUoZWUoKSwxKTtmdW5jdGlvbiB1SShlKXtsZXQgdD1OdW1iZXIoZT8uZ3JpZFdpZHRoU2l6ZSk+MD9OdW1iZXIoZS5ncmlkV2lkdGhTaXplKToxLG49TnVtYmVyKGU/LmdyaWRIZWlnaHRTaXplKT4wP051bWJlcihlLmdyaWRIZWlnaHRTaXplKToxO3JldHVybmBncmlkLWNlbGwgaG9yaXpvbnRhbC0ke3R9LWNlbGwgdmVydGljYWwtJHtufS1jZWxsYH1mdW5jdGlvbiBwSShlLHQsbixyKXtsZXQgbz1lPy53aWRnZXRJZCx7Y2xhc3NOYW1lczphLHN0eWxlOml9PVQwKG4scixvKTtyZXR1cm57Y2xhc3NOYW1lOlt1SShlKSx0PyJncmlkLWNlbGwtLWRyYWctYWN0aXZlIjoiIix0JiZ0PT09bz8iZ3JpZC1jZWxsLS1kcmFnZ2luZy1yZWFkeSI6IiIsdCYmdCE9PW8/ImdyaWQtY2VsbC0tZHJhZy1zaGlmdCI6IiIsLi4uYV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKSwiZGF0YS13aWRnZXQtaWQiOm8sc3R5bGU6aX19dmFyIFRoPWNsYXNzIGV4dGVuZHMgeGUuQ29tcG9uZW50e3N0YXRpYyBjb250ZXh0VHlwZT1SZDtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnN0YXRlPXtoYXNFcnJvcjohMSxlcnJvcjpudWxsfX1zdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHQpe3JldHVybntoYXNFcnJvcjohMCxlcnJvcjp0fX1jb21wb25lbnREaWRDYXRjaCh0LG4pe2soYFtXaWRnZXRFcnJvckJvdW5kYXJ5XSBXaWRnZXQgIiR7dGhpcy5wcm9wcy53aWRnZXRJZH0iIGNyYXNoZWQ6YCx0LG4pLHRoaXMuY29udGV4dD8ucmVwb3J0RXJyb3IodGhpcy5wcm9wcy53aWRnZXRJZCl9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuaGFzRXJyb3I/KDAsT2UuanN4cykoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrIixjaGlsZHJlbjpbKDAsT2UuanN4KSgicCIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLXRpdGxlIixjaGlsZHJlbjpgXHUyNkEwICR7dGhpcy5wcm9wcy53aWRnZXRJZH1gfSksKDAsT2UuanN4KSgicCIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLW1lc3NhZ2UiLGNoaWxkcmVuOnRoaXMuc3RhdGUuZXJyb3I/Lm1lc3NhZ2V8fCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIn0pLCgwLE9lLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLXJldHJ5IixvbkNsaWNrOigpPT50aGlzLnNldFN0YXRlKHtoYXNFcnJvcjohMSxlcnJvcjpudWxsfSksY2hpbGRyZW46IlJldHJ5In0pXX0pOnRoaXMucHJvcHMuY2hpbGRyZW59fTtmdW5jdGlvbiBmSSh7d2lkZ2V0SWQ6ZX0pe3JldHVybiBtYihlKSxudWxsfWZ1bmN0aW9uIE10KGUsdCxuKXtyZXR1cm4oMCx4ZS5tZW1vKShmdW5jdGlvbihvKXt0eChlKTtsZXR7Y29uZmlnOmEsZHJhZ2dpbmdXaWRnZXRJZDppLGZvY3VzZWRXaWRnZXRJZDpzLHdpZGdldEZvY3VzVHJhbnNmb3JtOmx9PW8sZD17Z3JpZEhlaWdodFNpemU6TnVtYmVyKGE/LmdyaWRIZWlnaHRTaXplKT4wP051bWJlcihhLmdyaWRIZWlnaHRTaXplKToxLGdyaWRXaWR0aFNpemU6TnVtYmVyKGE/LmdyaWRXaWR0aFNpemUpPjA/TnVtYmVyKGEuZ3JpZFdpZHRoU2l6ZSk6MX07cmV0dXJuKDAsT2UuanN4KSgiZGl2Iix7Li4ucEkoYSxpLHMsbCksY2hpbGRyZW46KDAsT2UuanN4KShUaCx7d2lkZ2V0SWQ6ZSxjaGlsZHJlbjooMCxPZS5qc3hzKSh2Zi5Qcm92aWRlcix7dmFsdWU6ZCxjaGlsZHJlbjpbKDAsT2UuanN4KShmSSx7d2lkZ2V0SWQ6ZX0pLCgwLE9lLmpzeCkodCx7Li4ubihvKX0pXX0pfSl9KX0pfWZ1bmN0aW9uIFRzKC4uLmUpe3JldHVybiB0PT57bGV0IG49e307Zm9yKGxldCByIG9mIGUpbltyXT10W3JdO3JldHVybiBufX12YXIgaEk9TXQoImFnZW5kYSIsU2YsKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY2FsZW5kYXJFdmVudHNMb2FkZWQ6cixjdXJyZW50RGF0ZTpvLHNlbGVjdGVkRGF0ZTphLHRpbWVGb3JtYXQ6aX0pPT4oe2FwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sc2VsZWN0ZWREYXRlOmEsdGFza3M6ZSx0aW1lRm9ybWF0Oml9KSksZ0k9TXQoImRheS1za2V0Y2giLFlmLCh7YWdlbmRhVGFza3M6ZSxhcHA6dCxjYWxlbmRhckV2ZW50czpuLGNhbGVuZGFyRXZlbnRzTG9hZGVkOnIsY3VycmVudERhdGU6byx0aW1lRm9ybWF0OmF9KT0+KHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sdGltZUZvcm1hdDphfSkpLG1JPU10KCJjYWxlbmRhciIsRWYsKHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGNvbmZpZzpuLGN1cnJlbnREYXRlOnIsb25EYXRlU2VsZWN0Om8sb25PcGVuU2V0dGluZ3M6YSxvcGVuVGFza3M6aSxzZWxlY3RlZERhdGU6cyx3ZWVrRm9ybWF0Omx9KT0+KHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGN1cnJlbnREYXRlOnIsZ3JpZEhlaWdodFNpemU6bj8uZ3JpZEhlaWdodFNpemUsZ3JpZFdpZHRoU2l6ZTpuPy5ncmlkV2lkdGhTaXplLG9uRGF0ZVNlbGVjdDpvLG9uT3BlblNldHRpbmdzOmEsb3BlblRhc2tzOmksc2VsZWN0ZWREYXRlOnMsd2Vla0Zvcm1hdDpsfSkpLHZJPU10KCJkZWJ1Zy1jb25zb2xlIixxZiwoKT0+KHt9KSkseUk9TXQoImRyZWFtLXRhc2siLEZmLCh7YXBwOmUsY29uZmlnOnQsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsZ3JpZFdpZHRoU2l6ZTpOdW1iZXIodD8uZ3JpZFdpZHRoU2l6ZSl8fDIsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pKSx3ST1NdCgibW9vZCIsdGgsVHMoImFwcCIsIm1vb2RSYXRpbmdzIiwib25Nb29kUmVjb3JkZWQiKSksYkk9TXQoInBlYWstaG91cnMiLHJoLFRzKCJhcHAiLCJjdXJyZW50RGF0ZSIsInNlbGVjdGVkRGF0ZSIsInRpbWVGb3JtYXQiKSksa0k9TXQoInByb3Bvc2VkLWFnZW5kYSIsZmgsKHthcHA6ZSxjdXJyZW50RGF0ZTp0LHByb3ZpZGVyQXBpS2V5Om4scHJvdmlkZXJFbTpyLHRhc2tEb21haW5VVUlEOm8sdGltZUZvcm1hdDphfSk9Pih7YXBwOmUsY3VycmVudERhdGU6dCxkZWZhdWx0Tm90ZVV1aWQ6bnVsbCxwcm92aWRlckFwaUtleTpuLHByb3ZpZGVyRW06cix0YXNrRG9tYWluVVVJRDpvLHRpbWVGb3JtYXQ6YX0pKSx4ST1NdCgicGxhbm5pbmciLHlmLCh7YXBwOmUsY29uZmlnOnQscXVhcnRlcmx5UGxhbnM6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEscXVhcnRlcmx5UGxhbnM6bn0pKSxTST1NdCgicXVpY2stYWN0aW9ucyIsZ2gsVHMoImFwcCIpKSxFST1NdCgicXVvdGVzIixoaCwoe2FwcDplLGNvbmZpZzp0fSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSxwbGFuQ29udGVudDpudWxsLHF1b3RlczpudWxsfSkpLE5JPU10KCJyZWNlbnQtbm90ZXMiLHZoLCh7YXBwOmUsY29uZmlnOnQsdGFza0RvbWFpblVVSUQ6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsdGFza0RvbWFpblVVSUQ6bn0pKSxUST1NdCgic2hhcmVkLW5vdGVzIixTaCwoe2FwcDplLGNvbmZpZzp0LHRhc2tEb21haW5VVUlEOm59KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLHRhc2tEb21haW5VVUlEOm59KSksREk9TXQoImdyYXZleWFyZCIsSGYsKHthcHA6ZSxjb25maWc6dCx0YXNrRG9tYWluVVVJRDpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSxncmlkV2lkdGhTaXplOk51bWJlcih0Py5ncmlkV2lkdGhTaXplKXx8Mix0YXNrRG9tYWluVVVJRDpufSkpLEFJPU10KCJ2aWN0b3J5LXZhbHVlIixOaCxUcygiYXBwIiwiY29tcGxldGVkVGFza3NCeURhdGUiLCJkYWlseVZhbHVlcyIsIm1vb2RSYXRpbmdzIiwib25SZWZlcmVuY2VEYXRlQ2hhbmdlIiwicmVmZXJlbmNlRGF0ZSIsIndlZWtGb3JtYXQiLCJ3ZWVrbHlUb3RhbCIpKSxfST1NdCgibGF5b3V0LXBpY2tlciIsVmYsVHMoImFwcCIsImN1cnJlbnRMYXlvdXQiLCJvbkxheW91dEFwcGx5Iiwib25TZWxlY3RlZFByb2ZpbGVDaGFuZ2UiKSksb3g9e2FnZW5kYTpoSSxjYWxlbmRhcjptSSwiZGF5LXNrZXRjaCI6Z0ksImRlYnVnLWNvbnNvbGUiOnZJLCJkcmVhbS10YXNrIjp5SSxncmF2ZXlhcmQ6REksImxheW91dC1waWNrZXIiOl9JLG1vb2Q6d0ksInBlYWstaG91cnMiOmJJLHBsYW5uaW5nOnhJLCJwcm9wb3NlZC1hZ2VuZGEiOmtJLCJxdWljay1hY3Rpb25zIjpTSSxxdW90ZXM6RUksInJlY2VudC1ub3RlcyI6TkksInNoYXJlZC1ub3RlcyI6VEksInZpY3RvcnktdmFsdWUiOkFJfTtmdW5jdGlvbiBDSShlLHtpbml0RGF0YUZyZXNoUmVmOnQsaW5pdGlhbGl6ZURvbWFpblRhc2tzOm4sc2V0Q29uZmlnUGFyYW1zOnIsc2V0Q3VycmVudERhdGU6byxzZXREYWlseVZpY3RvcnlWYWx1ZXM6YSxzZXRNb29kUmF0aW5nczppLHNldFBsdWdpbk5vdGVVVUlEOnMsc2V0UXVhcnRlcmx5UGxhbnM6bCxzZXRXZWVrbHlWaWN0b3J5VmFsdWU6ZH0pe0VwKGUuc2V0dGluZ3M/LltqLkNPTlNPTEVfTE9HR0lOR10pLGsoYFtkYXNoYm9hcmRdIGFwcGx5RGFzaGJvYXJkRGF0YSBcdTIwMTQgdGFza3M6JHtlLnRhc2tzPy5sZW5ndGg/PzB9IG1vb2RSYXRpbmdzOiAke2UubW9vZFJhdGluZ3M/Lmxlbmd0aD8/MH1gKSx3aW5kb3cuX19kYXNoYm9hcmRWaWV3cG9ydERpYWcmJmsoYFt2aWV3cG9ydF0gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3cuX19kYXNoYm9hcmRWaWV3cG9ydERpYWcpfWApLG4oZSksaShlLm1vb2RSYXRpbmdzKSxsKGUucXVhcnRlcmx5UGxhbnMpLHIoZS5zZXR0aW5ncyksYShlLmRhaWx5VmljdG9yeVZhbHVlcyksZChlLndlZWtseVZpY3RvcnlWYWx1ZSksbyhlLmN1cnJlbnREYXRlKSxlLnBsdWdpbk5vdGVVVUlEJiZzKGUucGx1Z2luTm90ZVVVSUQpLHQuY3VycmVudD0hMH1mdW5jdGlvbiBheChlKXtsZXQgdD1uZXcgRGF0ZSxuPV9uKHQsZSk7cmV0dXJuIHQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpPDMqMjQqNjAqNjAqMWUzfWZ1bmN0aW9uIE9JKGUsdCl7bGV0IG49bmV3IE1hcDtmb3IobGV0IHIgb2ZbLi4uZXx8W10sLi4udHx8W11dKXtpZighcnx8ci50aW1lc3RhbXA9PW51bGwpY29udGludWU7bGV0IG89ci51dWlkfHxgJHtyLnRpbWVzdGFtcH06JHtyLnJhdGluZ306JHtyLm5vdGV8fCIifWA7bi5zZXQobyxyKX1yZXR1cm4gQXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChyLG8pPT4oci50aW1lc3RhbXB8fDApLShvLnRpbWVzdGFtcHx8MCkpfWFzeW5jIGZ1bmN0aW9uIElJKGUsdCxuLHIpe2xldCBvPV9uKHQscik7YXgocikmJihvPW5ldyBEYXRlKG8pLG8uc2V0RGF0ZShvLmdldERhdGUoKS03KSk7bGV0IGE9TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpO3RyeXtsZXQgaT1hd2FpdCBlLmdldE1vb2RSYXRpbmdzKGEpO0FycmF5LmlzQXJyYXkoaSkmJm4ocz0+T0kocyxpKSl9Y2F0Y2goaSl7aygiZmV0Y2hNb29kUmF0aW5nczogZmFpbGVkIHRvIGxvYWQgbW9vZCByYXRpbmdzIixpKX19ZnVuY3Rpb24gTUkoZSx0LG4scixvLGEpe2UocixvLGEpLGEmJih0KGEuZGFpbHlWaWN0b3J5VmFsdWVzKSxuKGEud2Vla2x5VmljdG9yeVZhbHVlKSl9YXN5bmMgZnVuY3Rpb24gUkkoZSx0LG4scixvPSExLGE9bnVsbCl7bGV0IGk9QXJyYXkuaXNBcnJheSh0Py5bai5EQVNIQk9BUkRfQ09NUE9ORU5UU10pP3Rbai5EQVNIQk9BUkRfQ09NUE9ORU5UU106YW8scz17fTtvfHxpLmZvckVhY2goZD0+e3NbZC53aWRnZXRJZF09ZH0pO2xldCBsPXIubWFwKGQ9PntsZXQgYz1zW2RdLHA9bG4uZmluZChmPT5mLndpZGdldElkPT09ZCksdT1hPy5bZF07cmV0dXJue3dpZGdldElkOmQsZ3JpZFdpZHRoU2l6ZTp1Py5ncmlkV2lkdGhTaXplPz9jPy5ncmlkV2lkdGhTaXplPz9wPy5kZWZhdWx0R3JpZFdpZHRoU2l6ZT8/MSxncmlkSGVpZ2h0U2l6ZTp1Py5ncmlkSGVpZ2h0U2l6ZT8/Yz8uZ3JpZEhlaWdodFNpemU/PzEsc2V0dGluZ3M6Yz8uc2V0dGluZ3N8fHt9fX0pO2F3YWl0IGUuc2V0U2V0dGluZyhqLkRBU0hCT0FSRF9DT01QT05FTlRTLEpTT04uc3RyaW5naWZ5KGwpKSxWbyhqLkRBU0hCT0FSRF9DT01QT05FTlRTLGwpLG4oZD0+KHsuLi5kLFtqLkRBU0hCT0FSRF9DT01QT05FTlRTXTpsfSkpfWFzeW5jIGZ1bmN0aW9uIFBJKGUsdCxuLHIsbyxhLHthcGlLZXk6aSxhcGlLZXlQcm92aWRlcjpzLGJhY2tncm91bmRJbWFnZVVybDpsLGJhY2tncm91bmRNb2RlOmQsbGxtUHJvdmlkZXI6Yyx0aW1lRm9ybWF0OnAsd2Vla0Zvcm1hdDp1fSl7aygiW2Rhc2hib2FyZF0gaGFuZGxlU2V0dGluZ3NTYXZlIGNhbGxlZCB3aXRoOiIse2xsbVByb3ZpZGVyOmMsYXBpS2V5UHJvdmlkZXI6cyxiYWNrZ3JvdW5kTW9kZTpkLGJhY2tncm91bmRJbWFnZVVybDpsIT1udWxsPyIoc2V0KSI6Iih1bmNoYW5nZWQpIix0aW1lRm9ybWF0OnAsd2Vla0Zvcm1hdDp1fSk7bGV0IGY9JHQoc3x8Yyksdj1bZS5zZXRTZXR0aW5nKGouTExNX1BST1ZJREVSX01PREVMLGMpLGUuc2V0U2V0dGluZyhqLkJBQ0tHUk9VTkRfSU1BR0VfVVJMLGx8fCIiKV07ZiYmaSYmdi5wdXNoKGUuc2V0U2V0dGluZyhmLGkpKSxsJiZkJiZ2LnB1c2goZS5zZXRTZXR0aW5nKGouQkFDS0dST1VORF9JTUFHRV9NT0RFLGQpKSx0LmN1cnJlbnQmJihwfHx1KSYmdi5wdXNoKHQuY3VycmVudC5zYXZlKHt0aW1lRm9ybWF0OnAsd2Vla0Zvcm1hdDp1fSkpO3RyeXthd2FpdCBQcm9taXNlLmFsbCh2KSxrKCJbZGFzaGJvYXJkXSBzZXR0aW5ncyBzYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKX1jYXRjaChiKXtrKCJbZGFzaGJvYXJkXSBzZXR0aW5ncyBzYXZlIEZBSUxFRDoiLGIpfVZvKGouTExNX1BST1ZJREVSX01PREVMLGMpLGYmJlZvKGYsaSk7bGV0IHc9e1tqLkxMTV9QUk9WSURFUl9NT0RFTF06Yyxbai5CQUNLR1JPVU5EX0lNQUdFX1VSTF06bHx8IiIsW2ouQkFDS0dST1VORF9JTUFHRV9NT0RFXTpsP2R8fCJjb3ZlciI6IiJ9O2YmJih3W2ZdPWkpLG4oYj0+KHsuLi5iLC4uLnd9KSkscCYmbyhwKSx1JiZhKHUpLHIoRnQuREVGQVVMVCl9ZnVuY3Rpb24gTEkoZSx0KXtlKG49PlsuLi5ufHxbXSx0XSl9ZnVuY3Rpb24gRGgoe2FwcDplLGluaXRQcm9taXNlOnR9KXtsZXR7YWN0aXZlVGFza0RvbWFpbjpuLGJ1aWxkQWdlbmRhVGFza3NCeURhdGU6cixpbml0aWFsaXplRG9tYWluVGFza3M6byxvbkRvbWFpbkNoYW5nZTphLG9wZW5UYXNrczppLHRhc2tEb21haW5zOnN9PVpmKCkse2NvbXBsZXRlZFRhc2tzQnlEYXRlOmwsZmV0Y2hDb21wbGV0ZWRUYXNrczpkfT1RZihlKSx7Y2FsZW5kYXJFdmVudHM6YyxjYWxlbmRhckV2ZW50c0xvYWRlZDpwfT1iZihlLG4pLFt1LGZdPSgwLHhlLnVzZVN0YXRlKShudWxsKSxbdix3XT0oMCx4ZS51c2VTdGF0ZSkobnVsbCksW2IsZ109KDAseGUudXNlU3RhdGUpKG51bGwpLFttLHldPSgwLHhlLnVzZVN0YXRlKShudWxsKSxbaCx4XT0oMCx4ZS51c2VTdGF0ZSkoRnQuREVGQVVMVCksW0UsVF09KDAseGUudXNlU3RhdGUpKG51bGwpLFtELEFdPSgwLHhlLnVzZVN0YXRlKShudWxsKSxbXyxJXT0oMCx4ZS51c2VTdGF0ZSkobnVsbCksW00sUF09KDAseGUudXNlU3RhdGUpKG51bGwpLFt6LEJdPSgwLHhlLnVzZVN0YXRlKSgibWVyaWRpYW4iKSxbVyxzZV09KDAseGUudXNlU3RhdGUpKCJzdW5kYXkiKSxbTywkXT0oMCx4ZS51c2VTdGF0ZSkobnVsbCksTj0oMCx4ZS51c2VSZWYpKG51bGwpLFM9KDAseGUudXNlUmVmKSghMSksUj12ZChXKTsoMCx4ZS51c2VFZmZlY3QpKCgpPT57bGV0IG1lPURhdGUubm93KCk7aygiW2Rhc2hib2FyZF0gYXdhaXRpbmcgaW5pdCBkYXRhIiksdC50aGVuKGFzeW5jIFdlPT57aWYoayhgW2Rhc2hib2FyZF0gaW5pdCBkYXRhIHJlY2VpdmVkIGluICR7RGF0ZS5ub3coKS1tZX1tc2ApLFdlPy5lcnJvcil5KFdlLmVycm9yKTtlbHNle3d3KFdlKSxDSShXZSx7aW5pdERhdGFGcmVzaFJlZjpTLGluaXRpYWxpemVEb21haW5UYXNrczpvLHNldENvbmZpZ1BhcmFtczpmLHNldEN1cnJlbnREYXRlOncsc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmcsc2V0TW9vZFJhdGluZ3M6VCxzZXRQbHVnaW5Ob3RlVVVJRDpBLHNldFF1YXJ0ZXJseVBsYW5zOkksc2V0V2Vla2x5VmljdG9yeVZhbHVlOiR9KSxOLmN1cnJlbnQ9bmV3IGhzKGUpO2xldCBidD1EYXRlLm5vdygpO2soIltkYXNoYm9hcmRdIGxvYWRpbmcgRGFzaGJvYXJkU2V0dGluZ05vdGUiKTtsZXR7dGltZUZvcm1hdDpNbix3ZWVrRm9ybWF0OnByfT1hd2FpdCBOLmN1cnJlbnQubG9hZCgpO2soYFtkYXNoYm9hcmRdIERhc2hib2FyZFNldHRpbmdOb3RlIGxvYWRlZCBpbiAke0RhdGUubm93KCktYnR9bXNgKSxNbiYmQihNbikscHImJnNlKHByKX19KS5jYXRjaChXZT0+eShXZS5tZXNzYWdlKSl9LFtdKTtsZXQgRj0oMCx4ZS51c2VNZW1vKSgoKT0+e2lmKE0pcmV0dXJuIE07aWYoIXYpcmV0dXJuIG51bGw7aWYoYXgoUikpe2xldCBtZT1fbih2LFIpLFdlPW5ldyBEYXRlKG1lKTtyZXR1cm4gV2Uuc2V0RGF0ZShXZS5nZXREYXRlKCktMSksemUoV2UpfXJldHVybiB2fSxbdixNLFJdKSxYPSgwLHhlLnVzZUNhbGxiYWNrKShtZT0+SUkoZSxtZSxULFIpLFtlLFJdKTsoMCx4ZS51c2VFZmZlY3QpKCgpPT57bGV0IG1lPU18fHY7bWUmJihTLmN1cnJlbnQ/Uy5jdXJyZW50PSExOlgobWUpLGQobWUsbiksRiYmRiE9PW1lJiZkKEYsbikpfSxbbix2LGQsWCxNLEZdKTtsZXQgUT0oMCx4ZS51c2VDYWxsYmFjaykoKG1lLFdlLGJ0KT0+TUkoYSxnLCQsbWUsV2UsYnQpLFthXSksWj0oMCx4ZS51c2VDYWxsYmFjaykoKG1lLFdlPSExLGJ0PW51bGwpPT5SSShlLHUsZixtZSxXZSxidCksW2UsdV0pLHE9KDAseGUudXNlQ2FsbGJhY2spKG1lPT5mKFdlPT4oey4uLldlLFtqLlNFTEVDVEVEX0xBWU9VVF9QUk9GSUxFXTptZX0pKSxbXSkscmU9KDAseGUudXNlQ2FsbGJhY2spKGFzeW5jKG1lLFdlPSExLGJ0PW51bGwsTW49dm9pZCAwKT0+e2F3YWl0IGpmKHthcHA6ZSxpc1Jlc2V0OldlLG9uTGF5b3V0UGVyc2lzdDpaLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOnEscHJvZmlsZUlkOk1uLHNpemluZzpidCx3aWRnZXRJZHM6bWV9KSx4KEZ0LkRFRkFVTFQpfSxbZSxaLHFdKSxwZT0oMCx4ZS51c2VDYWxsYmFjaykobWU9PlBJKGUsTixmLHgsQixzZSxtZSksW2VdKSxnZT0oMCx4ZS51c2VDYWxsYmFjaykobWU9PkxJKFQsbWUpLFtdKTt6Zih7YWN0aXZlVGFza0RvbWFpbjpuLGFwcDplLG9uRG9tYWluQ2hhbmdlOmEsb3BlblRhc2tzOml9KTtsZXQgaGU9KDAseGUudXNlTWVtbykoKCk9PnY/cih2KTp7fSxbcix2XSkse2FjdGl2ZUNvbXBvbmVudHM6RWV9PUpmKHtjb25maWdQYXJhbXM6dX0pLHtkcmFnZ2luZ1dpZGdldElkOkFlLGRpc3BsYXllZENvbXBvbmVudHM6Y2V9PWViKEVlLFopLHtjbGVhckZvY3VzZWRXaWRnZXQ6b2UsZm9jdXNlZFdpZGdldElkOkssaXNXaWRnZXRGb2N1c01vZGU6ZmUsd2lkZ2V0Rm9jdXNUcmFuc2Zvcm1zOlZlfT1EMChBZSxoKSxudD0oMCx4ZS51c2VDYWxsYmFjaykoKCk9PngoRnQuU0VUVElOR1NfQ09ORklHKSxbXSksX2U9Y2UubWFwKChtZSxXZSk9Pm1lPy53aWRnZXRJZHx8YW9bV2VdPy53aWRnZXRJZCkuZmlsdGVyKG1lPT5veFttZV0pLGp0PWdiKF9lKTtpZihtKXJldHVybigwLE9lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1lcnJvciIsY2hpbGRyZW46WygwLE9lLmpzeCkoImgyIix7Y2hpbGRyZW46IkRhc2hib2FyZCBFcnJvciJ9KSwoMCxPZS5qc3gpKCJwIix7Y2hpbGRyZW46bX0pXX0pO2lmKCF1KXJldHVybigwLE9lLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLW91dGVyLWNvbnRhaW5lciIsY2hpbGRyZW46KDAsT2UuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxvYWRpbmciLGNoaWxkcmVuOlsoMCxPZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InNwaW5uZXIifSksKDAsT2UuanN4KSgicCIse2NoaWxkcmVuOiJMb2FkaW5nIGRhc2hib2FyZC4uLiJ9KV19KX0pO2xldCBPbj11Py5bai5CQUNLR1JPVU5EX0lNQUdFX1VSTF0sVnQ9dT8uW2ouQkFDS0dST1VORF9JTUFHRV9NT0RFXXx8ImNvdmVyIixJbj1Pbnx8QmQoImxhcmdlIix6ZSh2fHxuZXcgRGF0ZSkpO09uJiZrKCJbZGFzaGJvYXJkXSBiYWNrZ3JvdW5kIGltYWdlIFVSTCBmcm9tIHNldHRpbmdzOiIsT24sIm1vZGU6IixWdCk7bGV0IFByPUluPygoKT0+e2xldCBtZT1WdC5zdGFydHNXaXRoKCJyZXBlYXQiKTtyZXR1cm57YmFja2dyb3VuZEltYWdlOmB1cmwoJHtJbn0pYCxiYWNrZ3JvdW5kU2l6ZTptZT8iYXV0byI6VnQsYmFja2dyb3VuZFJlcGVhdDptZT9WdDoibm8tcmVwZWF0IixiYWNrZ3JvdW5kUG9zaXRpb246ImNlbnRlciIsYmFja2dyb3VuZEF0dGFjaG1lbnQ6ImZpeGVkIn19KSgpOnZvaWQgMCxRbj1TdHJpbmcodVtqLkRFQlVHX0NPTlNPTEVdfHwiIikudHJpbSgpPT09InRydWUifHx4bnx8b3MoKS5wbHVnaW5VVUlEPT09IjZkYTAzNTc0LTBmNGItMTFmMS1iYTllLTExYmE5YzcxNmY1OSI7UW4/ayhgW2Rhc2hib2FyZF0gRGVidWcgY29uc29sZSBlbmFibGVkIChjb25maWdQYXJhbXMgJHt1W2ouREVCVUdfQ09OU09MRV19IGFwcCBzZXR0aW5nIGtleXMgJHtPYmplY3Qua2V5cyhlLnNldHRpbmdzKX0sICR7b3MoKS5wbHVnaW5VVUlEfSksIGluY2x1ZGluZyBpbiBsYXlvdXQgcG9wdXBgKTprKGBbZGFzaGJvYXJkXSBEZWJ1ZyBjb25zb2xlIGRpc2FibGVkICgke2ouREVCVUdfQ09OU09MRX0gaXMgJyR7dT8uW2ouREVCVUdfQ09OU09MRV19JywgcGx1Z2luVVVJRCAke29zKCkucGx1Z2luVVVJRH0sIGNvbnRleHQgJHtKU09OLnN0cmluZ2lmeShvcygpKX0pLCBleGNsdWRpbmcgZnJvbSBsYXlvdXQgcG9wdXBgKTtsZXQgTHI9UW4/W106WyJkZWJ1Zy1jb25zb2xlIl0sdXI9QXJyYXkuaXNBcnJheSh1Py5bai5EQVNIQk9BUkRfQ09NUE9ORU5UU10pP3Vbai5EQVNIQk9BUkRfQ09NUE9ORU5UU106YW87cmV0dXJuKDAsT2UuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLW91dGVyLWNvbnRhaW5lciIsc3R5bGU6UHIsY2hpbGRyZW46W2g9PT1GdC5MQVlPVVRfQ09ORklHPygwLE9lLmpzeCkoVGYse2N1cnJlbnRMYXlvdXQ6dXIsZXhjbHVkZVdpZGdldElkczpMcixvblNhdmU6cmUsb25DYW5jZWw6KCk9PngoRnQuREVGQVVMVCksc2VsZWN0ZWRMYXlvdXRQcm9maWxlOnU/LltqLlNFTEVDVEVEX0xBWU9VVF9QUk9GSUxFXXx8bnVsbH0pOm51bGwsaD09PUZ0LlNFVFRJTkdTX0NPTkZJRz8oaygiW2Rhc2hib2FyZF0gcmVuZGVyaW5nIERhc2hib2FyZFNldHRpbmdzUG9wdXAsIGJnVXJsOiIsdT8uW2ouQkFDS0dST1VORF9JTUFHRV9VUkxdKSwoMCxPZS5qc3gpKENmLHthcHA6ZSxjb25maWdQYXJhbXM6dSxvbkNhbmNlbDooKT0+eChGdC5ERUZBVUxUKSxvblNhdmU6cGUscGx1Z2luTm90ZVVVSUQ6RCx0aW1lRm9ybWF0Onosd2Vla0Zvcm1hdDpXfSkpOm51bGwsKDAsT2UuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbnRlbnQiLGNoaWxkcmVuOlsoMCxPZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtdG9vbGJhciIsY2hpbGRyZW46WygwLE9lLmpzeCkoRWgse2FjdGl2ZVRhc2tEb21haW46bixhcHA6ZSxkb21haW5zOnMsb25Eb21haW5DaGFuZ2U6UX0pLCgwLE9lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC10b29sYmFyLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxPZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1jb25maWd1cmUtYnV0dG9uIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PntrKCJbZGFzaGJvYXJkXSBvcGVuaW5nIFNldHRpbmdzIHBvcHVwIikseChGdC5TRVRUSU5HU19DT05GSUcpfSx0aXRsZToiQ29uZmlndXJlIExMTSBwcm92aWRlciBhbmQgQVBJIGtleSBmb3IgQUktcG93ZXJlZCBmZWF0dXJlcyIsY2hpbGRyZW46Ilx1MjY5OVx1RkUwRiBTZXR0aW5ncyJ9KSwoMCxPZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1jb25maWd1cmUtYnV0dG9uIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PngoRnQuTEFZT1VUX0NPTkZJRyksdGl0bGU6IkNvbmZpZ3VyZSB3aGljaCB3aWRnZXRzIGFyZSBzaG93biBhbmQgaW4gd2hhdCBvcmRlciIsY2hpbGRyZW46Ilx1MjYzMCBMYXlvdXQifSldfSldfSksKDAsT2UuanN4cykoImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLWdyaWQtc2hlbGwke2ZlPyIgZGFzaGJvYXJkLWdyaWQtc2hlbGwtLWZvY3VzZWQiOiIifWAsY2hpbGRyZW46W2ZlPygwLE9lLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWdyaWQtZm9jdXMtYmFja2Ryb3AiLHR5cGU6ImJ1dHRvbiIsdGl0bGU6IlJldHVybiBhbGwgd2lkZ2V0cyB0byB0aGUgZGFzaGJvYXJkIGdyaWQiLCJhcmlhLWxhYmVsIjoiUmV0dXJuIGFsbCB3aWRnZXRzIHRvIHRoZSBkYXNoYm9hcmQgZ3JpZCIsb25DbGljazpvZX0pOm51bGwsKDAsT2UuanN4KShSZC5Qcm92aWRlcix7dmFsdWU6anQsY2hpbGRyZW46KDAsT2UuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtZ3JpZCR7QWU/IiBkYXNoYm9hcmQtZ3JpZC0tZHJhZ2dpbmciOiIifSR7ZmU/IiBkYXNoYm9hcmQtZ3JpZC0tZm9jdXNlZCI6IiJ9YCxjaGlsZHJlbjpjZS5tYXAoKG1lLFdlKT0+e2xldCBidD1tZT8ud2lkZ2V0SWR8fGFvW1dlXT8ud2lkZ2V0SWQsTW49b3hbYnRdO2lmKCFNbilyZXR1cm4gbnVsbDtsZXQgcHI9dT8uW2ouTExNX1BST1ZJREVSX01PREVMXSxDPW9vKHByKSxZPUM/JHQoQyk6bnVsbCxhZT1ZJiZ1Py5bWV18fCIiO3JldHVybigwLE9lLmpzeCkoTW4se2FnZW5kYVRhc2tzOmhlLGFwcDplLGNhbGVuZGFyRXZlbnRzOmMsY2FsZW5kYXJFdmVudHNMb2FkZWQ6cCxjb21wbGV0ZWRUYXNrc0J5RGF0ZTpsLGNvbmZpZzptZSxjdXJyZW50RGF0ZTp2LGRhaWx5VmFsdWVzOmIsZHJhZ2dpbmdXaWRnZXRJZDpBZSxmb2N1c2VkV2lkZ2V0SWQ6Syxtb29kUmF0aW5nczpFLG9uRGF0ZVNlbGVjdDpQLGN1cnJlbnRMYXlvdXQ6dXIsb25MYXlvdXRBcHBseTpaLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOnEsb25Nb29kUmVjb3JkZWQ6Z2Usb25PcGVuU2V0dGluZ3M6bnQsb25SZWZlcmVuY2VEYXRlQ2hhbmdlOlAsb3BlblRhc2tzOmkscHJvdmlkZXJBcGlLZXk6YWUscHJvdmlkZXJFbTpDfHxwcnx8bnVsbCxxdWFydGVybHlQbGFuczpfLHJlZmVyZW5jZURhdGU6RixzZWxlY3RlZERhdGU6TSx0YXNrRG9tYWluVVVJRDpuLHRpbWVGb3JtYXQ6eix3ZWVrRm9ybWF0Olcsd2Vla2x5VG90YWw6Tyx3aWRnZXRGb2N1c1RyYW5zZm9ybTpWZVtidF18fG51bGx9LGJ0KX0pLmZpbHRlcihCb29sZWFuKX0pfSldfSldfSldfSl9dmFyIHN4PVUoZWUoKSwxKSxVST00MzAsekk9ImRhc2hib2FyZC1sYXJnZS1waG9uZS12aWV3cG9ydCI7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2xldCBuPU1hdGgubWluKHNjcmVlbi53aWR0aCxzY3JlZW4uaGVpZ2h0KSxyPXdpbmRvdy5tYXRjaE1lZGlhKCIob3JpZW50YXRpb246IGxhbmRzY2FwZSkiKS5tYXRjaGVzP01hdGgubWF4KHNjcmVlbi53aWR0aCxzY3JlZW4uaGVpZ2h0KTpuO2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKHpJLHI8PVVJKSxyPj13aW5kb3cuaW5uZXJXaWR0aCl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1heFdpZHRoPSIiLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1g9IiIsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWRhc2hib2FyZC12aWV3cG9ydC13aWR0aCIpLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1g9IiI7cmV0dXJufWxldCBvPXIrInB4Ijtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSJoaWRkZW4iLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1kYXNoYm9hcmQtdmlld3BvcnQtd2lkdGgiLG8pLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIn10KCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdCl9KSgpO3ZhciBYZCxBaDt4bj8oWGQ9X3AoKSxBaD1YZC5pbml0KCkpOihYZD1uZXcgUHJveHkoe30se2dldChlLHQpe2lmKHR5cGVvZiB0IT0ic3ltYm9sIilyZXR1cm4oLi4ubik9PndpbmRvdy5jYWxsQW1wbGVub3RlUGx1Z2luKHQsLi4ubil9fSksQWg9d2luZG93LmNhbGxBbXBsZW5vdGVQbHVnaW4oImluaXQiKSk7KDAsaXguY3JlYXRlUm9vdCkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhc2hib2FyZC1yb290IikpLnJlbmRlcigoMCxzeC5qc3gpKERoLHthcHA6WGQsaW5pdFByb21pc2U6QWh9KSk7fSkoKTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCnJlYWN0L2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnNjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnJlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnJlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKKi8K";
 
// css-content:css-content
var compiledCSS = `[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{border-radius:6px;font-size:.75rem;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-content{padding:8px 12px;position:relative;z-index:1}.tippy-arrow{color:var(--dashboard-color-tooltip-bg);height:16px;width:16px}.tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-theme~=dashboard]{background:var(--dashboard-color-tooltip-bg);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);max-width:260px;min-width:180px}.tippy-box[data-theme~=dashboard]>.tippy-arrow{color:var(--dashboard-color-tooltip-bg)}.tippy-box[data-theme~=dashboard].below-chart>.tippy-content{max-height:40vh;overflow-y:auto}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label p{display:inline;margin:0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-date{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-entry{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 6px;padding:2px 0}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-time{color:var(--dashboard-color-tooltip-text-muted);font-size:.7rem;min-width:52px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-mood .mood-viz-label{color:var(--dashboard-color-tooltip-text-muted)}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-note{color:var(--dashboard-color-tooltip-text);flex-basis:100%;font-size:.7rem;font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-word}.widget .widget-body{overflow-y:auto}.widget .widget-heading-bar,.widget .widget-title{align-items:center;display:flex}.widget .widget-title__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget .widget-header-action{text-decoration:none;white-space:nowrap}.widget .widget-header-action:hover{text-decoration:underline}.widget-planning .planning-quarters{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1 1 140px;flex-direction:column;gap:4px;min-width:0;padding:12px 16px;transition:background .15s,border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card--has-plan{background:var(--dashboard-color-plan-created-bg);border-color:var(--dashboard-color-plan-created-border);border-style:solid}.widget-planning .quarter-card--has-plan:hover{border-color:var(--dashboard-color-plan-created-border);filter:brightness(.97)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .quarter-card .quarter-plan-indicator{cursor:default;flex-shrink:0;font-size:.85rem;line-height:1}.widget-planning .month-tabs{display:flex;flex-wrap:wrap;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .month-content-area{border:1px solid var(--dashboard-color-border);border-radius:6px;margin-top:12px;overflow:hidden;padding:12px 16px}.widget-planning .month-content-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .month-content-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .month-content-text{color:var(--dashboard-color-text);font-size:.8rem;line-height:1.4}.widget-planning .month-content-text p{margin:0 0 4px}.widget-planning .month-content-text ol,.widget-planning .month-content-text ul{margin:0 0 4px;padding-left:16px}.widget-planning .month-content-text li{margin:0;padding:0}.widget-planning .month-content-text strong{color:var(--dashboard-color-navy)}.widget-planning .month-content-text>:last-child{margin-bottom:0}.widget-planning .month-content-empty{text-align:center}.widget-planning .create-month-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s}.widget-planning .create-month-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .planning-empty{color:var(--dashboard-color-text-muted);font-size:.85rem;font-style:italic;padding:16px 0;text-align:center}.widget-planning .weekly-plan-section{border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:12px}.widget-planning .weekly-plan-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .weekly-plan-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .create-week-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s;width:100%}.widget-planning .create-week-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .note-editor{display:flex;flex-direction:column;gap:8px;height:100%}.widget-planning .note-editor-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px}.widget-planning .note-editor-toolbar{display:flex;gap:8px}.widget-planning .note-editor-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;padding:4px 12px;transition:background .15s}.widget-planning .note-editor-btn:hover{background:var(--dashboard-color-blue-light)}.widget-planning .note-editor-btn--save{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .note-editor-btn--save:hover{filter:brightness(.92)}.widget-planning .note-editor-btn--save:disabled{cursor:default;opacity:.6}.widget-planning .note-editor-textarea{border:1px solid var(--dashboard-color-border);border-radius:6px;flex:1;font-family:monospace;font-size:.8rem;line-height:1.5;min-height:180px;padding:12px;resize:vertical}.rich-footnote-wrap{display:inline}.rich-footnote-indicator{cursor:default;display:inline-block;font-size:.65em;margin-left:2px;opacity:.65;vertical-align:super}.rich-footnote-indicator:hover{opacity:1}.tippy-box[data-theme~=rich-footnote]{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;box-shadow:0 4px 16px var(--dashboard-color-overlay-shadow);color:var(--dashboard-color-text);font-size:.85rem;line-height:1.5;max-width:420px;min-width:200px}.tippy-box[data-theme~=rich-footnote]>.tippy-arrow{color:var(--dashboard-color-bg-card)}.tippy-box[data-theme~=rich-footnote]>.tippy-content{padding:12px}.rich-footnote-popup{display:flex;flex-direction:column;gap:8px}.rich-footnote-popup-url{align-items:center;display:flex;gap:4px}.rich-footnote-popup-url svg{color:var(--dashboard-color-accent);flex-shrink:0}.rich-footnote-popup-url a{color:var(--dashboard-color-link);overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rich-footnote-popup-url a:hover{text-decoration:underline}.rich-footnote-popup-text{color:var(--dashboard-color-text)}.rich-footnote-popup-media{border-radius:6px;overflow:hidden}.rich-footnote-popup-media img,.rich-footnote-popup-media video,.rich-footnote-popup-media iframe{display:block;max-width:100%;width:100%}.rich-footnote-popup-media iframe{aspect-ratio:16/9;border:0}.rich-footnote-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;justify-content:flex-end;padding-top:8px}.rich-footnote-popup-close{background:none;border:none;color:var(--dashboard-color-accent);cursor:pointer;font-size:.8rem;font-weight:600;letter-spacing:.5px;padding:4px 8px}.rich-footnote-popup-close:hover{opacity:.8}.widget-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-agenda .agenda-list{display:flex;flex:1;flex-direction:column;gap:12px;min-height:0;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:.85rem;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:#0000;border:0;color:var(--dashboard-color-link);cursor:pointer;font-size:.72rem;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-calendar.vertical-2-cell .cal-arrow{font-size:.9rem}.widget-calendar.vertical-2-cell .cal-month{font-size:1.1rem}.widget-calendar.vertical-2-cell .cal-header{font-size:.85rem}.widget-calendar.vertical-2-cell .cal-cell{padding-top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-day{font-size:16px;top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-dot{bottom:18%;height:6px;width:6px}.widget-calendar.horizontal-2-cell.vertical-1-cell .widget-body{display:flex;flex-direction:column;padding:8px 16px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-nav{margin-bottom:8px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-grid{flex:1}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-header{padding:2px 0}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-cell{aspect-ratio:auto;border-radius:12px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}@media (max-width: 430px){.widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}}.dashboard-large-phone-viewport .widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.dashboard-large-phone-viewport .widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}.dashboard-layout-popup{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,var(--dashboard-viewport-width, 100vw) - 32px);min-width:0;width:100%}.dashboard-layout-popup .dashboard-layout-popup-tabs{display:flex;gap:4px;margin-top:12px}.dashboard-layout-popup .dashboard-layout-popup-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease}.dashboard-layout-popup .dashboard-layout-popup-tab:hover{background:var(--dashboard-color-blue-light)}.dashboard-layout-popup .dashboard-layout-popup-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.dashboard-layout-popup .dashboard-layout-popup-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-layout-popup .dashboard-layout-popup-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-layout-popup .dashboard-layout-popup-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-layout-popup .dashboard-layout-popup-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-layout-popup .dashboard-layout-popup-list{display:flex;flex-direction:column;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;-webkit-user-select:none;user-select:none}.dashboard-layout-popup .dashboard-layout-popup-item:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item--dragging{opacity:.35}.dashboard-layout-popup .dashboard-layout-popup-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-handle:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-layout-popup .dashboard-layout-popup-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-layout-popup .dashboard-layout-popup-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-layout-popup .dashboard-layout-popup-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-layout-popup .dashboard-layout-popup-sizing{display:flex;flex-direction:column;gap:8px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;align-items:center;gap:12px;padding:8px 12px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-header{align-items:center;display:flex;gap:8px;flex:1;min-width:0}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-controls{display:flex;flex-shrink:0;gap:16px}.dashboard-layout-popup .dashboard-layout-popup-profile-select{margin-left:8px;padding:3px 6px}.dashboard-layout-popup .dashboard-layout-popup-sizing-field{align-items:center;display:flex;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-sizing-label{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-sizing-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:4px 8px}.dashboard-layout-popup .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-layout-popup .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:stretch;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0;padding:5px 8px}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;font-weight:500;padding:4px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);bottom:0;display:flex;justify-content:center;left:0;position:fixed;top:0;width:var(--dashboard-viewport-width, 100vw);z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:90%;min-width:320px;width:650px}.config-popup-container .explanation-paragraph{font-size:14px;margin:12px 0 20px}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field .config-line{margin-bottom:10px;margin-top:10px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:#0000;color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column}.dashboard-settings-container .dashboard-settings-section.section:not(:first-child){border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:16px}.dashboard-settings-container .dashboard-settings-section-header{display:flex;flex-direction:column;gap:4px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{-webkit-appearance:none;appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:#00000008;border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-hint{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0 0 4px}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-link);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.config-popup-container .config-popup-body .llm-provider-options{display:flex;flex-direction:column;gap:4px}.config-popup-container .config-popup-body .llm-provider-option{align-items:flex-start;gap:8px;padding:8px 4px}.config-popup-container .config-popup-body .llm-provider-option input[type=radio]{margin-top:3px}.config-popup-container .config-popup-body .llm-provider-option-text{display:flex;flex-direction:column;gap:2px}.config-popup-container .config-popup-body .llm-provider-option-name{color:var(--dashboard-color-text);font-weight:700}.config-popup-container .config-popup-body .llm-provider-option-desc{color:var(--dashboard-color-text-secondary);font-size:.78rem;line-height:1.35}.dashboard-outer-container .no-config-upsell{align-items:center;display:flex;flex-direction:column;gap:8px;padding:4px 12px 12px;text-align:center}.dashboard-outer-container .no-config-upsell-badges{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.dashboard-outer-container .no-config-upsell-badge{border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.04em;padding:4px 12px;text-transform:uppercase;white-space:nowrap}.dashboard-outer-container .no-config-upsell-badge--brand{background:#4a9eff1f;color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-badge--price{border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);text-transform:none}.dashboard-outer-container .no-config-upsell-headline{color:var(--dashboard-color-navy);font-size:1.05rem;font-weight:700;line-height:1.25;margin:4px 0 0}.dashboard-outer-container .no-config-upsell-subhead{color:var(--dashboard-color-text-secondary);font-size:.85rem;line-height:1.45;margin:0;max-width:26rem}.dashboard-outer-container .no-config-upsell-features{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));justify-content:center;width:100%}@media (max-width: 430px){.dashboard-outer-container .no-config-upsell-features{grid-template-columns:minmax(0,1fr)}}.dashboard-large-phone-viewport .dashboard-outer-container .no-config-upsell-features{grid-template-columns:minmax(0,1fr)}.dashboard-outer-container .no-config-upsell-feature{align-items:center;border:1px solid var(--dashboard-color-border);border-radius:999px;color:var(--dashboard-color-navy);display:flex;font-size:.8rem;font-weight:600;gap:4px;justify-content:center;padding:4px 12px}.dashboard-outer-container .no-config-upsell-feature-icon{font-size:.85rem;line-height:1}.dashboard-outer-container .no-config-upsell-more{color:var(--dashboard-color-text-muted);font-size:.8rem;margin:0}.dashboard-outer-container .no-config-upsell-actions{align-items:stretch;border-top:1px solid var(--dashboard-color-border);display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:4px;padding-top:12px;width:100%}.dashboard-outer-container .no-config-upsell-button{align-items:center;border:1px solid var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-navy);display:inline-flex;font-size:.85rem;font-weight:600;gap:4px;justify-content:center;line-height:1.2;padding:8px 16px;text-decoration:none;transition:border-color .15s ease,background .15s ease,color .15s ease}.dashboard-outer-container .no-config-upsell-button--primary:hover{background:#4a9eff1f;border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-button--secondary:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-footnote{color:var(--dashboard-color-success);font-size:.78rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-header-actions{align-items:center;display:flex;gap:8px}.dashboard-outer-container .widget-dream-task .dream-task-list{display:flex;flex-direction:column;gap:12px}.dashboard-outer-container .widget-dream-task .dream-task-llm-attribution{color:var(--dashboard-color-text-secondary);font-size:.7rem;line-height:1.4;padding-top:8px}.dashboard-outer-container .widget-dream-task .widget-title{align-items:center;display:flex}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}.dashboard-outer-container .widget-dream-task .dream-task-goals-summary{border-bottom:1px solid var(--dashboard-color-border);margin-bottom:8px;padding-bottom:12px}.dashboard-outer-container .widget-dream-task .dream-task-goals-text{color:var(--dashboard-color-text-secondary);font-size:.8rem;font-style:italic;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-card{border:1px solid var(--dashboard-color-border);border-radius:10px;opacity:1;padding:12px 16px;transition:border-color .15s ease,opacity .28s ease,transform .28s ease}.dashboard-outer-container .widget-dream-task .dream-task-card:hover{border-color:var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-card--dismissing{opacity:0;pointer-events:none;transform:translateY(6px) scale(.98)}.dashboard-outer-container .widget-dream-task .dream-task-card-header{align-items:flex-start;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-title{color:var(--dashboard-color-navy);font-size:.9rem;font-weight:600;line-height:1.3}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable{cursor:pointer}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable:hover{color:var(--dashboard-color-blue);text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-rating{border-radius:6px;flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-rating--high{background:#22c55e1f;color:var(--dashboard-color-success)}.dashboard-outer-container .widget-dream-task .dream-task-rating--medium{background:#eab3081f;color:var(--dashboard-color-warning)}.dashboard-outer-container .widget-dream-task .dream-task-rating--low{background:#ef44441f;color:var(--dashboard-color-danger)}.dashboard-outer-container .widget-dream-task .dream-task-card--invented{border-left:2px solid var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-new-badge{background:#4a9eff1f;border-radius:6px;color:var(--dashboard-color-blue);flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge{background:#7c3aed1a;border-radius:6px;color:var(--dashboard-color-navy);flex-shrink:0;font-size:11px;font-weight:600;max-width:11rem;overflow:hidden;padding:2px 4px;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{font-size:11px;font-weight:700;padding:2px 4px;text-transform:uppercase;white-space:nowrap}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation{color:var(--dashboard-color-text-secondary);cursor:pointer;display:-webkit-box;font-size:.8rem;line-height:1.5;margin:0;overflow:hidden;text-overflow:ellipsis;line-clamp:3;-webkit-box-orient:vertical;-webkit-line-clamp:3}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation--expanded{display:block;overflow:visible;text-overflow:clip;line-clamp:initial;-webkit-box-orient:initial;-webkit-line-clamp:initial}.dashboard-outer-container .widget-dream-task .dream-task-card-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-action{color:var(--dashboard-color-link);cursor:pointer;font-size:.75rem;font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-card-action:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-settings-link{color:var(--dashboard-color-link);font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-settings-link:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-loading{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-loading p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:24px;width:24px}.dashboard-outer-container .widget-dream-task .dream-task-error{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-error p{color:var(--dashboard-color-danger);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-empty{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.widget-graveyard .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-graveyard.horizontal-1-cell .widget-title__subtitle{display:none}.widget-graveyard .graveyard-meadow-wrapper{flex:1;min-height:0;overflow:hidden;position:relative}.widget-graveyard .graveyard-meadow-bg{border-radius:6px;height:100%;inset:0;object-fit:cover;position:absolute;transition:opacity .6s ease;width:100%}.widget-graveyard .graveyard-task-list{display:flex;flex-direction:column;gap:4px;list-style:none;max-height:100%;overflow-y:auto;padding:0;position:relative;z-index:1}.widget-graveyard .graveyard-task-item{background:var(--dashboard-color-bg-card);border-bottom:1px solid var(--dashboard-color-border);display:flex;flex-direction:column;gap:4px;padding:8px 12px}.widget-graveyard .graveyard-task-item:last-child{border-bottom:none}.widget-graveyard .graveyard-task-item--dismissing{pointer-events:none;visibility:hidden}.widget-graveyard .graveyard-task-header{align-items:baseline;display:flex;gap:8px;justify-content:space-between}.widget-graveyard .graveyard-task-title-wrap{flex:1;min-width:0}.widget-graveyard .graveyard-task-title{color:var(--dashboard-color-text);display:block;font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-title:focus{outline:1px solid var(--dashboard-color-link);outline-offset:2px}.widget-graveyard .graveyard-task-title-wrap:hover .graveyard-task-title,.widget-graveyard .graveyard-task-title-wrap:focus-within .graveyard-task-title{text-decoration:underline dotted}.widget-graveyard .graveyard-task-tooltip{display:flex;flex-direction:column;gap:8px;max-height:280px;overflow-y:auto;padding:12px}.widget-graveyard .graveyard-task-tooltip-meta{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 12px;justify-content:space-between}.widget-graveyard .graveyard-task-tooltip-note{color:var(--dashboard-color-tooltip-accent);font-size:.76rem;font-weight:600}.widget-graveyard .graveyard-task-tooltip-created{color:var(--dashboard-color-tooltip-text-muted);font-size:.72rem}.widget-graveyard .graveyard-task-tooltip-content{color:var(--dashboard-color-tooltip-text);font-size:.78rem;line-height:1.4}.widget-graveyard .graveyard-task-tooltip-content code{background:#ffffff14;border-radius:4px;padding:1px 4px}.widget-graveyard .graveyard-task-tooltip-footer{border-top:1px solid var(--dashboard-color-tooltip-border);padding-top:8px}.widget-graveyard .graveyard-task-score--muted{color:var(--dashboard-color-tooltip-text-muted)}.widget-graveyard .graveyard-task-score--cool{color:var(--dashboard-color-blue-light)}.widget-graveyard .graveyard-task-score--warm{color:var(--dashboard-color-warning)}.widget-graveyard .graveyard-task-score--hot{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-score-dot{background:currentColor;border-radius:999px;display:inline-block;height:9px;width:9px}.widget-graveyard .graveyard-task-age{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-graveyard .graveyard-task-actions{display:flex;gap:12px}.widget-graveyard .graveyard-task-actions>a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-action{color:var(--dashboard-color-text-secondary);font-size:.75rem;text-decoration:none}.widget-graveyard .graveyard-task-action:hover{text-decoration:underline}.widget-graveyard .graveyard-task-action--send:hover{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-action--keep:hover{color:var(--dashboard-color-link)}.widget-graveyard .graveyard-task-action--note:hover{color:var(--dashboard-color-blue)}.widget-graveyard.vertical-1-cell .graveyard-task-tooltip{max-height:220px}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-header{align-items:flex-start}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-age{font-size:.7rem}.widget-graveyard .graveyard-loading,.widget-graveyard .graveyard-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-graveyard .graveyard-error{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 0}.widget-graveyard .graveyard-error p{color:var(--dashboard-color-danger);font-size:.85rem;text-align:center}.widget-graveyard .graveyard-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 8px}.widget-graveyard .graveyard-retry:hover{border-color:var(--dashboard-color-border);color:var(--dashboard-color-text)}.widget-layout-picker .layout-picker-warning{background:color-mix(in srgb,var(--dashboard-color-warning) 15%,transparent);border:1px solid color-mix(in srgb,var(--dashboard-color-warning) 40%,transparent);border-radius:6px;color:var(--dashboard-color-text);font-size:.8rem;font-weight:600;margin-bottom:12px;padding:8px 12px}.widget-layout-picker .layout-picker-profiles{display:flex;flex-direction:column;gap:8px}.widget-layout-picker .layout-picker-profile-button{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-text);cursor:pointer;padding:12px;text-align:left;transition:background .15s ease,border-color .15s ease;width:100%}.widget-layout-picker .layout-picker-profile-button:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button:disabled{cursor:not-allowed;opacity:.6}.widget-layout-picker .layout-picker-profile-button--applying{border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button--current{border-color:color-mix(in srgb,var(--dashboard-color-accent) 50%,transparent)}.widget-layout-picker .layout-picker-profile-header{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 8px;margin-bottom:8px}.widget-layout-picker .layout-picker-profile-icon{flex-shrink:0;font-size:1.1rem;line-height:1}.widget-layout-picker .layout-picker-profile-name{flex:1;font-size:.95rem;font-weight:700;min-width:0}.widget-layout-picker .layout-picker-profile-action{color:var(--dashboard-color-accent);font-size:.72rem;font-weight:600}.widget-layout-picker .layout-picker-profile-action--current{color:var(--dashboard-color-text-muted)}.widget-layout-picker .layout-picker-profile-description{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0}.widget-day-sketch .widget-body{display:flex;flex-direction:column;overflow:hidden;padding:0}.widget-day-sketch .day-sketch-notebook{background-color:#fffef5;background-image:repeating-linear-gradient(transparent,transparent 33px,#b8d4e8 33px,#b8d4e8 34px);background-attachment:local;background-position:0 0;background-size:100% 34px;border-left:3px solid #e88e8e;flex:1;margin-left:0;min-height:0;overflow-y:auto;padding:0 8px 0 0}.widget-day-sketch .day-sketch-line{align-items:center;display:flex;height:34px;padding-left:4px;position:relative}.widget-day-sketch .day-sketch-hour-label{color:#a0a0a0;flex-shrink:0;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.78rem;font-weight:700;letter-spacing:.02em;text-align:right;text-transform:lowercase;-webkit-user-select:none;user-select:none;width:64px;padding-right:8px}.widget-day-sketch .day-sketch-input{background:#0000;border:none;color:#333;flex:1;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.88rem;height:100%;line-height:34px;outline:none;padding:0 4px}.widget-day-sketch .day-sketch-input::placeholder{color:#0000}.widget-day-sketch .day-sketch-input:focus{background:#b8d4e81f}.widget-day-sketch .day-sketch-loading{align-items:center;color:var(--dashboard-color-text-muted);display:flex;font-size:.85rem;height:100%;justify-content:center;padding:24px}.widget-day-sketch .day-sketch-save-btn{background:none;border:1px solid var(--dashboard-color-blue);border-radius:6px;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;font-weight:600;padding:2px 8px;transition:background .15s ease,color .15s ease}.widget-day-sketch .day-sketch-save-btn:hover:not(:disabled){background:var(--dashboard-color-blue);color:var(--dashboard-color-text-on-accent)}.widget-day-sketch .day-sketch-save-btn--disabled{border-color:var(--dashboard-color-text-muted);color:var(--dashboard-color-text-muted);cursor:default;opacity:.5}@media (prefers-color-scheme: dark){.widget-day-sketch .day-sketch-notebook{background-color:#2a2923;background-image:repeating-linear-gradient(transparent,transparent 33px,#4a5568 33px,#4a5568 34px);border-left-color:#7c4444}.widget-day-sketch .day-sketch-hour-label{color:#6b7280}.widget-day-sketch .day-sketch-input{color:#e2e0d8}.widget-day-sketch .day-sketch-input:focus{background:#4a556826}}.widget-debug-console .widget-body{max-height:2000px;overflow-y:auto;padding:0}.widget-debug-console .debug-console{font-family:Courier New,Courier,monospace;font-size:11px;height:100%;max-height:100%;overflow-y:auto;padding:6px 8px}.widget-debug-console .debug-console__empty{color:var(--color-text-muted, #888);font-family:inherit;font-size:12px;padding:12px 4px}.widget-debug-console .debug-console__entry{align-items:baseline;border-bottom:1px solid var(--color-border, rgba(0, 0, 0, .06));display:flex;gap:8px;line-height:1.4;padding:2px 0}.widget-debug-console .debug-console__entry:last-child{border-bottom:none}.widget-debug-console .debug-console__timestamp{color:var(--color-text-secondary, #888);flex-shrink:0;font-size:10px;opacity:.75;-webkit-user-select:none;user-select:none}.widget-debug-console .debug-console__message{color:var(--color-text, #222);overflow-wrap:break-word;word-break:break-all}.widget-debug-console .debug-console__clear-button{background:none;border:1px solid var(--color-border, rgba(0, 0, 0, .2));border-radius:3px;color:var(--color-text-muted, #888);cursor:pointer;font-size:11px;line-height:1;padding:2px 6px}.widget-debug-console .debug-console__clear-button:hover{background:var(--color-hover, rgba(0, 0, 0, .06));color:var(--color-text, #222)}@keyframes mood-fadeout{0%{opacity:1}to{opacity:0}}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn--selected{border-color:var(--dashboard-color-blue);background:var(--dashboard-color-blue-light);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-details{margin-bottom:12px}.widget-mood .mood-details-label{color:var(--dashboard-color-text-secondary);display:block;font-size:.8rem;margin-bottom:4px}.widget-mood .mood-details-textarea{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.85rem;padding:8px;resize:vertical;width:100%}.widget-mood .mood-details-textarea:focus{border-color:var(--dashboard-color-blue);outline:none}.widget-mood .mood-details-textarea::placeholder{color:var(--dashboard-color-text-muted)}.widget-mood .mood-submit-row{display:flex;gap:8px;margin-bottom:16px}.widget-mood .mood-submit-btn{background:var(--dashboard-color-blue);border:none;border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;flex:1;font-size:.85rem;font-weight:600;padding:8px 16px;transition:opacity .15s}.widget-mood .mood-submit-btn:hover:not(:disabled){opacity:.9}.widget-mood .mood-submit-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-cancel-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.85rem;font-weight:600;padding:8px 16px;transition:border-color .15s,color .15s}.widget-mood .mood-cancel-btn:hover:not(:disabled){border-color:var(--dashboard-color-text-secondary);color:var(--dashboard-color-text)}.widget-mood .mood-cancel-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-confirmation{align-items:center;animation:mood-fadeout 1s ease-out 4s forwards;display:flex;flex-direction:column;gap:8px;margin-bottom:16px;padding:16px 0}.widget-mood .mood-confirmation-icon{font-size:2.5rem}.widget-mood .mood-confirmation-text{color:var(--dashboard-color-success);font-size:.9rem;font-weight:600}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-mood .mood-viz-section{align-items:center;display:flex;flex-direction:column;gap:4px;margin-top:8px}.widget-mood .mood-viz-canvas-wrap{border-radius:10px;line-height:0;overflow:visible;position:relative}.widget-mood .mood-viz-canvas{border-radius:10px;display:block;height:220px;width:220px}.widget-mood .mood-viz-configure-link{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:color .15s}.widget-mood .mood-viz-configure-link:hover{color:var(--dashboard-color-text-secondary)}.widget-mood .mood-viz-config-option{align-items:center;cursor:pointer;display:flex;font-size:.9rem;gap:8px;padding:4px 0}.widget-mood .mood-viz-config-option input[type=radio]{accent-color:var(--dashboard-color-blue);cursor:pointer}.widget-peak-hours .peak-hours-metrics-grid{display:grid;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:16px}.widget-peak-hours .peak-hours-metric-card{background:var(--dashboard-color-bg-page);border-radius:10px;padding:12px 16px}.widget-peak-hours .peak-hours-metric-label{color:var(--dashboard-color-text-secondary);font-size:.8rem;margin-bottom:4px}.widget-peak-hours .peak-hours-metric-value{color:var(--dashboard-color-navy);font-size:1.25rem;font-weight:600}.widget-peak-hours .peak-hours-legend{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.75rem;gap:16px;margin-bottom:8px}.widget-peak-hours .peak-hours-legend-item{align-items:center;display:flex;gap:4px}.widget-peak-hours .peak-hours-legend-swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.widget-peak-hours .peak-hours-legend-swatch--created{background:var(--dashboard-color-blue)}.widget-peak-hours .peak-hours-legend-swatch--completed{background:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-chart-container{height:220px;position:relative;width:100%}.widget-peak-hours .peak-hours-canvas{display:block;height:100%;width:100%}.widget-peak-hours .peak-hours-tooltip{background:var(--dashboard-color-tooltip-bg);border:1px solid var(--dashboard-color-tooltip-border);border-radius:6px;box-shadow:0 2px 8px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;padding:8px 12px;pointer-events:none;position:absolute;white-space:nowrap;z-index:10}.widget-peak-hours .peak-hours-tooltip-header{font-weight:600;margin-bottom:4px}.widget-peak-hours .peak-hours-tooltip-label--created{color:var(--dashboard-color-tooltip-accent)}.widget-peak-hours .peak-hours-tooltip-label--completed{color:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-footer{color:var(--dashboard-color-text-muted);font-size:.75rem;margin-top:12px;text-align:center}.widget-peak-hours .peak-hours-empty{padding:24px;text-align:center}.widget-peak-hours .peak-hours-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.vertical-1-cell .widget-peak-hours .peak-hours-metrics-grid{gap:8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-card{padding:4px 8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-label{font-size:.7rem;margin-bottom:0}.vertical-1-cell .widget-peak-hours .peak-hours-metric-value{font-size:1rem}.vertical-1-cell .widget-peak-hours .peak-hours-legend{margin-bottom:4px}.vertical-1-cell .widget-peak-hours .peak-hours-chart-container{height:160px}.vertical-1-cell .widget-peak-hours .peak-hours-footer{margin-top:8px}.horizontal-2-cell .widget-peak-hours .peak-hours-chart-container{height:220px}.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:380px}.horizontal-2-cell.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:440px}.widget-proposed-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-proposed-agenda a:hover{text-decoration:underline}.widget-proposed-agenda .proposed-agenda-controls{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding-bottom:10px}.widget-proposed-agenda .proposed-agenda-priority-label{color:var(--dashboard-color-text-muted);flex:0 0 auto;font-size:14px}.widget-proposed-agenda .proposed-agenda-priority-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1 1 auto;font-size:14px;font-weight:600;min-width:0;padding:7px 10px}.widget-proposed-agenda .proposed-agenda-model{border:1px solid var(--dashboard-color-border);border-radius:999px;color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.78em;padding:4px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-model-change{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:0 0 auto;font-size:.95em;padding:4px 8px}.widget-proposed-agenda .proposed-agenda-model-change:hover{color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-list{display:flex;flex-direction:column;font-size:14px;margin-top:4px}.widget-proposed-agenda .proposed-agenda-item{align-items:flex-start;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:10px;padding:10px 2px;transition:opacity .12s ease}.widget-proposed-agenda .proposed-agenda-item--scheduled{opacity:.6}.widget-proposed-agenda .proposed-agenda-time-col{display:flex;flex:0 0 auto;flex-direction:column;gap:2px;min-width:52px}.widget-proposed-agenda .proposed-agenda-time{color:var(--dashboard-color-link);font-variant-numeric:tabular-nums;font-weight:600}.widget-proposed-agenda .proposed-agenda-time--muted{color:var(--dashboard-color-text-secondary);font-weight:500}.widget-proposed-agenda .proposed-agenda-note-link{color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75em;text-decoration:none}.widget-proposed-agenda .proposed-agenda-note-link:hover{color:var(--dashboard-color-link);text-decoration:underline}.widget-proposed-agenda .proposed-agenda-content{display:flex;flex:1 1 auto;flex-direction:column;gap:3px;min-width:0}.widget-proposed-agenda .proposed-agenda-text{color:var(--dashboard-color-text);font-weight:600;overflow:hidden;text-overflow:ellipsis}.widget-proposed-agenda .proposed-agenda-reason{color:var(--dashboard-color-text-muted);font-size:12px;line-height:1.35}.widget-proposed-agenda .proposed-agenda-duration{color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.8em;padding-top:8px}.widget-proposed-agenda .proposed-agenda-actions{align-items:center;display:flex;flex:0 0 auto;gap:6px}.widget-proposed-agenda .proposed-agenda-add{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8em;padding:5px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-add:hover{border-color:var(--dashboard-color-link);color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-dismiss{background:#0000;border:2px rgba(0,0,0,0) solid;border-radius:50%;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:1em;line-height:1;padding:4px 6px}.widget-proposed-agenda .proposed-agenda-dismiss:hover{background-color:var(--dashboard-color-bg-warning);border-color:var(--dashboard-color-danger);color:var(--dashboard-color-danger)}.widget-proposed-agenda .proposed-agenda-scheduled-badge{color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.76em;padding:5px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-footer{display:flex;gap:10px;margin-top:12px}.widget-proposed-agenda .proposed-agenda-approve{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;flex:1 1 auto;font-weight:600;padding:10px 18px;transition:opacity .12s ease}.widget-proposed-agenda .proposed-agenda-approve:hover:not(:disabled){border-color:var(--dashboard-color-link);color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-approve:disabled{cursor:default;opacity:.5}.widget-proposed-agenda .proposed-agenda-dismiss-all{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:0 0 auto;padding:10px 16px}.widget-proposed-agenda .proposed-agenda-dismiss-all:hover:not(:disabled){border-color:var(--dashboard-color-danger);color:var(--dashboard-color-danger)}.widget-proposed-agenda .proposed-agenda-dismiss-all:disabled{cursor:default;opacity:.5}.widget-proposed-agenda .proposed-agenda-pending{color:var(--dashboard-color-text-muted);font-size:.78em;margin:8px 0 0;text-align:center}.widget-proposed-agenda .proposed-agenda-attribution{color:var(--dashboard-color-text-muted);font-size:.75em;margin:4px 0 0;text-align:center}.widget-proposed-agenda .proposed-agenda-message,.widget-proposed-agenda .proposed-agenda-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:10px;padding:18px 12px;text-align:center}.widget-proposed-agenda .proposed-agenda-retry{background:#0000;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;padding:5px 14px}.widget-proposed-agenda .proposed-agenda-spinner{animation:proposed-agenda-spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-link);height:28px;width:28px}@keyframes proposed-agenda-spin{to{transform:rotate(360deg)}}.widget-quotes .widget-body{display:flex;flex-direction:column}.widget-quotes .quotes-grid{display:grid;flex:1;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-family:Georgia,Times New Roman,serif;font-size:.95rem;font-style:italic;line-height:1.5;margin:0 0 8px}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-recent-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-recent-notes .note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-recent-notes .note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-recent-notes .note-link{align-items:center;background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:space-between;padding:8px 12px;text-align:left;width:100%}.widget-recent-notes .note-name{color:var(--dashboard-color-text);flex:1;font-size:.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-recent-notes .note-count,.widget-recent-notes .note-metadata{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-recent-notes .note-loading,.widget-recent-notes .note-empty,.widget-recent-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-recent-notes .note-error{color:var(--dashboard-color-danger)}.widget-shared-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-shared-notes .shared-notes-toggle{align-items:center;cursor:pointer;display:inline-flex;font-size:13px;gap:4px}.widget-shared-notes .shared-notes-filter{align-items:center;display:flex;flex-shrink:0;gap:8px;margin-bottom:10px;padding:0 12px 4px}.widget-shared-notes .shared-notes-filter .shared-notes-toggle{margin-left:auto}.widget-shared-notes .shared-notes-sharer-select{background-color:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-family:inherit;font-size:.8rem;min-width:0;padding:2px 4px}.widget-shared-notes .shared-note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-shared-notes .shared-notes-pagination{align-items:center;display:flex;flex-shrink:0;gap:8px;justify-content:center;padding:4px 0 0}.widget-shared-notes .shared-notes-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:0 4px}.widget-shared-notes .shared-notes-page-arrow:disabled{cursor:default;opacity:.35}.widget-shared-notes .shared-notes-page-indicator{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-shared-notes .shared-note-item{align-items:stretch;display:flex}.widget-shared-notes .shared-note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-shared-notes .shared-note-pin{background:none;border:none;cursor:pointer;filter:grayscale(1);flex-shrink:0;font-size:.85rem;line-height:1;opacity:.4;padding:8px 0 8px 12px}.widget-shared-notes .shared-note-pin:hover{opacity:.75}.widget-shared-notes .shared-note-pin.shared-note-pin-active{filter:none;opacity:1}.widget-shared-notes .shared-note-link{background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;flex:1;flex-direction:column;font-family:inherit;gap:2px;min-width:0;padding:8px 12px 8px 8px;text-align:left}.widget-shared-notes .shared-note-title{color:var(--dashboard-color-text);font-size:.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-shared-notes .shared-note-meta{align-items:center;color:var(--dashboard-color-text);display:flex;font-size:12px;gap:8px}.widget-shared-notes .shared-note-avatars{align-items:center;display:inline-flex;flex-shrink:0}.widget-shared-notes .shared-note-avatars .collaborator-avatar{align-items:center;background-color:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-bg-card);border-radius:50%;box-sizing:border-box;display:inline-flex;font-size:.6rem;font-weight:600;height:1.25rem;justify-content:center;line-height:1;object-fit:cover;overflow:hidden;text-transform:uppercase;width:1.25rem}.widget-shared-notes .shared-note-avatars .collaborator-avatar:not(:first-child){margin-left:-.4rem}.widget-shared-notes .shared-note-avatars .collaborator-avatar-text{color:var(--dashboard-color-text-secondary)}.widget-shared-notes .shared-note-collaborators{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-shared-notes .shared-note-dates{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.7rem;gap:4px 8px;white-space:nowrap}.widget-shared-notes .shared-note-updated:before{color:var(--dashboard-color-text-muted);content:"\\b7"}.widget-shared-notes .note-loading,.widget-shared-notes .note-empty,.widget-shared-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-shared-notes .note-error{color:var(--dashboard-color-danger)}.dashboard-toolbar .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;gap:12px;padding:8px 12px}.dashboard-toolbar .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard-toolbar .task-domain-entry{white-space:nowrap}.dashboard-toolbar .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard-toolbar .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard-toolbar .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard-toolbar .task-domain-name{-webkit-user-select:none;user-select:none}.dashboard-toolbar .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.85rem;line-height:1;padding:0}.dashboard-toolbar .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}@media (max-width: 800px){.dashboard-toolbar .task-domains-refresh{display:none}}.dashboard-toolbar .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard-toolbar .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-toolbar .task-domains--empty .task-domains-empty{flex:1 1 100%;font-weight:500}.widget-victory-value .widget-body{display:flex;flex-direction:column;justify-content:space-between}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:.8rem}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:400}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.vertical-1-cell .widget-victory-value .vv-chart{height:180px}.horizontal-2-cell .widget-victory-value .vv-chart{height:260px}.vertical-2-cell .widget-victory-value .vv-chart{height:380px}.horizontal-2-cell.vertical-2-cell .widget-victory-value .vv-chart{height:460px}:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-bg-warning: #ffd7d7;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-link: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #a3aebb;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #e8853d;--dashboard-color-plan-created-bg: rgba(76, 175, 128, .08);--dashboard-color-plan-created-border: #4caf80}@media (prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-bg-warning: #6c3333;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-link: #60a5fa;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #ffb36b;--dashboard-color-plan-created-bg: rgba(115, 212, 163, .1);--dashboard-color-plan-created-border: #73d4a3}}html{overflow-y:scroll}html *,html *:before,html *:after{box-sizing:border-box;margin:0;padding:0}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.dashboard-outer-container{min-height:100vh;overflow-x:hidden;position:relative;width:100%}.dashboard-outer-container .dashboard-content{margin:0 auto;max-width:1200px;padding:24px;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell{isolation:isolate;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell--focused{z-index:2}.dashboard-outer-container .dashboard-content .dashboard-grid-focus-backdrop{background:rgba(var(--dashboard-color-bg-page),.18);border:none;cursor:zoom-out;inset:-12px;position:absolute;z-index:2}.dashboard-outer-container .dashboard-content .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4,1fr);position:relative}.dashboard-outer-container .dashboard-content .grid-cell{--drag-scale: 1;--flip-x: 0px;--flip-y: 0px;--focus-blur: 0px;--focus-opacity: 1;--focus-scale: 1;--focus-x: 0px;--focus-y: 0px;--grid-cell-base-opacity: .95;filter:blur(var(--focus-blur));min-width:0;opacity:calc(var(--grid-cell-base-opacity)*var(--focus-opacity));position:relative;transform:translate(var(--flip-x),var(--flip-y)) translate(var(--focus-x),var(--focus-y)) scale(var(--drag-scale)) scale(var(--focus-scale));transition:filter .32s ease,opacity .32s ease,transform .32s ease;will-change:transform}.dashboard-outer-container .dashboard-content .grid-cell:hover{--grid-cell-base-opacity: 1}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell{grid-column:span 2}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell{grid-column:span 3}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 4}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell{max-height:420px;min-height:320px}.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 2;max-height:800px;min-height:600px}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-active{cursor:grabbing}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--dragging-ready{animation:widget-wobble .35s ease-in-out infinite alternate;opacity:1;z-index:3}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-shift{--drag-scale: .985}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-mode{pointer-events:none}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focused{--grid-cell-base-opacity: 1;pointer-events:auto;z-index:4}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-hidden{z-index:1}@media (max-width: 800px){.dashboard-outer-container .dashboard-content{padding:12px}.dashboard-outer-container .dashboard-content .dashboard-grid{grid-template-columns:1fr}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 1}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell,.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 1;max-height:none;min-height:auto}}.dashboard-outer-container .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%;max-width:100%;overflow:hidden}.dashboard-outer-container .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard-outer-container .widget-heading-bar{-webkit-user-select:none;user-select:none}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--drag-ready{cursor:grabbing}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--focusable .widget-icon-button:hover{transform:scale(1.06)}.dashboard-outer-container .widget-icon{font-size:1rem}.dashboard-outer-container .widget-icon-button{background:rgba(var(--dashboard-color-bg-page),.6);border:1px solid rgba(0,0,0,0);border-radius:999px;cursor:pointer;line-height:1;padding:4px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.dashboard-outer-container .widget-icon-button:hover{background:rgba(var(--dashboard-color-blue),.12);border-color:rgba(var(--dashboard-color-blue),.28)}.dashboard-outer-container .widget-title{color:var(--dashboard-color-navy);display:flex;flex:1;font-size:.85rem;font-weight:700;gap:8px;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard-outer-container .widget-title__subtitle{color:var(--dashboard-color-text-muted);font-size:.75rem;font-weight:400;letter-spacing:.01em;text-transform:none}.dashboard-outer-container .widget-configure,.dashboard-outer-container .widget-header-action{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard-outer-container .widget-configure:hover,.dashboard-outer-container .widget-header-action:hover{color:var(--dashboard-color-navy)}.dashboard-outer-container .widget-body{flex:1;padding:16px}.dashboard-outer-container .dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center;width:100%}.dashboard-outer-container .dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}.dashboard-outer-container .dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-outer-container .dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}.dashboard-outer-container .widget-error-fallback{align-items:center;background:var(--dashboard-color-bg-card);border:1px dashed var(--dashboard-color-danger);border-radius:10px;display:flex;flex-direction:column;gap:8px;height:100%;justify-content:center;padding:24px;text-align:center}.dashboard-outer-container .widget-error-fallback-title{color:var(--dashboard-color-danger);font-size:.9rem;font-weight:700}.dashboard-outer-container .widget-error-fallback-message{color:var(--dashboard-color-text-muted);font-size:.8rem;max-width:280px;word-break:break-word}.dashboard-outer-container .widget-error-fallback-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;margin-top:4px;padding:4px 12px;transition:color .15s ease,border-color .15s ease}.dashboard-outer-container .widget-error-fallback-retry:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes widget-wobble{0%{transform:rotate(-1.5deg)}to{transform:rotate(1.5deg)}}
`;
 
// lib/embed-html.js
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
<!-- autoCapturePageviews is disabled because location.href inside the embed is a junk data: URL. -->
<!-- data-api / endpoint must be pinned to the proxy path: the script otherwise auto-derives the event -->
<!-- endpoint as origin + /api/event, hitting amplenote.com's 404 page (no CORS headers) instead of the proxy. -->
<script defer data-domain="amplenote.com" data-api="https://www.amplenote.com/plausible-proxy/api/event" src="https://www.amplenote.com/plausible-proxy/js/script.js"><\/script>
<script>
window.plausible = window.plausible || function () { (window.plausible.q = window.plausible.q || []).push(arguments); };
window.plausible.init = window.plausible.init || function (options) { window.plausible.o = options || {}; };
window.plausible.init({ autoCapturePageviews: false, endpoint: "https://www.amplenote.com/plausible-proxy/api/event" });
<\/script>
<!-- [Claude claude-opus-4-8] Task: surface Plausible tracker load failures (otherwise events queue silently forever) -->
<script>
(function () {
var scriptEl = document.querySelector('script[src="https://www.amplenote.com/plausible-proxy/js/script.js"]');
if (!scriptEl) return;
scriptEl.addEventListener("error", function (event) {
console.error("[plausible] failed to load (404/CSP/network); Dashboard Action events will not be delivered", event);
});
})();
<\/script>
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"><\/script>
</body>
</html>`;
}
 
// lib/plugin.js
var plugin = {
// --------------------------------------------------------------------------------------
// Constants
// --------------------------------------------------------------------------------------
constants: {},
// --------------------------------------------------------------------------------------
// App Options — Quick Open menu entries
// --------------------------------------------------------------------------------------
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
// --------------------------------------------------------------------------------------
// Embed Rendering
// --------------------------------------------------------------------------------------
async renderEmbed(app) {
console.debug("Rendering Dashboard plugin embed");
try {
return buildEmbedHTML();
} catch (error) {
console.error("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
// --------------------------------------------------------------------------------------
// Embed Communication Bridge
// --------------------------------------------------------------------------------------
// [Claude] Task: generic onEmbedCall — forwards all Amplenote API calls directly to app
// Prompt: "simplify onEmbedCall to generic pass-through, remove manual argument mapping"
// Date: 2026-03-16 | Model: claude-4.6-opus-high-thinking
/**
* Central message-passing bridge between the dashboard React embed and the
* Amplenote host app. Every method call on the `app` Proxy in the embed
* resolves here via `window.callAmplenotePlugin(method, ...args)`.
*
* Custom actions (configure, init) run plugin-specific logic. All other
* calls are forwarded directly to the Amplenote app interface — callers
* must pass arguments matching the real Amplenote API signatures.
*
* @param {object} app - Amplenote app interface
* @param {string} actionType - Method name or custom action identifier
* @param {...*} args - Positional arguments from the embed call
* @returns {Promise<*>} Resolves to the action result, or `{ error }` on failure.
*/
async onEmbedCall(app, actionType, ...args) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
try {
switch (actionType) {
case "attachNoteMedia":
const noteHandle = { uuid: app.context.noteUUID };
logIfEnabled(`[plugin] attachNoteMedia called \u2014 uploading to plugin note ${noteHandle.uuid}`);
const result = await app.attachNoteMedia(noteHandle, args[1]);
logIfEnabled(`[plugin] attachNoteMedia result:`, result ? "(URL received)" : "(no URL)");
return result;
case "configure":
return await this._handleConfigure(app, args[0]);
case "init":
return await fetchDashboardData(app);
default:
if (typeof app[actionType] === "function") {
return await app[actionType](...args);
}
logIfEnabled(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
logIfEnabled(`onEmbedCall error (${actionType}):`, error);
return { error: error.message };
}
},
// --------------------------------------------------------------------------------------
// Private Methods
// --------------------------------------------------------------------------------------
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(widgetConfigKey(widgetId), JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
return plugin;
})()