@curless/sinocare-demo 0.64.0 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../../packages/internal/sinocare-storefront/src/catalog.ts","../../../packages/internal/sinocare-storefront/src/card.ts","../../../packages/internal/sinocare-storefront/src/checkout.ts","../../../packages/internal/sinocare-storefront/src/instructions.ts","../../../packages/internal/sinocare-storefront/src/tools.ts","../../../packages/internal/sinocare-storefront/src/views.ts","../src/checkout-card.generated.ts"],"sourcesContent":["#!/usr/bin/env node\n// Buyer-side AP2: sign the PaymentMandate as a real ES256 JWS bound to the cart.\nimport { createHash } from 'node:crypto';\nimport { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n// What this storefront and the wallet connector say and show in common — the\n// aisles, the card metadata, the model instructions, the twelve shared tools,\n// and the catalogue/order views. Private to this repo, so it is bundled into\n// dist rather than resolved by name (see tsup.config.ts).\nimport {\n CARD_MIME,\n type CheckoutGroup,\n type Product,\n type ToolDef,\n buildInstructions,\n categoryQuery,\n checkoutView,\n ordersView,\n priceDisplayOf,\n productsView,\n resolveProduct,\n servesCardUri,\n storefrontTools,\n uiMeta,\n widgetMeta,\n} from '@agentbank/sinocare-storefront';\n// Buyer-side MPP · Tempo — parse the 402 challenge, pay the on-chain TIP-20\n// transfer, build the Payment credential. Same SDK, different subpath.\nimport {\n type AcpClientOptions,\n completeCheckout,\n purchaseOf,\n readCheckoutSession,\n totalOf,\n} from '@curless/agentbank-protocols/acp';\nimport {\n type Ap2IntentMandate,\n signIntentMandate,\n signPaymentMandate,\n} from '@curless/agentbank-protocols/ap2';\n// Buyer-side USDC-over-Solana x402 — build + partially sign an SPL transfer, the\n// facilitator co-signs feePayer + submits. Same SDK, different subpath.\nimport {\n type SolanaX402Requirements,\n addressFromSecretKey,\n secretKeyFromString,\n signSolanaX402Payment,\n} from '@curless/agentbank-protocols/solana';\nimport { payMppTempoChallenge } from '@curless/agentbank-protocols/tempo';\nimport {\n type UaagError,\n checkout as uaagCheckout,\n checkoutState as uaagCheckoutState,\n createIntent as uaagCreateIntent,\n} from '@curless/agentbank-protocols/uaag';\n// Buyer-side x402 lives in the SDK — sign EIP-3009, encode X-PAYMENT, read USDC\n// balance. The demo never hand-rolls the signing.\nimport {\n type Eip712Signer,\n type X402PaymentRequirements,\n cdpAccountSigner,\n encodeXPaymentHeader,\n signX402Payment,\n signerFromPrivateKey,\n usdcBalance,\n} from '@curless/agentbank-protocols/x402';\n// Buyer-side RLUSD/XRPL x402 — sign an Ed25519 Payment, encode X-PAYMENT. Same\n// SDK, different subpath. encodeXPaymentHeader collides with /x402's, so alias it.\nimport {\n type XrplPaymentRequirements,\n encodeXPaymentHeader as encodeXrplXPaymentHeader,\n signXrplPayment,\n} from '@curless/agentbank-protocols/xrpl';\nimport { type PaymentCredential, createBuyerSession } from '@curless/agentbank-sdk';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Hex } from 'viem';\nimport { generatePrivateKey } from 'viem/accounts';\nimport { Client as XrplClient, Wallet as XrplWallet } from 'xrpl';\n// The checkout MCP App card (a single self-contained HTML), built from\n// examples/sinocare-demo/widget and served as a ui:// resource.\nimport { CHECKOUT_CARD_HTML } from './checkout-card.generated.js';\n\n// @curless/sinocare-demo — a SIMULATED \"Sinocare\" storefront MCP for the BUYER.\n// Ordering is end-to-end agentic:\n// 1. browse + place an order via Sinocare's merchant backend\n// (mcp.curless.ai/sinocare) — the merchant prices it and opens a\n// merchant-quoted ACP checkout session with its own key;\n// 2. THIS buyer agent completes the charge over ACP with its own payment\n// credential (test card) — the merchant set the price, the agent pays.\n// The storefront never sees the merchant's key; it holds only its OWN buyer\n// token, exactly like a real agent buyer.\n//\n// Run (Claude Desktop / any MCP client):\n// npx -y @curless/sinocare-demo\n// with env:\n// AGENTBANK_AGENT_TOKEN the buyer's agentbank agent key (agb_…, agent:execute).\n// SINOCARE_BUYER_NAME / SINOCARE_BUYER_EMAIL who this agent buys for (optional;\n// unset = anonymous orders, as before)\n// Use a TEST, no-org key (the demo org is shared).\n// AGENTBANK_API_URL base URL (default https://mcp.curless.ai; set\n// http://localhost:3000 for local dev).\n// AGENTBANK_PAYMENT_TOKEN delegated card token (default pm_card_visa).\n// Real ACP credential (optional) — mint a Shared Payment Token per order\n// instead of reusing a plain card token. This is what a buyer's WALLET does\n// when an agent asks to spend: the token is scoped to one seller, one amount,\n// one currency and a short expiry, so it can buy nothing else.\n// STRIPE_AGENT_SECRET_KEY the BUYER side's Stripe key (the wallet's PSP).\n// Must be a DIFFERENT Stripe account from the\n// seller's — an SPT cannot be granted to yourself.\n// AGENTBANK_SELLER_PROFILE the seller's Stripe profile id (profile_…) that\n// the gateway redeems with.\n// STRIPE_AGENT_PAYMENT_METHOD optional pm_… to mint from; in test mode a\n// throwaway one is created from tok_visa.\n// Set all of these and buy_sinocare_product_acp pays with a real spt_; leave\n// them unset and it falls back to AGENTBANK_PAYMENT_TOKEN.\n// Two guards, both OFF by default — an order here is one click in the card,\n// and a Sinocare room is €1,280–2,900:\n// SINOCARE_ALLOW_LIVE_WALLET=1 allow minting with a LIVE key (REAL money).\n// SINOCARE_WALLET_FALLBACK=1 if minting fails, pay with the plain card\n// token instead of failing the order.\n// Without them a live key refuses to mint, and a mint failure fails the\n// order rather than silently paying with an unscoped credential.\n// x402 USDC (EVM) — pick ONE signer:\n// X402_SIGNER=cdp a CDP Server Wallet, zero raw key (for MAINNET);\n// needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET.\n// X402_PAYER_PRIVATE_KEY a local funded wallet key (testnet or mainnet).\n// The gateway's mode (test/live key) decides the network it quotes; fund the\n// buyer wallet with USDC on that network.\n// x402 RLUSD (XRP Ledger) — for buy_sinocare_product_rlusd / xrpl_buyer_wallet:\n// XRPL_BUYER_SEED an `sEd…` testnet seed (Ed25519) holding RLUSD + a\n// little test XRP for the fee/reserve.\n// XRPL_TESTNET_WSS RPC (default wss://s.altnet.rippletest.net:51233).\n// XRPL_RLUSD_ISSUER RLUSD issuer r-address (default = testnet issuer).\n//\n// IMPORTANT: only JSON-RPC may be written to stdout (the MCP stdio transport).\n// Never console.log here — diagnostics go to stderr.\n\nconst API_BASE = (process.env.AGENTBANK_API_URL ?? 'https://mcp.curless.ai').replace(/\\/$/, '');\n// Where the buyer's hosted pages live. Separate from the API base because the\n// buyer wallet became its own service on 2026-08-27 and took those pages with\n// it — the side that SERVES a page owns its address, and a link built from the\n// API's base was a link to a page that had moved.\n//\n// Falls back to the API base, so an unconfigured deployment keeps working: the\n// gateway still answers /buyer/* today, and will until it is retired.\nconst WALLET_BASE = (process.env.BUYER_WALLET_PUBLIC_URL ?? API_BASE).replace(/\\/$/, '');\nconst SINOCARE = `${API_BASE}/sinocare`;\n\n// The buyer's ACP client. Every order below reads the session's real total\n// and completes through this rather than hand-writing /acp/... — the two calls\n// were written out twice already, and both copies re-derived that the\n// authoritative amount is on the session, not in the backend's display string.\nconst acp = (merchantId: string): AcpClientOptions => {\n // Throw rather than send an empty bearer. Every caller below already refuses\n // to open a checkout without a token, so reaching here without one is a bug\n // in this file — and an empty Authorization header would surface as a 401\n // from the gateway, which reads like a credential problem on the buyer's end.\n if (!TOKEN) throw new Error('AGENTBANK_AGENT_TOKEN is not set');\n return { baseUrl: API_BASE, merchantId, token: TOKEN };\n};\nconst TOKEN = process.env.AGENTBANK_AGENT_TOKEN;\n\n// WHO this agent is buying for. A buyer agent is the only party that knows its\n// user's identity — the merchant never meets them — so it is the only place this\n// can enter the system. Sent on every checkout, and from there it reaches the\n// order, the card provider's customer record, the Curless mirror and the Shopify\n// order.\n//\n// Unset → nothing is sent, and every order stays anonymous exactly as before.\n// Deliberately NOT defaulted to a placeholder: a fabricated buyer would travel\n// into a merchant's financial records and Shopify would email the address.\nconst BUYER = (() => {\n const name = process.env.SINOCARE_BUYER_NAME?.trim();\n const email = process.env.SINOCARE_BUYER_EMAIL?.trim();\n if (!name && !email) return undefined;\n return { ...(name ? { name } : {}), ...(email ? { email } : {}) };\n})();\nconst PAYMENT_TOKEN = process.env.AGENTBANK_PAYMENT_TOKEN ?? 'pm_card_visa';\nconst STRIPE_AGENT_KEY = process.env.STRIPE_AGENT_SECRET_KEY;\nconst SELLER_PROFILE = process.env.AGENTBANK_SELLER_PROFILE;\n\n// The BUYER's Curless wallet, signed into at runtime by the person buying —\n// not configuration. Two ways to pay by card now sit side by side: the agent's\n// own Stripe key (STRIPE_AGENT_SECRET_KEY above, the demo's original path), and\n// this, where the credential is minted from the card the buyer bound and capped\n// by the limits the buyer set. Both stay: the wallet is the one being built,\n// and the agent-key path is what still works when nobody has signed in.\nconst wallet = createBuyerSession({ baseUrl: API_BASE });\n\n// One browser sign-in at a time, shared by whoever asks. Two cards (or a card\n// and the model) each starting their own would show the person two different\n// codes for the same wallet, and only one of them would ever complete.\nlet pending: Awaited<ReturnType<typeof wallet.startDeviceLogin>> | null = null;\n\n/**\n * The signed-in wallet owner, as a buyer block — or undefined when nobody is\n * signed in (the agent-key ACP path, which keeps SINOCARE_BUYER_EMAIL).\n */\nconst walletBuyer = (): { buyer: { email: string; name?: string } } | undefined => {\n const who = wallet.current();\n if (!who) return undefined;\n return { buyer: { email: who.email, ...(who.name ? { name: who.name } : {}) } };\n};\n\n// Whether a sign-in was ever STARTED here. `pending` alone cannot say: it is\n// null both before anyone begins and after one times out, and reporting those\n// two as the same thing is how \"nobody has signed in yet\" got told to someone\n// as \"your code expired\".\nlet loginEverStarted = false;\n\nconst pendingLogin = async (): Promise<NonNullable<typeof pending>> => {\n if (pending) return pending;\n const started = await wallet.startDeviceLogin();\n pending = started;\n loginEverStarted = true;\n // The session adopts itself when the person finishes; this just clears the\n // slot so a later sign-in starts fresh. Errors are the poller's to report —\n // swallowing them here would leave a dead login pinned forever.\n started\n .wait()\n .catch(() => undefined)\n .finally(() => {\n pending = null;\n });\n return started;\n};\n\n// The gateway's spend-policy reasons, said to the PERSON. Mirrors the codes\n// `evaluatePolicy` emits; anything unmapped falls through to the gateway's own\n// wording rather than being swallowed, so a new code shows up as English text\n// instead of disappearing.\n// The gateway's refusals, said to the PERSON — each with its OWN next step.\n// One shared \"想付的话可以先调高限额\" tail was wrong for every reason that is\n// not a limit: it told someone whose wallet has no card at all to go raise a\n// cap, which sends them to the wrong screen and leaves the actual problem\n// unmentioned.\nconst REFUSALS: Array<[RegExp, string, string]> = [\n [/per_transaction_limit/, '超过了你设的单笔上限', '可以在钱包里调高单笔上限。'],\n [/daily_limit/, '超过了你设的当日上限', '可以调高当日上限,或者明天再来。'],\n [/monthly_limit/, '超过了你设的当月上限', '可以调高当月上限,或者下个月再来。'],\n [/merchant_not_allowed/, '这个商家不在你的白名单里', '把它加进白名单就能付。'],\n [/mcc_not_allowed/, '这个商家类别不在你的白名单里', '把这个类别加进白名单就能付。'],\n [\n /no approval step yet/,\n '金额超过了你设的\"需要我批准\"的门槛,而现在还没有审批环节',\n '把这个门槛调高或清掉就能付。',\n ],\n [/no card is bound/, '这个钱包还没绑卡', '去钱包页面绑一张卡再回来付。'],\n];\n\n// A wallet refusal is not a payment failure, and the difference matters to the\n// person: nothing was charged. Rendered through the card's `message`, so it has\n// to be JSON and it has to be readable.\nconst walletRefusal = (\n err: Error,\n): { content: Array<{ type: 'text'; text: string }>; isError: true } => {\n const raw = err.message;\n const hit = REFUSALS.find(([re]) => re.test(raw));\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n walletRefused: true,\n message: hit\n ? `钱包没付这笔 —— ${hit[1]}。没有扣款。${hit[2]}`\n : `钱包没付这笔:${raw}。没有扣款。`,\n // The wallet page is where every one of these is fixed, so the card\n // can hand the person somewhere to go rather than a dead end.\n walletUrl: `${API_BASE}/buyer/wallet`,\n next: \"this is the BUYER'S OWN limit, not a payment failure. Tell them which limit stopped it and offer to raise it with wallet_set_limits — do NOT retry with another payment method.\",\n }),\n },\n ],\n isError: true,\n };\n};\nconst AGENT_PM = process.env.STRIPE_AGENT_PAYMENT_METHOD;\nconst STRIPE_AGENT_SECRET_KEY_IS_LIVE = !!STRIPE_AGENT_KEY?.startsWith('sk_live_');\n// Two deliberate escape hatches, both off by default:\n// SINOCARE_ALLOW_LIVE_WALLET=1 — mint with a live key (real money, see below).\n// SINOCARE_WALLET_FALLBACK=1 — if minting fails, pay with the plain card\n// token anyway instead of failing the order.\nconst WALLET_LIVE_OK = process.env.SINOCARE_ALLOW_LIVE_WALLET === '1';\nconst WALLET_FALLBACK_OK = process.env.SINOCARE_WALLET_FALLBACK === '1';\n\n// Mint a REAL ACP Shared Payment Token for exactly this order — the buyer\n// wallet's half of agentic commerce. Scoped to the seller's profile, this\n// amount, this currency, 15 minutes; the agent can spend it nowhere else.\n// Returns null when the wallet side isn't configured, so the demo falls back to\n// the plain card token it has always used. Plain fetch — no Stripe SDK here.\n// ⚠️ The throwaway card is minted FRESH per order, deliberately. A\n// PaymentMethod built from a single-use token (tok_visa) and never attached to\n// a Customer is CONSUMED once a PaymentIntent draws on it — Stripe then refuses\n// to issue an SPT against it (\"The payment method is in a consumed or deleted\n// state\"). Caching one per process therefore broke every order after the\n// first. One extra test-mode API call per order is the price of a wallet that\n// works twice.\n\nconst mintSharedPaymentToken = async (\n amountMinor: number,\n currency: string,\n): Promise<string | null> => {\n if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) return null;\n // A live key here means a order charges a REAL card for the full product\n // price (€1,280–2,900) the moment someone clicks pay in the card — with no\n // confirmation step anywhere. Refuse unless that is explicitly what you want.\n if (STRIPE_AGENT_SECRET_KEY_IS_LIVE && !WALLET_LIVE_OK) {\n throw new Error(\n 'refusing to mint with a LIVE Stripe key — a order would charge a real card for the full product price. Set SINOCARE_ALLOW_LIVE_WALLET=1 if that is genuinely intended.',\n );\n }\n const post = async (\n path: string,\n body: Record<string, string>,\n preview = false,\n ): Promise<Record<string, unknown>> => {\n const res = await fetch(`https://api.stripe.com/v1/${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${STRIPE_AGENT_KEY}`,\n 'content-type': 'application/x-www-form-urlencoded',\n ...(preview ? { 'stripe-version': '2026-04-22.preview' } : {}),\n },\n body: new URLSearchParams(body),\n });\n const json = (await res.json()) as { id?: string; error?: { message?: string } };\n if (!res.ok) throw new Error(`stripe ${path} -> ${res.status}: ${json.error?.message ?? ''}`);\n return json as Record<string, unknown>;\n };\n // The card the token draws on. A real wallet uses the customer's saved card;\n // in test mode a fresh throwaway one stands in for every order (see above).\n const pm =\n AGENT_PM ??\n String((await post('payment_methods', { type: 'card', 'card[token]': 'tok_visa' })).id);\n const spt = await post(\n 'shared_payment/issued_tokens',\n {\n payment_method: pm,\n 'seller_details[network_business_profile]': SELLER_PROFILE,\n 'usage_limits[currency]': currency.toLowerCase(),\n 'usage_limits[max_amount]': String(amountMinor),\n 'usage_limits[expires_at]': String(Math.floor(Date.now() / 1000) + 900),\n },\n true,\n ).catch((err: unknown) => {\n // A PINNED card hits the same one-shot wall, and there we can't just mint a\n // new one — say so instead of surfacing Stripe's bare message.\n if (AGENT_PM && /consumed or deleted/i.test(String(err))) {\n throw new Error(\n `STRIPE_AGENT_PAYMENT_METHOD (${AGENT_PM}) is spent — a payment method built from a single-use token can back exactly one charge. Unset it and the demo mints a fresh throwaway card per order, or pin one attached to a Customer.`,\n );\n }\n throw err;\n });\n return String(spt.id);\n};\n\n// Sinocare backend (public — no buyer token; the merchant key lives there).\nconst backend = async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n const res = await fetch(`${SINOCARE}${path}`, {\n ...init,\n headers: { 'content-type': 'application/json', ...(init.headers ?? {}) },\n });\n if (!res.ok) {\n throw new Error(\n `sinocare-backend ${path} -> ${res.status}: ${await res.text().catch(() => '')}`,\n );\n }\n return (await res.json()) as T;\n};\n\n// --- x402 (stablecoin) payment --------------------------------------------\n// x402 settles USDC. The amount is now MERCHANT-QUOTED: sinocare-backend opens a\n// merchant-quoted x402 session via the SDK and sets the USDC price (a small\n// fixed test charge on testnet). The buyer just signs + pays the session — it\n// never computes or passes the amount.\n\n// The buyer's x402 signer, resolved once and cached:\n// • X402_SIGNER=cdp → a Coinbase CDP Server Wallet (zero raw key; for\n// mainnet — needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET)\n// • X402_PAYER_PRIVATE_KEY → a local key (testnet/mainnet)\n// • neither → null (signX402 falls back to a throwaway key,\n// which only settles under a STUB facilitator)\n// Returning the Eip712Signer (address + signTypedData) lets both the balance\n// pre-flight and the wallet tool read .address regardless of signer kind.\nconst useCdpSigner = process.env.X402_SIGNER === 'cdp';\nlet buyerSignerPromise: Promise<Eip712Signer | null> | undefined;\nconst buyerSigner = (): Promise<Eip712Signer | null> => {\n buyerSignerPromise ??= (async () => {\n if (useCdpSigner) return cdpAccountSigner();\n const k = process.env.X402_PAYER_PRIVATE_KEY as Hex | undefined;\n return k ? signerFromPrivateKey(k) : null;\n })();\n return buyerSignerPromise;\n};\nconst fmtUsdc = (baseUnits: bigint): string => `${(Number(baseUnits) / 1e6).toFixed(2)} USDC`;\n\n// Answer an x402 402 challenge: sign an EIP-3009 transferWithAuthorization (via\n// the buyer x402 SDK) → base64 X-PAYMENT header. With a REAL facilitator (Base\n// Sepolia or mainnet) the signer must hold USDC on that chain — configure a CDP\n// wallet or X402_PAYER_PRIVATE_KEY; without either a throwaway key signs, which\n// only settles under a STUB facilitator.\nconst signX402 = async (r: X402PaymentRequirements): Promise<string> => {\n const signer = (await buyerSigner()) ?? (await signerFromPrivateKey(generatePrivateKey()));\n return encodeXPaymentHeader(await signX402Payment({ signer, requirements: r }));\n};\n\n// --- RLUSD (XRP Ledger) x402 payment --------------------------------------\n// The buyer's XRPL wallet, from XRPL_BUYER_SEED (an `sEd…` seed → Ed25519). A\n// real buyer holds this in a wallet; the demo derives it from env. Null when\n// unset — the RLUSD tool then tells the user to configure it. Unlike USDC there\n// is no throwaway fallback: settling RLUSD needs a funded, trust-lined account.\nconst XRPL_SEED = process.env.XRPL_BUYER_SEED;\nconst XRPL_RPC = process.env.XRPL_TESTNET_WSS ?? 'wss://s.altnet.rippletest.net:51233';\nlet xrplWalletCache: XrplWallet | null = null;\nconst xrplBuyer = (): XrplWallet | null => {\n if (xrplWalletCache) return xrplWalletCache;\n if (!XRPL_SEED) return null;\n xrplWalletCache = XrplWallet.fromSeed(XRPL_SEED);\n return xrplWalletCache;\n};\n\n// USDC-over-Solana buyer: SOLANA_BUYER_SECRET is a devnet Solana secret key (a\n// solana-keygen JSON array or a base58 string) holding devnet USDC. Cached as a\n// promise (base58 decode is async). SOLANA_RPC fetches balances + a blockhash.\nconst SOLANA_RPC = process.env.SOLANA_RPC_URL ?? 'https://api.devnet.solana.com';\nlet solanaSecretPromise: Promise<Uint8Array | null> | undefined;\nconst solanaBuyerSecret = (): Promise<Uint8Array | null> => {\n solanaSecretPromise ??= (async () => {\n const s = process.env.SOLANA_BUYER_SECRET;\n if (!s) return null;\n try {\n return await secretKeyFromString(s);\n } catch {\n return null;\n }\n })();\n return solanaSecretPromise;\n};\n\n// The buyer's USDC balance (base units) across its token accounts for a mint, via\n// a raw Solana JSON-RPC call (no SPL SDK). null on any RPC error → skip pre-flight.\nconst solanaUsdcBalance = async (owner: string, mint: string): Promise<number | null> => {\n try {\n const res = await fetch(SOLANA_RPC, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getTokenAccountsByOwner',\n params: [owner, { mint }, { encoding: 'jsonParsed' }],\n }),\n });\n // biome-ignore lint/suspicious/noExplicitAny: raw JSON-RPC shape\n const j = (await res.json()) as any;\n const accounts = j?.result?.value ?? [];\n let total = 0;\n for (const a of accounts) {\n total += Number(a?.account?.data?.parsed?.info?.tokenAmount?.amount ?? 0);\n }\n return total;\n } catch {\n return null;\n }\n};\n\n// Skyfire KYAPay — the BUYER mints a Skyfire-SIGNED PAY token (Skyfire's key signs\n// it; unlike the crypto rails the buyer can't self-sign) and presents it to the\n// MERCHANT backend, which charges it via the merchant SDK. SKYFIRE_BUYER_API_KEY\n// mints (buyer agent key from the Skyfire dashboard); SKYFIRE_SELLER_SERVICE_ID is\n// the seller service the payment authorizes. The agentbank key that verifies +\n// charges is the MERCHANT backend's, not the demo's.\nconst SKYFIRE_API = process.env.SKYFIRE_API_URL ?? 'https://api.skyfire.xyz';\nconst SKYFIRE_BUYER_API_KEY = process.env.SKYFIRE_BUYER_API_KEY;\nconst SKYFIRE_SELLER_SERVICE_ID = process.env.SKYFIRE_SELLER_SERVICE_ID;\n// A small fixed test charge (USD quote → settles USDC). Pin with SKYFIRE_TEST_AMOUNT.\n// 0.001 keeps each test charge tiny so a small Skyfire balance covers many runs.\nconst SKYFIRE_TEST_AMOUNT = process.env.SKYFIRE_TEST_AMOUNT ?? '0.001';\n\n// --- MPP · Tempo — on-chain TIP-20 settlement (Tempo payments chain, testnet) ---\n// MPP's `tempo` method: agentbank answers with a 402 whose signed challenge carries\n// the on-chain terms; the buyer wallet (TEMPO_BUYER_PRIVATE_KEY, funded pathUSD via\n// the Tempo faucet) pays with transferWithMemo; agentbank verifies the transfer\n// on-chain by tx hash. The buyer side (pay + credential) is the SDK\n// @curless/agentbank-protocols/tempo — the demo only holds config. A tiny fixed\n// amount so a small balance covers many runs.\nconst TEMPO_RPC = process.env.TEMPO_RPC_URL ?? 'https://rpc.moderato.tempo.xyz';\nconst TEMPO_BUYER_PRIVATE_KEY = process.env.TEMPO_BUYER_PRIVATE_KEY as Hex | undefined;\nconst MPP_TEMPO_TEST_AMOUNT = Number(process.env.MPP_TEMPO_TEST_AMOUNT ?? 10000); // 0.01 pathUSD (6dp)\n\n// Mint a Skyfire PAY token (Skyfire ES256-signs it) authorizing `amountUsd` to our\n// seller service — returned as a JWT the buyer presents in the x-kyapay-token header.\nconst mintSkyfirePayToken = async (amountUsd: string): Promise<string> => {\n if (!SKYFIRE_BUYER_API_KEY) throw new Error('set SKYFIRE_BUYER_API_KEY');\n if (!SKYFIRE_SELLER_SERVICE_ID) throw new Error('set SKYFIRE_SELLER_SERVICE_ID');\n const expiresAt = Math.floor(Date.now() / 1000) + 300;\n const res = await fetch(`${SKYFIRE_API}/api/v1/tokens`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'skyfire-api-key': SKYFIRE_BUYER_API_KEY },\n body: JSON.stringify({\n type: 'pay',\n buyerTag: `sinocare-${Date.now()}`,\n tokenAmount: amountUsd,\n sellerServiceId: SKYFIRE_SELLER_SERVICE_ID,\n expiresAt,\n }),\n });\n if (!res.ok) {\n throw new Error(`skyfire mint -> ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n const { token } = (await res.json()) as { token?: string };\n if (!token) throw new Error('skyfire mint returned no token');\n return token;\n};\n\n// Run a callback with a connected XRPL client, always disconnecting after — so a\n// order opens ONE connection for the balance pre-flight AND the signing autofill\n// instead of one each.\nconst withXrplClient = async <T>(fn: (c: XrplClient) => Promise<T>): Promise<T> => {\n const client = new XrplClient(XRPL_RPC);\n await client.connect();\n try {\n return await fn(client);\n } finally {\n await client.disconnect().catch(() => undefined);\n }\n};\n\n// Read the buyer's balance of an XRPL IOU (RLUSD) via account_lines — the trust\n// line to the issuer for that currency. Returns the decimal string balance, '0'\n// if no trust line / no funds. Uses the caller's connected client.\nconst rlusdBalance = async (\n client: XrplClient,\n owner: string,\n currencyHex: string,\n issuer: string,\n): Promise<string> => {\n try {\n const res = await client.request({ command: 'account_lines', account: owner, peer: issuer });\n const line = res.result.lines.find((l) => l.currency === currencyHex && l.account === issuer);\n return line?.balance ?? '0';\n } catch {\n return '0';\n }\n};\n\n// Answer an XRPL x402 402 challenge: sign a standard Payment (Ed25519, invoice\n// bound as a Memo) via the buyer /xrpl SDK → base64 X-PAYMENT, using the caller's\n// connected client for autofill. The wallet must hold RLUSD + a little test XRP.\nconst signXrpl = async (\n client: XrplClient,\n r: XrplPaymentRequirements,\n wallet: XrplWallet,\n): Promise<string> =>\n encodeXrplXPaymentHeader(await signXrplPayment({ requirements: r, wallet, client }));\n\n// A standing AP2 IntentMandate (delegated order authority). The user signs it\n// ONCE via authorize_agent_budget; buy_sinocare_product_ucp then attaches it so\n// the agent can complete orders within the cap without confirming each one.\n// In-memory for the session (a real buyer wallet would persist + re-sign it).\ntype AgentBudget = { mandate: Ap2IntentMandate; maxAmountEur: number; expiresAt: string };\n\n// Persist the standing authorization across restarts. It's a delegation the user\n// signs ONCE (authorize_agent_budget); keeping it only in memory meant a process\n// restart silently dropped the cap, letting an over-budget order slip through.\n// The mandate is a self-contained signed JWS, so persisting + re-presenting it\n// stays cryptographically valid (we store it, we don't re-sign). Keyed to the\n// agent token so a different buyer can't inherit a stale grant; an expired grant\n// is dropped on load. Override the path with SINOCARE_DEMO_BUDGET_FILE.\nconst BUDGET_FILE =\n process.env.SINOCARE_DEMO_BUDGET_FILE ?? join(homedir(), '.agentbank-sinocare-budget.json');\nconst tokenFp = TOKEN ? createHash('sha256').update(TOKEN).digest('hex').slice(0, 16) : '';\n\nconst saveBudget = (b: AgentBudget | null): void => {\n try {\n // mode 0o600: the file holds a signed IntentMandate (a bearer authorization);\n // keep it owner-only, not world-readable, even in a demo home dir.\n if (b)\n writeFileSync(BUDGET_FILE, JSON.stringify({ tokenFp, budget: b }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n else rmSync(BUDGET_FILE, { force: true });\n } catch {\n /* best-effort: a demo persistence hiccup must never break order */\n }\n};\n\nconst loadBudget = (): AgentBudget | null => {\n try {\n const saved = JSON.parse(readFileSync(BUDGET_FILE, 'utf8')) as {\n tokenFp?: string;\n budget?: AgentBudget;\n };\n const b = saved.budget;\n // Ignore a grant signed for a different token, or one that has expired.\n if (saved.tokenFp !== tokenFp || !b?.expiresAt || Date.parse(b.expiresAt) < Date.now()) {\n rmSync(BUDGET_FILE, { force: true });\n return null;\n }\n return b;\n } catch {\n return null;\n }\n};\n\nlet agentBudget: AgentBudget | null = loadBudget();\n\n// The last checkout the card was opened for. The MCP-App host doesn't reliably\n// deliver the initial tool result to the widget (it self-heals by re-invoking\n// start_sinocare_checkout with NO args) — so we replay the last pick here, or the\n// card would hang on \"Loading…\". Mirrors the merchant card's read-tools-work-\n// with-empty-args behavior.\ntype CheckoutPick = {\n sku: string;\n name: string;\n priceEur: string;\n quantity: number;\n imageUrl?: string;\n externalShopify?: boolean; // the external link lands on Shopify checkout\n // Has THIS pick been paid? Drives picker-vs-receipt on rehydrate without\n // deleting the order record — a fresh re-open of an already-ordered product\n // stays a picker (ordered=false) while its past receipt is kept intact.\n ordered?: boolean;\n};\nlet lastCheckout: CheckoutPick | null = null;\n\n// Completed orders, by sku — so a checkout card that gets REHYDRATED (the host\n// re-invokes start_sinocare_checkout when the user leaves the conversation and\n// comes back) shows the receipt for that product instead of resetting to the\n// payment picker. Ordering hands off to the conversation (card → sendMessage →\n// the agent runs buy_sinocare_product_*), so the card's own DOM \"已发起\" note is\n// lost on reload; without this the reloaded card always re-rendered the picker\n// even though the product was already paid for. In-memory for the process (same\n// lifetime + same-process assumption as lastCheckout — one long-lived stdio\n// server per Claude session). Keyed by sku, which the card passes to book_* with\n// the exact sku it opened the checkout for, so the keys line up. PERSISTED to\n// disk (see below): without that, opening the card from another conversation — a\n// fresh stdio process with an empty map — lost every order, so a paid product's\n// card rehydrated to the payment picker as if never ordered.\ntype OrderReceipt = {\n sku: string;\n name: string;\n protocol?: string;\n total?: string; // human total: amountDisplay / priceEur / paidUsdc / paidRlusd\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\nconst completedOrders = new Map<string, OrderReceipt>();\n\n// Persist the card's checkout state (last pick + order receipts) across restarts\n// and conversations, so returning to a paid product's card shows its receipt\n// instead of resetting to the picker — and so a fresh \"buy it again\" starts\n// clean. Keyed to the agent token so a different buyer starts empty. Override the\n// path with SINOCARE_DEMO_STATE_FILE.\nconst STATE_FILE =\n process.env.SINOCARE_DEMO_STATE_FILE ?? join(homedir(), '.agentbank-sinocare-checkout.json');\nconst saveCheckoutState = (): void => {\n // No buyer token → no stable identity to key on. Persisting under an empty\n // tokenFp would pool every anonymous buyer into one shared file (and let one\n // clobber another), so keep this session's state in memory only.\n if (!tokenFp) return;\n try {\n // Read-merge-write: a sibling process (another conversation for the SAME\n // buyer) may have ordered between our startup snapshot and now. Union its\n // orders with ours — ours wins ties (we just acted) — so our stale\n // snapshot never clobbers a order another conversation recorded.\n const merged = new Map(completedOrders);\n try {\n const disk = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n orders?: Array<[string, OrderReceipt]>;\n /** Pre-2026-08-21 spelling. Read, never written — see the loader below. */\n bookings?: Array<[string, OrderReceipt]>;\n };\n if (disk.tokenFp === tokenFp) {\n for (const [k, v] of disk.orders ?? disk.bookings ?? [])\n if (!merged.has(k)) merged.set(k, v);\n }\n } catch {\n /* no readable prior file — just write ours */\n }\n // Fold the union back into memory so this long-lived process also sees a\n // sibling conversation's orders on its next rehydrate (no restart needed).\n for (const [k, v] of merged) if (!completedOrders.has(k)) completedOrders.set(k, v);\n // Atomic replace: write a temp then rename, so a concurrent reader never\n // observes a half-written file.\n const tmp = `${STATE_FILE}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify({ tokenFp, lastCheckout, orders: [...merged] }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n renameSync(tmp, STATE_FILE);\n } catch {\n /* best-effort: a demo persistence hiccup must never break the card */\n }\n};\nif (tokenFp) {\n try {\n const saved = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n lastCheckout?: CheckoutPick | null;\n orders?: Array<[string, OrderReceipt]>;\n /**\n * The key this file used before 2026-08-21, when the demo still spoke the\n * resort vocabulary it was forked from. Read so an existing state file\n * keeps its receipts — `orders ?? []` alone would read every one of them\n * as absent and silently drop the lot on the next write.\n */\n bookings?: Array<[string, OrderReceipt]>;\n };\n // Ignore state saved under a different buyer token.\n if (saved.tokenFp === tokenFp) {\n // ⚠️ `orders` ONLY. `lastCheckout` is deliberately NOT restored.\n //\n // It exists for one case: a card self-healing with no arguments, where\n // the server replays the last pick so the widget fills instead of\n // hanging. Restored from disk it does that to a card belonging to a\n // DIFFERENT product — restart the app, ask for a new hotel, and the card\n // renders the previous order's receipt, which reads as having ordered\n // something you did not.\n //\n // `orders` is safe to restore because it is keyed by sku: it is only\n // ever consulted for a product someone actually asked about.\n for (const [k, v] of saved.orders ?? saved.bookings ?? []) completedOrders.set(k, v);\n }\n } catch {\n /* no persisted state yet — start empty */\n }\n}\n\n// Record a completed order (only when it actually settled) and return the tool\n// result — so every buy_sinocare_product_* success is remembered for rehydration\n// in ONE place. Pulls the human fields off the result value the tool already\n// built (total shape differs by rail: total / paidUsdc / paidRlusd / priceEur).\nconst finishOrder = (\n sku: string,\n value: Record<string, unknown> & {\n ordered?: boolean;\n /**\n * What ACTUALLY paid — required, so a new payment path cannot forget it.\n *\n * The card used to label a receipt with the button the person clicked. When\n * a chosen method could not go through and the order settled another way,\n * that filed the charge under a method with no part in it: four real\n * payments were shown as \"paid by the Curless wallet\" while the wallet had\n * never been signed in.\n */\n payer: string;\n },\n) => {\n if (sku && value.ordered) {\n // Record the sale on the Shopify side, if the catalog is Shopify-backed.\n // Fire-and-forget: the order already settled through agentbank, so a\n // writeback failure must never affect the tool result. The backend no-ops\n // when Shopify isn't configured, so this is safe to call unconditionally.\n void backend('/shopify-order', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity: value.quantity,\n protocol: value.protocol,\n // Canonical writeback idempotency key: the settled order/PI id (also the\n // searchable Shopify tag), falling back to the checkout session id so\n // EVERY protocol dedups. A missing key means no dedup, and a hung-call\n // re-fire would then create a duplicate Shopify order.\n orderId: value.orderId ?? value.sessionId ?? value.paymentIntentId,\n // So the Shopify order lands under a customer, not anonymously.\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n }).catch(() => {});\n completedOrders.set(sku, {\n sku,\n name: String(value.product ?? ''),\n protocol: value.protocol as string | undefined,\n total: (value.total ?? value.paidUsdc ?? value.paidRlusd ?? value.priceEur) as\n | string\n | undefined,\n status: value.status as string | undefined,\n orderId: value.orderId as string | undefined,\n txHash: value.txHash as string | undefined,\n explorer: value.explorer as string | undefined,\n message: value.message as string | undefined,\n });\n // Mark this pick as paid so a later rehydrate resolves to the receipt — not\n // by the presence of a order record (which we now keep across re-opens),\n // but by whether THIS checkout was actually completed.\n if (lastCheckout?.sku === sku) lastCheckout.ordered = true;\n saveCheckoutState();\n }\n return text(value);\n};\n\n// ── what the checkout card offers ────────────────────────────────────────────\n/**\n * The two axes agentbank spans (money × protocol), laid out by GROUP.\n *\n * ⚠️ This is SERVER-side now, and that is what lets one card serve both shops:\n * the wallet connector sends its own three rows to the same card. A card that\n * hard-codes the payment table has to be forked per storefront, which is\n * exactly how there came to be two of them.\n *\n * • Curless 钱包 — first, and standing alone. Filing it under \"卡 · Stripe\"\n * would describe the plumbing rather than the choice:\n * everything below is how the AGENT pays, this is how the\n * PERSON pays. Three rows, because there are three\n * genuinely different ways a wallet reaches a merchant,\n * and which applies is decided by what the BUYER has\n * installed. Least-setup-required is last.\n * • 外链 — the other thing a PERSON does: leave the conversation\n * and pay on the merchant's own page.\n * • 卡 · Stripe — ACP / UCP. No coin/chain axis, so the protocol is the row.\n * • 稳定币 · 公链 — USDC·Base / USDC·Solana / RLUSD·XRPL. The chain is\n * independent of the PROTOCOL: bare x402 AND a UCP session\n * both settle any chain, so each row offers the protocol as\n * a sub-choice. UCP therefore appears under both 卡 and\n * 稳定币 — that is the two-axis point.\n * • 稳定币 · Agent 原生 — Skyfire and MPP·Tempo. These are STABLECOINS TOO; they\n * were once titled by protocol, which flipped the axis and\n * made them look like a different KIND of money. Skyfire\n * settles USDC on BASE — the same coin and chain as the\n * x402 row above. What differs is CUSTODY, not the money:\n * x402 = the buyer signs from their OWN wallet (EIP-3009);\n * Skyfire = the buyer PRE-FUNDS a Skyfire wallet and\n * Skyfire signs on their behalf, which is why that rail\n * reports a remaining balance and never a tx hash.\n */\nconst SINOCARE_GROUPS: CheckoutGroup[] = [\n {\n label: 'Curless 钱包',\n rows: [\n {\n title: 'Curless 买家钱包',\n sub: '登录后用自己绑的卡 · 受自己设的限额约束',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_wallet' }],\n },\n {\n title: '钱包连接器(独立 MCP)',\n sub: '你自己装的 Curless 钱包铸凭据 · 在聊天里完成',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_wallet_handoff', chat: true }],\n },\n {\n title: '浏览器里确认付款',\n sub: '什么都不用装 · 打开链接看清金额再批准',\n actions: [{ label: '生成付款链接', tool: 'pay_sinocare_hosted' }],\n },\n ],\n },\n {\n // ⚠️ ITS OWN GROUP, AND THE SUBTITLE SAYS WHY.\n //\n // Every other row on this card ends in money moving. This one does not:\n // UnionPay authenticates the cardholder and hands back a one-time token for\n // the MERCHANT to charge through their own UnionPay acceptance, which\n // Sinocare does not have. Filing it under 卡 next to ACP/UCP would put a\n // button that cannot pay beside two that can, and the difference would be\n // invisible until someone read the result.\n label: '银联 · UnionPay Agent Pay',\n rows: [\n {\n title: '银联卡(UAAG)',\n sub: '用你钱包里绑的银联卡 · 银联页面认证 · 演示止于凭证签发,不扣款',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_uaag_handoff', chat: true }],\n },\n ],\n },\n {\n label: '外链 · 商家收银台',\n rows: [\n {\n title: 'Shopify / Payment Link',\n sub: '在浏览器里打开商家的收银页 · 卡',\n actions: [{ label: '打开付款页', tool: 'create_sinocare_payment_link', ext: true }],\n },\n ],\n },\n {\n label: '卡 · Stripe',\n rows: [\n {\n title: 'ACP',\n sub: 'Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_acp' }],\n },\n {\n title: 'UCP',\n sub: 'AP2 授权 · Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_ucp', args: { pay: 'card' } }],\n },\n ],\n },\n {\n label: '稳定币 · 公链(x402 / UCP)',\n rows: [\n {\n title: 'USDC · Base',\n sub: 'EVM · EIP-3009 签',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc' } },\n ],\n },\n {\n title: 'USDC · Solana',\n sub: 'SVM · 部分签 · facilitator 代付 gas',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402', args: { chain: 'solana' } },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc-sol' } },\n ],\n },\n {\n title: 'RLUSD · XRP Ledger',\n sub: 'Ed25519 签 · 自建 facilitator',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_rlusd' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'rlusd' } },\n ],\n },\n ],\n },\n {\n label: '稳定币 · Agent 原生协议',\n rows: [\n {\n title: 'USDC · Base(Skyfire 托管)',\n sub: 'Skyfire 签 JWT · KYA 身份 + 付款授权 · 买家预充值余额',\n actions: [{ label: 'KYAPay', tool: 'buy_sinocare_product_skyfire' }],\n },\n {\n title: 'pathUSD · Tempo',\n sub: 'HTTP-402 · 链上 TIP-20 transferWithMemo',\n actions: [{ label: 'MPP', tool: 'buy_sinocare_product_mpp' }],\n },\n ],\n },\n];\n\n/**\n * The payment table for THIS product. The 外链 row names Shopify only when this\n * product is Shopify-backed (its link lands on Shopify's own checkout); the\n * static wording stays generic otherwise, so the label never lies.\n */\nconst groupsFor = (pick: CheckoutPick): CheckoutGroup[] =>\n pick.externalShopify !== true\n ? SINOCARE_GROUPS\n : SINOCARE_GROUPS.map((g) =>\n g.label.startsWith('外链')\n ? {\n ...g,\n rows: g.rows.map((r) => ({\n ...r,\n title: 'Shopify 结账',\n sub: '在 Shopify 收银台支付(Shopify Payments)',\n actions: r.actions.map((a) => ({ ...a, label: '去 Shopify 支付' })),\n })),\n }\n : g,\n );\n\n/**\n * The checkout card's payload for a pick — the picker, or the receipt when THIS\n * checkout is the one that was paid.\n */\nconst pickView = (pick: CheckoutPick, r?: OrderReceipt) =>\n checkoutView({\n product: {\n sku: pick.sku,\n name: pick.name,\n priceDisplay: pick.priceEur,\n imageUrl: pick.imageUrl,\n },\n quantity: pick.quantity,\n groups: groupsFor(pick),\n lang: 'zh',\n receipt: r && {\n protocol: r.protocol,\n total: r.total ?? pick.priceEur,\n status: r.status,\n orderId: r.orderId,\n txHash: r.txHash,\n explorer: r.explorer,\n message: r.message,\n },\n });\n\n// MCP App card (a single ui:// resource, TWO views chosen by structuredContent.\n// view). start_sinocare_checkout → the payment-method picker; list_my_orders → the\n// buyer's orders (each refundable). Both advertise it on BOTH their tool\n// definition AND their result via _meta.ui.resourceUri (mirrors the merchant card\n// — the host needs it on the tool to know it renders a widget); each returns its\n// data as structuredContent, and the card calls the book_* / request_refund /\n// create_sinocare_payment_link tools back.\n// ⚠️ BUMP THIS WHENEVER widget/ CHANGES. The host caches the card's HTML by\n// this URI, so shipping new widget code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture. Three widget changes\n// went out today without a bump, and the receipt/picker fix appeared to have\n// no effect at all because of it.\nconst CHECKOUT_URI_PREFIX = 'ui://sinocare/';\nconst CHECKOUT_URI = `${CHECKOUT_URI_PREFIX}card-v33.html`;\n// The mime type, the two host namespaces and the image allow-list all live in\n// the shared package now. Each of them fails SILENTLY when wrong — an omitted\n// `resourceDomains` blocks every product photo before it leaves the starting\n// line — and two copies meant a fix could look applied while this shop still\n// rendered a row of broken images.\nconst CHECKOUT_UI_META = uiMeta(CHECKOUT_URI);\n// No `widgetDomain`: this one is stdio and has no public origin to name.\nconst WIDGET_META = widgetMeta();\n\n// The twelve tools BOTH Sinocare storefronts advertise — same names, same\n// schemas, same wording. They were two tables until 2026-08-14, and the copies\n// had drifted into telling two models two different things about the same\n// purchase: one was told a wallet refusal must stop the sale, the other was not.\n// Only the checkout card's payment vocabulary is ours.\nconst SHARED_TOOLS = storefrontTools({\n checkoutOffers:\n 'It offers Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger) in the conversation, the buyer\\u2019s own Curless wallet, a UnionPay card the buyer bound to that wallet (UAAG \\u2014 which ends at a credential, not a payment), and an external hosted Payment Link page.',\n});\n\n// This storefront's own — the other six rails, the AP2 standing authorization\n// and the two on-chain wallet read-outs. The wallet connector advertises none\n// of them, which is the entire difference between the two shops.\nconst RAIL_TOOLS: ToolDef[] = [\n {\n name: 'create_sinocare_payment_link',\n description:\n \"Create a Payment Link for a product — a PUBLIC hosted checkout page (like a Stripe Payment Link) the user opens in a browser to pay (test-mode card). Returns the URL. Mostly invoked by the checkout card's 'Payment Link' button; the external-link payment path.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'start_sinocare_uaag_handoff',\n description:\n 'Buy a Sinocare product over UnionPay Agent Pay (UAAG). Sinocare prices it and opens a checkout session; UnionPay then authenticates the CARDHOLDER on its own page (3DS / Passkey) and issues a one-time payment token. \\u26a0\\ufe0f This is a HANDOFF, not a purchase: it returns UnionPay\\u2019s checkout URL for the person to open, and the flow ends when UnionPay issues the credential. UnionPay\\u2019s model has the MERCHANT charge that credential \\u2014 it is shaped like an ordinary UnionPay card (token as the card number, DTVC as the CVV2), so the merchant needs UnionPay acceptance. Sinocare\\u2019s demo checkout has none, so nothing is charged and no order is placed. Returns ordered:false always.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n cardId: {\n type: 'string',\n description:\n \"OPTIONAL, and normally omit it. The storefront reads the buyer's bound UnionPay cards from their own wallet session and uses the one they have; pass this only to pick between several. A uaagcard_… you did not get from that list is a guess, and UnionPay answers a wrong one with a 404 that does not say what was wrong.\",\n },\n },\n },\n },\n {\n name: 'get_sinocare_uaag_status',\n description:\n 'Has UnionPay issued the payment credential yet? Pass the paymentIntentId from start_sinocare_uaag_handoff. The cardholder authenticates in their own browser and this server is never told when they finish, so this is the only way to know. \\u26a0\\ufe0f `issued: true` means a one-time token + DTVC now exist \\u2014 it does NOT mean the order is paid. The MERCHANT charges that credential through their own UnionPay acceptance, which Sinocare does not have, so this demo stops there on purpose. Never report it as paid.',\n inputSchema: {\n type: 'object',\n required: ['paymentIntentId'],\n properties: {\n paymentIntentId: {\n type: 'string',\n description: 'from start_sinocare_uaag_handoff',\n },\n },\n },\n },\n {\n name: 'buy_sinocare_product_acp',\n description:\n 'Buy a Sinocare product over ACP (Agentic Commerce Protocol) — Sinocare prices the product and opens a merchant-quoted checkout session; this agent completes it with a delegated card credential, settling on the card rail (test mode). One of THREE ways to pay: ACP (card) / UCP (card) / x402 (USDC). The card rail is an implementation detail, not a separate payment choice. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_ucp',\n description:\n 'Buy a Sinocare product over UCP (Universal Commerce Protocol, ucp.dev) — Sinocare prices it and opens a UCP checkout session. UCP \"supports x402\", and x402 is chain-agnostic, so the SAME UCP session settles FOUR ways (pass `pay`): `card` (default) → the agent authorizes with an AP2 PaymentMandate bound to the cart, settled on the card rail (test mode, same as ACP); `usdc` → the gateway freezes an x402 challenge and the agent pays with a signed EIP-3009 X-PAYMENT (USDC on Base/EVM); `usdc-sol` → same, on Solana — the agent partially signs an SPL transfer the facilitator co-signs + submits (USDC on Solana, buyer needs no SOL); `rlusd` → an XRPL x402 challenge, a signed XRPL Payment (Ed25519, no gas), on the XRP Ledger. The three stablecoin ways all settle on-chain over the stablecoin rail — currency + chain just pick the rail. The standing authorization (authorize_agent_budget) is attached on the card path. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n pay: {\n type: 'string',\n enum: ['card', 'usdc', 'usdc-sol', 'rlusd'],\n description:\n 'payment method for this UCP session: card (default), usdc (x402 · USDC on Base/EVM), usdc-sol (x402 · USDC on Solana), or rlusd (x402 · RLUSD on the XRP Ledger)',\n },\n },\n },\n },\n {\n name: 'authorize_agent_budget',\n description:\n 'Delegate autonomous Sinocare order to this agent via an AP2 IntentMandate: you sign a STANDING authorization (a spend cap per order + a time window) ONCE, and the agent can then complete UCP orders within it without confirming each purchase. Bookings over the cap (or after it expires) are rejected by the gateway. This is the AP2 \"user authorizes intent, agent acts within it\" delegation.',\n inputSchema: {\n type: 'object',\n required: ['maxAmountEur'],\n properties: {\n maxAmountEur: {\n type: 'number',\n description: 'spend cap PER order, in EUR (e.g. 2000)',\n },\n hours: {\n type: 'integer',\n description: 'how long the authorization lasts, in hours (default 24)',\n },\n },\n },\n },\n {\n name: 'agent_budget_status',\n description:\n 'Show the current standing AP2 order authorization (spend cap + expiry), or that none is set.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'revoke_agent_budget',\n description:\n 'Revoke the standing AP2 purchase authorization — the agent must get a fresh one (authorize_agent_budget) to buy autonomously again.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_x402',\n description:\n 'Buy a Sinocare product and pay in USDC over x402. `chain` picks the USDC chain: `base` (default) → EVM, a signed EIP-3009 authorization; `solana` → an SVM transfer the buyer partially signs and the facilitator co-signs (feePayer) + submits (buyer needs no SOL). The merchant receives USDC at its address on that chain. Returns the order + the USDC amount paid (+ the Solana tx on the solana path).',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n chain: {\n type: 'string',\n enum: ['base', 'solana'],\n description: 'USDC chain: base (default, EVM) or solana',\n },\n },\n },\n },\n {\n name: 'x402_buyer_wallet',\n description:\n 'Show the wallet that pays for x402 (USDC) orders — its address and USDC balance on Base Sepolia (testnet) + Base (mainnet), and where to top it up. Use this to check funds before order with USDC.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_rlusd',\n description:\n \"Buy a Sinocare product and pay in RLUSD (Ripple USD) over x402 on the XRP Ledger. Sinocare opens a merchant-quoted RLUSD session; this agent signs a standard XRPL Payment (Ed25519, no gas — the buyer pays the tiny XRPL fee) and Curless's self-hosted facilitator submits it on-ledger. Same x402 protocol as the USDC tool, different chain. Returns the order + the RLUSD amount paid + the XRPL tx.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_skyfire',\n description:\n \"Buy a Sinocare product over Skyfire KYAPay (agent-native JWT payments). The buyer mints a Skyfire-SIGNED PAY token (via Skyfire, authorizing a small USDC charge to Sinocare — unlike the crypto rails the buyer can't self-sign, Skyfire signs it) and presents it to the Sinocare merchant backend, which charges it via the merchant SDK; agentbank verifies it against Skyfire's live JWKS — proving the agent's identity (Know Your Agent) AND the payment authorization — and records the USDC payment intent. PRODUCTION Skyfire (real token, real verify). Needs SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID (to mint). Returns the verification + the recorded payment intent (agentbank verifies + records the authorization; it does not auto-capture).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_mpp',\n description:\n \"Buy a Sinocare product over MPP (Machine Payments Protocol) settled on the Tempo payments chain. agentbank answers the unpaid request with an HTTP-402 Payment challenge whose SIGNED terms carry the on-chain payment (TIP-20 pathUSD token, merchant recipient, memo=challenge binding); the buyer's Tempo wallet pays it with transferWithMemo; the credential proves it by tx HASH and agentbank VERIFIES the on-chain transfer read-only, then captures the payment intent. Real Tempo testnet, on-chain stablecoin — no card, no gateway signing. Needs AGENTBANK_AGENT_TOKEN + TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'xrpl_buyer_wallet',\n description:\n 'Show the XRPL wallet that pays for RLUSD orders — its classic r-address and RLUSD trust-line balance on the XRP Ledger testnet. Use this to check funds before order with RLUSD.',\n inputSchema: { type: 'object', properties: {} },\n },\n];\n\nconst TOOLS: ToolDef[] = [...SHARED_TOOLS, ...RAIL_TOOLS];\n\n// ⚠️ A card declaration is a promise that THIS result is renderable by THAT\n// card, so it goes only on tools whose result the card can draw. Attaching it\n// to everything told the host that a product LIST renders the checkout card:\n// the host drew the card, the card found no view it knew, and it sat on\n// \"Loading…\" for ever under a tool that had answered perfectly.\nconst CARD_TOOLS = new Set(['list_sinocare_products', 'start_sinocare_checkout', 'list_my_orders']);\n\nconst text = (value: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n});\n\n// Server instructions — hosts (Claude Desktop) inject these into the model's\n// context. The point: when the user wants to buy, OPEN THE CARD, don't retype\n// the payment menu as prose. Left to its own devices the model reads the seven\n// buy_* tools and helpfully lists ACP / UCP / x402 / RLUSD as a text bullet\n// list and asks — but the whole UX is the visual card, where the user clicks a\n// method and pays in place. So make the card the default and the text list a\n// non-UI fallback only.\n//\n// The shape and the hard rules are shared with the wallet connector; the\n// payment sentence is not, and must not be — that shop has one method in three\n// shapes and this one has seven rails to explain.\nconst INSTRUCTIONS = buildInstructions({\n opening:\n 'Sinocare storefront (buyer side). The card IS the shop. When the user wants to buy something — \"buy\", \"order\", \"我要买…\", \"再来一盒试纸\" — call start_sinocare_checkout (pass the product `sku`, or a `query` name such as \"Safe-Accu\") to open the visual checkout card, where they pick a payment method and pay by clicking.',\n paymentCard:\n 'Do NOT enumerate the payment methods (ACP / UCP / x402 / RLUSD / Curless wallet / Payment Link) as text and ask which one — that is what the card is for.',\n orderedField: 'ordered',\n extra: [\n 'Call the buy_sinocare_product_* tools directly only when the card is unavailable or the user explicitly asked for a specific rail in a plain-text flow.',\n ],\n});\n\n// Read at runtime (dist/index.js → ../package.json), never written here. It said\n// '0.5.0' while the package shipped 0.62.1 — fifty-seven minors of drift in the\n// version a host displays, invisible because nothing in the repo reads it.\n// @curless/agentbank-mcp fixed the identical bug this way long ago.\nconst VERSION = (createRequire(import.meta.url)('../package.json') as { version: string }).version;\n\nconst server = new Server(\n { name: 'sinocare', version: VERSION },\n { capabilities: { tools: {}, resources: {} }, instructions: INSTRUCTIONS },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => (CARD_TOOLS.has(t.name) ? { ...t, _meta: CHECKOUT_UI_META } : t)),\n}));\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: CHECKOUT_URI, name: 'Sinocare checkout', mimeType: CARD_MIME, _meta: WIDGET_META },\n ],\n}));\nserver.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n // ANY version of our card uri gets the CURRENT card — see the note in the\n // wallet connector. Bumping the uri busts a host's cache; refusing the old\n // one turns a stale card into \"there was a problem displaying content\", with\n // nothing the person can do about it.\n const asked = req.params.uri;\n if (!servesCardUri(CHECKOUT_URI_PREFIX, asked)) throw new Error(`unknown resource: ${asked}`);\n return {\n contents: [{ uri: asked, mimeType: CARD_MIME, text: CHECKOUT_CARD_HTML, _meta: WIDGET_META }],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (req) => {\n const args = (req.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (req.params.name === 'list_sinocare_products') {\n // `products`, and a `view` the card dispatches on. This returned\n // `{currency, count, products}` — the product storefront's shape, left\n // behind by a rename that changed identifiers and not payloads. The card\n // reads `products`, got undefined, and drew nothing.\n // The aisles and the \"an unknown one means all of them\" rule are shared\n // with the wallet connector — they were written out four times between\n // the two shops, and adding an aisle only ever fixed half of them.\n const { items } = await backend<{ items: Product[] }>(\n `/catalog${categoryQuery(args.category)}`,\n );\n const view = productsView(items);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(view) }],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'get_sinocare_product') {\n const sku = String(args.sku ?? '');\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`);\n return text(product);\n }\n\n // Visual checkout: return the MCP App card (payment picker) + the product as\n // structuredContent. The card's buttons call the book_* /\n // create_sinocare_payment_link tools; the card renders their results.\n if (req.params.name === 'start_sinocare_checkout') {\n // Accept a `sku` (exact) OR a `query`/`product`/`name` (e.g. \"Safe AQ Smart\")\n // so the agent doesn't need the exact sku to open the card.\n const idOrName = String(args.sku ?? args.query ?? args.product ?? args.name ?? '').trim();\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // The card sets __rehydrate when it re-invokes to fill itself (reload /\n // self-heal), never on a fresh agent-initiated checkout. Only on rehydrate\n // do we show a completed order's receipt instead of the picker — so an\n // explicit \"buy X again\" from the agent still opens the picker.\n const rehydrate =\n args.__rehydrate === true || args.__rehydrate === 1 || args.__rehydrate === '1';\n\n // No product given = the card self-healing (empty-arg re-invoke) — replay the\n // last pick so the widget fills in instead of hanging on \"Loading…\". If that\n // last checkout has since been ordered, show its receipt on rehydrate.\n if (!idOrName) {\n if (rehydrate && lastCheckout?.ordered) {\n const receipt = completedOrders.get(lastCheckout.sku);\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n }\n // Nothing to replay: answer \"pick a product\" rather than volunteering\n // whichever one came last. The card shows its own empty state.\n if (!lastCheckout) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'Pick a product first (list_sinocare_products), then open its checkout.',\n },\n ],\n isError: true,\n };\n }\n return {\n content: [{ type: 'text' as const, text: `Checkout for ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n // Resolve: try the exact sku first, then the shared resolver over the\n // catalog. It never guesses between several matches — \"Safe-Accu\" and\n // \"Safe-Accu2\" differ by one character, and this card ends in a charge.\n let product: Product | null = null;\n let candidates: Product[] = [];\n try {\n product = await backend<Product>(`/catalog/${encodeURIComponent(idOrName)}`);\n } catch {\n const { items } = await backend<{ items: Product[] }>('/catalog');\n const match = resolveProduct(items, { sku: idOrName });\n if (match.kind === 'found') product = match.product;\n else if (match.kind === 'ambiguous') candidates = match.candidates;\n }\n if (!product) {\n return {\n content: [\n {\n type: 'text' as const,\n // Says 商品 / 目录, not 度假村. This storefront was forked from a\n // resort demo and inherited its vocabulary wholesale, in a shop\n // that sells blood-glucose meters — a miss the buyer reads.\n text: candidates.length\n ? `“${idOrName}” 对上了 ${candidates.length} 件商品 —— 说清是哪件:${candidates\n .map((c) => `${c.name}(${c.sku})`)\n .join('、')}`\n : `目录里没有 “${idOrName}” —— 用 list_sinocare_products 看可选项,或传它的 sku。`,\n },\n ],\n isError: true,\n };\n }\n\n const priceEur = priceDisplayOf(product);\n // Rehydrating an already-BOOKED product's card → show its receipt, not the\n // picker (fixes: pay, leave the conversation, come back, and the card had\n // reset to the payment selection). The card self-heals by re-invoking with\n // its ORIGINAL args (the sku) + __rehydrate. EXCEPTION: a deliberate \"buy\n // it again\" is a fresh (non-rehydrate) open that leaves THIS sku's pick\n // unordered; its immediate self-heal must resolve to the picker, so suppress\n // the receipt only while this sku is the one being freshly re-opened. Past\n // receipts are kept intact (never deleted), so #6's cross-conversation\n // records — and OTHER ordered cards in the same conversation — still\n // rehydrate to their receipts.\n // Is THIS checkout paid? Not \"has this product ever been bought\".\n //\n // The receipt used to be looked up by sku, which treats a product as a\n // purchase. It is not: opening a checkout for something you ordered last\n // week is a NEW order. With 42 of 44 products recorded, that lookup made\n // almost every card render as an already-paid receipt the moment it\n // self-healed — no payment involved — and hid the payment picker behind\n // a order that had happened days ago.\n //\n // So the question is answered by the checkout in hand: the pick we just\n // had open, for this same product, that was actually paid. A fresh open\n // replaces it with an unpaid one (below), which is what makes \"buy it\n // again\" resolve to the picker.\n const rehydratedReceipt =\n rehydrate && lastCheckout?.sku === product.sku && lastCheckout.ordered\n ? completedOrders.get(product.sku)\n : undefined;\n lastCheckout = {\n sku: product.sku,\n name: product.name,\n priceEur,\n quantity,\n imageUrl: product.imageUrl,\n externalShopify: product.source === 'shopify',\n // Preserve ordered only when rehydrating a paid pick; a fresh open is a\n // new, unpaid order (ordered stays falsy → the card shows the picker).\n ordered: rehydratedReceipt ? true : undefined,\n };\n saveCheckoutState(); // persist the new lastCheckout across processes\n const receipt = rehydratedReceipt;\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${product.name} (${priceEur}).` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `Checkout for ${product.name} (${priceEur}). Pick a payment method in the card — Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger), or a Payment Link (hosted page).`,\n },\n ],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'create_sinocare_payment_link') {\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const link = await backend<{ url: string; amountDisplay: string; name: string }>(\n '/checkout-link',\n {\n method: 'POST',\n // Paying from the wallet means the WALLET's owner is the buyer, so\n // the merchant records that email. Otherwise the order is filed under\n // SINOCARE_BUYER_EMAIL and never appears in the wallet's own 订单 —\n // \"我的订单\" is joined on the email the order was placed with.\n body: JSON.stringify({\n sku,\n quantity,\n ...(walletBuyer() ?? (BUYER ? { buyer: BUYER } : {})),\n }),\n },\n );\n return text({\n url: link.url,\n amountDisplay: link.amountDisplay,\n name: link.name,\n message: `Payment page for ${link.name} — open ${link.url} to pay (${link.amountDisplay}).`,\n });\n }\n\n if (req.params.name === 'curless_wallet_logout') {\n const who = wallet.current();\n await wallet.logout();\n // Drop the pending browser sign-in too, if one is mid-flight — otherwise\n // \"signed out\" would be followed by that login completing and silently\n // signing them back in.\n pending = null;\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n signedOut: true,\n was: who?.email ?? null,\n message: who ? `已退出 ${who.email}。` : '本来就没有登录。',\n }),\n },\n ],\n };\n }\n\n if (req.params.name === 'curless_wallet_login_status') {\n const who = wallet.current();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n who\n ? { signedIn: true, email: who.email, mode: who.mode, wallet: 'storefront' }\n : {\n signedIn: false,\n // Three answers, not two. \"waiting\" is a sign-in in flight,\n // \"expired\" is one that ran out, and neither is \"nobody\n // started one\" — which used to be reported as expired and\n // read back to the person as \"your code timed out\" when\n // they had never been given a code.\n waiting: Boolean(pending),\n expired: !pending && loginEverStarted,\n neverStarted: !pending && !loginEverStarted,\n // WHICH wallet. This storefront holds its own buyer session\n // for the in-card method; a separately-installed Curless\n // wallet connector holds a different one, and this tool can\n // say nothing about that. Reported as contradicting each\n // other otherwise — reasonably, since both were called \"the\n // wallet\".\n wallet: 'storefront',\n note: 'this is the session THIS storefront holds (the in-card wallet method). A separately-installed Curless wallet connector has its own session — ask that connector, not this tool.',\n },\n ),\n },\n ],\n };\n }\n\n // ACP, twice over: the agent mints the credential from ITS OWN Stripe key\n // (buy_sinocare_product_acp), or the buyer's Curless wallet mints it from the\n // card that buyer bound (buy_sinocare_product_wallet). Everything after the\n // credential — the session, the complete, the writeback — is identical, so\n // it is one handler: two code paths would drift, and the difference that\n // matters is only WHERE the token comes from and WHOSE limits applied.\n if (\n req.params.name === 'buy_sinocare_product_acp' ||\n req.params.name === 'buy_sinocare_product_wallet'\n ) {\n const viaWallet = req.params.name === 'buy_sinocare_product_wallet';\n // Check the signature BEFORE asking Sinocare to price anything. Opening a\n // checkout session we already know cannot be paid leaves the merchant an\n // order that will never complete, and shows the person a backend error\n // when the actual problem is that nobody signed in.\n if (viaWallet && !wallet.current()) {\n // Start the browser sign-in HERE, before Sinocare is asked to price\n // anything: a checkout session opened for someone who cannot pay is an\n // order the merchant will never see completed.\n //\n // JSON, not prose — the card renders `message` and the model reads\n // `next`. Prose fails the card's JSON.parse and gets shown to the person\n // verbatim, which is how an instruction meant for the model once ended\n // up on screen in English.\n const login = await pendingLogin();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '在浏览器里登录你的 Curless 钱包,登录完这张卡会自己接上。登录后就能用你自己绑的卡付款,并受你自己设的限额约束。',\n next: 'show the person the login link; the card polls on its own. Do NOT ask them for an email here — the sign-in happens in their browser.',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // 1. Sinocare prices the product + opens a merchant-quoted ACP session.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. Ask the buyer's wallet for a credential scoped to THIS order. The\n // session's real total has to come off the session itself — the backend\n // only hands back a display string (\"€1,920\"), and an SPT's cap is an\n // integer in minor units. No wallet configured → keep the card token.\n let token = PAYMENT_TOKEN;\n if (viaWallet) {\n // The buyer's wallet decides. It reads the same real total off the ACP\n // session, checks the limits THAT PERSON set, and mints against the card\n // THEY bound — so a refusal here is the buyer's own cap, not a payment\n // failure, and it is reported that way rather than retried around.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n let credential: PaymentCredential;\n try {\n credential = await wallet.payCredential({\n amount,\n currency,\n merchantRef: session.merchantId,\n });\n } catch (err) {\n // The checkout session stays open and unpaid, which is correct — the\n // person may raise their limit and pay it. Nothing was charged.\n return walletRefusal(err as Error);\n }\n token = credential.token;\n process.stderr.write(\n `sinocare-demo: wallet minted ${credential.token} for ${amount} ${currency}\\n`,\n );\n } else if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) {\n // Say so once, out loud: a silent fallback here looks identical to a\n // successful SPT payment from the outside (the seller mints its own pm_\n // either way), which is exactly how you end up believing you tested\n // something you didn't.\n process.stderr.write(\n 'sinocare-demo: paying ACP with the plain card token — set STRIPE_AGENT_SECRET_KEY and AGENTBANK_SELLER_PROFILE to mint a real SPT per order\\n',\n );\n } else {\n // Which fetch failed matters, and node's \"fetch failed\" hides the real\n // reason in .cause — without both you get a message that says nothing.\n let step = 'read session';\n try {\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n step = 'mint SPT';\n const minted = await mintSharedPaymentToken(amount, currency);\n if (minted) {\n token = minted;\n process.stderr.write(`sinocare-demo: minted ${minted} for ${amount} ${currency}\\n`);\n }\n } catch (err) {\n const e = err as Error & { cause?: { code?: string; message?: string } };\n const why = e.cause?.code ?? e.cause?.message ?? '';\n const what = `SPT FAILED at [${step}]: ${e.message}${why ? ` (cause: ${why})` : ''}`;\n // Strict by default. Configuring a wallet says you want a credential\n // bound to THIS seller, amount and expiry; quietly paying with an\n // unscoped card token instead is a downgrade, not graceful\n // degradation — and the order still succeeds, so nobody notices.\n if (!WALLET_FALLBACK_OK) {\n throw new Error(\n `${what} — refusing to fall back to an unscoped card token. Set SINOCARE_WALLET_FALLBACK=1 to allow that.`,\n );\n }\n process.stderr.write(`sinocare-demo: ${what} — falling back to ${PAYMENT_TOKEN}\\n`);\n }\n }\n // 3. This buyer agent completes the charge over ACP with that credential.\n const order = (await completeCheckout(acp(session.merchantId), session.sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n return finishOrder(sku, {\n ordered: order.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'acp',\n payer: viaWallet ? 'curless-wallet' : 'agent-key',\n status: order.status,\n // An ACP complete can omit order.id; fall back to the (always-present,\n // stable) checkout session id so the writeback always has a dedup key.\n orderId: order.order?.id ?? session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged (${order.status}).`,\n });\n }\n\n // ── mode 2 · step 1: open a checkout for a wallet this server cannot reach ──\n // ── UnionPay Agent Pay (UAAG) ─────────────────────────────\n //\n // ⚠️ THIS FLOW DOES NOT END IN A PAYMENT, AND SAYS SO.\n //\n // Every other rail here settles through the Curless gateway: we charge, we\n // capture, the ledger records it. UnionPay works the other way — UAAG\n // authenticates the cardholder and hands the AGENT a one-time token and a\n // DTVC. The MERCHANT charges it, and the credential is shaped like an\n // ordinary UnionPay card on purpose: token in the card-number field,\n // DTVC in the CVV2 field (dynamicDataType has one enum value,\n // DYNAMIC_CARD_SECURITY_CODE). So what the merchant needs is UnionPay\n // acceptance, not a special token capability. This demo's checkout has\n // no UnionPay acceptance, so the flow stops at the credential.\n\n //\n // Sinocare has no UnionPay acquiring, and neither do we. So the honest demo\n // runs the whole agentic half — identity, intent, cardholder\n // authentication, credential issuance — and stops where a real merchant\n // would take over. `ordered` is false and `settlement` says why, because a\n // result that mentioned neither would be read as a receipt.\n if (req.params.name === 'start_sinocare_uaag_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n // ⚠️ THE CARD ID IS NOT AN ARGUMENT A MODEL CAN INVENT.\n //\n // §4.3 and §4.4 both name the card, and UnionPay files a binding under\n // (agent, consumer identity) — get either half wrong and it is a 404 that\n // does not say which half. The only party that knows which cards this\n // buyer bound is the buyer's own wallet, so it is read from the session\n // here rather than accepted from the caller. Asking the model for a\n // `uaagcard_…` is asking it to guess a capability.\n if (!wallet.current()) {\n const login = await pendingLogin();\n return text({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '要用银联卡付款,得先登录你自己的 Curless 钱包 —— 卡绑在那里,只有它知道你绑了哪几张。',\n next: 'show the person this link and stop. Do not pay another way.',\n });\n }\n const { cards } = await wallet.unionPayCards();\n if (cards.length === 0) {\n return text({\n ordered: false,\n blocked: 'no_unionpay_card',\n message:\n '你的 Curless 钱包里还没有绑定的银联卡。绑卡在钱包连接器里做(wallet_bind_unionpay_card),不在这个店里 —— 银联要在他们自己的页面上收卡。',\n next: 'tell them to bind a UnionPay card in their wallet connector first. Do NOT retry this tool, and do NOT offer to take the card number here.',\n });\n }\n const named = typeof args.cardId === 'string' ? args.cardId : '';\n const card = named ? cards.find((c) => c.id === named) : cards[0];\n if (!card) {\n return text({\n ordered: false,\n blocked: 'unknown_card',\n message: `你的钱包里没有这张卡:${named}`,\n cards: cards.map((c) => ({ id: c.id, last4: c.panLastFour })),\n });\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n sku: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n\n // An ACP checkout session IS a payment intent — same id, by design — so\n // the UAAG calls hang off the session Sinocare just opened, without\n // inventing a second identifier for one order. The amount is read off it\n // and never named here: UnionPay shows the cardholder a number and asks\n // them to authorise THAT, so a total named twice can display one figure\n // and settle another.\n const me = await wallet.me();\n const [firstName, ...rest] = (me.name ?? 'Curless Buyer').trim().split(/\\s+/);\n const uaagOpts = { baseUrl: API_BASE, token: TOKEN };\n const unit = (session.amount / quantity / 100).toFixed(2);\n try {\n // ⚠️ Register the intent BEFORE asking to pay. Checkout refuses an\n // intent UnionPay never registered — this used to be skipped here, with\n // a comment saying it was needed, which is not the same as doing it.\n await uaagCreateIntent(uaagOpts, {\n paymentIntentId: session.sessionId,\n cardId: card.id,\n merchantName: 'Sinocare',\n merchantUrl: 'https://www.sinocare.com',\n items: [\n {\n itemName: session.name,\n itemDescription: session.name,\n itemUrl: `https://www.sinocare.com/products/${session.sku}`,\n itemUnitPrice: { amount: unit, currencyCode: session.currency },\n itemQuantity: String(quantity),\n },\n ],\n delivery: {\n firstName: firstName || 'Curless',\n lastName: rest.join(' ') || 'Buyer',\n emailAddress: me.email,\n // ⚠️ Required whenever anything ships, which is every item unless\n // the whole order is DIGITAL — the field table calls it conditional\n // and the condition is almost always true. Demo address: this shop\n // never collected one, and inventing a plausible-looking real\n // address would be worse than an obvious placeholder.\n deliveryAddress: {\n name: me.name ?? 'Curless Buyer',\n line1: '1 Demo Street',\n city: 'HongKong',\n state: 'HK',\n countryCode: 'HK',\n zip: '999077',\n },\n },\n });\n } catch (err) {\n const e = err as UaagError;\n return text({\n ordered: false,\n blocked: 'uaag_intent_refused',\n message: `银联没有接受这笔意图:${e.message}`,\n declined: e.declined ?? false,\n sessionId: session.sessionId,\n next: 'repeat what UnionPay said and stop. Do NOT retry, and do NOT pay another way without asking.',\n });\n }\n\n let checkout: Awaited<ReturnType<typeof uaagCheckout>>;\n try {\n checkout = await uaagCheckout(uaagOpts, {\n paymentIntentId: session.sessionId,\n cardId: card.id,\n });\n } catch (err) {\n const e = err as UaagError;\n return text({\n ordered: false,\n blocked: 'uaag_checkout_refused',\n message: `银联收银台没能开:${e.message}`,\n declined: e.declined ?? false,\n sessionId: session.sessionId,\n next: 'repeat what UnionPay said and stop.',\n });\n }\n\n return text({\n // Never true on this path. UnionPay issues a credential; the merchant\n // charges it, and Sinocare cannot.\n ordered: false,\n awaitingPayment: true,\n message:\n '银联收银台已开好。在浏览器里完成 3DS / Passkey 认证后,银联会向我们回调一次性支付凭证。',\n checkoutUrl: checkout.upi.checkoutUrl ?? null,\n srcCorrelationId: checkout.srcCorrelationId,\n paymentIntentId: session.sessionId,\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n card: { id: card.id, last4: card.panLastFour },\n product: session.name,\n total: session.amountDisplay,\n // ⚠️ The honest ending, as data rather than prose — so the card and the\n // model both get it instead of one of them inferring a sale.\n settlement: {\n settled: false,\n by: 'merchant',\n reason:\n 'UnionPay 把一次性支付凭证交给 Agent,由商户的收单机构扣款。三诺没有银联收单,所以这笔不会被扣款,也不会生成订单。',\n },\n next: 'show the person the checkoutUrl. When they say they are done, call get_sinocare_uaag_status with this paymentIntentId — this server is never told when they finish. Do NOT claim the order was placed, and do NOT fall back to another rail without asking.',\n });\n }\n\n // ⚠️ THE OTHER HALF. Without this, start_sinocare_uaag_handoff is a dead\n // end: it hands over a URL and the credential arrives later, on a callback\n // to the gateway that this storefront never sees.\n if (req.params.name === 'get_sinocare_uaag_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const paymentIntentId = String(args.paymentIntentId ?? '');\n if (!paymentIntentId) {\n return text({ error: 'paymentIntentId is required (from start_sinocare_uaag_handoff)' });\n }\n const state = await uaagCheckoutState({ baseUrl: API_BASE, token: TOKEN }, paymentIntentId);\n return text({\n // ⚠️ `issued` is not `paid`, and the two are one word apart in every\n // language this will be read in. A credential exists; nobody charged it.\n issued: state.issued,\n ordered: false,\n paid: false,\n paymentIntentId,\n credential: state.credential ?? null,\n issuedAt: state.issuedAt ?? null,\n paymentIntentStatus: state.paymentIntentStatus,\n message: state.issued\n ? '银联已经签发了一次性支付凭证(令牌 + DTVC)。到此为止 —— 三诺没有银联收单,这笔不会被扣款。'\n : '还没有。持卡人还没在银联页面上完成认证,或者刚完成、回调还没到。',\n next: state.issued\n ? 'say plainly that UnionPay issued the credential and the demo stops there — nothing was charged and no order exists. Do NOT call it paid.'\n : 'tell them it is not done yet and let them finish on UnionPay’s page. Do not retry in a tight loop.',\n });\n }\n\n if (req.params.name === 'start_sinocare_wallet_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // The authoritative total, off the session — the backend's amountDisplay\n // is a string for a human (\"€1,920\") and a credential is capped by an\n // integer in minor units.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n return text({\n // This OPENED a checkout; it did not pay for one. Said explicitly\n // because a result that mentions neither used to render as a receipt.\n ordered: false,\n awaitingPayment: true,\n message: '结账已开好。接下来在你自己的 Curless 钱包连接器里铸一张凭据,再回来完成付款。',\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n amount,\n currency,\n product: session.name,\n total: session.amountDisplay,\n // Spells out the sign-in step. Without it the model calls\n // wallet_pay_credential, gets \"nobody is signed in\", and has to invent\n // what to do next — which is how a order the person asked to pay\n // from their own wallet ends up settled some other way.\n next: `on the Curless wallet connector: if nobody is signed in, call wallet_login FIRST, show the person the link it returns, and wait until they say they have finished in their browser. Then wallet_pay_credential({ amount: ${amount}, currency: \"${currency}\", merchantRef: \"${session.merchantId}\" }), then pay_sinocare_with_token({ sessionId: \"${session.sessionId}\", merchantId: \"${session.merchantId}\", token }). If the wallet still refuses, STOP and tell the person what it said — do not pay this another way.`,\n });\n }\n\n // ── mode 2 · step 2: the merchant completes, with its own key ──\n if (req.params.name === 'pay_sinocare_with_token') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const token = String(args.token ?? '');\n const merchantId = String(args.merchantId ?? '');\n if (!sessionId || !token || !merchantId) {\n return text({ error: 'pay_sinocare_with_token needs sessionId, merchantId and token' });\n }\n // What this checkout was for comes off the checkout, not out of this\n // process's memory — the confirmation can arrive in a different one.\n const bought = purchaseOf(await readCheckoutSession(acp(merchantId), sessionId));\n const order = (await completeCheckout(acp(merchantId), sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n const ordered = order.status === 'completed';\n // Same exit as the other ten order paths. Returning a bare result here\n // is what let someone pay the same holiday three times: the card had no\n // idea it had been bought, so it rehydrated to the picker.\n return finishOrder(bought?.sku ?? '', {\n ordered,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (separate connector)',\n status: order.status,\n orderId: order.order?.id ?? sessionId,\n message: `Checkout ${sessionId} completed with the credential the wallet minted (${order.status}).`,\n });\n }\n\n // ── mode 3: hand the person a link and let them approve in a browser ──\n if (req.params.name === 'pay_sinocare_hosted') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n return text({\n ordered: false,\n awaitingPayment: true,\n message: '在浏览器里打开这个链接,看清金额再批准。这里还没有扣任何款。',\n payUrl: `${WALLET_BASE}/buyer/pay?session=${encodeURIComponent(session.sessionId)}`,\n sessionId: session.sessionId,\n product: session.name,\n total: session.amountDisplay,\n // Say plainly that nothing has been paid yet. A tool that returns a\n // link and a product name reads like a receipt if it does not.\n paid: false,\n merchantId: session.merchantId,\n next: 'show the person this link. Nothing has been charged yet — they approve it in their browser. Then call get_sinocare_order_status with this sessionId.',\n });\n }\n\n if (req.params.name === 'get_sinocare_order_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const merchantId = String(args.merchantId ?? '');\n const session = await readCheckoutSession(acp(merchantId), sessionId);\n const paid = session.status === 'completed';\n const bought = purchaseOf(session);\n // The approval happened in a browser, so THIS is the only moment the demo\n // learns of it. Record the order here or it is never recorded at all.\n return finishOrder(paid ? (bought?.sku ?? '') : '', {\n ordered: paid,\n paid,\n sessionId,\n status: session.status,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (hosted approval)',\n orderId: sessionId,\n message: paid\n ? 'Paid — the buyer approved it in their browser.'\n : 'Not paid yet. They have not finished approving it.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_ucp') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const pay =\n args.pay === 'usdc'\n ? 'usdc'\n : args.pay === 'usdc-sol'\n ? 'usdc-sol'\n : args.pay === 'rlusd'\n ? 'rlusd'\n : 'card';\n\n // USDC path: the merchant quotes the UCP session in USDC (a small test\n // charge); the gateway freezes an x402 challenge on it, and this buyer pays\n // with an X-PAYMENT (EIP-3009) at /complete — settled over the stablecoin\n // rail, same money-movement as buy_sinocare_product_x402 but via a UCP\n // session (one protocol, two payment methods).\n if (pay === 'usdc') {\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: X402PaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'usdc', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC UCP session missing its x402 requirements');\n\n // Pre-flight balance check (skipped in throwaway-key / STUB mode).\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the frozen challenge, then complete the UCP session with an\n // X-PAYMENT header — the gateway settles it over the stablecoin rail.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization: 'x402 EIP-3009 (signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC (x402) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // USDC-on-Solana path: the merchant quotes the UCP session in USDC on Solana;\n // the gateway freezes an SVM x402 challenge on it, and this buyer PARTIALLY\n // signs an SPL transfer (facilitator co-signs feePayer + submits) at /complete —\n // same UCP wire as the EVM USDC path, only the chain flips. Proves \"UCP supports\n // x402\" is chain-agnostic.\n if (pay === 'usdc-sol') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key holding USDC) to pay USDC-on-Solana over UCP',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: SolanaX402Requirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity,\n pay: 'usdc-sol',\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC-Solana UCP session missing its x402 requirements');\n\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Partially sign the frozen SVM challenge, then complete the UCP session with\n // the X-PAYMENT — the gateway settles it over the stablecoin rail (x402.org).\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc-sol settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc-sol',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // RLUSD path: the merchant quotes the UCP session in RLUSD; the gateway\n // freezes an XRPL x402 challenge on it, and this buyer signs a standard XRPL\n // Payment (Ed25519, no gas — buyer pays the tiny XRPL fee) which the self-\n // hosted facilitator submits on-ledger. Same money-movement as\n // buy_sinocare_product_rlusd, but over a UCP session — the SAME UCP wire the\n // card/USDC paths use, only the currency flips the chain to the XRP Ledger.\n if (pay === 'rlusd') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: XrplPaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'rlusd', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('RLUSD UCP session missing its x402 requirements');\n\n // One XRPL connection for the balance pre-flight AND the signing autofill\n // (same as buy_sinocare_product_rlusd): sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Complete the UCP session with the signed XRPL Payment as an X-PAYMENT —\n // the gateway settles it over the stablecoin rail (XRPL facilitator).\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': preflight.xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'rlusd',\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 XRPL Payment (Ed25519, signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via UCP + RLUSD (x402 on the XRP Ledger) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // CARD path (default).\n // 1. Sinocare prices the product + opens a merchant-quoted UCP session,\n // returning a merchant-signed AP2 CartMandate for it.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n cartMandate: { cartHash: string };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. This buyer agent authorizes payment with an AP2 PaymentMandate — a\n // real ES256 JWS bound to the cart's hash (UCP AP2 Mandates extension).\n // Programmatic completion, no human trusted-UI handoff; the gateway\n // cryptographically verifies the mandate, then settles on the card rail.\n const paymentMandate = await signPaymentMandate({\n cartHash: session.cartMandate.cartHash,\n method: { handler: 'card', type: 'card', credential: PAYMENT_TOKEN },\n amount: session.amount,\n currency: session.currency,\n });\n // Attach the standing authorization if one is active — the gateway then\n // checks this order is within the user's delegated cap. Drop it if expired.\n const mandate: { payment_mandate: typeof paymentMandate; intent_mandate?: Ap2IntentMandate } =\n { payment_mandate: paymentMandate };\n let underAuthorization = false;\n if (agentBudget) {\n if (Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null; // expired — buy normally (no standing auth)\n saveBudget(null);\n } else {\n mandate.intent_mandate = agentBudget.mandate;\n underAuthorization = true;\n }\n }\n const url = `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ payment: { mandate } }),\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n // A standing-authorization rejection (over cap / expired) → a clean,\n // explanatory result instead of a raw error, so the agent can react.\n if (\n underAuthorization &&\n /intent mandate rejected|exceeds_intent_max_amount|intent_mandate_expired/.test(errText)\n ) {\n return text({\n ordered: false,\n blockedBy: 'standing-authorization',\n product: session.name,\n total: session.amountDisplay,\n authorizedCap: `€${agentBudget?.maxAmountEur.toLocaleString('en-IE')}`,\n message: `Blocked: ${session.name} (${session.amountDisplay}) is over your standing authorization (cap €${agentBudget?.maxAmountEur}, or it expired). Raise it with authorize_agent_budget, or book a cheaper product.`,\n });\n }\n throw new Error(`ucp complete -> ${res.status}: ${errText}`);\n }\n const out = (await res.json()) as { status?: string; id?: string };\n return finishOrder(sku, {\n ordered: out.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n // The payment was ALWAYS authorized by a signed AP2 PaymentMandate — this\n // says so explicitly so it can't be misread as \"unauthorized\".\n paymentAuthorization: 'AP2 PaymentMandate (signed + verified)',\n // The OPTIONAL standing budget (authorize_agent_budget): applied here, or\n // not set for this order. \"not set\" ≠ unauthorized — see above.\n standingBudget: underAuthorization\n ? `applied (within your €${agentBudget?.maxAmountEur} cap, no per-order confirm)`\n : 'not set',\n status: out.status,\n orderId: out.id,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged via UCP + AP2 PaymentMandate (${out.status})${underAuthorization ? ` — under your standing €${agentBudget?.maxAmountEur} authorization, no per-order confirm` : ''}.`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_x402') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n\n // Solana path (chain=solana): USDC over Solana (SVM). The merchant quotes a\n // Solana USDC session; this buyer builds + PARTIALLY signs an SPL transfer,\n // the x402.org facilitator co-signs as feePayer + sponsors the fee + submits.\n // Same merchant-quoted session shape as the EVM/USDC path, only the chain flips.\n if (args.chain === 'solana') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key — solana-keygen JSON array or base58 — holding devnet USDC) to pay USDC-on-Solana orders',\n },\n ],\n isError: true,\n };\n }\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: SolanaX402Requirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'USDC', chain: 'solana' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant Solana USDC session missing payment requirements');\n\n // Balance pre-flight (skip on RPC error) against the merchant's quote.\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Sign the frozen quote (facilitator sponsors the fee), then pay { sessionId }.\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`solana x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n const cluster = reqs.network === 'solana-devnet' ? '?cluster=devnet' : '';\n // finishOrder (not text) so a Solana order is recorded like every other\n // rail — the card rehydrates to a receipt on reload instead of the picker.\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits + sponsors gas)',\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash\n ? `https://explorer.solana.com/tx/${paid.txHash}${cluster}`\n : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 · USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted x402 session — IT sets the USDC\n // price (the gateway has no Sinocare catalog). We just pay it; we never\n // compute or pass the amount. Same shape as the ACP `/checkout-acp` flow.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: X402PaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant x402 session missing payment requirements');\n\n // Pre-flight: a real payer key + a real facilitator + an empty wallet = a\n // cryptic on-chain decline. Check the balance first (skipped in throwaway-\n // key / STUB mode) against the MERCHANT's quoted amount.\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com (20 USDC / 2h) and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the merchant's frozen quote, then pay the session — the amount is\n // set by the merchant; we just reference { sessionId }.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 (merchant-quoted) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'x402_buyer_wallet') {\n const buyer = await buyerSigner();\n if (!buyer) {\n return text({\n configured: false,\n message:\n 'No buyer signer configured — x402 signs with a throwaway, unfunded key (only settles under a STUB facilitator). Set X402_SIGNER=cdp (+ CDP_API_KEY_ID/_SECRET/_WALLET_SECRET) for a CDP Server Wallet, or X402_PAYER_PRIVATE_KEY for a local key, to pay real testnet/mainnet USDC.',\n });\n }\n const [sepolia, mainnet] = await Promise.all([\n usdcBalance({ network: 'base-sepolia', owner: buyer.address }),\n usdcBalance({ network: 'base', owner: buyer.address }),\n ]);\n return text({\n address: buyer.address,\n balances: { 'base-sepolia': fmtUsdc(sepolia), base: fmtUsdc(mainnet) },\n faucet: 'https://faucet.circle.com (Base Sepolia USDC — 20 / 2h per address)',\n note: 'Fund this address with USDC to pay for x402 orders. Testnet: use the faucet. Mainnet: send real USDC on Base.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_rlusd') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted RLUSD session — IT sets the price\n // (the gateway holds no Sinocare catalog). We just pay it. Same shape as the\n // USDC x402 flow, only `currency: 'RLUSD'` flips the chain to the XRP Ledger.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: XrplPaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'RLUSD' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant RLUSD session missing payment requirements');\n\n // One XRPL connection for both the balance pre-flight AND the signing\n // autofill. Pre-flight catches an unfunded / trust-line-less wallet before\n // we bother signing; on enough balance we sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Pay the session (amount is merchant-set; we just reference { sessionId }).\n const xPayment = preflight.xPayment;\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash ? `https://testnet.xrpl.org/transactions/${paid.txHash}` : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via x402 on the XRP Ledger to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_skyfire') {\n if (!SKYFIRE_BUYER_API_KEY || !SKYFIRE_SELLER_SERVICE_ID) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID to mint a Skyfire pay token (the merchant backend charges it via the merchant SDK)',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // The BUYER mints a Skyfire-signed PAY token (Skyfire's key signs it — the\n // buyer can't self-sign), then presents it to the MERCHANT backend, which\n // charges it via the merchant SDK (checkout.chargeSkyfire → the gateway\n // verifies it against Skyfire's live JWKS and records/settles). Three-layer:\n // buyer mints, merchant charges — the demo never calls the gateway directly.\n const token = await mintSkyfirePayToken(SKYFIRE_TEST_AMOUNT);\n const out = await backend<{\n agent?: { verified?: boolean; subject?: string };\n paymentIntentId?: string;\n status?: string;\n currency?: string;\n amount?: number;\n // True when a seller-charge redeemed the token (real USDC moved); false =\n // verified + recorded ('initiated', no money).\n settled?: boolean;\n }>('/checkout-skyfire', { method: 'POST', body: JSON.stringify({ sku, token }) });\n const amountStr =\n out.amount != null && out.currency\n ? `${(out.amount / 1e6).toFixed(6)} ${out.currency}`\n : `~${SKYFIRE_TEST_AMOUNT} USD`;\n const status = out.status ?? 'initiated';\n const captured = out.settled === true || status === 'captured';\n // Two terminal states, both a successful order: CAPTURED (seller-charge\n // configured → real USDC moved) vs VERIFIED+RECORDED (no seller key → PI\n // initiated, no money moved).\n const message = captured\n ? `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} charged (Skyfire redeemed the PAY token buyer → seller) and the payment intent is captured (PI ${status}). agentbank verified the agent + payment authorization against Skyfire's live JWKS, then settled it via Skyfire seller-charge.`\n : `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} verified against Skyfire's live JWKS + recorded (PI ${status}). agentbank verified the agent + payment authorization and recorded it; no seller key is configured, so it did not auto-capture and no money moved.`;\n return finishOrder(sku, {\n ordered: out.agent?.verified === true,\n product: productName,\n quantity,\n protocol: 'skyfire',\n payer: 'skyfire buyer token',\n paidUsdc: captured\n ? `${amountStr} (Skyfire KYAPay — charged, captured)`\n : `${amountStr} (Skyfire KYAPay authorization, recorded)`,\n buyerAgent: out.agent?.subject,\n paymentAuthorization:\n 'Skyfire KYAPay PAY token (Skyfire ES256-signed, verified against the live JWKS)',\n status,\n orderId: out.paymentIntentId,\n message,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_mpp') {\n if (!TEMPO_BUYER_PRIVATE_KEY) {\n return {\n content: [\n {\n type: 'text',\n text: 'set TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key) to pay via MPP · Tempo',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // Three-layer MPP · Tempo — the demo talks only to the MERCHANT backend,\n // which mediates the HTTP-402 dance via the merchant SDK (checkout.openMPP):\n // 1. ask the backend to open the charge → it returns the 402 challenge;\n // 2. the buyer pays it on Tempo (SDK @curless/agentbank-protocols/tempo);\n // 3. hand the credential back to the backend → it settles.\n const opened = await backend<{ status: string; wwwAuthenticate?: string }>('/checkout-mpp', {\n method: 'POST',\n body: JSON.stringify({ sku }),\n });\n if (opened.status !== 'payment_required' || !opened.wwwAuthenticate) {\n throw new Error(`mpp open expected a challenge, got ${JSON.stringify(opened)}`);\n }\n const { credential, txHash } = await payMppTempoChallenge({\n wwwAuthenticate: opened.wwwAuthenticate,\n privateKey: TEMPO_BUYER_PRIVATE_KEY,\n rpcUrl: TEMPO_RPC,\n }).catch((e: unknown) => {\n throw new Error(\n `mpp tempo pay failed (${(e as Error).message}) — is the gateway's TEMPO_RECIPIENT set + the buyer wallet funded?`,\n );\n });\n const out = await backend<{\n status?: string;\n paymentIntentId?: string;\n amount?: number;\n currency?: string;\n }>('/checkout-mpp', { method: 'POST', body: JSON.stringify({ sku, credential }) });\n const paidStr = `${(MPP_TEMPO_TEST_AMOUNT / 1e6).toFixed(6)} pathUSD (Tempo TIP-20, on-chain)`;\n const settled = out.status === 'settled';\n return finishOrder(sku, {\n ordered: settled,\n product: productName,\n quantity,\n protocol: 'mpp',\n payer: 'buyer chain wallet (MPP·Tempo)',\n total: paidStr,\n paidUsdc: paidStr,\n status: settled ? 'captured' : out.status,\n orderId: out.paymentIntentId,\n txHash,\n message: `Ordered ${productName} × ${quantity} via MPP · Tempo — paid ${paidStr} to Sinocare on the Tempo chain (tx ${txHash.slice(0, 14)}…). The merchant backend issued the HTTP-402 challenge (via the merchant SDK) and, after the buyer paid on-chain, VERIFIED the TIP-20 transfer by hash — capturing the payment intent${out.paymentIntentId ? ` (PI ${out.paymentIntentId})` : ''}.`,\n });\n }\n\n if (req.params.name === 'xrpl_buyer_wallet') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return text({\n configured: false,\n message:\n 'No XRPL buyer wallet — set XRPL_BUYER_SEED (an sEd… testnet seed) to pay RLUSD orders. Fund it with testnet RLUSD (a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve.',\n });\n }\n const issuer = process.env.XRPL_RLUSD_ISSUER ?? 'rQhWct2fv4Vc4KRjRgMrxa8xPN9Zx9iLKV';\n const RLUSD_HEX = '524C555344000000000000000000000000000000';\n const have = await withXrplClient((client) =>\n rlusdBalance(client, wallet.classicAddress, RLUSD_HEX, issuer),\n );\n return text({\n address: wallet.classicAddress,\n network: 'xrpl:1 (testnet)',\n rlusd: `${have} RLUSD`,\n issuer,\n explorer: `https://testnet.xrpl.org/accounts/${wallet.classicAddress}`,\n note: 'Fund this address with testnet RLUSD (needs a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve to pay RLUSD orders.',\n });\n }\n\n if (req.params.name === 'list_my_orders') {\n // The merchant backend lists its orders (single-merchant demo = my orders).\n const { orders } = await backend<{\n orders: Array<{\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt: string;\n // Set when a refund has already been asked for on this order.\n refundRequest?: { id: string; status: string } | null;\n }>;\n }>('/orders');\n // Shared with the wallet connector: the currency scaling (a 50000 RLUSD\n // order is 0.05, not 500 — the amount is minor units at the CURRENCY's\n // own scale) and the rule that a pending refund request outranks the\n // payment status, because this list is where the buyer decides whether to\n // ask, and `paid` beside a live 申请退款 button invites a second request.\n const view = ordersView(orders);\n // Render the orders CARD (structuredContent + _meta), not a plain JSON table —\n // the card lists each order with a 申请退款 button.\n return {\n content: [\n {\n type: 'text' as const,\n text: orders.length\n ? `You have ${orders.length} Sinocare order(s) — shown in the card (each settled one has a 申请退款 button).`\n : 'No Sinocare orders yet.',\n },\n ],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'request_refund') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const orderId = String(args.orderId ?? '');\n if (!orderId) throw new Error('orderId is required (from list_my_orders)');\n // The BUYER asks the gateway directly (its own agent token) — the merchant\n // then approves/rejects from its MCP. Money moves only on approval+Curless.\n const res = await fetch(`${API_BASE}/v1/refund-requests`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ orderId, reason: args.reason ? String(args.reason) : undefined }),\n });\n const out = (await res.json()) as {\n refundRequest?: { id: string; status: string };\n error?: { message?: string; type?: string } | string;\n message?: string;\n };\n if (!res.ok) {\n // The gateway's typed errors carry a message written for a human (\"this\n // order has already been refunded\", \"already has an open refund\n // request\"). Surface THAT — a raw JSON dump of the envelope is what the\n // buyer used to get, which tells them nothing about what to do next.\n const detail =\n (typeof out.error === 'object' && out.error?.message) ||\n (typeof out.error === 'string' ? out.error : '') ||\n out.message ||\n `HTTP ${res.status}`;\n throw new Error(String(detail));\n }\n return text({\n requested: true,\n refundRequestId: out.refundRequest?.id,\n status: out.refundRequest?.status,\n message: `Refund requested for ${orderId}. Sinocare will review and approve or reject it.`,\n });\n }\n\n if (req.params.name === 'authorize_agent_budget') {\n const maxAmountEur = Number(args.maxAmountEur);\n if (!Number.isFinite(maxAmountEur) || maxAmountEur <= 0) {\n throw new Error('maxAmountEur must be a positive number (EUR)');\n }\n const hours = Math.max(1, Math.floor(Number(args.hours) || 24));\n const expiresAt = new Date(Date.now() + hours * 3_600_000).toISOString();\n const maxAmount = Math.round(maxAmountEur * 100); // EUR minor units (cents)\n // The user signs the delegation as a real AP2 IntentMandate (ES256 JWS).\n const mandate = await signIntentMandate({\n prompt: `Autonomous Sinocare order — up to €${maxAmountEur} for ${hours}h`,\n constraints: { maxAmount },\n expiresAt,\n });\n agentBudget = { mandate, maxAmountEur, expiresAt };\n saveBudget(agentBudget); // survive a process restart\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt,\n message: `Agent authorized to buy from Sinocare up to €${maxAmountEur} per order until ${expiresAt}. It can now complete UCP purchases under that cap without asking you to confirm each one; over-cap or expired purchases are rejected by the gateway.`,\n });\n }\n\n if (req.params.name === 'agent_budget_status') {\n if (!agentBudget || Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null;\n saveBudget(null);\n return text({\n authorized: false,\n message: 'No active order authorization — use authorize_agent_budget to delegate one.',\n });\n }\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${agentBudget.maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt: agentBudget.expiresAt,\n });\n }\n\n if (req.params.name === 'revoke_agent_budget') {\n const had = agentBudget !== null;\n agentBudget = null;\n saveBudget(null);\n return text({\n revoked: had,\n message: had\n ? 'Purchase authorization revoked — the agent needs a fresh one to buy autonomously.'\n : 'No authorization was set.',\n });\n }\n\n return { content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }], isError: true };\n } catch (err) {\n return { content: [{ type: 'text', text: `Error: ${(err as Error).message}` }], isError: true };\n }\n});\n\nawait server.connect(new StdioServerTransport());\n","/**\n * The Sinocare catalogue, as both storefronts read it.\n *\n * The aisles were written out four times — twice in a tool's `enum`, twice in a\n * filter — and adding `analyzer` fixed two of the four. The shop then answered\n * \"analyzer\" with the whole catalogue on one storefront and with the right two\n * products on the other, which reads as a bug in the catalogue rather than in\n * the two lists that had drifted apart.\n */\n\n/**\n * The aisles a product can be in. ONE list: the tool schemas and the filters\n * are all built from it, so a new aisle cannot be half-added.\n */\nexport const CATEGORIES = ['meter', 'cgm', 'analyzer', 'strips', 'lancets', 'accessory'] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\nexport const isCategory = (value: unknown): value is Category =>\n typeof value === 'string' && (CATEGORIES as readonly string[]).includes(value);\n\n/**\n * A product as the merchant backend spells it.\n *\n * These field names are the MERCHANT's, not ours. A card that renamed\n * `priceDisplay` to `priceEur` on the way through rendered a product with no\n * price at all — and a checkout that does not show what it costs is the one\n * thing it must never be.\n */\nexport type Product = {\n sku: string;\n name: string;\n category?: string;\n price?: number;\n currency?: string;\n priceDisplay?: string;\n description?: string;\n imageUrl?: string;\n source?: string;\n};\n\n/** The `category` property, for a tool's inputSchema. Built from CATEGORIES. */\nexport const categoryProperty = {\n type: 'string',\n enum: [...CATEGORIES],\n description: 'narrow to one aisle',\n} as const;\n\n/**\n * Narrow a catalogue to one aisle.\n *\n * An UNKNOWN category returns everything. A shop that answers a typo with \"no\n * products\" reads as an empty shop, and the person cannot tell the difference\n * between \"we do not sell that\" and \"you spelled it wrong\".\n */\nexport const filterByCategory = <T extends { category?: unknown }>(\n items: readonly T[],\n raw: unknown,\n): T[] => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n if (!isCategory(wanted)) return [...items];\n return items.filter((item) => String(item.category ?? '') === wanted);\n};\n\n/** The `?category=` a backend catalogue call should carry, or '' for all of it. */\nexport const categoryQuery = (raw: unknown): string => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n return isCategory(wanted) ? `?category=${encodeURIComponent(wanted)}` : '';\n};\n\n/** What a product costs, as a person reads it. */\nexport const priceDisplayOf = (product: Product): string =>\n product.priceDisplay ?? `€${((product.price ?? 0) / 100).toLocaleString('en-IE')}`;\n\n/**\n * Minor units at the CURRENCY's own scale — 2 for fiat, 6 for the stablecoins\n * this gateway settles. Dividing everything by 100 turns a 50000 RLUSD order\n * into 500 instead of 0.05, which is the same mistake in the direction that\n * costs the most.\n */\nconst decimals = (currency: string): number =>\n ['USDC', 'RLUSD', 'USDT'].includes(currency.toUpperCase()) ? 6 : 2;\n\n/** An amount in minor units, as a person reads it. */\nexport const formatMinor = (amount: number, currency: string): string => {\n const dp = decimals(currency);\n return `${(amount / 10 ** dp).toLocaleString('en-IE', { maximumFractionDigits: dp })} ${currency}`;\n};\n\n/**\n * Which product someone meant.\n *\n * ⚠️ An ambiguous name is NEVER guessed. \"Safe-Accu\" and \"Safe-Accu2\" differ by\n * one character, and every caller of this ends in a checkout — one of them in a\n * charge. Taking the first of several matches is how the wrong box of strips\n * gets paid for, so several matches is an answer ('ambiguous') with the\n * candidates attached, not a pick.\n *\n * In order: the exact sku, then an exact name, then the only product where what\n * was typed ends on a WORD BOUNDARY, then the only product that contains it at\n * all.\n *\n * That third step is what makes \"Safe-Accu\" answerable in a catalogue that also\n * sells \"Safe-Accu2\": the query is a whole token of the first name and only\n * part of a token in the second, so this is a distinction, not a coin toss.\n * Without it the one product name the instructions tell the model to try came\n * back as \"matches 2 products — say which one\".\n */\nexport type ProductMatch =\n | { kind: 'found'; product: Product }\n | { kind: 'ambiguous'; candidates: Product[] }\n | { kind: 'none' };\n\nexport const resolveProduct = (\n items: readonly Product[],\n query: { sku?: unknown; query?: unknown },\n): ProductMatch => {\n const sku = String(query.sku ?? '').trim();\n if (sku) {\n const bySku = items.find((it) => it.sku.toLowerCase() === sku.toLowerCase());\n if (bySku) return { kind: 'found', product: bySku };\n }\n // A sku that matched nothing may still be a NAME — hosts and people both pass\n // one in the `sku` field, and refusing to look would answer \"no such product\"\n // for something on the shelf.\n const typed = (sku || String(query.query ?? '')).trim().toLowerCase();\n if (!typed) return { kind: 'none' };\n\n const exact = items.filter((it) => it.name.trim().toLowerCase() === typed);\n if (exact.length === 1 && exact[0]) return { kind: 'found', product: exact[0] };\n\n const partial = items.filter((it) => it.name.toLowerCase().includes(typed));\n if (partial.length === 1 && partial[0]) return { kind: 'found', product: partial[0] };\n if (!partial.length) return { kind: 'none' };\n\n // Does what was typed END a word in this name? \"safe-accu\" does in \"Safe-Accu\n // Blood Glucose…\" (a space follows) and does not in \"Safe-Accu2 …\" (a digit\n // does).\n const onWordBoundary = partial.filter((it) => {\n const name = it.name.toLowerCase();\n let at = name.indexOf(typed);\n while (at !== -1) {\n const after = name[at + typed.length];\n if (after === undefined || !/[a-z0-9]/.test(after)) return true;\n at = name.indexOf(typed, at + 1);\n }\n return false;\n });\n if (onWordBoundary.length === 1 && onWordBoundary[0]) {\n return { kind: 'found', product: onWordBoundary[0] };\n }\n return { kind: 'ambiguous', candidates: partial };\n};\n","/**\n * What a storefront has to say about its checkout card, and to two different\n * hosts at once.\n *\n * Both storefronts serve the same card under their own `ui://` uri, and both\n * had their own copy of this metadata. The copies drifted in the two places\n * that fail SILENTLY — the image allow-list and the ChatGPT keys — so one shop\n * showed photos and the other showed nothing, with no error anywhere.\n */\n\n/**\n * ⚠️ `text/html;profile=mcp-app`.\n *\n * `text/html+skybridge` is a plausible near-miss that fails silently: the host\n * stops recognising the resource as a card and answers \"there was a problem\n * displaying content\".\n */\nexport const CARD_MIME = 'text/html;profile=mcp-app';\n\n/**\n * WHERE THE CARD MAY LOAD IMAGES FROM.\n *\n * ⚠️ An MCP App runs in a sandboxed iframe and the spec is explicit: an empty\n * or omitted `resourceDomains` means NO network resources. Every product photo\n * is then blocked before it leaves the starting line — not by the CDN, not by\n * the markup — and the grid renders as broken-image icons. That exact omission\n * cost three rounds of \"the pictures still aren't showing\" on the moody\n * storefront, chased through theories about the CDN, and then cost it again\n * here because the fix landed in one storefront's copy.\n *\n * The catalogue is served from a Shopify store, and Shopify re-hosts whatever\n * image a product was created with, so the photos come off Shopify's CDN.\n */\nexport const IMAGE_ORIGINS = ['https://cdn.shopify.com'];\n\n/**\n * \"This tool's result is renderable by that card.\"\n *\n * ⚠️ Declare it ONLY on tools whose result the card can actually draw.\n * Blanket-attaching it told the host that a product LIST renders the checkout\n * card: the host drew the card, the card got `{products:[…]}` with no view it\n * knew, and it sat on \"Loading…\" for ever — under a tool that had worked\n * perfectly and returned exactly what was asked for.\n *\n * Both host namespaces, because they read different ones: `ui.resourceUri` is\n * MCP Apps (Claude), `openai/outputTemplate` is ChatGPT's Apps SDK, and\n * `openai/widgetAccessible` is what lets the rendered card call back into these\n * tools — which is the entire interaction, so without it every click in the\n * card does nothing.\n */\nexport const uiMeta = (cardUri: string) => ({\n ui: { resourceUri: cardUri },\n 'ui/resourceUri': cardUri,\n 'openai/outputTemplate': cardUri,\n 'openai/widgetAccessible': true,\n});\n\n/**\n * The card resource's own metadata: what it may load, and (remote storefronts\n * only) the origin it is served from.\n *\n * `widgetDomain` is for a storefront that HAS a public origin. A stdio server\n * has none — passing its gateway URL there would name an origin the card is not\n * served from.\n */\nexport const widgetMeta = (opts: { widgetDomain?: string; imageOrigins?: string[] } = {}) => {\n const resourceDomains = opts.imageOrigins ?? IMAGE_ORIGINS;\n return {\n ui: { csp: { resourceDomains, connectDomains: [] } },\n 'openai/widgetCSP': { connect_domains: [], resource_domains: resourceDomains },\n ...(opts.widgetDomain ? { 'openai/widgetDomain': opts.widgetDomain } : {}),\n };\n};\n\n/**\n * Does this storefront serve the uri a host is asking for?\n *\n * ⚠️ ANY version of OUR card uri gets the CURRENT card.\n *\n * Versioning the uri busts host caches — that is why it is bumped. But a host\n * that cached an OLD uri keeps asking for it, and answering \"unknown resource\"\n * turns a merely stale card into a broken one: the host reports \"there was a\n * problem displaying content\" and there is nothing the person can do about it.\n * So the bump keeps its job (a new uri is a cache miss and fetches fresh) and\n * loses its sting (an old uri still gets a card).\n */\nexport const servesCardUri = (prefix: string, asked: string): boolean => asked.startsWith(prefix);\n","/**\n * WHAT THE CHECKOUT CARD IS HANDED, and what it may draw.\n *\n * The card used to know both shops: one copy hard-coded seven rails in a\n * `GROUPS` table, the other hard-coded three wallet rows in a `ROWS` table, and\n * each knew the tool names to call. A card that knows its shop is a card that\n * has to be forked per shop — which is how there came to be two of them.\n *\n * So the shop sends its own payment table and the card draws whatever arrives.\n * The card knows how a group, a row and an action LOOK; it does not know what\n * this shop sells or how it takes money.\n */\nimport type { Product } from './catalog.js';\n\n/** One clickable thing in a payment row — a tool call, or a link out. */\nexport type CheckoutAction = {\n label: string;\n /** The tool this button calls. It must be a tool of THIS server. */\n tool: string;\n /** Merged over `{sku, quantity}` when the button is pressed. */\n args?: Record<string, unknown>;\n /** Opens a URL from the result rather than rendering a receipt. */\n ext?: boolean;\n /**\n * Finish this one in the CONVERSATION, not in the card.\n *\n * A widget may only call tools on the server that gave it —\n * `callServerTool` takes a tool name and no server — so a credential living\n * in a separately-installed wallet connector is out of reach. Dressed up as\n * a click-to-pay button it produced a card that opened a checkout, said\n * \"one step left\", and left the person with nothing to press.\n */\n chat?: boolean;\n};\n\n/**\n * One row of the picker.\n *\n * ONE consistent axis wherever money has a denomination: the title is WHAT you\n * pay and WHERE it settles, the actions are WHICH protocol carries it. A card\n * rail is the exception, and only because it has no coin/chain axis at all.\n */\nexport type CheckoutRow = {\n title: string;\n sub: string;\n actions: CheckoutAction[];\n};\n\nexport type CheckoutGroup = { label: string; rows: CheckoutRow[] };\n\n/** A settled order, as the card shows it back. */\nexport type CheckoutReceipt = {\n /** What ACTUALLY paid, as the SERVER reports it — never the button clicked. */\n payer?: string;\n total?: string;\n protocol?: string;\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\n\n/**\n * The checkout card's payload.\n *\n * ⚠️ `product` is nested, and its fields are the MERCHANT's own names. Copying\n * the price into a `priceEur` on the way through is what once rendered a\n * product with no price at all, and a checkout that does not show what it\n * costs is the one thing it must never be.\n */\nexport type CheckoutView = {\n view: 'checkout';\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity: number;\n groups: CheckoutGroup[];\n /**\n * Set ONLY when THIS checkout was paid — not when this product has ever been\n * bought. Looking it up by sku treats a product as a purchase: on an account\n * that had bought 42 of 44 products, almost every card rendered as an\n * already-paid receipt the moment it self-healed, hiding the payment options\n * behind an order from days earlier.\n */\n receipt?: CheckoutReceipt | null;\n /** Which language the card's own chrome speaks. Default English. */\n lang?: CardLang;\n};\n\nexport const checkoutView = (input: {\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity?: number;\n groups: CheckoutGroup[];\n receipt?: CheckoutReceipt | null;\n lang?: CardLang;\n}): CheckoutView => ({\n view: 'checkout',\n product: input.product,\n quantity: Math.max(input.quantity ?? 1, 1),\n groups: input.groups,\n receipt: input.receipt ?? null,\n ...(input.lang ? { lang: input.lang } : {}),\n});\n\n// ── the card's own words ─────────────────────────────────────────────────────\n/**\n * The strings the CARD owns, in the languages the two shops speak.\n *\n * Everything a SHOP says — group labels, row titles, button labels, every\n * `message` — comes from that shop over the wire, so the two keep their own\n * voice. These fifteen are the card's own furniture, and they are here rather\n * than in the widget because one widget source is built to one file: a card\n * that hard-coded them would have to be forked to speak the other language,\n * which is the fork this whole change removes.\n */\nexport type CardLang = 'en' | 'zh';\n\nexport type CardCopy = {\n loading: string;\n opening: string;\n /** `{method}` — the row the person clicked. */\n paying: string;\n emptyCatalog: string;\n noOrders: string;\n /** `{count}` — how many products are on the shelf. */\n productCount: string;\n /** `{product}` — what the receipt is for, when the server sent no message. */\n orderedFallback: string;\n /** `{product}` — the one sentence the card says on the person's behalf. */\n handOffAsk: string;\n back: string;\n orderAgain: string;\n viewOrders: string;\n ordered: string;\n notCompleted: string;\n oneStepLeft: string;\n signIn: string;\n signInGo: string;\n signInWait: string;\n /** `{email}` — who just finished signing in, while the payment goes through. */\n signedInPaying: string;\n signInExpired: string;\n /**\n * Never having started a sign-in is NOT a timeout. Telling someone their code\n * expired when they were never given one sends them looking for a mistake\n * they did not make.\n */\n signInNeverStarted: string;\n ordersFailed: string;\n walletSaidNo: string;\n openWallet: string;\n goPay: string;\n payWait: string;\n payTimeout: string;\n handedOver: string;\n handedOverBody: string;\n handedOverWait: string;\n refund: string;\n refunding: string;\n refundFailed: string;\n onChainTx: string;\n paidBy: string;\n cannotOpen: string;\n cardFailed: string;\n nothingToShow: string;\n nothingToShowBody: string;\n refresh: string;\n ordersTitle: string;\n};\n\nexport const CARD_COPY: Record<CardLang, CardCopy> = {\n en: {\n loading: 'Loading…',\n opening: 'Opening checkout…',\n paying: 'Paying via {method}…',\n emptyCatalog: 'Nothing in the catalog.',\n noOrders: 'No orders yet — pick something from the catalog first.',\n productCount: '{count} products',\n orderedFallback: 'Ordered {product}',\n handOffAsk: 'Buy {product} with Curless wallet',\n back: '← Choose another way',\n orderAgain: 'Order another',\n viewOrders: 'View my orders →',\n ordered: 'Ordered',\n notCompleted: 'Not completed',\n oneStepLeft: 'One step left',\n signIn: 'Sign in to Curless',\n signInGo: 'Sign in ↗',\n signInWait:\n 'This card reconnects on its own once you are in. Binding a card happens there too.',\n signedInPaying: 'Signed in as {email} — paying…',\n signInExpired: 'That sign-in timed out — start it again above.',\n signInNeverStarted: 'No sign-in started yet — use the link above.',\n ordersFailed: 'Could not load your orders.',\n walletSaidNo: 'Wallet said no',\n openWallet: 'Open wallet ↗',\n goPay: 'Go pay ↗',\n payWait: 'Approve it in your browser and this card turns into a receipt on its own.',\n payTimeout: 'No payment received yet. Once you have paid, check “my orders”.',\n handedOver: 'Handed to your assistant',\n handedOverBody:\n 'This one is paid from the Curless wallet connector you installed — the credential lives there, and this card cannot reach it.',\n handedOverWait:\n 'Your assistant will open the checkout, get you signed in if needed, and confirm the amount with you before anything is charged.',\n refund: 'Request a refund',\n refunding: 'Working…',\n refundFailed: 'The refund request failed',\n onChainTx: 'On-chain tx:',\n paidBy: 'Paid by:',\n cannotOpen: 'Could not open the checkout',\n cardFailed: 'The card could not load',\n nothingToShow: 'Nothing to show here',\n nothingToShowBody: 'Ask for a product by name, or for the catalog.',\n refresh: 'Refresh',\n ordersTitle: 'My orders',\n },\n zh: {\n loading: '加载中…',\n opening: '正在开结账…',\n paying: '正在通过 {method} 结算…',\n emptyCatalog: '目录里没有商品。',\n noOrders: '还没有订单 —— 先从目录里挑一件。',\n productCount: '{count} 件商品',\n orderedFallback: '已下单 {product}',\n handOffAsk: '用 Curless 钱包买{product}',\n back: '← 换个支付方式',\n orderAgain: '再订一次',\n viewOrders: '查看我的订单 →',\n ordered: '已下单',\n notCompleted: '未完成',\n oneStepLeft: '还差一步',\n signIn: '登录 Curless 钱包',\n signInGo: '去登录 ↗',\n signInWait: '登录完这张卡会自己接上。绑卡也在同一个页面里。',\n signedInPaying: '已登录 {email} —— 正在付款…',\n signInExpired: '登录超时了,点上面重新来一次。',\n signInNeverStarted: '还没开始登录 —— 点上面那个链接。',\n ordersFailed: '订单加载失败。',\n walletSaidNo: '钱包未放行',\n openWallet: '打开钱包 ↗',\n goPay: '去付款 ↗',\n payWait: '在浏览器里批准后,这张卡会自己变成收据。',\n payTimeout: '还没收到付款。付完点一下\"我的订单\"看看。',\n handedOver: '交给助手继续',\n handedOverBody:\n '这笔要用你自己装的 Curless 钱包连接器付 —— 凭据在那个连接器里,这张卡够不到它。',\n handedOverWait: '助手会先让你登录钱包,再铸一张凭据完成付款,扣款前会跟你确认金额。',\n refund: '申请退款',\n refunding: '处理中…',\n refundFailed: '退款申请失败',\n onChainTx: '链上交易:',\n paidBy: '付款方式:',\n cannotOpen: '打不开结账',\n cardFailed: '卡片加载失败',\n nothingToShow: '这里没有可显示的内容',\n nothingToShowBody: '说出商品名字,或者让我打开目录。',\n refresh: '刷新',\n ordersTitle: '我的订单',\n },\n};\n","/**\n * The storefront's `instructions` — a SPEC FOR THE MODEL, not documentation.\n *\n * The host injects this into the model's context, so every rule here is load-\n * bearing. Left to itself the model reads the tool list, renders the catalogue\n * card, and then ALSO pops a chooser asking which product to buy — over a grid\n * where every tile already has a Buy button. A card the model talks over has\n * replaced nothing.\n *\n * ⚠️ The two storefronts do NOT say the same thing, and must not.\n *\n * The seven-rail demo has to explain a choice between ACP / UCP / x402 /\n * RLUSD / Payment Link; the wallet connector has three wallet shapes and no\n * rails at all. What they share is the SHAPE and the handful of rules that\n * were each learned by watching the model get it wrong. So the payment\n * sentence is the caller's, and everything around it is fixed here.\n */\nexport type InstructionOptions = {\n /** One line: whose shop this is, and that the card IS the shop. */\n opening: string;\n /**\n * How THIS storefront's checkout card lets someone pay, and the matching\n * \"do not retype the options as text\" rule. The one genuinely different\n * paragraph.\n */\n paymentCard: string;\n /**\n * The field a tool sets when an order actually went through. Named because\n * the closing rule quotes it, and the two storefronts spell it differently\n * (`ordered` here, `booked` in the older seven-rail demo).\n */\n orderedField?: string;\n /** Anything only this storefront needs — a hand-off chain, a rail fallback. */\n extra?: string[];\n};\n\nexport const buildInstructions = (opts: InstructionOptions): string =>\n [\n opts.opening,\n // Every one of these was added after watching the model do the opposite.\n 'To show what is for sale, call list_sinocare_products ONCE and STOP. Do NOT then ask which one, and do NOT retype the products as a numbered list — the person picks by tapping Buy in the card. Say at most one short line, e.g. \"Here is the Sinocare catalog — tap Buy on any of them.\"',\n opts.paymentCard,\n 'Only fall back to describing things in prose if the card genuinely cannot be shown (a host with no UI).',\n 'When the person names a product, open its checkout directly rather than asking them to confirm. If the name is ambiguous or unknown, show the catalog card and let them pick a tile.',\n 'IN THE CHAT, “buy with Curless wallet” means start_sinocare_wallet_handoff. Pass the product when you have it — the card puts it in that message for you; with no product named at all, call the tool with no arguments and let it try. The other two wallet paths are driven by the CARD: the person taps them and the card finishes in place, so do not run those from the chat.',\n ...(opts.extra ?? []),\n `Nothing is charged until the person acts. A tool that opens a checkout returns \\`${opts.orderedField ?? 'ordered'}: false\\` — report it as opened, never as bought.`,\n ].join('\\n');\n","/**\n * The tools BOTH Sinocare storefronts advertise, in one place.\n *\n * A tool description is read by a model deciding whether to move money, which\n * is why the two copies drifting mattered: the same tool told one host that a\n * wallet refusal must stop the purchase and told the other nothing at all.\n * Both tables also carried `quantity: 'number of guests/weeks'` — left over\n * from a resort demo, in a shop that sells boxes of test strips.\n *\n * The seven-rail demo adds its own rail tools on top of these; only the\n * checkout card's payment vocabulary is genuinely per-storefront, so that one\n * sentence is a parameter and everything else is fixed.\n */\nimport { categoryProperty } from './catalog.js';\n\nexport type ToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n};\n\n/** `quantity`, in a shop that sells boxes of things. */\nconst quantity = { type: 'integer', description: 'how many, default 1' } as const;\n\nconst sku = {\n type: 'string',\n description: \"the product's exact sku (from list_sinocare_products)\",\n};\nconst query = {\n type: 'string',\n description:\n \"the product NAME (e.g. 'Safe AQ Smart') — used when the exact sku is not known; resolved against the live catalog. Pass `sku` OR `query`.\",\n};\n\nexport type StorefrontToolOptions = {\n /**\n * What the checkout card offers, in this storefront's own vocabulary — the\n * three wallet shapes, or the seven rails. Appended to a fixed description,\n * because \"open the card instead of listing the options as text\" is the same\n * instruction in both shops and only the list differs.\n */\n checkoutOffers: string;\n};\n\n/**\n * The tools both storefronts advertise, in the order a buyer meets them.\n *\n * ⚠️ Every name here must have a dispatch case on both sides. A range-edit once\n * deleted four cases while the table still advertised them, and the server\n * answered \"unknown tool\" for tools it had just listed.\n */\nexport const storefrontTools = (opts: StorefrontToolOptions): ToolDef[] => [\n {\n name: 'list_sinocare_products',\n description:\n 'Browse the Sinocare catalog AS A CARD — every tile opens a checkout for that product, so the person picks and pays in one place. Prefer this over listing the catalog as text. Optional `category` filter: meter | cgm | analyzer | strips | lancets | accessory.',\n inputSchema: {\n type: 'object',\n properties: { category: categoryProperty },\n },\n },\n {\n name: 'get_sinocare_product',\n description:\n 'One Sinocare product by its sku (from list_sinocare_products), with its price and what is in the box.',\n inputSchema: {\n type: 'object',\n properties: { sku },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_checkout',\n description: `THE DEFAULT WAY TO BUY. Open the visual checkout card for a product, so the person picks how to pay by clicking IN THE CARD instead of typing. ${opts.checkoutOffers} When someone wants to buy, CALL THIS — do not list the payment options as text and ask which one. Identify the product: pass its \\`sku\\` OR a \\`query\\` name (e.g. 'Safe-Accu'). To show the whole catalog instead, call list_sinocare_products — it renders as a card too, and every tile opens that product's checkout.`,\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'buy_sinocare_product_wallet',\n description:\n 'Order and pay in one call, from the Curless wallet THIS storefront holds a session for: the wallet mints a credential from the card THEY bound, capped by the limits THEY set, scoped to this seller and this amount for 15 minutes. If nobody is signed in it returns a browser sign-in link and orders nothing — show the person the link; the card polls on its own and pays once they finish. Do NOT ask them for a password in the chat. ⚠️ If the wallet refuses — over their own limit, no card bound — say what it said and STOP; do not pay for this another way. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_wallet_handoff',\n description:\n \"HAND-OFF, step 1 — what “Buy with Curless wallet” in the chat means. Pass the sku or product name whenever you have one; the card writes the product into that message, so usually you do. If the person genuinely named nothing, call this with no arguments: the server falls back to a checkout opened on THIS connection, and answers with the product and amount either way — confirm that with them before minting any credential. Open a Sinocare checkout to be paid by a SEPARATELY-INSTALLED Curless wallet connector. Returns {sessionId, merchantId, amount, currency} and charges nothing. Next: call that connector's `wallet_pay_credential` with exactly this amount, currency and merchantRef=merchantId, then pass the token it returns to `pay_sinocare_with_token`. This needs that connector installed; only if it is genuinely absent fall back to buy_sinocare_product_wallet or pay_sinocare_hosted. ⚠️ If the wallet refuses — not signed in, over their own limit, no card bound — STOP and repeat what it said. Do NOT pay for this another way: they chose to pay from their own wallet, and settling it elsewhere spends different money and reports it as theirs.\",\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'pay_sinocare_with_token',\n description:\n 'HAND-OFF, step 2. Complete a checkout opened by start_sinocare_wallet_handoff using a credential minted elsewhere (a Stripe shared payment token, spt_…). Sinocare completes with its own merchant key and never sees a card. WHEN THE PERSON NAMES NO PRODUCT — “buy with Curless wallet”, “pay for this” — CALL THIS WITH NO ARGUMENTS. The storefront resolves whichever product they just opened a card for, and names it back to you; it refuses when there is none. Do NOT ask which item first: the server knows, and a tool result from a card never reached you.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n merchantId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n token: { type: 'string', description: 'spt_… from the wallet' },\n },\n required: ['sessionId', 'merchantId', 'token'],\n },\n },\n {\n name: 'pay_sinocare_hosted',\n description:\n 'HOSTED. Open a checkout and hand back a link the person approves in their own browser — they see the amount and the merchant before anything is charged, and the gateway completes it. Needs nothing installed anywhere. Nothing is charged by this call: poll get_sinocare_order_status afterwards, do not claim it is paid until that says so, and do not pay for it another way while they are still on the page. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'get_sinocare_order_status',\n description:\n 'Has this checkout been paid? Use after pay_sinocare_hosted — the approval happens in a browser and this server is never told when it does. `completed` means the money moved.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string' },\n merchantId: { type: 'string', description: 'from the tool that opened this checkout' },\n },\n required: ['sessionId', 'merchantId'],\n },\n },\n {\n name: 'curless_wallet_login_status',\n description:\n 'Is anyone signed into the wallet THIS storefront holds? A separately-installed Curless wallet connector has its own session and this tool knows nothing about it — ask that connector instead. The checkout card polls this by itself; you do not normally need to.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'curless_wallet_logout',\n description:\n 'Sign out of the wallet session this storefront holds, and revoke it so it cannot be used again. Use when the person asks to sign out, or is done and someone else may use this machine. Says nothing about a separately-installed wallet connector.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'list_my_orders',\n description:\n 'Orders placed through this storefront, newest first, with id, product, amount and status. Renders as a card where each settled order has a refund button; the order id is what request_refund takes.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'request_refund',\n description:\n 'Ask Sinocare to refund an order. Pass the order id (ord_…) from list_my_orders and an optional reason. The buyer asks; the merchant approves from its own tools, and money moves only on approval.',\n inputSchema: {\n type: 'object',\n properties: {\n orderId: { type: 'string', description: 'order id from list_my_orders (ord_…)' },\n reason: { type: 'string' },\n },\n required: ['orderId'],\n },\n },\n];\n","/**\n * What a tool result LOOKS like to the card.\n *\n * `view` is the card's dispatch key, and both storefronts were building these\n * shapes by hand. The catalogue view once came back as the merchant card's\n * `{currency, count, products}` after a rename that changed identifiers and not\n * payloads — the card read `products`, got undefined, and drew nothing.\n */\nimport { type Product, formatMinor } from './catalog.js';\n\n/** The catalogue, as the card's product grid reads it. */\nexport const productsView = (products: readonly Product[]) => ({\n view: 'products' as const,\n count: products.length,\n products: [...products],\n});\n\n/** An order as the merchant backend lists it. */\nexport type BackendOrder = {\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol?: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt?: string;\n /** Set when a refund has already been asked for on this order. */\n refundRequest?: { id: string; status: string } | null;\n};\n\n/** One order as the card's list reads it. */\nexport type OrderRow = {\n orderId: string;\n status: string;\n refundPending: boolean;\n product: string;\n total: string;\n protocol?: string;\n date: string;\n};\n\n/**\n * The buyer's orders, as the card's list reads them.\n *\n * A PENDING refund request outranks the payment status here, because this list\n * is where the buyer decides whether to ask. `paid` beside a live \"request\n * refund\" button, on an order they already asked about, invites them to ask\n * twice. `refundPending` is a flag rather than a substring of the status, so\n * the button and the wording cannot drift apart when the gateway gains a new\n * refund-ish status tomorrow.\n */\nexport const ordersView = (orders: readonly BackendOrder[]) => ({\n view: 'orders' as const,\n orders: orders.map(\n (o): OrderRow => ({\n orderId: o.id,\n status: o.refundRequest\n ? o.refundRequest.status === 'approved'\n ? 'refund approved'\n : 'refund requested'\n : o.status,\n refundPending: Boolean(o.refundRequest),\n product: o.lineItems?.map((li) => `${li.name} ×${li.quantity}`).join(', ') ?? '',\n total: formatMinor(Number(o.amount ?? 0), String(o.currency ?? 'EUR')),\n protocol: o.protocol,\n date: o.createdAt?.slice(0, 10) ?? '',\n }),\n ),\n});\n","// GENERATED by packages/internal/sinocare-storefront/widget (`npm run build`).\n// Do not edit by hand, and do not edit the OTHER storefront's copy either — both\n// are emitted from the one card source, and they are byte-identical on purpose.\n// A single self-contained HTML (Vite + vite-plugin-singlefile, with the MCP Apps\n// SDK bundled), base64-embedded so it is bundler-safe.\n//\n// ⚠️ After regenerating, BUMP THE CARD URI in each server. A host caches the\n// card's HTML by that uri, so new card code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture, which is\n// indistinguishable from \"the fix did not work\".\nexport const CHECKOUT_CARD_HTML: string = Buffer.from(\n 'PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgICA8c3R5bGU+CiAgICAgIC8qIFRoZW1lIG9mZiB0aGUgSE9TVCdzIG93biBkZXNpZ24gdG9rZW5zICh0aGUgTUNQIEFwcHMgU0RLIGluamVjdHMgdGhlbSksCiAgICAgICAgIHNvIHRoZSBjYXJkIHNpdHMgbmF0aXZlbHkgaW5zaWRlIENsYXVkZSDigJQgbGlnaHQvZGFyaywgZm9udHMgYW5kIHJhZGlpCiAgICAgICAgIGFsbCBtYXRjaCB3aXRob3V0IHRoaXMgY2FyZCBrbm93aW5nIHdoaWNoIGlzIGluIGZvcmNlLiBUaGUgZmFsbGJhY2tzCiAgICAgICAgIGFyZSB3aGF0IGEgaG9zdCB0aGF0IGluamVjdHMgbm90aGluZyBnZXRzLiAqLwogICAgICA6cm9vdCB7CiAgICAgICAgLS1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5LCAjZmZmZmZmKTsKICAgICAgICAtLWJnLXNvZnQ6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc2Vjb25kYXJ5LCAjZjZmOGZhKTsKICAgICAgICAtLWZnOiB2YXIoLS1jb2xvci10ZXh0LXByaW1hcnksICMxYTFmMzYpOwogICAgICAgIC0tZmctc29mdDogdmFyKC0tY29sb3ItdGV4dC1zZWNvbmRhcnksICM2OTczODYpOwogICAgICAgIC0tZmctZmFpbnQ6IHZhcigtLWNvbG9yLXRleHQtdGVydGlhcnksICM4NzkyYTIpOwogICAgICAgIC0tbGluZTogdmFyKC0tY29sb3ItYm9yZGVyLXByaW1hcnksICNlM2U4ZWUpOwogICAgICAgIC0tZ29vZDogdmFyKC0tY29sb3ItdGV4dC1zdWNjZXNzLCAjMWE3ZjVhKTsKICAgICAgICAtLWdvb2QtYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc3VjY2VzcywgI2RkZjNlNCk7CiAgICAgICAgLS1iYWQ6IHZhcigtLWNvbG9yLXRleHQtZGFuZ2VyLCAjYjMyNjFlKTsKICAgICAgICAtLWJhZC1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1kYW5nZXIsICNmYmU2ZTQpOwogICAgICAgIC0td2FybjogdmFyKC0tY29sb3ItdGV4dC13YXJuaW5nLCAjOGE1YTAwKTsKICAgICAgICAtLXdhcm4tYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtd2FybmluZywgI2ZkZjBkNSk7CiAgICAgICAgLS1ibHVlOiB2YXIoLS1jb2xvci10ZXh0LWFjY2VudCwgIzI1NjNlYik7CiAgICAgICAgLS1saW5rOiB2YXIoLS1jb2xvci10ZXh0LWxpbmssIHZhcigtLWNvbG9yLXRleHQtYWNjZW50LCAjMjU2M2ViKSk7CiAgICAgICAgLS1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtbGcsIDE0cHgpOwogICAgICAgIC0tcmFkaXVzLXNtOiB2YXIoLS1ib3JkZXItcmFkaXVzLXNtLCA5cHgpOwogICAgICAgIC0tZm9udDogdmFyKC0tZm9udC1zYW5zLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZik7CiAgICAgICAgLS1tb25vOiB2YXIoLS1mb250LW1vbm8sIHVpLW1vbm9zcGFjZSwgJ1NGIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlKTsKICAgICAgfQogICAgICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KICAgICAgLmNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDEwLCAyMCwgNDAsIDAuMDQpLCAwIDJweCA1cHggcmdiYSgxMCwgMjAsIDQwLCAwLjA0KTsKICAgICAgICBtYXgtd2lkdGg6IDQ2MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLmhlYWQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweCAwOwogICAgICB9CiAgICAgIC5oZWFkIC50aXRsZSB7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDY1MDsgfQogICAgICAuaGVhZCAubWVyY2hhbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICB9CiAgICAgIC8qIFJlZnJlc2gg4oCUIGFuIG9yZGVycyBjYXJkIGlzIHRoZSBzbmFwc2hvdCBvZiBvbmUgdG9vbCBjYWxsLCBhbmQgYSByZWZ1bmQKICAgICAgICAgc3RhdHVzIGNoYW5nZXMgd2hpbGUgeW91IGFyZSBsb29raW5nIGF0IGl0ICh0aGUgbWVyY2hhbnQgYXBwcm92ZXMsIHRoZW4KICAgICAgICAgdGhlIGdhdGV3YXkgc2lnbmFscyBjb21wbGV0aW9uKS4gV2l0aG91dCB0aGlzIGJ1dHRvbiB0aGUgb25seSB3YXkgdG8KICAgICAgICAgc2VlIHRoZSBuZXcgc3RhdGUgaXMgdG8gZ28gYmFjayB0byB0aGUgY2hhdCBhbmQgYXNrIGZvciB0aGUgbGlzdCBhZ2Fpbi4KICAgICAgICAgT25seSB0aGUgb3JkZXJzIHZpZXcgc2V0cyBvbmUuICovCiAgICAgIC5oZWFkIC5yZWZyZXNoIHsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgLjEycywgYmFja2dyb3VuZCAuMTJzLCBjb2xvciAuMTJzOwogICAgICB9CiAgICAgIC5oZWFkIC5yZWZyZXNoOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgfQogICAgICAuaGVhZCAucmVmcmVzaDpkaXNhYmxlZCB7IGN1cnNvcjogZGVmYXVsdDsgb3BhY2l0eTogLjY7IH0KICAgICAgLmhlYWQgLnJlZnJlc2hbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgLmhlYWQgLnJlZnJlc2ggc3ZnIHsgd2lkdGg6IDEzcHg7IGhlaWdodDogMTNweDsgZGlzcGxheTogYmxvY2s7IH0KICAgICAgLyogQSByZWZyZXNoIG1vc3RseSBjb21lcyBiYWNrIGxvb2tpbmcgaWRlbnRpY2FsIOKAlCB3aXRob3V0IHRoZSBzcGluIGl0CiAgICAgICAgIHJlYWRzIGFzIG5vdGhpbmcgaGF2aW5nIGhhcHBlbmVkLCBhbmQgcGVvcGxlIHByZXNzIGl0IGFnYWluLiAqLwogICAgICAuaGVhZCAucmVmcmVzaC5idXN5IHN2ZyB7IGFuaW1hdGlvbjogY20tc3BpbiAuN3MgbGluZWFyIGluZmluaXRlOyB9CiAgICAgIEBrZXlmcmFtZXMgY20tc3BpbiB7IHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9CiAgICAgICNjb250ZW50IHsgcGFkZGluZzogNnB4IDIwcHggMThweDsgfQogICAgICAuaGVybyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxNTBweDsKICAgICAgICAvKiBjb250YWluLCBub3QgY292ZXI6IGNvdmVyIGZpbGxzIHRoZSBib3ggYnkgQ1VUVElORyB0aGUgcGljdHVyZSwKICAgICAgICAgICBhbmQgb24gYSBwcm9kdWN0IHNob3Qgd2hhdCBpdCBjdXRzIG9mZiBpcyB0aGUgcHJvZHVjdC4gKi8KICAgICAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAycHggMCAxMnB4OwogICAgICB9CiAgICAgIC5wcmljZSB7CiAgICAgICAgZm9udC1zaXplOiAyNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbWFyZ2luOiA2cHggMCAycHg7CiAgICAgIH0KICAgICAgLnN1YiB7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tZmctc29mdCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KICAgICAgLyogQSBwYXltZW50IGdyb3VwJ3MgaGVhZGVyLiBObyB0ZXh0LXRyYW5zZm9ybSDigJQgYSBwcm90b2NvbCBuYW1lIGxpa2UKICAgICAgICAgIng0MDIiIGlzIGRlbGliZXJhdGVseSBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2luZyBpdCBnaXZlcyAiWDQwMiIuICovCiAgICAgIC5ncm91cC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgICAgIG1hcmdpbjogMTRweCAwIDdweDsKICAgICAgfQogICAgICAuZ3JvdXAtbGFiZWw6Zmlyc3Qtb2YtdHlwZSB7IG1hcmdpbi10b3A6IDRweDsgfQogICAgICAvKiBQYXltZW50IHJvd3M6IGEgdGl0bGUgKyBzdWIgb24gdGhlIGxlZnQsIG9uZS1vci1tb3JlIGFjdGlvbiBwaWxscyBvbgogICAgICAgICB0aGUgcmlnaHQgKHRoZSBwcm90b2NvbCBzdWItY2hvaWNlKS4gKi8KICAgICAgLnJvd3MgeyBkaXNwbGF5OiBncmlkOyBnYXA6IDhweDsgfQogICAgICAucm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgLyogd3JhcCwgc28gYW4gaW5saW5lIGVycm9yICguby1lcnIsIGZsZXgtYmFzaXM6MTAwJSkgZHJvcHMgdG8gaXRzIG93bgogICAgICAgICAgIGxpbmUgaW5zdGVhZCBvZiBiZWluZyBzcXVlZXplZCBpbiBiZXNpZGUgdGhlIHN0YXR1cyBwaWxsICovCiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMXB4IDE0cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgfQogICAgICAucm93LW1haW4geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJweDsgbWluLXdpZHRoOiAwOyB9CiAgICAgIC5yLXRpdGxlIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxMy41cHg7IH0KICAgICAgLnItc3ViIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEycHg7IH0KICAgICAgLyogYWxpZ24taXRlbXM6Y2VudGVyLCBOT1QgdGhlIGRlZmF1bHQgc3RyZXRjaCDigJQgYSBzdHJldGNoZWQgLm9zdGF0IHBpbGwKICAgICAgICAgZ3Jvd3MgdG8gdGhlIG5laWdoYm91cmluZyBidXR0b24ncyBoZWlnaHQgYW5kIHJlYWRzIGFzIGEgdGFsbCBsb3BzaWRlZAogICAgICAgICBvdmFsLCBidXQgb25seSBvbiByb3dzIHRoYXQgSEFWRSBhIGJ1dHRvbiwgd2hpY2ggaXMgd2h5IGl0IGxvb2tlZCBsaWtlCiAgICAgICAgIGEgb25lLXJvdyBnbGl0Y2guICovCiAgICAgIC5yb3ctYWN0cyB7IG1hcmdpbi1sZWZ0OiBhdXRvOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgZmxleC1zaHJpbms6IDA7IH0KICAgICAgLmFjdCB7CiAgICAgICAgcGFkZGluZzogN3B4IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1NTA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xMnMsIGJhY2tncm91bmQgLjEycywgY29sb3IgLjEyczsKICAgICAgfQogICAgICAuYWN0OmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC8qIFRoZSBvbmUgYWN0aW9uIG9uIHRoZSBzY3JlZW4g4oCUIGEgYm9yZGVyZWQgZ2hvc3QgYnV0dG9uIG5leHQgdG8gYSB0ZXh0CiAgICAgICAgIGZpZWxkIHJlYWRzIGFzIG9wdGlvbmFsLCBhbmQgdGhpcyBvbmUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBzdGF0ZS4gKi8KICAgICAgLmFjdC5wcmltYXJ5IHsgYmFja2dyb3VuZDogdmFyKC0tYmx1ZSk7IGNvbG9yOiAjZmZmOyBib3JkZXItY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5hY3QucHJpbWFyeTpob3ZlciB7IGNvbG9yOiAjZmZmOyBvcGFjaXR5OiAuOTsgfQogICAgICAuYWN0OmRpc2FibGVkIHsgb3BhY2l0eTogLjU1OyBjdXJzb3I6IGRlZmF1bHQ7IH0KICAgICAgLmFjdC5leHQgeyBjb2xvcjogdmFyKC0tbGluayk7IGJvcmRlci1jb2xvcjogdmFyKC0tbGluayk7IH0KICAgICAgLmFjdC5leHQ6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ibHVlKTsgY29sb3I6ICNmZmY7IGJvcmRlci1jb2xvcjogdmFyKC0tYmx1ZSk7IH0KICAgICAgLyogT3JkZXIgc3RhdHVzIHBpbGwgKG9yZGVycyB2aWV3KSAqLwogICAgICAub2xpc3QgeyBtYXJnaW4tdG9wOiAycHg7IH0KICAgICAgLm9zdGF0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDNweCA5cHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgLm9zdGF0Lm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAub3N0YXQud2FybiB7IGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyB9CiAgICAgIC5vc3RhdC5tdXRlZCB7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyB9CiAgICAgIC8qIFdoeSBhIHJlZnVuZCByZXF1ZXN0IGZhaWxlZCwgb24gdGhlIHJvdyBpdCBiZWxvbmdzIHRvLiBTaWxlbmNlIG1hZGUgdGhlCiAgICAgICAgIGJ1eWVyIHJldHJ5IHNvbWV0aGluZyB0aGF0IGNvdWxkIG5ldmVyIHN1Y2NlZWQuICovCiAgICAgIC5vLWVyciB7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsgbWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgICAgIGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiA3cHggOXB4OyBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgICAgfQogICAgICAvKiBSZXN1bHQgc3RhdGVzICovCiAgICAgIC5yZXN1bHQgeyBwYWRkaW5nOiA0cHggMCAycHg7IH0KICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIH0KICAgICAgLmJhZGdlLm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAuYmFkZ2UuZXJyIHsgY29sb3I6IHZhcigtLWJhZCk7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IH0KICAgICAgLyogTmVpdGhlciBzdWNjZXNzIG5vciBmYWlsdXJlOiBzb21ldGhpbmcgdGhlIHBlcnNvbiBzdGlsbCBoYXMgdG8gZG8uIFJlZAogICAgICAgICB3b3VsZCB0ZWxsIHRoZW0gdGhlIHBheW1lbnQgYnJva2UsIGFuZCBpdCBkaWQgbm90IOKAlCBub3RoaW5nIHdhcwogICAgICAgICBjaGFyZ2VkLCBwcmljZWQsIG9yIGV2ZW4gYXR0ZW1wdGVkLiAqLwogICAgICAuYmFkZ2UudG9kbyB7IGNvbG9yOiB2YXIoLS13YXJuKTsgYmFja2dyb3VuZDogdmFyKC0td2Fybi1iZyk7IH0KICAgICAgLmxvZ2lucm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbjogMTJweCAwIDRweDsgZmxleC13cmFwOiB3cmFwOyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgICAgIC5lcnItbGluZSB7IGNvbG9yOiB2YXIoLS1iYWQpOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi10b3A6IDZweDsgfQogICAgICAvKiBTaG93biBzbyB0aGUgcGVyc29uIGNhbiBjaGVjayBpdCBhZ2FpbnN0IHRoZSBicm93c2VyIHBhZ2Ug4oCUIHRoZSBjb2RlIGlzCiAgICAgICAgIGEgY29uZmlybWF0aW9uLCBub3QgYSBzZWNyZXQsIGFuZCBpdCBpcyB3aGF0IHN0b3BzIGEgbGluayBzZW50IGJ5CiAgICAgICAgIHNvbWVvbmUgZWxzZSBmcm9tIGJlaW5nIGFwcHJvdmVkIHNpbGVudGx5LiAqLwogICAgICAudWNvZGUgeyBmb250OiA2MDAgMTNweCB2YXIoLS1tb25vKTsgbGV0dGVyLXNwYWNpbmc6IC4wOGVtOyBjb2xvcjogdmFyKC0tZmctc29mdCk7CiAgICAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMXB4OyBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IH0KICAgICAgLndhaXRpbmcgeyBjb2xvcjogdmFyKC0tZmctZmFpbnQpOyBmb250LXNpemU6IDEyLjVweDsgbWFyZ2luLXRvcDogMTBweDsgfQogICAgICAucmVzdWx0IC5saW5lIHsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW46IDEycHggMCA0cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IH0KICAgICAgLnJlc3VsdCAubW9ubyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMS41cHg7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9CiAgICAgIC5yZXN1bHQgYS50eCwgLnJlc3VsdCAudHggeyBjb2xvcjogdmFyKC0tbGluayk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY3Vyc29yOiBwb2ludGVyOyB9CiAgICAgIC8qIFRoZSBjYXRhbG9ndWUgbGluayB1bmRlciBhIGNoZWNrb3V0LiBTY29wZWQgYC5yZXN1bHQgYnV0dG9uLmJhY2tgCiAgICAgICAgIGJlbG93IHN0eWxlcyB0aGUgb25lIGluc2lkZSBhIFJFU1VMVDsgdGhpcyBvbmUgc2l0cyB1bmRlciB0aGUgcGF5bWVudAogICAgICAgICByb3dzLCB3aGVyZSBhIGJvcmRlcmVkIGJveCBjb21wZXRlcyB3aXRoIHRoZSB0aGluZyBpdCBzaXRzIGJlbmVhdGgg4oCUCiAgICAgICAgIHRoZSBidXR0b25zIHRoYXQgYWN0dWFsbHkgdGFrZSBtb25leS4gQSBxdWlldCB0ZXh0IGxpbmsgaW5zdGVhZC4gKi8KICAgICAgYnV0dG9uLmJhY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMTRweCBhdXRvIDJweDsKICAgICAgICBwYWRkaW5nOiA0cHggMnB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1mYWludCk7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIGJ1dHRvbi5iYWNrOmhvdmVyIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmJhY2sgewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDhweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC8qIFByaW1hcnkgZm9yd2FyZCBDVEEgYWZ0ZXIgYSBzdWNjZXNzZnVsIG9yZGVyIOKGkiB2aWV3IG9yZGVycyAqLwogICAgICAucmVzdWx0IGJ1dHRvbi5nbyB7CiAgICAgICAgbWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogOXB4IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJsdWUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IGJhY2tncm91bmQ6IHZhcigtLWJsdWUpOyBjb2xvcjogI2ZmZjsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmdvOmhvdmVyIHsgZmlsdGVyOiBicmlnaHRuZXNzKDAuOTYpOyB9CiAgICAgIC8qIFJlY2VpcHQgQ1RBcyBzaWRlIGJ5IHNpZGUuIENhbmNlbHMgdGhlIGJ1dHRvbnMnIG93biBtYXJnaW4tdG9wIHNvIHRoZQogICAgICAgICByb3cgYWxpZ25zLiAqLwogICAgICAucmVzdWx0IC5jdGEtcm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogc3RyZXRjaDsgZmxleC13cmFwOiB3cmFwOyB9CiAgICAgIC5yZXN1bHQgLmN0YS1yb3cgYnV0dG9uIHsgbWFyZ2luLXRvcDogMTRweDsgfQogICAgICAvKiBBIHNlY29uZGFyeSBzaXR0aW5nIE5FWFQgVE8gYSBwcmltYXJ5IGhhcyB0byBzaGFyZSB0aGUgcHJpbWFyeSdzIGJveCDigJQKICAgICAgICAgc2FtZSBwYWRkaW5nLCBzYW1lIHNpemUsIHNhbWUgd2VpZ2h0LiBgLmJhY2tgIGlzIHR1bmVkIGZvciBzdGFuZGluZwogICAgICAgICBhbG9uZSBhdCB0aGUgYm90dG9tIG9mIGEgdmlldyAoc21hbGxlciwgcXVpZXRlcik7IHJldXNlZCBpbiBhIHBhaXIgaXQKICAgICAgICAgY2FtZSBvdXQgc2hvcnRlciBhbmQgbGlnaHRlciB0aGFuIHRoZSBidXR0b24gYmVzaWRlIGl0LCB3aGljaCByZWFkcyBhcwogICAgICAgICBhbiB1bmZpbmlzaGVkIGNvbnRyb2wgcmF0aGVyIHRoYW4gdGhlIG90aGVyIGhhbGYgb2YgYSBjaG9pY2UuIE9ubHkgdGhlCiAgICAgICAgIGNvbG91ciBzZXBhcmF0ZXMgdGhlbS4gKi8KICAgICAgLnJlc3VsdCAuY3RhLXJvdyBidXR0b24uYmFjayB7CiAgICAgICAgcGFkZGluZzogOXB4IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMi41cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsKICAgICAgfQogICAgICAucmVzdWx0IC5jdGEtcm93IGJ1dHRvbi5iYWNrOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5lbXB0eSB7IGNvbG9yOiB2YXIoLS1mZy1mYWludCk7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMTRweCAwOyB9CiAgICAgIC5zcGluIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDEwcHggMDsgfQogICAgICAvKiBUaGUgcHJvZHVjdCBncmlkLiBDb2x1bW4gY291bnQgaXMgbGVmdCB0byBhdXRvLWZpdCDigJQgdGhlIGNhcmQgaXMgYSB2ZXJ5CiAgICAgICAgIGRpZmZlcmVudCB3aWR0aCBpbiBkaWZmZXJlbnQgaG9zdHMsIGFuZCBhIGhhcmQtY29kZWQgMyBvdmVyZmxvd3MKICAgICAgICAgc2lkZXdheXMgaW4gYSBuYXJyb3cgb25lLiAqLwogICAgICAucGdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxMTJweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMCA0cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDc2cHg7CiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nLm5vbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwLjVweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgfQogICAgICAucGNlbGwgLnBuYW1lIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDU2MDsKICAgICAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgICAgICAvKiBOYW1lcyBkaWZmZXIgaW4gbGVuZ3RoOyB1bmNsYW1wZWQgdGhleSBzdHJldGNoIGVhY2ggY2VsbCB0byBpdHMgb3duCiAgICAgICAgICAgaGVpZ2h0LiAqLwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnBjZWxsIC5wbWV0YSB7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLXRvcDogYXV0bzsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IH0KICAgICAgLnBjZWxsIC5wYnV5IHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDVweCAwOyB9CiAgICA8L3N0eWxlPgogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luPihmdW5jdGlvbigpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLnJlbExpc3Q7aWYobiYmbi5zdXBwb3J0cyYmbi5zdXBwb3J0cygibW9kdWxlcHJlbG9hZCIpKXJldHVybjtmb3IoY29uc3QgZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD0ibW9kdWxlcHJlbG9hZCJdJykpbyhlKTtuZXcgTXV0YXRpb25PYnNlcnZlcihlPT57Zm9yKGNvbnN0IGkgb2YgZSlpZihpLnR5cGU9PT0iY2hpbGRMaXN0Iilmb3IoY29uc3QgYSBvZiBpLmFkZGVkTm9kZXMpYS50YWdOYW1lPT09IkxJTksiJiZhLnJlbD09PSJtb2R1bGVwcmVsb2FkIiYmbyhhKX0pLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7ZnVuY3Rpb24gcihlKXtjb25zdCBpPXt9O3JldHVybiBlLmludGVncml0eSYmKGkuaW50ZWdyaXR5PWUuaW50ZWdyaXR5KSxlLnJlZmVycmVyUG9saWN5JiYoaS5yZWZlcnJlclBvbGljeT1lLnJlZmVycmVyUG9saWN5KSxlLmNyb3NzT3JpZ2luPT09InVzZS1jcmVkZW50aWFscyI/aS5jcmVkZW50aWFscz0iaW5jbHVkZSI6ZS5jcm9zc09yaWdpbj09PSJhbm9ueW1vdXMiP2kuY3JlZGVudGlhbHM9Im9taXQiOmkuY3JlZGVudGlhbHM9InNhbWUtb3JpZ2luIixpfWZ1bmN0aW9uIG8oZSl7aWYoZS5lcClyZXR1cm47ZS5lcD0hMDtjb25zdCBpPXIoZSk7ZmV0Y2goZS5ocmVmLGkpfX0pKCk7Y29uc3QgUm09Im1vZHVsZXByZWxvYWQiLENtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBVUkwodCxuKS5ocmVmfSxwcz17fSxBbT1mdW5jdGlvbihuLHIsbyl7bGV0IGU9UHJvbWlzZS5yZXNvbHZlKCk7aWYociYmci5sZW5ndGg+MCl7bGV0IGE9ZnVuY3Rpb24obCl7cmV0dXJuIFByb21pc2UuYWxsKGwubWFwKGc9PlByb21pc2UucmVzb2x2ZShnKS50aGVuKHY9Pih7c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnZ9KSx2PT4oe3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp2fSkpKSl9O2NvbnN0IHM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKSxjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXSIpLHU9Yz8ubm9uY2V8fGM/LmdldEF0dHJpYnV0ZSgibm9uY2UiKTtlPWEoci5tYXAobD0+e2lmKGw9Q20obCxvKSxsIGluIHBzKXJldHVybjtwc1tsXT0hMDtjb25zdCBnPWwuZW5kc1dpdGgoIi5jc3MiKSx2PWc/J1tyZWw9InN0eWxlc2hlZXQiXSc6IiI7aWYoISFvKWZvcihsZXQgSD1zLmxlbmd0aC0xO0g+PTA7SC0tKXtjb25zdCBMPXNbSF07aWYoTC5ocmVmPT09bCYmKCFnfHxMLnJlbD09PSJzdHlsZXNoZWV0IikpcmV0dXJufWVsc2UgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tocmVmPSIke2x9Il0ke3Z9YCkpcmV0dXJuO2NvbnN0IHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKHkucmVsPWc/InN0eWxlc2hlZXQiOlJtLGd8fCh5LmFzPSJzY3JpcHQiKSx5LmNyb3NzT3JpZ2luPSIiLHkuaHJlZj1sLHUmJnkuc2V0QXR0cmlidXRlKCJub25jZSIsdSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5KSxnKXJldHVybiBuZXcgUHJvbWlzZSgoSCxMKT0+e3kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSCkseS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKCk9PkwobmV3IEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7bH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShhKXtjb25zdCBzPW5ldyBFdmVudCgidml0ZTpwcmVsb2FkRXJyb3IiLHtjYW5jZWxhYmxlOiEwfSk7aWYocy5wYXlsb2FkPWEsd2luZG93LmRpc3BhdGNoRXZlbnQocyksIXMuZGVmYXVsdFByZXZlbnRlZCl0aHJvdyBhfXJldHVybiBlLnRoZW4oYT0+e2Zvcihjb25zdCBzIG9mIGF8fFtdKXMuc3RhdHVzPT09InJlamVjdGVkIiYmaShzLnJlYXNvbik7cmV0dXJuIG4oKS5jYXRjaChpKX0pfTt2YXIgZnM7Y29uc3QgZmk9T2JqZWN0LmZyZWV6ZSh7c3RhdHVzOiJhYm9ydGVkIn0pO2Z1bmN0aW9uIGQodCxuLHIpe2Z1bmN0aW9uIG8ocyxjKXtpZihzLl96b2R8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJfem9kIix7dmFsdWU6e2RlZjpjLGNvbnN0cjphLHRyYWl0czpuZXcgU2V0fSxlbnVtZXJhYmxlOiExfSkscy5fem9kLnRyYWl0cy5oYXModCkpcmV0dXJuO3MuX3pvZC50cmFpdHMuYWRkKHQpLG4ocyxjKTtjb25zdCB1PWEucHJvdG90eXBlLGw9T2JqZWN0LmtleXModSk7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2NvbnN0IHY9bFtnXTt2IGluIHN8fChzW3ZdPXVbdl0uYmluZChzKSl9fWNvbnN0IGU9cj8uUGFyZW50Pz9PYmplY3Q7Y2xhc3MgaSBleHRlbmRzIGV7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJuYW1lIix7dmFsdWU6dH0pO2Z1bmN0aW9uIGEocyl7dmFyIGM7Y29uc3QgdT1yPy5QYXJlbnQ/bmV3IGk6dGhpcztvKHUscyksKGM9dS5fem9kKS5kZWZlcnJlZD8/KGMuZGVmZXJyZWQ9W10pO2Zvcihjb25zdCBsIG9mIHUuX3pvZC5kZWZlcnJlZClsKCk7cmV0dXJuIHV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJpbml0Iix7dmFsdWU6b30pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6cz0+cj8uUGFyZW50JiZzIGluc3RhbmNlb2Ygci5QYXJlbnQ/ITA6cz8uX3pvZD8udHJhaXRzPy5oYXModCl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwibmFtZSIse3ZhbHVlOnR9KSxhfWNvbnN0IGdpPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3MgTmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCJFbmNvdW50ZXJlZCBQcm9taXNlIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZS4gVXNlIC5wYXJzZUFzeW5jKCkgaW5zdGVhZC4iKX19Y2xhc3MgV24gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihuKXtzdXBlcihgRW5jb3VudGVyZWQgdW5pZGlyZWN0aW9uYWwgdHJhbnNmb3JtIGR1cmluZyBlbmNvZGU6ICR7bn1gKSx0aGlzLm5hbWU9IlpvZEVuY29kZUVycm9yIn19KGZzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbENvbmZpZz8/KGZzLl9fem9kX2dsb2JhbENvbmZpZz17fSk7Y29uc3Qga3Q9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxDb25maWc7ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdCYmT2JqZWN0LmFzc2lnbihrdCx0KSxrdH1mdW5jdGlvbiBMbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBNbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBxbSh0KXt9ZnVuY3Rpb24gRm0odCl7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHZhbHVlIGluIGV4aGF1c3RpdmUgY2hlY2siKX1mdW5jdGlvbiBKbSh0KXt9ZnVuY3Rpb24gdmkodCl7Y29uc3Qgbj1PYmplY3QudmFsdWVzKHQpLmZpbHRlcihvPT50eXBlb2Ygbz09Im51bWJlciIpO3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtvLGVdKT0+bi5pbmRleE9mKCtvKT09PS0xKS5tYXAoKFtvLGVdKT0+ZSl9ZnVuY3Rpb24gXyh0LG49InwiKXtyZXR1cm4gdC5tYXAocj0+UyhyKSkuam9pbihuKX1mdW5jdGlvbiBSbih0LG4pe3JldHVybiB0eXBlb2Ygbj09ImJpZ2ludCI/bi50b1N0cmluZygpOm59ZnVuY3Rpb24gVHQodCl7cmV0dXJue2dldCB2YWx1ZSgpe3tjb25zdCBuPXQoKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZhbHVlIix7dmFsdWU6bn0pLG59fX19ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGx9ZnVuY3Rpb24gQm4odCl7Y29uc3Qgbj10LnN0YXJ0c1dpdGgoIl4iKT8xOjAscj10LmVuZHNXaXRoKCIkIik/dC5sZW5ndGgtMTp0Lmxlbmd0aDtyZXR1cm4gdC5zbGljZShuLHIpfWZ1bmN0aW9uIFdzKHQsbil7Y29uc3Qgcj10L24sbz1NYXRoLnJvdW5kKHIpLGU9TnVtYmVyLkVQU0lMT04qTWF0aC5tYXgoTWF0aC5hYnMociksMSk7cmV0dXJuIE1hdGguYWJzKHItbyk8ZT8wOnItb31jb25zdCBncz1TeW1ib2woImV2YWx1YXRpbmciKTtmdW5jdGlvbiBPKHQsbixyKXtsZXQgbztPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtnZXQoKXtpZihvIT09Z3MpcmV0dXJuIG89PT12b2lkIDAmJihvPWdzLG89cigpKSxvfSxzZXQoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZX0pfSxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBIbSh0KXtyZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpfWZ1bmN0aW9uIHhlKHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTpyLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9ZnVuY3Rpb24gJGUoLi4udCl7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpO09iamVjdC5hc3NpZ24obixvKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sbil9ZnVuY3Rpb24gV20odCl7cmV0dXJuICRlKHQuX3pvZC5kZWYpfWZ1bmN0aW9uIEJtKHQsbil7cmV0dXJuIG4/bi5yZWR1Y2UoKHIsbyk9PnI/LltvXSx0KTp0fWZ1bmN0aW9uIFZtKHQpe2NvbnN0IG49T2JqZWN0LmtleXModCkscj1uLm1hcChvPT50W29dKTtyZXR1cm4gUHJvbWlzZS5hbGwocikudGhlbihvPT57Y29uc3QgZT17fTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyllW25baV1dPW9baV07cmV0dXJuIGV9KX1mdW5jdGlvbiBLbSh0PTEwKXtjb25zdCBuPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0O28rKylyKz1uW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpuLmxlbmd0aCldO3JldHVybiByfWZ1bmN0aW9uIHNpKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiBCcyh0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpLnRyaW0oKS5yZXBsYWNlKC9bXlx3XHMtXS9nLCIiKS5yZXBsYWNlKC9bXHNfLV0rL2csIi0iKS5yZXBsYWNlKC9eLSt8LSskL2csIiIpfWNvbnN0IGhpPSJjYXB0dXJlU3RhY2tUcmFjZSJpbiBFcnJvcj9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZTooLi4udCk9Pnt9O2Z1bmN0aW9uIEhlKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSh0KX1jb25zdCBWcz1UdCgoKT0+e2lmKGt0LmppdGxlc3N8fHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5jbHVkZXMoIkNsb3VkZmxhcmUiKSlyZXR1cm4hMTt0cnl7Y29uc3QgdD1GdW5jdGlvbjtyZXR1cm4gbmV3IHQoIiIpLCEwfWNhdGNoe3JldHVybiExfX0pO2Z1bmN0aW9uIERlKHQpe2lmKEhlKHQpPT09ITEpcmV0dXJuITE7Y29uc3Qgbj10LmNvbnN0cnVjdG9yO2lmKG49PT12b2lkIDB8fHR5cGVvZiBuIT0iZnVuY3Rpb24iKXJldHVybiEwO2NvbnN0IHI9bi5wcm90b3R5cGU7cmV0dXJuIShIZShyKT09PSExfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiaXNQcm90b3R5cGVPZiIpPT09ITEpfWZ1bmN0aW9uIFZuKHQpe3JldHVybiBEZSh0KT97Li4udH06QXJyYXkuaXNBcnJheSh0KT9bLi4udF06dCBpbnN0YW5jZW9mIE1hcD9uZXcgTWFwKHQpOnQgaW5zdGFuY2VvZiBTZXQ/bmV3IFNldCh0KTp0fWZ1bmN0aW9uIEdtKHQpe2xldCBuPTA7Zm9yKGNvbnN0IHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmbisrO3JldHVybiBufWNvbnN0IFhtPXQ9Pntjb25zdCBuPXR5cGVvZiB0O3N3aXRjaChuKXtjYXNlInVuZGVmaW5lZCI6cmV0dXJuInVuZGVmaW5lZCI7Y2FzZSJzdHJpbmciOnJldHVybiJzdHJpbmciO2Nhc2UibnVtYmVyIjpyZXR1cm4gTnVtYmVyLmlzTmFOKHQpPyJuYW4iOiJudW1iZXIiO2Nhc2UiYm9vbGVhbiI6cmV0dXJuImJvb2xlYW4iO2Nhc2UiZnVuY3Rpb24iOnJldHVybiJmdW5jdGlvbiI7Y2FzZSJiaWdpbnQiOnJldHVybiJiaWdpbnQiO2Nhc2Uic3ltYm9sIjpyZXR1cm4ic3ltYm9sIjtjYXNlIm9iamVjdCI6cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0PT09bnVsbD8ibnVsbCI6dC50aGVuJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiZ0LmNhdGNoJiZ0eXBlb2YgdC5jYXRjaD09ImZ1bmN0aW9uIj8icHJvbWlzZSI6dHlwZW9mIE1hcDwidSImJnQgaW5zdGFuY2VvZiBNYXA/Im1hcCI6dHlwZW9mIFNldDwidSImJnQgaW5zdGFuY2VvZiBTZXQ/InNldCI6dHlwZW9mIERhdGU8InUiJiZ0IGluc3RhbmNlb2YgRGF0ZT8iZGF0ZSI6dHlwZW9mIEZpbGU8InUiJiZ0IGluc3RhbmNlb2YgRmlsZT8iZmlsZSI6Im9iamVjdCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlOiAke259YCl9fSxDbj1uZXcgU2V0KFsic3RyaW5nIiwibnVtYmVyIiwic3ltYm9sIl0pLEtzPW5ldyBTZXQoWyJzdHJpbmciLCJudW1iZXIiLCJiaWdpbnQiLCJib29sZWFuIiwic3ltYm9sIiwidW5kZWZpbmVkIl0pO2Z1bmN0aW9uIGJlKHQpe3JldHVybiB0LnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIil9ZnVuY3Rpb24gZGUodCxuLHIpe2NvbnN0IG89bmV3IHQuX3pvZC5jb25zdHIobj8/dC5fem9kLmRlZik7cmV0dXJuKCFufHxyPy5wYXJlbnQpJiYoby5fem9kLnBhcmVudD10KSxvfWZ1bmN0aW9uIGgodCl7Y29uc3Qgbj10O2lmKCFuKXJldHVybnt9O2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm57ZXJyb3I6KCk9Pm59O2lmKG4/Lm1lc3NhZ2UhPT12b2lkIDApe2lmKG4/LmVycm9yIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNwZWNpZnkgYm90aCBgbWVzc2FnZWAgYW5kIGBlcnJvcmAgcGFyYW1zIik7bi5lcnJvcj1uLm1lc3NhZ2V9cmV0dXJuIGRlbGV0ZSBuLm1lc3NhZ2UsdHlwZW9mIG4uZXJyb3I9PSJzdHJpbmciP3suLi5uLGVycm9yOigpPT5uLmVycm9yfTpufWZ1bmN0aW9uIFltKHQpe2xldCBuO3JldHVybiBuZXcgUHJveHkoe30se2dldChyLG8sZSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXQobixvLGUpfSxzZXQocixvLGUsaSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5zZXQobixvLGUsaSl9LGhhcyhyLG8pe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuaGFzKG4sbyl9LGRlbGV0ZVByb3BlcnR5KHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShuLG8pfSxvd25LZXlzKHIpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3Qub3duS2V5cyhuKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixvKX0sZGVmaW5lUHJvcGVydHkocixvLGUpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkobixvLGUpfX0pfWZ1bmN0aW9uIFModCl7cmV0dXJuIHR5cGVvZiB0PT0iYmlnaW50Ij90LnRvU3RyaW5nKCkrIm4iOnR5cGVvZiB0PT0ic3RyaW5nIj9gIiR7dH0iYDpgJHt0fWB9ZnVuY3Rpb24gR3ModCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcihuPT50W25dLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiJiZ0W25dLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIil9Y29uc3QgWHM9e3NhZmVpbnQ6W051bWJlci5NSU5fU0FGRV9JTlRFR0VSLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXSxpbnQzMjpbLTIxNDc0ODM2NDgsMjE0NzQ4MzY0N10sdWludDMyOlswLDQyOTQ5NjcyOTVdLGZsb2F0MzI6Wy0zNDAyODIzNDY2Mzg1Mjg4NmUyMiwzNDAyODIzNDY2Mzg1Mjg4NmUyMl0sZmxvYXQ2NDpbLU51bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRV19LFlzPXtpbnQ2NDpbQmlnSW50KCItOTIyMzM3MjAzNjg1NDc3NTgwOCIpLEJpZ0ludCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpXSx1aW50NjQ6W0JpZ0ludCgwKSxCaWdJbnQoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IildfTtmdW5jdGlvbiBRcyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIucGljaygpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9e307Zm9yKGNvbnN0IHMgaW4gbil7aWYoIShzIGluIHIuc2hhcGUpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7c30iYCk7bltzXSYmKGFbc109ci5zaGFwZVtzXSl9cmV0dXJuIHhlKHRoaXMsInNoYXBlIixhKSxhfSxjaGVja3M6W119KTtyZXR1cm4gZGUodCxpKX1mdW5jdGlvbiBlYyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIub21pdCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9ey4uLnQuX3pvZC5kZWYuc2hhcGV9O2Zvcihjb25zdCBzIGluIG4pe2lmKCEocyBpbiByLnNoYXBlKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6ICIke3N9ImApO25bc10mJmRlbGV0ZSBhW3NdfXJldHVybiB4ZSh0aGlzLCJzaGFwZSIsYSksYX0sY2hlY2tzOltdfSk7cmV0dXJuIGRlKHQsaSl9ZnVuY3Rpb24gdGModCxuKXtpZighRGUobikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvIGV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPXQuX3pvZC5kZWYuY2hlY2tzO2lmKHImJnIubGVuZ3RoPjApe2NvbnN0IGk9dC5fem9kLmRlZi5zaGFwZTtmb3IoY29uc3QgYSBpbiBuKWlmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxhKSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBvdmVyd3JpdGUga2V5cyBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzLiBVc2UgYC5zYWZlRXh0ZW5kKClgIGluc3RlYWQuIil9Y29uc3QgZT0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBpPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm59O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsaSksaX19KTtyZXR1cm4gZGUodCxlKX1mdW5jdGlvbiBuYyh0LG4pe2lmKCFEZShuKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gc2FmZUV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IG89ey4uLnQuX3pvZC5kZWYuc2hhcGUsLi4ubn07cmV0dXJuIHhlKHRoaXMsInNoYXBlIixvKSxvfX0pO3JldHVybiBkZSh0LHIpfWZ1bmN0aW9uIHJjKHQsbil7aWYodC5fem9kLmRlZi5jaGVja3M/Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIi5tZXJnZSgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMuIFVzZSAuc2FmZUV4dGVuZCgpIGluc3RlYWQuIik7Y29uc3Qgcj0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBvPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm4uX3pvZC5kZWYuc2hhcGV9O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsbyksb30sZ2V0IGNhdGNoYWxsKCl7cmV0dXJuIG4uX3pvZC5kZWYuY2F0Y2hhbGx9LGNoZWNrczpuLl96b2QuZGVmLmNoZWNrcz8/W119KTtyZXR1cm4gZGUodCxyKX1mdW5jdGlvbiBpYyh0LG4scil7Y29uc3QgZT1uLl96b2QuZGVmLmNoZWNrcztpZihlJiZlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiLnBhcnRpYWwoKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIik7Y29uc3QgYT0kZShuLl96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBzPW4uX3pvZC5kZWYuc2hhcGUsYz17Li4uc307aWYocilmb3IoY29uc3QgdSBpbiByKXtpZighKHUgaW4gcykpdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiAiJHt1fSJgKTtyW3VdJiYoY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdKX1lbHNlIGZvcihjb25zdCB1IGluIHMpY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdO3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsYyksY30sY2hlY2tzOltdfSk7cmV0dXJuIGRlKG4sYSl9ZnVuY3Rpb24gb2ModCxuLHIpe2NvbnN0IG89JGUobi5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3QgZT1uLl96b2QuZGVmLnNoYXBlLGk9ey4uLmV9O2lmKHIpZm9yKGNvbnN0IGEgaW4gcil7aWYoIShhIGluIGkpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7YX0iYCk7clthXSYmKGlbYV09bmV3IHQoe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6ZVthXX0pKX1lbHNlIGZvcihjb25zdCBhIGluIGUpaVthXT1uZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTplW2FdfSk7cmV0dXJuIHhlKHRoaXMsInNoYXBlIixpKSxpfX0pO3JldHVybiBkZShuLG8pfWZ1bmN0aW9uIFBlKHQsbj0wKXtpZih0LmFib3J0ZWQ9PT0hMClyZXR1cm4hMDtmb3IobGV0IHI9bjtyPHQuaXNzdWVzLmxlbmd0aDtyKyspaWYodC5pc3N1ZXNbcl0/LmNvbnRpbnVlIT09ITApcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gYWModCxuPTApe2lmKHQuYWJvcnRlZD09PSEwKXJldHVybiEwO2ZvcihsZXQgcj1uO3I8dC5pc3N1ZXMubGVuZ3RoO3IrKylpZih0Lmlzc3Vlc1tyXT8uY29udGludWU9PT0hMSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBmZSh0LG4pe3JldHVybiBuLm1hcChyPT57dmFyIG87cmV0dXJuKG89cikucGF0aD8/KG8ucGF0aD1bXSksci5wYXRoLnVuc2hpZnQodCkscn0pfWZ1bmN0aW9uICR0KHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dDp0Py5tZXNzYWdlfWZ1bmN0aW9uIGxlKHQsbixyKXtjb25zdCBvPXQubWVzc2FnZT90Lm1lc3NhZ2U6JHQodC5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lih0KSk/PyR0KG4/LmVycm9yPy4odCkpPz8kdChyLmN1c3RvbUVycm9yPy4odCkpPz8kdChyLmxvY2FsZUVycm9yPy4odCkpPz8iSW52YWxpZCBpbnB1dCIse2luc3Q6ZSxjb250aW51ZTppLGlucHV0OmEsLi4uc309dDtyZXR1cm4gcy5wYXRoPz8ocy5wYXRoPVtdKSxzLm1lc3NhZ2U9byxuPy5yZXBvcnRJbnB1dCYmKHMuaW5wdXQ9YSksc31mdW5jdGlvbiBLbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFNldD8ic2V0Ijp0IGluc3RhbmNlb2YgTWFwPyJtYXAiOnQgaW5zdGFuY2VvZiBGaWxlPyJmaWxlIjoidW5rbm93biJ9ZnVuY3Rpb24gR24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0eXBlb2YgdD09InN0cmluZyI/InN0cmluZyI6InVua25vd24ifWZ1bmN0aW9uIHcodCl7Y29uc3Qgbj10eXBlb2YgdDtzd2l0Y2gobil7Y2FzZSJudW1iZXIiOnJldHVybiBOdW1iZXIuaXNOYU4odCk/Im5hbiI6Im51bWJlciI7Y2FzZSJvYmplY3QiOntpZih0PT09bnVsbClyZXR1cm4ibnVsbCI7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4iYXJyYXkiO2NvbnN0IHI9dDtpZihyJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YocikhPT1PYmplY3QucHJvdG90eXBlJiYiY29uc3RydWN0b3IiaW4gciYmci5jb25zdHJ1Y3RvcilyZXR1cm4gci5jb25zdHJ1Y3Rvci5uYW1lfX1yZXR1cm4gbn1mdW5jdGlvbiBXZSguLi50KXtjb25zdFtuLHIsb109dDtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciP3ttZXNzYWdlOm4sY29kZToiY3VzdG9tIixpbnB1dDpyLGluc3Q6b306ey4uLm59fWZ1bmN0aW9uIFFtKHQpe3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtuLHJdKT0+TnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChuLDEwKSkpLm1hcChuPT5uWzFdKX1mdW5jdGlvbiBzYyh0KXtjb25zdCBuPWF0b2IodCkscj1uZXcgVWludDhBcnJheShuLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspcltvXT1uLmNoYXJDb2RlQXQobyk7cmV0dXJuIHJ9ZnVuY3Rpb24gY2ModCl7bGV0IG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W3JdKTtyZXR1cm4gYnRvYShuKX1mdW5jdGlvbiBlcCh0KXtjb25zdCBuPXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikscj0iPSIucmVwZWF0KCg0LW4ubGVuZ3RoJTQpJTQpO3JldHVybiBzYyhuK3IpfWZ1bmN0aW9uIHRwKHQpe3JldHVybiBjYyh0KS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9ZnVuY3Rpb24gbnAodCl7Y29uc3Qgbj10LnJlcGxhY2UoL14weC8sIiIpO2lmKG4ubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aCIpO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgvMik7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKz0yKXJbby8yXT1OdW1iZXIucGFyc2VJbnQobi5zbGljZShvLG8rMiksMTYpO3JldHVybiByfWZ1bmN0aW9uIHJwKHQpe3JldHVybiBBcnJheS5mcm9tKHQpLm1hcChuPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWNsYXNzIGlwe2NvbnN0cnVjdG9yKC4uLm4pe319Y29uc3QgJGk9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLEJJR0lOVF9GT1JNQVRfUkFOR0VTOllzLENsYXNzOmlwLE5VTUJFUl9GT1JNQVRfUkFOR0VTOlhzLGFib3J0ZWQ6UGUsYWxsb3dzRXZhbDpWcyxhc3NlcnQ6Sm0sYXNzZXJ0RXF1YWw6TG0sYXNzZXJ0SXM6cW0sYXNzZXJ0TmV2ZXI6Rm0sYXNzZXJ0Tm90RXF1YWw6TW0sYXNzaWduUHJvcDp4ZSxiYXNlNjRUb1VpbnQ4QXJyYXk6c2MsYmFzZTY0dXJsVG9VaW50OEFycmF5OmVwLGNhY2hlZDpUdCxjYXB0dXJlU3RhY2tUcmFjZTpoaSxjbGVhbkVudW06UW0sY2xlYW5SZWdleDpCbixjbG9uZTpkZSxjbG9uZURlZjpXbSxjcmVhdGVUcmFuc3BhcmVudFByb3h5OlltLGRlZmluZUxhenk6Tyxlc2M6c2ksZXNjYXBlUmVnZXg6YmUsZXhwbGljaXRseUFib3J0ZWQ6YWMsZXh0ZW5kOnRjLGZpbmFsaXplSXNzdWU6bGUsZmxvYXRTYWZlUmVtYWluZGVyOldzLGdldEVsZW1lbnRBdFBhdGg6Qm0sZ2V0RW51bVZhbHVlczp2aSxnZXRMZW5ndGhhYmxlT3JpZ2luOkduLGdldFBhcnNlZFR5cGU6WG0sZ2V0U2l6YWJsZU9yaWdpbjpLbixoZXhUb1VpbnQ4QXJyYXk6bnAsaXNPYmplY3Q6SGUsaXNQbGFpbk9iamVjdDpEZSxpc3N1ZTpXZSxqb2luVmFsdWVzOl8sanNvblN0cmluZ2lmeVJlcGxhY2VyOlJuLG1lcmdlOnJjLG1lcmdlRGVmczokZSxub3JtYWxpemVQYXJhbXM6aCxudWxsaXNoOkFlLG51bUtleXM6R20sb2JqZWN0Q2xvbmU6SG0sb21pdDplYyxvcHRpb25hbEtleXM6R3MscGFyc2VkVHlwZTp3LHBhcnRpYWw6aWMscGljazpRcyxwcmVmaXhJc3N1ZXM6ZmUscHJpbWl0aXZlVHlwZXM6S3MscHJvbWlzZUFsbE9iamVjdDpWbSxwcm9wZXJ0eUtleVR5cGVzOkNuLHJhbmRvbVN0cmluZzpLbSxyZXF1aXJlZDpvYyxzYWZlRXh0ZW5kOm5jLHNoYWxsb3dDbG9uZTpWbixzbHVnaWZ5OkJzLHN0cmluZ2lmeVByaW1pdGl2ZTpTLHVpbnQ4QXJyYXlUb0Jhc2U2NDpjYyx1aW50OEFycmF5VG9CYXNlNjR1cmw6dHAsdWludDhBcnJheVRvSGV4OnJwLHVud3JhcE1lc3NhZ2U6JHR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksdWM9KHQsbik9Pnt0Lm5hbWU9IiRab2RFcnJvciIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl96b2QiLHt2YWx1ZTp0Ll96b2QsZW51bWVyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJpc3N1ZXMiLHt2YWx1ZTpuLGVudW1lcmFibGU6ITF9KSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkobixSbiwyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidG9TdHJpbmciLHt2YWx1ZTooKT0+dC5tZXNzYWdlLGVudW1lcmFibGU6ITF9KX0sX2k9ZCgiJFpvZEVycm9yIix1YyksbWU9ZCgiJFpvZEVycm9yIix1Yyx7UGFyZW50OkVycm9yfSk7ZnVuY3Rpb24gWG4odCxuPXI9PnIubWVzc2FnZSl7Y29uc3Qgcj17fSxvPVtdO2Zvcihjb25zdCBlIG9mIHQuaXNzdWVzKWUucGF0aC5sZW5ndGg+MD8ocltlLnBhdGhbMF1dPXJbZS5wYXRoWzBdXXx8W10scltlLnBhdGhbMF1dLnB1c2gobihlKSkpOm8ucHVzaChuKGUpKTtyZXR1cm57Zm9ybUVycm9yczpvLGZpZWxkRXJyb3JzOnJ9fWZ1bmN0aW9uIFluKHQsbj1yPT5yLm1lc3NhZ2Upe2NvbnN0IHI9e19lcnJvcnM6W119LG89KGUsaT1bXSk9Pntmb3IoY29uc3QgYSBvZiBlLmlzc3VlcylpZihhLmNvZGU9PT0iaW52YWxpZF91bmlvbiImJmEuZXJyb3JzLmxlbmd0aClhLmVycm9ycy5tYXAocz0+byh7aXNzdWVzOnN9LFsuLi5pLC4uLmEucGF0aF0pKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2tleSIpbyh7aXNzdWVzOmEuaXNzdWVzfSxbLi4uaSwuLi5hLnBhdGhdKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2VsZW1lbnQiKW8oe2lzc3VlczphLmlzc3Vlc30sWy4uLmksLi4uYS5wYXRoXSk7ZWxzZXtjb25zdCBzPVsuLi5pLC4uLmEucGF0aF07aWYocy5sZW5ndGg9PT0wKXIuX2Vycm9ycy5wdXNoKG4oYSkpO2Vsc2V7bGV0IGM9cix1PTA7Zm9yKDt1PHMubGVuZ3RoOyl7Y29uc3QgbD1zW3VdO3U9PT1zLmxlbmd0aC0xPyhjW2xdPWNbbF18fHtfZXJyb3JzOltdfSxjW2xdLl9lcnJvcnMucHVzaChuKGEpKSk6Y1tsXT1jW2xdfHx7X2Vycm9yczpbXX0sYz1jW2xdLHUrK319fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBiaSh0LG49cj0+ci5tZXNzYWdlKXtjb25zdCByPXtlcnJvcnM6W119LG89KGUsaT1bXSk9Pnt2YXIgYSxzO2Zvcihjb25zdCBjIG9mIGUuaXNzdWVzKWlmKGMuY29kZT09PSJpbnZhbGlkX3VuaW9uIiYmYy5lcnJvcnMubGVuZ3RoKWMuZXJyb3JzLm1hcCh1PT5vKHtpc3N1ZXM6dX0sWy4uLmksLi4uYy5wYXRoXSkpO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfa2V5IilvKHtpc3N1ZXM6Yy5pc3N1ZXN9LFsuLi5pLC4uLmMucGF0aF0pO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfZWxlbWVudCIpbyh7aXNzdWVzOmMuaXNzdWVzfSxbLi4uaSwuLi5jLnBhdGhdKTtlbHNle2NvbnN0IHU9Wy4uLmksLi4uYy5wYXRoXTtpZih1Lmxlbmd0aD09PTApe3IuZXJyb3JzLnB1c2gobihjKSk7Y29udGludWV9bGV0IGw9cixnPTA7Zm9yKDtnPHUubGVuZ3RoOyl7Y29uc3Qgdj11W2ddLCQ9Zz09PXUubGVuZ3RoLTE7dHlwZW9mIHY9PSJzdHJpbmciPyhsLnByb3BlcnRpZXM/PyhsLnByb3BlcnRpZXM9e30pLChhPWwucHJvcGVydGllcylbdl0/PyhhW3ZdPXtlcnJvcnM6W119KSxsPWwucHJvcGVydGllc1t2XSk6KGwuaXRlbXM/PyhsLml0ZW1zPVtdKSwocz1sLml0ZW1zKVt2XT8/KHNbdl09e2Vycm9yczpbXX0pLGw9bC5pdGVtc1t2XSksJCYmbC5lcnJvcnMucHVzaChuKGMpKSxnKyt9fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBsYyh0KXtjb25zdCBuPVtdLHI9dC5tYXAobz0+dHlwZW9mIG89PSJvYmplY3QiP28ua2V5Om8pO2Zvcihjb25zdCBvIG9mIHIpdHlwZW9mIG89PSJudW1iZXIiP24ucHVzaChgWyR7b31dYCk6dHlwZW9mIG89PSJzeW1ib2wiP24ucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG8pKX1dYCk6L1teXHckXS8udGVzdChvKT9uLnB1c2goYFske0pTT04uc3RyaW5naWZ5KG8pfV1gKToobi5sZW5ndGgmJm4ucHVzaCgiLiIpLG4ucHVzaChvKSk7cmV0dXJuIG4uam9pbigiIil9ZnVuY3Rpb24geWkodCl7Y29uc3Qgbj1bXSxyPVsuLi50Lmlzc3Vlc10uc29ydCgobyxlKT0+KG8ucGF0aD8/W10pLmxlbmd0aC0oZS5wYXRoPz9bXSkubGVuZ3RoKTtmb3IoY29uc3QgbyBvZiByKW4ucHVzaChg4pyWICR7by5tZXNzYWdlfWApLG8ucGF0aD8ubGVuZ3RoJiZuLnB1c2goYCAg4oaSIGF0ICR7bGMoby5wYXRoKX1gKTtyZXR1cm4gbi5qb2luKGAKYCl9Y29uc3QganQ9dD0+KG4scixvLGUpPT57Y29uc3QgaT1vP3suLi5vLGFzeW5jOiExfTp7YXN5bmM6ITF9LGE9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGkpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBOZTtpZihhLmlzc3Vlcy5sZW5ndGgpe2NvbnN0IHM9bmV3KGU/LkVycj8/dCkoYS5pc3N1ZXMubWFwKGM9PmxlKGMsaSxLKCkpKSk7dGhyb3cgaGkocyxlPy5jYWxsZWUpLHN9cmV0dXJuIGEudmFsdWV9LGNpPWp0KG1lKSxPdD10PT5hc3luYyhuLHIsbyxlKT0+e2NvbnN0IGk9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgYT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0saSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UmJihhPWF3YWl0IGEpLGEuaXNzdWVzLmxlbmd0aCl7Y29uc3Qgcz1uZXcoZT8uRXJyPz90KShhLmlzc3Vlcy5tYXAoYz0+bGUoYyxpLEsoKSkpKTt0aHJvdyBoaShzLGU/LmNhbGxlZSksc31yZXR1cm4gYS52YWx1ZX0sdWk9T3QobWUpLFV0PXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sYXN5bmM6ITF9Onthc3luYzohMX0saT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7aWYoaSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiBpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3KHQ/P19pKShpLmlzc3Vlcy5tYXAoYT0+bGUoYSxlLEsoKSkpKX06e3N1Y2Nlc3M6ITAsZGF0YTppLnZhbHVlfX0sa2k9VXQobWUpLFB0PXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgaT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlJiYoaT1hd2FpdCBpKSxpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3IHQoaS5pc3N1ZXMubWFwKGE9PmxlKGEsZSxLKCkpKSl9OntzdWNjZXNzOiEwLGRhdGE6aS52YWx1ZX19LGRjPVB0KG1lKSxTaT10PT4obixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBqdCh0KShuLHIsZSl9LG9wPVNpKG1lKSx3aT10PT4obixyLG8pPT5qdCh0KShuLHIsbyksYXA9d2kobWUpLElpPXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxkaXJlY3Rpb246ImJhY2t3YXJkIn06e2RpcmVjdGlvbjoiYmFja3dhcmQifTtyZXR1cm4gT3QodCkobixyLGUpfSxzcD1JaShtZSksemk9dD0+YXN5bmMobixyLG8pPT5PdCh0KShuLHIsbyksY3A9emkobWUpLHhpPXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sZGlyZWN0aW9uOiJiYWNrd2FyZCJ9OntkaXJlY3Rpb246ImJhY2t3YXJkIn07cmV0dXJuIFV0KHQpKG4scixlKX0sdXA9eGkobWUpLFRpPXQ9PihuLHIsbyk9PlV0KHQpKG4scixvKSxscD1UaShtZSksamk9dD0+YXN5bmMobixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBQdCh0KShuLHIsZSl9LGRwPWppKG1lKSxPaT10PT5hc3luYyhuLHIsbyk9PlB0KHQpKG4scixvKSxtcD1PaShtZSksbWM9L15bY0NdWzAtOWEtel17Nix9JC8scGM9L15bMC05YS16XSskLyxmYz0vXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC8sZ2M9L15bMC05YS12QS1WXXsyMH0kLyx2Yz0vXltBLVphLXowLTldezI3fSQvLGhjPS9eW2EtekEtWjAtOV8tXXsyMX0kLywkYz0vXlAoPzooXGQrVyl8KD8hLipXKSg/PVxkfFRcZCkoXGQrWSk/KFxkK00pPyhcZCtEKT8oVCg/PVxkKShcZCtIKT8oXGQrTSk/KFxkKyhbLixdXGQrKT9TKT8pPykkLyxwcD0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLF9jPS9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLyxCZT10PT50P25ldyBSZWdFeHAoYF4oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tJHt0fVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9KSRgKTovXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMS04XVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMHxmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYpJC8sZnA9QmUoNCksZ3A9QmUoNiksdnA9QmUoNyksYmM9L14oPyFcLikoPyEuKlwuXC4pKFtBLVphLXowLTlfJytcLVwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVwtXSpcLikrW0EtWmEtel17Mix9JC8saHA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sJHA9L14oKFtePD4oKVxbXF1cXC4sOzpcc0AiXSsoXC5bXjw+KClcW1xdXFwuLDs6XHNAIl0rKSopfCgiLisiKSlAKChcW1swLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31dKXwoKFthLXpBLVpcLTAtOV0rXC4pK1thLXpBLVpdezIsfSkpJC8seWM9L15bXlxzQCJdezEsNjR9QFteXHNAXXsxLDI1NX0kL3UsX3A9eWMsYnA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8seXA9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2Z1bmN0aW9uIGtjKCl7cmV0dXJuIG5ldyBSZWdFeHAoeXAsInUiKX1jb25zdCBTYz0vXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC8sd2M9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KSkkLyxJYz10PT57Y29uc3Qgbj1iZSh0Pz8iOiIpO3JldHVybiBuZXcgUmVnRXhwKGBeKD86WzAtOUEtRl17Mn0ke259KXs1fVswLTlBLUZdezJ9JHxeKD86WzAtOWEtZl17Mn0ke259KXs1fVswLTlhLWZdezJ9JGApfSx6Yz0vXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC8oWzAtOV18WzEtMl1bMC05XXwzWzAtMl0pJC8seGM9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18Ojp8KFswLTlhLWZBLUZdezEsNH0pPzo6KFswLTlhLWZBLUZdezEsNH06Pyl7MCw2fSlcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC8sVGM9L14kfF4oPzpbMC05YS16QS1aKy9dezR9KSooPzooPzpbMC05YS16QS1aKy9dezJ9PT0pfCg/OlswLTlhLXpBLVorL117M309KSk/JC8sVWk9L15bQS1aYS16MC05Xy1dKiQvLGpjPS9eKD89LnsxLDI1M31cLj8kKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbLTAtOWEtekEtWl17MCw2MX1bMC05YS16QS1aXSk/KSpcLj8kLyxPYz0vXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cLikrW2EtekEtWl17Mix9JC8sUGk9L15odHRwcz8kLyxVYz0vXlwrWzEtOV1cZHs2LDE0fSQvLFBjPSIoPzooPzpcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKD86KD86MFsxMzU3OF18MVswMl0pLSg/OjBbMS05XXxbMTJdXFxkfDNbMDFdKXwoPzowWzQ2OV18MTEpLSg/OjBbMS05XXxbMTJdXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXGR8MlswLThdKSkpIixOYz1uZXcgUmVnRXhwKGBeJHtQY30kYCk7ZnVuY3Rpb24gRGModCl7Y29uc3Qgbj0iKD86WzAxXVxcZHwyWzAtM10pOlswLTVdXFxkIjtyZXR1cm4gdHlwZW9mIHQucHJlY2lzaW9uPT0ibnVtYmVyIj90LnByZWNpc2lvbj09PS0xP2Ake259YDp0LnByZWNpc2lvbj09PTA/YCR7bn06WzAtNV1cXGRgOmAke259OlswLTVdXFxkXFwuXFxkeyR7dC5wcmVjaXNpb259fWA6YCR7bn0oPzo6WzAtNV1cXGQoPzpcXC5cXGQrKT8pP2B9ZnVuY3Rpb24gRWModCl7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke0RjKHQpfSRgKX1mdW5jdGlvbiBaYyh0KXtjb25zdCBuPURjKHtwcmVjaXNpb246dC5wcmVjaXNpb259KSxyPVsiWiJdO3QubG9jYWwmJnIucHVzaCgiIiksdC5vZmZzZXQmJnIucHVzaCgiKFsrLV0oPzpbMDFdXFxkfDJbMC0zXSk6WzAtNV1cXGQpIik7Y29uc3Qgbz1gJHtufSg/OiR7ci5qb2luKCJ8Iil9KWA7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke1BjfVQoPzoke299KSRgKX1jb25zdCBSYz10PT57Y29uc3Qgbj10P2BbXFxzXFxTXXske3Q/Lm1pbmltdW0/PzB9LCR7dD8ubWF4aW11bT8/IiJ9fWA6IltcXHNcXFNdKiI7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke259JGApfSxDYz0vXi0/XGQrbj8kLyxBYz0vXi0/XGQrJC8sTmk9L14tP1xkKyg/OlwuXGQrKT8kLyxMYz0vXig/OnRydWV8ZmFsc2UpJC9pLE1jPS9ebnVsbCQvaSxxYz0vXnVuZGVmaW5lZCQvaSxGYz0vXlteQS1aXSokLyxKYz0vXlteYS16XSokLyxIYz0vXlswLTlhLWZBLUZdKiQvO2Z1bmN0aW9uIE50KHQsbil7cmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Ky9deyR7dH19JHtufSRgKX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHt0fX0kYCl9Y29uc3Qga3A9L15bMC05YS1mQS1GXXszMn0kLyxTcD1OdCgyMiwiPT0iKSx3cD1EdCgyMiksSXA9L15bMC05YS1mQS1GXXs0MH0kLyx6cD1OdCgyNywiPSIpLHhwPUR0KDI3KSxUcD0vXlswLTlhLWZBLUZdezY0fSQvLGpwPU50KDQzLCI9IiksT3A9RHQoNDMpLFVwPS9eWzAtOWEtZkEtRl17OTZ9JC8sUHA9TnQoNjQsIiIpLE5wPUR0KDY0KSxEcD0vXlswLTlhLWZBLUZdezEyOH0kLyxFcD1OdCg4NiwiPT0iKSxacD1EdCg4NiksUW49T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLGJhc2U2NDpUYyxiYXNlNjR1cmw6VWksYmlnaW50OkNjLGJvb2xlYW46TGMsYnJvd3NlckVtYWlsOmJwLGNpZHJ2NDp6YyxjaWRydjY6eGMsY3VpZDptYyxjdWlkMjpwYyxkYXRlOk5jLGRhdGV0aW1lOlpjLGRvbWFpbjpPYyxkdXJhdGlvbjokYyxlMTY0OlVjLGVtYWlsOmJjLGVtb2ppOmtjLGV4dGVuZGVkRHVyYXRpb246cHAsZ3VpZDpfYyxoZXg6SGMsaG9zdG5hbWU6amMsaHRtbDVFbWFpbDpocCxodHRwUHJvdG9jb2w6UGksaWRuRW1haWw6X3AsaW50ZWdlcjpBYyxpcHY0OlNjLGlwdjY6d2Msa3N1aWQ6dmMsbG93ZXJjYXNlOkZjLG1hYzpJYyxtZDVfYmFzZTY0OlNwLG1kNV9iYXNlNjR1cmw6d3AsbWQ1X2hleDprcCxuYW5vaWQ6aGMsbnVsbDpNYyxudW1iZXI6TmkscmZjNTMyMkVtYWlsOiRwLHNoYTFfYmFzZTY0OnpwLHNoYTFfYmFzZTY0dXJsOnhwLHNoYTFfaGV4OklwLHNoYTI1Nl9iYXNlNjQ6anAsc2hhMjU2X2Jhc2U2NHVybDpPcCxzaGEyNTZfaGV4OlRwLHNoYTM4NF9iYXNlNjQ6UHAsc2hhMzg0X2Jhc2U2NHVybDpOcCxzaGEzODRfaGV4OlVwLHNoYTUxMl9iYXNlNjQ6RXAsc2hhNTEyX2Jhc2U2NHVybDpacCxzaGE1MTJfaGV4OkRwLHN0cmluZzpSYyx0aW1lOkVjLHVsaWQ6ZmMsdW5kZWZpbmVkOnFjLHVuaWNvZGVFbWFpbDp5Yyx1cHBlcmNhc2U6SmMsdXVpZDpCZSx1dWlkNDpmcCx1dWlkNjpncCx1dWlkNzp2cCx4aWQ6Z2N9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksSj1kKCIkWm9kQ2hlY2siLCh0LG4pPT57dmFyIHI7dC5fem9kPz8odC5fem9kPXt9KSx0Ll96b2QuZGVmPW4sKHI9dC5fem9kKS5vbmF0dGFjaD8/KHIub25hdHRhY2g9W10pfSksV2M9e251bWJlcjoibnVtYmVyIixiaWdpbnQ6ImJpZ2ludCIsb2JqZWN0OiJkYXRlIn0sRGk9ZCgiJFpvZENoZWNrTGVzc1RoYW4iLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1XY1t0eXBlb2Ygbi52YWx1ZV07dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZyxpPShuLmluY2x1c2l2ZT9lLm1heGltdW06ZS5leGNsdXNpdmVNYXhpbXVtKT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24udmFsdWU8aSYmKG4uaW5jbHVzaXZlP2UubWF4aW11bT1uLnZhbHVlOmUuZXhjbHVzaXZlTWF4aW11bT1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1vPT57KG4uaW5jbHVzaXZlP28udmFsdWU8PW4udmFsdWU6by52YWx1ZTxuLnZhbHVlKXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOnIsY29kZToidG9vX2JpZyIsbWF4aW11bTp0eXBlb2Ygbi52YWx1ZT09Im9iamVjdCI/bi52YWx1ZS5nZXRUaW1lKCk6bi52YWx1ZSxpbnB1dDpvLnZhbHVlLGluY2x1c2l2ZTpuLmluY2x1c2l2ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxFaT1kKCIkWm9kQ2hlY2tHcmVhdGVyVGhhbiIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPVdjW3R5cGVvZiBuLnZhbHVlXTt0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLGk9KG4uaW5jbHVzaXZlP2UubWluaW11bTplLmV4Y2x1c2l2ZU1pbmltdW0pPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi52YWx1ZT5pJiYobi5pbmNsdXNpdmU/ZS5taW5pbXVtPW4udmFsdWU6ZS5leGNsdXNpdmVNaW5pbXVtPW4udmFsdWUpfSksdC5fem9kLmNoZWNrPW89Pnsobi5pbmNsdXNpdmU/by52YWx1ZT49bi52YWx1ZTpvLnZhbHVlPm4udmFsdWUpfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46cixjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06dHlwZW9mIG4udmFsdWU9PSJvYmplY3QiP24udmFsdWUuZ2V0VGltZSgpOm4udmFsdWUsaW5wdXQ6by52YWx1ZSxpbmNsdXNpdmU6bi5pbmNsdXNpdmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksQmM9ZCgiJFpvZENoZWNrTXVsdGlwbGVPZiIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2Qub25hdHRhY2gucHVzaChyPT57dmFyIG87KG89ci5fem9kLmJhZykubXVsdGlwbGVPZj8/KG8ubXVsdGlwbGVPZj1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1yPT57aWYodHlwZW9mIHIudmFsdWUhPXR5cGVvZiBuLnZhbHVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1peCBudW1iZXIgYW5kIGJpZ2ludCBpbiBtdWx0aXBsZV9vZiBjaGVjay4iKTsodHlwZW9mIHIudmFsdWU9PSJiaWdpbnQiP3IudmFsdWUlbi52YWx1ZT09PUJpZ0ludCgwKTpXcyhyLnZhbHVlLG4udmFsdWUpPT09MCl8fHIuaXNzdWVzLnB1c2goe29yaWdpbjp0eXBlb2Ygci52YWx1ZSxjb2RlOiJub3RfbXVsdGlwbGVfb2YiLGRpdmlzb3I6bi52YWx1ZSxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFZjPWQoIiRab2RDaGVja051bWJlckZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKSxuLmZvcm1hdD1uLmZvcm1hdHx8ImZsb2F0NjQiO2NvbnN0IHI9bi5mb3JtYXQ/LmluY2x1ZGVzKCJpbnQiKSxvPXI/ImludCI6Im51bWJlciIsW2UsaV09WHNbbi5mb3JtYXRdO3QuX3pvZC5vbmF0dGFjaC5wdXNoKGE9Pntjb25zdCBzPWEuX3pvZC5iYWc7cy5mb3JtYXQ9bi5mb3JtYXQscy5taW5pbXVtPWUscy5tYXhpbXVtPWksciYmKHMucGF0dGVybj1BYyl9KSx0Ll96b2QuY2hlY2s9YT0+e2NvbnN0IHM9YS52YWx1ZTtpZihyKXtpZighTnVtYmVyLmlzSW50ZWdlcihzKSl7YS5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6byxmb3JtYXQ6bi5mb3JtYXQsY29kZToiaW52YWxpZF90eXBlIixjb250aW51ZTohMSxpbnB1dDpzLGluc3Q6dH0pO3JldHVybn1pZighTnVtYmVyLmlzU2FmZUludGVnZXIocykpe3M+MD9hLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19iaWciLG1heGltdW06TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbm90ZToiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS4iLGluc3Q6dCxvcmlnaW46byxpbmNsdXNpdmU6ITAsY29udGludWU6IW4uYWJvcnR9KTphLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19zbWFsbCIsbWluaW11bTpOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixub3RlOiJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLiIsaW5zdDp0LG9yaWdpbjpvLGluY2x1c2l2ZTohMCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn19czxlJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06ZSxpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSkscz5pJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOmksaW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEtjPWQoIiRab2RDaGVja0JpZ0ludEZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdFtyLG9dPVlzW24uZm9ybWF0XTt0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kuZm9ybWF0PW4uZm9ybWF0LGkubWluaW11bT1yLGkubWF4aW11bT1vfSksdC5fem9kLmNoZWNrPWU9Pntjb25zdCBpPWUudmFsdWU7aTxyJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cixpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSksaT5vJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOm8saW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEdjPWQoIiRab2RDaGVja01heFNpemUiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2Uuc2l6ZTw9bi5tYXhpbXVtfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46S24oZSksY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksWGM9ZCgiJFpvZENoZWNrTWluU2l6ZSIsKHQsbik9Pnt2YXIgcjtKLmluaXQodCxuKSwocj10Ll96b2QuZGVmKS53aGVuPz8oci53aGVuPW89Pntjb25zdCBlPW8udmFsdWU7cmV0dXJuIUFlKGUpJiZlLnNpemUhPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLm1pbmltdW0/P051bWJlci5ORUdBVElWRV9JTkZJTklUWTtuLm1pbmltdW0+ZSYmKG8uX3pvZC5iYWcubWluaW11bT1uLm1pbmltdW0pfSksdC5fem9kLmNoZWNrPW89Pntjb25zdCBlPW8udmFsdWU7ZS5zaXplPj1uLm1pbmltdW18fG8uaXNzdWVzLnB1c2goe29yaWdpbjpLbihlKSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06bi5taW5pbXVtLGluY2x1c2l2ZTohMCxpbnB1dDplLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFljPWQoIiRab2RDaGVja1NpemVFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLm1pbmltdW09bi5zaXplLGUubWF4aW11bT1uLnNpemUsZS5zaXplPW4uc2l6ZX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlLGk9ZS5zaXplO2lmKGk9PT1uLnNpemUpcmV0dXJuO2NvbnN0IGE9aT5uLnNpemU7by5pc3N1ZXMucHVzaCh7b3JpZ2luOktuKGUpLC4uLmE/e2NvZGU6InRvb19iaWciLG1heGltdW06bi5zaXplfTp7Y29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4uc2l6ZX0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksUWM9ZCgiJFpvZENoZWNrTWF4TGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPD1uLm1heGltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksZXU9ZCgiJFpvZENoZWNrTWluTGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5taW5pbXVtPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5taW5pbXVtPmUmJihvLl96b2QuYmFnLm1pbmltdW09bi5taW5pbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPj1uLm1pbmltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4ubWluaW11bSxpbmNsdXNpdmU6ITAsaW5wdXQ6ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSx0dT1kKCIkWm9kQ2hlY2tMZW5ndGhFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5sZW5ndGghPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UubWluaW11bT1uLmxlbmd0aCxlLm1heGltdW09bi5sZW5ndGgsZS5sZW5ndGg9bi5sZW5ndGh9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZSxpPWUubGVuZ3RoO2lmKGk9PT1uLmxlbmd0aClyZXR1cm47Y29uc3QgYT1HbihlKSxzPWk+bi5sZW5ndGg7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsLi4ucz97Y29kZToidG9vX2JpZyIsbWF4aW11bTpuLmxlbmd0aH06e2NvZGU6InRvb19zbWFsbCIsbWluaW11bTpuLmxlbmd0aH0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksRXQ9ZCgiJFpvZENoZWNrU3RyaW5nRm9ybWF0IiwodCxuKT0+e3ZhciByLG87Si5pbml0KHQsbiksdC5fem9kLm9uYXR0YWNoLnB1c2goZT0+e2NvbnN0IGk9ZS5fem9kLmJhZztpLmZvcm1hdD1uLmZvcm1hdCxuLnBhdHRlcm4mJihpLnBhdHRlcm5zPz8oaS5wYXR0ZXJucz1uZXcgU2V0KSxpLnBhdHRlcm5zLmFkZChuLnBhdHRlcm4pKX0pLG4ucGF0dGVybj8ocj10Ll96b2QpLmNoZWNrPz8oci5jaGVjaz1lPT57bi5wYXR0ZXJuLmxhc3RJbmRleD0wLCFuLnBhdHRlcm4udGVzdChlLnZhbHVlKSYmZS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQsaW5wdXQ6ZS52YWx1ZSwuLi5uLnBhdHRlcm4/e3BhdHRlcm46bi5wYXR0ZXJuLnRvU3RyaW5nKCl9Ont9LGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfSk6KG89dC5fem9kKS5jaGVjaz8/KG8uY2hlY2s9KCk9Pnt9KX0pLG51PWQoIiRab2RDaGVja1JlZ2V4IiwodCxuKT0+e0V0LmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e24ucGF0dGVybi5sYXN0SW5kZXg9MCwhbi5wYXR0ZXJuLnRlc3Qoci52YWx1ZSkmJnIuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJyZWdleCIsaW5wdXQ6ci52YWx1ZSxwYXR0ZXJuOm4ucGF0dGVybi50b1N0cmluZygpLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLHJ1PWQoIiRab2RDaGVja0xvd2VyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RmMpLEV0LmluaXQodCxuKX0pLGl1PWQoIiRab2RDaGVja1VwcGVyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49SmMpLEV0LmluaXQodCxuKX0pLG91PWQoIiRab2RDaGVja0luY2x1ZGVzIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9YmUobi5pbmNsdWRlcyksbz1uZXcgUmVnRXhwKHR5cGVvZiBuLnBvc2l0aW9uPT0ibnVtYmVyIj9gXi57JHtuLnBvc2l0aW9ufX0ke3J9YDpyKTtuLnBhdHRlcm49byx0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kucGF0dGVybnM/PyhpLnBhdHRlcm5zPW5ldyBTZXQpLGkucGF0dGVybnMuYWRkKG8pfSksdC5fem9kLmNoZWNrPWU9PntlLnZhbHVlLmluY2x1ZGVzKG4uaW5jbHVkZXMsbi5wb3NpdGlvbil8fGUuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsaW5jbHVkZXM6bi5pbmNsdWRlcyxpbnB1dDplLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGF1PWQoIiRab2RDaGVja1N0YXJ0c1dpdGgiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgUmVnRXhwKGBeJHtiZShuLnByZWZpeCl9LipgKTtuLnBhdHRlcm4/PyhuLnBhdHRlcm49ciksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLnBhdHRlcm5zPz8oZS5wYXR0ZXJucz1uZXcgU2V0KSxlLnBhdHRlcm5zLmFkZChyKX0pLHQuX3pvZC5jaGVjaz1vPT57by52YWx1ZS5zdGFydHNXaXRoKG4ucHJlZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InN0YXJ0c193aXRoIixwcmVmaXg6bi5wcmVmaXgsaW5wdXQ6by52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxzdT1kKCIkWm9kQ2hlY2tFbmRzV2l0aCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPW5ldyBSZWdFeHAoYC4qJHtiZShuLnN1ZmZpeCl9JGApO24ucGF0dGVybj8/KG4ucGF0dGVybj1yKSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UucGF0dGVybnM/PyhlLnBhdHRlcm5zPW5ldyBTZXQpLGUucGF0dGVybnMuYWRkKHIpfSksdC5fem9kLmNoZWNrPW89PntvLnZhbHVlLmVuZHNXaXRoKG4uc3VmZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImVuZHNfd2l0aCIsc3VmZml4Om4uc3VmZml4LGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gdnModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSl9Y29uc3QgY3U9ZCgiJFpvZENoZWNrUHJvcGVydHkiLCh0LG4pPT57Si5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPW4uc2NoZW1hLl96b2QucnVuKHt2YWx1ZTpyLnZhbHVlW24ucHJvcGVydHldLGlzc3VlczpbXX0se30pO2lmKG8gaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBvLnRoZW4oZT0+dnMoZSxyLG4ucHJvcGVydHkpKTt2cyhvLHIsbi5wcm9wZXJ0eSl9fSksdXU9ZCgiJFpvZENoZWNrTWltZVR5cGUiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgU2V0KG4ubWltZSk7dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e28uX3pvZC5iYWcubWltZT1uLm1pbWV9KSx0Ll96b2QuY2hlY2s9bz0+e3IuaGFzKG8udmFsdWUudHlwZSl8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLHZhbHVlczpuLm1pbWUsaW5wdXQ6by52YWx1ZS50eXBlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGx1PWQoIiRab2RDaGVja092ZXJ3cml0ZSIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3IudmFsdWU9bi50eChyLnZhbHVlKX19KTtjbGFzcyBkdXtjb25zdHJ1Y3RvcihuPVtdKXt0aGlzLmNvbnRlbnQ9W10sdGhpcy5pbmRlbnQ9MCx0aGlzJiYodGhpcy5hcmdzPW4pfWluZGVudGVkKG4pe3RoaXMuaW5kZW50Kz0xLG4odGhpcyksdGhpcy5pbmRlbnQtPTF9d3JpdGUobil7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe24odGhpcyx7ZXhlY3V0aW9uOiJzeW5jIn0pLG4odGhpcyx7ZXhlY3V0aW9uOiJhc3luYyJ9KTtyZXR1cm59Y29uc3Qgbz1uLnNwbGl0KGAKYCkuZmlsdGVyKGE9PmEpLGU9TWF0aC5taW4oLi4uby5tYXAoYT0+YS5sZW5ndGgtYS50cmltU3RhcnQoKS5sZW5ndGgpKSxpPW8ubWFwKGE9PmEuc2xpY2UoZSkpLm1hcChhPT4iICIucmVwZWF0KHRoaXMuaW5kZW50KjIpK2EpO2Zvcihjb25zdCBhIG9mIGkpdGhpcy5jb250ZW50LnB1c2goYSl9Y29tcGlsZSgpe2NvbnN0IG49RnVuY3Rpb24scj10aGlzPy5hcmdzLGU9Wy4uLih0aGlzPy5jb250ZW50Pz9bIiJdKS5tYXAoaT0+YCAgJHtpfWApXTtyZXR1cm4gbmV3IG4oLi4ucixlLmpvaW4oYApgKSl9fWNvbnN0IG11PXttYWpvcjo0LG1pbm9yOjQscGF0Y2g6M30seD1kKCIkWm9kVHlwZSIsKHQsbik9Pnt2YXIgcjt0Pz8odD17fSksdC5fem9kLmRlZj1uLHQuX3pvZC5iYWc9dC5fem9kLmJhZ3x8e30sdC5fem9kLnZlcnNpb249bXU7Y29uc3Qgbz1bLi4udC5fem9kLmRlZi5jaGVja3M/P1tdXTt0Ll96b2QudHJhaXRzLmhhcygiJFpvZENoZWNrIikmJm8udW5zaGlmdCh0KTtmb3IoY29uc3QgZSBvZiBvKWZvcihjb25zdCBpIG9mIGUuX3pvZC5vbmF0dGFjaClpKHQpO2lmKG8ubGVuZ3RoPT09MCkocj10Ll96b2QpLmRlZmVycmVkPz8oci5kZWZlcnJlZD1bXSksdC5fem9kLmRlZmVycmVkPy5wdXNoKCgpPT57dC5fem9kLnJ1bj10Ll96b2QucGFyc2V9KTtlbHNle2NvbnN0IGU9KGEscyxjKT0+e2xldCB1PVBlKGEpLGw7Zm9yKGNvbnN0IGcgb2Ygcyl7aWYoZy5fem9kLmRlZi53aGVuKXtpZihhYyhhKXx8IWcuX3pvZC5kZWYud2hlbihhKSljb250aW51ZX1lbHNlIGlmKHUpY29udGludWU7Y29uc3Qgdj1hLmlzc3Vlcy5sZW5ndGgsJD1nLl96b2QuY2hlY2soYSk7aWYoJCBpbnN0YW5jZW9mIFByb21pc2UmJmM/LmFzeW5jPT09ITEpdGhyb3cgbmV3IE5lO2lmKGx8fCQgaW5zdGFuY2VvZiBQcm9taXNlKWw9KGw/P1Byb21pc2UucmVzb2x2ZSgpKS50aGVuKGFzeW5jKCk9Pnthd2FpdCAkLGEuaXNzdWVzLmxlbmd0aCE9PXYmJih1fHwodT1QZShhLHYpKSl9KTtlbHNle2lmKGEuaXNzdWVzLmxlbmd0aD09PXYpY29udGludWU7dXx8KHU9UGUoYSx2KSl9fXJldHVybiBsP2wudGhlbigoKT0+YSk6YX0saT0oYSxzLGMpPT57aWYoUGUoYSkpcmV0dXJuIGEuYWJvcnRlZD0hMCxhO2NvbnN0IHU9ZShzLG8sYyk7aWYodSBpbnN0YW5jZW9mIFByb21pc2Upe2lmKGMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIHUudGhlbihsPT50Ll96b2QucGFyc2UobCxjKSl9cmV0dXJuIHQuX3pvZC5wYXJzZSh1LGMpfTt0Ll96b2QucnVuPShhLHMpPT57aWYocy5za2lwQ2hlY2tzKXJldHVybiB0Ll96b2QucGFyc2UoYSxzKTtpZihzLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpe2NvbnN0IHU9dC5fem9kLnBhcnNlKHt2YWx1ZTphLnZhbHVlLGlzc3VlczpbXX0sey4uLnMsc2tpcENoZWNrczohMH0pO3JldHVybiB1IGluc3RhbmNlb2YgUHJvbWlzZT91LnRoZW4obD0+aShsLGEscykpOmkodSxhLHMpfWNvbnN0IGM9dC5fem9kLnBhcnNlKGEscyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2Upe2lmKHMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIGMudGhlbih1PT5lKHUsbyxzKSl9cmV0dXJuIGUoYyxvLHMpfX1PKHQsIn5zdGFuZGFyZCIsKCk9Pih7dmFsaWRhdGU6ZT0+e3RyeXtjb25zdCBpPWtpKHQsZSk7cmV0dXJuIGkuc3VjY2Vzcz97dmFsdWU6aS5kYXRhfTp7aXNzdWVzOmkuZXJyb3I/Lmlzc3Vlc319Y2F0Y2h7cmV0dXJuIGRjKHQsZSkudGhlbihhPT5hLnN1Y2Nlc3M/e3ZhbHVlOmEuZGF0YX06e2lzc3VlczphLmVycm9yPy5pc3N1ZXN9KX19LHZlbmRvcjoiem9kIix2ZXJzaW9uOjF9KSl9KSxadD1kKCIkWm9kU3RyaW5nIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPVsuLi50Py5fem9kLmJhZz8ucGF0dGVybnM/P1tdXS5wb3AoKT8/UmModC5fem9kLmJhZyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9U3RyaW5nKHIudmFsdWUpfWNhdGNoe31yZXR1cm4gdHlwZW9mIHIudmFsdWU9PSJzdHJpbmcifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscn19KSxGPWQoIiRab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57RXQuaW5pdCh0LG4pLFp0LmluaXQodCxuKX0pLHB1PWQoIiRab2RHVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1fYyksRi5pbml0KHQsbil9KSxmdT1kKCIkWm9kVVVJRCIsKHQsbik9PntpZihuLnZlcnNpb24pe2NvbnN0IG89e3YxOjEsdjI6Mix2MzozLHY0OjQsdjU6NSx2Njo2LHY3Ojcsdjg6OH1bbi52ZXJzaW9uXTtpZihvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVVUlEIHZlcnNpb246ICIke24udmVyc2lvbn0iYCk7bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPUJlKG8pKX1lbHNlIG4ucGF0dGVybj8/KG4ucGF0dGVybj1CZSgpKTtGLmluaXQodCxuKX0pLGd1PWQoIiRab2RFbWFpbCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49YmMpLEYuaW5pdCh0LG4pfSksdnU9ZCgiJFpvZFVSTCIsKHQsbik9PntGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3RyeXtjb25zdCBvPXIudmFsdWUudHJpbSgpO2lmKCFuLm5vcm1hbGl6ZSYmbi5wcm90b2NvbD8uc291cmNlPT09UGkuc291cmNlJiYhL15odHRwcz86XC9cLy9pLnRlc3Qobykpe3IuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InVybCIsbm90ZToiSW52YWxpZCBVUkwgZm9ybWF0IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn1jb25zdCBlPW5ldyBVUkwobyk7bi5ob3N0bmFtZSYmKG4uaG9zdG5hbWUubGFzdEluZGV4PTAsbi5ob3N0bmFtZS50ZXN0KGUuaG9zdG5hbWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgaG9zdG5hbWUiLHBhdHRlcm46bi5ob3N0bmFtZS5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5wcm90b2NvbCYmKG4ucHJvdG9jb2wubGFzdEluZGV4PTAsbi5wcm90b2NvbC50ZXN0KGUucHJvdG9jb2wuZW5kc1dpdGgoIjoiKT9lLnByb3RvY29sLnNsaWNlKDAsLTEpOmUucHJvdG9jb2wpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgcHJvdG9jb2wiLHBhdHRlcm46bi5wcm90b2NvbC5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5ub3JtYWxpemU/ci52YWx1ZT1lLmhyZWY6ci52YWx1ZT1vO3JldHVybn1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fX0pLGh1PWQoIiRab2RFbW9qaSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49a2MoKSksRi5pbml0KHQsbil9KSwkdT1kKCIkWm9kTmFub0lEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1oYyksRi5pbml0KHQsbil9KSxfdT1kKCIkWm9kQ1VJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49bWMpLEYuaW5pdCh0LG4pfSksYnU9ZCgiJFpvZENVSUQyIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1wYyksRi5pbml0KHQsbil9KSx5dT1kKCIkWm9kVUxJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49ZmMpLEYuaW5pdCh0LG4pfSksa3U9ZCgiJFpvZFhJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49Z2MpLEYuaW5pdCh0LG4pfSksU3U9ZCgiJFpvZEtTVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj12YyksRi5pbml0KHQsbil9KSx3dT1kKCIkWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVpjKG4pKSxGLmluaXQodCxuKX0pLEl1PWQoIiRab2RJU09EYXRlIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1OYyksRi5pbml0KHQsbil9KSx6dT1kKCIkWm9kSVNPVGltZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RWMobikpLEYuaW5pdCh0LG4pfSkseHU9ZCgiJFpvZElTT0R1cmF0aW9uIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj0kYyksRi5pbml0KHQsbil9KSxUdT1kKCIkWm9kSVB2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49U2MpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJpcHY0In0pLGp1PWQoIiRab2RJUHY2IiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj13YyksRi5pbml0KHQsbiksdC5fem9kLmJhZy5mb3JtYXQ9ImlwdjYiLHQuX3pvZC5jaGVjaz1yPT57dHJ5e25ldyBVUkwoYGh0dHA6Ly9bJHtyLnZhbHVlfV1gKX1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpcHY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KSxPdT1kKCIkWm9kTUFDIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1JYyhuLmRlbGltaXRlcikpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJtYWMifSksVXU9ZCgiJFpvZENJRFJ2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49emMpLEYuaW5pdCh0LG4pfSksUHU9ZCgiJFpvZENJRFJ2NiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49eGMpLEYuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57Y29uc3Qgbz1yLnZhbHVlLnNwbGl0KCIvIik7dHJ5e2lmKG8ubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3I7Y29uc3RbZSxpXT1vO2lmKCFpKXRocm93IG5ldyBFcnJvcjtjb25zdCBhPU51bWJlcihpKTtpZihgJHthfWAhPT1pKXRocm93IG5ldyBFcnJvcjtpZihhPDB8fGE+MTI4KXRocm93IG5ldyBFcnJvcjtuZXcgVVJMKGBodHRwOi8vWyR7ZX1dYCl9Y2F0Y2h7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiY2lkcnY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KTtmdW5jdGlvbiBaaSh0KXtpZih0PT09IiIpcmV0dXJuITA7aWYoL1xzLy50ZXN0KHQpfHx0Lmxlbmd0aCU0IT09MClyZXR1cm4hMTt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0IE51PWQoIiRab2RCYXNlNjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVRjKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZz0iYmFzZTY0Iix0Ll96b2QuY2hlY2s9cj0+e1ppKHIudmFsdWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJiYXNlNjQiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gRHUodCl7aWYoIVVpLnRlc3QodCkpcmV0dXJuITE7Y29uc3Qgbj10LnJlcGxhY2UoL1stX10vZyxvPT5vPT09Ii0iPyIrIjoiLyIpLHI9bi5wYWRFbmQoTWF0aC5jZWlsKG4ubGVuZ3RoLzQpKjQsIj0iKTtyZXR1cm4gWmkocil9Y29uc3QgRXU9ZCgiJFpvZEJhc2U2NFVSTCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWkpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuY29udGVudEVuY29kaW5nPSJiYXNlNjR1cmwiLHQuX3pvZC5jaGVjaz1yPT57RHUoci52YWx1ZSl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImJhc2U2NHVybCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxadT1kKCIkWm9kRTE2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWMpLEYuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gUnUodCxuPW51bGwpe3RyeXtjb25zdCByPXQuc3BsaXQoIi4iKTtpZihyLmxlbmd0aCE9PTMpcmV0dXJuITE7Y29uc3Rbb109cjtpZighbylyZXR1cm4hMTtjb25zdCBlPUpTT04ucGFyc2UoYXRvYihvKSk7cmV0dXJuISgidHlwImluIGUmJmU/LnR5cCE9PSJKV1QifHwhZS5hbGd8fG4mJighKCJhbGciaW4gZSl8fGUuYWxnIT09bikpfWNhdGNoe3JldHVybiExfX1jb25zdCBDdT1kKCIkWm9kSldUIiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57UnUoci52YWx1ZSxuLmFsZyl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6Imp3dCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxBdT1kKCIkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0IiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57bi5mbihyLnZhbHVlKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDpuLmZvcm1hdCxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFJpPWQoIiRab2ROdW1iZXIiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49dC5fem9kLmJhZy5wYXR0ZXJuPz9OaSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1OdW1iZXIoci52YWx1ZSl9Y2F0Y2h7fWNvbnN0IGU9ci52YWx1ZTtpZih0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNOYU4oZSkmJk51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gcjtjb25zdCBpPXR5cGVvZiBlPT0ibnVtYmVyIj9OdW1iZXIuaXNOYU4oZSk/Ik5hTiI6TnVtYmVyLmlzRmluaXRlKGUpP3ZvaWQgMDoiSW5maW5pdHkiOnZvaWQgMDtyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im51bWJlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dCwuLi5pP3tyZWNlaXZlZDppfTp7fX0pLHJ9fSksTHU9ZCgiJFpvZE51bWJlckZvcm1hdCIsKHQsbik9PntWYy5pbml0KHQsbiksUmkuaW5pdCh0LG4pfSksQ2k9ZCgiJFpvZEJvb2xlYW4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49TGMsdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9ISFyLnZhbHVlfWNhdGNoe31jb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJib29sZWFuIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxBaT1kKCIkWm9kQmlnSW50IiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPUNjLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG4uY29lcmNlKXRyeXtyLnZhbHVlPUJpZ0ludChyLnZhbHVlKX1jYXRjaHt9cmV0dXJuIHR5cGVvZiByLnZhbHVlPT0iYmlnaW50Inx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImJpZ2ludCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHJ9fSksTXU9ZCgiJFpvZEJpZ0ludEZvcm1hdCIsKHQsbik9PntLYy5pbml0KHQsbiksQWkuaW5pdCh0LG4pfSkscXU9ZCgiJFpvZFN5bWJvbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0ic3ltYm9sInx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InN5bWJvbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksRnU9ZCgiJFpvZFVuZGVmaW5lZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1xYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW3ZvaWQgMF0pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtyZXR1cm4gdHlwZW9mIGU+InUifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoidW5kZWZpbmVkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxKdT1kKCIkWm9kTnVsbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1NYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW251bGxdKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGU9PT1udWxsfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibnVsbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksSHU9ZCgiJFpvZEFueSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9cj0+cn0pLFd1PWQoIiRab2RVbmtub3duIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT1yPT5yfSksQnU9ZCgiJFpvZE5ldmVyIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+KHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJuZXZlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHIpfSksVnU9ZCgiJFpvZFZvaWQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiB0eXBlb2YgZT4idSJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJ2b2lkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxLdT1kKCIkWm9kRGF0ZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1uZXcgRGF0ZShyLnZhbHVlKX1jYXRjaHt9Y29uc3QgZT1yLnZhbHVlLGk9ZSBpbnN0YW5jZW9mIERhdGU7cmV0dXJuIGkmJiFOdW1iZXIuaXNOYU4oZS5nZXRUaW1lKCkpfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZGF0ZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLC4uLmk/e3JlY2VpdmVkOiJJbnZhbGlkIERhdGUifTp7fSxpbnN0OnR9KSxyfX0pO2Z1bmN0aW9uIGhzKHQsbixyKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4uZmUocix0Lmlzc3VlcykpLG4udmFsdWVbcl09dC52YWx1ZX1jb25zdCBHdT1kKCIkWm9kQXJyYXkiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiYXJyYXkiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyO3IudmFsdWU9QXJyYXkoZS5sZW5ndGgpO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IHM9ZVthXSxjPW4uZWxlbWVudC5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChjLnRoZW4odT0+aHModSxyLGEpKSk6aHMoYyxyLGEpfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIEFuKHQsbixyLG8sZSxpKXtjb25zdCBhPXIgaW4gbztpZih0Lmlzc3Vlcy5sZW5ndGgpe2lmKGUmJmkmJiFhKXJldHVybjtuLmlzc3Vlcy5wdXNoKC4uLmZlKHIsdC5pc3N1ZXMpKX1pZighYSYmIWUpe3QuaXNzdWVzLmxlbmd0aHx8bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnZvaWQgMCxwYXRoOltyXX0pO3JldHVybn10LnZhbHVlPT09dm9pZCAwP2EmJihuLnZhbHVlW3JdPXZvaWQgMCk6bi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFh1KHQpe2NvbnN0IG49T2JqZWN0LmtleXModC5zaGFwZSk7Zm9yKGNvbnN0IG8gb2YgbilpZighdC5zaGFwZT8uW29dPy5fem9kPy50cmFpdHM/LmhhcygiJFpvZFR5cGUiKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhdCBrZXkgIiR7b30iOiBleHBlY3RlZCBhIFpvZCBzY2hlbWFgKTtjb25zdCByPUdzKHQuc2hhcGUpO3JldHVybnsuLi50LGtleXM6bixrZXlTZXQ6bmV3IFNldChuKSxudW1LZXlzOm4ubGVuZ3RoLG9wdGlvbmFsS2V5czpuZXcgU2V0KHIpfX1mdW5jdGlvbiBZdSh0LG4scixvLGUsaSl7Y29uc3QgYT1bXSxzPWUua2V5U2V0LGM9ZS5jYXRjaGFsbC5fem9kLHU9Yy5kZWYudHlwZSxsPWMub3B0aW49PT0ib3B0aW9uYWwiLGc9Yy5vcHRvdXQ9PT0ib3B0aW9uYWwiO2Zvcihjb25zdCB2IGluIG4pe2lmKHY9PT0iX19wcm90b19fInx8cy5oYXModikpY29udGludWU7aWYodT09PSJuZXZlciIpe2EucHVzaCh2KTtjb250aW51ZX1jb25zdCAkPWMucnVuKHt2YWx1ZTpuW3ZdLGlzc3VlczpbXX0sbyk7JCBpbnN0YW5jZW9mIFByb21pc2U/dC5wdXNoKCQudGhlbih5PT5Bbih5LHIsdixuLGwsZykpKTpBbigkLHIsdixuLGwsZyl9cmV0dXJuIGEubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKHtjb2RlOiJ1bnJlY29nbml6ZWRfa2V5cyIsa2V5czphLGlucHV0Om4saW5zdDppfSksdC5sZW5ndGg/UHJvbWlzZS5hbGwodCkudGhlbigoKT0+cik6cn1jb25zdCBRdT1kKCIkWm9kT2JqZWN0IiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sInNoYXBlIik/LmdldCl7Y29uc3Qgcz1uLnNoYXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJzaGFwZSIse2dldDooKT0+e2NvbnN0IGM9ey4uLnN9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwic2hhcGUiLHt2YWx1ZTpjfSksY319KX1jb25zdCBvPVR0KCgpPT5YdShuKSk7Tyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT57Y29uc3Qgcz1uLnNoYXBlLGM9e307Zm9yKGNvbnN0IHUgaW4gcyl7Y29uc3QgbD1zW3VdLl96b2Q7aWYobC52YWx1ZXMpe2NbdV0/PyhjW3VdPW5ldyBTZXQpO2Zvcihjb25zdCBnIG9mIGwudmFsdWVzKWNbdV0uYWRkKGcpfX1yZXR1cm4gY30pO2NvbnN0IGU9SGUsaT1uLmNhdGNoYWxsO2xldCBhO3QuX3pvZC5wYXJzZT0ocyxjKT0+e2E/PyhhPW8udmFsdWUpO2NvbnN0IHU9cy52YWx1ZTtpZighZSh1KSlyZXR1cm4gcy5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im9iamVjdCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDp1LGluc3Q6dH0pLHM7cy52YWx1ZT17fTtjb25zdCBsPVtdLGc9YS5zaGFwZTtmb3IoY29uc3QgdiBvZiBhLmtleXMpe2NvbnN0ICQ9Z1t2XSx5PSQuX3pvZC5vcHRpbj09PSJvcHRpb25hbCIsSD0kLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIixMPSQuX3pvZC5ydW4oe3ZhbHVlOnVbdl0saXNzdWVzOltdfSxjKTtMIGluc3RhbmNlb2YgUHJvbWlzZT9sLnB1c2goTC50aGVuKHFlPT5BbihxZSxzLHYsdSx5LEgpKSk6QW4oTCxzLHYsdSx5LEgpfXJldHVybiBpP1l1KGwsdSxzLGMsby52YWx1ZSx0KTpsLmxlbmd0aD9Qcm9taXNlLmFsbChsKS50aGVuKCgpPT5zKTpzfX0pLGVsPWQoIiRab2RPYmplY3RKSVQiLCh0LG4pPT57UXUuaW5pdCh0LG4pO2NvbnN0IHI9dC5fem9kLnBhcnNlLG89VHQoKCk9Plh1KG4pKSxlPXY9Pntjb25zdCAkPW5ldyBkdShbInNoYXBlIiwicGF5bG9hZCIsImN0eCJdKSx5PW8udmFsdWUsSD1XPT57Y29uc3QgTT1zaShXKTtyZXR1cm5gc2hhcGVbJHtNfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtNfV0sIGlzc3VlczogW10gfSwgY3R4KWB9OyQud3JpdGUoImNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTsiKTtjb25zdCBMPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHFlPTA7Zm9yKGNvbnN0IFcgb2YgeS5rZXlzKUxbV109YGtleV8ke3FlKyt9YDskLndyaXRlKCJjb25zdCBuZXdSZXN1bHQgPSB7fTsiKTtmb3IoY29uc3QgVyBvZiB5LmtleXMpe2NvbnN0IE09TFtXXSxYPXNpKFcpLGRzPXZbV10sbXM9ZHM/Ll96b2Q/Lm9wdGluPT09Im9wdGlvbmFsIixabT1kcz8uX3pvZD8ub3B0b3V0PT09Im9wdGlvbmFsIjskLndyaXRlKGBjb25zdCAke019ID0gJHtIKFcpfTtgKSxtcyYmWm0/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske1h9LCAuLi5pc3MucGF0aF0gOiBbJHtYfV0KICAgICAgICAgICAgfSkpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6bXM/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAuLi5pc3MsCiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7WH0sIC4uLmlzcy5wYXRoXSA6IFske1h9XQogICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6JC53cml0ZShgCiAgICAgICAgY29uc3QgJHtNfV9wcmVzZW50ID0gJHtYfSBpbiBpbnB1dDsKICAgICAgICBpZiAoJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IHBheWxvYWQuaXNzdWVzLmNvbmNhdCgke019Lmlzc3Vlcy5tYXAoaXNzID0+ICh7CiAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtYfSwgLi4uaXNzLnBhdGhdIDogWyR7WH1dCiAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICBpZiAoISR7TX1fcHJlc2VudCAmJiAhJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHsKICAgICAgICAgICAgY29kZTogImludmFsaWRfdHlwZSIsCiAgICAgICAgICAgIGV4cGVjdGVkOiAibm9ub3B0aW9uYWwiLAogICAgICAgICAgICBpbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICBwYXRoOiBbJHtYfV0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR7TX1fcHJlc2VudCkgewogICAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGApfSQud3JpdGUoInBheWxvYWQudmFsdWUgPSBuZXdSZXN1bHQ7IiksJC53cml0ZSgicmV0dXJuIHBheWxvYWQ7Iik7Y29uc3QgRz0kLmNvbXBpbGUoKTtyZXR1cm4oVyxNKT0+Ryh2LFcsTSl9O2xldCBpO2NvbnN0IGE9SGUscz0ha3Quaml0bGVzcyx1PXMmJlZzLnZhbHVlLGw9bi5jYXRjaGFsbDtsZXQgZzt0Ll96b2QucGFyc2U9KHYsJCk9PntnPz8oZz1vLnZhbHVlKTtjb25zdCB5PXYudmFsdWU7cmV0dXJuIGEoeSk/cyYmdSYmJD8uYXN5bmM9PT0hMSYmJC5qaXRsZXNzIT09ITA/KGl8fChpPWUobi5zaGFwZSkpLHY9aSh2LCQpLGw/WXUoW10seSx2LCQsZyx0KTp2KTpyKHYsJCk6KHYuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJvYmplY3QiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6eSxpbnN0OnR9KSx2KX19KTtmdW5jdGlvbiAkcyh0LG4scixvKXtmb3IoY29uc3QgaSBvZiB0KWlmKGkuaXNzdWVzLmxlbmd0aD09PTApcmV0dXJuIG4udmFsdWU9aS52YWx1ZSxuO2NvbnN0IGU9dC5maWx0ZXIoaT0+IVBlKGkpKTtyZXR1cm4gZS5sZW5ndGg9PT0xPyhuLnZhbHVlPWVbMF0udmFsdWUsZVswXSk6KG4uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGlucHV0Om4udmFsdWUsaW5zdDpyLGVycm9yczp0Lm1hcChpPT5pLmlzc3Vlcy5tYXAoYT0+bGUoYSxvLEsoKSkpKX0pLG4pfWNvbnN0IGVyPWQoIiRab2RVbmlvbiIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLm9wdGlvbnMuc29tZShvPT5vLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3B0aW9ucy5zb21lKG89Pm8uX3pvZC5vcHRvdXQ9PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsInZhbHVlcyIsKCk9PntpZihuLm9wdGlvbnMuZXZlcnkobz0+by5fem9kLnZhbHVlcykpcmV0dXJuIG5ldyBTZXQobi5vcHRpb25zLmZsYXRNYXAobz0+QXJyYXkuZnJvbShvLl96b2QudmFsdWVzKSkpfSksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57aWYobi5vcHRpb25zLmV2ZXJ5KG89Pm8uX3pvZC5wYXR0ZXJuKSl7Y29uc3Qgbz1uLm9wdGlvbnMubWFwKGU9PmUuX3pvZC5wYXR0ZXJuKTtyZXR1cm4gbmV3IFJlZ0V4cChgXigke28ubWFwKGU9PkJuKGUuc291cmNlKSkuam9pbigifCIpfSkkYCl9fSk7Y29uc3Qgcj1uLm9wdGlvbnMubGVuZ3RoPT09MT9uLm9wdGlvbnNbMF0uX3pvZC5ydW46bnVsbDt0Ll96b2QucGFyc2U9KG8sZSk9PntpZihyKXJldHVybiByKG8sZSk7bGV0IGk9ITE7Y29uc3QgYT1bXTtmb3IoY29uc3QgcyBvZiBuLm9wdGlvbnMpe2NvbnN0IGM9cy5fem9kLnJ1bih7dmFsdWU6by52YWx1ZSxpc3N1ZXM6W119LGUpO2lmKGMgaW5zdGFuY2VvZiBQcm9taXNlKWEucHVzaChjKSxpPSEwO2Vsc2V7aWYoYy5pc3N1ZXMubGVuZ3RoPT09MClyZXR1cm4gYzthLnB1c2goYyl9fXJldHVybiBpP1Byb21pc2UuYWxsKGEpLnRoZW4ocz0+JHMocyxvLHQsZSkpOiRzKGEsbyx0LGUpfX0pO2Z1bmN0aW9uIF9zKHQsbixyLG8pe2NvbnN0IGU9dC5maWx0ZXIoaT0+aS5pc3N1ZXMubGVuZ3RoPT09MCk7cmV0dXJuIGUubGVuZ3RoPT09MT8obi52YWx1ZT1lWzBdLnZhbHVlLG4pOihlLmxlbmd0aD09PTA/bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOnQubWFwKGk9PmkuaXNzdWVzLm1hcChhPT5sZShhLG8sSygpKSkpfSk6bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOltdLGluY2x1c2l2ZTohMX0pLG4pfWNvbnN0IHRsPWQoIiRab2RYb3IiLCh0LG4pPT57ZXIuaW5pdCh0LG4pLG4uaW5jbHVzaXZlPSExO2NvbnN0IHI9bi5vcHRpb25zLmxlbmd0aD09PTE/bi5vcHRpb25zWzBdLl96b2QucnVuOm51bGw7dC5fem9kLnBhcnNlPShvLGUpPT57aWYocilyZXR1cm4gcihvLGUpO2xldCBpPSExO2NvbnN0IGE9W107Zm9yKGNvbnN0IHMgb2Ygbi5vcHRpb25zKXtjb25zdCBjPXMuX3pvZC5ydW4oe3ZhbHVlOm8udmFsdWUsaXNzdWVzOltdfSxlKTtjIGluc3RhbmNlb2YgUHJvbWlzZT8oYS5wdXNoKGMpLGk9ITApOmEucHVzaChjKX1yZXR1cm4gaT9Qcm9taXNlLmFsbChhKS50aGVuKHM9Pl9zKHMsbyx0LGUpKTpfcyhhLG8sdCxlKX19KSxubD1kKCIkWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e24uaW5jbHVzaXZlPSExLGVyLmluaXQodCxuKTtjb25zdCByPXQuX3pvZC5wYXJzZTtPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pntjb25zdCBlPXt9O2Zvcihjb25zdCBpIG9mIG4ub3B0aW9ucyl7Y29uc3QgYT1pLl96b2QucHJvcFZhbHVlcztpZighYXx8T2JqZWN0LmtleXMoYSkubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoaSl9ImApO2Zvcihjb25zdFtzLGNdb2YgT2JqZWN0LmVudHJpZXMoYSkpe2Vbc118fChlW3NdPW5ldyBTZXQpO2Zvcihjb25zdCB1IG9mIGMpZVtzXS5hZGQodSl9fXJldHVybiBlfSk7Y29uc3Qgbz1UdCgoKT0+e2NvbnN0IGU9bi5vcHRpb25zLGk9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBzPWEuX3pvZC5wcm9wVmFsdWVzPy5bbi5kaXNjcmltaW5hdG9yXTtpZighc3x8cy5zaXplPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoYSl9ImApO2Zvcihjb25zdCBjIG9mIHMpe2lmKGkuaGFzKGMpKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgIiR7U3RyaW5nKGMpfSJgKTtpLnNldChjLGEpfX1yZXR1cm4gaX0pO3QuX3pvZC5wYXJzZT0oZSxpKT0+e2NvbnN0IGE9ZS52YWx1ZTtpZighSGUoYSkpcmV0dXJuIGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6Im9iamVjdCIsaW5wdXQ6YSxpbnN0OnR9KSxlO2NvbnN0IHM9by52YWx1ZS5nZXQoYT8uW24uZGlzY3JpbWluYXRvcl0pO3JldHVybiBzP3MuX3pvZC5ydW4oZSxpKTpuLnVuaW9uRmFsbGJhY2t8fGkuZGlyZWN0aW9uPT09ImJhY2t3YXJkIj9yKGUsaSk6KGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGVycm9yczpbXSxub3RlOiJObyBtYXRjaGluZyBkaXNjcmltaW5hdG9yIixkaXNjcmltaW5hdG9yOm4uZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20oby52YWx1ZS5rZXlzKCkpLGlucHV0OmEscGF0aDpbbi5kaXNjcmltaW5hdG9yXSxpbnN0OnR9KSxlKX19KSxybD1kKCIkWm9kSW50ZXJzZWN0aW9uIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZSxpPW4ubGVmdC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pLGE9bi5yaWdodC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZXx8YSBpbnN0YW5jZW9mIFByb21pc2U/UHJvbWlzZS5hbGwoW2ksYV0pLnRoZW4oKFtjLHVdKT0+YnMocixjLHUpKTpicyhyLGksYSl9fSk7ZnVuY3Rpb24gbGkodCxuKXtpZih0PT09bilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUmJit0PT0rbilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZihEZSh0KSYmRGUobikpe2NvbnN0IHI9T2JqZWN0LmtleXMobiksbz1PYmplY3Qua2V5cyh0KS5maWx0ZXIoaT0+ci5pbmRleE9mKGkpIT09LTEpLGU9ey4uLnQsLi4ubn07Zm9yKGNvbnN0IGkgb2Ygbyl7Y29uc3QgYT1saSh0W2ldLG5baV0pO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbaSwuLi5hLm1lcmdlRXJyb3JQYXRoXX07ZVtpXT1hLmRhdGF9cmV0dXJue3ZhbGlkOiEwLGRhdGE6ZX19aWYoQXJyYXkuaXNBcnJheSh0KSYmQXJyYXkuaXNBcnJheShuKSl7aWYodC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm57dmFsaWQ6ITEsbWVyZ2VFcnJvclBhdGg6W119O2NvbnN0IHI9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGU9dFtvXSxpPW5bb10sYT1saShlLGkpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbbywuLi5hLm1lcmdlRXJyb3JQYXRoXX07ci5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6cn19cmV0dXJue3ZhbGlkOiExLG1lcmdlRXJyb3JQYXRoOltdfX1mdW5jdGlvbiBicyh0LG4scil7Y29uc3Qgbz1uZXcgTWFwO2xldCBlO2Zvcihjb25zdCBzIG9mIG4uaXNzdWVzKWlmKHMuY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyIpe2U/PyhlPXMpO2Zvcihjb25zdCBjIG9mIHMua2V5cylvLmhhcyhjKXx8by5zZXQoYyx7fSksby5nZXQoYykubD0hMH1lbHNlIHQuaXNzdWVzLnB1c2gocyk7Zm9yKGNvbnN0IHMgb2Ygci5pc3N1ZXMpaWYocy5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIilmb3IoY29uc3QgYyBvZiBzLmtleXMpby5oYXMoYyl8fG8uc2V0KGMse30pLG8uZ2V0KGMpLnI9ITA7ZWxzZSB0Lmlzc3Vlcy5wdXNoKHMpO2NvbnN0IGk9Wy4uLm9dLmZpbHRlcigoWyxzXSk9PnMubCYmcy5yKS5tYXAoKFtzXSk9PnMpO2lmKGkubGVuZ3RoJiZlJiZ0Lmlzc3Vlcy5wdXNoKHsuLi5lLGtleXM6aX0pLFBlKHQpKXJldHVybiB0O2NvbnN0IGE9bGkobi52YWx1ZSxyLnZhbHVlKTtpZighYS52YWxpZCl0aHJvdyBuZXcgRXJyb3IoYFVubWVyZ2FibGUgaW50ZXJzZWN0aW9uLiBFcnJvciBwYXRoOiAke0pTT04uc3RyaW5naWZ5KGEubWVyZ2VFcnJvclBhdGgpfWApO3JldHVybiB0LnZhbHVlPWEuZGF0YSx0fWNvbnN0IExpPWQoIiRab2RUdXBsZSIsKHQsbik9Pnt4LmluaXQodCxuKTtjb25zdCByPW4uaXRlbXM7dC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtpbnB1dDppLGluc3Q6dCxleHBlY3RlZDoidHVwbGUiLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxvO28udmFsdWU9W107Y29uc3QgYT1bXSxzPXlzKHIsIm9wdGluIiksYz15cyhyLCJvcHRvdXQiKTtpZighbi5yZXN0KXtpZihpLmxlbmd0aDxzKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cyxpbmNsdXNpdmU6ITAsaW5wdXQ6aSxpbnN0OnQsb3JpZ2luOiJhcnJheSJ9KSxvO2kubGVuZ3RoPnIubGVuZ3RoJiZvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fYmlnIixtYXhpbXVtOnIubGVuZ3RoLGluY2x1c2l2ZTohMCxpbnB1dDppLGluc3Q6dCxvcmlnaW46ImFycmF5In0pfWNvbnN0IHU9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7Y29uc3QgZz1yW2xdLl96b2QucnVuKHt2YWx1ZTppW2xdLGlzc3VlczpbXX0sZSk7ZyBpbnN0YW5jZW9mIFByb21pc2U/YS5wdXNoKGcudGhlbih2PT57dVtsXT12fSkpOnVbbF09Z31pZihuLnJlc3Qpe2xldCBsPXIubGVuZ3RoLTE7Y29uc3QgZz1pLnNsaWNlKHIubGVuZ3RoKTtmb3IoY29uc3QgdiBvZiBnKXtsKys7Y29uc3QgJD1uLnJlc3QuX3pvZC5ydW4oe3ZhbHVlOnYsaXNzdWVzOltdfSxlKTskIGluc3RhbmNlb2YgUHJvbWlzZT9hLnB1c2goJC50aGVuKHk9PmtzKHksbyxsKSkpOmtzKCQsbyxsKX19cmV0dXJuIGEubGVuZ3RoP1Byb21pc2UuYWxsKGEpLnRoZW4oKCk9PlNzKHUsbyxyLGksYykpOlNzKHUsbyxyLGksYyl9fSk7ZnVuY3Rpb24geXModCxuKXtmb3IobGV0IHI9dC5sZW5ndGgtMTtyPj0wO3ItLSlpZih0W3JdLl96b2Rbbl0hPT0ib3B0aW9uYWwiKXJldHVybiByKzE7cmV0dXJuIDB9ZnVuY3Rpb24ga3ModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSksbi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFNzKHQsbixyLG8sZSl7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspe2NvbnN0IGE9dFtpXSxzPWk8by5sZW5ndGg7aWYoYS5pc3N1ZXMubGVuZ3RoKXtpZighcyYmaT49ZSl7bi52YWx1ZS5sZW5ndGg9aTticmVha31uLmlzc3Vlcy5wdXNoKC4uLmZlKGksYS5pc3N1ZXMpKX1uLnZhbHVlW2ldPWEudmFsdWV9Zm9yKGxldCBpPW4udmFsdWUubGVuZ3RoLTE7aT49by5sZW5ndGgmJihyW2ldLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIiYmbi52YWx1ZVtpXT09PXZvaWQgMCk7aS0tKW4udmFsdWUubGVuZ3RoPWk7cmV0dXJuIG59Y29uc3QgaWw9ZCgiJFpvZFJlY29yZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIURlKGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoicmVjb3JkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdLGE9bi5rZXlUeXBlLl96b2QudmFsdWVzO2lmKGEpe3IudmFsdWU9e307Y29uc3Qgcz1uZXcgU2V0O2Zvcihjb25zdCB1IG9mIGEpaWYodHlwZW9mIHU9PSJzdHJpbmcifHx0eXBlb2YgdT09Im51bWJlciJ8fHR5cGVvZiB1PT0ic3ltYm9sIil7cy5hZGQodHlwZW9mIHU9PSJudW1iZXIiP3UudG9TdHJpbmcoKTp1KTtjb25zdCBsPW4ua2V5VHlwZS5fem9kLnJ1bih7dmFsdWU6dSxpc3N1ZXM6W119LG8pO2lmKGwgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2lmKGwuaXNzdWVzLmxlbmd0aCl7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6bC5pc3N1ZXMubWFwKCQ9PmxlKCQsbyxLKCkpKSxpbnB1dDp1LHBhdGg6W3VdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGc9bC52YWx1ZSx2PW4udmFsdWVUeXBlLl96b2QucnVuKHt2YWx1ZTplW3VdLGlzc3VlczpbXX0sbyk7diBpbnN0YW5jZW9mIFByb21pc2U/aS5wdXNoKHYudGhlbigkPT57JC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHUsJC5pc3N1ZXMpKSxyLnZhbHVlW2ddPSQudmFsdWV9KSk6KHYuaXNzdWVzLmxlbmd0aCYmci5pc3N1ZXMucHVzaCguLi5mZSh1LHYuaXNzdWVzKSksci52YWx1ZVtnXT12LnZhbHVlKX1sZXQgYztmb3IoY29uc3QgdSBpbiBlKXMuaGFzKHUpfHwoYz1jPz9bXSxjLnB1c2godSkpO2MmJmMubGVuZ3RoPjAmJnIuaXNzdWVzLnB1c2goe2NvZGU6InVucmVjb2duaXplZF9rZXlzIixpbnB1dDplLGluc3Q6dCxrZXlzOmN9KX1lbHNle3IudmFsdWU9e307Zm9yKGNvbnN0IHMgb2YgUmVmbGVjdC5vd25LZXlzKGUpKXtpZihzPT09Il9fcHJvdG9fXyJ8fCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxzKSljb250aW51ZTtsZXQgYz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOnMsaXNzdWVzOltdfSxvKTtpZihjIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHkiKTtpZih0eXBlb2Ygcz09InN0cmluZyImJk5pLnRlc3QocykmJmMuaXNzdWVzLmxlbmd0aCl7Y29uc3QgZz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOk51bWJlcihzKSxpc3N1ZXM6W119LG8pO2lmKGcgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2cuaXNzdWVzLmxlbmd0aD09PTAmJihjPWcpfWlmKGMuaXNzdWVzLmxlbmd0aCl7bi5tb2RlPT09Imxvb3NlIj9yLnZhbHVlW3NdPWVbc106ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6Yy5pc3N1ZXMubWFwKGc9PmxlKGcsbyxLKCkpKSxpbnB1dDpzLHBhdGg6W3NdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGw9bi52YWx1ZVR5cGUuX3pvZC5ydW4oe3ZhbHVlOmVbc10saXNzdWVzOltdfSxvKTtsIGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2gobC50aGVuKGc9PntnLmlzc3Vlcy5sZW5ndGgmJnIuaXNzdWVzLnB1c2goLi4uZmUocyxnLmlzc3VlcykpLHIudmFsdWVbYy52YWx1ZV09Zy52YWx1ZX0pKToobC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHMsbC5pc3N1ZXMpKSxyLnZhbHVlW2MudmFsdWVdPWwudmFsdWUpfX1yZXR1cm4gaS5sZW5ndGg/UHJvbWlzZS5hbGwoaSkudGhlbigoKT0+cik6cn19KSxvbD1kKCIkWm9kTWFwIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtpZighKGUgaW5zdGFuY2VvZiBNYXApKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibWFwIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdO3IudmFsdWU9bmV3IE1hcDtmb3IoY29uc3RbYSxzXW9mIGUpe2NvbnN0IGM9bi5rZXlUeXBlLl96b2QucnVuKHt2YWx1ZTphLGlzc3VlczpbXX0sbyksdT1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlfHx1IGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2goUHJvbWlzZS5hbGwoW2MsdV0pLnRoZW4oKFtsLGddKT0+e3dzKGwsZyxyLGEsZSx0LG8pfSkpOndzKGMsdSxyLGEsZSx0LG8pfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIHdzKHQsbixyLG8sZSxpLGEpe3QuaXNzdWVzLmxlbmd0aCYmKENuLmhhcyh0eXBlb2Ygbyk/ci5pc3N1ZXMucHVzaCguLi5mZShvLHQuaXNzdWVzKSk6ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoibWFwIixpbnB1dDplLGluc3Q6aSxpc3N1ZXM6dC5pc3N1ZXMubWFwKHM9PmxlKHMsYSxLKCkpKX0pKSxuLmlzc3Vlcy5sZW5ndGgmJihDbi5oYXModHlwZW9mIG8pP3IuaXNzdWVzLnB1c2goLi4uZmUobyxuLmlzc3VlcykpOnIuaXNzdWVzLnB1c2goe29yaWdpbjoibWFwIixjb2RlOiJpbnZhbGlkX2VsZW1lbnQiLGlucHV0OmUsaW5zdDppLGtleTpvLGlzc3VlczpuLmlzc3Vlcy5tYXAocz0+bGUocyxhLEsoKSkpfSkpLHIudmFsdWUuc2V0KHQudmFsdWUsbi52YWx1ZSl9Y29uc3QgYWw9ZCgiJFpvZFNldCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIShlIGluc3RhbmNlb2YgU2V0KSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7aW5wdXQ6ZSxpbnN0OnQsZXhwZWN0ZWQ6InNldCIsY29kZToiaW52YWxpZF90eXBlIn0pLHI7Y29uc3QgaT1bXTtyLnZhbHVlPW5ldyBTZXQ7Zm9yKGNvbnN0IGEgb2YgZSl7Y29uc3Qgcz1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6YSxpc3N1ZXM6W119LG8pO3MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChzLnRoZW4oYz0+SXMoYyxyKSkpOklzKHMscil9cmV0dXJuIGkubGVuZ3RoP1Byb21pc2UuYWxsKGkpLnRoZW4oKCk9PnIpOnJ9fSk7ZnVuY3Rpb24gSXModCxuKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4udC5pc3N1ZXMpLG4udmFsdWUuYWRkKHQudmFsdWUpfWNvbnN0IHNsPWQoIiRab2RFbnVtIiwodCxuKT0+e3guaW5pdCh0LG4pO2NvbnN0IHI9dmkobi5lbnRyaWVzKSxvPW5ldyBTZXQocik7dC5fem9kLnZhbHVlcz1vLHQuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4oJHtyLmZpbHRlcihlPT5Dbi5oYXModHlwZW9mIGUpKS5tYXAoZT0+dHlwZW9mIGU9PSJzdHJpbmciP2JlKGUpOmUudG9TdHJpbmcoKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShlLGkpPT57Y29uc3QgYT1lLnZhbHVlO3JldHVybiBvLmhhcyhhKXx8ZS5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOnIsaW5wdXQ6YSxpbnN0OnR9KSxlfX0pLGNsPWQoIiRab2RMaXRlcmFsIiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLG4udmFsdWVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIGxpdGVyYWwgc2NoZW1hIHdpdGggbm8gdmFsaWQgdmFsdWVzIik7Y29uc3Qgcj1uZXcgU2V0KG4udmFsdWVzKTt0Ll96b2QudmFsdWVzPXIsdC5fem9kLnBhdHRlcm49bmV3IFJlZ0V4cChgXigke24udmFsdWVzLm1hcChvPT50eXBlb2Ygbz09InN0cmluZyI/YmUobyk6bz9iZShvLnRvU3RyaW5nKCkpOlN0cmluZyhvKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO3JldHVybiByLmhhcyhpKXx8by5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOm4udmFsdWVzLGlucHV0OmksaW5zdDp0fSksb319KSx1bD1kKCIkWm9kRmlsZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGUgaW5zdGFuY2VvZiBGaWxlfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZmlsZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksbGw9ZCgiJFpvZFRyYW5zZm9ybSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKHQuY29uc3RydWN0b3IubmFtZSk7Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO2lmKG8uYXN5bmMpcmV0dXJuKGUgaW5zdGFuY2VvZiBQcm9taXNlP2U6UHJvbWlzZS5yZXNvbHZlKGUpKS50aGVuKGE9PihyLnZhbHVlPWEsci5mYWxsYmFjaz0hMCxyKSk7aWYoZSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiByLnZhbHVlPWUsci5mYWxsYmFjaz0hMCxyfX0pO2Z1bmN0aW9uIHpzKHQsbil7cmV0dXJuIG49PT12b2lkIDAmJih0Lmlzc3Vlcy5sZW5ndGh8fHQuZmFsbGJhY2spP3tpc3N1ZXM6W10sdmFsdWU6dm9pZCAwfTp0fWNvbnN0IE1pPWQoIiRab2RPcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2Qub3B0b3V0PSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzP25ldyBTZXQoWy4uLm4uaW5uZXJUeXBlLl96b2QudmFsdWVzLHZvaWQgMF0pOnZvaWQgMCksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57Y29uc3Qgcj1uLmlubmVyVHlwZS5fem9kLnBhdHRlcm47cmV0dXJuIHI/bmV3IFJlZ0V4cChgXigke0JuKHIuc291cmNlKX0pPyRgKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmlubmVyVHlwZS5fem9kLm9wdGluPT09Im9wdGlvbmFsIil7Y29uc3QgZT1yLnZhbHVlLGk9bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtyZXR1cm4gaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGE9PnpzKGEsZSkpOnpzKGksZSl9cmV0dXJuIHIudmFsdWU9PT12b2lkIDA/cjpuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfX0pLGRsPWQoIiRab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxtbD1kKCIkWm9kTnVsbGFibGUiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsIm9wdGluIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwicGF0dGVybiIsKCk9Pntjb25zdCByPW4uaW5uZXJUeXBlLl96b2QucGF0dGVybjtyZXR1cm4gcj9uZXcgUmVnRXhwKGBeKCR7Qm4oci5zb3VyY2UpfXxudWxsKSRgKTp2b2lkIDB9KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM/bmV3IFNldChbLi4ubi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsbnVsbF0pOnZvaWQgMCksdC5fem9kLnBhcnNlPShyLG8pPT5yLnZhbHVlPT09bnVsbD9yOm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxwbD1kKCIkWm9kRGVmYXVsdCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIixPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtpZihyLnZhbHVlPT09dm9pZCAwKXJldHVybiByLnZhbHVlPW4uZGVmYXVsdFZhbHVlLHI7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+eHMoaSxuKSk6eHMoZSxuKX19KTtmdW5jdGlvbiB4cyh0LG4pe3JldHVybiB0LnZhbHVlPT09dm9pZCAwJiYodC52YWx1ZT1uLmRlZmF1bHRWYWx1ZSksdH1jb25zdCBmbD1kKCIkWm9kUHJlZmF1bHQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCJ8fHIudmFsdWU9PT12b2lkIDAmJihyLnZhbHVlPW4uZGVmYXVsdFZhbHVlKSxuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pKX0pLGdsPWQoIiRab2ROb25PcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+e2NvbnN0IHI9bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM7cmV0dXJuIHI/bmV3IFNldChbLi4ucl0uZmlsdGVyKG89Pm8hPT12b2lkIDApKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5UcyhpLHQpKTpUcyhlLHQpfX0pO2Z1bmN0aW9uIFRzKHQsbil7cmV0dXJuIXQuaXNzdWVzLmxlbmd0aCYmdC52YWx1ZT09PXZvaWQgMCYmdC5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnQudmFsdWUsaW5zdDpufSksdH1jb25zdCB2bD1kKCIkWm9kU3VjY2VzcyIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKCJab2RTdWNjZXNzIik7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aS5pc3N1ZXMubGVuZ3RoPT09MCxyKSk6KHIudmFsdWU9ZS5pc3N1ZXMubGVuZ3RoPT09MCxyKX19KSxobD1kKCIkWm9kQ2F0Y2giLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT4oci52YWx1ZT1pLnZhbHVlLGkuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6aS5pc3N1ZXMubWFwKGE9PmxlKGEsbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpKTooci52YWx1ZT1lLnZhbHVlLGUuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6ZS5pc3N1ZXMubWFwKGk9PmxlKGksbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpfX0pLCRsPWQoIiRab2ROYU4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT4oKHR5cGVvZiByLnZhbHVlIT0ibnVtYmVyInx8IU51bWJlci5pc05hTihyLnZhbHVlKSkmJnIuaXNzdWVzLnB1c2goe2lucHV0OnIudmFsdWUsaW5zdDp0LGV4cGVjdGVkOiJuYW4iLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxyKX0pLHFpPWQoIiRab2RQaXBlIiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmluLl96b2QudmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLmluLl96b2Qub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLm91dC5fem9kLm9wdG91dCksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT5uLmluLl96b2QucHJvcFZhbHVlcyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5ObihhLG4uaW4sbykpOk5uKGksbi5pbixvKX1jb25zdCBlPW4uaW4uX3pvZC5ydW4ocixvKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9Pk5uKGksbi5vdXQsbykpOk5uKGUsbi5vdXQsbyl9fSk7ZnVuY3Rpb24gTm4odCxuLHIpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpuLl96b2QucnVuKHt2YWx1ZTp0LnZhbHVlLGlzc3Vlczp0Lmlzc3VlcyxmYWxsYmFjazp0LmZhbGxiYWNrfSxyKX1jb25zdCBGaT1kKCIkWm9kQ29kZWMiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW4uX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW4uX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3V0Ll96b2Qub3B0b3V0KSxPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pm4uaW4uX3pvZC5wcm9wVmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZigoby5kaXJlY3Rpb258fCJmb3J3YXJkIik9PT0iZm9yd2FyZCIpe2NvbnN0IGk9bi5pbi5fem9kLnJ1bihyLG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZT9pLnRoZW4oYT0+RG4oYSxuLG8pKTpEbihpLG4sbyl9ZWxzZXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5EbihhLG4sbykpOkRuKGksbixvKX19fSk7ZnVuY3Rpb24gRG4odCxuLHIpe2lmKHQuaXNzdWVzLmxlbmd0aClyZXR1cm4gdC5hYm9ydGVkPSEwLHQ7aWYoKHIuZGlyZWN0aW9ufHwiZm9yd2FyZCIpPT09ImZvcndhcmQiKXtjb25zdCBlPW4udHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5vdXQscikpOkVuKHQsZSxuLm91dCxyKX1lbHNle2NvbnN0IGU9bi5yZXZlcnNlVHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5pbixyKSk6RW4odCxlLG4uaW4scil9fWZ1bmN0aW9uIEVuKHQsbixyLG8pe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpyLl96b2QucnVuKHt2YWx1ZTpuLGlzc3Vlczp0Lmlzc3Vlc30sbyl9Y29uc3QgX2w9ZCgiJFpvZFByZXByb2Nlc3MiLCh0LG4pPT57cWkuaW5pdCh0LG4pfSksYmw9ZCgiJFpvZFJlYWRvbmx5IiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRvdXQpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihqcyk6anMoZSl9fSk7ZnVuY3Rpb24ganModCl7cmV0dXJuIHQudmFsdWU9T2JqZWN0LmZyZWV6ZSh0LnZhbHVlKSx0fWNvbnN0IHlsPWQoIiRab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eC5pbml0KHQsbik7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbyBvZiBuLnBhcnRzKWlmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpe2lmKCFvLl96b2QucGF0dGVybil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0LCBubyBwYXR0ZXJuIGZvdW5kOiAke1suLi5vLl96b2QudHJhaXRzXS5zaGlmdCgpfWApO2NvbnN0IGU9by5fem9kLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHA/by5fem9kLnBhdHRlcm4uc291cmNlOm8uX3pvZC5wYXR0ZXJuO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7by5fem9kLnRyYWl0c31gKTtjb25zdCBpPWUuc3RhcnRzV2l0aCgiXiIpPzE6MCxhPWUuZW5kc1dpdGgoIiQiKT9lLmxlbmd0aC0xOmUubGVuZ3RoO3IucHVzaChlLnNsaWNlKGksYSkpfWVsc2UgaWYobz09PW51bGx8fEtzLmhhcyh0eXBlb2Ygbykpci5wdXNoKGJlKGAke299YCkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtvfWApO3QuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4ke3Iuam9pbigiIil9JGApLHQuX3pvZC5wYXJzZT0obyxlKT0+dHlwZW9mIG8udmFsdWUhPSJzdHJpbmciPyhvLmlzc3Vlcy5wdXNoKHtpbnB1dDpvLnZhbHVlLGluc3Q6dCxleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUifSksbyk6KHQuX3pvZC5wYXR0ZXJuLmxhc3RJbmRleD0wLHQuX3pvZC5wYXR0ZXJuLnRlc3Qoby52YWx1ZSl8fG8uaXNzdWVzLnB1c2goe2lucHV0Om8udmFsdWUsaW5zdDp0LGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQ/PyJ0ZW1wbGF0ZV9saXRlcmFsIixwYXR0ZXJuOnQuX3pvZC5wYXR0ZXJuLnNvdXJjZX0pLG8pfSksa2w9ZCgiJFpvZEZ1bmN0aW9uIiwodCxuKT0+KHguaW5pdCh0LG4pLHQuX2RlZj1uLHQuX3pvZC5kZWY9bix0LmltcGxlbWVudD1yPT57aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb24iKTtyZXR1cm4gZnVuY3Rpb24oLi4ubyl7Y29uc3QgZT10Ll9kZWYuaW5wdXQ/Y2kodC5fZGVmLmlucHV0LG8pOm8saT1SZWZsZWN0LmFwcGx5KHIsdGhpcyxlKTtyZXR1cm4gdC5fZGVmLm91dHB1dD9jaSh0Ll9kZWYub3V0cHV0LGkpOml9fSx0LmltcGxlbWVudEFzeW5jPXI9PntpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIik7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKC4uLm8pe2NvbnN0IGU9dC5fZGVmLmlucHV0P2F3YWl0IHVpKHQuX2RlZi5pbnB1dCxvKTpvLGk9YXdhaXQgUmVmbGVjdC5hcHBseShyLHRoaXMsZSk7cmV0dXJuIHQuX2RlZi5vdXRwdXQ/YXdhaXQgdWkodC5fZGVmLm91dHB1dCxpKTppfX0sdC5fem9kLnBhcnNlPShyLG8pPT50eXBlb2Ygci52YWx1ZSE9ImZ1bmN0aW9uIj8oci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoiZnVuY3Rpb24iLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscik6KHQuX2RlZi5vdXRwdXQmJnQuX2RlZi5vdXRwdXQuX3pvZC5kZWYudHlwZT09PSJwcm9taXNlIj9yLnZhbHVlPXQuaW1wbGVtZW50QXN5bmMoci52YWx1ZSk6ci52YWx1ZT10LmltcGxlbWVudChyLnZhbHVlKSxyKSx0LmlucHV0PSguLi5yKT0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gQXJyYXkuaXNBcnJheShyWzBdKT9uZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0Om5ldyBMaSh7dHlwZToidHVwbGUiLGl0ZW1zOnJbMF0scmVzdDpyWzFdfSksb3V0cHV0OnQuX2RlZi5vdXRwdXR9KTpuZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0OnJbMF0sb3V0cHV0OnQuX2RlZi5vdXRwdXR9KX0sdC5vdXRwdXQ9cj0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IG8oe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDp0Ll9kZWYuaW5wdXQsb3V0cHV0OnJ9KX0sdCkpLFNsPWQoIiRab2RQcm9taXNlIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+UHJvbWlzZS5yZXNvbHZlKHIudmFsdWUpLnRoZW4oZT0+bi5pbm5lclR5cGUuX3pvZC5ydW4oe3ZhbHVlOmUsaXNzdWVzOltdfSxvKSl9KSx3bD1kKCIkWm9kTGF6eSIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwiaW5uZXJUeXBlIiwoKT0+e2NvbnN0IHI9bjtyZXR1cm4gci5fY2FjaGVkSW5uZXJ8fChyLl9jYWNoZWRJbm5lcj1uLmdldHRlcigpKSxyLl9jYWNoZWRJbm5lcn0pLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ucGF0dGVybiksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5wcm9wVmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5vcHRpbj8/dm9pZCAwKSxPKHQuX3pvZCwib3B0b3V0IiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0Pz92b2lkIDApLHQuX3pvZC5wYXJzZT0ocixvKT0+dC5fem9kLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfSksSWw9ZCgiJFpvZEN1c3RvbSIsKHQsbik9PntKLmluaXQodCxuKSx4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PnIsdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPXIudmFsdWUsZT1uLmZuKG8pO2lmKGUgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBlLnRoZW4oaT0+T3MoaSxyLG8sdCkpO09zKGUscixvLHQpfX0pO2Z1bmN0aW9uIE9zKHQsbixyLG8pe2lmKCF0KXtjb25zdCBlPXtjb2RlOiJjdXN0b20iLGlucHV0OnIsaW5zdDpvLHBhdGg6Wy4uLm8uX3pvZC5kZWYucGF0aD8/W11dLGNvbnRpbnVlOiFvLl96b2QuZGVmLmFib3J0fTtvLl96b2QuZGVmLnBhcmFtcyYmKGUucGFyYW1zPW8uX3pvZC5kZWYucGFyYW1zKSxuLmlzc3Vlcy5wdXNoKFdlKGUpKX19Y29uc3QgUnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itit2LHZgSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9LGZpbGU6e3VuaXQ6Itio2KfZitiqIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sYXJyYXk6e3VuaXQ6Iti52YbYtdixIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sc2V0Ont1bml0OiLYudmG2LXYsSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLZhdiv2K7ZhCIsZW1haWw6Itio2LHZitivINil2YTZg9iq2LHZiNmG2YoiLHVybDoi2LHYp9io2LciLGVtb2ppOiLYpdmK2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Itiq2KfYsdmK2K4g2YjZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZGF0ZToi2KrYp9ix2YrYriDYqNmF2LnZitin2LEgSVNPIix0aW1lOiLZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZHVyYXRpb246ItmF2K/YqSDYqNmF2LnZitin2LEgSVNPIixpcHY0OiLYudmG2YjYp9mGIElQdjQiLGlwdjY6Iti52YbZiNin2YYgSVB2NiIsY2lkcnY0OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NCIsY2lkcnY2OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NiIsYmFzZTY0OiLZhtmO2LUg2KjYqtix2YXZitiyIGJhc2U2NC1lbmNvZGVkIixiYXNlNjR1cmw6ItmG2Y7YtSDYqNiq2LHZhdmK2LIgYmFzZTY0dXJsLWVuY29kZWQiLGpzb25fc3RyaW5nOiLZhtmO2LUg2LnZhNmJINmH2YrYptipIEpTT04iLGUxNjQ6Itix2YLZhSDZh9in2KrZgSDYqNmF2LnZitin2LEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLZhdiv2K7ZhCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNmF2K/YrtmE2KfYqiDYutmK2LEg2YXZgtio2YjZhNipOiDZitmB2KrYsdi2INil2K/Yrtin2YQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR92Iwg2YjZhNmD2YYg2KrZhSDYpdiv2K7Yp9mEICR7c31gOmDZhdiv2K7ZhNin2Kog2LrZitixINmF2YLYqNmI2YTYqTog2YrZgdiq2LHYtiDYpdiv2K7Yp9mEICR7aX3YjCDZiNmE2YPZhiDYqtmFINil2K/Yrtin2YQgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YXYr9iu2YTYp9iqINi62YrYsSDZhdmC2KjZiNmE2Kk6INmK2YHYqtix2LYg2KXYr9iu2KfZhCAke1MoZS52YWx1ZXNbMF0pfWA6YNin2K7YqtmK2KfYsSDYutmK2LEg2YXZgtio2YjZhDog2YrYqtmI2YLYuSDYp9mG2KrZgtin2KEg2KPYrdivINmH2LDZhyDYp9mE2K7Zitin2LHYp9iqOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gINij2YPYqNixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INij2YYg2KrZg9mI2YYgJHtlLm9yaWdpbj8/Itin2YTZgtmK2YXYqSJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsSJ9YDpg2KPZg9io2LEg2YXZhiDYp9mE2YTYp9iy2YU6INmK2YHYqtix2LYg2KPZhiDYqtmD2YjZhiAke2Uub3JpZ2luPz8i2KfZhNmC2YrZhdipIn0gJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqNiv2KMg2KjZgCAiJHtlLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YbYqtmH2Yog2KjZgCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqti22YXZkdmO2YYgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYt9in2KjZgiDYp9mE2YbZhdi3ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSDYutmK2LEg2YXZgtio2YjZhGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDYsdmC2YUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YPZiNmGINmF2YYg2YXYttin2LnZgdin2KogJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YXYudix2YEke2Uua2V5cy5sZW5ndGg+MT8i2KfYqiI6IiJ9INi62LHZitioJHtlLmtleXMubGVuZ3RoPjE/ItipIjoiIn06ICR7XyhlLmtleXMsItiMICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNmF2LnYsdmBINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIn19fTtmdW5jdGlvbiBDcCgpe3JldHVybntsb2NhbGVFcnJvcjpScCgpfX1jb25zdCBBcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoic2ltdm9sIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJvbG1hbMSxZMSxciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImVtYWlsIGFkZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRldGltZSIsZGF0ZToiSVNPIGRhdGUiLHRpbWU6IklTTyB0aW1lIixkdXJhdGlvbjoiSVNPIGR1cmF0aW9uIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBudW1iZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFlhbmzEscWfIGTJmXnJmXI6IGfDtnpsyZluaWzJmW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBkYXhpbCBvbGFuICR7c31gOmBZYW5sxLHFnyBkyZl5yZlyOiBnw7Z6bMmZbmlsyZluICR7aX0sIGRheGlsIG9sYW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gWWFubMSxxZ8gZMmZecmZcjogZ8O2emzJmW5pbMmZbiAke1MoZS52YWx1ZXNbMF0pfWA6YFlhbmzEscWfIHNlw6dpbTogYcWfYcSfxLFkYWvEsWxhcmRhbiBiaXJpIG9sbWFsxLFkxLFyOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudCJ9YDpgw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBracOnaWs6IGfDtnpsyZluaWzJmW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YMOHb3gga2nDp2lrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5wcmVmaXh9IiBpbMmZIGJhxZ9sYW1hbMSxZMSxcmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gWWFubMSxxZ8gbcmZdG46ICIke2kuc3VmZml4fSIgaWzJmSBiaXRtyZlsaWRpcmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5pbmNsdWRlc30iIGRheGlsIG9sbWFsxLFkxLFyYDppLmZvcm1hdD09PSJyZWdleCI/YFlhbmzEscWfIG3JmXRuOiAke2kucGF0dGVybn0gxZ9hYmxvbnVuYSB1ecSfdW4gb2xtYWzEsWTEsXJgOmBZYW5sxLHFnyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gWWFubMSxxZ8gyZlkyZlkOiAke2UuZGl2aXNvcn0gaWzJmSBiw7Zsw7xuyZkgYmlsyZluIG9sbWFsxLFkxLFyYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYcOnYXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGF4aWxpbmTJmSB5YW5sxLHFnyBhw6dhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iWWFubMSxxZ8gZMmZecmZciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYXhpbGluZMmZIHlhbmzEscWfIGTJmXnJmXJgO2RlZmF1bHQ6cmV0dXJuIllhbmzEscWfIGTJmXnJmXIifX19O2Z1bmN0aW9uIExwKCl7cmV0dXJue2xvY2FsZUVycm9yOkFwKCl9fWZ1bmN0aW9uIFVzKHQsbixyLG8pe2NvbnN0IGU9TWF0aC5hYnModCksaT1lJTEwLGE9ZSUxMDA7cmV0dXJuIGE+PTExJiZhPD0xOT9vOmk9PT0xP246aT49MiYmaTw9ND9yOm99Y29uc3QgTXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToi0YHRltC80LLQsNC7IixmZXc6ItGB0ZbQvNCy0LDQu9GLIixtYW55OiLRgdGW0LzQstCw0LvQsNGeIn0sdmVyYjoi0LzQtdGG0YwifSxhcnJheTp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LHNldDp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LGZpbGU6e3VuaXQ6e29uZToi0LHQsNC50YIiLGZldzoi0LHQsNC50YLRiyIsbWFueToi0LHQsNC50YLQsNGeIn0sdmVyYjoi0LzQtdGG0YwifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0YPQstC+0LQiLGVtYWlsOiJlbWFpbCDQsNC00YDQsNGBIix1cmw6IlVSTCIsZW1vamk6ItGN0LzQvtC00LfRliIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINC00LDRgtCwINGWINGH0LDRgSIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0YfQsNGBIixkdXJhdGlvbjoiSVNPINC/0YDQsNGG0Y/Qs9C70LDRgdGG0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LDRgSIsaXB2NjoiSVB2NiDQsNC00YDQsNGBIixjaWRydjQ6IklQdjQg0LTRi9GP0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00YvRj9C/0LDQt9C+0L0iLGJhc2U2NDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjQiLGJhc2U2NHVybDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJKU09OINGA0LDQtNC+0LoiLGUxNjQ6ItC90YPQvNCw0YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLRg9Cy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItC70ZbQuiIsYXJyYXk6ItC80LDRgdGW0Z4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtDog0YfQsNC60LDRntGB0Y8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINGe0LLQvtC0OiDRh9Cw0LrQsNGe0YHRjyAke2l9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQ6INGH0LDQutCw0LvQsNGB0Y8gJHtTKGUudmFsdWVzWzBdKX1gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINCy0LDRgNGL0Y/QvdGCOiDRh9Cw0LrQsNGe0YHRjyDQsNC00LfRltC9INC3ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWF4aW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINCy0Y/Qu9GW0LrRljog0YfQsNC60LDQu9Cw0YHRjywg0YjRgtC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9GN0L3QvdC1In0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LLRj9C70ZbQutGWOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0Y3QvdC90LUifSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWluaW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINC80LDQu9GLOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbn0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LzQsNC70Ys6INGH0LDQutCw0LvQsNGB0Y8sINGI0YLQviAke2Uub3JpZ2lufSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQv9Cw0YfRi9C90LDRhtGG0LAg0LcgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQt9Cw0LrQsNC90YfQstCw0YbRhtCwINC90LAgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DQndGP0L/RgNCw0LLRltC70YzQvdGLINGA0LDQtNC+0Lo6INC/0LDQstGW0L3QtdC9INC30LzRj9GI0YfQsNGG0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0YDQsNC00L7Qujog0L/QsNCy0ZbQvdC10L0g0LDQtNC/0LDQstGP0LTQsNGG0Ywg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQu9GW0Lo6INC/0LDQstGW0L3QtdC9INCx0YvRhtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9Cw0LfQvdCw0L3RiyAke2Uua2V5cy5sZW5ndGg+MT8i0LrQu9GO0YfRiyI6ItC60LvRjtGHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQutC70Y7RhyDRgyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndGP0L/RgNCw0LLRltC70YzQvdCw0LUg0LfQvdCw0YfRjdC90L3QtSDRniAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCJ9fX07ZnVuY3Rpb24gcXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6TXAoKX19Y29uc3QgRnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ItGB0LjQvNCy0L7Qu9CwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sZmlsZTp7dW5pdDoi0LHQsNC50YLQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sc2V0Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0YXQvtC0IixlbWFpbDoi0LjQvNC10LnQuyDQsNC00YDQtdGBIix1cmw6IlVSTCIsZW1vamk6ItC10LzQvtC00LbQuCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINCy0YDQtdC80LUiLGRhdGU6IklTTyDQtNCw0YLQsCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0L/RgNC+0LTRitC70LbQuNGC0LXQu9C90L7RgdGCIixpcHY0OiJJUHY0INCw0LTRgNC10YEiLGlwdjY6IklQdjYg0LDQtNGA0LXRgSIsY2lkcnY0OiJJUHY0INC00LjQsNC/0LDQt9C+0L0iLGNpZHJ2NjoiSVB2NiDQtNC40LDQv9Cw0LfQvtC9IixiYXNlNjQ6ImJhc2U2NC3QutC+0LTQuNGA0LDQvSDQvdC40LciLGJhc2U2NHVybDoiYmFzZTY0dXJsLdC60L7QtNC40YDQsNC9INC90LjQtyIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC3IixlMTY0OiJFLjE2NCDQvdC+0LzQtdGAIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdC+0LQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLRh9C40YHQu9C+IixhcnJheToi0LzQsNGB0LjQsiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQ6INC+0YfQsNC60LLQsNC9IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L0gJHtzfWA6YNCd0LXQstCw0LvQuNC00LXQvSDQstGF0L7QtDog0L7Rh9Cw0LrQstCw0L0gJHtpfSwg0L/QvtC70YPRh9C10L0gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0OiDQvtGH0LDQutCy0LDQvSAke1MoZS52YWx1ZXNbMF0pfWA6YNCd0LXQstCw0LvQuNC00L3QsCDQvtC/0YbQuNGPOiDQvtGH0LDQutCy0LDQvdC+INC10LTQvdC+INC+0YIgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCi0LLRitGA0LTQtSDQs9C+0LvRj9C80L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW4/PyLRgdGC0L7QudC90L7RgdGCIn0g0LTQsCDRgdGK0LTRitGA0LbQsCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtCwIn1gOmDQotCy0YrRgNC00LUg0LPQvtC70Y/QvNC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2luPz8i0YHRgtC+0LnQvdC+0YHRgiJ9INC00LAg0LHRitC00LUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0KLQstGK0YDQtNC1INC80LDQu9C60L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW59INC00LAg0YHRitC00YrRgNC20LAgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNCi0LLRitGA0LTQtSDQvNCw0LvQutC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2lufSDQtNCwINCx0YrQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtpZihpLmZvcm1hdD09PSJzdGFydHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQv9C+0YfQstCwINGBICIke2kucHJlZml4fSJgO2lmKGkuZm9ybWF0PT09ImVuZHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQstGK0YDRiNCy0LAg0YEgIiR7aS5zdWZmaXh9ImA7aWYoaS5mb3JtYXQ9PT0iaW5jbHVkZXMiKXJldHVybmDQndC10LLQsNC70LjQtNC10L0g0L3QuNC3OiDRgtGA0Y/QsdCy0LAg0LTQsCDQstC60LvRjtGH0LLQsCAiJHtpLmluY2x1ZGVzfSJgO2lmKGkuZm9ybWF0PT09InJlZ2V4IilyZXR1cm5g0J3QtdCy0LDQu9C40LTQtdC9INC90LjQtzog0YLRgNGP0LHQstCwINC00LAg0YHRitCy0L/QsNC00LAg0YEgJHtpLnBhdHRlcm59YDtsZXQgYT0i0J3QtdCy0LDQu9C40LTQtdC9IjtyZXR1cm4gaS5mb3JtYXQ9PT0iZW1vamkiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZXRpbWUiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZSImJihhPSLQndC10LLQsNC70LjQtNC90LAiKSxpLmZvcm1hdD09PSJ0aW1lIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QviIpLGkuZm9ybWF0PT09ImR1cmF0aW9uIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QsCIpLGAke2F9ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10LLQsNC70LjQtNC90L4g0YfQuNGB0LvQvjog0YLRgNGP0LHQstCwINC00LAg0LHRitC00LUg0LrRgNCw0YLQvdC+INC90LAgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g0J3QtdGA0LDQt9C/0L7Qt9C90LDRgiR7ZS5rZXlzLmxlbmd0aD4xPyLQuCI6IiJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC+0LLQtSI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNCd0LXQstCw0LvQuNC00L3QsCDRgdGC0L7QudC90L7RgdGCINCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQifX19O2Z1bmN0aW9uIEpwKCl7cmV0dXJue2xvY2FsZUVycm9yOkZwKCl9fWNvbnN0IEhwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXLDoGN0ZXJzIix2ZXJiOiJjb250ZW5pciJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJjb250ZW5pciJ9LGFycmF5Ont1bml0OiJlbGVtZW50cyIsdmVyYjoiY29udGVuaXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRzIix2ZXJiOiJjb250ZW5pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyYWRhIixlbWFpbDoiYWRyZcOnYSBlbGVjdHLDsm5pY2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgaSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYWRhIElTTyIsaXB2NDoiYWRyZcOnYSBJUHY0IixpcHY2OiJhZHJlw6dhIElQdjYiLGNpZHJ2NDoicmFuZyBJUHY0IixjaWRydjY6InJhbmcgSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiY2FkZW5hIGNvZGlmaWNhZGEgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwdXMgaW52w6BsaWQ6IHMnZXNwZXJhdmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBzJ2hhIHJlYnV0ICR7c31gOmBUaXB1cyBpbnbDoGxpZDogcydlc3BlcmF2YSAke2l9LCBzJ2hhIHJlYnV0ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFZhbG9yIGludsOgbGlkOiBzJ2VzcGVyYXZhICR7UyhlLnZhbHVlc1swXSl9YDpgT3BjacOzIGludsOgbGlkYTogcydlc3BlcmF2YSB1bmEgZGUgJHtfKGUudmFsdWVzLCIgbyAiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DoHhpbSI6Im1lbnlzIGRlIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BNYXNzYSBncmFuOiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2luPz8iZWwgdmFsb3IifSBjb250aW5ndcOpcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifWA6YE1hc3NhIGdyYW46IHMnZXNwZXJhdmEgcXVlICR7ZS5vcmlnaW4/PyJlbCB2YWxvciJ9IGZvcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DrW5pbSI6Im3DqXMgZGUiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBjb250aW5ndcOpcyAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBmb3MgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGRlIGNvbWVuw6dhciBhbWIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gRm9ybWF0IGludsOgbGlkOiBoYSBkJ2FjYWJhciBhbWIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGQnaW5jbG91cmUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEZvcm1hdCBpbnbDoGxpZDogaGEgZGUgY29pbmNpZGlyIGFtYiBlbCBwYXRyw7MgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludsOgbGlkIHBlciBhICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOgbGlkOiBoYSBkZSBzZXIgbcO6bHRpcGxlIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENsYXUke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IG5vIHJlY29uZWd1ZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENsYXUgaW52w6BsaWRhIGEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6BsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEVsZW1lbnQgaW52w6BsaWQgYSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iRW50cmFkYSBpbnbDoGxpZGEifX19O2Z1bmN0aW9uIFdwKCl7cmV0dXJue2xvY2FsZUVycm9yOkhwKCl9fWNvbnN0IEJwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrxa8iLHZlcmI6Im3DrXQifSxmaWxlOnt1bml0OiJiYWp0xa8iLHZlcmI6Im3DrXQifSxhcnJheTp7dW5pdDoicHJ2a8WvIix2ZXJiOiJtw610In0sc2V0Ont1bml0OiJwcnZrxa8iLHZlcmI6Im3DrXQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicmVndWzDoXJuw60gdsO9cmF6IixlbWFpbDoiZS1tYWlsb3bDoSBhZHJlc2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdHVtIGEgxI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGRhdGU6ImRhdHVtIHZlIGZvcm3DoXR1IElTTyIsdGltZToixI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGR1cmF0aW9uOiJkb2JhIHRydsOhbsOtIElTTyIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6InJvenNhaCBJUHY0IixjaWRydjY6InJvenNhaCBJUHY2IixiYXNlNjQ6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0IixiYXNlNjR1cmw6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoixZlldMSbemVjIHZlIGZvcm3DoXR1IEpTT04iLGUxNjQ6IsSNw61zbG8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJ2c3R1cCJ9LG89e25hbjoiTmFOIixudW1iZXI6IsSNw61zbG8iLHN0cmluZzoixZlldMSbemVjIixmdW5jdGlvbjoiZnVua2NlIixhcnJheToicG9sZSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXBsYXRuw70gdnN0dXA6IG/EjWVrw6F2w6FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG9iZHLFvmVubyAke3N9YDpgTmVwbGF0bsO9IHZzdHVwOiBvxI1la8OhdsOhbm8gJHtpfSwgb2JkcsW+ZW5vICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5lcGxhdG7DvSB2c3R1cDogb8SNZWvDoXbDoW5vICR7UyhlLnZhbHVlc1swXSl9YDpgTmVwbGF0bsOhIG1vxb5ub3N0OiBvxI1la8OhdsOhbmEgamVkbmEgeiBob2Rub3QgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEhvZG5vdGEgamUgcMWZw61sacWhIHZlbGvDoTogJHtlLm9yaWdpbj8/ImhvZG5vdGEifSBtdXPDrSBtw610ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBydmvFryJ9YDpgSG9kbm90YSBqZSBwxZnDrWxpxaEgdmVsa8OhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSG9kbm90YSBqZSBwxZnDrWxpxaEgbWFsw6E6ICR7ZS5vcmlnaW4/PyJob2Rub3RhIn0gbXVzw60gbcOtdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJwcnZrxa8ifWA6YEhvZG5vdGEgamUgcMWZw61sacWhIG1hbMOhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5lcGxhdG7DvSDFmWV0xJt6ZWM6IG11c8OtIHphxI3DrW5hdCBuYSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBrb27EjWl0IG5hICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmVwbGF0bsO9IMWZZXTEm3plYzogbXVzw60gb2JzYWhvdmF0ICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBvZHBvdsOtZGF0IHZ6b3J1ICR7aS5wYXR0ZXJufWA6YE5lcGxhdG7DvSBmb3Jtw6F0ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOZXBsYXRuw6kgxI3DrXNsbzogbXVzw60gYsO9dCBuw6Fzb2JrZW0gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmV6bsOhbcOpIGtsw63EjWU6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmVwbGF0bsO9IGtsw63EjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXBsYXRuw70gdnN0dXAiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmVwbGF0bsOhIGhvZG5vdGEgdiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVwbGF0bsO9IHZzdHVwIn19fTtmdW5jdGlvbiBWcCgpe3JldHVybntsb2NhbGVFcnJvcjpCcCgpfX1jb25zdCBLcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiaGF2ZGUifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiaGF2ZGUifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiJpbmRlaG9sZHQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiaW5kZWhvbGR0In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1tYWlsYWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsw6Z0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsw6Z0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGVkIixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwta29kZXQgc3RyZW5nIixqc29uX3N0cmluZzoiSlNPTi1zdHJlbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4iLHN0cmluZzoic3RyZW5nIixudW1iZXI6InRhbCIsYm9vbGVhbjoiYm9vbGVhbiIsYXJyYXk6Imxpc3RlIixvYmplY3Q6Im9iamVrdCIsc2V0OiJzw6Z0IixmaWxlOiJmaWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZ3QgaW5wdXQ6IGZvcnZlbnRlZGUgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBmaWsgJHtzfWA6YFVneWxkaWd0IGlucHV0OiBmb3J2ZW50ZWRlICR7aX0sIGZpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BVZ3lsZGlnIHbDpnJkaTogZm9ydmVudGVkZSAke1MoZS52YWx1ZXNbMF0pfWA6YFVneWxkaWd0IHZhbGc6IGZvcnZlbnRlZGUgZW4gYWYgZsO4bGdlbmRlICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9ICR7YS52ZXJifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudGVyIn1gOmBGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9IGhhdmRlICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSAke2EudmVyYn0gJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSBoYXZkZSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IHNrYWwgZW5kZSBtZWQgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BVZ3lsZGlnIHN0cmVuZzogc2thbCBpbmRlaG9sZGUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWd0IHRhbDogc2thbCB2w6ZyZSBkZWxlbGlndCBtZWQgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/IlVrZW5kdGUgbsO4Z2xlciI6IlVrZW5kdCBuw7hnbGUifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGdsZSBpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJVZ3lsZGlndCBpbnB1dDogbWF0Y2hlciBpbmdlbiBhZiBkZSB0aWxsYWR0ZSB0eXBlciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHbDpnJkaSBpICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJVZ3lsZGlndCBpbnB1dCJ9fX07ZnVuY3Rpb24gR3AoKXtyZXR1cm57bG9jYWxlRXJyb3I6S3AoKX19Y29uc3QgWHA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IlplaWNoZW4iLHZlcmI6Inp1IGhhYmVuIn0sZmlsZTp7dW5pdDoiQnl0ZXMiLHZlcmI6Inp1IGhhYmVuIn0sYXJyYXk6e3VuaXQ6IkVsZW1lbnRlIix2ZXJiOiJ6dSBoYWJlbiJ9LHNldDp7dW5pdDoiRWxlbWVudGUiLHZlcmI6Inp1IGhhYmVuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IkVpbmdhYmUiLGVtYWlsOiJFLU1haWwtQWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJFbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLURhdHVtIHVuZCAtVWhyemVpdCIsZGF0ZToiSVNPLURhdHVtIix0aW1lOiJJU08tVWhyemVpdCIsZHVyYXRpb246IklTTy1EYXVlciIsaXB2NDoiSVB2NC1BZHJlc3NlIixpcHY2OiJJUHY2LUFkcmVzc2UiLGNpZHJ2NDoiSVB2NC1CZXJlaWNoIixjaWRydjY6IklQdjYtQmVyZWljaCIsYmFzZTY0OiJCYXNlNjQtY29kaWVydGVyIFN0cmluZyIsYmFzZTY0dXJsOiJCYXNlNjQtVVJMLWNvZGllcnRlciBTdHJpbmciLGpzb25fc3RyaW5nOiJKU09OLVN0cmluZyIsZTE2NDoiRS4xNjQtTnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiRWluZ2FiZSJ9LG89e25hbjoiTmFOIixudW1iZXI6IlphaGwiLGFycmF5OiJBcnJheSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BVbmfDvGx0aWdlIEVpbmdhYmU6IGVyd2FydGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZXJoYWx0ZW4gJHtzfWA6YFVuZ8O8bHRpZ2UgRWluZ2FiZTogZXJ3YXJ0ZXQgJHtpfSwgZXJoYWx0ZW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVW5nw7xsdGlnZSBFaW5nYWJlOiBlcndhcnRldCAke1MoZS52YWx1ZXNbMF0pfWA6YFVuZ8O8bHRpZ2UgT3B0aW9uOiBlcndhcnRldCBlaW5lIHZvbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUgZ3Jvw586IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW4/PyJXZXJ0In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iRWxlbWVudGUifSBoYXRgOmBadSBncm/DnzogZXJ3YXJ0ZXQsIGRhc3MgJHtlLm9yaWdpbj8/IldlcnQifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gaXN0YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH0gaGF0YDpgWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBpc3RgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIG1pdCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BVbmfDvGx0aWdlciBTdHJpbmc6IG11c3MgbWl0ICIke2kuc3VmZml4fSIgZW5kZW5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzICIke2kuaW5jbHVkZXN9IiBlbnRoYWx0ZW5gOmkuZm9ybWF0PT09InJlZ2V4Ij9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIGRlbSBNdXN0ZXIgJHtpLnBhdHRlcm59IGVudHNwcmVjaGVuYDpgVW5nw7xsdGlnOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gVW5nw7xsdGlnZSBaYWhsOiBtdXNzIGVpbiBWaWVsZmFjaGVzIHZvbiAke2UuZGl2aXNvcn0gc2VpbmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJVbmJla2FubnRlIFNjaGzDvHNzZWwiOiJVbmJla2FubnRlciBTY2hsw7xzc2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gVW5nw7xsdGlnZXIgU2NobMO8c3NlbCBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVW5nw7xsdGlnZSBFaW5nYWJlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFVuZ8O8bHRpZ2VyIFdlcnQgaW4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVuZ8O8bHRpZ2UgRWluZ2FiZSJ9fX07ZnVuY3Rpb24gWXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6WHAoKX19Y29uc3QgUXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Is+HzrHPgc6xzrrPhM6uz4HOtc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6Is69zrEgzq3Ph861zrkifSxhcnJheTp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LHNldDp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LG1hcDp7dW5pdDoizrrOsc+EzrHPh8+Jz4HOrs+DzrXOuc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Is61zq/Pg86/zrTOv8+CIixlbWFpbDoizrTOuc61z43OuM+Fzr3Pg863IGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gzrfOvM61z4HOv868zrfOvc6vzrEgzrrOsc65IM+Oz4HOsSIsZGF0ZToiSVNPIM63zrzOtc+Bzr/OvM63zr3Or86xIix0aW1lOiJJU08gz47Pgc6xIixkdXJhdGlvbjoiSVNPIM60zrnOrM+BzrrOtc65zrEiLGlwdjQ6Is60zrnOtc+NzrjPhc69z4POtyBJUHY0IixpcHY2OiLOtM65zrXPjc64z4XOvc+DzrcgSVB2NiIsbWFjOiLOtM65zrXPjc64z4XOvc+DzrcgTUFDIixjaWRydjQ6Is61z43Pgc6/z4IgSVB2NCIsY2lkcnY2OiLOtc+Nz4HOv8+CIElQdjYiLGJhc2U2NDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjQiLGJhc2U2NHVybDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiLPg8+FzrzOss6/zrvOv8+DzrXOuc+BzqwgSlNPTiIsZTE2NDoizrHPgc65zrjOvM+Mz4IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLOtc6vz4POv860zr/PgiJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybiB0eXBlb2YgZS5leHBlY3RlZD09InN0cmluZyImJi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YM6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+COiDOsc69zrHOvM61zr3PjM+EzrHOvSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIM67zq7Phs64zrfOus61ICR7c31gOmDOnM63IM6tzrPOus+Fz4HOtyDOtc6vz4POv860zr/PgjogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtpfSwgzrvOrs+GzrjOt866zrUgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gzpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4I6IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7UyhlLnZhbHVlc1swXSl9YDpgzpzOtyDOrc6zzrrPhc+BzrcgzrXPgM65zrvOv86zzq46IM6xzr3Osc68zrXOvc+Mz4TOsc69IM6tzr3OsSDOsc+Az4wgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YM6gzr/Ou8+NIM68zrXOs86szrvOvzogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtlLm9yaWdpbj8/Is+EzrnOvM6uIn0gzr3OsSDOrc+HzrXOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLPg8+Ezr/Ouc+HzrXOr86xIn1gOmDOoM6/zrvPjSDOvM61zrPOrM67zr86IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7ZS5vcmlnaW4/PyLPhM65zrzOriJ9IM69zrEgzrXOr869zrHOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM6tz4fOtc65ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM61zq/Ovc6xzrkgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgzr7Otc66zrnOvc6sIM68zrUgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM61zrvOtc65z47Ovc61zrkgzrzOtSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM6xzrnPgc65zqzOts61zrkgzrzOtSDPhM6/IM68zr/PhM6vzrLOvyAke2kucGF0dGVybn1gOmDOnM63IM6tzrPOus+Fz4HOvzogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/z4IgzrHPgc65zrjOvM+Mz4I6IM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gzobOs869z4nPg8+EJHtlLmtleXMubGVuZ3RoPjE/Is6xIjoizr8ifSDOus67zrXOuc60JHtlLmtleXMubGVuZ3RoPjE/Is65zqwiOiLOryJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/IM66zrvOtc65zrTOryDPg8+Ezr8gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIs6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+CIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYM6czrcgzq3Os866z4XPgc63IM+EzrnOvM6uIM+Dz4TOvyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4izpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4IifX19O2Z1bmN0aW9uIGVmKCl7cmV0dXJue2xvY2FsZUVycm9yOlFwKCl9fWNvbnN0IHRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjaGFyYWN0ZXJzIix2ZXJiOiJ0byBoYXZlIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoiaXRlbXMiLHZlcmI6InRvIGhhdmUifSxzZXQ6e3VuaXQ6Iml0ZW1zIix2ZXJiOiJ0byBoYXZlIn0sbWFwOnt1bml0OiJlbnRyaWVzIix2ZXJiOiJ0byBoYXZlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZW1haWwgYWRkcmVzcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdGV0aW1lIixkYXRlOiJJU08gZGF0ZSIsdGltZToiSVNPIHRpbWUiLGR1cmF0aW9uOiJJU08gZHVyYXRpb24iLGlwdjQ6IklQdjQgYWRkcmVzcyIsaXB2NjoiSVB2NiBhZGRyZXNzIixtYWM6Ik1BQyBhZGRyZXNzIixjaWRydjQ6IklQdjQgcmFuZ2UiLGNpZHJ2NjoiSVB2NiByYW5nZSIsYmFzZTY0OiJiYXNlNjQtZW5jb2RlZCBzdHJpbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIixqc29uX3N0cmluZzoiSlNPTiBzdHJpbmciLGUxNjQ6IkUuMTY0IG51bWJlciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuYEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7aX0sIHJlY2VpdmVkICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7UyhlLnZhbHVlc1swXSl9YDpgSW52YWxpZCBvcHRpb246IGV4cGVjdGVkIG9uZSBvZiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gaGF2ZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50cyJ9YDpgVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gYmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIHNtYWxsOiBleHBlY3RlZCAke2Uub3JpZ2lufSB0byBoYXZlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUb28gc21hbGw6IGV4cGVjdGVkICR7ZS5vcmlnaW59IHRvIGJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BJbnZhbGlkIHN0cmluZzogbXVzdCBzdGFydCB3aXRoICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEludmFsaWQgc3RyaW5nOiBtdXN0IGVuZCB3aXRoICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gSW52YWxpZCBzdHJpbmc6IG11c3QgaW5jbHVkZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gSW52YWxpZCBzdHJpbmc6IG11c3QgbWF0Y2ggcGF0dGVybiAke2kucGF0dGVybn1gOmBJbnZhbGlkICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBJbnZhbGlkIG51bWJlcjogbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFVucmVjb2duaXplZCBrZXkke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEludmFsaWQga2V5IGluICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiBlLm9wdGlvbnMmJkFycmF5LmlzQXJyYXkoZS5vcHRpb25zKSYmZS5vcHRpb25zLmxlbmd0aD4wP2BJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7ZS5vcHRpb25zLm1hcChhPT5gJyR7YX0nYCkuam9pbigiIHwgIil9YDoiSW52YWxpZCBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJbnZhbGlkIHZhbHVlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnZhbGlkIGlucHV0In19fTtmdW5jdGlvbiB6bCgpe3JldHVybntsb2NhbGVFcnJvcjp0ZigpfX1jb25zdCBuZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0cm9qbiIsdmVyYjoiaGF2aSJ9LGZpbGU6e3VuaXQ6ImJhanRvam4iLHZlcmI6ImhhdmkifSxhcnJheTp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9LHNldDp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbmlnbyIsZW1haWw6InJldGFkcmVzbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW/EnWlvIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08tZGF0b3RlbXBvIixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLXRlbXBvIixkdXJhdGlvbjoiSVNPLWRhxa1ybyIsaXB2NDoiSVB2NC1hZHJlc28iLGlwdjY6IklQdjYtYWRyZXNvIixjaWRydjQ6IklQdjQtcmFuZ28iLGNpZHJ2NjoiSVB2Ni1yYW5nbyIsYmFzZTY0OiI2NC11bWUga29kaXRhIGthcmFrdHJhcm8iLGJhc2U2NHVybDoiVVJMLTY0LXVtZSBrb2RpdGEga2FyYWt0cmFybyIsanNvbl9zdHJpbmc6IkpTT04ta2FyYWt0cmFybyIsZTE2NDoiRS4xNjQtbm9tYnJvIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW5pZ28ifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJub21icm8iLGFycmF5OiJ0YWJlbG8iLG51bGw6InNlbnZhbG9yYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXZhbGlkYSBlbmlnbzogYXRlbmRpxJ1pcyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJpY2V2acSdaXMgJHtzfWA6YE5ldmFsaWRhIGVuaWdvOiBhdGVuZGnEnWlzICR7aX0sIHJpY2V2acSdaXMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gTmV2YWxpZGEgZW5pZ286IGF0ZW5kacSdaXMgJHtTKGUudmFsdWVzWzBdKX1gOmBOZXZhbGlkYSBvcGNpbzogYXRlbmRpxJ1pcyB1bnUgZWwgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRybyBncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbj8/InZhbG9ybyJ9IGhhdnUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9qbiJ9YDpgVHJvIGdyYW5kYTogYXRlbmRpxJ1pcyBrZSAke2Uub3JpZ2luPz8idmFsb3JvIn0gaGF2dSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm8gbWFsZ3JhbmRhOiBhdGVuZGnEnWlzIGtlICR7ZS5vcmlnaW59IGhhdnUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRybyBtYWxncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbn0gZXN0dSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMga29tZW5jacSdaSBwZXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMgZmluacSdaSBwZXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZhbGlkYSBrYXJha3RyYXJvOiBkZXZhcyBpbmtsdXppdmkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmFsaWRhIGthcmFrdHJhcm86IGRldmFzIGtvbmdydWkga3VuIGxhIG1vZGVsbyAke2kucGF0dGVybn1gOmBOZXZhbGlkYSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2YWxpZGEgbm9tYnJvOiBkZXZhcyBlc3RpIG9ibG8gZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVrb25hdGEke2Uua2V5cy5sZW5ndGg+MT8iaiI6IiJ9IMWdbG9zaWxvJHtlLmtleXMubGVuZ3RoPjE/ImoiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZhbGlkYSDFnWxvc2lsbyBlbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmV2YWxpZGEgZW5pZ28iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2YWxpZGEgdmFsb3JvIGVuICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZhbGlkYSBlbmlnbyJ9fX07ZnVuY3Rpb24gcmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6bmYoKX19Y29uc3Qgb2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImNhcmFjdGVyZXMiLHZlcmI6InRlbmVyIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRlbmVyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50cmFkYSIsZW1haWw6ImRpcmVjY2nDs24gZGUgY29ycmVvIGVsZWN0csOzbmljbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZmVjaGEgeSBob3JhIElTTyIsZGF0ZToiZmVjaGEgSVNPIix0aW1lOiJob3JhIElTTyIsZHVyYXRpb246ImR1cmFjacOzbiBJU08iLGlwdjQ6ImRpcmVjY2nDs24gSVB2NCIsaXB2NjoiZGlyZWNjacOzbiBJUHY2IixjaWRydjQ6InJhbmdvIElQdjQiLGNpZHJ2NjoicmFuZ28gSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhZGEgZW4gYmFzZTY0Iixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4iLHN0cmluZzoidGV4dG8iLG51bWJlcjoibsO6bWVybyIsYm9vbGVhbjoiYm9vbGVhbm8iLGFycmF5OiJhcnJlZ2xvIixvYmplY3Q6Im9iamV0byIsc2V0OiJjb25qdW50byIsZmlsZToiYXJjaGl2byIsZGF0ZToiZmVjaGEiLGJpZ2ludDoibsO6bWVybyBncmFuZGUiLHN5bWJvbDoic8OtbWJvbG8iLHVuZGVmaW5lZDoiaW5kZWZpbmlkbyIsbnVsbDoibnVsbyIsZnVuY3Rpb246ImZ1bmNpw7NuIixtYXA6Im1hcGEiLHJlY29yZDoicmVnaXN0cm8iLHR1cGxlOiJ0dXBsYSIsZW51bToiZW51bWVyYWNpw7NuIix1bmlvbjoidW5pw7NuIixsaXRlcmFsOiJsaXRlcmFsIixwcm9taXNlOiJwcm9tZXNhIix2b2lkOiJ2YWPDrW8iLG5ldmVyOiJudW5jYSIsdW5rbm93bjoiZGVzY29ub2NpZG8iLGFueToiY3VhbHF1aWVyYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BFbnRyYWRhIGludsOhbGlkYTogc2UgZXNwZXJhYmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCByZWNpYmlkbyAke3N9YDpgRW50cmFkYSBpbnbDoWxpZGE6IHNlIGVzcGVyYWJhICR7aX0sIHJlY2liaWRvICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHJhZGEgaW52w6FsaWRhOiBzZSBlc3BlcmFiYSAke1MoZS52YWx1ZXNbMF0pfWA6YE9wY2nDs24gaW52w6FsaWRhOiBzZSBlc3BlcmFiYSB1bmEgZGUgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuIGE/YERlbWFzaWFkbyBncmFuZGU6IHNlIGVzcGVyYWJhIHF1ZSAke3M/PyJ2YWxvciJ9IHR1dmllcmEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9zIn1gOmBEZW1hc2lhZG8gZ3JhbmRlOiBzZSBlc3BlcmFiYSBxdWUgJHtzPz8idmFsb3IifSBmdWVyYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BEZW1hc2lhZG8gcGVxdWXDsW86IHNlIGVzcGVyYWJhIHF1ZSAke3N9IHR1dmllcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YERlbWFzaWFkbyBwZXF1ZcOxbzogc2UgZXNwZXJhYmEgcXVlICR7c30gZnVlcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29tZW56YXIgY29uICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgdGVybWluYXIgZW4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIGluY2x1aXIgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29pbmNpZGlyIGNvbiBlbCBwYXRyw7NuICR7aS5wYXR0ZXJufWA6YEludsOhbGlkbyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTsO6bWVybyBpbnbDoWxpZG86IGRlYmUgc2VyIG3Dumx0aXBsbyBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBMbGF2ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gZGVzY29ub2NpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYExsYXZlIGludsOhbGlkYSBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbG9yIGludsOhbGlkbyBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIn19fTtmdW5jdGlvbiBhZigpe3JldHVybntsb2NhbGVFcnJvcjpvZigpfX1jb25zdCBzZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi2qnYp9ix2Kfaqdiq2LEiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifSxmaWxlOnt1bml0OiLYqNin24zYqiIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LGFycmF5Ont1bml0OiLYotuM2KrZhSIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LHNldDp7dW5pdDoi2KLbjNiq2YUiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2YjYsdmI2K/bjCIsZW1haWw6Itii2K/YsdizINin24zZhduM2YQiLHVybDoiVVJMIixlbW9qaToi2KfbjNmF2YjYrNuMIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLYqtin2LHbjNiuINmIINiy2YXYp9mGINin24zYstmIIixkYXRlOiLYqtin2LHbjNiuINin24zYstmIIix0aW1lOiLYstmF2KfZhiDYp9uM2LLZiCIsZHVyYXRpb246ItmF2K/YqiDYstmF2KfZhiDYp9uM2LLZiCIsaXB2NDoiSVB2NCDYotiv2LHYsyIsaXB2NjoiSVB2NiDYotiv2LHYsyIsY2lkcnY0OiJJUHY0INiv2KfZhdmG2YciLGNpZHJ2NjoiSVB2NiDYr9in2YXZhtmHIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkINix2LTYqtmHIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINix2LTYqtmHIixqc29uX3N0cmluZzoiSlNPTiDYsdi02KrZhyIsZTE2NDoiRS4xNjQg2LnYr9ivIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/bjCJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itii2LHYp9uM2YcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9INmF24zigIzYqNmI2K/YjCAke3N9INiv2LHbjNin2YHYqiDYtNivYDpg2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtpfSDZhduM4oCM2KjZiNiv2IwgJHtzfSDYr9ix24zYp9mB2Kog2LTYr2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtTKGUudmFsdWVzWzBdKX0g2YXbjOKAjNio2YjYr2A6YNqv2LLbjNmG2Ycg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqINuM2qnbjCDYp9iyICR7XyhlLnZhbHVlcywifCIpfSDZhduM4oCM2KjZiNivYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNiu24zZhNuMINio2LLYsdqvOiAke2Uub3JpZ2luPz8i2YXZgtiv2KfYsSJ9INio2KfbjNivICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYtdixIn0g2KjYp9i02K9gOmDYrtuM2YTbjCDYqNiy2LHarzogJHtlLm9yaWdpbj8/ItmF2YLYr9in2LEifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYrtuM2YTbjCDaqdmI2obaqTogJHtlLm9yaWdpbn0g2KjYp9uM2K8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDYqNin2LTYr2A6YNiu24zZhNuMINqp2YjahtqpOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2KcgIiR7aS5wcmVmaXh9IiDYtNix2YjYuSDYtNmI2K9gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYqNinICIke2kuc3VmZml4fSIg2KrZhdin2YUg2LTZiNivYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYtNin2YXZhCAiJHtpLmluY2x1ZGVzfSIg2KjYp9i02K9gOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2Kcg2KfZhNqv2YjbjCAke2kucGF0dGVybn0g2YXYt9in2KjZgtiqINiv2KfYtNiq2Ycg2KjYp9i02K9gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9mF2LnYqtio2LFgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g2LnYr9ivINmG2KfZhdi52KrYqNixOiDYqNin24zYryDZhdi22LHYqCAke2UuZGl2aXNvcn0g2KjYp9i02K9gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDaqdmE24zYryR7ZS5rZXlzLmxlbmd0aD4xPyLZh9in24wiOiIifSDZhtin2LTZhtin2LM6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g2qnZhNuM2K8g2YbYp9i02YbYp9izINiv2LEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g2YXZgtiv2KfYsSDZhtin2YXYudiq2KjYsSDYr9ixICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLZiNix2YjYr9uMINmG2KfZhdi52KrYqNixIn19fTtmdW5jdGlvbiBjZigpe3JldHVybntsb2NhbGVFcnJvcjpzZigpfX1jb25zdCB1Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoibWVya2tpw6QiLHN1YmplY3Q6Im1lcmtraWpvbm9uIn0sZmlsZTp7dW5pdDoidGF2dWEiLHN1YmplY3Q6InRpZWRvc3RvbiJ9LGFycmF5Ont1bml0OiJhbGtpb3RhIixzdWJqZWN0OiJsaXN0YW4ifSxzZXQ6e3VuaXQ6ImFsa2lvdGEiLHN1YmplY3Q6ImpvdWtvbiJ9LG51bWJlcjp7dW5pdDoiIixzdWJqZWN0OiJsdXZ1biJ9LGJpZ2ludDp7dW5pdDoiIixzdWJqZWN0OiJzdXVyZW4ga29rb25haXNsdXZ1biJ9LGludDp7dW5pdDoiIixzdWJqZWN0OiJrb2tvbmFpc2x1dnVuIn0sZGF0ZTp7dW5pdDoiIixzdWJqZWN0OiJww6RpdsOkbcOkw6Ryw6RuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InPDpMOkbm7DtmxsaW5lbiBsYXVzZWtlIixlbWFpbDoic8OkaGvDtnBvc3Rpb3NvaXRlIix1cmw6IlVSTC1vc29pdGUiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLWFpa2FsZWltYSIsZGF0ZToiSVNPLXDDpGl2w6Rtw6TDpHLDpCIsdGltZToiSVNPLWFpa2EiLGR1cmF0aW9uOiJJU08ta2VzdG8iLGlwdjQ6IklQdjQtb3NvaXRlIixpcHY2OiJJUHY2LW9zb2l0ZSIsY2lkcnY0OiJJUHY0LWFsdWUiLGNpZHJ2NjoiSVB2Ni1hbHVlIixiYXNlNjQ6ImJhc2U2NC1rb29kYXR0dSBtZXJra2lqb25vIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rb29kYXR0dSBtZXJra2lqb25vIixqc29uX3N0cmluZzoiSlNPTi1tZXJra2lqb25vIixlMTY0OiJFLjE2NC1sdWt1Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidGVtcGxhYXR0aW1lcmtraWpvbm8ifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgb2xpICR7c31gOmBWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluICR7aX0sIG9saSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IG9sbGEgJHtTKGUudmFsdWVzWzBdKX1gOmBWaXJoZWVsbGluZW4gdmFsaW50YTogdMOkeXR5eSBvbGxhIHlrc2kgc2V1cmFhdmlzdGE6ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BMaWlhbiBzdXVyaTogJHthLnN1YmplY3R9IHTDpHl0eXkgb2xsYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YC50cmltKCk6YExpaWFuIHN1dXJpOiBhcnZvbiB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTGlpYW4gcGllbmk6ICR7YS5zdWJqZWN0fSB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWAudHJpbSgpOmBMaWlhbiBwaWVuaTogYXJ2b24gdMOkeXR5eSBvbGxhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IGFsa2FhICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFZpcmhlZWxsaW5lbiBzecO2dGU6IHTDpHl0eXkgbG9wcHVhICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSBzaXPDpGx0w6TDpCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSB2YXN0YXRhIHPDpMOkbm7DtmxsaXN0w6QgbGF1c2VrZXR0YSAke2kucGF0dGVybn1gOmBWaXJoZWVsbGluZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFZpcmhlZWxsaW5lbiBsdWt1OiB0w6R5dHl5IG9sbGEgbHV2dW4gJHtlLmRpdmlzb3J9IG1vbmlrZXJ0YWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJUdW50ZW1hdHRvbWF0IGF2YWltZXQiOiJUdW50ZW1hdG9uIGF2YWluIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGF2YWluIHRpZXR1ZWVzc2EiO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIlZpcmhlZWxsaW5lbiB1bmlvbmkiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGFydm8gam91a29zc2EiO2RlZmF1bHQ6cmV0dXJuIlZpcmhlZWxsaW5lbiBzecO2dGUifX19O2Z1bmN0aW9uIGxmKCl7cmV0dXJue2xvY2FsZUVycm9yOnVmKCl9fWNvbnN0IGRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3TDqHJlcyIsdmVyYjoiYXZvaXIifSxmaWxlOnt1bml0OiJvY3RldHMiLHZlcmI6ImF2b2lyIn0sYXJyYXk6e3VuaXQ6IsOpbMOpbWVudHMiLHZlcmI6ImF2b2lyIn0sc2V0Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyw6llIixlbWFpbDoiYWRyZXNzZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUgZXQgaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e3N0cmluZzoiY2hhw65uZSIsbnVtYmVyOiJub21icmUiLGludDoiZW50aWVyIixib29sZWFuOiJib29sw6llbiIsYmlnaW50OiJncmFuZCBlbnRpZXIiLHN5bWJvbDoic3ltYm9sZSIsdW5kZWZpbmVkOiJpbmTDqWZpbmkiLG51bGw6Im51bGwiLG5ldmVyOiJqYW1haXMiLHZvaWQ6InZpZGUiLGRhdGU6ImRhdGUiLGFycmF5OiJ0YWJsZWF1IixvYmplY3Q6Im9iamV0Iix0dXBsZToidHVwbGUiLHJlY29yZDoiZW5yZWdpc3RyZW1lbnQiLG1hcDoiY2FydGUiLHNldDoiZW5zZW1ibGUiLGZpbGU6ImZpY2hpZXIiLG5vbm9wdGlvbmFsOiJub24tb3B0aW9ubmVsIixuYW46Ik5hTiIsZnVuY3Rpb246ImZvbmN0aW9uIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0gYXR0ZW5kdSwgJHtzfSByZcOndWA6YEVudHLDqWUgaW52YWxpZGUgOiAke2l9IGF0dGVuZHUsICR7c30gcmXDp3VgfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiAke1MoZS52YWx1ZXNbMF0pfSBhdHRlbmR1YDpgT3B0aW9uIGludmFsaWRlIDogdW5lIHZhbGV1ciBwYXJtaSAke18oZS52YWx1ZXMsInwiKX0gYXR0ZW5kdWVgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBncmFuZCA6ICR7b1tlLm9yaWdpbl0/PyJ2YWxldXIifSBkb2l0ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLDqWzDqW1lbnQocykifWA6YFRyb3AgZ3JhbmQgOiAke29bZS5vcmlnaW5dPz8idmFsZXVyIn0gZG9pdCDDqnRyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgw6p0cmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGNvbW1lbmNlciBwYXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgc2UgdGVybWluZXIgcGFyICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgaW5jbHVyZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vZMOobGUgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBtZigpe3JldHVybntsb2NhbGVFcnJvcjpkZigpfX1jb25zdCBwZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0w6hyZXMiLHZlcmI6ImF2b2lyIn0sZmlsZTp7dW5pdDoib2N0ZXRzIix2ZXJiOiJhdm9pciJ9LGFycmF5Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9LHNldDp7dW5pdDoiw6lsw6ltZW50cyIsdmVyYjoiYXZvaXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50csOpZSIsZW1haWw6ImFkcmVzc2UgY291cnJpZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUtaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmXDp3UgJHtzfWA6YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7aX0sIHJlw6d1ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7UyhlLnZhbHVlc1swXSl9YDpgT3B0aW9uIGludmFsaWRlIDogYXR0ZW5kdSBsJ3VuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaQiOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIGdyYW5kIDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbj8/ImxhIHZhbGV1ciJ9IGFpdCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcCBncmFuZCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW4/PyJsYSB2YWxldXIifSBzb2l0ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaUiOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gYWl0ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gc29pdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29tbWVuY2VyIHBhciAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBzZSB0ZXJtaW5lciBwYXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBpbmNsdXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBmZigpe3JldHVybntsb2NhbGVFcnJvcjpwZigpfX1jb25zdCBnZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7bGFiZWw6Itee15fXqNeV15bXqiIsZ2VuZGVyOiJmIn0sbnVtYmVyOntsYWJlbDoi157Xodek16giLGdlbmRlcjoibSJ9LGJvb2xlYW46e2xhYmVsOiLXoteo15og15HXldec15nXkNeg15kiLGdlbmRlcjoibSJ9LGJpZ2ludDp7bGFiZWw6IkJpZ0ludCIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15oiLGdlbmRlcjoibSJ9LGFycmF5OntsYWJlbDoi157Xoteo15oiLGdlbmRlcjoibSJ9LG9iamVjdDp7bGFiZWw6IteQ15XXkdeZ15nXp9eYIixnZW5kZXI6Im0ifSxudWxsOntsYWJlbDoi16LXqNeaINeo15nXpyAobnVsbCkiLGdlbmRlcjoibSJ9LHVuZGVmaW5lZDp7bGFiZWw6Itei16jXmiDXnNeQINee15XXkteT16ggKHVuZGVmaW5lZCkiLGdlbmRlcjoibSJ9LHN5bWJvbDp7bGFiZWw6Iteh15nXnteR15XXnCAoU3ltYm9sKSIsZ2VuZGVyOiJtIn0sZnVuY3Rpb246e2xhYmVsOiLXpNeV16DXp9em15nXlCIsZ2VuZGVyOiJmIn0sbWFwOntsYWJlbDoi157XpNeUIChNYXApIixnZW5kZXI6ImYifSxzZXQ6e2xhYmVsOiLXp9eR15XXpteUIChTZXQpIixnZW5kZXI6ImYifSxmaWxlOntsYWJlbDoi16fXldeR16UiLGdlbmRlcjoibSJ9LHByb21pc2U6e2xhYmVsOiJQcm9taXNlIixnZW5kZXI6Im0ifSxOYU46e2xhYmVsOiJOYU4iLGdlbmRlcjoibSJ9LHVua25vd246e2xhYmVsOiLXoteo15og15zXkCDXmdeT15XXoiIsZ2VuZGVyOiJtIn0sdmFsdWU6e2xhYmVsOiLXoteo15oiLGdlbmRlcjoibSJ9fSxuPXtzdHJpbmc6e3VuaXQ6Iteq15XXldeZ150iLHNob3J0TGFiZWw6Iten16bXqCIsbG9uZ0xhYmVsOiLXkNeo15XXmiJ9LGZpbGU6e3VuaXQ6IteR15nXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sYXJyYXk6e3VuaXQ6Itek16jXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sc2V0Ont1bml0OiLXpNeo15nXmNeZ150iLHNob3J0TGFiZWw6Iten15jXnyIsbG9uZ0xhYmVsOiLXkteT15XXnCJ9LG51bWJlcjp7dW5pdDoiIixzaG9ydExhYmVsOiLXp9eY158iLGxvbmdMYWJlbDoi15LXk9eV15wifX0scj11PT51P3RbdV06dm9pZCAwLG89dT0+e2NvbnN0IGw9cih1KTtyZXR1cm4gbD9sLmxhYmVsOnU/P3QudW5rbm93bi5sYWJlbH0sZT11PT5g15Qke28odSl9YCxpPXU9PihyKHUpPy5nZW5kZXI/PyJtIik9PT0iZiI/Item16jXmdeb15Qg15zXlNeZ15XXqiI6Item16jXmdeaINec15TXmdeV16oiLGE9dT0+dT9uW3VdPz9udWxsOm51bGwscz17cmVnZXg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGVtYWlsOntsYWJlbDoi15vXqteV15HXqiDXkNeZ157XmdeZ15wiLGdlbmRlcjoiZiJ9LHVybDp7bGFiZWw6Iteb16rXldeR16og16jXqdeqIixnZW5kZXI6ImYifSxlbW9qaTp7bGFiZWw6IteQ15nXnteV15In15kiLGdlbmRlcjoibSJ9LHV1aWQ6e2xhYmVsOiJVVUlEIixnZW5kZXI6Im0ifSxuYW5vaWQ6e2xhYmVsOiJuYW5vaWQiLGdlbmRlcjoibSJ9LGd1aWQ6e2xhYmVsOiJHVUlEIixnZW5kZXI6Im0ifSxjdWlkOntsYWJlbDoiY3VpZCIsZ2VuZGVyOiJtIn0sY3VpZDI6e2xhYmVsOiJjdWlkMiIsZ2VuZGVyOiJtIn0sdWxpZDp7bGFiZWw6IlVMSUQiLGdlbmRlcjoibSJ9LHhpZDp7bGFiZWw6IlhJRCIsZ2VuZGVyOiJtIn0sa3N1aWQ6e2xhYmVsOiJLU1VJRCIsZ2VuZGVyOiJtIn0sZGF0ZXRpbWU6e2xhYmVsOiLXqteQ16jXmdeaINeV15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15ogSVNPIixnZW5kZXI6Im0ifSx0aW1lOntsYWJlbDoi15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZHVyYXRpb246e2xhYmVsOiLXntep15og15bXntefIElTTyIsZ2VuZGVyOiJtIn0saXB2NDp7bGFiZWw6Iteb16rXldeR16ogSVB2NCIsZ2VuZGVyOiJmIn0saXB2Njp7bGFiZWw6Iteb16rXldeR16ogSVB2NiIsZ2VuZGVyOiJmIn0sY2lkcnY0OntsYWJlbDoi15jXldeV15cgSVB2NCIsZ2VuZGVyOiJtIn0sY2lkcnY2OntsYWJlbDoi15jXldeV15cgSVB2NiIsZ2VuZGVyOiJtIn0sYmFzZTY0OntsYWJlbDoi157Xl9eo15XXlteqINeR15HXodeZ16EgNjQiLGdlbmRlcjoiZiJ9LGJhc2U2NHVybDp7bGFiZWw6Itee15fXqNeV15bXqiDXkdeR16HXmdehIDY0INec15vXqteV15HXldeqINeo16nXqiIsZ2VuZGVyOiJmIn0sanNvbl9zdHJpbmc6e2xhYmVsOiLXnteX16jXldeW16ogSlNPTiIsZ2VuZGVyOiJmIn0sZTE2NDp7bGFiZWw6Itee16HXpNeoIEUuMTY0IixnZW5kZXI6Im0ifSxqd3Q6e2xhYmVsOiJKV1QiLGdlbmRlcjoibSJ9LGVuZHNfd2l0aDp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0saW5jbHVkZXM6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGxvd2VyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0sc3RhcnRzX3dpdGg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LHVwcGVyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn19LGM9e25hbjoiTmFOIn07cmV0dXJuIHU9Pntzd2l0Y2godS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGw9dS5leHBlY3RlZCxnPWNbbD8/IiJdPz9vKGwpLHY9dyh1LmlucHV0KSwkPWNbdl0/P3Rbdl0/LmxhYmVsPz92O3JldHVybi9eW0EtWl0vLnRlc3QodS5leHBlY3RlZCk/YNen15zXmCDXnNeQINeq16fXmdefOiDXpteo15nXmiDXnNeU15nXldeqIGluc3RhbmNlb2YgJHt1LmV4cGVjdGVkfSwg15TXqten15HXnCAkeyR9YDpg16fXnNeYINec15Ag16rXp9eZ1586INem16jXmdeaINec15TXmdeV16ogJHtnfSwg15TXqten15HXnCAkeyR9YH1jYXNlImludmFsaWRfdmFsdWUiOntpZih1LnZhbHVlcy5sZW5ndGg9PT0xKXJldHVybmDXoteo15og15zXkCDXqten15nXnzog15TXoteo15og15fXmdeZ15Eg15zXlNeZ15XXqiAke1ModS52YWx1ZXNbMF0pfWA7Y29uc3QgbD11LnZhbHVlcy5tYXAoJD0+UygkKSk7aWYodS52YWx1ZXMubGVuZ3RoPT09MilyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsWzBdfSDXkNeVICR7bFsxXX1gO2NvbnN0IGc9bFtsLmxlbmd0aC0xXTtyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsLnNsaWNlKDAsLTEpLmpvaW4oIiwgIil9INeQ15UgJHtnfWB9Y2FzZSJ0b29fYmlnIjp7Y29uc3QgbD1hKHUub3JpZ2luKSxnPWUodS5vcmlnaW4/PyJ2YWx1ZSIpO2lmKHUub3JpZ2luPT09InN0cmluZyIpcmV0dXJuYCR7bD8ubG9uZ0xhYmVsPz8i15DXqNeV15oifSDXnteT15k6ICR7Z30g16bXqNeZ15vXlCDXnNeU15vXmdecICR7dS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7bD8udW5pdD8/IiJ9ICR7dS5pbmNsdXNpdmU/IteQ15Ug16TXl9eV16oiOiLXnNeb15wg15TXmdeV16rXqCJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g16fXmNefINeQ15Ug16nXldeV15Qg15wtJHt1Lm1heGltdW19YDpg16fXmNefINeeLSR7dS5tYXhpbXVtfWA7cmV0dXJuYNeS15PXldecINee15PXmTogJHtnfSDXpteo15nXmiDXnNeU15nXldeqICR7eX1gfWlmKHUub3JpZ2luPT09ImFycmF5Inx8dS5vcmlnaW49PT0ic2V0Iil7Y29uc3QgeT11Lm9yaWdpbj09PSJzZXQiPyLXpteo15nXm9eUIjoi16bXqNeZ15oiLEg9dS5pbmNsdXNpdmU/YCR7dS5tYXhpbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINek15fXldeqYDpg16TXl9eV16og154tJHt1Lm1heGltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g15LXk9eV15wg157Xk9eZOiAke2d9ICR7eX0g15zXlNeb15nXnCAke0h9YC50cmltKCl9Y29uc3Qgdj11LmluY2x1c2l2ZT8iPD0iOiI8IiwkPWkodS5vcmlnaW4/PyJ2YWx1ZSIpO3JldHVybiBsPy51bml0P2Ake2wubG9uZ0xhYmVsfSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1heGltdW0udG9TdHJpbmcoKX0gJHtsLnVuaXR9YDpgJHtsPy5sb25nTGFiZWw/PyLXkteT15XXnCJ9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBsPWEodS5vcmlnaW4pLGc9ZSh1Lm9yaWdpbj8/InZhbHVlIik7aWYodS5vcmlnaW49PT0ic3RyaW5nIilyZXR1cm5gJHtsPy5zaG9ydExhYmVsPz8i16fXpteoIn0g157Xk9eZOiAke2d9INem16jXmdeb15Qg15zXlNeb15nXnCAke3UubWluaW11bS50b1N0cmluZygpfSAke2w/LnVuaXQ/PyIifSAke3UuaW5jbHVzaXZlPyLXkNeVINeZ15XXqteoIjoi15zXpNeX15XXqiJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g15LXk9eV15wg15DXlSDXqdeV15XXlCDXnC0ke3UubWluaW11bX1gOmDXkteT15XXnCDXni0ke3UubWluaW11bX1gO3JldHVybmDXp9eY158g157Xk9eZOiAke2d9INem16jXmdeaINec15TXmdeV16ogJHt5fWB9aWYodS5vcmlnaW49PT0iYXJyYXkifHx1Lm9yaWdpbj09PSJzZXQiKXtjb25zdCB5PXUub3JpZ2luPT09InNldCI/Item16jXmdeb15QiOiLXpteo15nXmiI7aWYodS5taW5pbXVtPT09MSYmdS5pbmNsdXNpdmUpe2NvbnN0IEw9KHUub3JpZ2luPT09InNldCIsItec16TXl9eV16og16TXqNeZ15gg15DXl9eTIik7cmV0dXJuYNen15jXnyDXnteT15k6ICR7Z30gJHt5fSDXnNeU15vXmdecICR7TH1gfWNvbnN0IEg9dS5pbmNsdXNpdmU/YCR7dS5taW5pbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINeZ15XXqteoYDpg15nXldeq16gg154tJHt1Lm1pbmltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g16fXmNefINee15PXmTogJHtnfSAke3l9INec15TXm9eZ15wgJHtIfWAudHJpbSgpfWNvbnN0IHY9dS5pbmNsdXNpdmU/Ij49IjoiPiIsJD1pKHUub3JpZ2luPz8idmFsdWUiKTtyZXR1cm4gbD8udW5pdD9gJHtsLnNob3J0TGFiZWx9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWluaW11bS50b1N0cmluZygpfSAke2wudW5pdH1gOmAke2w/LnNob3J0TGFiZWw/PyLXp9eY158ifSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBsPXU7aWYobC5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteX15nXnCDXkSAiJHtsLnByZWZpeH0iYDtpZihsLmZvcm1hdD09PSJlbmRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXodeq15nXmdedINeRICIke2wuc3VmZml4fSJgO2lmKGwuZm9ybWF0PT09ImluY2x1ZGVzIilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeb15zXldecICIke2wuaW5jbHVkZXN9ImA7aWYobC5mb3JtYXQ9PT0icmVnZXgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteQ15nXnSDXnNeq15HXoNeZ16ogJHtsLnBhdHRlcm59YDtjb25zdCBnPXNbbC5mb3JtYXRdLHY9Zz8ubGFiZWw/P2wuZm9ybWF0LHk9KGc/LmdlbmRlcj8/Im0iKT09PSJmIj8i16rXp9eZ16DXlCI6Iteq16fXmdefIjtyZXR1cm5gJHt2fSDXnNeQICR7eX1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g157Xodek16gg15zXkCDXqten15nXnzog15fXmdeZ15Eg15zXlNeZ15XXqiDXnteb16TXnNeUINep15wgJHt1LmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g157XpNeq15cke3Uua2V5cy5sZW5ndGg+MT8i15XXqiI6IiJ9INec15Ag157XlteV15Qke3Uua2V5cy5sZW5ndGg+MT8i15nXnSI6IteUIn06ICR7Xyh1LmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4i16nXk9eUINec15Ag16rXp9eZ158g15HXkNeV15HXmdeZ16fXmCI7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ158g15Eke2UodS5vcmlnaW4/PyJhcnJheSIpfWA7ZGVmYXVsdDpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158ifX19O2Z1bmN0aW9uIHZmKCl7cmV0dXJue2xvY2FsZUVycm9yOmdmKCl9fWNvbnN0IGhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrb3ZhIix2ZXJiOiJpbWF0aSJ9LGZpbGU6e3VuaXQ6ImJhanRvdmEiLHZlcmI6ImltYXRpIn0sYXJyYXk6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifSxzZXQ6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidW5vcyIsZW1haWw6ImVtYWlsIGFkcmVzYSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGkgdnJpamVtZSIsZGF0ZToiSVNPIGRhdHVtIix0aW1lOiJJU08gdnJpamVtZSIsZHVyYXRpb246IklTTyB0cmFqYW5qZSIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6IklQdjQgcmFzcG9uIixjaWRydjY6IklQdjYgcmFzcG9uIixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuaSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbmkgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHRla3N0IixlMTY0OiJFLjE2NCBicm9qIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidW5vcyJ9LG89e25hbjoiTmFOIixzdHJpbmc6InRla3N0IixudW1iZXI6ImJyb2oiLGJvb2xlYW46ImJvb2xlYW4iLGFycmF5OiJuaXoiLG9iamVjdDoib2JqZWt0IixzZXQ6InNrdXAiLGZpbGU6ImRhdG90ZWthIixkYXRlOiJkYXR1bSIsYmlnaW50OiJiaWdpbnQiLHN5bWJvbDoic2ltYm9sIix1bmRlZmluZWQ6InVuZGVmaW5lZCIsbnVsbDoibnVsbCIsZnVuY3Rpb246ImZ1bmtjaWphIixtYXA6Im1hcGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTmVpc3ByYXZhbiB1bm9zOiBvxI1la3VqZSBzZSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGEgcHJpbWxqZW5vIGplICR7c31gOmBOZWlzcHJhdmFuIHVub3M6IG/EjWVrdWplIHNlICR7aX0sIGEgcHJpbWxqZW5vIGplICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5laXNwcmF2bmEgdnJpamVkbm9zdDogb8SNZWtpdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5laXNwcmF2bmEgb3BjaWphOiBvxI1la2l2YW5vIGplZG5vIG9kICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmV2ZWxpa286IG/EjWVraXZhbm8gZGEgJHtzPz8idnJpamVkbm9zdCJ9IGltYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW5hdGEifWA6YFByZXZlbGlrbzogb8SNZWtpdmFubyBkYSAke3M/PyJ2cmlqZWRub3N0In0gYnVkZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gaW1hICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gYnVkZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSB6YXBvxI1pbmphdGkgcyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHphdnLFoWF2YXRpIHMgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHNhZHLFvmF2YXRpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIG9kZ292YXJhdGkgdXpvcmt1ICR7aS5wYXR0ZXJufWA6YE5laXNwcmF2bmEgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5laXNwcmF2YW4gYnJvajogbW9yYSBiaXRpIHZpxaFla3JhdG5payBvZCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOZXByZXBvem5hdCR7ZS5rZXlzLmxlbmd0aD4xPyJpIGtsanXEjWV2aSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZWlzcHJhdmFuIGtsanXEjSB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5laXNwcmF2bmEgdnJpamVkbm9zdCB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIn19fTtmdW5jdGlvbiAkZigpe3JldHVybntsb2NhbGVFcnJvcjpoZigpfX1jb25zdCBfZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6ImxlZ3llbiJ9LGZpbGU6e3VuaXQ6ImJ5dGUiLHZlcmI6ImxlZ3llbiJ9LGFycmF5Ont1bml0OiJlbGVtIix2ZXJiOiJsZWd5ZW4ifSxzZXQ6e3VuaXQ6ImVsZW0iLHZlcmI6ImxlZ3llbiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJiZW1lbmV0IixlbWFpbDoiZW1haWwgY8OtbSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGlkxZFiw6lseWVnIixkYXRlOiJJU08gZMOhdHVtIix0aW1lOiJJU08gaWTFkSIsZHVyYXRpb246IklTTyBpZMWRaW50ZXJ2YWxsdW0iLGlwdjQ6IklQdjQgY8OtbSIsaXB2NjoiSVB2NiBjw61tIixjaWRydjQ6IklQdjQgdGFydG9tw6FueSIsY2lkcnY2OiJJUHY2IHRhcnRvbcOhbnkiLGJhc2U2NDoiYmFzZTY0LWvDs2RvbHQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rw7Nkb2x0IHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBzesOhbSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImJlbWVuZXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJzesOhbSIsYXJyYXk6InTDtm1iIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YMOJcnbDqW55dGVsZW4gYmVtZW5ldDogYSB2w6FydCDDqXJ0w6lrIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YDpgw4lydsOpbnl0ZWxlbiBiZW1lbmV0OiBhIHbDoXJ0IMOpcnTDqWsgJHtpfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDiXJ2w6lueXRlbGVuIGJlbWVuZXQ6IGEgdsOhcnQgw6lydMOpayAke1MoZS52YWx1ZXNbMF0pfWA6YMOJcnbDqW55dGVsZW4gb3BjacOzOiB2YWxhbWVseWlrIMOpcnTDqWsgdsOhcnQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDumwgbmFneTogJHtlLm9yaWdpbj8/IsOpcnTDqWsifSBtw6lyZXRlIHTDumwgbmFneSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtIn1gOmBUw7psIG5hZ3k6IGEgYmVtZW5ldGkgw6lydMOpayAke2Uub3JpZ2luPz8iw6lydMOpayJ9IHTDumwgbmFneTogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IG3DqXJldGUgdMO6bCBraWNzaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IHTDumwga2ljc2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMOJcnbDqW55dGVsZW4gc3RyaW5nOiAiJHtpLnByZWZpeH0iIMOpcnTDqWtrZWwga2VsbCBrZXpkxZFkbmllYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DDiXJ2w6lueXRlbGVuIHN0cmluZzogIiR7aS5zdWZmaXh9IiDDqXJ0w6lra2VsIGtlbGwgdsOpZ3rFkWRuaWVgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICIke2kuaW5jbHVkZXN9IiDDqXJ0w6lrZXQga2VsbCB0YXJ0YWxtYXpuaWFgOmkuZm9ybWF0PT09InJlZ2V4Ij9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICR7aS5wYXR0ZXJufSBtaW50w6FuYWsga2VsbCBtZWdmZWxlbG5pZWA6YMOJcnbDqW55dGVsZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYMOJcnbDqW55dGVsZW4gc3rDoW06ICR7ZS5kaXZpc29yfSB0w7ZiYnN6w7Zyw7Zzw6luZWsga2VsbCBsZW5uaWVgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBJc21lcmV0bGVuIGt1bGNzJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDDiXJ2w6lueXRlbGVuIGt1bGNzICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDiXJ2w6lueXRlbGVuIGJlbWVuZXQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gw4lydsOpbnl0ZWxlbiDDqXJ0w6lrOiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iw4lydsOpbnl0ZWxlbiBiZW1lbmV0In19fTtmdW5jdGlvbiBiZigpe3JldHVybntsb2NhbGVFcnJvcjpfZigpfX1mdW5jdGlvbiBQcyh0LG4scil7cmV0dXJuIE1hdGguYWJzKHQpPT09MT9uOnJ9ZnVuY3Rpb24gRmUodCl7aWYoIXQpcmV0dXJuIiI7Y29uc3Qgbj1bItWhIiwi1aUiLCLVqCIsItWrIiwi1bgiLCLVuNaCIiwi1oUiXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIHQrKG4uaW5jbHVkZXMocik/ItW2Ijoi1agiKX1jb25zdCB5Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDp7b25lOiLVttW31aHVtiIsbWFueToi1bbVt9Wh1bbVttWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9LGZpbGU6e3VuaXQ6e29uZToi1aLVodW11akiLG1hbnk6ItWi1aHVtdWp1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sYXJyYXk6e3VuaXQ6e29uZToi1b/VodaA1oAiLG1hbnk6ItW/1aHWgNaA1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sc2V0Ont1bml0OntvbmU6ItW/1aHWgNaAIixtYW55OiLVv9Wh1oDWgNWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLVtNW41oLVv9aEIixlbWFpbDoi1afVrC4g1bDVodW91oHVpSIsdXJsOiJVUkwiLGVtb2ppOiLVp9W01bjVu9WrIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g1aHVtNW91aHVqdWr1b4g1ocg1arVodW0IixkYXRlOiJJU08g1aHVtNW91aHVqdWr1b4iLHRpbWU6IklTTyDVqtWh1bQiLGR1cmF0aW9uOiJJU08g1b/Wh9W41bLVuNaC1anVtdW41oLVtiIsaXB2NDoiSVB2NCDVsNWh1b3WgdWlIixpcHY2OiJJUHY2INWw1aHVvdaB1aUiLGNpZHJ2NDoiSVB2NCDVtNWr1bvVodWv1aHVtdaEIixjaWRydjY6IklQdjYg1bTVq9W71aHVr9Wh1bXWhCIsYmFzZTY0OiJiYXNlNjQg1bHWh9Wh1bnVodaD1bjVviDVv9W41bIiLGJhc2U2NHVybDoiYmFzZTY0dXJsINWx1ofVodW51aHWg9W41b4g1b/VuNWyIixqc29uX3N0cmluZzoiSlNPTiDVv9W41bIiLGUxNjQ6IkUuMTY0INWw1aHVtNWh1oAiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLVtNW41oLVv9aEIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi1anVq9W+IixhcnJheToi1abVodW21aPVvtWh1a4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDVvdW/1aHWgdW+1aXVrCDVpyAke3N9YDpg1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtpfSwg1b3Vv9Wh1oHVvtWl1awg1acgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtTKGUudmFsdWVzWzFdKX1gOmDVjdWt1aHVrCDVv9Wh1oDVotWl1oDVodWv4oCkINW91brVodW91b7VuNaC1bQg1afWgCDVsNWl1b/Wh9W11aHVrNW21aXWgNWr1oEg1bTVpdWv1ajVnSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1heGltdW0pLGM9UHMocyxhLnVuaXQub25lLGEudW5pdC5tYW55KTtyZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWv1bjWgtW21aXVttWhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWs1avVttWrICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5taW5pbXVtKSxjPVBzKHMsYS51bml0Lm9uZSxhLnVuaXQubWFueSk7cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVr9W41oLVttWl1bbVoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVrNWr1bbVqyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g1Y3VrdWh1awg1b/VuNWy4oCkINW61aXVv9aEINWnINW91a/VvdW+1asgIiR7aS5wcmVmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DVjdWt1aHVrCDVv9W41bLigKQg1brVpdW/1oQg1acg1aHVvtWh1oDVv9W+1asgIiR7aS5zdWZmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVutWh1oDVuNaC1bbVodWv1asgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVsNWh1bTVodW61aHVv9Wh1b3VrdWh1bbVqyAke2kucGF0dGVybn0g1bHWh9Wh1bnVodaD1avVtmA6YNWN1a3VodWsICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDVjdWt1aHVrCDVqdWr1b7igKQg1brVpdW/1oQg1acg1aLVodWm1bTVodW61aHVv9Wr1a8g1azVq9W21asgJHtlLmRpdmlzb3J9LdWrYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g1YnVs9Wh1bbVodW51b7VodWuINWi1aHVttWh1azVqyR7ZS5rZXlzLmxlbmd0aD4xPyLVttWl1oAiOiIifS4gJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDVjdWt1aHVrCDVotWh1bbVodWs1asgJHtGZShlLm9yaWdpbil9LdW41oLVtGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDVjdWt1aHVrCDVodaA1arVpdaEICR7RmUoZS5vcmlnaW4pfS3VuNaC1bRgO2RlZmF1bHQ6cmV0dXJuItWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bQifX19O2Z1bmN0aW9uIGtmKCl7cmV0dXJue2xvY2FsZUVycm9yOnlmKCl9fWNvbnN0IFNmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrYXJha3RlciIsdmVyYjoibWVtaWxpa2kifSxmaWxlOnt1bml0OiJieXRlIix2ZXJiOiJtZW1pbGlraSJ9LGFycmF5Ont1bml0OiJpdGVtIix2ZXJiOiJtZW1pbGlraSJ9LHNldDp7dW5pdDoiaXRlbSIsdmVyYjoibWVtaWxpa2kifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhbmdnYWwgZGFuIHdha3R1IGZvcm1hdCBJU08iLGRhdGU6InRhbmdnYWwgZm9ybWF0IElTTyIsdGltZToiamFtIGZvcm1hdCBJU08iLGR1cmF0aW9uOiJkdXJhc2kgZm9ybWF0IElTTyIsaXB2NDoiYWxhbWF0IElQdjQiLGlwdjY6ImFsYW1hdCBJUHY2IixjaWRydjQ6InJlbnRhbmcgYWxhbWF0IElQdjQiLGNpZHJ2NjoicmVudGFuZyBhbGFtYXQgSVB2NiIsYmFzZTY0OiJzdHJpbmcgZGVuZ2FuIGVua29kZSBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRlbmdhbiBlbmtvZGUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoic3RyaW5nIEpTT04iLGUxNjQ6ImFuZ2thIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGRpdGVyaW1hICR7c31gOmBJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke2l9LCBkaXRlcmltYSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gc2FsYWggc2F0dSBkYXJpICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWhhcmFwa2FuICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IG1lbWlsaWtpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbiJ9YDpgVGVybGFsdSBiZXNhcjogZGloYXJhcGthbiAke2Uub3JpZ2luPz8idmFsdWUifSBtZW5qYWRpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVtaWxpa2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVuamFkaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gU3RyaW5nIHRpZGFrIHZhbGlkOiBoYXJ1cyBkaW11bGFpIGRlbmdhbiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BTdHJpbmcgdGlkYWsgdmFsaWQ6IGhhcnVzIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgbWVueWVydGFrYW4gIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgc2VzdWFpIHBvbGEgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IHRpZGFrIHZhbGlkYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYEFuZ2thIHRpZGFrIHZhbGlkOiBoYXJ1cyBrZWxpcGF0YW4gZGFyaSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBLdW5jaSB0aWRhayBkaWtlbmFsaSAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEt1bmNpIHRpZGFrIHZhbGlkIGRpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayB2YWxpZCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBOaWxhaSB0aWRhayB2YWxpZCBkaSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgdGlkYWsgdmFsaWQifX19O2Z1bmN0aW9uIHdmKCl7cmV0dXJue2xvY2FsZUVycm9yOlNmKCl9fWNvbnN0IElmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJzdGFmaSIsdmVyYjoiYcOwIGhhZmEifSxmaWxlOnt1bml0OiJiw6Z0aSIsdmVyYjoiYcOwIGhhZmEifSxhcnJheTp7dW5pdDoiaGx1dGkiLHZlcmI6ImHDsCBoYWZhIn0sc2V0Ont1bml0OiJobHV0aSIsdmVyYjoiYcOwIGhhZmEifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZ2lsZGkiLGVtYWlsOiJuZXRmYW5nIix1cmw6InZlZnNsw7PDsCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGFnc2V0bmluZyBvZyB0w61taSIsZGF0ZToiSVNPIGRhZ3NldG5pbmciLHRpbWU6IklTTyB0w61taSIsZHVyYXRpb246IklTTyB0w61tYWxlbmdkIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyZW5ndXIiLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyZW5ndXIiLGpzb25fc3RyaW5nOiJKU09OIHN0cmVuZ3VyIixlMTY0OiJFLjE2NCB0w7ZsdWdpbGRpIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZ2lsZGkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJuw7ptZXIiLGFycmF5OiJmeWxraSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BSYW5ndCBnaWxkaTogw57DuiBzbMOzc3QgaW5uICR7c30gw75hciBzZW0gw6EgYcOwIHZlcmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9YDpgUmFuZ3QgZ2lsZGk6IMOew7ogc2zDs3N0IGlubiAke3N9IMO+YXIgc2VtIMOhIGHDsCB2ZXJhICR7aX1gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFJhbmd0IGdpbGRpOiBnZXJ0IHLDocOwIGZ5cmlyICR7UyhlLnZhbHVlc1swXSl9YDpgw5NnaWx0IHZhbDogbcOhIHZlcmEgZWl0dCBhZiBlZnRpcmZhcmFuZGkgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE9mIHN0w7NydDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbj8/ImdpbGRpIn0gaGFmaSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJobHV0aSJ9YDpgT2Ygc3TDs3J0OiBnZXJ0IGVyIHLDocOwIGZ5cmlyIGHDsCAke2Uub3JpZ2luPz8iZ2lsZGkifSBzw6kgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gaGFmaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gc8OpICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgYnlyamEgw6EgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGVuZGEgw6EgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgaW5uaWhhbGRhICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgZnlsZ2phIG15bnN0cmkgJHtpLnBhdHRlcm59YDpgUmFuZ3QgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFLDtm5nIHRhbGE6IHZlcsOwdXIgYcOwIHZlcmEgbWFyZ2ZlbGRpIGFmICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYMOTw75la2t0ICR7ZS5rZXlzLmxlbmd0aD4xPyJpciBseWtsYXIiOiJ1ciBseWtpbGwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBSYW5ndXIgbHlraWxsIMOtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJSYW5ndCBnaWxkaSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBSYW5ndCBnaWxkaSDDrSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iUmFuZ3QgZ2lsZGkifX19O2Z1bmN0aW9uIHpmKCl7cmV0dXJue2xvY2FsZUVycm9yOklmKCl9fWNvbnN0IHhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhdHRlcmkiLHZlcmI6ImF2ZXJlIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiYXZlcmUifSxhcnJheTp7dW5pdDoiZWxlbWVudGkiLHZlcmI6ImF2ZXJlIn0sc2V0Ont1bml0OiJlbGVtZW50aSIsdmVyYjoiYXZlcmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJpbmRpcml6em8gZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBvcmEgSVNPIixkYXRlOiJkYXRhIElTTyIsdGltZToib3JhIElTTyIsZHVyYXRpb246ImR1cmF0YSBJU08iLGlwdjQ6ImluZGlyaXp6byBJUHY0IixpcHY2OiJpbmRpcml6em8gSVB2NiIsY2lkcnY0OiJpbnRlcnZhbGxvIElQdjQiLGNpZHJ2NjoiaW50ZXJ2YWxsbyBJUHY2IixiYXNlNjQ6InN0cmluZ2EgY29kaWZpY2F0YSBpbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhdGEgaW4gYmFzZTY0Iixqc29uX3N0cmluZzoic3RyaW5nYSBKU09OIixlMTY0OiJudW1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im51bWVybyIsYXJyYXk6InZldHRvcmUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gSW5wdXQgbm9uIHZhbGlkbzogYXR0ZXNvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmljZXZ1dG8gJHtzfWA6YElucHV0IG5vbiB2YWxpZG86IGF0dGVzbyAke2l9LCByaWNldnV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCBub24gdmFsaWRvOiBhdHRlc28gJHtTKGUudmFsdWVzWzBdKX1gOmBPcHppb25lIG5vbiB2YWxpZGE6IGF0dGVzbyB1bm8gdHJhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wcG8gZ3JhbmRlOiAke2Uub3JpZ2luPz8idmFsb3JlIn0gZGV2ZSBhdmVyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50aSJ9YDpgVHJvcHBvIGdyYW5kZTogJHtlLm9yaWdpbj8/InZhbG9yZSJ9IGRldmUgZXNzZXJlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRyb3BwbyBwaWNjb2xvOiAke2Uub3JpZ2lufSBkZXZlIGF2ZXJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wcG8gcGljY29sbzogJHtlLm9yaWdpbn0gZGV2ZSBlc3NlcmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZ2Egbm9uIHZhbGlkYTogZGV2ZSBpbml6aWFyZSBjb24gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gU3RyaW5nYSBub24gdmFsaWRhOiBkZXZlIHRlcm1pbmFyZSBjb24gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgaW5jbHVkZXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgY29ycmlzcG9uZGVyZSBhbCBwYXR0ZXJuICR7aS5wYXR0ZXJufWA6YElucHV0IG5vbiB2YWxpZG86ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW1lcm8gbm9uIHZhbGlkbzogZGV2ZSBlc3NlcmUgdW4gbXVsdGlwbG8gZGkgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2hpYXYke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImUifSBub24gcmljb25vc2NpdXQke2Uua2V5cy5sZW5ndGg+MT8iZSI6ImEifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGlhdmUgbm9uIHZhbGlkYSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvcmUgbm9uIHZhbGlkbyBpbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyJ9fX07ZnVuY3Rpb24gVGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6eGYoKX19Y29uc3QgamY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuaWh+WtlyIsdmVyYjoi44Gn44GC44KLIn0sZmlsZTp7dW5pdDoi44OQ44Kk44OIIix2ZXJiOiLjgafjgYLjgosifSxhcnJheTp7dW5pdDoi6KaB57SgIix2ZXJiOiLjgafjgYLjgosifSxzZXQ6e3VuaXQ6Iuimgee0oCIsdmVyYjoi44Gn44GC44KLIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuWFpeWKm+WApCIsZW1haWw6IuODoeODvOODq+OCouODieODrOOCuSIsdXJsOiJVUkwiLGVtb2ppOiLntbXmloflrZciLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTT+aXpeaZgiIsZGF0ZToiSVNP5pel5LuYIix0aW1lOiJJU0/mmYLliLsiLGR1cmF0aW9uOiJJU0/mnJ/plpMiLGlwdjQ6IklQdjTjgqLjg4njg6zjgrkiLGlwdjY6IklQdjbjgqLjg4njg6zjgrkiLGNpZHJ2NDoiSVB2NOevhOWbsiIsY2lkcnY2OiJJUHY256+E5ZuyIixiYXNlNjQ6ImJhc2U2NOOCqOODs+OCs+ODvOODieaWh+Wtl+WIlyIsYmFzZTY0dXJsOiJiYXNlNjR1cmzjgqjjg7PjgrPjg7zjg4nmloflrZfliJciLGpzb25fc3RyaW5nOiJKU09O5paH5a2X5YiXIixlMTY0OiJFLjE2NOeVquWPtyIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuWFpeWKm+WApCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuaVsOWApCIsYXJyYXk6IumFjeWIlyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DnhKHlirnjgarlhaXlips6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfeOBjOacn+W+heOBleOCjOOBvuOBl+OBn+OBjOOAgSR7c33jgYzlhaXlipvjgZXjgozjgb7jgZfjgZ9gOmDnhKHlirnjgarlhaXlips6ICR7aX3jgYzmnJ/lvoXjgZXjgozjgb7jgZfjgZ/jgYzjgIEke3N944GM5YWl5Yqb44GV44KM44G+44GX44GfYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DnhKHlirnjgarlhaXlips6ICR7UyhlLnZhbHVlc1swXSl944GM5pyf5b6F44GV44KM44G+44GX44GfYDpg54Sh5Yq544Gq6YG45oqeOiAke18oZS52YWx1ZXMsIuOAgSIpfeOBruOBhOOBmuOCjOOBi+OBp+OBguOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i5Lul5LiL44Gn44GC44KLIjoi44KI44KK5bCP44GV44GEIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHthLnVuaXQ/PyLopoHntKAifSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtpfeW/heimgeOBjOOBguOCiuOBvuOBmWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLku6XkuIrjgafjgYLjgosiOiLjgojjgorlpKfjgY3jgYQiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOWwj+OBleOBmeOBjuOCi+WApDogJHtlLm9yaWdpbn3jga8ke2UubWluaW11bS50b1N0cmluZygpfSR7YS51bml0fSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlsI/jgZXjgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW5944GvJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2l95b+F6KaB44GM44GC44KK44G+44GZYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5wcmVmaXh9IuOBp+Wni+OBvuOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g54Sh5Yq544Gq5paH5a2X5YiXOiAiJHtpLnN1ZmZpeH0i44Gn57WC44KP44KL5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5pbmNsdWRlc30i44KS5ZCr44KA5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeWKueOBquaWh+Wtl+WIlzog44OR44K/44O844OzJHtpLnBhdHRlcm5944Gr5LiA6Ie044GZ44KL5b+F6KaB44GM44GC44KK44G+44GZYDpg54Sh5Yq544GqJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeWKueOBquaVsOWApDogJHtlLmRpdmlzb3J944Gu5YCN5pWw44Gn44GC44KL5b+F6KaB44GM44GC44KK44G+44GZYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g6KqN6K2Y44GV44KM44Gm44GE44Gq44GE44Kt44O8JHtlLmtleXMubGVuZ3RoPjE/Iue+pCI6IiJ9OiAke18oZS5rZXlzLCLjgIEiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufeWGheOBrueEoeWKueOBquOCreODvGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i54Sh5Yq544Gq5YWl5YqbIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW595YaF44Gu54Sh5Yq544Gq5YCkYDtkZWZhdWx0OnJldHVybiLnhKHlirnjgarlhaXlipsifX19O2Z1bmN0aW9uIE9mKCl7cmV0dXJue2xvY2FsZUVycm9yOmpmKCl9fWNvbnN0IFVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLhg6Hhg5jhg5vhg5Hhg53hg5rhg50iLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxmaWxlOnt1bml0OiLhg5Hhg5Dhg5jhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxhcnJheTp7dW5pdDoi4YOU4YOa4YOU4YOb4YOU4YOc4YOi4YOYIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn0sc2V0Ont1bml0OiLhg5Thg5rhg5Thg5vhg5Thg5zhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4YOo4YOU4YOn4YOV4YOQ4YOc4YOQIixlbWFpbDoi4YOU4YOaLeGDpOGDneGDoeGDouGDmOGDoSDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLHVybDoiVVJMIixlbW9qaToi4YOU4YOb4YOd4YOv4YOYIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLhg5fhg5Dhg6Dhg5jhg6bhg5gt4YOT4YOg4YOdIixkYXRlOiLhg5fhg5Dhg6Dhg5jhg6bhg5giLHRpbWU6IuGDk+GDoOGDnSIsZHVyYXRpb246IuGDruGDkOGDnOGDkuGDoOGDq+GDmuGDmOGDleGDneGDkeGDkCIsaXB2NDoiSVB2NCDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLGlwdjY6IklQdjYg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYIixjaWRydjQ6IklQdjQg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixjaWRydjY6IklQdjYg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixiYXNlNjQ6ImJhc2U2NC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixiYXNlNjR1cmw6ImJhc2U2NHVybC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixqc29uX3N0cmluZzoiSlNPTiDhg5Xhg5Thg5rhg5giLGUxNjQ6IkUuMTY0IOGDnOGDneGDm+GDlOGDoOGDmCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuGDoOGDmOGDquGDruGDleGDmCIsc3RyaW5nOiLhg5Xhg5Thg5rhg5giLGJvb2xlYW46IuGDkeGDo+GDmuGDlOGDkOGDnOGDmCIsZnVuY3Rpb246IuGDpOGDo+GDnOGDpeGDquGDmOGDkCIsYXJyYXk6IuGDm+GDkOGDoeGDmOGDleGDmCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOo4YOU4YOn4YOV4YOQ4YOc4YOQOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWA6YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2l9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7UyhlLnZhbHVlc1swXSl9YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOY4YOQIOGDlOGDoOGDly3hg5Thg6Dhg5fhg5ggJHtfKGUudmFsdWVzLCJ8Iil9LeGDk+GDkOGDnGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhg5bhg5Thg5Phg5vhg5Thg6Lhg5Dhg5Mg4YOT4YOY4YOT4YOYOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggJHtlLm9yaWdpbj8/IuGDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDk+GDmOGDk+GDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW4/PyLhg5vhg5zhg5jhg6jhg5Xhg5zhg5Thg5rhg53hg5Hhg5AifSDhg5jhg6fhg53hg6EgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59IOGDmOGDp+GDneGDoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDmOGDrOGDp+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnByZWZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDm+GDl+GDkOGDleGDoOGDk+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnN1ZmZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOV4YOU4YOa4YOYOiDhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhICIke2kuaW5jbHVkZXN9Ii3hg6FgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDqOGDlOGDlOGDoeGDkOGDkeGDkOGDm+GDlOGDkeGDneGDk+GDlOGDoSDhg6jhg5Dhg5Hhg5rhg53hg5zhg6EgJHtpLnBhdHRlcm59YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOg4YOY4YOq4YOu4YOV4YOYOiDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhICR7ZS5kaXZpc29yfS3hg5jhg6Eg4YOv4YOU4YOg4YOQ4YOT4YOYYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g4YOj4YOq4YOc4YOd4YOR4YOYIOGDkuGDkOGDoeGDkOGDpuGDlOGDkSR7ZS5rZXlzLmxlbmd0aD4xPyLhg5Thg5Hhg5giOiLhg5gifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOS4YOQ4YOh4YOQ4YOm4YOU4YOR4YOYICR7ZS5vcmlnaW59LeGDqOGDmGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOb4YOc4YOY4YOo4YOV4YOc4YOU4YOa4YOd4YOR4YOQICR7ZS5vcmlnaW59LeGDqOGDmGA7ZGVmYXVsdDpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9fX07ZnVuY3Rpb24gUGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6VWYoKX19Y29uc3QgTmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuGej+GeveGeouGegOGfkuGen+GemiIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn0sZmlsZTp7dW5pdDoi4Z6U4Z+DIix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxhcnJheTp7dW5pdDoi4Z6S4Z624Z6P4Z67Iix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxzZXQ6e3VuaXQ6IuGekuGetuGej+GeuyIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGemyIsZW1haWw6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGek+GeouGfiuGeuOGemOGfguGemyIsdXJsOiJVUkwiLGVtb2ppOiLhnp/hnonhn5LhnonhnrbhnqLhnrbhnprhnpjhn5Lhnpjhno7hn40iLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuGegOGetuGem+GelOGemuGet+GeheGfkuGehuGfgeGekSDhnpPhnrfhnoThnpjhn4nhn4ThnoQgSVNPIixkYXRlOiLhnoDhnrbhnpvhnpThnprhnrfhnoXhn5Lhnobhn4HhnpEgSVNPIix0aW1lOiLhnpjhn4nhn4ThnoQgSVNPIixkdXJhdGlvbjoi4Z6a4Z6Z4Z+I4Z6W4Z+B4Z6bIElTTyIsaXB2NDoi4Z6i4Z624Z6f4Z6Z4Z6K4Z+S4Z6L4Z624Z6TIElQdjQiLGlwdjY6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixjaWRydjQ6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY0IixjaWRydjY6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixiYXNlNjQ6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGeouGfiuGet+GegOGevOGeiiBiYXNlNjQiLGJhc2U2NHVybDoi4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6i4Z+K4Z634Z6A4Z684Z6KIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemiBKU09OIixlMTY0OiLhnpvhn4HhnoEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpsifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLhnpvhn4HhnoEiLGFycmF5OiLhnqLhnrbhnprhn4EgKEFycmF5KSIsbnVsbDoi4Z6C4Z+S4Z6Y4Z624Z6T4Z6P4Z6Y4Z+S4Z6b4Z+DIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpvhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWA6YOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGem+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtpfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6U4Z6J4Z+S4Z6F4Z684Z6b4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke1MoZS52YWx1ZXNbMF0pfWA6YOGeh+GemOGfkuGemuGevuGen+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhnofhnrbhnpjhnr3hnpnhnoDhn5LhnpPhnrvhnoThnoXhn4bhno7hn4ThnpggJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLhnpLhnrbhno/hnrsifWA6YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhno/hnrzhnoXhnpbhn4HhnoDhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7ZS5vcmlnaW59ICR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4Z6P4Z684Z6F4Z6W4Z+B4Z6A4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke2Uub3JpZ2lufSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoXhnrbhnpThn4vhnpXhn5Lhno/hnr7hnpjhnorhn4ThnpkgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGelOGeieGfkuGeheGelOGfi+GeiuGfhOGemSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnpjhnrbhnpMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhno/hn4LhnpXhn5LhnoLhnrzhnpXhn5LhnoLhnoThnpPhnrnhnoThnpHhnpjhn5LhnprhnoThn4vhnorhn4LhnpvhnpThnrbhnpPhnoDhn4bhno7hno/hn4sgJHtpLnBhdHRlcm59YDpg4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhnpvhn4HhnoHhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6P4Z+C4Z6H4Z624Z6W4Z6g4Z674Z6C4Z674Z6O4Z6T4Z+DICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOGemuGegOGeg+GevuGeieGen+GfhOGemOGet+Gek+Gen+GfkuGeguGetuGem+Gfi+GfliAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOGen+GfhOGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIn19fTtmdW5jdGlvbiB4bCgpe3JldHVybntsb2NhbGVFcnJvcjpOZigpfX1mdW5jdGlvbiBEZigpe3JldHVybiB4bCgpfWNvbnN0IEVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLrrLjsnpAiLHZlcmI6InRvIGhhdmUifSxmaWxlOnt1bml0OiLrsJTsnbTtirgiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoi6rCcIix2ZXJiOiJ0byBoYXZlIn0sc2V0Ont1bml0OiLqsJwiLHZlcmI6InRvIGhhdmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi7J6F66ClIixlbWFpbDoi7J2066mU7J28IOyjvOyGjCIsdXJsOiJVUkwiLGVtb2ppOiLsnbTrqqjsp4AiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDrgqDsp5zsi5zqsIQiLGRhdGU6IklTTyDrgqDsp5wiLHRpbWU6IklTTyDsi5zqsIQiLGR1cmF0aW9uOiJJU08g6riw6rCEIixpcHY0OiJJUHY0IOyjvOyGjCIsaXB2NjoiSVB2NiDso7zshowiLGNpZHJ2NDoiSVB2NCDrspTsnIQiLGNpZHJ2NjoiSVB2NiDrspTsnIQiLGJhc2U2NDoiYmFzZTY0IOyduOy9lOuUqSDrrLjsnpDsl7QiLGJhc2U2NHVybDoiYmFzZTY0dXJsIOyduOy9lOuUqSDrrLjsnpDsl7QiLGpzb25fc3RyaW5nOiJKU09OIOusuOyekOyXtCIsZTE2NDoiRS4xNjQg67KI7Zi4Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi7J6F66ClIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g7J6Y66q765CcIOyeheugpTog7JiI7IOBIO2DgOyeheydgCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIOuwm+ydgCDtg4DsnoXsnYAgJHtzfeyeheuLiOuLpGA6YOyemOuqu+uQnCDsnoXroKU6IOyYiOyDgSDtg4DsnoXsnYAgJHtpfSwg67Cb7J2AIO2DgOyeheydgCAke3N97J6F64uI64ukYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DsnpjrqrvrkJwg7J6F66ClOiDqsJLsnYAgJHtTKGUudmFsdWVzWzBdKX0g7J207Ja07JW8IO2VqeuLiOuLpGA6YOyemOuqu+uQnCDsmLXshZg6ICR7XyhlLnZhbHVlcywi65iQ64qUICIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i7J207ZWYIjoi66+466eMIixhPWk9PT0i66+466eMIj8i7J207Ja07JW8IO2VqeuLiOuLpCI6IuyXrOyVvCDtlanri4jri6QiLHM9bihlLm9yaWdpbiksYz1zPy51bml0Pz8i7JqU7IaMIjtyZXR1cm4gcz9gJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDtgb3ri4jri6Q6ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtjfSAke2l9JHthfWA6YCR7ZS5vcmlnaW4/PyLqsJIifeydtCDrhIjrrLQg7YG964uI64ukOiAke2UubWF4aW11bS50b1N0cmluZygpfSAke2l9JHthfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLsnbTsg4EiOiLstIjqs7wiLGE9aT09PSLsnbTsg4EiPyLsnbTslrTslbwg7ZWp64uI64ukIjoi7Jes7JW8IO2VqeuLiOuLpCIscz1uKGUub3JpZ2luKSxjPXM/LnVuaXQ/PyLsmpTshowiO3JldHVybiBzP2Ake2Uub3JpZ2luPz8i6rCSIn3snbQg64SI66y0IOyekeyKteuLiOuLpDogJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2N9ICR7aX0ke2F9YDpgJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDsnpHsirXri4jri6Q6ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7aX0ke2F9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6ICIke2kucHJlZml4fSIo7Jy8KeuhnCDsi5zsnpHtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLnN1ZmZpeH0iKOycvCnroZwg64Gd64KY7JW8IO2VqeuLiOuLpGA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLmluY2x1ZGVzfSLsnYQo66W8KSDtj6ztlajtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJyZWdleCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6IOygleq3nOyLnSAke2kucGF0dGVybn0g7Yyo7YS06rO8IOydvOy5mO2VtOyVvCDtlanri4jri6RgOmDsnpjrqrvrkJwgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOyemOuqu+uQnCDsiKvsnpA6ICR7ZS5kaXZpc29yfeydmCDrsLDsiJjsl6zslbwg7ZWp64uI64ukYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g7J247Iud7ZWgIOyImCDsl4bripQg7YKkOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOyemOuqu+uQnCDtgqQ6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLsnpjrqrvrkJwg7J6F66ClIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOyemOuqu+uQnCDqsJI6ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLsnpjrqrvrkJwg7J6F66ClIn19fTtmdW5jdGlvbiBaZigpe3JldHVybntsb2NhbGVFcnJvcjpFZigpfX1jb25zdCBodD10PT50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7ZnVuY3Rpb24gTnModCl7Y29uc3Qgbj1NYXRoLmFicyh0KSxyPW4lMTAsbz1uJTEwMDtyZXR1cm4gbz49MTEmJm88PTE5fHxyPT09MD8ibWFueSI6cj09PTE/Im9uZSI6ImZldyJ9Y29uc3QgUmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToic2ltYm9saXMiLGZldzoic2ltYm9saWFpIixtYW55OiJzaW1ib2xpxbMifSx2ZXJiOntzbWFsbGVyOntpbmNsdXNpdmU6InR1cmkgYsWrdGkgbmUgaWxnZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIHRydW1wZXNuxJcga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIHRydW1wZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIGlsZ2VzbsSXIGthaXAifX19LGZpbGU6e3VuaXQ6e29uZToiYmFpdGFzIixmZXc6ImJhaXRhaSIsbWFueToiYmFpdMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIGRpZGVzbmlzIGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSBixat0aSBtYcW+ZXNuaXMga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIG1hxb5lc25pcyBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgYsWrdGkgZGlkZXNuaXMga2FpcCJ9fX0sYXJyYXk6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fSxzZXQ6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fX07ZnVuY3Rpb24gbihlLGksYSxzKXtjb25zdCBjPXRbZV0/P251bGw7cmV0dXJuIGM9PT1udWxsP2M6e3VuaXQ6Yy51bml0W2ldLHZlcmI6Yy52ZXJiW3NdW2E/ImluY2x1c2l2ZSI6Im5vdEluY2x1c2l2ZSJdfX1jb25zdCByPXtyZWdleDoixK92ZXN0aXMiLGVtYWlsOiJlbC4gcGHFoXRvIGFkcmVzYXMiLHVybDoiVVJMIixlbW9qaToiamF1c3R1a2FzIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGF0YSBpciBsYWlrYXMiLGRhdGU6IklTTyBkYXRhIix0aW1lOiJJU08gbGFpa2FzIixkdXJhdGlvbjoiSVNPIHRydWttxJciLGlwdjQ6IklQdjQgYWRyZXNhcyIsaXB2NjoiSVB2NiBhZHJlc2FzIixjaWRydjQ6IklQdjQgdGlua2xvIHByZWZpa3NhcyAoQ0lEUikiLGNpZHJ2NjoiSVB2NiB0aW5rbG8gcHJlZmlrc2FzIChDSURSKSIsYmFzZTY0OiJiYXNlNjQgdcW+a29kdW90YSBlaWx1dMSXIixiYXNlNjR1cmw6ImJhc2U2NHVybCB1xb5rb2R1b3RhIGVpbHV0xJciLGpzb25fc3RyaW5nOiJKU09OIGVpbHV0xJciLGUxNjQ6IkUuMTY0IG51bWVyaXMiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEr3Zlc3RpcyJ9LG89e25hbjoiTmFOIixudW1iZXI6InNrYWnEjWl1cyIsYmlnaW50OiJzdmVpa2FzaXMgc2thacSNaXVzIixzdHJpbmc6ImVpbHV0xJciLGJvb2xlYW46ImxvZ2luxJcgcmVpa8WhbcSXIix1bmRlZmluZWQ6Im5lYXBpYnLEl8W+dGEgcmVpa8WhbcSXIixmdW5jdGlvbjoiZnVua2NpamEiLHN5bWJvbDoic2ltYm9saXMiLGFycmF5OiJtYXN5dmFzIixvYmplY3Q6Im9iamVrdGFzIixudWxsOiJudWxpbsSXIHJlaWvFoW3ElyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH1gOmBHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSAke2l9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BQcml2YWxvIGLFq3RpICR7UyhlLnZhbHVlc1swXSl9YDpgUHJpdmFsbyBixat0aSB2aWVuYXMgacWhICR7XyhlLnZhbHVlcywifCIpfSBwYXNpcmlua2ltxbNgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9b1tlLm9yaWdpbl0/P2Uub3JpZ2luLGE9bihlLm9yaWdpbixOcyhOdW1iZXIoZS5tYXhpbXVtKSksZS5pbmNsdXNpdmU/PyExLCJzbWFsbGVyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgZGlkZXNuaXMga2FpcCI6Im1hxb5lc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPW9bZS5vcmlnaW5dPz9lLm9yaWdpbixhPW4oZS5vcmlnaW4sTnMoTnVtYmVyKGUubWluaW11bSkpLGUuaW5jbHVzaXZlPz8hMSwiYmlnZ2VyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgbWHFvmVzbmlzIGthaXAiOiJkaWRlc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcHJhc2lkxJd0aSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcGFzaWJhaWd0aSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEVpbHV0xJcgcHJpdmFsbyDEr3RyYXVrdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEVpbHV0xJcgcHJpdmFsbyBhdGl0aWt0aSAke2kucGF0dGVybn1gOmBOZXRlaXNpbmdhcyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gU2thacSNaXVzIHByaXZhbG8gYsWrdGkgJHtlLmRpdmlzb3J9IGthcnRvdGluaXMuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVhdHBhxb5pbnQke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImFzIn0gcmFrdCR7ZS5rZXlzLmxlbmd0aD4xPyJhaSI6ImFzIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iUmFzdGFzIGtsYWlkaW5nYXMgcmFrdGFzIjtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMiO2Nhc2UiaW52YWxpZF9lbGVtZW50Ijp7Y29uc3QgaT1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuYCR7aHQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gdHVyaSBrbGFpZGluZ8SFIMSvdmVzdMSvYH1kZWZhdWx0OnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMifX19O2Z1bmN0aW9uIENmKCl7cmV0dXJue2xvY2FsZUVycm9yOlJmKCl9fWNvbnN0IEFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLQt9C90LDRhtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxmaWxlOnt1bml0OiLQsdCw0ZjRgtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxhcnJheTp7dW5pdDoi0YHRgtCw0LLQutC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxzZXQ6e3VuaXQ6ItGB0YLQsNCy0LrQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0L3QtdGBIixlbWFpbDoi0LDQtNGA0LXRgdCwINC90LAg0LUt0L/QvtGI0YLQsCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7Rn9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0YPQvCDQuCDQstGA0LXQvNC1IixkYXRlOiJJU08g0LTQsNGC0YPQvCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0LLRgNC10LzQtdGC0YDQsNC10ZrQtSIsaXB2NDoiSVB2NCDQsNC00YDQtdGB0LAiLGlwdjY6IklQdjYg0LDQtNGA0LXRgdCwIixjaWRydjQ6IklQdjQg0L7Qv9GB0LXQsyIsY2lkcnY2OiJJUHY2INC+0L/RgdC10LMiLGJhc2U2NDoiYmFzZTY0LdC10L3QutC+0LTQuNGA0LDQvdCwINC90LjQt9CwIixiYXNlNjR1cmw6ImJhc2U2NHVybC3QtdC90LrQvtC00LjRgNCw0L3QsCDQvdC40LfQsCIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC30LAiLGUxNjQ6IkUuMTY0INCx0YDQvtGYIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLQvdC10YEifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLQsdGA0L7RmCIsYXJyYXk6ItC90LjQt9CwIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCT0YDQtdGI0LXQvSDQstC90LXRgTog0YHQtSDQvtGH0LXQutGD0LLQsCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC/0YDQuNC80LXQvdC+ICR7c31gOmDQk9GA0LXRiNC10L0g0LLQvdC10YE6INGB0LUg0L7Rh9C10LrRg9Cy0LAgJHtpfSwg0L/RgNC40LzQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgJHtTKGUudmFsdWVzWzBdKX1gOmDQk9GA0LXRiNCw0L3QsCDQvtC/0YbQuNGY0LA6INGB0LUg0L7Rh9C10LrRg9Cy0LAg0LXQtNC90LAgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LPQvtC70LXQvDog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2luPz8i0LLRgNC10LTQvdC+0YHRgtCwIn0g0LTQsCDQuNC80LAgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i0LXQu9C10LzQtdC90YLQuCJ9YDpg0J/RgNC10LzQvdC+0LPRgyDQs9C+0LvQtdC8OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW4/PyLQstGA0LXQtNC90L7RgdGC0LAifSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LzQsNC7OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW59INC00LAg0LjQvNCwICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQn9GA0LXQvNC90L7Qs9GDINC80LDQuzog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2lufSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0LfQsNC/0L7Rh9C90YPQstCwINGB0L4gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LDQttC10YfQutCwINC90LjQt9CwOiDQvNC+0YDQsCDQtNCwINC30LDQstGA0YjRg9Cy0LAg0YHQviAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQstCw0LbQtdGH0LrQsCDQvdC40LfQsDog0LzQvtGA0LAg0LTQsCDQstC60LvRg9GH0YPQstCwICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0L7QtNCz0L7QsNGA0LAg0L3QsCDQv9Cw0YLQtdGA0L3QvtGCICR7aS5wYXR0ZXJufWA6YEludmFsaWQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCT0YDQtdGI0LXQvSDQsdGA0L7RmDog0LzQvtGA0LAg0LTQsCDQsdC40LTQtSDQtNC10LvQuNCyINGB0L4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/ItCd0LXQv9GA0LXQv9C+0LfQvdCw0LXQvdC4INC60LvRg9GH0LXQstC4Ijoi0J3QtdC/0YDQtdC/0L7Qt9C90LDQtdC9INC60LvRg9GHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0JPRgNC10YjQtdC9INC60LvRg9GHINCy0L4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCT0YDQtdGI0LXQvSDQstC90LXRgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQk9GA0LXRiNC90LAg0LLRgNC10LTQvdC+0YHRgiDQstC+ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQk9GA0LXRiNC10L0g0LLQvdC10YEifX19O2Z1bmN0aW9uIExmKCl7cmV0dXJue2xvY2FsZUVycm9yOkFmKCl9fWNvbnN0IE1mPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJha3NhcmEiLHZlcmI6Im1lbXB1bnlhaSJ9LGZpbGU6e3VuaXQ6ImJhaXQiLHZlcmI6Im1lbXB1bnlhaSJ9LGFycmF5Ont1bml0OiJlbGVtZW4iLHZlcmI6Im1lbXB1bnlhaSJ9LHNldDp7dW5pdDoiZWxlbWVuIix2ZXJiOiJtZW1wdW55YWkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZS1tZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhcmlraCBtYXNhIElTTyIsZGF0ZToidGFyaWtoIElTTyIsdGltZToibWFzYSBJU08iLGR1cmF0aW9uOiJ0ZW1wb2ggSVNPIixpcHY0OiJhbGFtYXQgSVB2NCIsaXB2NjoiYWxhbWF0IElQdjYiLGNpZHJ2NDoianVsYXQgSVB2NCIsY2lkcnY2OiJqdWxhdCBJUHY2IixiYXNlNjQ6InN0cmluZyBkaWtvZGthbiBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRpa29ka2FuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6InN0cmluZyBKU09OIixlMTY0OiJub21ib3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im5vbWJvciJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayBzYWg6IGRpamFuZ2thIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZGl0ZXJpbWEgJHtzfWA6YElucHV0IHRpZGFrIHNhaDogZGlqYW5na2EgJHtpfSwgZGl0ZXJpbWEgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW5wdXQgdGlkYWsgc2FoOiBkaWphbmdrYSAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgc2FoOiBkaWphbmdrYSBzYWxhaCBzYXR1IGRhcmlwYWRhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVuIn1gOmBUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSBhZGFsYWggJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVGVybGFsdSBrZWNpbDogZGlqYW5na2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUZXJsYWx1IGtlY2lsOiBkaWphbmdrYSAke2Uub3JpZ2lufSBhZGFsYWggJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcm11bGEgZGVuZ2FuICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIG1lbmdhbmR1bmdpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBzZXBhZGFuIGRlbmdhbiBjb3JhayAke2kucGF0dGVybn1gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0gdGlkYWsgc2FoYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJvciB0aWRhayBzYWg6IHBlcmx1IGdhbmRhYW4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS3VuY2kgdGlkYWsgZGlrZW5hbGk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS3VuY2kgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayBzYWgiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmlsYWkgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnB1dCB0aWRhayBzYWgifX19O2Z1bmN0aW9uIHFmKCl7cmV0dXJue2xvY2FsZUVycm9yOk1mKCl9fWNvbnN0IEZmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWtlbnMiLHZlcmI6ImhlZWZ0In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6ImhlZWZ0In0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW52b2VyIixlbWFpbDoiZW1haWxhZHJlcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGVuIHRpamQiLGRhdGU6IklTTyBkYXR1bSIsdGltZToiSVNPIHRpamQiLGR1cmF0aW9uOiJJU08gZHV1ciIsaXB2NDoiSVB2NC1hZHJlcyIsaXB2NjoiSVB2Ni1hZHJlcyIsY2lkcnY0OiJJUHY0LWJlcmVpayIsY2lkcnY2OiJJUHY2LWJlcmVpayIsYmFzZTY0OiJiYXNlNjQtZ2Vjb2RlZXJkZSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjQgVVJMLWdlY29kZWVyZGUgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHN0cmluZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW52b2VyIn0sbz17bmFuOiJOYU4iLG51bWJlcjoiZ2V0YWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT25nZWxkaWdlIGludm9lcjogdmVyd2FjaHQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBvbnR2aW5nICR7c31gOmBPbmdlbGRpZ2UgaW52b2VyOiB2ZXJ3YWNodCAke2l9LCBvbnR2aW5nICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE9uZ2VsZGlnZSBpbnZvZXI6IHZlcndhY2h0ICR7UyhlLnZhbHVlc1swXSl9YDpgT25nZWxkaWdlIG9wdGllOiB2ZXJ3YWNodCDDqcOpbiB2YW4gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8ibGFhdCI6ZS5vcmlnaW49PT0ic3RyaW5nIj8ibGFuZyI6Imdyb290IjtyZXR1cm4gYT9gVGUgJHtzfTogdmVyd2FjaHQgZGF0ICR7ZS5vcmlnaW4/PyJ3YWFyZGUifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50ZW4ifSAke2EudmVyYn1gOmBUZSAke3N9OiB2ZXJ3YWNodCBkYXQgJHtlLm9yaWdpbj8/IndhYXJkZSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSBpc2B9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8idnJvZWciOmUub3JpZ2luPT09InN0cmluZyI/ImtvcnQiOiJrbGVpbiI7cmV0dXJuIGE/YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gaXNgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gT25nZWxkaWdlIHRla3N0OiBtb2V0IG1ldCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgb3AgIiR7aS5zdWZmaXh9IiBlaW5kaWdlbmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgIiR7aS5pbmNsdWRlc30iIGJldmF0dGVuYDppLmZvcm1hdD09PSJyZWdleCI/YE9uZ2VsZGlnZSB0ZWtzdDogbW9ldCBvdmVyZWVua29tZW4gbWV0IHBhdHJvb24gJHtpLnBhdHRlcm59YDpgT25nZWxkaWc6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPbmdlbGRpZyBnZXRhbDogbW9ldCBlZW4gdmVlbHZvdWQgdmFuICR7ZS5kaXZpc29yfSB6aWpuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gT25iZWtlbmRlIGtleSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT25nZWxkaWdlIGtleSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iT25nZWxkaWdlIGludm9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBPbmdlbGRpZ2Ugd2FhcmRlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJPbmdlbGRpZ2UgaW52b2VyIn19fTtmdW5jdGlvbiBKZigpe3JldHVybntsb2NhbGVFcnJvcjpGZigpfX1jb25zdCBIZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiw6UgaGEifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiw6UgaGEifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiLDpSBpbm5laG9sZGUifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiw6UgaW5uZWhvbGRlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1wb3N0YWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsZXR0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsZXR0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGV0IixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0ZXIiLGNpZHJ2NjoiSVB2Ni1zcGVrdGVyIixiYXNlNjQ6ImJhc2U2NC1lbmtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5rb2RldCBzdHJlbmciLGpzb25fc3RyaW5nOiJKU09OLXN0cmVuZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJ0YWxsIixhcnJheToibGlzdGUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmlrayAke3N9YDpgVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0ICR7aX0sIGZpa2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVWd5bGRpZyB2ZXJkaTogZm9ydmVudGV0ICR7UyhlLnZhbHVlc1swXSl9YDpgVWd5bGRpZyB2YWxnOiBmb3J2ZW50ZXQgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZvciBzdG9yKHQpOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdGlsIMOlIGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlciJ9YDpgRm9yIHN0b3IodCk6IGZvcnZlbnRldCAke2Uub3JpZ2luPz8idmFsdWUifSB0aWwgw6UgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRm9yIGxpdGUobik6IGZvcnZlbnRldCAke2Uub3JpZ2lufSB0aWwgw6UgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEZvciBsaXRlKG4pOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbn0gdGlsIMOlIGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IG3DpSBlbmRlIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFVneWxkaWcgc3RyZW5nOiBtw6UgaW5uZWhvbGRlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWcgdGFsbDogbcOlIHbDpnJlIGV0IG11bHRpcGx1bSBhdiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iVWtqZW50ZSBuw7hrbGVyIjoiVWtqZW50IG7DuGtrZWwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGtrZWwgaSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVWd5bGRpZyBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHZlcmRpIGkgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVneWxkaWcgaW5wdXQifX19O2Z1bmN0aW9uIFdmKCl7cmV0dXJue2xvY2FsZUVycm9yOkhmKCl9fWNvbnN0IEJmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJoYXJmIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6InVuc3VyIix2ZXJiOiJvbG1hbMSxZMSxciJ9LHNldDp7dW5pdDoidW5zdXIiLHZlcmI6Im9sbWFsxLFkxLFyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImdpcmVuIixlbWFpbDoiZXBvc3RhZ8OiaCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGhlbmfDom3EsSIsZGF0ZToiSVNPIHRhcmloaSIsdGltZToiSVNPIHphbWFuxLEiLGR1cmF0aW9uOiJJU08gbcO8ZGRldGkiLGlwdjQ6IklQdjQgbmnFn8OibsSxIixpcHY2OiJJUHY2IG5pxZ/Dom7EsSIsY2lkcnY0OiJJUHY0IG1lbnppbGkiLGNpZHJ2NjoiSVB2NiBtZW56aWxpIixiYXNlNjQ6ImJhc2U2NC3Fn2lmcmVsaSBtZXRpbiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtxZ9pZnJlbGkgbWV0aW4iLGpzb25fc3RyaW5nOiJKU09OIG1ldGluIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImdpcmVuIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibnVtYXJhIixhcnJheToic2FmIixudWxsOiJnYXliIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEbDonNpdCBnaXJlbjogdW11bGFuIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYWzEsW5hbiAke3N9YDpgRsOic2l0IGdpcmVuOiB1bXVsYW4gJHtpfSwgYWzEsW5hbiAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BGw6JzaXQgZ2lyZW46IHVtdWxhbiAke1MoZS52YWx1ZXNbMF0pfWA6YEbDonNpdCB0ZXJjaWg6IG3Du3RlYmVybGVyICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9IG9sbWFsxLF5ZMSxLmB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZhemxhIGvDvMOnw7xrOiAke2Uub3JpZ2lufSwgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBrw7zDp8O8azogJHtlLm9yaWdpbn0sICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBvbG1hbMSxeWTEsS5gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gRsOic2l0IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsS5gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEbDonNpdCBtZXRpbjogIiR7aS5zdWZmaXh9IiBpbGUgYml0bWVsaS5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gRsOic2l0IG1ldGluOiAiJHtpLmluY2x1ZGVzfSIgaWh0aXbDoiBldG1lbGkuYDppLmZvcm1hdD09PSJyZWdleCI/YEbDonNpdCBtZXRpbjogJHtpLnBhdHRlcm59IG5ha8WfxLFuYSB1eW1hbMSxLmA6YEbDonNpdCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gRsOic2l0IHNhecSxOiAke2UuZGl2aXNvcn0ga2F0xLEgb2xtYWzEsXlkxLEuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYW5haHRhciAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGnDp2luIHRhbsSxbm1heWFuIGFuYWh0YXIgdmFyLmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2lyZW4gdGFuxLFuYW1hZMSxLiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbiB0YW7EsW5tYXlhbiBrxLF5bWV0IHZhci5gO2RlZmF1bHQ6cmV0dXJuIkvEsXltZXQgdGFuxLFuYW1hZMSxLiJ9fX07ZnVuY3Rpb24gVmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6QmYoKX19Y29uc3QgS2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LGZpbGU6e3VuaXQ6Itio2KfbjNm82LMiLHZlcmI6ItmI2YTYsdmKIn0sYXJyYXk6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LHNldDp7dW5pdDoi2KrZiNqp2YoiLHZlcmI6ItmI2YTYsdmKIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItmI2LHZiNiv2YoiLGVtYWlsOiLYqNix24zamtmG2KfZhNuM2qkiLHVybDoi24zZiCDYotixINin2YQiLGVtb2ppOiLYp9uM2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItmG24zZvNmHINin2Ygg2YjYrtiqIixkYXRlOiLZhtuQ2bzZhyIsdGltZToi2YjYrtiqIixkdXJhdGlvbjoi2YXZiNiv2YciLGlwdjQ6ItivIElQdjQg2b7YqtmHIixpcHY2OiLYryBJUHY2INm+2KrZhyIsY2lkcnY0OiLYryBJUHY0INiz2KfYrdmHIixjaWRydjY6ItivIElQdjYg2LPYp9it2YciLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQg2YXYqtmGIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINmF2KrZhiIsanNvbl9zdHJpbmc6IkpTT04g2YXYqtmGIixlMTY0OiLYryBFLjE2NCDYtNmF25DYsdmHIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/ZiiJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itin2LHbkCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DZhtin2LPZhSDZiNix2YjYr9mKOiDYqNin24zYryBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGA6YNmG2KfYs9mFINmI2LHZiNiv2Yo6INio2KfbjNivICR7aX0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YbYp9iz2YUg2YjYsdmI2K/Zijog2KjYp9uM2K8gJHtTKGUudmFsdWVzWzBdKX0g2YjYp9uMYDpg2YbYp9iz2YUg2KfZhtiq2K7Yp9ioOiDYqNin24zYryDbjNmIINmE2YcgJHtfKGUudmFsdWVzLCJ8Iil9INqF2K7ZhyDZiNin24xgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsdmI2YbZhyJ9INmI2YTYsdmKYDpg2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2YjZimB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNqJ24zYsSDaqdmI2obZhtuMOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INmI2YTYsdmKYDpg2onbjNixINqp2YjahtmG24w6ICR7ZS5vcmlnaW59INio2KfbjNivICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDZiNmKYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5wcmVmaXh9IiDYs9ix2Ycg2b7bjNmEINi02YpgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5zdWZmaXh9IiDYs9ix2Ycg2b7Yp9uMINiq2Ycg2YjYsdiz2YraltmKYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8gIiR7aS5pbmNsdWRlc30iINmI2YTYsdmKYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gJHtpLnBhdHRlcm59INiz2LHZhyDZhdi32KfYqNmC2Kog2YjZhNix2YpgOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9iz2YUg2K/bjGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDZhtin2LPZhSDYudiv2K86INio2KfbjNivINivICR7ZS5kaXZpc29yfSDZhdi22LHYqCDZiNmKYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YbYp9iz2YUgJHtlLmtleXMubGVuZ3RoPjE/Itqp2YTbjNqJ2YjZhtmHIjoi2qnZhNuM2okifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDZhtin2LPZhSDaqdmE24zaiSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDZhtin2LPZhSDYudmG2LXYsSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2RlZmF1bHQ6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiJ9fX07ZnVuY3Rpb24gR2YoKXtyZXR1cm57bG9jYWxlRXJyb3I6S2YoKX19Y29uc3QgWGY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWvDs3ciLHZlcmI6Im1pZcSHIn0sZmlsZTp7dW5pdDoiYmFqdMOzdyIsdmVyYjoibWllxIcifSxhcnJheTp7dW5pdDoiZWxlbWVudMOzdyIsdmVyYjoibWllxIcifSxzZXQ6e3VuaXQ6ImVsZW1lbnTDs3ciLHZlcmI6Im1pZcSHIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Ind5cmHFvGVuaWUiLGVtYWlsOiJhZHJlcyBlbWFpbCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZGF0YSBpIGdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGRhdGU6ImRhdGEgdyBmb3JtYWNpZSBJU08iLHRpbWU6ImdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGR1cmF0aW9uOiJjemFzIHRyd2FuaWEgSVNPIixpcHY0OiJhZHJlcyBJUHY0IixpcHY2OiJhZHJlcyBJUHY2IixjaWRydjQ6Inpha3JlcyBJUHY0IixjaWRydjY6Inpha3JlcyBJUHY2IixiYXNlNjQ6ImNpxIVnIHpuYWvDs3cgemFrb2Rvd2FueSB3IGZvcm1hY2llIGJhc2U2NCIsYmFzZTY0dXJsOiJjacSFZyB6bmFrw7N3IHpha29kb3dhbnkgdyBmb3JtYWNpZSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjacSFZyB6bmFrw7N3IHcgZm9ybWFjaWUgSlNPTiIsZTE2NDoibGljemJhIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoid2VqxZtjaWUifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJsaWN6YmEiLGFycmF5OiJ0YWJsaWNhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5pZXByYXdpZMWCb3dlIGRhbmUgd2VqxZtjaW93ZTogb2N6ZWtpd2FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG90cnp5bWFubyAke3N9YDpgTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlOiBvY3pla2l3YW5vICR7aX0sIG90cnp5bWFubyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2U6IG9jemVraXdhbm8gJHtTKGUudmFsdWVzWzBdKX1gOmBOaWVwcmF3aWTFgm93YSBvcGNqYTogb2N6ZWtpd2FubyBqZWRuZWogeiB3YXJ0b8WbY2kgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFphIGR1xbxhIHdhcnRvxZvEhzogb2N6ZWtpd2FubywgxbxlICR7ZS5vcmlnaW4/PyJ3YXJ0b8WbxIcifSBixJlkemllIG1pZcSHICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnTDs3cifWA6YFpieXQgZHXFvCh5L2EvZSk6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSB3eW5vc2nEhyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BaYSBtYcWCYSB3YXJ0b8WbxIc6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSBtaWXEhyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50w7N3In1gOmBaYnl0IG1hxYIoeS9hL2UpOiBvY3pla2l3YW5vLCDFvGUgJHtlLm9yaWdpbj8/IndhcnRvxZvEhyJ9IGLEmWR6aWUgd3lub3NpxIcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemFjenluYcSHIHNpxJkgb2QgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmllcHJhd2lkxYJvd3kgY2nEhWcgem5ha8OzdzogbXVzaSBrb8WEY3p5xIcgc2nEmSBuYSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemF3aWVyYcSHICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOaWVwcmF3aWTFgm93eSBjacSFZyB6bmFrw7N3OiBtdXNpIG9kcG93aWFkYcSHIHd6b3Jjb3dpICR7aS5wYXR0ZXJufWA6YE5pZXByYXdpZMWCb3coeS9hL2UpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOaWVwcmF3aWTFgm93YSBsaWN6YmE6IG11c2kgYnnEhyB3aWVsb2tyb3Rub8WbY2nEhSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOaWVyb3pwb3puYW5lIGtsdWN6ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmllcHJhd2lkxYJvd3kga2x1Y3ogdyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5pZXByYXdpZMWCb3dhIHdhcnRvxZvEhyB3ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2UifX19O2Z1bmN0aW9uIFlmKCl7cmV0dXJue2xvY2FsZUVycm9yOlhmKCl9fWNvbnN0IFFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmVzIix2ZXJiOiJ0ZXIifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoidGVyIn0sYXJyYXk6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifSxzZXQ6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicGFkcsOjbyIsZW1haWw6ImVuZGVyZcOnbyBkZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYcOnw6NvIElTTyIsaXB2NDoiZW5kZXJlw6dvIElQdjQiLGlwdjY6ImVuZGVyZcOnbyBJUHY2IixjaWRydjQ6ImZhaXhhIGRlIElQdjQiLGNpZHJ2NjoiZmFpeGEgZGUgSVB2NiIsYmFzZTY0OiJ0ZXh0byBjb2RpZmljYWRvIGVtIGJhc2U2NCIsYmFzZTY0dXJsOiJVUkwgY29kaWZpY2FkYSBlbSBiYXNlNjQiLGpzb25fc3RyaW5nOiJ0ZXh0byBKU09OIixlMTY0OiJuw7ptZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50cmFkYSJ9LG89e25hbjoiTmFOIixudW1iZXI6Im7Dum1lcm8iLG51bGw6Im51bG8ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwbyBpbnbDoWxpZG86IGVzcGVyYWRvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmVjZWJpZG8gJHtzfWA6YFRpcG8gaW52w6FsaWRvOiBlc3BlcmFkbyAke2l9LCByZWNlYmlkbyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyYWRhIGludsOhbGlkYTogZXNwZXJhZG8gJHtTKGUudmFsdWVzWzBdKX1gOmBPcMOnw6NvIGludsOhbGlkYTogZXNwZXJhZGEgdW1hIGRhcyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTXVpdG8gZ3JhbmRlOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbj8/InZhbG9yIn0gdGl2ZXNzZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3MifWA6YE11aXRvIGdyYW5kZTogZXNwZXJhZG8gcXVlICR7ZS5vcmlnaW4/PyJ2YWxvciJ9IGZvc3NlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE11aXRvIHBlcXVlbm86IGVzcGVyYWRvIHF1ZSAke2Uub3JpZ2lufSB0aXZlc3NlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBNdWl0byBwZXF1ZW5vOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbn0gZm9zc2UgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBjb21lw6dhciBjb20gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVGV4dG8gaW52w6FsaWRvOiBkZXZlIHRlcm1pbmFyIGNvbSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBpbmNsdWlyICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BUZXh0byBpbnbDoWxpZG86IGRldmUgY29ycmVzcG9uZGVyIGFvIHBhZHLDo28gJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludsOhbGlkb2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOhbGlkbzogZGV2ZSBzZXIgbcO6bHRpcGxvIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoYXZlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSBkZXNjb25oZWNpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENoYXZlIGludsOhbGlkYSBlbSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iRW50cmFkYSBpbnbDoWxpZGEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVmFsb3IgaW52w6FsaWRvIGVtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJDYW1wbyBpbnbDoWxpZG8ifX19O2Z1bmN0aW9uIGVnKCl7cmV0dXJue2xvY2FsZUVycm9yOlFmKCl9fWNvbnN0IHRnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmUiLHZlcmI6InPEgyBhaWLEgyJ9LGZpbGU6e3VuaXQ6Im9jdGXIm2kiLHZlcmI6InPEgyBhaWLEgyJ9LGFycmF5Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sc2V0Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sbWFwOnt1bml0OiJpbnRyxINyaSIsdmVyYjoic8SDIGFpYsSDIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImludHJhcmUiLGVtYWlsOiJhZHJlc8SDIGRlIGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXTEgyDImWkgb3LEgyBJU08iLGRhdGU6ImRhdMSDIElTTyIsdGltZToib3LEgyBJU08iLGR1cmF0aW9uOiJkdXJhdMSDIElTTyIsaXB2NDoiYWRyZXPEgyBJUHY0IixpcHY2OiJhZHJlc8SDIElQdjYiLG1hYzoiYWRyZXPEgyBNQUMiLGNpZHJ2NDoiaW50ZXJ2YWwgSVB2NCIsY2lkcnY2OiJpbnRlcnZhbCBJUHY2IixiYXNlNjQ6IsiZaXIgY29kYXQgYmFzZTY0IixiYXNlNjR1cmw6IsiZaXIgY29kYXQgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiyJlpciBKU09OIixlMTY0OiJudW3Eg3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnRyYXJlIn0sbz17bmFuOiJOYU4iLHN0cmluZzoiyJlpciIsbnVtYmVyOiJudW3Eg3IiLGJvb2xlYW46ImJvb2xlYW4iLGZ1bmN0aW9uOiJmdW5jyJtpZSIsYXJyYXk6Im1hdHJpY2UiLG9iamVjdDoib2JpZWN0Iix1bmRlZmluZWQ6Im5lZGVmaW5pdCIsc3ltYm9sOiJzaW1ib2wiLGJpZ2ludDoibnVtxINyIG1hcmUiLHZvaWQ6InZvaWQiLG5ldmVyOiJuZXZlciIsbWFwOiJoYXJ0xIMiLHNldDoic2V0In07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybmBJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7aX0sIHByaW1pdCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT3DIm2l1bmUgaW52YWxpZMSDOiBhyJl0ZXB0YXQgdW5hIGRpbnRyZSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gUHJlYSBtYXJlOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbj8/InZhbG9hcmVhIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlIn1gOmBQcmVhIG1hcmU6IGHImXRlcHRhdCBjYSAke2Uub3JpZ2luPz8idmFsb2FyZWEifSBzxIMgZmllICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZWEgbWljOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVhIG1pYzogYciZdGVwdGF0IGNhICR7ZS5vcmlnaW59IHPEgyBmaWUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgw65uY2VhcMSDIGN1ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgdGVybWluZSBjdSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgaW5jbHVkxIMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgcG90cml2ZWFzY8SDIGN1IG1vZGVsdWwgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludmFsaWQ6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW3Eg3IgaW52YWxpZDogdHJlYnVpZSBzxIMgZmllIG11bHRpcGx1IGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoZWkgbmVyZWN1bm9zY3V0ZTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGVpZSBpbnZhbGlkxIMgw65uICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnRyYXJlIGludmFsaWTEgyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvYXJlIGludmFsaWTEgyDDrm4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkludHJhcmUgaW52YWxpZMSDIn19fTtmdW5jdGlvbiBuZygpe3JldHVybntsb2NhbGVFcnJvcjp0ZygpfX1mdW5jdGlvbiBEcyh0LG4scixvKXtjb25zdCBlPU1hdGguYWJzKHQpLGk9ZSUxMCxhPWUlMTAwO3JldHVybiBhPj0xMSYmYTw9MTk/bzppPT09MT9uOmk+PTImJmk8PTQ/cjpvfWNvbnN0IHJnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OntvbmU6ItGB0LjQvNCy0L7QuyIsZmV3OiLRgdC40LzQstC+0LvQsCIsbWFueToi0YHQuNC80LLQvtC70L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxmaWxlOnt1bml0OntvbmU6ItCx0LDQudGCIixmZXc6ItCx0LDQudGC0LAiLG1hbnk6ItCx0LDQudGCIn0sdmVyYjoi0LjQvNC10YLRjCJ9LGFycmF5Ont1bml0OntvbmU6ItGN0LvQtdC80LXQvdGCIixmZXc6ItGN0LvQtdC80LXQvdGC0LAiLG1hbnk6ItGN0LvQtdC80LXQvdGC0L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxzZXQ6e3VuaXQ6e29uZToi0Y3Qu9C10LzQtdC90YIiLGZldzoi0Y3Qu9C10LzQtdC90YLQsCIsbWFueToi0Y3Qu9C10LzQtdC90YLQvtCyIn0sdmVyYjoi0LjQvNC10YLRjCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLQstCy0L7QtCIsZW1haWw6ImVtYWlsINCw0LTRgNC10YEiLHVybDoiVVJMIixlbW9qaToi0Y3QvNC+0LTQt9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0LAg0Lgg0LLRgNC10LzRjyIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0LLRgNC10LzRjyIsZHVyYXRpb246IklTTyDQtNC70LjRgtC10LvRjNC90L7RgdGC0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LXRgSIsaXB2NjoiSVB2NiDQsNC00YDQtdGBIixjaWRydjQ6IklQdjQg0LTQuNCw0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00LjQsNC/0LDQt9C+0L0iLGJhc2U2NDoi0YHRgtGA0L7QutCwINCyINGE0L7RgNC80LDRgtC1IGJhc2U2NCIsYmFzZTY0dXJsOiLRgdGC0YDQvtC60LAg0LIg0YTQvtGA0LzQsNGC0LUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiSlNPTiDRgdGC0YDQvtC60LAiLGUxNjQ6ItC90L7QvNC10YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLQstCy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItGH0LjRgdC70L4iLGFycmF5OiLQvNCw0YHRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L3QviAke3N9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7aX0sINC/0L7Qu9GD0YfQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCw0YDQuNCw0L3Rgjog0L7QttC40LTQsNC70L7RgdGMINC+0LTQvdC+INC40LcgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5tYXhpbXVtKSxjPURzKHMsYS51bml0Lm9uZSxhLnVuaXQuZmV3LGEudW5pdC5tYW55KTtyZXR1cm5g0KHQu9C40YjQutC+0Lwg0LHQvtC70YzRiNC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC40LUifSDQsdGD0LTQtdGCINC40LzQtdGC0YwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7Y31gfXJldHVybmDQodC70LjRiNC60L7QvCDQsdC+0LvRjNGI0L7QtSDQt9C90LDRh9C10L3QuNC1OiDQvtC20LjQtNCw0LvQvtGB0YwsINGH0YLQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90LjQtSJ9INCx0YPQtNC10YIgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1pbmltdW0pLGM9RHMocyxhLnVuaXQub25lLGEudW5pdC5mZXcsYS51bml0Lm1hbnkpO3JldHVybmDQodC70LjRiNC60L7QvCDQvNCw0LvQtdC90YzQutC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbn0g0LHRg9C00LXRgiDQuNC80LXRgtGMICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0KHQu9C40YjQutC+0Lwg0LzQsNC70LXQvdGM0LrQvtC1INC30L3QsNGH0LXQvdC40LU6INC+0LbQuNC00LDQu9C+0YHRjCwg0YfRgtC+ICR7ZS5vcmlnaW59INCx0YPQtNC10YIgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0L3QsNGH0LjQvdCw0YLRjNGB0Y8g0YEgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDQt9Cw0LrQsNC90YfQuNCy0LDRgtGM0YHRjyDQvdCwICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDRgdC+0LTQtdGA0LbQsNGC0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0YHQvtC+0YLQstC10YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvdGDICR7aS5wYXR0ZXJufWA6YNCd0LXQstC10YDQvdGL0LkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCd0LXQstC10YDQvdC+0LUg0YfQuNGB0LvQvjog0LTQvtC70LbQvdC+INCx0YvRgtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9C+0LfQvdCw0L3QvSR7ZS5rZXlzLmxlbmd0aD4xPyLRi9C1Ijoi0YvQuSJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC4IjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdCy0LXRgNC90YvQuSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LXRgNC90YvQtSDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0J3QtdCy0LXRgNC90L7QtSDQt9C90LDRh9C10L3QuNC1INCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQtdGA0L3Ri9C1INCy0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtSJ9fX07ZnVuY3Rpb24gaWcoKXtyZXR1cm57bG9jYWxlRXJyb3I6cmcoKX19Y29uc3Qgb2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWtvdiIsdmVyYjoiaW1ldGkifSxmaWxlOnt1bml0OiJiYWp0b3YiLHZlcmI6ImltZXRpIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidm5vcyIsZW1haWw6ImUtcG/FoXRuaSBuYXNsb3YiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXR1bSBpbiDEjWFzIixkYXRlOiJJU08gZGF0dW0iLHRpbWU6IklTTyDEjWFzIixkdXJhdGlvbjoiSVNPIHRyYWphbmplIixpcHY0OiJJUHY0IG5hc2xvdiIsaXB2NjoiSVB2NiBuYXNsb3YiLGNpZHJ2NDoib2JzZWcgSVB2NCIsY2lkcnY2OiJvYnNlZyBJUHY2IixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuIG5peiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbiBuaXoiLGpzb25fc3RyaW5nOiJKU09OIG5peiIsZTE2NDoiRS4xNjQgxaF0ZXZpbGthIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidm5vcyJ9LG89e25hbjoiTmFOIixudW1iZXI6IsWhdGV2aWxvIixhcnJheToidGFiZWxhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5ldmVsamF2ZW4gdm5vczogcHJpxI1ha292YW5vIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcHJlamV0byAke3N9YDpgTmV2ZWxqYXZlbiB2bm9zOiBwcmnEjWFrb3Zhbm8gJHtpfSwgcHJlamV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOZXZlbGphdmVuIHZub3M6IHByacSNYWtvdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5ldmVsamF2bmEgbW/Fvm5vc3Q6IHByacSNYWtvdmFubyBlbm8gaXptZWQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSBpbWVsbyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3YifWA6YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BQcmVtYWpobm86IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbn0gaW1lbG8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFByZW1hamhubzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2ZWxqYXZlbiBuaXo6IG1vcmEgc2UgemHEjWV0aSB6ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHNlIGtvbsSNYXRpIHogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZlbGphdmVuIG5pejogbW9yYSB2c2Vib3ZhdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHVzdHJlemF0aSB2em9yY3UgJHtpLnBhdHRlcm59YDpgTmV2ZWxqYXZlbiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2ZWxqYXZubyDFoXRldmlsbzogbW9yYSBiaXRpIHZlxI1rcmF0bmlrICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5lcHJlcG96bmFuJHtlLmtleXMubGVuZ3RoPjE/Imkga2xqdcSNaSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZlbGphdmVuIGtsanXEjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXZlbGphdmVuIHZub3MiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2ZWxqYXZuYSB2cmVkbm9zdCB2ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZlbGphdmVuIHZub3MifX19O2Z1bmN0aW9uIGFnKCl7cmV0dXJue2xvY2FsZUVycm9yOm9nKCl9fWNvbnN0IHNnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWNrZW4iLHZlcmI6ImF0dCBoYSJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJhdHQgaGEifSxhcnJheTp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9LHNldDp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJyZWd1bGrDpHJ0IHV0dHJ5Y2siLGVtYWlsOiJlLXBvc3RhZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTy1kYXR1bSBvY2ggdGlkIixkYXRlOiJJU08tZGF0dW0iLHRpbWU6IklTTy10aWQiLGR1cmF0aW9uOiJJU08tdmFyYWt0aWdoZXQiLGlwdjQ6IklQdjQtaW50ZXJ2YWxsIixpcHY2OiJJUHY2LWludGVydmFsbCIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGFkIHN0csOkbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWtvZGFkIHN0csOkbmciLGpzb25fc3RyaW5nOiJKU09OLXN0csOkbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Im1hbGwtbGl0ZXJhbCJ9LG89e25hbjoiTmFOIixudW1iZXI6ImFudGFsIixhcnJheToibGlzdGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmljayAke3N9YDpgT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7aX0sIGZpY2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT2dpbHRpZ3QgdmFsOiBmw7ZydsOkbnRhZGUgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnQifWA6YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YXQgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRsO2ciBsaXRlKHQpOiBmw7ZydsOkbnRhZGUgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEbDtnIgbGl0ZSh0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBiw7ZyamEgbWVkICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIHNsdXRhIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIGlubmVow6VsbGEgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIG1hdGNoYSBtw7Zuc3RyZXQgIiR7aS5wYXR0ZXJufSJgOmBPZ2lsdGlnKHQpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPZ2lsdGlndCB0YWw6IG3DpXN0ZSB2YXJhIGVuIG11bHRpcGVsIGF2ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJPa8OkbmRhIG55Y2tsYXIiOiJPa8OkbmQgbnlja2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT2dpbHRpZyBueWNrZWwgaSAke2Uub3JpZ2luPz8idsOkcmRldCJ9YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJPZ2lsdGlnIGlucHV0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE9naWx0aWd0IHbDpHJkZSBpICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In1gO2RlZmF1bHQ6cmV0dXJuIk9naWx0aWcgaW5wdXQifX19O2Z1bmN0aW9uIGNnKCl7cmV0dXJue2xvY2FsZUVycm9yOnNnKCl9fWNvbnN0IHVnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLgro7grrTgr4HgrqTgr43grqTgr4HgrpXgr43grpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxmaWxlOnt1bml0OiLgrqrgr4jgrp/gr43grp/gr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxhcnJheTp7dW5pdDoi4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn0sc2V0Ont1bml0OiLgrongrrHgr4Hgrqrgr43grqrgr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4K6J4K6z4K+N4K6z4K+A4K6f4K+BIixlbWFpbDoi4K6u4K6/4K6p4K+N4K6p4K6e4K+N4K6a4K6y4K+NIOCuruCvgeCuleCuteCusOCuvyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIOCupOCvh+CupOCuvyDgrqjgr4fgrrDgrq7gr40iLGRhdGU6IklTTyDgrqTgr4fgrqTgrr8iLHRpbWU6IklTTyDgrqjgr4fgrrDgrq7gr40iLGR1cmF0aW9uOiJJU08g4K6V4K6+4K6yIOCuheCus+CuteCvgSIsaXB2NDoiSVB2NCDgrq7gr4HgrpXgrrXgrrDgrr8iLGlwdjY6IklQdjYg4K6u4K+B4K6V4K614K6w4K6/IixjaWRydjQ6IklQdjQg4K614K6w4K6u4K+N4K6q4K+BIixjaWRydjY6IklQdjYg4K614K6w4K6u4K+N4K6q4K+BIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkIOCumuCusOCuruCvjSIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCDgrprgrrDgrq7gr40iLGpzb25fc3RyaW5nOiJKU09OIOCumuCusOCuruCvjSIsZTE2NDoiRS4xNjQg4K6O4K6j4K+NIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLgro7grqPgr40iLGFycmF5OiLgroXgrqPgrr8iLG51bGw6IuCuteCvhuCuseCvgeCuruCviCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DgrqTgrrXgrrHgrr7grqkg4K6J4K6z4K+N4K6z4K+A4K6f4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWA6YOCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2l9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7UyhlLnZhbHVlc1swXSl9YDpg4K6k4K614K6x4K6+4K6pIOCuteCuv+CusOCvgeCuquCvjeCuquCuruCvjTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7XyhlLnZhbHVlcywifCIpfSDgrofgrrLgr40g4K6S4K6p4K+N4K6x4K+BYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CulSDgrqrgr4bgrrDgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2luPz8i4K6u4K6k4K6/4K6q4K+N4K6q4K+BIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIn0g4K6G4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrq7grr/grpUg4K6q4K+G4K6w4K6/4K6v4K6k4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtlLm9yaWdpbj8/IuCuruCupOCuv+CuquCvjeCuquCvgSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CuleCumuCvjSDgrprgrr/grrHgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9IOCuhuCulSDgrofgrrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDpg4K6u4K6/4K6V4K6a4K+NIOCumuCuv+CuseCuv+Cur+CupOCvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnByZWZpeH0iIOCuh+CusuCvjSDgrqTgr4rgrp/grpngr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnN1ZmZpeH0iIOCuh+CusuCvjSDgrq7gr4Hgrp/grr/grrXgrp/gr4jgrq8g4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOCupOCuteCuseCuvuCuqSDgrprgrrDgrq7gr406ICIke2kuaW5jbHVkZXN9IiDgrpAg4K6J4K6z4K+N4K6z4K6f4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6aS5mb3JtYXQ9PT0icmVnZXgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAke2kucGF0dGVybn0g4K6u4K+B4K6x4K+I4K6q4K6+4K6f4K+N4K6f4K+B4K6f4K6p4K+NIOCuquCviuCusOCvgeCuqOCvjeCupCDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrqTgrrXgrrHgrr7grqkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOCupOCuteCuseCuvuCuqSDgro7grqPgr406ICR7ZS5kaXZpc29yfSDgrofgrqngr40g4K6q4K6y4K6u4K6+4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDgroXgrp/gr4jgrq/grr7grrPgrq7gr40g4K6k4K+G4K6w4K6/4K6v4K6+4K6kIOCuteCuv+CumuCviCR7ZS5rZXlzLmxlbmd0aD4xPyLgrpXgrrPgr40iOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuteCuv+CumuCviGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuruCupOCuv+CuquCvjeCuquCvgWA7ZGVmYXVsdDpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSJ9fX07ZnVuY3Rpb24gbGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6dWcoKX19Y29uc3QgZGc9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuC4leC4seC4p+C4reC4seC4geC4qeC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In0sZmlsZTp7dW5pdDoi4LmE4Lia4LiV4LmMIix2ZXJiOiLguITguKfguKPguKHguLUifSxhcnJheTp7dW5pdDoi4Lij4Liy4Lii4LiB4Liy4LijIix2ZXJiOiLguITguKfguKPguKHguLUifSxzZXQ6e3VuaXQ6IuC4o+C4suC4ouC4geC4suC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuC4guC5ieC4reC4oeC4ueC4peC4l+C4teC5iOC4m+C5ieC4reC4mSIsZW1haWw6IuC4l+C4teC5iOC4reC4ouC4ueC5iOC4reC4teC5gOC4oeC4pSIsdXJsOiJVUkwiLGVtb2ppOiLguK3guLTguYLguKHguIjguLQiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuC4p+C4seC4meC4l+C4teC5iOC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGRhdGU6IuC4p+C4seC4meC4l+C4teC5iOC5geC4muC4miBJU08iLHRpbWU6IuC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGR1cmF0aW9uOiLguIrguYjguKfguIfguYDguKfguKXguLLguYHguJrguJogSVNPIixpcHY0OiLguJfguLXguYjguK3guKLguLnguYggSVB2NCIsaXB2Njoi4LiX4Li14LmI4Lit4Lii4Li54LmIIElQdjYiLGNpZHJ2NDoi4LiK4LmI4Lin4LiHIElQIOC5geC4muC4miBJUHY0IixjaWRydjY6IuC4iuC5iOC4p+C4hyBJUCDguYHguJrguJogSVB2NiIsYmFzZTY0OiLguILguYnguK3guITguKfguLLguKHguYHguJrguJogQmFzZTY0IixiYXNlNjR1cmw6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBCYXNlNjQg4Liq4Liz4Lir4Lij4Lix4LiaIFVSTCIsanNvbl9zdHJpbmc6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBKU09OIixlMTY0OiLguYDguJrguK3guKPguYzguYLguJfguKPguKjguLHguJ7guJfguYzguKPguLDguKvguKfguYjguLLguIfguJvguKPguLDguYDguJfguKggKEUuMTY0KSIsand0OiLguYLguJfguYDguITguJkgSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLguILguYnguK3guKHguLnguKXguJfguLXguYjguJvguYnguK3guJkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLguJXguLHguKfguYDguKXguIIiLGFycmF5OiLguK3guLLguKPguYzguYDguKPguKLguYwgKEFycmF5KSIsbnVsbDoi4LmE4Lih4LmI4Lih4Li14LiE4LmI4LiyIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g4LmB4LiV4LmI4LmE4LiU4LmJ4Lij4Lix4LiaICR7c31gOmDguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke2l9IOC5geC4leC5iOC5hOC4lOC5ieC4o+C4seC4miAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DguITguYjguLLguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke1MoZS52YWx1ZXNbMF0pfWA6YOC4leC4seC4p+C5gOC4peC4t+C4reC4geC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiE4Lin4Lij4LmA4Lib4LmH4LiZ4Lir4LiZ4Li24LmI4LiH4LmD4LiZICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i4LmE4Lih4LmI4LmA4LiB4Li04LiZIjoi4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4LiyIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4Lij4Liy4Lii4LiB4Liy4LijIn1gOmDguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuC4reC4ouC5iOC4suC4h+C4meC5ieC4reC4oiI6IuC4oeC4suC4geC4geC4p+C5iOC4siIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4Liy4LiB4Liz4Lir4LiZ4LiUOiAke2Uub3JpZ2lufSDguITguKfguKPguKHguLUke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4geC4s+C4q+C4meC4lDogJHtlLm9yaWdpbn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4guC4tuC5ieC4meC4leC5ieC4meC4lOC5ieC4p+C4oiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4peC4h+C4l+C5ieC4suC4ouC4lOC5ieC4p+C4oiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOC4o+C4ueC4m+C5geC4muC4muC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4Lih4Li1ICIke2kuaW5jbHVkZXN9IiDguK3guKLguLnguYjguYPguJnguILguYnguK3guITguKfguLLguKFgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguJXguKPguIfguIHguLHguJrguKPguLnguJvguYHguJrguJrguJfguLXguYjguIHguLPguKvguJnguJQgJHtpLnBhdHRlcm59YDpg4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g4LiV4Lix4Lin4LmA4Lil4LiC4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguYDguJvguYfguJnguIjguLPguJnguKfguJnguJfguLXguYjguKvguLLguKPguJTguYnguKfguKIgJHtlLmRpdmlzb3J9IOC5hOC4lOC5ieC4peC4h+C4leC4seC4p2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOC4nuC4muC4hOC4teC4ouC5jOC4l+C4teC5iOC5hOC4oeC5iOC4o+C4ueC5ieC4iOC4seC4gTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDguITguLXguKLguYzguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguYPguJkgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LmE4Lih4LmI4LiV4Lij4LiH4LiB4Lix4Lia4Lij4Li54Lib4LmB4Lia4Lia4Lii4Li54LmA4LiZ4Li14Lii4LiZ4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiU4LmE4Lin4LmJIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4h+C5g+C4mSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4LiC4LmJ4Lit4Lih4Li54Lil4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHIn19fTtmdW5jdGlvbiBtZygpe3JldHVybntsb2NhbGVFcnJvcjpkZygpfX1jb25zdCBwZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6Im9sbWFsxLEifSxmaWxlOnt1bml0OiJiYXl0Iix2ZXJiOiJvbG1hbMSxIn0sYXJyYXk6e3VuaXQ6IsO2xJ9lIix2ZXJiOiJvbG1hbMSxIn0sc2V0Ont1bml0OiLDtsSfZSIsdmVyYjoib2xtYWzEsSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJnaXJkaSIsZW1haWw6ImUtcG9zdGEgYWRyZXNpIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gdGFyaWggdmUgc2FhdCIsZGF0ZToiSVNPIHRhcmloIix0aW1lOiJJU08gc2FhdCIsZHVyYXRpb246IklTTyBzw7xyZSIsaXB2NDoiSVB2NCBhZHJlc2kiLGlwdjY6IklQdjYgYWRyZXNpIixjaWRydjQ6IklQdjQgYXJhbMSxxJ/EsSIsY2lkcnY2OiJJUHY2IGFyYWzEscSfxLEiLGJhc2U2NDoiYmFzZTY0IGlsZSDFn2lmcmVsZW5tacWfIG1ldGluIixiYXNlNjR1cmw6ImJhc2U2NHVybCBpbGUgxZ9pZnJlbGVubWnFnyBtZXRpbiIsanNvbl9zdHJpbmc6IkpTT04gZGl6ZXNpIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IsWeYWJsb24gZGl6ZXNpIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gR2XDp2Vyc2l6IGRlxJ9lcjogYmVrbGVuZW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBhbMSxbmFuICR7c31gOmBHZcOnZXJzaXogZGXEn2VyOiBiZWtsZW5lbiAke2l9LCBhbMSxbmFuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEdlw6dlcnNpeiBkZcSfZXI6IGJla2xlbmVuICR7UyhlLnZhbHVlc1swXSl9YDpgR2XDp2Vyc2l6IHNlw6dlbmVrOiBhxZ9hxJ/EsWRha2lsZXJkZW4gYmlyaSBvbG1hbMSxOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dvayBiw7x5w7xrOiBiZWtsZW5lbiAke2Uub3JpZ2luPz8iZGXEn2VyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iw7bEn2UifWA6YMOHb2sgYsO8ecO8azogYmVrbGVuZW4gJHtlLm9yaWdpbj8/ImRlxJ9lciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb2sga8O8w6fDvGs6IGJla2xlbmVuICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDDh29rIGvDvMOnw7xrOiBiZWtsZW5lbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnN1ZmZpeH0iIGlsZSBiaXRtZWxpYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEdlw6dlcnNpeiBtZXRpbjogIiR7aS5pbmNsdWRlc30iIGnDp2VybWVsaWA6aS5mb3JtYXQ9PT0icmVnZXgiP2BHZcOnZXJzaXogbWV0aW46ICR7aS5wYXR0ZXJufSBkZXNlbmluZSB1eW1hbMSxYDpgR2XDp2Vyc2l6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBHZcOnZXJzaXogc2F5xLE6ICR7ZS5kaXZpc29yfSBpbGUgdGFtIGLDtmzDvG5lYmlsbWVsaWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFRhbsSxbm1heWFuIGFuYWh0YXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gacOnaW5kZSBnZcOnZXJzaXogYW5haHRhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2XDp2Vyc2l6IGRlxJ9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbmRlIGdlw6dlcnNpeiBkZcSfZXJgO2RlZmF1bHQ6cmV0dXJuIkdlw6dlcnNpeiBkZcSfZXIifX19O2Z1bmN0aW9uIGZnKCl7cmV0dXJue2xvY2FsZUVycm9yOnBnKCl9fWNvbnN0IGdnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLRgdC40LzQstC+0LvRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifSxmaWxlOnt1bml0OiLQsdCw0LnRgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LHNldDp7dW5pdDoi0LXQu9C10LzQtdC90YLRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIixlbWFpbDoi0LDQtNGA0LXRgdCwINC10LvQtdC60YLRgNC+0L3QvdC+0Zcg0L/QvtGI0YLQuCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7QtNC30ZYiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItC00LDRgtCwINGC0LAg0YfQsNGBIElTTyIsZGF0ZToi0LTQsNGC0LAgSVNPIix0aW1lOiLRh9Cw0YEgSVNPIixkdXJhdGlvbjoi0YLRgNC40LLQsNC70ZbRgdGC0YwgSVNPIixpcHY0OiLQsNC00YDQtdGB0LAgSVB2NCIsaXB2Njoi0LDQtNGA0LXRgdCwIElQdjYiLGNpZHJ2NDoi0LTRltCw0L/QsNC30L7QvSBJUHY0IixjaWRydjY6ItC00ZbQsNC/0LDQt9C+0L0gSVB2NiIsYmFzZTY0OiLRgNGP0LTQvtC6INGDINC60L7QtNGD0LLQsNC90L3RliBiYXNlNjQiLGJhc2U2NHVybDoi0YDRj9C00L7QuiDRgyDQutC+0LTRg9Cy0LDQvdC90ZYgYmFzZTY0dXJsIixqc29uX3N0cmluZzoi0YDRj9C00L7QuiBKU09OIixlMTY0OiLQvdC+0LzQtdGAIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi0YfQuNGB0LvQviIsYXJyYXk6ItC80LDRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L7RgtGA0LjQvNCw0L3QviAke3N9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7aX0sINC+0YLRgNC40LzQsNC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QsCDQvtC/0YbRltGPOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyDQvtC00L3QtSDQtyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0JfQsNC90LDQtNGC0L4g0LLQtdC70LjQutC1OiDQvtGH0ZbQutGD0ZTRgtGM0YHRjywg0YnQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90L3RjyJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtGW0LIifWA6YNCX0LDQvdCw0LTRgtC+INCy0LXQu9C40LrQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC90Y8ifSDQsdGD0LTQtSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0g0LHRg9C00LUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQv9C+0YfQuNC90LDRgtC40YHRjyDQtyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DQndC10L/RgNCw0LLQuNC70YzQvdC40Lkg0YDRj9C00L7Qujog0L/QvtCy0LjQvdC10L0g0LfQsNC60ZbQvdGH0YPQstCw0YLQuNGB0Y8g0L3QsCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQvNGW0YHRgtC40YLQuCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INGA0Y/QtNC+0Lo6INC/0L7QstC40L3QtdC9INCy0ZbQtNC/0L7QstGW0LTQsNGC0Lgg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INGH0LjRgdC70L46INC/0L7QstC40L3QvdC+INCx0YPRgtC4INC60YDQsNGC0L3QuNC8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNC+0LfQv9GW0LfQvdCw0L3QuNC5INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItGWIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INC60LvRjtGHINGDICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLQndC10L/RgNCw0LLQuNC70YzQvdGWINCy0YXRltC00L3RliDQtNCw0L3RliI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INC30L3QsNGH0LXQvdC90Y8g0YMgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWIn19fTtmdW5jdGlvbiBUbCgpe3JldHVybntsb2NhbGVFcnJvcjpnZygpfX1mdW5jdGlvbiB2Zygpe3JldHVybiBUbCgpfWNvbnN0IGhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLYrdix2YjZgSIsdmVyYjoi24HZiNmG2KcifSxmaWxlOnt1bml0OiLYqNin2KbZudizIix2ZXJiOiLbgdmI2YbYpyJ9LGFycmF5Ont1bml0OiLYotim2bnZhdiyIix2ZXJiOiLbgdmI2YbYpyJ9LHNldDp7dW5pdDoi2KLYptm52YXYsiIsdmVyYjoi24HZiNmG2KcifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2KfZhiDZvtm5IixlbWFpbDoi2KfbjCDZhduM2YQg2KfbjNqI2LHbjNizIix1cmw6ItuM2Ygg2KLYsSDYp9uM2YQiLGVtb2ppOiLYp9uM2YXZiNis24wiLHV1aWQ6ItuM2Ygg24zZiCDYotim24wg2ojbjCIsdXVpZHY0OiLbjNmIINuM2Ygg2KLYptuMINqI24wg2YjbjCA0Iix1dWlkdjY6ItuM2Ygg24zZiCDYotim24wg2ojbjCDZiNuMIDYiLG5hbm9pZDoi2YbbjNmG2Ygg2KLYptuMINqI24wiLGd1aWQ6Itis24wg24zZiCDYotim24wg2ojbjCIsY3VpZDoi2LPbjCDbjNmIINii2KbbjCDaiNuMIixjdWlkMjoi2LPbjCDbjNmIINii2KbbjCDaiNuMIDIiLHVsaWQ6ItuM2Ygg2KfbjNmEINii2KbbjCDaiNuMIix4aWQ6Itin24zaqdizINii2KbbjCDaiNuMIixrc3VpZDoi2qnbkiDYp9uM2LMg24zZiCDYotim24wg2ojbjCIsZGF0ZXRpbWU6Itii2KbbjCDYp9uM2LMg2KfZiCDaiNuM2bkg2bnYp9im2YUiLGRhdGU6Itii2KbbjCDYp9uM2LMg2KfZiCDYqtin2LHbjNiuIix0aW1lOiLYotim24wg2KfbjNizINin2Ygg2YjZgtiqIixkdXJhdGlvbjoi2KLYptuMINin24zYsyDYp9mIINmF2K/YqiIsaXB2NDoi2KLYptuMINm+24wg2YjbjCA0INin24zaiNix24zYsyIsaXB2Njoi2KLYptuMINm+24wg2YjbjCA2INin24zaiNix24zYsyIsY2lkcnY0OiLYotim24wg2b7bjCDZiNuMIDQg2LHbjNmG2KwiLGNpZHJ2Njoi2KLYptuMINm+24wg2YjbjCA2INix24zZhtisIixiYXNlNjQ6Itio24zYsyA2NCDYp9mGINqp2YjaiNqIINiz2bnYsdmG2q8iLGJhc2U2NHVybDoi2KjbjNizIDY0INuM2Ygg2KLYsSDYp9uM2YQg2KfZhiDaqdmI2ojaiCDYs9m52LHZhtqvIixqc29uX3N0cmluZzoi2KzbkiDYp9uM2LMg2KfZiCDYp9uM2YYg2LPZudix2YbaryIsZTE2NDoi2KfbjCAxNjQg2YbZhdio2LEiLGp3dDoi2KzbkiDaiNio2YTbjNmIINm524wiLHRlbXBsYXRlX2xpdGVyYWw6Itin2YYg2b7ZuSJ9LG89e25hbjoiTmFOIixudW1iZXI6ItmG2YXYqNixIixhcnJheToi2KLYsduSIixudWxsOiLZhtmEIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNi62YTYtyDYp9mGINm+2bk6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDZhdiq2YjZgti5INiq2r7Yp9iMICR7c30g2YXZiNi12YjZhCDbgdmI2KdgOmDYutmE2Lcg2KfZhiDZvtm5OiAke2l9INmF2KrZiNmC2Lkg2Kravtin2IwgJHtzfSDZhdmI2LXZiNmEINuB2YjYp2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2LrZhNi3INin2YYg2b7ZuTogJHtTKGUudmFsdWVzWzBdKX0g2YXYqtmI2YLYuSDYqtq+2KdgOmDYutmE2Lcg2KLZvti02YY6ICR7XyhlLnZhbHVlcywifCIpfSDZhduM2rog2LPbkiDYp9uM2qkg2YXYqtmI2YLYuSDYqtq+2KdgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2KjbgdiqINio2pHYpzogJHtlLm9yaWdpbj8/ItmI24zZhNuM2YgifSDaqduSICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYp9i12LEifSDbgdmI2YbbkiDZhdiq2YjZgti5INiq2r7bkmA6YNio24HYqiDYqNqR2Kc6ICR7ZS5vcmlnaW4/PyLZiNuM2YTbjNmIIn0g2qnYpyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g24HZiNmG2Kcg2YXYqtmI2YLYuSDYqtq+2KdgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYqNuB2Kog2obavtmI2bnYpzogJHtlLm9yaWdpbn0g2qnbkiAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INuB2YjZhtuSINmF2KrZiNmC2Lkg2KravtuSYDpg2KjbgdiqINqG2r7ZiNm52Kc6ICR7ZS5vcmlnaW59INqp2KcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9INuB2YjZhtinINmF2KrZiNmC2Lkg2KravtinYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNi62YTYtyDYs9m52LHZhtqvOiAiJHtpLnByZWZpeH0iINiz25Ig2LTYsdmI2Lkg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g2LrZhNi3INiz2bnYsdmG2q86ICIke2kuc3VmZml4fSIg2b7YsSDYrtiq2YUg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DYutmE2Lcg2LPZudix2YbarzogIiR7aS5pbmNsdWRlc30iINi02KfZhdmEINuB2YjZhtinINqG2KfbgduM25JgOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LrZhNi3INiz2bnYsdmG2q86INm+24zZudix2YYgJHtpLnBhdHRlcm59INiz25Ig2YXbjNqGINuB2YjZhtinINqG2KfbgduM25JgOmDYutmE2LcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNi62YTYtyDZhtmF2KjYsTogJHtlLmRpdmlzb3J9INqp2Kcg2YXYttin2LnZgSDbgdmI2YbYpyDahtin24HbjNuSYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2LrbjNixINiq2LPZhNuM2YUg2LTYr9uBINqp24wke2Uua2V5cy5sZW5ndGg+MT8i2LIiOiIifTogJHtfKGUua2V5cywi2IwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g2YXbjNq6INi62YTYtyDaqduMYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLYutmE2Lcg2KfZhiDZvtm5IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW59INmF24zauiDYutmE2Lcg2YjbjNmE24zZiGA7ZGVmYXVsdDpyZXR1cm4i2LrZhNi3INin2YYg2b7ZuSJ9fX07ZnVuY3Rpb24gJGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6aGcoKX19Y29uc3QgX2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImJlbGdpIix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sZmlsZTp7dW5pdDoiYmF5dCIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LGFycmF5Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sbWFwOnt1bml0OiJ5b3p1diIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJraXJpc2giLGVtYWlsOiJlbGVrdHJvbiBwb2NodGEgbWFuemlsaSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIHNhbmEgdmEgdmFxdGkiLGRhdGU6IklTTyBzYW5hIix0aW1lOiJJU08gdmFxdCIsZHVyYXRpb246IklTTyBkYXZvbWl5bGlrIixpcHY0OiJJUHY0IG1hbnppbCIsaXB2NjoiSVB2NiBtYW56aWwiLG1hYzoiTUFDIG1hbnppbCIsY2lkcnY0OiJJUHY0IGRpYXBhem9uIixjaWRydjY6IklQdjYgZGlhcGF6b24iLGJhc2U2NDoiYmFzZTY0IGtvZGxhbmdhbiBzYXRyIixiYXNlNjR1cmw6ImJhc2U2NHVybCBrb2RsYW5nYW4gc2F0ciIsanNvbl9zdHJpbmc6IkpTT04gc2F0ciIsZTE2NDoiRS4xNjQgcmFxYW0iLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJraXJpc2gifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJyYXFhbSIsYXJyYXk6Im1hc3NpdiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOb3Rv4oCYZ+KAmHJpIGtpcmlzaDoga3V0aWxnYW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBxYWJ1bCBxaWxpbmdhbiAke3N9YDpgTm90b+KAmGfigJhyaSBraXJpc2g6IGt1dGlsZ2FuICR7aX0sIHFhYnVsIHFpbGluZ2FuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5vdG/igJhn4oCYcmkga2lyaXNoOiBrdXRpbGdhbiAke1MoZS52YWx1ZXNbMF0pfWA6YE5vdG/igJhn4oCYcmkgdmFyaWFudDogcXV5aWRhZ2lsYXJkYW4gYmlyaSBrdXRpbGdhbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdH0gJHthLnZlcmJ9YDpgSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTm90b+KAmGfigJhyaSBzYXRyOiAiJHtpLnByZWZpeH0iIGJpbGFuIGJvc2hsYW5pc2hpIGtlcmFrYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuc3VmZml4fSIgYmlsYW4gdHVnYXNoaSBrZXJha2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuaW5jbHVkZXN9IiBuaSBv4oCYeiBpY2hpZ2Egb2xpc2hpIGtlcmFrYDppLmZvcm1hdD09PSJyZWdleCI/YE5vdG/igJhn4oCYcmkgc2F0cjogJHtpLnBhdHRlcm59IHNoYWJsb25pZ2EgbW9zIGtlbGlzaGkga2VyYWtgOmBOb3Rv4oCYZ+KAmHJpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb3Rv4oCYZ+KAmHJpIHJhcWFtOiAke2UuZGl2aXNvcn0gbmluZyBrYXJyYWxpc2kgYm/igJhsaXNoaSBrZXJha2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5vbWHigJlsdW0ga2FsaXQke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGFnaSBrYWxpdCBub3Rv4oCYZ+KAmHJpYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOb3Rv4oCYZ+KAmHJpIGtpcmlzaCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYSBub3Rv4oCYZ+KAmHJpIHFpeW1hdGA7ZGVmYXVsdDpyZXR1cm4iTm90b+KAmGfigJhyaSBraXJpc2gifX19O2Z1bmN0aW9uIGJnKCl7cmV0dXJue2xvY2FsZUVycm9yOl9nKCl9fWNvbnN0IHlnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrw70gdOG7sSIsdmVyYjoiY8OzIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiY8OzIn0sYXJyYXk6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifSxzZXQ6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoixJHhuqd1IHbDoG8iLGVtYWlsOiLEkeG7i2EgY2jhu4kgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Im5nw6B5IGdp4budIElTTyIsZGF0ZToibmfDoHkgSVNPIix0aW1lOiJnaeG7nSBJU08iLGR1cmF0aW9uOiJraG/huqNuZyB0aOG7nWkgZ2lhbiBJU08iLGlwdjQ6IsSR4buLYSBjaOG7iSBJUHY0IixpcHY2OiLEkeG7i2EgY2jhu4kgSVB2NiIsY2lkcnY0OiJk4bqjaSBJUHY0IixjaWRydjY6ImThuqNpIElQdjYiLGJhc2U2NDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjQiLGJhc2U2NHVybDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjaHXhu5dpIEpTT04iLGUxNjQ6InPhu5EgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEkeG6p3UgdsOgbyJ9LG89e25hbjoiTmFOIixudW1iZXI6InPhu5EiLGFycmF5OiJt4bqjbmcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gxJDhuqd1IHbDoG8ga2jDtG5nIGjhu6NwIGzhu4c6IG1vbmcgxJHhu6NpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gOmDEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hzogbW9uZyDEkeG7o2kgJHtpfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YMSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSAke1MoZS52YWx1ZXNbMF0pfWA6YFTDuXkgY2jhu41uIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSBt4buZdCB0cm9uZyBjw6FjIGdpw6EgdHLhu4sgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6EgbOG7m246IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW4/PyJnacOhIHRy4buLIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBo4bqnbiB04butIn1gOmBRdcOhIGzhu5tuOiBtb25nIMSR4bujaSAke2Uub3JpZ2luPz8iZ2nDoSB0cuG7iyJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6Egbmjhu486IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgUXXDoSBuaOG7jzogbW9uZyDEkeG7o2kgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBi4bqvdCDEkeG6p3UgYuG6sW5nICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBr4bq/dCB0aMO6YyBi4bqxbmcgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgYmFvIGfhu5NtICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kga2jhu5twIHbhu5tpIG3huqt1ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBraMO0bmcgaOG7o3AgbOG7h2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBT4buRIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgbMOgIGLhu5lpIHPhu5EgY+G7p2EgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS2jDs2Ega2jDtG5nIMSRxrDhu6NjIG5o4bqtbiBk4bqhbmc6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS2jDs2Ega2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEdpw6EgdHLhu4sga2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIn19fTtmdW5jdGlvbiBrZygpe3JldHVybntsb2NhbGVFcnJvcjp5ZygpfX1jb25zdCBTZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi5a2X56ymIix2ZXJiOiLljIXlkKsifSxmaWxlOnt1bml0OiLlrZfoioIiLHZlcmI6IuWMheWQqyJ9LGFycmF5Ont1bml0OiLpobkiLHZlcmI6IuWMheWQqyJ9LHNldDp7dW5pdDoi6aG5Iix2ZXJiOiLljIXlkKsifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi6L6T5YWlIixlbWFpbDoi55S15a2Q6YKu5Lu2Iix1cmw6IlVSTCIsZW1vamk6IuihqOaDheespuWPtyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNP5pel5pyf5pe26Ze0IixkYXRlOiJJU0/ml6XmnJ8iLHRpbWU6IklTT+aXtumXtCIsZHVyYXRpb246IklTT+aXtumVvyIsaXB2NDoiSVB2NOWcsOWdgCIsaXB2NjoiSVB2NuWcsOWdgCIsY2lkcnY0OiJJUHY0572R5q61IixjaWRydjY6IklQdjbnvZHmrrUiLGJhc2U2NDoiYmFzZTY057yW56CB5a2X56ym5LiyIixiYXNlNjR1cmw6ImJhc2U2NHVybOe8lueggeWtl+espuS4siIsanNvbl9zdHJpbmc6IkpTT07lrZfnrKbkuLIiLGUxNjQ6IkUuMTY05Y+356CBIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi6L6T5YWlIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi5pWw5a2XIixhcnJheToi5pWw57uEIixudWxsOiLnqbrlgLwobnVsbCkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g5peg5pWI6L6T5YWl77ya5pyf5pybIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfe+8jOWunumZheaOpeaUtiAke3N9YDpg5peg5pWI6L6T5YWl77ya5pyf5pybICR7aX3vvIzlrp7pmYXmjqXmlLYgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g5peg5pWI6L6T5YWl77ya5pyf5pybICR7UyhlLnZhbHVlc1swXSl9YDpg5peg5pWI6YCJ6aG577ya5pyf5pyb5Lul5LiL5LmL5LiAICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flpKfvvJrmnJ/mnJsgJHtlLm9yaWdpbj8/IuWAvCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuS4quWFg+e0oCJ9YDpg5pWw5YC86L+H5aSn77ya5pyf5pybICR7ZS5vcmlnaW4/PyLlgLwifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flsI/vvJrmnJ/mnJsgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOaVsOWAvOi/h+Wwj++8muacn+acmyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75LulICIke2kucHJlZml4fSIg5byA5aS0YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvku6UgIiR7aS5zdWZmaXh9IiDnu5PlsL5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75YyF5ZCrICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvmu6HotrPmraPliJnooajovr7lvI8gJHtpLnBhdHRlcm59YDpg5peg5pWIJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOaXoOaViOaVsOWtl++8muW/hemhu+aYryAke2UuZGl2aXNvcn0g55qE5YCN5pWwYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g5Ye6546w5pyq55+l55qE6ZSuKGtleSk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit55qE6ZSuKGtleSnml6DmlYhgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuaXoOaViOi+k+WFpSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDkuK3ljIXlkKvml6DmlYjlgLwodmFsdWUpYDtkZWZhdWx0OnJldHVybiLml6DmlYjovpPlhaUifX19O2Z1bmN0aW9uIHdnKCl7cmV0dXJue2xvY2FsZUVycm9yOlNnKCl9fWNvbnN0IElnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLlrZflhYMiLHZlcmI6IuaTgeaciSJ9LGZpbGU6e3VuaXQ6IuS9jeWFg+e1hCIsdmVyYjoi5pOB5pyJIn0sYXJyYXk6e3VuaXQ6IumgheebriIsdmVyYjoi5pOB5pyJIn0sc2V0Ont1bml0OiLpoIXnm64iLHZlcmI6IuaTgeaciSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLovLjlhaUiLGVtYWlsOiLpg7Xku7blnLDlnYAiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDml6XmnJ/mmYLplpMiLGRhdGU6IklTTyDml6XmnJ8iLHRpbWU6IklTTyDmmYLplpMiLGR1cmF0aW9uOiJJU08g5pyf6ZaTIixpcHY0OiJJUHY0IOS9jeWdgCIsaXB2NjoiSVB2NiDkvY3lnYAiLGNpZHJ2NDoiSVB2NCDnr4TlnI0iLGNpZHJ2NjoiSVB2NiDnr4TlnI0iLGJhc2U2NDoiYmFzZTY0IOe3qOeivOWtl+S4siIsYmFzZTY0dXJsOiJiYXNlNjR1cmwg57eo56K85a2X5LiyIixqc29uX3N0cmluZzoiSlNPTiDlrZfkuLIiLGUxNjQ6IkUuMTY0IOaVuOWAvCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Iui8uOWFpSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH3vvIzkvYbmlLbliLAgJHtzfWA6YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke2l977yM5L2G5pS25YiwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke1MoZS52YWx1ZXNbMF0pfWA6YOeEoeaViOeahOmBuOmghe+8mumgkOacn+eCuuS7peS4i+WFtuS4reS5i+S4gCAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pW45YC86YGO5aSn77ya6aCQ5pyfICR7ZS5vcmlnaW4/PyLlgLwifSDmh4nngrogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i5YCL5YWD57SgIn1gOmDmlbjlgLzpgY7lpKfvvJrpoJDmnJ8gJHtlLm9yaWdpbj8/IuWAvCJ9IOaHieeCuiAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjku6UgIiR7aS5wcmVmaXh9IiDplovpoK1gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOS7pSAiJHtpLnN1ZmZpeH0iIOe1kOWwvmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjljIXlkKsgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOespuWQiOagvOW8jyAke2kucGF0dGVybn1gOmDnhKHmlYjnmoQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeaViOeahOaVuOWtl++8muW/hemgiOeCuiAke2UuZGl2aXNvcn0g55qE5YCN5pW4YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g54Sh5rOV6K2Y5Yil55qE6Y215YC8JHtlLmtleXMubGVuZ3RoPjE/IuWAkSI6IiJ977yaJHtfKGUua2V5cywi44CBIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE6Y215YC8YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE5YC8YDtkZWZhdWx0OnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwifX19O2Z1bmN0aW9uIHpnKCl7cmV0dXJue2xvY2FsZUVycm9yOklnKCl9fWNvbnN0IHhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLDoG1pIix2ZXJiOiJuw60ifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoibsOtIn0sYXJyYXk6e3VuaXQ6Im5rYW4iLHZlcmI6Im7DrSJ9LHNldDp7dW5pdDoibmthbiIsdmVyYjoibsOtIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuG6ucyAcuG7jSDDrGLDoXfhu41sw6kiLGVtYWlsOiLDoGTDrXLhurnMgXPDrCDDrG3hurnMgWzDrCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiw6Brw7Nrw7IgSVNPIixkYXRlOiLhu41q4buNzIEgSVNPIix0aW1lOiLDoGvDs2vDsiBJU08iLGR1cmF0aW9uOiLDoGvDs2vDsiB0w7MgcMOpIElTTyIsaXB2NDoiw6Bkw61y4bq5zIFzw6wgSVB2NCIsaXB2Njoiw6Bkw61y4bq5zIFzw6wgSVB2NiIsY2lkcnY0OiLDoGdiw6hnYsOoIElQdjQiLGNpZHJ2Njoiw6BnYsOoZ2LDqCBJUHY2IixiYXNlNjQ6IuG7jcyAcuG7jcyAIHTDrSBhIGvhu43MgSBuw60gYmFzZTY0IixiYXNlNjR1cmw6IuG7jcyAcuG7jcyAIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuG7jcyAcuG7jcyAIEpTT04iLGUxNjQ6Im7hu43MgW1iw6AgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhurnMgHLhu40gw6xiw6F34buNbMOpIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibuG7jcyBbWLDoCIsYXJyYXk6ImFrb3Dhu40ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gw4xiw6F34buNbMOpIGHhuaPDrOG5o2U6IGEgbsOtIGzDoXRpIGZpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgw6Bt4buNzIAgYSByw60gJHtzfWA6YMOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlOiBhIG7DrSBsw6F0aSBmaSAke2l9LCDDoG3hu43MgCBhIHLDrSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDjGLDoXfhu41sw6kgYeG5o8Os4bmjZTogYSBuw60gbMOhdGkgZmkgJHtTKGUudmFsdWVzWzBdKX1gOmDDgOG5o8OgecOgbiBh4bmjw6zhuaNlOiB5YW4g4buNzIBrYW4gbMOhcmEgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDsyBw4buNzIAgasO5OiBhIG7DrSBsw6F0aSBq4bq5zIEgcMOpICR7ZS5vcmlnaW4/PyJpeWUifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtfSAke2EudW5pdH1gOmBUw7MgcOG7jcyAIGrDuTogYSBuw60gbMOhdGkgauG6ucyBICR7aX0ke2UubWF4aW11bX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BLw6lyw6kganU6IGEgbsOtIGzDoXRpIGrhurnMgSBww6kgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bX0gJHthLnVuaXR9YDpgS8OpcsOpIGp1OiBhIG7DrSBsw6F0aSBq4bq5zIEgJHtpfSR7ZS5taW5pbXVtfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGLhurnMgHLhurnMgCBw4bq5zIBsw7ogIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBwYXLDrSBw4bq5zIBsw7ogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIG7DrSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBiw6Egw6Bw4bq54bq5cuG6uSBtdSAke2kucGF0dGVybn1gOmBB4bmjw6zhuaNlOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTuG7jcyBbWLDoCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGrhurnMgSDDqHnDoCBww61ww61uIHRpICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYELhu410w6xuw6wgw6DDrG3hu43MgDogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBC4buNdMOsbsOsIGHhuaPDrOG5o2UgbsOtbsO6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDjGLDoXfhu41sw6kgYeG5o8Os4bmjZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJeWUgYeG5o8Os4bmjZSBuw61uw7ogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlIn19fTtmdW5jdGlvbiBUZygpe3JldHVybntsb2NhbGVFcnJvcjp4ZygpfX1jb25zdCBKaT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYXI6Q3AsYXo6THAsYmU6cXAsYmc6SnAsY2E6V3AsY3M6VnAsZGE6R3AsZGU6WXAsZWw6ZWYsZW46emwsZW86cmYsZXM6YWYsZmE6Y2YsZmk6bGYsZnI6bWYsZnJDQTpmZixoZTp2ZixocjokZixodTpiZixoeTprZixpZDp3Zixpczp6ZixpdDpUZixqYTpPZixrYTpQZixraDpEZixrbTp4bCxrbzpaZixsdDpDZixtazpMZixtczpxZixubDpKZixubzpXZixvdGE6VmYscGw6WWYscHM6R2YscHQ6ZWcscm86bmcscnU6aWcsc2w6YWcsc3Y6Y2csdGE6bGcsdGg6bWcsdHI6ZmcsdWE6dmcsdWs6VGwsdXI6JGcsdXo6Ymcsdmk6a2cseW86VGcsemhDTjp3Zyx6aFRXOnpnfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO3ZhciBFcztjb25zdCBIaT1TeW1ib2woIlpvZE91dHB1dCIpLFdpPVN5bWJvbCgiWm9kSW5wdXQiKTtjbGFzcyBqbHtjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD1uZXcgV2Vha01hcCx0aGlzLl9pZG1hcD1uZXcgTWFwfWFkZChuLC4uLnIpe2NvbnN0IG89clswXTtyZXR1cm4gdGhpcy5fbWFwLnNldChuLG8pLG8mJnR5cGVvZiBvPT0ib2JqZWN0IiYmImlkImluIG8mJnRoaXMuX2lkbWFwLnNldChvLmlkLG4pLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5fbWFwPW5ldyBXZWFrTWFwLHRoaXMuX2lkbWFwPW5ldyBNYXAsdGhpc31yZW1vdmUobil7Y29uc3Qgcj10aGlzLl9tYXAuZ2V0KG4pO3JldHVybiByJiZ0eXBlb2Ygcj09Im9iamVjdCImJiJpZCJpbiByJiZ0aGlzLl9pZG1hcC5kZWxldGUoci5pZCksdGhpcy5fbWFwLmRlbGV0ZShuKSx0aGlzfWdldChuKXtjb25zdCByPW4uX3pvZC5wYXJlbnQ7aWYocil7Y29uc3Qgbz17Li4udGhpcy5nZXQocik/P3t9fTtkZWxldGUgby5pZDtjb25zdCBlPXsuLi5vLC4uLnRoaXMuX21hcC5nZXQobil9O3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg/ZTp2b2lkIDB9cmV0dXJuIHRoaXMuX21hcC5nZXQobil9aGFzKG4pe3JldHVybiB0aGlzLl9tYXAuaGFzKG4pfX1mdW5jdGlvbiB0cigpe3JldHVybiBuZXcgamx9KEVzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbFJlZ2lzdHJ5Pz8oRXMuX196b2RfZ2xvYmFsUmVnaXN0cnk9dHIoKSk7Y29uc3QgY2U9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxSZWdpc3RyeTtmdW5jdGlvbiBPbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIiwuLi5oKG4pfSl9ZnVuY3Rpb24gVWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsY29lcmNlOiEwLC4uLmgobil9KX1mdW5jdGlvbiBCaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImVtYWlsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIExuKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZ3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBWaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gS2kodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1dWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsdmVyc2lvbjoidjQiLC4uLmgobil9KX1mdW5jdGlvbiBHaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSx2ZXJzaW9uOiJ2NiIsLi4uaChuKX0pfWZ1bmN0aW9uIFhpKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXVpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLHZlcnNpb246InY3IiwuLi5oKG4pfSl9ZnVuY3Rpb24gbnIodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmwiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gWWkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJlbW9qaSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBRaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Im5hbm9pZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBlbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImN1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gdG8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJjdWlkMiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBubyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InVsaWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gcm8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ4aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gaW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJrc3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBvbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImlwdjQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gYW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJpcHY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIFBsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoibWFjIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHVvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGxvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0dXJsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIG1vKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZTE2NCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBwbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Imp3dCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1jb25zdCBmbz17QW55Om51bGwsTWludXRlOi0xLFNlY29uZDowLE1pbGxpc2Vjb25kOjMsTWljcm9zZWNvbmQ6Nn07ZnVuY3Rpb24gTmwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRldGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLG9mZnNldDohMSxsb2NhbDohMSxwcmVjaXNpb246bnVsbCwuLi5oKG4pfSl9ZnVuY3Rpb24gRGwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRlIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIEVsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLHByZWNpc2lvbjpudWxsLC4uLmgobil9KX1mdW5jdGlvbiBabCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImR1cmF0aW9uIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIFJsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQ2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY29lcmNlOiEwLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoic2FmZWludCIsLi4uaChuKX0pfWZ1bmN0aW9uIExsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrOiJudW1iZXJfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImZsb2F0MzIiLC4uLmgobil9KX1mdW5jdGlvbiBNbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJmbG9hdDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gcWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoiaW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJ1aW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBKbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYm9vbGVhbiIsLi4uaChuKX0pfWZ1bmN0aW9uIEhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJib29sZWFuIixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFdsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLC4uLmgobil9KX1mdW5jdGlvbiBCbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYmlnaW50Iixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFZsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLGNoZWNrOiJiaWdpbnRfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gS2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImJpZ2ludCIsY2hlY2s6ImJpZ2ludF9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoidWludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gR2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN5bWJvbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmRlZmluZWQiLC4uLmgobil9KX1mdW5jdGlvbiBZbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFFsKHQpe3JldHVybiBuZXcgdCh7dHlwZToiYW55In0pfWZ1bmN0aW9uIGVkKHQpe3JldHVybiBuZXcgdCh7dHlwZToidW5rbm93biJ9KX1mdW5jdGlvbiB0ZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibmV2ZXIiLC4uLmgobil9KX1mdW5jdGlvbiBuZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidm9pZCIsLi4uaChuKX0pfWZ1bmN0aW9uIHJkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJkYXRlIiwuLi5oKG4pfSl9ZnVuY3Rpb24gaWQodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImRhdGUiLGNvZXJjZTohMCwuLi5oKG4pfSl9ZnVuY3Rpb24gb2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im5hbiIsLi4uaChuKX0pfWZ1bmN0aW9uIHllKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIHVlKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIGtlKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIGllKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIHJyKHQpe3JldHVybiBrZSgwLHQpfWZ1bmN0aW9uIGlyKHQpe3JldHVybiB5ZSgwLHQpfWZ1bmN0aW9uIG9yKHQpe3JldHVybiB1ZSgwLHQpfWZ1bmN0aW9uIGFyKHQpe3JldHVybiBpZSgwLHQpfWZ1bmN0aW9uIEVlKHQsbil7cmV0dXJuIG5ldyBCYyh7Y2hlY2s6Im11bHRpcGxlX29mIiwuLi5oKG4pLHZhbHVlOnR9KX1mdW5jdGlvbiBMZSh0LG4pe3JldHVybiBuZXcgR2Moe2NoZWNrOiJtYXhfc2l6ZSIsLi4uaChuKSxtYXhpbXVtOnR9KX1mdW5jdGlvbiBTZSh0LG4pe3JldHVybiBuZXcgWGMoe2NoZWNrOiJtaW5fc2l6ZSIsLi4uaChuKSxtaW5pbXVtOnR9KX1mdW5jdGlvbiBudCh0LG4pe3JldHVybiBuZXcgWWMoe2NoZWNrOiJzaXplX2VxdWFscyIsLi4uaChuKSxzaXplOnR9KX1mdW5jdGlvbiBydCh0LG4pe3JldHVybiBuZXcgUWMoe2NoZWNrOiJtYXhfbGVuZ3RoIiwuLi5oKG4pLG1heGltdW06dH0pfWZ1bmN0aW9uIHplKHQsbil7cmV0dXJuIG5ldyBldSh7Y2hlY2s6Im1pbl9sZW5ndGgiLC4uLmgobiksbWluaW11bTp0fSl9ZnVuY3Rpb24gaXQodCxuKXtyZXR1cm4gbmV3IHR1KHtjaGVjazoibGVuZ3RoX2VxdWFscyIsLi4uaChuKSxsZW5ndGg6dH0pfWZ1bmN0aW9uIFJ0KHQsbil7cmV0dXJuIG5ldyBudSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoicmVnZXgiLC4uLmgobikscGF0dGVybjp0fSl9ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIG5ldyBydSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoibG93ZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gQXQodCl7cmV0dXJuIG5ldyBpdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoidXBwZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gTHQodCxuKXtyZXR1cm4gbmV3IG91KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsLi4uaChuKSxpbmNsdWRlczp0fSl9ZnVuY3Rpb24gTXQodCxuKXtyZXR1cm4gbmV3IGF1KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJzdGFydHNfd2l0aCIsLi4uaChuKSxwcmVmaXg6dH0pfWZ1bmN0aW9uIHF0KHQsbil7cmV0dXJuIG5ldyBzdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoiZW5kc193aXRoIiwuLi5oKG4pLHN1ZmZpeDp0fSl9ZnVuY3Rpb24gc3IodCxuLHIpe3JldHVybiBuZXcgY3Uoe2NoZWNrOiJwcm9wZXJ0eSIscHJvcGVydHk6dCxzY2hlbWE6biwuLi5oKHIpfSl9ZnVuY3Rpb24gRnQodCxuKXtyZXR1cm4gbmV3IHV1KHtjaGVjazoibWltZV90eXBlIixtaW1lOnQsLi4uaChuKX0pfWZ1bmN0aW9uIF9lKHQpe3JldHVybiBuZXcgbHUoe2NoZWNrOiJvdmVyd3JpdGUiLHR4OnR9KX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gX2Uobj0+bi5ub3JtYWxpemUodCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIF9lKHQ9PnQudHJpbSgpKX1mdW5jdGlvbiBXdCgpe3JldHVybiBfZSh0PT50LnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIEJ0KCl7cmV0dXJuIF9lKHQ9PnQudG9VcHBlckNhc2UoKSl9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gX2UodD0+QnModCkpfWZ1bmN0aW9uIGFkKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImFycmF5IixlbGVtZW50Om4sLi4uaChyKX0pfWZ1bmN0aW9uIGpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4sLi4uaChyKX0pfWZ1bmN0aW9uIE9nKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4saW5jbHVzaXZlOiExLC4uLmgocil9KX1mdW5jdGlvbiBVZyh0LG4scixvKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnIsZGlzY3JpbWluYXRvcjpuLC4uLmgobyl9KX1mdW5jdGlvbiBQZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6bixyaWdodDpyfSl9ZnVuY3Rpb24gTmcodCxuLHIsbyl7Y29uc3QgZT1yIGluc3RhbmNlb2YgeCxpPWU/bzpyLGE9ZT9yOm51bGw7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0dXBsZSIsaXRlbXM6bixyZXN0OmEsLi4uaChpKX0pfWZ1bmN0aW9uIERnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToicmVjb3JkIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIEVnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToibWFwIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIFpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InNldCIsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIFJnKHQsbixyKXtjb25zdCBvPUFycmF5LmlzQXJyYXkobik/T2JqZWN0LmZyb21FbnRyaWVzKG4ubWFwKGU9PltlLGVdKSk6bjtyZXR1cm4gbmV3IHQoe3R5cGU6ImVudW0iLGVudHJpZXM6bywuLi5oKHIpfSl9ZnVuY3Rpb24gQ2codCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZW51bSIsZW50cmllczpuLC4uLmgocil9KX1mdW5jdGlvbiBBZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJsaXRlcmFsIix2YWx1ZXM6QXJyYXkuaXNBcnJheShuKT9uOltuXSwuLi5oKHIpfSl9ZnVuY3Rpb24gc2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImZpbGUiLC4uLmgobil9KX1mdW5jdGlvbiBMZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06bn0pfWZ1bmN0aW9uIE1nKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBxZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbGFibGUiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gRmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZGVmYXVsdCIsaW5uZXJUeXBlOm4sZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yKCk6Vm4ocil9fSl9ZnVuY3Rpb24gSmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiBIZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3VjY2VzcyIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBXZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJjYXRjaCIsaW5uZXJUeXBlOm4sY2F0Y2hWYWx1ZTp0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yOigpPT5yfSl9ZnVuY3Rpb24gQmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToicGlwZSIsaW46bixvdXQ6cn0pfWZ1bmN0aW9uIFZnKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBLZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0ZW1wbGF0ZV9saXRlcmFsIixwYXJ0czpuLC4uLmgocil9KX1mdW5jdGlvbiBHZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibGF6eSIsZ2V0dGVyOm59KX1mdW5jdGlvbiBYZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToicHJvbWlzZSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBjZCh0LG4scil7Y29uc3Qgbz1oKHIpO3JldHVybiBvLmFib3J0Pz8oby5hYm9ydD0hMCksbmV3IHQoe3R5cGU6ImN1c3RvbSIsY2hlY2s6ImN1c3RvbSIsZm46biwuLi5vfSl9ZnVuY3Rpb24gdWQodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiY3VzdG9tIixjaGVjazoiY3VzdG9tIixmbjpuLC4uLmgocil9KX1mdW5jdGlvbiBsZCh0LG4pe2NvbnN0IHI9ZGQobz0+KG8uYWRkSXNzdWU9ZT0+e2lmKHR5cGVvZiBlPT0ic3RyaW5nIilvLmlzc3Vlcy5wdXNoKFdlKGUsby52YWx1ZSxyLl96b2QuZGVmKSk7ZWxzZXtjb25zdCBpPWU7aS5mYXRhbCYmKGkuY29udGludWU9ITEpLGkuY29kZT8/KGkuY29kZT0iY3VzdG9tIiksaS5pbnB1dD8/KGkuaW5wdXQ9by52YWx1ZSksaS5pbnN0Pz8oaS5pbnN0PXIpLGkuY29udGludWU/PyhpLmNvbnRpbnVlPSFyLl96b2QuZGVmLmFib3J0KSxvLmlzc3Vlcy5wdXNoKFdlKGkpKX19LHQoby52YWx1ZSxvKSksbik7cmV0dXJuIHJ9ZnVuY3Rpb24gZGQodCxuKXtjb25zdCByPW5ldyBKKHtjaGVjazoiY3VzdG9tIiwuLi5oKG4pfSk7cmV0dXJuIHIuX3pvZC5jaGVjaz10LHJ9ZnVuY3Rpb24gbWQodCl7Y29uc3Qgbj1uZXcgSih7Y2hlY2s6ImRlc2NyaWJlIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sZGVzY3JpcHRpb246dH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIHBkKHQpe2NvbnN0IG49bmV3IEooe2NoZWNrOiJtZXRhIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sLi4udH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIGZkKHQsbil7Y29uc3Qgcj1oKG4pO2xldCBvPXIudHJ1dGh5Pz9bInRydWUiLCIxIiwieWVzIiwib24iLCJ5IiwiZW5hYmxlZCJdLGU9ci5mYWxzeT8/WyJmYWxzZSIsIjAiLCJubyIsIm9mZiIsIm4iLCJkaXNhYmxlZCJdO3IuY2FzZSE9PSJzZW5zaXRpdmUiJiYobz1vLm1hcCgkPT50eXBlb2YgJD09InN0cmluZyI/JC50b0xvd2VyQ2FzZSgpOiQpLGU9ZS5tYXAoJD0+dHlwZW9mICQ9PSJzdHJpbmciPyQudG9Mb3dlckNhc2UoKTokKSk7Y29uc3QgaT1uZXcgU2V0KG8pLGE9bmV3IFNldChlKSxzPXQuQ29kZWM/P0ZpLGM9dC5Cb29sZWFuPz9DaSx1PXQuU3RyaW5nPz9adCxsPW5ldyB1KHt0eXBlOiJzdHJpbmciLGVycm9yOnIuZXJyb3J9KSxnPW5ldyBjKHt0eXBlOiJib29sZWFuIixlcnJvcjpyLmVycm9yfSksdj1uZXcgcyh7dHlwZToicGlwZSIsaW46bCxvdXQ6Zyx0cmFuc2Zvcm06KCgkLHkpPT57bGV0IEg9JDtyZXR1cm4gci5jYXNlIT09InNlbnNpdGl2ZSImJihIPUgudG9Mb3dlckNhc2UoKSksaS5oYXMoSCk/ITA6YS5oYXMoSCk/ITE6KHkuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLGV4cGVjdGVkOiJzdHJpbmdib29sIix2YWx1ZXM6Wy4uLmksLi4uYV0saW5wdXQ6eS52YWx1ZSxpbnN0OnYsY29udGludWU6ITF9KSx7fSl9KSxyZXZlcnNlVHJhbnNmb3JtOigoJCx5KT0+JD09PSEwP29bMF18fCJ0cnVlIjplWzBdfHwiZmFsc2UiKSxlcnJvcjpyLmVycm9yfSk7cmV0dXJuIHZ9ZnVuY3Rpb24gS3QodCxuLHIsbz17fSl7Y29uc3QgZT1oKG8pLGk9ey4uLmgobyksY2hlY2s6InN0cmluZ19mb3JtYXQiLHR5cGU6InN0cmluZyIsZm9ybWF0Om4sZm46dHlwZW9mIHI9PSJmdW5jdGlvbiI/cjpzPT5yLnRlc3QocyksLi4uZX07cmV0dXJuIHIgaW5zdGFuY2VvZiBSZWdFeHAmJihpLnBhdHRlcm49ciksbmV3IHQoaSl9ZnVuY3Rpb24gVmUodCl7bGV0IG49dD8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cmV0dXJuIG49PT0iZHJhZnQtNCImJihuPSJkcmFmdC0wNCIpLG49PT0iZHJhZnQtNyImJihuPSJkcmFmdC0wNyIpLHtwcm9jZXNzb3JzOnQucHJvY2Vzc29ycz8/e30sbWV0YWRhdGFSZWdpc3RyeTp0Py5tZXRhZGF0YT8/Y2UsdGFyZ2V0Om4sdW5yZXByZXNlbnRhYmxlOnQ/LnVucmVwcmVzZW50YWJsZT8/InRocm93IixvdmVycmlkZTp0Py5vdmVycmlkZT8/KCgpPT57fSksaW86dD8uaW8/PyJvdXRwdXQiLGNvdW50ZXI6MCxzZWVuOm5ldyBNYXAsY3ljbGVzOnQ/LmN5Y2xlcz8/InJlZiIscmV1c2VkOnQ/LnJldXNlZD8/ImlubGluZSIsZXh0ZXJuYWw6dD8uZXh0ZXJuYWw/P3ZvaWQgMH19ZnVuY3Rpb24gQyh0LG4scj17cGF0aDpbXSxzY2hlbWFQYXRoOltdfSl7dmFyIG87Y29uc3QgZT10Ll96b2QuZGVmLGk9bi5zZWVuLmdldCh0KTtpZihpKXJldHVybiBpLmNvdW50Kyssci5zY2hlbWFQYXRoLmluY2x1ZGVzKHQpJiYoaS5jeWNsZT1yLnBhdGgpLGkuc2NoZW1hO2NvbnN0IGE9e3NjaGVtYTp7fSxjb3VudDoxLGN5Y2xlOnZvaWQgMCxwYXRoOnIucGF0aH07bi5zZWVuLnNldCh0LGEpO2NvbnN0IHM9dC5fem9kLnRvSlNPTlNjaGVtYT8uKCk7aWYocylhLnNjaGVtYT1zO2Vsc2V7Y29uc3QgbD17Li4ucixzY2hlbWFQYXRoOlsuLi5yLnNjaGVtYVBhdGgsdF0scGF0aDpyLnBhdGh9O2lmKHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSl0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEobixhLnNjaGVtYSxsKTtlbHNle2NvbnN0IHY9YS5zY2hlbWEsJD1uLnByb2Nlc3NvcnNbZS50eXBlXTtpZighJCl0aHJvdyBuZXcgRXJyb3IoYFt0b0pTT05TY2hlbWFdOiBOb24tcmVwcmVzZW50YWJsZSB0eXBlIGVuY291bnRlcmVkOiAke2UudHlwZX1gKTskKHQsbix2LGwpfWNvbnN0IGc9dC5fem9kLnBhcmVudDtnJiYoYS5yZWZ8fChhLnJlZj1nKSxDKGcsbixsKSxuLnNlZW4uZ2V0KGcpLmlzUGFyZW50PSEwKX1jb25zdCBjPW4ubWV0YWRhdGFSZWdpc3RyeS5nZXQodCk7cmV0dXJuIGMmJk9iamVjdC5hc3NpZ24oYS5zY2hlbWEsYyksbi5pbz09PSJpbnB1dCImJnJlKHQpJiYoZGVsZXRlIGEuc2NoZW1hLmV4YW1wbGVzLGRlbGV0ZSBhLnNjaGVtYS5kZWZhdWx0KSxuLmlvPT09ImlucHV0IiYmIl9wcmVmYXVsdCJpbiBhLnNjaGVtYSYmKChvPWEuc2NoZW1hKS5kZWZhdWx0Pz8oby5kZWZhdWx0PWEuc2NoZW1hLl9wcmVmYXVsdCkpLGRlbGV0ZSBhLnNjaGVtYS5fcHJlZmF1bHQsbi5zZWVuLmdldCh0KS5zY2hlbWF9ZnVuY3Rpb24gS2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkO2lmKHMpe2NvbnN0IGM9by5nZXQocyk7aWYoYyYmYyE9PWFbMF0pdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2NoZW1hIGlkICIke3N9IiBkZXRlY3RlZCBkdXJpbmcgSlNPTiBTY2hlbWEgY29udmVyc2lvbi4gVHdvIGRpZmZlcmVudCBzY2hlbWFzIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBpZCB3aGVuIGNvbnZlcnRlZCB0b2dldGhlci5gKTtvLnNldChzLGFbMF0pfX1jb25zdCBlPWE9Pntjb25zdCBzPXQudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjtpZih0LmV4dGVybmFsKXtjb25zdCBnPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KGFbMF0pPy5pZCx2PXQuZXh0ZXJuYWwudXJpPz8oeT0+eSk7aWYoZylyZXR1cm57cmVmOnYoZyl9O2NvbnN0ICQ9YVsxXS5kZWZJZD8/YVsxXS5zY2hlbWEuaWQ/P2BzY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJuIGFbMV0uZGVmSWQ9JCx7ZGVmSWQ6JCxyZWY6YCR7digiX19zaGFyZWQiKX0jLyR7c30vJHskfWB9fWlmKGFbMV09PT1yKXJldHVybntyZWY6IiMifTtjb25zdCB1PWAjLyR7c30vYCxsPWFbMV0uc2NoZW1hLmlkPz9gX19zY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJue2RlZklkOmwscmVmOnUrbH19LGk9YT0+e2lmKGFbMV0uc2NoZW1hLiRyZWYpcmV0dXJuO2NvbnN0IHM9YVsxXSx7cmVmOmMsZGVmSWQ6dX09ZShhKTtzLmRlZj17Li4ucy5zY2hlbWF9LHUmJihzLmRlZklkPXUpO2NvbnN0IGw9cy5zY2hlbWE7Zm9yKGNvbnN0IGcgaW4gbClkZWxldGUgbFtnXTtsLiRyZWY9Y307aWYodC5jeWNsZXM9PT0idGhyb3ciKWZvcihjb25zdCBhIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IHM9YVsxXTtpZihzLmN5Y2xlKXRocm93IG5ldyBFcnJvcihgQ3ljbGUgZGV0ZWN0ZWQ6ICMvJHtzLmN5Y2xlPy5qb2luKCIvIil9Lzxyb290PgoKU2V0IHRoZSBcYGN5Y2xlc1xgIHBhcmFtZXRlciB0byBcYCJyZWYiXGAgdG8gcmVzb2x2ZSBjeWNsaWNhbCBzY2hlbWFzIHdpdGggZGVmcy5gKX1mb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPWFbMV07aWYobj09PWFbMF0pe2koYSk7Y29udGludWV9aWYodC5leHRlcm5hbCl7Y29uc3QgdT10LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChhWzBdKT8uaWQ7aWYobiE9PWFbMF0mJnUpe2koYSk7Y29udGludWV9fWlmKHQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkKXtpKGEpO2NvbnRpbnVlfWlmKHMuY3ljbGUpe2koYSk7Y29udGludWV9aWYocy5jb3VudD4xJiZ0LnJldXNlZD09PSJyZWYiKXtpKGEpO2NvbnRpbnVlfX19ZnVuY3Rpb24gR2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89cz0+e2NvbnN0IGM9dC5zZWVuLmdldChzKTtpZihjLnJlZj09PW51bGwpcmV0dXJuO2NvbnN0IHU9Yy5kZWY/P2Muc2NoZW1hLGw9ey4uLnV9LGc9Yy5yZWY7aWYoYy5yZWY9bnVsbCxnKXtvKGcpO2NvbnN0ICQ9dC5zZWVuLmdldChnKSx5PSQuc2NoZW1hO2lmKHkuJHJlZiYmKHQudGFyZ2V0PT09ImRyYWZ0LTA3Inx8dC50YXJnZXQ9PT0iZHJhZnQtMDQifHx0LnRhcmdldD09PSJvcGVuYXBpLTMuMCIpPyh1LmFsbE9mPXUuYWxsT2Y/P1tdLHUuYWxsT2YucHVzaCh5KSk6T2JqZWN0LmFzc2lnbih1LHkpLE9iamVjdC5hc3NpZ24odSxsKSxzLl96b2QucGFyZW50PT09Zylmb3IoY29uc3QgTCBpbiB1KUw9PT0iJHJlZiJ8fEw9PT0iYWxsT2YifHxMIGluIGx8fGRlbGV0ZSB1W0xdO2lmKHkuJHJlZiYmJC5kZWYpZm9yKGNvbnN0IEwgaW4gdSlMPT09IiRyZWYifHxMPT09ImFsbE9mInx8TCBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVtMXSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZltMXSkmJmRlbGV0ZSB1W0xdfWNvbnN0IHY9cy5fem9kLnBhcmVudDtpZih2JiZ2IT09Zyl7byh2KTtjb25zdCAkPXQuc2Vlbi5nZXQodik7aWYoJD8uc2NoZW1hLiRyZWYmJih1LiRyZWY9JC5zY2hlbWEuJHJlZiwkLmRlZikpZm9yKGNvbnN0IHkgaW4gdSl5PT09IiRyZWYifHx5PT09ImFsbE9mInx8eSBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVt5XSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZlt5XSkmJmRlbGV0ZSB1W3ldfXQub3ZlcnJpZGUoe3pvZFNjaGVtYTpzLGpzb25TY2hlbWE6dSxwYXRoOmMucGF0aD8/W119KX07Zm9yKGNvbnN0IHMgb2ZbLi4udC5zZWVuLmVudHJpZXMoKV0ucmV2ZXJzZSgpKW8oc1swXSk7Y29uc3QgZT17fTtpZih0LnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj9lLiRzY2hlbWE9Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIjp0LnRhcmdldD09PSJkcmFmdC0wNyI/ZS4kc2NoZW1hPSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiOnQudGFyZ2V0PT09ImRyYWZ0LTA0Ij9lLiRzY2hlbWE9Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6dC50YXJnZXQsdC5leHRlcm5hbD8udXJpKXtjb25zdCBzPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KG4pPy5pZDtpZighcyl0aHJvdyBuZXcgRXJyb3IoIlNjaGVtYSBpcyBtaXNzaW5nIGFuIGBpZGAgcHJvcGVydHkiKTtlLiRpZD10LmV4dGVybmFsLnVyaShzKX1PYmplY3QuYXNzaWduKGUsci5kZWY/P3Iuc2NoZW1hKTtjb25zdCBpPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQobik/LmlkO2khPT12b2lkIDAmJmUuaWQ9PT1pJiZkZWxldGUgZS5pZDtjb25zdCBhPXQuZXh0ZXJuYWw/LmRlZnM/P3t9O2Zvcihjb25zdCBzIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IGM9c1sxXTtjLmRlZiYmYy5kZWZJZCYmKGMuZGVmLmlkPT09Yy5kZWZJZCYmZGVsZXRlIGMuZGVmLmlkLGFbYy5kZWZJZF09Yy5kZWYpfXQuZXh0ZXJuYWx8fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wJiYodC50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiI/ZS4kZGVmcz1hOmUuZGVmaW5pdGlvbnM9YSk7dHJ5e2NvbnN0IHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJ+c3RhbmRhcmQiLHt2YWx1ZTp7Li4ublsifnN0YW5kYXJkIl0sanNvblNjaGVtYTp7aW5wdXQ6U3QobiwiaW5wdXQiLHQucHJvY2Vzc29ycyksb3V0cHV0OlN0KG4sIm91dHB1dCIsdC5wcm9jZXNzb3JzKX19LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITF9KSxzfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiRXJyb3IgY29udmVydGluZyBzY2hlbWEgdG8gSlNPTi4iKX19ZnVuY3Rpb24gcmUodCxuKXtjb25zdCByPW4/P3tzZWVuOm5ldyBTZXR9O2lmKHIuc2Vlbi5oYXModCkpcmV0dXJuITE7ci5zZWVuLmFkZCh0KTtjb25zdCBvPXQuX3pvZC5kZWY7aWYoby50eXBlPT09InRyYW5zZm9ybSIpcmV0dXJuITA7aWYoby50eXBlPT09ImFycmF5IilyZXR1cm4gcmUoby5lbGVtZW50LHIpO2lmKG8udHlwZT09PSJzZXQiKXJldHVybiByZShvLnZhbHVlVHlwZSxyKTtpZihvLnR5cGU9PT0ibGF6eSIpcmV0dXJuIHJlKG8uZ2V0dGVyKCkscik7aWYoby50eXBlPT09InByb21pc2UifHxvLnR5cGU9PT0ib3B0aW9uYWwifHxvLnR5cGU9PT0ibm9ub3B0aW9uYWwifHxvLnR5cGU9PT0ibnVsbGFibGUifHxvLnR5cGU9PT0icmVhZG9ubHkifHxvLnR5cGU9PT0iZGVmYXVsdCJ8fG8udHlwZT09PSJwcmVmYXVsdCIpcmV0dXJuIHJlKG8uaW5uZXJUeXBlLHIpO2lmKG8udHlwZT09PSJpbnRlcnNlY3Rpb24iKXJldHVybiByZShvLmxlZnQscil8fHJlKG8ucmlnaHQscik7aWYoby50eXBlPT09InJlY29yZCJ8fG8udHlwZT09PSJtYXAiKXJldHVybiByZShvLmtleVR5cGUscil8fHJlKG8udmFsdWVUeXBlLHIpO2lmKG8udHlwZT09PSJwaXBlIilyZXR1cm4gdC5fem9kLnRyYWl0cy5oYXMoIiRab2RDb2RlYyIpPyEwOnJlKG8uaW4scil8fHJlKG8ub3V0LHIpO2lmKG8udHlwZT09PSJvYmplY3QiKXtmb3IoY29uc3QgZSBpbiBvLnNoYXBlKWlmKHJlKG8uc2hhcGVbZV0scikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InVuaW9uIil7Zm9yKGNvbnN0IGUgb2Ygby5vcHRpb25zKWlmKHJlKGUscikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InR1cGxlIil7Zm9yKGNvbnN0IGUgb2Ygby5pdGVtcylpZihyZShlLHIpKXJldHVybiEwO3JldHVybiEhKG8ucmVzdCYmcmUoby5yZXN0LHIpKX1yZXR1cm4hMX1jb25zdCBnZD0odCxuPXt9KT0+cj0+e2NvbnN0IG89VmUoey4uLnIscHJvY2Vzc29yczpufSk7cmV0dXJuIEModCxvKSxLZShvLHQpLEdlKG8sdCl9LFN0PSh0LG4scj17fSk9Pm89Pntjb25zdHtsaWJyYXJ5T3B0aW9uczplLHRhcmdldDppfT1vPz97fSxhPVZlKHsuLi5lPz97fSx0YXJnZXQ6aSxpbzpuLHByb2Nlc3NvcnM6cn0pO3JldHVybiBDKHQsYSksS2UoYSx0KSxHZShhLHQpfSxZZz17Z3VpZDoidXVpZCIsdXJsOiJ1cmkiLGRhdGV0aW1lOiJkYXRlLXRpbWUiLGpzb25fc3RyaW5nOiJqc29uLXN0cmluZyIscmVnZXg6IiJ9LHZkPSh0LG4scixvKT0+e2NvbnN0IGU9cjtlLnR5cGU9InN0cmluZyI7Y29uc3R7bWluaW11bTppLG1heGltdW06YSxmb3JtYXQ6cyxwYXR0ZXJuczpjLGNvbnRlbnRFbmNvZGluZzp1fT10Ll96b2QuYmFnO2lmKHR5cGVvZiBpPT0ibnVtYmVyIiYmKGUubWluTGVuZ3RoPWkpLHR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4TGVuZ3RoPWEpLHMmJihlLmZvcm1hdD1ZZ1tzXT8/cyxlLmZvcm1hdD09PSIiJiZkZWxldGUgZS5mb3JtYXQscz09PSJ0aW1lIiYmZGVsZXRlIGUuZm9ybWF0KSx1JiYoZS5jb250ZW50RW5jb2Rpbmc9dSksYyYmYy5zaXplPjApe2NvbnN0IGw9Wy4uLmNdO2wubGVuZ3RoPT09MT9lLnBhdHRlcm49bFswXS5zb3VyY2U6bC5sZW5ndGg+MSYmKGUuYWxsT2Y9Wy4uLmwubWFwKGc9Pih7Li4ubi50YXJnZXQ9PT0iZHJhZnQtMDcifHxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj97dHlwZToic3RyaW5nIn06e30scGF0dGVybjpnLnNvdXJjZX0pKV0pfX0saGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLHttaW5pbXVtOmksbWF4aW11bTphLGZvcm1hdDpzLG11bHRpcGxlT2Y6YyxleGNsdXNpdmVNYXhpbXVtOnUsZXhjbHVzaXZlTWluaW11bTpsfT10Ll96b2QuYmFnO3R5cGVvZiBzPT0ic3RyaW5nIiYmcy5pbmNsdWRlcygiaW50Iik/ZS50eXBlPSJpbnRlZ2VyIjplLnR5cGU9Im51bWJlciI7Y29uc3QgZz10eXBlb2YgbD09Im51bWJlciImJmw+PShpPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpLHY9dHlwZW9mIHU9PSJudW1iZXIiJiZ1PD0oYT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSwkPW4udGFyZ2V0PT09ImRyYWZ0LTA0Inx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiO2c/JD8oZS5taW5pbXVtPWwsZS5leGNsdXNpdmVNaW5pbXVtPSEwKTplLmV4Y2x1c2l2ZU1pbmltdW09bDp0eXBlb2YgaT09Im51bWJlciImJihlLm1pbmltdW09aSksdj8kPyhlLm1heGltdW09dSxlLmV4Y2x1c2l2ZU1heGltdW09ITApOmUuZXhjbHVzaXZlTWF4aW11bT11OnR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4aW11bT1hKSx0eXBlb2YgYz09Im51bWJlciImJihlLm11bHRpcGxlT2Y9Yyl9LCRkPSh0LG4scixvKT0+e3IudHlwZT0iYm9vbGVhbiJ9LF9kPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sYmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiU3ltYm9scyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0seWQ9KHQsbixyLG8pPT57bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyhyLnR5cGU9InN0cmluZyIsci5udWxsYWJsZT0hMCxyLmVudW09W251bGxdKTpyLnR5cGU9Im51bGwifSxrZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJVbmRlZmluZWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LFNkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIlZvaWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LHdkPSh0LG4scixvKT0+e3Iubm90PXt9fSxJZD0odCxuLHIsbyk9Pnt9LHpkPSh0LG4scixvKT0+e30seGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiRGF0ZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sVGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9dmkoZS5lbnRyaWVzKTtpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0ibnVtYmVyIikmJihyLnR5cGU9Im51bWJlciIpLGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJzdHJpbmciKSYmKHIudHlwZT0ic3RyaW5nIiksci5lbnVtPWl9LGpkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPVtdO2Zvcihjb25zdCBhIG9mIGUudmFsdWVzKWlmKGE9PT12b2lkIDApe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkxpdGVyYWwgYHVuZGVmaW5lZGAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9ZWxzZSBpZih0eXBlb2YgYT09ImJpZ2ludCIpe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBsaXRlcmFscyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKTtpLnB1c2goTnVtYmVyKGEpKX1lbHNlIGkucHVzaChhKTtpZihpLmxlbmd0aCE9PTApaWYoaS5sZW5ndGg9PT0xKXtjb25zdCBhPWlbMF07ci50eXBlPWE9PT1udWxsPyJudWxsIjp0eXBlb2YgYSxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj9yLmVudW09W2FdOnIuY29uc3Q9YX1lbHNlIGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJudW1iZXIiKSYmKHIudHlwZT0ibnVtYmVyIiksaS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpJiYoci50eXBlPSJzdHJpbmciKSxpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0iYm9vbGVhbiIpJiYoci50eXBlPSJib29sZWFuIiksaS5ldmVyeShhPT5hPT09bnVsbCkmJihyLnR5cGU9Im51bGwiKSxyLmVudW09aX0sT2Q9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTmFOIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxVZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QucGF0dGVybjtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlBhdHRlcm4gbm90IGZvdW5kIGluIHRlbXBsYXRlIGxpdGVyYWwiKTtlLnR5cGU9InN0cmluZyIsZS5wYXR0ZXJuPWkuc291cmNlfSxQZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT17dHlwZToic3RyaW5nIixmb3JtYXQ6ImJpbmFyeSIsY29udGVudEVuY29kaW5nOiJiaW5hcnkifSx7bWluaW11bTphLG1heGltdW06cyxtaW1lOmN9PXQuX3pvZC5iYWc7YSE9PXZvaWQgMCYmKGkubWluTGVuZ3RoPWEpLHMhPT12b2lkIDAmJihpLm1heExlbmd0aD1zKSxjP2MubGVuZ3RoPT09MT8oaS5jb250ZW50TWVkaWFUeXBlPWNbMF0sT2JqZWN0LmFzc2lnbihlLGkpKTooT2JqZWN0LmFzc2lnbihlLGkpLGUuYW55T2Y9Yy5tYXAodT0+KHtjb250ZW50TWVkaWFUeXBlOnV9KSkpOk9iamVjdC5hc3NpZ24oZSxpKX0sTmQ9KHQsbixyLG8pPT57ci50eXBlPSJib29sZWFuIn0sRGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiQ3VzdG9tIHR5cGVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxFZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sWmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiVHJhbnNmb3JtcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sUmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTWFwIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxDZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJTZXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LEFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWYse21pbmltdW06YSxtYXhpbXVtOnN9PXQuX3pvZC5iYWc7dHlwZW9mIGE9PSJudW1iZXIiJiYoZS5taW5JdGVtcz1hKSx0eXBlb2Ygcz09Im51bWJlciImJihlLm1heEl0ZW1zPXMpLGUudHlwZT0iYXJyYXkiLGUuaXRlbXM9QyhpLmVsZW1lbnQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsIml0ZW1zIl19KX0sTGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLGk9dC5fem9kLmRlZjtlLnR5cGU9Im9iamVjdCIsZS5wcm9wZXJ0aWVzPXt9O2NvbnN0IGE9aS5zaGFwZTtmb3IoY29uc3QgdSBpbiBhKWUucHJvcGVydGllc1t1XT1DKGFbdV0sbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsInByb3BlcnRpZXMiLHVdfSk7Y29uc3Qgcz1uZXcgU2V0KE9iamVjdC5rZXlzKGEpKSxjPW5ldyBTZXQoWy4uLnNdLmZpbHRlcih1PT57Y29uc3QgbD1pLnNoYXBlW3VdLl96b2Q7cmV0dXJuIG4uaW89PT0iaW5wdXQiP2wub3B0aW49PT12b2lkIDA6bC5vcHRvdXQ9PT12b2lkIDB9KSk7Yy5zaXplPjAmJihlLnJlcXVpcmVkPUFycmF5LmZyb20oYykpLGkuY2F0Y2hhbGw/Ll96b2QuZGVmLnR5cGU9PT0ibmV2ZXIiP2UuYWRkaXRpb25hbFByb3BlcnRpZXM9ITE6aS5jYXRjaGFsbD9pLmNhdGNoYWxsJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkuY2F0Y2hhbGwsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIl19KSk6bi5pbz09PSJvdXRwdXQiJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz0hMSl9LGdvPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPWUuaW5jbHVzaXZlPT09ITEsYT1lLm9wdGlvbnMubWFwKChzLGMpPT5DKHMsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsaT8ib25lT2YiOiJhbnlPZiIsY119KSk7aT9yLm9uZU9mPWE6ci5hbnlPZj1hfSxNZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUubGVmdCxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwiYWxsT2YiLDBdfSksYT1DKGUucmlnaHQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFsbE9mIiwxXX0pLHM9dT0+ImFsbE9mImluIHUmJk9iamVjdC5rZXlzKHUpLmxlbmd0aD09PTEsYz1bLi4ucyhpKT9pLmFsbE9mOltpXSwuLi5zKGEpP2EuYWxsT2Y6W2FdXTtyLmFsbE9mPWN9LHFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJhcnJheSI7Y29uc3QgYT1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8icHJlZml4SXRlbXMiOiJpdGVtcyIscz1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyInx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyJpdGVtcyI6ImFkZGl0aW9uYWxJdGVtcyIsYz1pLml0ZW1zLm1hcCgodiwkKT0+Qyh2LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLGEsJF19KSksdT1pLnJlc3Q/QyhpLnJlc3Qsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgscywuLi5uLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/W2kuaXRlbXMubGVuZ3RoXTpbXV19KTpudWxsO24udGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyhlLnByZWZpeEl0ZW1zPWMsdSYmKGUuaXRlbXM9dSkpOm4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oZS5pdGVtcz17YW55T2Y6Y30sdSYmZS5pdGVtcy5hbnlPZi5wdXNoKHUpLGUubWluSXRlbXM9Yy5sZW5ndGgsdXx8KGUubWF4SXRlbXM9Yy5sZW5ndGgpKTooZS5pdGVtcz1jLHUmJihlLmFkZGl0aW9uYWxJdGVtcz11KSk7Y29uc3R7bWluaW11bTpsLG1heGltdW06Z309dC5fem9kLmJhZzt0eXBlb2YgbD09Im51bWJlciImJihlLm1pbkl0ZW1zPWwpLHR5cGVvZiBnPT0ibnVtYmVyIiYmKGUubWF4SXRlbXM9Zyl9LEZkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJvYmplY3QiO2NvbnN0IGE9aS5rZXlUeXBlLGM9YS5fem9kLmJhZz8ucGF0dGVybnM7aWYoaS5tb2RlPT09Imxvb3NlIiYmYyYmYy5zaXplPjApe2NvbnN0IGw9QyhpLnZhbHVlVHlwZSxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwicGF0dGVyblByb3BlcnRpZXMiLCIqIl19KTtlLnBhdHRlcm5Qcm9wZXJ0aWVzPXt9O2Zvcihjb25zdCBnIG9mIGMpZS5wYXR0ZXJuUHJvcGVydGllc1tnLnNvdXJjZV09bH1lbHNlKG4udGFyZ2V0PT09ImRyYWZ0LTA3Inx8bi50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiIpJiYoZS5wcm9wZXJ0eU5hbWVzPUMoaS5rZXlUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJwcm9wZXJ0eU5hbWVzIl19KSksZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkudmFsdWVUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJhZGRpdGlvbmFsUHJvcGVydGllcyJdfSk7Y29uc3QgdT1hLl96b2QudmFsdWVzO2lmKHUpe2NvbnN0IGw9Wy4uLnVdLmZpbHRlcihnPT50eXBlb2YgZz09InN0cmluZyJ8fHR5cGVvZiBnPT0ibnVtYmVyIik7bC5sZW5ndGg+MCYmKGUucmVxdWlyZWQ9bCl9fSxKZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUuaW5uZXJUeXBlLG4sbyksYT1uLnNlZW4uZ2V0KHQpO24udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oYS5yZWY9ZS5pbm5lclR5cGUsci5udWxsYWJsZT0hMCk6ci5hbnlPZj1baSx7dHlwZToibnVsbCJ9XX0sSGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFdkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLHIuZGVmYXVsdD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUuZGVmYXVsdFZhbHVlKSl9LEJkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLG4uaW89PT0iaW5wdXQiJiYoci5fcHJlZmF1bHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmRlZmF1bHRWYWx1ZSkpKX0sVmQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGU7bGV0IGE7dHJ5e2E9ZS5jYXRjaFZhbHVlKHZvaWQgMCl9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIGNhdGNoIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKU09OIFNjaGVtYSIpfXIuZGVmYXVsdD1hfSxLZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1lLmluLl96b2QudHJhaXRzLmhhcygiJFpvZFRyYW5zZm9ybSIpLGE9bi5pbz09PSJpbnB1dCI/aT9lLm91dDplLmluOmUub3V0O0MoYSxuLG8pO2NvbnN0IHM9bi5zZWVuLmdldCh0KTtzLnJlZj1hfSxHZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZSxyLnJlYWRPbmx5PSEwfSxYZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZX0sdm89KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFlkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmlubmVyVHlwZTtDKGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZX0sZGk9e3N0cmluZzp2ZCxudW1iZXI6aGQsYm9vbGVhbjokZCxiaWdpbnQ6X2Qsc3ltYm9sOmJkLG51bGw6eWQsdW5kZWZpbmVkOmtkLHZvaWQ6U2QsbmV2ZXI6d2QsYW55OklkLHVua25vd246emQsZGF0ZTp4ZCxlbnVtOlRkLGxpdGVyYWw6amQsbmFuOk9kLHRlbXBsYXRlX2xpdGVyYWw6VWQsZmlsZTpQZCxzdWNjZXNzOk5kLGN1c3RvbTpEZCxmdW5jdGlvbjpFZCx0cmFuc2Zvcm06WmQsbWFwOlJkLHNldDpDZCxhcnJheTpBZCxvYmplY3Q6TGQsdW5pb246Z28saW50ZXJzZWN0aW9uOk1kLHR1cGxlOnFkLHJlY29yZDpGZCxudWxsYWJsZTpKZCxub25vcHRpb25hbDpIZCxkZWZhdWx0OldkLHByZWZhdWx0OkJkLGNhdGNoOlZkLHBpcGU6S2QscmVhZG9ubHk6R2QscHJvbWlzZTpYZCxvcHRpb25hbDp2byxsYXp5OllkfTtmdW5jdGlvbiBobyh0LG4pe2lmKCJfaWRtYXAiaW4gdCl7Y29uc3Qgbz10LGU9VmUoey4uLm4scHJvY2Vzc29yczpkaX0pLGk9e307Zm9yKGNvbnN0IGMgb2Ygby5faWRtYXAuZW50cmllcygpKXtjb25zdFt1LGxdPWM7QyhsLGUpfWNvbnN0IGE9e30scz17cmVnaXN0cnk6byx1cmk6bj8udXJpLGRlZnM6aX07ZS5leHRlcm5hbD1zO2Zvcihjb25zdCBjIG9mIG8uX2lkbWFwLmVudHJpZXMoKSl7Y29uc3RbdSxsXT1jO0tlKGUsbCksYVt1XT1HZShlLGwpfWlmKE9iamVjdC5rZXlzKGkpLmxlbmd0aD4wKXtjb25zdCBjPWUudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjthLl9fc2hhcmVkPXtbY106aX19cmV0dXJue3NjaGVtYXM6YX19Y29uc3Qgcj1WZSh7Li4ubixwcm9jZXNzb3JzOmRpfSk7cmV0dXJuIEModCxyKSxLZShyLHQpLEdlKHIsdCl9Y2xhc3MgUWd7Z2V0IG1ldGFkYXRhUmVnaXN0cnkoKXtyZXR1cm4gdGhpcy5jdHgubWV0YWRhdGFSZWdpc3RyeX1nZXQgdGFyZ2V0KCl7cmV0dXJuIHRoaXMuY3R4LnRhcmdldH1nZXQgdW5yZXByZXNlbnRhYmxlKCl7cmV0dXJuIHRoaXMuY3R4LnVucmVwcmVzZW50YWJsZX1nZXQgb3ZlcnJpZGUoKXtyZXR1cm4gdGhpcy5jdHgub3ZlcnJpZGV9Z2V0IGlvKCl7cmV0dXJuIHRoaXMuY3R4LmlvfWdldCBjb3VudGVyKCl7cmV0dXJuIHRoaXMuY3R4LmNvdW50ZXJ9c2V0IGNvdW50ZXIobil7dGhpcy5jdHguY291bnRlcj1ufWdldCBzZWVuKCl7cmV0dXJuIHRoaXMuY3R4LnNlZW59Y29uc3RydWN0b3Iobil7bGV0IHI9bj8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cj09PSJkcmFmdC00IiYmKHI9ImRyYWZ0LTA0Iikscj09PSJkcmFmdC03IiYmKHI9ImRyYWZ0LTA3IiksdGhpcy5jdHg9VmUoe3Byb2Nlc3NvcnM6ZGksdGFyZ2V0OnIsLi4ubj8ubWV0YWRhdGEmJnttZXRhZGF0YTpuLm1ldGFkYXRhfSwuLi5uPy51bnJlcHJlc2VudGFibGUmJnt1bnJlcHJlc2VudGFibGU6bi51bnJlcHJlc2VudGFibGV9LC4uLm4/Lm92ZXJyaWRlJiZ7b3ZlcnJpZGU6bi5vdmVycmlkZX0sLi4ubj8uaW8mJntpbzpuLmlvfX0pfXByb2Nlc3MobixyPXtwYXRoOltdLHNjaGVtYVBhdGg6W119KXtyZXR1cm4gQyhuLHRoaXMuY3R4LHIpfWVtaXQobixyKXtyJiYoci5jeWNsZXMmJih0aGlzLmN0eC5jeWNsZXM9ci5jeWNsZXMpLHIucmV1c2VkJiYodGhpcy5jdHgucmV1c2VkPXIucmV1c2VkKSxyLmV4dGVybmFsJiYodGhpcy5jdHguZXh0ZXJuYWw9ci5leHRlcm5hbCkpLEtlKHRoaXMuY3R4LG4pO2NvbnN0IG89R2UodGhpcy5jdHgsbikseyJ+c3RhbmRhcmQiOmUsLi4uaX09bztyZXR1cm4gaX19Y29uc3QgZXY9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLFFkPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkWm9kQW55Okh1LCRab2RBcnJheTpHdSwkWm9kQXN5bmNFcnJvcjpOZSwkWm9kQmFzZTY0Ok51LCRab2RCYXNlNjRVUkw6RXUsJFpvZEJpZ0ludDpBaSwkWm9kQmlnSW50Rm9ybWF0Ok11LCRab2RCb29sZWFuOkNpLCRab2RDSURSdjQ6VXUsJFpvZENJRFJ2NjpQdSwkWm9kQ1VJRDpfdSwkWm9kQ1VJRDI6YnUsJFpvZENhdGNoOmhsLCRab2RDaGVjazpKLCRab2RDaGVja0JpZ0ludEZvcm1hdDpLYywkWm9kQ2hlY2tFbmRzV2l0aDpzdSwkWm9kQ2hlY2tHcmVhdGVyVGhhbjpFaSwkWm9kQ2hlY2tJbmNsdWRlczpvdSwkWm9kQ2hlY2tMZW5ndGhFcXVhbHM6dHUsJFpvZENoZWNrTGVzc1RoYW46RGksJFpvZENoZWNrTG93ZXJDYXNlOnJ1LCRab2RDaGVja01heExlbmd0aDpRYywkWm9kQ2hlY2tNYXhTaXplOkdjLCRab2RDaGVja01pbWVUeXBlOnV1LCRab2RDaGVja01pbkxlbmd0aDpldSwkWm9kQ2hlY2tNaW5TaXplOlhjLCRab2RDaGVja011bHRpcGxlT2Y6QmMsJFpvZENoZWNrTnVtYmVyRm9ybWF0OlZjLCRab2RDaGVja092ZXJ3cml0ZTpsdSwkWm9kQ2hlY2tQcm9wZXJ0eTpjdSwkWm9kQ2hlY2tSZWdleDpudSwkWm9kQ2hlY2tTaXplRXF1YWxzOlljLCRab2RDaGVja1N0YXJ0c1dpdGg6YXUsJFpvZENoZWNrU3RyaW5nRm9ybWF0OkV0LCRab2RDaGVja1VwcGVyQ2FzZTppdSwkWm9kQ29kZWM6RmksJFpvZEN1c3RvbTpJbCwkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0OkF1LCRab2REYXRlOkt1LCRab2REZWZhdWx0OnBsLCRab2REaXNjcmltaW5hdGVkVW5pb246bmwsJFpvZEUxNjQ6WnUsJFpvZEVtYWlsOmd1LCRab2RFbW9qaTpodSwkWm9kRW5jb2RlRXJyb3I6V24sJFpvZEVudW06c2wsJFpvZEVycm9yOl9pLCRab2RFeGFjdE9wdGlvbmFsOmRsLCRab2RGaWxlOnVsLCRab2RGdW5jdGlvbjprbCwkWm9kR1VJRDpwdSwkWm9kSVB2NDpUdSwkWm9kSVB2NjpqdSwkWm9kSVNPRGF0ZTpJdSwkWm9kSVNPRGF0ZVRpbWU6d3UsJFpvZElTT0R1cmF0aW9uOnh1LCRab2RJU09UaW1lOnp1LCRab2RJbnRlcnNlY3Rpb246cmwsJFpvZEpXVDpDdSwkWm9kS1NVSUQ6U3UsJFpvZExhenk6d2wsJFpvZExpdGVyYWw6Y2wsJFpvZE1BQzpPdSwkWm9kTWFwOm9sLCRab2ROYU46JGwsJFpvZE5hbm9JRDokdSwkWm9kTmV2ZXI6QnUsJFpvZE5vbk9wdGlvbmFsOmdsLCRab2ROdWxsOkp1LCRab2ROdWxsYWJsZTptbCwkWm9kTnVtYmVyOlJpLCRab2ROdW1iZXJGb3JtYXQ6THUsJFpvZE9iamVjdDpRdSwkWm9kT2JqZWN0SklUOmVsLCRab2RPcHRpb25hbDpNaSwkWm9kUGlwZTpxaSwkWm9kUHJlZmF1bHQ6ZmwsJFpvZFByZXByb2Nlc3M6X2wsJFpvZFByb21pc2U6U2wsJFpvZFJlYWRvbmx5OmJsLCRab2RSZWFsRXJyb3I6bWUsJFpvZFJlY29yZDppbCwkWm9kUmVnaXN0cnk6amwsJFpvZFNldDphbCwkWm9kU3RyaW5nOlp0LCRab2RTdHJpbmdGb3JtYXQ6RiwkWm9kU3VjY2Vzczp2bCwkWm9kU3ltYm9sOnF1LCRab2RUZW1wbGF0ZUxpdGVyYWw6eWwsJFpvZFRyYW5zZm9ybTpsbCwkWm9kVHVwbGU6TGksJFpvZFR5cGU6eCwkWm9kVUxJRDp5dSwkWm9kVVJMOnZ1LCRab2RVVUlEOmZ1LCRab2RVbmRlZmluZWQ6RnUsJFpvZFVuaW9uOmVyLCRab2RVbmtub3duOld1LCRab2RWb2lkOlZ1LCRab2RYSUQ6a3UsJFpvZFhvcjp0bCwkYnJhbmQ6Z2ksJGNvbnN0cnVjdG9yOmQsJGlucHV0OldpLCRvdXRwdXQ6SGksRG9jOmR1LEpTT05TY2hlbWE6ZXYsSlNPTlNjaGVtYUdlbmVyYXRvcjpRZyxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLF9hbnk6UWwsX2FycmF5OmFkLF9iYXNlNjQ6dW8sX2Jhc2U2NHVybDpsbyxfYmlnaW50OldsLF9ib29sZWFuOkpsLF9jYXRjaDpXZyxfY2hlY2s6ZGQsX2NpZHJ2NDpzbyxfY2lkcnY2OmNvLF9jb2VyY2VkQmlnaW50OkJsLF9jb2VyY2VkQm9vbGVhbjpIbCxfY29lcmNlZERhdGU6aWQsX2NvZXJjZWROdW1iZXI6Q2wsX2NvZXJjZWRTdHJpbmc6VWwsX2N1aWQ6ZW8sX2N1aWQyOnRvLF9jdXN0b206Y2QsX2RhdGU6cmQsX2RlY29kZTp3aSxfZGVjb2RlQXN5bmM6emksX2RlZmF1bHQ6RmcsX2Rpc2NyaW1pbmF0ZWRVbmlvbjpVZyxfZTE2NDptbyxfZW1haWw6QmksX2Vtb2ppOllpLF9lbmNvZGU6U2ksX2VuY29kZUFzeW5jOklpLF9lbmRzV2l0aDpxdCxfZW51bTpSZyxfZmlsZTpzZCxfZmxvYXQzMjpMbCxfZmxvYXQ2NDpNbCxfZ3Q6a2UsX2d0ZTppZSxfZ3VpZDpMbixfaW5jbHVkZXM6THQsX2ludDpBbCxfaW50MzI6cWwsX2ludDY0OlZsLF9pbnRlcnNlY3Rpb246UGcsX2lwdjQ6b28sX2lwdjY6YW8sX2lzb0RhdGU6RGwsX2lzb0RhdGVUaW1lOk5sLF9pc29EdXJhdGlvbjpabCxfaXNvVGltZTpFbCxfand0OnBvLF9rc3VpZDppbyxfbGF6eTpHZyxfbGVuZ3RoOml0LF9saXRlcmFsOkFnLF9sb3dlcmNhc2U6Q3QsX2x0OnllLF9sdGU6dWUsX21hYzpQbCxfbWFwOkVnLF9tYXg6dWUsX21heExlbmd0aDpydCxfbWF4U2l6ZTpMZSxfbWltZTpGdCxfbWluOmllLF9taW5MZW5ndGg6emUsX21pblNpemU6U2UsX211bHRpcGxlT2Y6RWUsX25hbjpvZCxfbmFub2lkOlFpLF9uYXRpdmVFbnVtOkNnLF9uZWdhdGl2ZTppcixfbmV2ZXI6dGQsX25vbm5lZ2F0aXZlOmFyLF9ub25vcHRpb25hbDpKZyxfbm9ucG9zaXRpdmU6b3IsX25vcm1hbGl6ZTpKdCxfbnVsbDpZbCxfbnVsbGFibGU6cWcsX251bWJlcjpSbCxfb3B0aW9uYWw6TWcsX292ZXJ3cml0ZTpfZSxfcGFyc2U6anQsX3BhcnNlQXN5bmM6T3QsX3BpcGU6QmcsX3Bvc2l0aXZlOnJyLF9wcm9taXNlOlhnLF9wcm9wZXJ0eTpzcixfcmVhZG9ubHk6VmcsX3JlY29yZDpEZyxfcmVmaW5lOnVkLF9yZWdleDpSdCxfc2FmZURlY29kZTpUaSxfc2FmZURlY29kZUFzeW5jOk9pLF9zYWZlRW5jb2RlOnhpLF9zYWZlRW5jb2RlQXN5bmM6amksX3NhZmVQYXJzZTpVdCxfc2FmZVBhcnNlQXN5bmM6UHQsX3NldDpaZyxfc2l6ZTpudCxfc2x1Z2lmeTpWdCxfc3RhcnRzV2l0aDpNdCxfc3RyaW5nOk9sLF9zdHJpbmdGb3JtYXQ6S3QsX3N0cmluZ2Jvb2w6ZmQsX3N1Y2Nlc3M6SGcsX3N1cGVyUmVmaW5lOmxkLF9zeW1ib2w6R2wsX3RlbXBsYXRlTGl0ZXJhbDpLZyxfdG9Mb3dlckNhc2U6V3QsX3RvVXBwZXJDYXNlOkJ0LF90cmFuc2Zvcm06TGcsX3RyaW06SHQsX3R1cGxlOk5nLF91aW50MzI6RmwsX3VpbnQ2NDpLbCxfdWxpZDpubyxfdW5kZWZpbmVkOlhsLF91bmlvbjpqZyxfdW5rbm93bjplZCxfdXBwZXJjYXNlOkF0LF91cmw6bnIsX3V1aWQ6VmksX3V1aWR2NDpLaSxfdXVpZHY2OkdpLF91dWlkdjc6WGksX3ZvaWQ6bmQsX3hpZDpybyxfeG9yOk9nLGNsb25lOmRlLGNvbmZpZzpLLGNyZWF0ZVN0YW5kYXJkSlNPTlNjaGVtYU1ldGhvZDpTdCxjcmVhdGVUb0pTT05TY2hlbWFNZXRob2Q6Z2QsZGVjb2RlOmFwLGRlY29kZUFzeW5jOmNwLGRlc2NyaWJlOm1kLGVuY29kZTpvcCxlbmNvZGVBc3luYzpzcCxleHRyYWN0RGVmczpLZSxmaW5hbGl6ZTpHZSxmbGF0dGVuRXJyb3I6WG4sZm9ybWF0RXJyb3I6WW4sZ2xvYmFsQ29uZmlnOmt0LGdsb2JhbFJlZ2lzdHJ5OmNlLGluaXRpYWxpemVDb250ZXh0OlZlLGlzVmFsaWRCYXNlNjQ6WmksaXNWYWxpZEJhc2U2NFVSTDpEdSxpc1ZhbGlkSldUOlJ1LGxvY2FsZXM6SmksbWV0YTpwZCxwYXJzZTpjaSxwYXJzZUFzeW5jOnVpLHByZXR0aWZ5RXJyb3I6eWkscHJvY2VzczpDLHJlZ2V4ZXM6UW4scmVnaXN0cnk6dHIsc2FmZURlY29kZTpscCxzYWZlRGVjb2RlQXN5bmM6bXAsc2FmZUVuY29kZTp1cCxzYWZlRW5jb2RlQXN5bmM6ZHAsc2FmZVBhcnNlOmtpLHNhZmVQYXJzZUFzeW5jOmRjLHRvRG90UGF0aDpsYyx0b0pTT05TY2hlbWE6aG8sdHJlZWlmeUVycm9yOmJpLHV0aWw6JGksdmVyc2lvbjptdX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTtmdW5jdGlvbiAkbyh0KXtyZXR1cm4hIXQuX3pvZH1mdW5jdGlvbiBlbSh0LG4pe3JldHVybiAkbyh0KT9raSh0LG4pOnQuc2FmZVBhcnNlKG4pfWZ1bmN0aW9uIHR2KHQpe2lmKCF0KXJldHVybjtsZXQgbjtpZigkbyh0KT9uPXQuX3pvZD8uZGVmPy5zaGFwZTpuPXQuc2hhcGUsISFuKXtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7cmV0dXJuIG4oKX1jYXRjaHtyZXR1cm59cmV0dXJuIG59fWZ1bmN0aW9uIG52KHQpe2lmKCRvKHQpKXtjb25zdCBpPXQuX3pvZD8uZGVmO2lmKGkpe2lmKGkudmFsdWUhPT12b2lkIDApcmV0dXJuIGkudmFsdWU7aWYoQXJyYXkuaXNBcnJheShpLnZhbHVlcykmJmkudmFsdWVzLmxlbmd0aD4wKXJldHVybiBpLnZhbHVlc1swXX19Y29uc3Qgcj10Ll9kZWY7aWYocil7aWYoci52YWx1ZSE9PXZvaWQgMClyZXR1cm4gci52YWx1ZTtpZihBcnJheS5pc0FycmF5KHIudmFsdWVzKSYmci52YWx1ZXMubGVuZ3RoPjApcmV0dXJuIHIudmFsdWVzWzBdfWNvbnN0IG89dC52YWx1ZTtpZihvIT09dm9pZCAwKXJldHVybiBvfWNvbnN0IHJ2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxlbmRzV2l0aDpxdCxndDprZSxndGU6aWUsaW5jbHVkZXM6THQsbGVuZ3RoOml0LGxvd2VyY2FzZTpDdCxsdDp5ZSxsdGU6dWUsbWF4TGVuZ3RoOnJ0LG1heFNpemU6TGUsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5lZ2F0aXZlOmlyLG5vbm5lZ2F0aXZlOmFyLG5vbnBvc2l0aXZlOm9yLG5vcm1hbGl6ZTpKdCxvdmVyd3JpdGU6X2UscG9zaXRpdmU6cnIscHJvcGVydHk6c3IscmVnZXg6UnQsc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJpbTpIdCx1cHBlcmNhc2U6QXR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksY3I9ZCgiWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57d3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gX28odCl7cmV0dXJuIE5sKGNyLHQpfWNvbnN0IHVyPWQoIlpvZElTT0RhdGUiLCh0LG4pPT57SXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gdG0odCl7cmV0dXJuIERsKHVyLHQpfWNvbnN0IGxyPWQoIlpvZElTT1RpbWUiLCh0LG4pPT57enUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbm0odCl7cmV0dXJuIEVsKGxyLHQpfWNvbnN0IGRyPWQoIlpvZElTT0R1cmF0aW9uIiwodCxuKT0+e3h1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHJtKHQpe3JldHVybiBabChkcix0KX1jb25zdCBibz1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLGRhdGU6dG0sZGF0ZXRpbWU6X28sZHVyYXRpb246cm0sdGltZTpubX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxpbT0odCxuKT0+e19pLmluaXQodCxuKSx0Lm5hbWU9IlpvZEVycm9yIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LHtmb3JtYXQ6e3ZhbHVlOnI9PlluKHQscil9LGZsYXR0ZW46e3ZhbHVlOnI9PlhuKHQscil9LGFkZElzc3VlOnt2YWx1ZTpyPT57dC5pc3N1ZXMucHVzaChyKSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkodC5pc3N1ZXMsUm4sMil9fSxhZGRJc3N1ZXM6e3ZhbHVlOnI9Pnt0Lmlzc3Vlcy5wdXNoKC4uLnIpLHQubWVzc2FnZT1KU09OLnN0cmluZ2lmeSh0Lmlzc3VlcyxSbiwyKX19LGlzRW1wdHk6e2dldCgpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg9PT0wfX19KX0sb209ZCgiWm9kRXJyb3IiLGltKSxzZT1kKCJab2RFcnJvciIsaW0se1BhcmVudDpFcnJvcn0pLHlvPWp0KHNlKSxrbz1PdChzZSksU289VXQoc2UpLHdvPVB0KHNlKSxJbz1TaShzZSksem89d2koc2UpLHhvPUlpKHNlKSxUbz16aShzZSksam89eGkoc2UpLE9vPVRpKHNlKSxVbz1qaShzZSksUG89T2koc2UpLFpzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEd0KHQsbixyKXtjb25zdCBvPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtsZXQgZT1acy5nZXQobyk7aWYoZXx8KGU9bmV3IFNldCxacy5zZXQobyxlKSksIWUuaGFzKG4pKXtlLmFkZChuKTtmb3IoY29uc3QgaSBpbiByKXtjb25zdCBhPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KG8saSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0KCl7Y29uc3Qgcz1hLmJpbmQodGhpcyk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KSxzfSxzZXQocyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30pfX0pfX19Y29uc3Qgaj1kKCJab2RUeXBlIiwodCxuKT0+KHguaW5pdCh0LG4pLE9iamVjdC5hc3NpZ24odFsifnN0YW5kYXJkIl0se2pzb25TY2hlbWE6e2lucHV0OlN0KHQsImlucHV0Iiksb3V0cHV0OlN0KHQsIm91dHB1dCIpfX0pLHQudG9KU09OU2NoZW1hPWdkKHQse30pLHQuZGVmPW4sdC50eXBlPW4udHlwZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX2RlZiIse3ZhbHVlOm59KSx0LnBhcnNlPShyLG8pPT55byh0LHIsbyx7Y2FsbGVlOnQucGFyc2V9KSx0LnNhZmVQYXJzZT0ocixvKT0+U28odCxyLG8pLHQucGFyc2VBc3luYz1hc3luYyhyLG8pPT5rbyh0LHIsbyx7Y2FsbGVlOnQucGFyc2VBc3luY30pLHQuc2FmZVBhcnNlQXN5bmM9YXN5bmMocixvKT0+d28odCxyLG8pLHQuc3BhPXQuc2FmZVBhcnNlQXN5bmMsdC5lbmNvZGU9KHIsbyk9PklvKHQscixvKSx0LmRlY29kZT0ocixvKT0+em8odCxyLG8pLHQuZW5jb2RlQXN5bmM9YXN5bmMocixvKT0+eG8odCxyLG8pLHQuZGVjb2RlQXN5bmM9YXN5bmMocixvKT0+VG8odCxyLG8pLHQuc2FmZUVuY29kZT0ocixvKT0+am8odCxyLG8pLHQuc2FmZURlY29kZT0ocixvKT0+T28odCxyLG8pLHQuc2FmZUVuY29kZUFzeW5jPWFzeW5jKHIsbyk9PlVvKHQscixvKSx0LnNhZmVEZWNvZGVBc3luYz1hc3luYyhyLG8pPT5Qbyh0LHIsbyksR3QodCwiWm9kVHlwZSIse2NoZWNrKC4uLnIpe2NvbnN0IG89dGhpcy5kZWY7cmV0dXJuIHRoaXMuY2xvbmUoJGUobyx7Y2hlY2tzOlsuLi5vLmNoZWNrcz8/W10sLi4uci5tYXAoZT0+dHlwZW9mIGU9PSJmdW5jdGlvbiI/e196b2Q6e2NoZWNrOmUsZGVmOntjaGVjazoiY3VzdG9tIn0sb25hdHRhY2g6W119fTplKV19KSx7cGFyZW50OiEwfSl9LHdpdGgoLi4ucil7cmV0dXJuIHRoaXMuY2hlY2soLi4ucil9LGNsb25lKHIsbyl7cmV0dXJuIGRlKHRoaXMscixvKX0sYnJhbmQoKXtyZXR1cm4gdGhpc30scmVnaXN0ZXIocixvKXtyZXR1cm4gci5hZGQodGhpcyxvKSx0aGlzfSxyZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhZcihyLG8pKX0sc3VwZXJSZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhRcihyLG8pKX0sb3ZlcndyaXRlKHIpe3JldHVybiB0aGlzLmNoZWNrKF9lKHIpKX0sb3B0aW9uYWwoKXtyZXR1cm4gcSh0aGlzKX0sZXhhY3RPcHRpb25hbCgpe3JldHVybiBQcih0aGlzKX0sbnVsbGFibGUoKXtyZXR1cm4gUWUodGhpcyl9LG51bGxpc2goKXtyZXR1cm4gcShRZSh0aGlzKSl9LG5vbm9wdGlvbmFsKHIpe3JldHVybiBDcih0aGlzLHIpfSxhcnJheSgpe3JldHVybiBJKHRoaXMpfSxvcihyKXtyZXR1cm4gVShbdGhpcyxyXSl9LGFuZChyKXtyZXR1cm4gbXQodGhpcyxyKX0sdHJhbnNmb3JtKHIpe3JldHVybiBJdCh0aGlzLGJuKHIpKX0sZGVmYXVsdChyKXtyZXR1cm4gRXIodGhpcyxyKX0scHJlZmF1bHQocil7cmV0dXJuIFJyKHRoaXMscil9LGNhdGNoKHIpe3JldHVybiBNcih0aGlzLHIpfSxwaXBlKHIpe3JldHVybiBJdCh0aGlzLHIpfSxyZWFkb25seSgpe3JldHVybiBIcih0aGlzKX0sZGVzY3JpYmUocil7Y29uc3Qgbz10aGlzLmNsb25lKCk7cmV0dXJuIGNlLmFkZChvLHtkZXNjcmlwdGlvbjpyfSksb30sbWV0YSguLi5yKXtpZihyLmxlbmd0aD09PTApcmV0dXJuIGNlLmdldCh0aGlzKTtjb25zdCBvPXRoaXMuY2xvbmUoKTtyZXR1cm4gY2UuYWRkKG8sclswXSksb30saXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9LGlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc30sYXBwbHkocil7cmV0dXJuIHIodGhpcyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRlc2NyaXB0aW9uIix7Z2V0KCl7cmV0dXJuIGNlLmdldCh0KT8uZGVzY3JpcHRpb259LGNvbmZpZ3VyYWJsZTohMH0pLHQpKSxYdD1kKCJfWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+dmQodCxvLGUpO2NvbnN0IHI9dC5fem9kLmJhZzt0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbCx0Lm1pbkxlbmd0aD1yLm1pbmltdW0/P251bGwsdC5tYXhMZW5ndGg9ci5tYXhpbXVtPz9udWxsLEd0KHQsIl9ab2RTdHJpbmciLHtyZWdleCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhSdCguLi5vKSl9LGluY2x1ZGVzKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEx0KC4uLm8pKX0sc3RhcnRzV2l0aCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhNdCguLi5vKSl9LGVuZHNXaXRoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHF0KC4uLm8pKX0sbWluKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHplKC4uLm8pKX0sbWF4KC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KC4uLm8pKX0sbGVuZ3RoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKGl0KC4uLm8pKX0sbm9uZW1wdHkoLi4ubyl7cmV0dXJuIHRoaXMuY2hlY2soemUoMSwuLi5vKSl9LGxvd2VyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhDdChvKSl9LHVwcGVyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhBdChvKSl9LHRyaW0oKXtyZXR1cm4gdGhpcy5jaGVjayhIdCgpKX0sbm9ybWFsaXplKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEp0KC4uLm8pKX0sdG9Mb3dlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhXdCgpKX0sdG9VcHBlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhCdCgpKX0sc2x1Z2lmeSgpe3JldHVybiB0aGlzLmNoZWNrKFZ0KCkpfX0pfSksb3Q9ZCgiWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxYdC5pbml0KHQsbiksdC5lbWFpbD1yPT50LmNoZWNrKEJpKFl0LHIpKSx0LnVybD1yPT50LmNoZWNrKG5yKGF0LHIpKSx0Lmp3dD1yPT50LmNoZWNrKHBvKGZuLHIpKSx0LmVtb2ppPXI9PnQuY2hlY2soWWkoUXQscikpLHQuZ3VpZD1yPT50LmNoZWNrKExuKFhlLHIpKSx0LnV1aWQ9cj0+dC5jaGVjayhWaShoZSxyKSksdC51dWlkdjQ9cj0+dC5jaGVjayhLaShoZSxyKSksdC51dWlkdjY9cj0+dC5jaGVjayhHaShoZSxyKSksdC51dWlkdjc9cj0+dC5jaGVjayhYaShoZSxyKSksdC5uYW5vaWQ9cj0+dC5jaGVjayhRaShlbixyKSksdC5ndWlkPXI9PnQuY2hlY2soTG4oWGUscikpLHQuY3VpZD1yPT50LmNoZWNrKGVvKHRuLHIpKSx0LmN1aWQyPXI9PnQuY2hlY2sodG8obm4scikpLHQudWxpZD1yPT50LmNoZWNrKG5vKHJuLHIpKSx0LmJhc2U2ND1yPT50LmNoZWNrKHVvKGRuLHIpKSx0LmJhc2U2NHVybD1yPT50LmNoZWNrKGxvKG1uLHIpKSx0LnhpZD1yPT50LmNoZWNrKHJvKG9uLHIpKSx0LmtzdWlkPXI9PnQuY2hlY2soaW8oYW4scikpLHQuaXB2ND1yPT50LmNoZWNrKG9vKHNuLHIpKSx0LmlwdjY9cj0+dC5jaGVjayhhbyhjbixyKSksdC5jaWRydjQ9cj0+dC5jaGVjayhzbyh1bixyKSksdC5jaWRydjY9cj0+dC5jaGVjayhjbyhsbixyKSksdC5lMTY0PXI9PnQuY2hlY2sobW8ocG4scikpLHQuZGF0ZXRpbWU9cj0+dC5jaGVjayhfbyhyKSksdC5kYXRlPXI9PnQuY2hlY2sodG0ocikpLHQudGltZT1yPT50LmNoZWNrKG5tKHIpKSx0LmR1cmF0aW9uPXI9PnQuY2hlY2socm0ocikpfSk7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gT2wob3QsdCl9Y29uc3QgQT1kKCJab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57Ri5pbml0KHQsbiksWHQuaW5pdCh0LG4pfSksWXQ9ZCgiWm9kRW1haWwiLCh0LG4pPT57Z3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTm8odCl7cmV0dXJuIEJpKFl0LHQpfWNvbnN0IFhlPWQoIlpvZEdVSUQiLCh0LG4pPT57cHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRG8odCl7cmV0dXJuIExuKFhlLHQpfWNvbnN0IGhlPWQoIlpvZFVVSUQiLCh0LG4pPT57ZnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRW8odCl7cmV0dXJuIFZpKGhlLHQpfWZ1bmN0aW9uIFpvKHQpe3JldHVybiBLaShoZSx0KX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gR2koaGUsdCl9ZnVuY3Rpb24gQ28odCl7cmV0dXJuIFhpKGhlLHQpfWNvbnN0IGF0PWQoIlpvZFVSTCIsKHQsbik9Pnt2dS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBBbyh0KXtyZXR1cm4gbnIoYXQsdCl9ZnVuY3Rpb24gTG8odCl7cmV0dXJuIG5yKGF0LHtwcm90b2NvbDpQaSxob3N0bmFtZTpPYywuLi5oKHQpfSl9Y29uc3QgUXQ9ZCgiWm9kRW1vamkiLCh0LG4pPT57aHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTW8odCl7cmV0dXJuIFlpKFF0LHQpfWNvbnN0IGVuPWQoIlpvZE5hbm9JRCIsKHQsbik9PnskdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBxbyh0KXtyZXR1cm4gUWkoZW4sdCl9Y29uc3QgdG49ZCgiWm9kQ1VJRCIsKHQsbik9PntfdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBGbyh0KXtyZXR1cm4gZW8odG4sdCl9Y29uc3Qgbm49ZCgiWm9kQ1VJRDIiLCh0LG4pPT57YnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSm8odCl7cmV0dXJuIHRvKG5uLHQpfWNvbnN0IHJuPWQoIlpvZFVMSUQiLCh0LG4pPT57eXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSG8odCl7cmV0dXJuIG5vKHJuLHQpfWNvbnN0IG9uPWQoIlpvZFhJRCIsKHQsbik9PntrdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBXbyh0KXtyZXR1cm4gcm8ob24sdCl9Y29uc3QgYW49ZCgiWm9kS1NVSUQiLCh0LG4pPT57U3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gQm8odCl7cmV0dXJuIGlvKGFuLHQpfWNvbnN0IHNuPWQoIlpvZElQdjQiLCh0LG4pPT57VHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gVm8odCl7cmV0dXJuIG9vKHNuLHQpfWNvbnN0IG1yPWQoIlpvZE1BQyIsKHQsbik9PntPdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBLbyh0KXtyZXR1cm4gUGwobXIsdCl9Y29uc3QgY249ZCgiWm9kSVB2NiIsKHQsbik9PntqdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBHbyh0KXtyZXR1cm4gYW8oY24sdCl9Y29uc3QgdW49ZCgiWm9kQ0lEUnY0IiwodCxuKT0+e1V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIFhvKHQpe3JldHVybiBzbyh1bix0KX1jb25zdCBsbj1kKCJab2RDSURSdjYiLCh0LG4pPT57UHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gWW8odCl7cmV0dXJuIGNvKGxuLHQpfWNvbnN0IGRuPWQoIlpvZEJhc2U2NCIsKHQsbik9PntOdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gdW8oZG4sdCl9Y29uc3QgbW49ZCgiWm9kQmFzZTY0VVJMIiwodCxuKT0+e0V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIGVhKHQpe3JldHVybiBsbyhtbix0KX1jb25zdCBwbj1kKCJab2RFMTY0IiwodCxuKT0+e1p1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHRhKHQpe3JldHVybiBtbyhwbix0KX1jb25zdCBmbj1kKCJab2RKV1QiLCh0LG4pPT57Q3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHBvKGZuLHQpfWNvbnN0IE1lPWQoIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdCIsKHQsbik9PntBdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiByYSh0LG4scj17fSl7cmV0dXJuIEt0KE1lLHQsbixyKX1mdW5jdGlvbiBpYSh0KXtyZXR1cm4gS3QoTWUsImhvc3RuYW1lIixqYyx0KX1mdW5jdGlvbiBvYSh0KXtyZXR1cm4gS3QoTWUsImhleCIsSGMsdCl9ZnVuY3Rpb24gYWEodCxuKXtjb25zdCByPW4/LmVuYz8/ImhleCIsbz1gJHt0fV8ke3J9YCxlPVFuW29dO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke299YCk7cmV0dXJuIEt0KE1lLG8sZSxuKX1jb25zdCBzdD1kKCJab2ROdW1iZXIiLCh0LG4pPT57UmkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT5oZCh0LG8sZSksR3QodCwiWm9kTnVtYmVyIix7Z3QobyxlKXtyZXR1cm4gdGhpcy5jaGVjayhrZShvLGUpKX0sZ3RlKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soaWUobyxlKSl9LG1pbihvLGUpe3JldHVybiB0aGlzLmNoZWNrKGllKG8sZSkpfSxsdChvLGUpe3JldHVybiB0aGlzLmNoZWNrKHllKG8sZSkpfSxsdGUobyxlKXtyZXR1cm4gdGhpcy5jaGVjayh1ZShvLGUpKX0sbWF4KG8sZSl7cmV0dXJuIHRoaXMuY2hlY2sodWUobyxlKSl9LGludChvKXtyZXR1cm4gdGhpcy5jaGVjayh3dChvKSl9LHNhZmUobyl7cmV0dXJuIHRoaXMuY2hlY2sod3QobykpfSxwb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayhrZSgwLG8pKX0sbm9ubmVnYXRpdmUobyl7cmV0dXJuIHRoaXMuY2hlY2soaWUoMCxvKSl9LG5lZ2F0aXZlKG8pe3JldHVybiB0aGlzLmNoZWNrKHllKDAsbykpfSxub25wb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayh1ZSgwLG8pKX0sbXVsdGlwbGVPZihvLGUpe3JldHVybiB0aGlzLmNoZWNrKEVlKG8sZSkpfSxzdGVwKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soRWUobyxlKSl9LGZpbml0ZSgpe3JldHVybiB0aGlzfX0pO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPU1hdGgubWF4KHIubWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKT8/bnVsbCx0Lm1heFZhbHVlPU1hdGgubWluKHIubWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKT8/bnVsbCx0LmlzSW50PShyLmZvcm1hdD8/IiIpLmluY2x1ZGVzKCJpbnQiKXx8TnVtYmVyLmlzU2FmZUludGVnZXIoci5tdWx0aXBsZU9mPz8uNSksdC5pc0Zpbml0ZT0hMCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIFQodCl7cmV0dXJuIFJsKHN0LHQpfWNvbnN0IFRlPWQoIlpvZE51bWJlckZvcm1hdCIsKHQsbik9PntMdS5pbml0KHQsbiksc3QuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gd3QodCl7cmV0dXJuIEFsKFRlLHQpfWZ1bmN0aW9uIHNhKHQpe3JldHVybiBMbChUZSx0KX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gTWwoVGUsdCl9ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHFsKFRlLHQpfWZ1bmN0aW9uIGxhKHQpe3JldHVybiBGbChUZSx0KX1jb25zdCBjdD1kKCJab2RCb29sZWFuIiwodCxuKT0+e0NpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+JGQodCxyLG8pfSk7ZnVuY3Rpb24gWih0KXtyZXR1cm4gSmwoY3QsdCl9Y29uc3QgdXQ9ZCgiWm9kQmlnSW50IiwodCxuKT0+e0FpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+X2QodCxvKSx0Lmd0ZT0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lm1pbj0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lmd0PShvLGUpPT50LmNoZWNrKGtlKG8sZSkpLHQuZ3RlPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubHQ9KG8sZSk9PnQuY2hlY2soeWUobyxlKSksdC5sdGU9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5tYXg9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5wb3NpdGl2ZT1vPT50LmNoZWNrKGtlKEJpZ0ludCgwKSxvKSksdC5uZWdhdGl2ZT1vPT50LmNoZWNrKHllKEJpZ0ludCgwKSxvKSksdC5ub25wb3NpdGl2ZT1vPT50LmNoZWNrKHVlKEJpZ0ludCgwKSxvKSksdC5ub25uZWdhdGl2ZT1vPT50LmNoZWNrKGllKEJpZ0ludCgwKSxvKSksdC5tdWx0aXBsZU9mPShvLGUpPT50LmNoZWNrKEVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPXIubWluaW11bT8/bnVsbCx0Lm1heFZhbHVlPXIubWF4aW11bT8/bnVsbCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIGRhKHQpe3JldHVybiBXbCh1dCx0KX1jb25zdCBnbj1kKCJab2RCaWdJbnRGb3JtYXQiLCh0LG4pPT57TXUuaW5pdCh0LG4pLHV0LmluaXQodCxuKX0pO2Z1bmN0aW9uIG1hKHQpe3JldHVybiBWbChnbix0KX1mdW5jdGlvbiBwYSh0KXtyZXR1cm4gS2woZ24sdCl9Y29uc3QgcHI9ZCgiWm9kU3ltYm9sIiwodCxuKT0+e3F1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+YmQodCxyKX0pO2Z1bmN0aW9uIGZhKHQpe3JldHVybiBHbChwcix0KX1jb25zdCBmcj1kKCJab2RVbmRlZmluZWQiLCh0LG4pPT57RnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5rZCh0LHIpfSk7ZnVuY3Rpb24gWWUodCl7cmV0dXJuIFhsKGZyLHQpfWNvbnN0IGdyPWQoIlpvZE51bGwiLCh0LG4pPT57SnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT55ZCh0LHIsbyl9KTtmdW5jdGlvbiB2bih0KXtyZXR1cm4gWWwoZ3IsdCl9Y29uc3QgdnI9ZCgiWm9kQW55IiwodCxuKT0+e0h1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+SWQoKX0pO2Z1bmN0aW9uIGhuKCl7cmV0dXJuIFFsKHZyKX1jb25zdCBocj1kKCJab2RVbmtub3duIiwodCxuKT0+e1d1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+emQoKX0pO2Z1bmN0aW9uIEUoKXtyZXR1cm4gZWQoaHIpfWNvbnN0ICRyPWQoIlpvZE5ldmVyIiwodCxuKT0+e0J1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+d2QodCxyLG8pfSk7ZnVuY3Rpb24gWmUodCl7cmV0dXJuIHRkKCRyLHQpfWNvbnN0IF9yPWQoIlpvZFZvaWQiLCh0LG4pPT57VnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5TZCh0LHIpfSk7ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIG5kKF9yLHQpfWNvbnN0ICRuPWQoIlpvZERhdGUiLCh0LG4pPT57S3UuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT54ZCh0LG8pLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWF4PShvLGUpPT50LmNoZWNrKHVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pbkRhdGU9ci5taW5pbXVtP25ldyBEYXRlKHIubWluaW11bSk6bnVsbCx0Lm1heERhdGU9ci5tYXhpbXVtP25ldyBEYXRlKHIubWF4aW11bSk6bnVsbH0pO2Z1bmN0aW9uIHZhKHQpe3JldHVybiByZCgkbix0KX1jb25zdCBicj1kKCJab2RBcnJheSIsKHQsbik9PntHdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkFkKHQscixvLGUpLHQuZWxlbWVudD1uLmVsZW1lbnQsR3QodCwiWm9kQXJyYXkiLHttaW4ocixvKXtyZXR1cm4gdGhpcy5jaGVjayh6ZShyLG8pKX0sbm9uZW1wdHkocil7cmV0dXJuIHRoaXMuY2hlY2soemUoMSxyKSl9LG1heChyLG8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KHIsbykpfSxsZW5ndGgocixvKXtyZXR1cm4gdGhpcy5jaGVjayhpdChyLG8pKX0sdW53cmFwKCl7cmV0dXJuIHRoaXMuZWxlbWVudH19KX0pO2Z1bmN0aW9uIEkodCxuKXtyZXR1cm4gYWQoYnIsdCxuKX1mdW5jdGlvbiBoYSh0KXtjb25zdCBuPXQuX3pvZC5kZWYuc2hhcGU7cmV0dXJuIFEoT2JqZWN0LmtleXMobikpfWNvbnN0IGx0PWQoIlpvZE9iamVjdCIsKHQsbik9PntlbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkxkKHQscixvLGUpLE8odCwic2hhcGUiLCgpPT5uLnNoYXBlKSxHdCh0LCJab2RPYmplY3QiLHtrZXlvZigpe3JldHVybiBRKE9iamVjdC5rZXlzKHRoaXMuX3pvZC5kZWYuc2hhcGUpKX0sY2F0Y2hhbGwocil7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6cn0pfSxwYXNzdGhyb3VnaCgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxsb29zZSgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxzdHJpY3QoKXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4udGhpcy5fem9kLmRlZixjYXRjaGFsbDpaZSgpfSl9LHN0cmlwKCl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6dm9pZCAwfSl9LGV4dGVuZChyKXtyZXR1cm4gdGModGhpcyxyKX0sc2FmZUV4dGVuZChyKXtyZXR1cm4gbmModGhpcyxyKX0sbWVyZ2Uocil7cmV0dXJuIHJjKHRoaXMscil9LHBpY2socil7cmV0dXJuIFFzKHRoaXMscil9LG9taXQocil7cmV0dXJuIGVjKHRoaXMscil9LHBhcnRpYWwoLi4ucil7cmV0dXJuIGljKHluLHRoaXMsclswXSl9LHJlcXVpcmVkKC4uLnIpe3JldHVybiBvYyhrbix0aGlzLHJbMF0pfX0pfSk7ZnVuY3Rpb24gZih0LG4pe2NvbnN0IHI9e3R5cGU6Im9iamVjdCIsc2hhcGU6dD8/e30sLi4uaChuKX07cmV0dXJuIG5ldyBsdChyKX1mdW5jdGlvbiAkYSh0LG4pe3JldHVybiBuZXcgbHQoe3R5cGU6Im9iamVjdCIsc2hhcGU6dCxjYXRjaGFsbDpaZSgpLC4uLmgobil9KX1mdW5jdGlvbiBZKHQsbil7cmV0dXJuIG5ldyBsdCh7dHlwZToib2JqZWN0IixzaGFwZTp0LGNhdGNoYWxsOkUoKSwuLi5oKG4pfSl9Y29uc3QgZHQ9ZCgiWm9kVW5pb24iLCh0LG4pPT57ZXIuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gVSh0LG4pe3JldHVybiBuZXcgZHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnQsLi4uaChuKX0pfWNvbnN0IHlyPWQoIlpvZFhvciIsKHQsbik9PntkdC5pbml0KHQsbiksdGwuaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gX2EodCxuKXtyZXR1cm4gbmV3IHlyKHt0eXBlOiJ1bmlvbiIsb3B0aW9uczp0LGluY2x1c2l2ZTohMSwuLi5oKG4pfSl9Y29uc3Qga3I9ZCgiWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e2R0LmluaXQodCxuKSxubC5pbml0KHQsbil9KTtmdW5jdGlvbiBfbih0LG4scil7cmV0dXJuIG5ldyBrcih7dHlwZToidW5pb24iLG9wdGlvbnM6bixkaXNjcmltaW5hdG9yOnQsLi4uaChyKX0pfWNvbnN0IFNyPWQoIlpvZEludGVyc2VjdGlvbiIsKHQsbik9PntybC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk1kKHQscixvLGUpfSk7ZnVuY3Rpb24gbXQodCxuKXtyZXR1cm4gbmV3IFNyKHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6dCxyaWdodDpufSl9Y29uc3Qgd3I9ZCgiWm9kVHVwbGUiLCh0LG4pPT57TGkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5xZCh0LHIsbyxlKSx0LnJlc3Q9cj0+dC5jbG9uZSh7Li4udC5fem9kLmRlZixyZXN0OnJ9KX0pO2Z1bmN0aW9uIElyKHQsbixyKXtjb25zdCBvPW4gaW5zdGFuY2VvZiB4LGU9bz9yOm4saT1vP246bnVsbDtyZXR1cm4gbmV3IHdyKHt0eXBlOiJ0dXBsZSIsaXRlbXM6dCxyZXN0OmksLi4uaChlKX0pfWNvbnN0IFJlPWQoIlpvZFJlY29yZCIsKHQsbik9PntpbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkZkKHQscixvLGUpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGV9KTtmdW5jdGlvbiBQKHQsbixyKXtyZXR1cm4hbnx8IW4uX3pvZD9uZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTptKCksdmFsdWVUeXBlOnQsLi4uaChuKX0pOm5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIGJhKHQsbixyKXtjb25zdCBvPWRlKHQpO3JldHVybiBvLl96b2QudmFsdWVzPXZvaWQgMCxuZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTpvLHZhbHVlVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiB5YSh0LG4scil7cmV0dXJuIG5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sbW9kZToibG9vc2UiLC4uLmgocil9KX1jb25zdCB6cj1kKCJab2RNYXAiLCh0LG4pPT57b2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5SZCh0LHIpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGUsdC5taW49KC4uLnIpPT50LmNoZWNrKFNlKC4uLnIpKSx0Lm5vbmVtcHR5PXI9PnQuY2hlY2soU2UoMSxyKSksdC5tYXg9KC4uLnIpPT50LmNoZWNrKExlKC4uLnIpKSx0LnNpemU9KC4uLnIpPT50LmNoZWNrKG50KC4uLnIpKX0pO2Z1bmN0aW9uIGthKHQsbixyKXtyZXR1cm4gbmV3IHpyKHt0eXBlOiJtYXAiLGtleVR5cGU6dCx2YWx1ZVR5cGU6biwuLi5oKHIpfSl9Y29uc3QgeHI9ZCgiWm9kU2V0IiwodCxuKT0+e2FsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+Q2QodCxyKSx0Lm1pbj0oLi4ucik9PnQuY2hlY2soU2UoLi4ucikpLHQubm9uZW1wdHk9cj0+dC5jaGVjayhTZSgxLHIpKSx0Lm1heD0oLi4ucik9PnQuY2hlY2soTGUoLi4ucikpLHQuc2l6ZT0oLi4ucik9PnQuY2hlY2sobnQoLi4ucikpfSk7ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gbmV3IHhyKHt0eXBlOiJzZXQiLHZhbHVlVHlwZTp0LC4uLmgobil9KX1jb25zdCBDZT1kKCJab2RFbnVtIiwodCxuKT0+e3NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+VGQodCxvLGUpLHQuZW51bT1uLmVudHJpZXMsdC5vcHRpb25zPU9iamVjdC52YWx1ZXMobi5lbnRyaWVzKTtjb25zdCByPW5ldyBTZXQoT2JqZWN0LmtleXMobi5lbnRyaWVzKSk7dC5leHRyYWN0PShvLGUpPT57Y29uc3QgaT17fTtmb3IoY29uc3QgYSBvZiBvKWlmKHIuaGFzKGEpKWlbYV09bi5lbnRyaWVzW2FdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHthfSBub3QgZm91bmQgaW4gZW51bWApO3JldHVybiBuZXcgQ2Uoey4uLm4sY2hlY2tzOltdLC4uLmgoZSksZW50cmllczppfSl9LHQuZXhjbHVkZT0obyxlKT0+e2NvbnN0IGk9ey4uLm4uZW50cmllc307Zm9yKGNvbnN0IGEgb2YgbylpZihyLmhhcyhhKSlkZWxldGUgaVthXTtlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7YX0gbm90IGZvdW5kIGluIGVudW1gKTtyZXR1cm4gbmV3IENlKHsuLi5uLGNoZWNrczpbXSwuLi5oKGUpLGVudHJpZXM6aX0pfX0pO2Z1bmN0aW9uIFEodCxuKXtjb25zdCByPUFycmF5LmlzQXJyYXkodCk/T2JqZWN0LmZyb21FbnRyaWVzKHQubWFwKG89PltvLG9dKSk6dDtyZXR1cm4gbmV3IENlKHt0eXBlOiJlbnVtIixlbnRyaWVzOnIsLi4uaChuKX0pfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIG5ldyBDZSh7dHlwZToiZW51bSIsZW50cmllczp0LC4uLmgobil9KX1jb25zdCBUcj1kKCJab2RMaXRlcmFsIiwodCxuKT0+e2NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+amQodCxyLG8pLHQudmFsdWVzPW5ldyBTZXQobi52YWx1ZXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJ2YWx1ZSIse2dldCgpe2lmKG4udmFsdWVzLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC4iKTtyZXR1cm4gbi52YWx1ZXNbMF19fSl9KTtmdW5jdGlvbiBwKHQsbil7cmV0dXJuIG5ldyBUcih7dHlwZToibGl0ZXJhbCIsdmFsdWVzOkFycmF5LmlzQXJyYXkodCk/dDpbdF0sLi4uaChuKX0pfWNvbnN0IGpyPWQoIlpvZEZpbGUiLCh0LG4pPT57dWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5QZCh0LHIsbyksdC5taW49KHIsbyk9PnQuY2hlY2soU2UocixvKSksdC5tYXg9KHIsbyk9PnQuY2hlY2soTGUocixvKSksdC5taW1lPShyLG8pPT50LmNoZWNrKEZ0KEFycmF5LmlzQXJyYXkocik/cjpbcl0sbykpfSk7ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHNkKGpyLHQpfWNvbnN0IE9yPWQoIlpvZFRyYW5zZm9ybSIsKHQsbik9PntsbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlpkKHQsciksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXRocm93IG5ldyBXbih0LmNvbnN0cnVjdG9yLm5hbWUpO3IuYWRkSXNzdWU9aT0+e2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyLmlzc3Vlcy5wdXNoKFdlKGksci52YWx1ZSxuKSk7ZWxzZXtjb25zdCBhPWk7YS5mYXRhbCYmKGEuY29udGludWU9ITEpLGEuY29kZT8/KGEuY29kZT0iY3VzdG9tIiksYS5pbnB1dD8/KGEuaW5wdXQ9ci52YWx1ZSksYS5pbnN0Pz8oYS5pbnN0PXQpLHIuaXNzdWVzLnB1c2goV2UoYSkpfX07Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aSxyLmZhbGxiYWNrPSEwLHIpKTooci52YWx1ZT1lLHIuZmFsbGJhY2s9ITAscil9fSk7ZnVuY3Rpb24gYm4odCl7cmV0dXJuIG5ldyBPcih7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06dH0pfWNvbnN0IHluPWQoIlpvZE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gbmV3IHluKHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnR9KX1jb25zdCBVcj1kKCJab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e2RsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUHIodCl7cmV0dXJuIG5ldyBVcih7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTp0fSl9Y29uc3QgTnI9ZCgiWm9kTnVsbGFibGUiLCh0LG4pPT57bWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5KZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBRZSh0KXtyZXR1cm4gbmV3IE5yKHt0eXBlOiJudWxsYWJsZSIsaW5uZXJUeXBlOnR9KX1mdW5jdGlvbiB6YSh0KXtyZXR1cm4gcShRZSh0KSl9Y29uc3QgRHI9ZCgiWm9kRGVmYXVsdCIsKHQsbik9PntwbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PldkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZSx0LnJlbW92ZURlZmF1bHQ9dC51bndyYXB9KTtmdW5jdGlvbiBFcih0LG4pe3JldHVybiBuZXcgRHIoe3R5cGU6ImRlZmF1bHQiLGlubmVyVHlwZTp0LGdldCBkZWZhdWx0VmFsdWUoKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOlZuKG4pfX0pfWNvbnN0IFpyPWQoIlpvZFByZWZhdWx0IiwodCxuKT0+e2ZsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+QmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUnIodCxuKXtyZXR1cm4gbmV3IFpyKHt0eXBlOiJwcmVmYXVsdCIsaW5uZXJUeXBlOnQsZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKCk6Vm4obil9fSl9Y29uc3Qga249ZCgiWm9kTm9uT3B0aW9uYWwiLCh0LG4pPT57Z2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5IZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBDcih0LG4pe3JldHVybiBuZXcga24oe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6dCwuLi5oKG4pfSl9Y29uc3QgQXI9ZCgiWm9kU3VjY2VzcyIsKHQsbik9Pnt2bC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk5kKHQscixvKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiB4YSh0KXtyZXR1cm4gbmV3IEFyKHt0eXBlOiJzdWNjZXNzIixpbm5lclR5cGU6dH0pfWNvbnN0IExyPWQoIlpvZENhdGNoIiwodCxuKT0+e2hsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+VmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlLHQucmVtb3ZlQ2F0Y2g9dC51bndyYXB9KTtmdW5jdGlvbiBNcih0LG4pe3JldHVybiBuZXcgTHIoe3R5cGU6ImNhdGNoIixpbm5lclR5cGU6dCxjYXRjaFZhbHVlOnR5cGVvZiBuPT0iZnVuY3Rpb24iP246KCk9Pm59KX1jb25zdCBxcj1kKCJab2ROYU4iLCh0LG4pPT57JGwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5PZCh0LHIpfSk7ZnVuY3Rpb24gVGEodCl7cmV0dXJuIG9kKHFyLHQpfWNvbnN0IHB0PWQoIlpvZFBpcGUiLCh0LG4pPT57cWkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5LZCh0LHIsbyxlKSx0LmluPW4uaW4sdC5vdXQ9bi5vdXR9KTtmdW5jdGlvbiBJdCh0LG4pe3JldHVybiBuZXcgcHQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om59KX1jb25zdCBmdD1kKCJab2RDb2RlYyIsKHQsbik9PntwdC5pbml0KHQsbiksRmkuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gamEodCxuLHIpe3JldHVybiBuZXcgZnQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om4sdHJhbnNmb3JtOnIuZGVjb2RlLHJldmVyc2VUcmFuc2Zvcm06ci5lbmNvZGV9KX1mdW5jdGlvbiBPYSh0KXtjb25zdCBuPXQuX3pvZC5kZWY7cmV0dXJuIG5ldyBmdCh7dHlwZToicGlwZSIsaW46bi5vdXQsb3V0Om4uaW4sdHJhbnNmb3JtOm4ucmV2ZXJzZVRyYW5zZm9ybSxyZXZlcnNlVHJhbnNmb3JtOm4udHJhbnNmb3JtfSl9Y29uc3QgRnI9ZCgiWm9kUHJlcHJvY2VzcyIsKHQsbik9PntwdC5pbml0KHQsbiksX2wuaW5pdCh0LG4pfSksSnI9ZCgiWm9kUmVhZG9ubHkiLCh0LG4pPT57YmwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5HZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBIcih0KXtyZXR1cm4gbmV3IEpyKHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOnR9KX1jb25zdCBXcj1kKCJab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5VZCh0LHIsbyl9KTtmdW5jdGlvbiBVYSh0LG4pe3JldHVybiBuZXcgV3Ioe3R5cGU6InRlbXBsYXRlX2xpdGVyYWwiLHBhcnRzOnQsLi4uaChuKX0pfWNvbnN0IEJyPWQoIlpvZExhenkiLCh0LG4pPT57d2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5ZZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5nZXR0ZXIoKX0pO2Z1bmN0aW9uIFZyKHQpe3JldHVybiBuZXcgQnIoe3R5cGU6ImxhenkiLGdldHRlcjp0fSl9Y29uc3QgS3I9ZCgiWm9kUHJvbWlzZSIsKHQsbik9PntTbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlhkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIFBhKHQpe3JldHVybiBuZXcgS3Ioe3R5cGU6InByb21pc2UiLGlubmVyVHlwZTp0fSl9Y29uc3QgR3I9ZCgiWm9kRnVuY3Rpb24iLCh0LG4pPT57a2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5FZCh0LHIpfSk7ZnVuY3Rpb24gZXQodCl7cmV0dXJuIG5ldyBHcih7dHlwZToiZnVuY3Rpb24iLGlucHV0OkFycmF5LmlzQXJyYXkodD8uaW5wdXQpP0lyKHQ/LmlucHV0KTp0Py5pbnB1dD8/SShFKCkpLG91dHB1dDp0Py5vdXRwdXQ/P0UoKX0pfWNvbnN0IGd0PWQoIlpvZEN1c3RvbSIsKHQsbik9PntJbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkRkKHQscil9KTtmdW5jdGlvbiBOYSh0KXtjb25zdCBuPW5ldyBKKHtjaGVjazoiY3VzdG9tIn0pO3JldHVybiBuLl96b2QuY2hlY2s9dCxufWZ1bmN0aW9uIFhyKHQsbil7cmV0dXJuIGNkKGd0LHQ/PygoKT0+ITApLG4pfWZ1bmN0aW9uIFlyKHQsbj17fSl7cmV0dXJuIHVkKGd0LHQsbil9ZnVuY3Rpb24gUXIodCxuKXtyZXR1cm4gbGQodCxuKX1jb25zdCBEYT1tZCxFYT1wZDtmdW5jdGlvbiBaYSh0LG49e30pe2NvbnN0IHI9bmV3IGd0KHt0eXBlOiJjdXN0b20iLGNoZWNrOiJjdXN0b20iLGZuOm89Pm8gaW5zdGFuY2VvZiB0LGFib3J0OiEwLC4uLmgobil9KTtyZXR1cm4gci5fem9kLmJhZy5DbGFzcz10LHIuX3pvZC5jaGVjaz1vPT57by52YWx1ZSBpbnN0YW5jZW9mIHR8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6dC5uYW1lLGlucHV0Om8udmFsdWUsaW5zdDpyLHBhdGg6Wy4uLnIuX3pvZC5kZWYucGF0aD8/W11dfSl9LHJ9Y29uc3QgUmE9KC4uLnQpPT5mZCh7Q29kZWM6ZnQsQm9vbGVhbjpjdCxTdHJpbmc6b3R9LC4uLnQpO2Z1bmN0aW9uIENhKHQpe2NvbnN0IG49VnIoKCk9PlUoW20odCksVCgpLFooKSx2bigpLEkobiksUChtKCksbildKSk7cmV0dXJuIG59ZnVuY3Rpb24gU24odCxuKXtyZXR1cm4gbmV3IEZyKHt0eXBlOiJwaXBlIixpbjpibih0KSxvdXQ6bn0pfWNvbnN0IGl2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZEludGVyc2VjdGlvbjpTcixab2RKV1Q6Zm4sWm9kS1NVSUQ6YW4sWm9kTGF6eTpCcixab2RMaXRlcmFsOlRyLFpvZE1BQzptcixab2RNYXA6enIsWm9kTmFOOnFyLFpvZE5hbm9JRDplbixab2ROZXZlcjokcixab2ROb25PcHRpb25hbDprbixab2ROdWxsOmdyLFpvZE51bGxhYmxlOk5yLFpvZE51bWJlcjpzdCxab2ROdW1iZXJGb3JtYXQ6VGUsWm9kT2JqZWN0Omx0LFpvZE9wdGlvbmFsOnluLFpvZFBpcGU6cHQsWm9kUHJlZmF1bHQ6WnIsWm9kUHJlcHJvY2VzczpGcixab2RQcm9taXNlOktyLFpvZFJlYWRvbmx5OkpyLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNvZGVjOmphLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW51bTpRLGV4YWN0T3B0aW9uYWw6UHIsZmlsZTpJYSxmbG9hdDMyOnNhLGZsb2F0NjQ6Y2EsZnVuY3Rpb246ZXQsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28sanNvbjpDYSxqd3Q6bmEsa2V5b2Y6aGEsa3N1aWQ6Qm8sbGF6eTpWcixsaXRlcmFsOnAsbG9vc2VPYmplY3Q6WSxsb29zZVJlY29yZDp5YSxtYWM6S28sbWFwOmthLG1ldGE6RWEsbmFuOlRhLG5hbm9pZDpxbyxuYXRpdmVFbnVtOndhLG5ldmVyOlplLG5vbm9wdGlvbmFsOkNyLG51bGw6dm4sbnVsbGFibGU6UWUsbnVsbGlzaDp6YSxudW1iZXI6VCxvYmplY3Q6ZixvcHRpb25hbDpxLHBhcnRpYWxSZWNvcmQ6YmEscGlwZTpJdCxwcmVmYXVsdDpScixwcmVwcm9jZXNzOlNuLHByb21pc2U6UGEscmVhZG9ubHk6SHIscmVjb3JkOlAscmVmaW5lOllyLHNldDpTYSxzdHJpY3RPYmplY3Q6JGEsc3RyaW5nOm0sc3RyaW5nRm9ybWF0OnJhLHN0cmluZ2Jvb2w6UmEsc3VjY2Vzczp4YSxzdXBlclJlZmluZTpRcixzeW1ib2w6ZmEsdGVtcGxhdGVMaXRlcmFsOlVhLHRyYW5zZm9ybTpibix0dXBsZTpJcix1aW50MzI6bGEsdWludDY0OnBhLHVsaWQ6SG8sdW5kZWZpbmVkOlllLHVuaW9uOlUsdW5rbm93bjpFLHVybDpBbyx1dWlkOkVvLHV1aWR2NDpabyx1dWlkdjY6Um8sdXVpZHY3OkNvLHZvaWQ6Z2EseGlkOldvLHhvcjpfYX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxhbT17aW52YWxpZF90eXBlOiJpbnZhbGlkX3R5cGUiLHRvb19iaWc6InRvb19iaWciLHRvb19zbWFsbDoidG9vX3NtYWxsIixpbnZhbGlkX2Zvcm1hdDoiaW52YWxpZF9mb3JtYXQiLG5vdF9tdWx0aXBsZV9vZjoibm90X211bHRpcGxlX29mIix1bnJlY29nbml6ZWRfa2V5czoidW5yZWNvZ25pemVkX2tleXMiLGludmFsaWRfdW5pb246ImludmFsaWRfdW5pb24iLGludmFsaWRfa2V5OiJpbnZhbGlkX2tleSIsaW52YWxpZF9lbGVtZW50OiJpbnZhbGlkX2VsZW1lbnQiLGludmFsaWRfdmFsdWU6ImludmFsaWRfdmFsdWUiLGN1c3RvbToiY3VzdG9tIn07ZnVuY3Rpb24gc20odCl7Syh7Y3VzdG9tRXJyb3I6dH0pfWZ1bmN0aW9uIGNtKCl7cmV0dXJuIEsoKS5jdXN0b21FcnJvcn12YXIgTW47TW58fChNbj17fSk7Y29uc3QgYj17Li4uaXYsLi4ucnYsaXNvOmJvfSxvdj1uZXcgU2V0KFsiJHNjaGVtYSIsIiRyZWYiLCIkZGVmcyIsImRlZmluaXRpb25zIiwiJGlkIiwiaWQiLCIkY29tbWVudCIsIiRhbmNob3IiLCIkdm9jYWJ1bGFyeSIsIiRkeW5hbWljUmVmIiwiJGR5bmFtaWNBbmNob3IiLCJ0eXBlIiwiZW51bSIsImNvbnN0IiwiYW55T2YiLCJvbmVPZiIsImFsbE9mIiwibm90IiwicHJvcGVydGllcyIsInJlcXVpcmVkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInByb3BlcnR5TmFtZXMiLCJtaW5Qcm9wZXJ0aWVzIiwibWF4UHJvcGVydGllcyIsIml0ZW1zIiwicHJlZml4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJjb250YWlucyIsIm1pbkNvbnRhaW5zIiwibWF4Q29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuIiwiZm9ybWF0IiwibWluaW11bSIsIm1heGltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJkZXNjcmlwdGlvbiIsImRlZmF1bHQiLCJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSIsInVuZXZhbHVhdGVkSXRlbXMiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLCJpZiIsInRoZW4iLCJlbHNlIiwiZGVwZW5kZW50U2NoZW1hcyIsImRlcGVuZGVudFJlcXVpcmVkIiwibnVsbGFibGUiLCJyZWFkT25seSJdKTtmdW5jdGlvbiBhdih0LG4pe2NvbnN0IHI9dC4kc2NoZW1hO3JldHVybiByPT09Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIj8iZHJhZnQtMjAyMC0xMiI6cj09PSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiPyJkcmFmdC03IjpyPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI/ImRyYWZ0LTQiOm4/PyJkcmFmdC0yMDIwLTEyIn1mdW5jdGlvbiBzdih0LG4pe2lmKCF0LnN0YXJ0c1dpdGgoIiMiKSl0aHJvdyBuZXcgRXJyb3IoIkV4dGVybmFsICRyZWYgaXMgbm90IHN1cHBvcnRlZCwgb25seSBsb2NhbCByZWZzICgjLy4uLikgYXJlIGFsbG93ZWQiKTtjb25zdCByPXQuc2xpY2UoMSkuc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7aWYoci5sZW5ndGg9PT0wKXJldHVybiBuLnJvb3RTY2hlbWE7Y29uc3Qgbz1uLnZlcnNpb249PT0iZHJhZnQtMjAyMC0xMiI/IiRkZWZzIjoiZGVmaW5pdGlvbnMiO2lmKHJbMF09PT1vKXtjb25zdCBlPXJbMV07aWYoIWV8fCFuLmRlZnNbZV0pdGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2Ugbm90IGZvdW5kOiAke3R9YCk7cmV0dXJuIG4uZGVmc1tlXX10aHJvdyBuZXcgRXJyb3IoYFJlZmVyZW5jZSBub3QgZm91bmQ6ICR7dH1gKX1mdW5jdGlvbiB1bSh0LG4pe2lmKHQubm90IT09dm9pZCAwKXtpZih0eXBlb2YgdC5ub3Q9PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0Lm5vdCkubGVuZ3RoPT09MClyZXR1cm4gYi5uZXZlcigpO3Rocm93IG5ldyBFcnJvcigibm90IGlzIG5vdCBzdXBwb3J0ZWQgaW4gWm9kIChleGNlcHQgeyBub3Q6IHt9IH0gZm9yIG5ldmVyKSIpfWlmKHQudW5ldmFsdWF0ZWRJdGVtcyE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoInVuZXZhbHVhdGVkSXRlbXMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKHQudW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmlmIT09dm9pZCAwfHx0LnRoZW4hPT12b2lkIDB8fHQuZWxzZSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvbmRpdGlvbmFsIHNjaGVtYXMgKGlmL3RoZW4vZWxzZSkgYXJlIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmRlcGVuZGVudFNjaGVtYXMhPT12b2lkIDB8fHQuZGVwZW5kZW50UmVxdWlyZWQhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJkZXBlbmRlbnRTY2hlbWFzIGFuZCBkZXBlbmRlbnRSZXF1aXJlZCBhcmUgbm90IHN1cHBvcnRlZCIpO2lmKHQuJHJlZil7Y29uc3QgZT10LiRyZWY7aWYobi5yZWZzLmhhcyhlKSlyZXR1cm4gbi5yZWZzLmdldChlKTtpZihuLnByb2Nlc3NpbmcuaGFzKGUpKXJldHVybiBiLmxhenkoKCk9PntpZighbi5yZWZzLmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZWZzLmdldChlKX0pO24ucHJvY2Vzc2luZy5hZGQoZSk7Y29uc3QgaT1zdihlLG4pLGE9bmUoaSxuKTtyZXR1cm4gbi5yZWZzLnNldChlLGEpLG4ucHJvY2Vzc2luZy5kZWxldGUoZSksYX1pZih0LmVudW0hPT12b2lkIDApe2NvbnN0IGU9dC5lbnVtO2lmKG4udmVyc2lvbj09PSJvcGVuYXBpLTMuMCImJnQubnVsbGFibGU9PT0hMCYmZS5sZW5ndGg9PT0xJiZlWzBdPT09bnVsbClyZXR1cm4gYi5udWxsKCk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBiLm5ldmVyKCk7aWYoZS5sZW5ndGg9PT0xKXJldHVybiBiLmxpdGVyYWwoZVswXSk7aWYoZS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpKXJldHVybiBiLmVudW0oZSk7Y29uc3QgaT1lLm1hcChhPT5iLmxpdGVyYWwoYSkpO3JldHVybiBpLmxlbmd0aDwyP2lbMF06Yi51bmlvbihbaVswXSxpWzFdLC4uLmkuc2xpY2UoMildKX1pZih0LmNvbnN0IT09dm9pZCAwKXJldHVybiBiLmxpdGVyYWwodC5jb25zdCk7Y29uc3Qgcj10LnR5cGU7aWYoQXJyYXkuaXNBcnJheShyKSl7Y29uc3QgZT1yLm1hcChpPT57Y29uc3QgYT17Li4udCx0eXBlOml9O3JldHVybiB1bShhLG4pfSk7cmV0dXJuIGUubGVuZ3RoPT09MD9iLm5ldmVyKCk6ZS5sZW5ndGg9PT0xP2VbMF06Yi51bmlvbihlKX1pZighcilyZXR1cm4gYi5hbnkoKTtsZXQgbztzd2l0Y2gocil7Y2FzZSJzdHJpbmciOntsZXQgZT1iLnN0cmluZygpO2lmKHQuZm9ybWF0KXtjb25zdCBpPXQuZm9ybWF0O2k9PT0iZW1haWwiP2U9ZS5jaGVjayhiLmVtYWlsKCkpOmk9PT0idXJpInx8aT09PSJ1cmktcmVmZXJlbmNlIj9lPWUuY2hlY2soYi51cmwoKSk6aT09PSJ1dWlkInx8aT09PSJndWlkIj9lPWUuY2hlY2soYi51dWlkKCkpOmk9PT0iZGF0ZS10aW1lIj9lPWUuY2hlY2soYi5pc28uZGF0ZXRpbWUoKSk6aT09PSJkYXRlIj9lPWUuY2hlY2soYi5pc28uZGF0ZSgpKTppPT09InRpbWUiP2U9ZS5jaGVjayhiLmlzby50aW1lKCkpOmk9PT0iZHVyYXRpb24iP2U9ZS5jaGVjayhiLmlzby5kdXJhdGlvbigpKTppPT09ImlwdjQiP2U9ZS5jaGVjayhiLmlwdjQoKSk6aT09PSJpcHY2Ij9lPWUuY2hlY2soYi5pcHY2KCkpOmk9PT0ibWFjIj9lPWUuY2hlY2soYi5tYWMoKSk6aT09PSJjaWRyIj9lPWUuY2hlY2soYi5jaWRydjQoKSk6aT09PSJjaWRyLXY2Ij9lPWUuY2hlY2soYi5jaWRydjYoKSk6aT09PSJiYXNlNjQiP2U9ZS5jaGVjayhiLmJhc2U2NCgpKTppPT09ImJhc2U2NHVybCI/ZT1lLmNoZWNrKGIuYmFzZTY0dXJsKCkpOmk9PT0iZTE2NCI/ZT1lLmNoZWNrKGIuZTE2NCgpKTppPT09Imp3dCI/ZT1lLmNoZWNrKGIuand0KCkpOmk9PT0iZW1vamkiP2U9ZS5jaGVjayhiLmVtb2ppKCkpOmk9PT0ibmFub2lkIj9lPWUuY2hlY2soYi5uYW5vaWQoKSk6aT09PSJjdWlkIj9lPWUuY2hlY2soYi5jdWlkKCkpOmk9PT0iY3VpZDIiP2U9ZS5jaGVjayhiLmN1aWQyKCkpOmk9PT0idWxpZCI/ZT1lLmNoZWNrKGIudWxpZCgpKTppPT09InhpZCI/ZT1lLmNoZWNrKGIueGlkKCkpOmk9PT0ia3N1aWQiJiYoZT1lLmNoZWNrKGIua3N1aWQoKSkpfXR5cGVvZiB0Lm1pbkxlbmd0aD09Im51bWJlciImJihlPWUubWluKHQubWluTGVuZ3RoKSksdHlwZW9mIHQubWF4TGVuZ3RoPT0ibnVtYmVyIiYmKGU9ZS5tYXgodC5tYXhMZW5ndGgpKSx0LnBhdHRlcm4mJihlPWUucmVnZXgobmV3IFJlZ0V4cCh0LnBhdHRlcm4pKSksbz1lO2JyZWFrfWNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOntsZXQgZT1yPT09ImludGVnZXIiP2IubnVtYmVyKCkuaW50KCk6Yi5udW1iZXIoKTt0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5taW4odC5taW5pbXVtKSksdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubWF4KHQubWF4aW11bSkpLHR5cGVvZiB0LmV4Y2x1c2l2ZU1pbmltdW09PSJudW1iZXIiP2U9ZS5ndCh0LmV4Y2x1c2l2ZU1pbmltdW0pOnQuZXhjbHVzaXZlTWluaW11bT09PSEwJiZ0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5ndCh0Lm1pbmltdW0pKSx0eXBlb2YgdC5leGNsdXNpdmVNYXhpbXVtPT0ibnVtYmVyIj9lPWUubHQodC5leGNsdXNpdmVNYXhpbXVtKTp0LmV4Y2x1c2l2ZU1heGltdW09PT0hMCYmdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubHQodC5tYXhpbXVtKSksdHlwZW9mIHQubXVsdGlwbGVPZj09Im51bWJlciImJihlPWUubXVsdGlwbGVPZih0Lm11bHRpcGxlT2YpKSxvPWU7YnJlYWt9Y2FzZSJib29sZWFuIjp7bz1iLmJvb2xlYW4oKTticmVha31jYXNlIm51bGwiOntvPWIubnVsbCgpO2JyZWFrfWNhc2Uib2JqZWN0Ijp7Y29uc3QgZT17fSxpPXQucHJvcGVydGllc3x8e30sYT1uZXcgU2V0KHQucmVxdWlyZWR8fFtdKTtmb3IoY29uc3RbYyx1XW9mIE9iamVjdC5lbnRyaWVzKGkpKXtjb25zdCBsPW5lKHUsbik7ZVtjXT1hLmhhcyhjKT9sOmwub3B0aW9uYWwoKX1pZih0LnByb3BlcnR5TmFtZXMpe2NvbnN0IGM9bmUodC5wcm9wZXJ0eU5hbWVzLG4pLHU9dC5hZGRpdGlvbmFsUHJvcGVydGllcyYmdHlwZW9mIHQuYWRkaXRpb25hbFByb3BlcnRpZXM9PSJvYmplY3QiP25lKHQuYWRkaXRpb25hbFByb3BlcnRpZXMsbik6Yi5hbnkoKTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg9PT0wKXtvPWIucmVjb3JkKGMsdSk7YnJlYWt9Y29uc3QgbD1iLm9iamVjdChlKS5wYXNzdGhyb3VnaCgpLGc9Yi5sb29zZVJlY29yZChjLHUpO289Yi5pbnRlcnNlY3Rpb24obCxnKTticmVha31pZih0LnBhdHRlcm5Qcm9wZXJ0aWVzKXtjb25zdCBjPXQucGF0dGVyblByb3BlcnRpZXMsdT1PYmplY3Qua2V5cyhjKSxsPVtdO2Zvcihjb25zdCB2IG9mIHUpe2NvbnN0ICQ9bmUoY1t2XSxuKSx5PWIuc3RyaW5nKCkucmVnZXgobmV3IFJlZ0V4cCh2KSk7bC5wdXNoKGIubG9vc2VSZWNvcmQoeSwkKSl9Y29uc3QgZz1bXTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmZy5wdXNoKGIub2JqZWN0KGUpLnBhc3N0aHJvdWdoKCkpLGcucHVzaCguLi5sKSxnLmxlbmd0aD09PTApbz1iLm9iamVjdCh7fSkucGFzc3Rocm91Z2goKTtlbHNlIGlmKGcubGVuZ3RoPT09MSlvPWdbMF07ZWxzZXtsZXQgdj1iLmludGVyc2VjdGlvbihnWzBdLGdbMV0pO2ZvcihsZXQgJD0yOyQ8Zy5sZW5ndGg7JCsrKXY9Yi5pbnRlcnNlY3Rpb24odixnWyRdKTtvPXZ9YnJlYWt9Y29uc3Qgcz1iLm9iamVjdChlKTt0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT09ITE/bz1zLnN0cmljdCgpOnR5cGVvZiB0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT0ib2JqZWN0Ij9vPXMuY2F0Y2hhbGwobmUodC5hZGRpdGlvbmFsUHJvcGVydGllcyxuKSk6bz1zLnBhc3N0aHJvdWdoKCk7YnJlYWt9Y2FzZSJhcnJheSI6e2NvbnN0IGU9dC5wcmVmaXhJdGVtcyxpPXQuaXRlbXM7aWYoZSYmQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgYT1lLm1hcChjPT5uZShjLG4pKSxzPWkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSk/bmUoaSxuKTp2b2lkIDA7cz9vPWIudHVwbGUoYSkucmVzdChzKTpvPWIudHVwbGUoYSksdHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWluTGVuZ3RoKHQubWluSXRlbXMpKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWF4TGVuZ3RoKHQubWF4SXRlbXMpKSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtjb25zdCBhPWkubWFwKGM9Pm5lKGMsbikpLHM9dC5hZGRpdGlvbmFsSXRlbXMmJnR5cGVvZiB0LmFkZGl0aW9uYWxJdGVtcz09Im9iamVjdCI/bmUodC5hZGRpdGlvbmFsSXRlbXMsbik6dm9pZCAwO3M/bz1iLnR1cGxlKGEpLnJlc3Qocyk6bz1iLnR1cGxlKGEpLHR5cGVvZiB0Lm1pbkl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1pbkxlbmd0aCh0Lm1pbkl0ZW1zKSkpLHR5cGVvZiB0Lm1heEl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1heExlbmd0aCh0Lm1heEl0ZW1zKSkpfWVsc2UgaWYoaSE9PXZvaWQgMCl7Y29uc3QgYT1uZShpLG4pO2xldCBzPWIuYXJyYXkoYSk7dHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYocz1zLm1pbih0Lm1pbkl0ZW1zKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYocz1zLm1heCh0Lm1heEl0ZW1zKSksbz1zfWVsc2Ugbz1iLmFycmF5KGIuYW55KCkpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3J9YCl9cmV0dXJuIG99ZnVuY3Rpb24gbmUodCxuKXtpZih0eXBlb2YgdD09ImJvb2xlYW4iKXJldHVybiB0P2IuYW55KCk6Yi5uZXZlcigpO2xldCByPXVtKHQsbik7Y29uc3Qgbz10LnR5cGV8fHQuZW51bSE9PXZvaWQgMHx8dC5jb25zdCE9PXZvaWQgMDtpZih0LmFueU9mJiZBcnJheS5pc0FycmF5KHQuYW55T2YpKXtjb25zdCBzPXQuYW55T2YubWFwKHU9Pm5lKHUsbikpLGM9Yi51bmlvbihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQub25lT2YmJkFycmF5LmlzQXJyYXkodC5vbmVPZikpe2NvbnN0IHM9dC5vbmVPZi5tYXAodT0+bmUodSxuKSksYz1iLnhvcihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQuYWxsT2YmJkFycmF5LmlzQXJyYXkodC5hbGxPZikpaWYodC5hbGxPZi5sZW5ndGg9PT0wKXI9bz9yOmIuYW55KCk7ZWxzZXtsZXQgcz1vP3I6bmUodC5hbGxPZlswXSxuKTtjb25zdCBjPW8/MDoxO2ZvcihsZXQgdT1jO3U8dC5hbGxPZi5sZW5ndGg7dSsrKXM9Yi5pbnRlcnNlY3Rpb24ocyxuZSh0LmFsbE9mW3VdLG4pKTtyPXN9dC5udWxsYWJsZT09PSEwJiZuLnZlcnNpb249PT0ib3BlbmFwaS0zLjAiJiYocj1iLm51bGxhYmxlKHIpKSx0LnJlYWRPbmx5PT09ITAmJihyPWIucmVhZG9ubHkocikpLHQuZGVmYXVsdCE9PXZvaWQgMCYmKHI9ci5kZWZhdWx0KHQuZGVmYXVsdCkpO2NvbnN0IGU9e30saT1bIiRpZCIsImlkIiwiJGNvbW1lbnQiLCIkYW5jaG9yIiwiJHZvY2FidWxhcnkiLCIkZHluYW1pY1JlZiIsIiRkeW5hbWljQW5jaG9yIl07Zm9yKGNvbnN0IHMgb2YgaSlzIGluIHQmJihlW3NdPXRbc10pO2NvbnN0IGE9WyJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSJdO2Zvcihjb25zdCBzIG9mIGEpcyBpbiB0JiYoZVtzXT10W3NdKTtmb3IoY29uc3QgcyBvZiBPYmplY3Qua2V5cyh0KSlvdi5oYXMocyl8fChlW3NdPXRbc10pO3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmbi5yZWdpc3RyeS5hZGQocixlKSx0LmRlc2NyaXB0aW9uJiYocj1yLmRlc2NyaWJlKHQuZGVzY3JpcHRpb24pKSxyfWZ1bmN0aW9uIGxtKHQsbil7aWYodHlwZW9mIHQ9PSJib29sZWFuIilyZXR1cm4gdD9iLmFueSgpOmIubmV2ZXIoKTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoImZyb21KU09OU2NoZW1hIGlucHV0IGlzIG5vdCB2YWxpZCBKU09OIChwb3NzaWJseSBjeWNsaWMpOyB1c2UgJGRlZnMvJHJlZiBmb3IgcmVjdXJzaXZlIHNjaGVtYXMiKX1jb25zdCBvPWF2KHIsbj8uZGVmYXVsdFRhcmdldCksZT1yLiRkZWZzfHxyLmRlZmluaXRpb25zfHx7fSxpPXt2ZXJzaW9uOm8sZGVmczplLHJlZnM6bmV3IE1hcCxwcm9jZXNzaW5nOm5ldyBTZXQscm9vdFNjaGVtYTpyLHJlZ2lzdHJ5Om4/LnJlZ2lzdHJ5Pz9jZX07cmV0dXJuIG5lKHIsaSl9ZnVuY3Rpb24gY3YodCl7cmV0dXJuIFVsKG90LHQpfWZ1bmN0aW9uIHV2KHQpe3JldHVybiBDbChzdCx0KX1mdW5jdGlvbiBsdih0KXtyZXR1cm4gSGwoY3QsdCl9ZnVuY3Rpb24gZHYodCl7cmV0dXJuIEJsKHV0LHQpfWZ1bmN0aW9uIG12KHQpe3JldHVybiBpZCgkbix0KX1jb25zdCBkbT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYmlnaW50OmR2LGJvb2xlYW46bHYsZGF0ZTptdixudW1iZXI6dXYsc3RyaW5nOmN2fSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO0soemwoKSk7Y29uc3QgUnM9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLCRicmFuZDpnaSwkaW5wdXQ6V2ksJG91dHB1dDpIaSxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLFpvZEFueTp2cixab2RBcnJheTpicixab2RCYXNlNjQ6ZG4sWm9kQmFzZTY0VVJMOm1uLFpvZEJpZ0ludDp1dCxab2RCaWdJbnRGb3JtYXQ6Z24sWm9kQm9vbGVhbjpjdCxab2RDSURSdjQ6dW4sWm9kQ0lEUnY2OmxuLFpvZENVSUQ6dG4sWm9kQ1VJRDI6bm4sWm9kQ2F0Y2g6THIsWm9kQ29kZWM6ZnQsWm9kQ3VzdG9tOmd0LFpvZEN1c3RvbVN0cmluZ0Zvcm1hdDpNZSxab2REYXRlOiRuLFpvZERlZmF1bHQ6RHIsWm9kRGlzY3JpbWluYXRlZFVuaW9uOmtyLFpvZEUxNjQ6cG4sWm9kRW1haWw6WXQsWm9kRW1vamk6UXQsWm9kRW51bTpDZSxab2RFcnJvcjpvbSxab2RFeGFjdE9wdGlvbmFsOlVyLFpvZEZpbGU6anIsZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCgpe3JldHVybiBNbn0sWm9kRnVuY3Rpb246R3IsWm9kR1VJRDpYZSxab2RJUHY0OnNuLFpvZElQdjY6Y24sWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLFpvZEludGVyc2VjdGlvbjpTcixab2RJc3N1ZUNvZGU6YW0sWm9kSldUOmZuLFpvZEtTVUlEOmFuLFpvZExhenk6QnIsWm9kTGl0ZXJhbDpUcixab2RNQUM6bXIsWm9kTWFwOnpyLFpvZE5hTjpxcixab2ROYW5vSUQ6ZW4sWm9kTmV2ZXI6JHIsWm9kTm9uT3B0aW9uYWw6a24sWm9kTnVsbDpncixab2ROdWxsYWJsZTpOcixab2ROdW1iZXI6c3QsWm9kTnVtYmVyRm9ybWF0OlRlLFpvZE9iamVjdDpsdCxab2RPcHRpb25hbDp5bixab2RQaXBlOnB0LFpvZFByZWZhdWx0OlpyLFpvZFByZXByb2Nlc3M6RnIsWm9kUHJvbWlzZTpLcixab2RSZWFkb25seTpKcixab2RSZWFsRXJyb3I6c2UsWm9kUmVjb3JkOlJlLFpvZFNldDp4cixab2RTdHJpbmc6b3QsWm9kU3RyaW5nRm9ybWF0OkEsWm9kU3VjY2VzczpBcixab2RTeW1ib2w6cHIsWm9kVGVtcGxhdGVMaXRlcmFsOldyLFpvZFRyYW5zZm9ybTpPcixab2RUdXBsZTp3cixab2RUeXBlOmosWm9kVUxJRDpybixab2RVUkw6YXQsWm9kVVVJRDpoZSxab2RVbmRlZmluZWQ6ZnIsWm9kVW5pb246ZHQsWm9kVW5rbm93bjpocixab2RWb2lkOl9yLFpvZFhJRDpvbixab2RYb3I6eXIsX1pvZFN0cmluZzpYdCxfZGVmYXVsdDpFcixfZnVuY3Rpb246ZXQsYW55OmhuLGFycmF5OkksYmFzZTY0OlFvLGJhc2U2NHVybDplYSxiaWdpbnQ6ZGEsYm9vbGVhbjpaLGNhdGNoOk1yLGNoZWNrOk5hLGNpZHJ2NDpYbyxjaWRydjY6WW8sY2xvbmU6ZGUsY29kZWM6amEsY29lcmNlOmRtLGNvbmZpZzpLLGNvcmU6UWQsY3VpZDpGbyxjdWlkMjpKbyxjdXN0b206WHIsZGF0ZTp2YSxkZWNvZGU6em8sZGVjb2RlQXN5bmM6VG8sZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLHB2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkYnJhbmQ6Z2ksJGlucHV0OldpLCRvdXRwdXQ6SGksTkVWRVI6ZmksVGltZVByZWNpc2lvbjpmbyxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXJyb3I6b20sWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKXtyZXR1cm4gTW59LFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZElTT0RhdGU6dXIsWm9kSVNPRGF0ZVRpbWU6Y3IsWm9kSVNPRHVyYXRpb246ZHIsWm9kSVNPVGltZTpscixab2RJbnRlcnNlY3Rpb246U3IsWm9kSXNzdWVDb2RlOmFtLFpvZEpXVDpmbixab2RLU1VJRDphbixab2RMYXp5OkJyLFpvZExpdGVyYWw6VHIsWm9kTUFDOm1yLFpvZE1hcDp6cixab2ROYU46cXIsWm9kTmFub0lEOmVuLFpvZE5ldmVyOiRyLFpvZE5vbk9wdGlvbmFsOmtuLFpvZE51bGw6Z3IsWm9kTnVsbGFibGU6TnIsWm9kTnVtYmVyOnN0LFpvZE51bWJlckZvcm1hdDpUZSxab2RPYmplY3Q6bHQsWm9kT3B0aW9uYWw6eW4sWm9kUGlwZTpwdCxab2RQcmVmYXVsdDpacixab2RQcmVwcm9jZXNzOkZyLFpvZFByb21pc2U6S3IsWm9kUmVhZG9ubHk6SnIsWm9kUmVhbEVycm9yOnNlLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNsb25lOmRlLGNvZGVjOmphLGNvZXJjZTpkbSxjb25maWc6Syxjb3JlOlFkLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVjb2RlOnpvLGRlY29kZUFzeW5jOlRvLGRlZmF1bHQ6UnMsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hLHo6UnN9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksT2U9ImlvLm1vZGVsY29udGV4dHByb3RvY29sL3JlbGF0ZWQtdGFzayIsZWk9IjIuMCIsVj1Ycih0PT50IT09bnVsbCYmKHR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpKSxtbT1VKFttKCksVCgpLmludCgpXSkscG09bSgpO1koe3R0bDpUKCkub3B0aW9uYWwoKSxwb2xsSW50ZXJ2YWw6VCgpLm9wdGlvbmFsKCl9KTtjb25zdCBmdj1mKHt0dGw6VCgpLm9wdGlvbmFsKCl9KSxndj1mKHt0YXNrSWQ6bSgpfSksQWE9WSh7cHJvZ3Jlc3NUb2tlbjptbS5vcHRpb25hbCgpLFtPZV06Z3Yub3B0aW9uYWwoKX0pLHBlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx3bj1wZS5leHRlbmQoe3Rhc2s6ZnYub3B0aW9uYWwoKX0pLHZ2PXQ9PnduLnNhZmVQYXJzZSh0KS5zdWNjZXNzLGVlPWYoe21ldGhvZDptKCkscGFyYW1zOnBlLmxvb3NlKCkub3B0aW9uYWwoKX0pLGdlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx2ZT1mKHttZXRob2Q6bSgpLHBhcmFtczpnZS5sb29zZSgpLm9wdGlvbmFsKCl9KSx0ZT1ZKHtfbWV0YTpBYS5vcHRpb25hbCgpfSksSW49VShbbSgpLFQoKS5pbnQoKV0pLGZtPWYoe2pzb25ycGM6cChlaSksaWQ6SW4sLi4uZWUuc2hhcGV9KS5zdHJpY3QoKSxDcz10PT5mbS5zYWZlUGFyc2UodCkuc3VjY2VzcyxnbT1mKHtqc29ucnBjOnAoZWkpLC4uLnZlLnNoYXBlfSkuc3RyaWN0KCksaHY9dD0+Z20uc2FmZVBhcnNlKHQpLnN1Y2Nlc3MsTGE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbixyZXN1bHQ6dGV9KS5zdHJpY3QoKSxabj10PT5MYS5zYWZlUGFyc2UodCkuc3VjY2Vzczt2YXIgUjsoZnVuY3Rpb24odCl7dFt0LkNvbm5lY3Rpb25DbG9zZWQ9LTMyZTNdPSJDb25uZWN0aW9uQ2xvc2VkIix0W3QuUmVxdWVzdFRpbWVvdXQ9LTMyMDAxXT0iUmVxdWVzdFRpbWVvdXQiLHRbdC5QYXJzZUVycm9yPS0zMjcwMF09IlBhcnNlRXJyb3IiLHRbdC5JbnZhbGlkUmVxdWVzdD0tMzI2MDBdPSJJbnZhbGlkUmVxdWVzdCIsdFt0Lk1ldGhvZE5vdEZvdW5kPS0zMjYwMV09Ik1ldGhvZE5vdEZvdW5kIix0W3QuSW52YWxpZFBhcmFtcz0tMzI2MDJdPSJJbnZhbGlkUGFyYW1zIix0W3QuSW50ZXJuYWxFcnJvcj0tMzI2MDNdPSJJbnRlcm5hbEVycm9yIix0W3QuVXJsRWxpY2l0YXRpb25SZXF1aXJlZD0tMzIwNDJdPSJVcmxFbGljaXRhdGlvblJlcXVpcmVkIn0pKFJ8fChSPXt9KSk7Y29uc3QgTWE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbi5vcHRpb25hbCgpLGVycm9yOmYoe2NvZGU6VCgpLmludCgpLG1lc3NhZ2U6bSgpLGRhdGE6RSgpLm9wdGlvbmFsKCl9KX0pLnN0cmljdCgpLCR2PXQ9Pk1hLnNhZmVQYXJzZSh0KS5zdWNjZXNzLF92PVUoW2ZtLGdtLExhLE1hXSk7VShbTGEsTWFdKTtjb25zdCBxYT10ZS5zdHJpY3QoKSxidj1nZS5leHRlbmQoe3JlcXVlc3RJZDpJbi5vcHRpb25hbCgpLHJlYXNvbjptKCkub3B0aW9uYWwoKX0pLEZhPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIikscGFyYW1zOmJ2fSkseXY9Zih7c3JjOm0oKSxtaW1lVHlwZTptKCkub3B0aW9uYWwoKSxzaXplczpJKG0oKSkub3B0aW9uYWwoKSx0aGVtZTpRKFsibGlnaHQiLCJkYXJrIl0pLm9wdGlvbmFsKCl9KSx6bj1mKHtpY29uczpJKHl2KS5vcHRpb25hbCgpfSksdHQ9Zih7bmFtZTptKCksdGl0bGU6bSgpLm9wdGlvbmFsKCl9KSx0aT10dC5leHRlbmQoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHZlcnNpb246bSgpLHdlYnNpdGVVcmw6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCl9KSxrdj1tdChmKHthcHBseURlZmF1bHRzOlooKS5vcHRpb25hbCgpfSksUChtKCksRSgpKSksU3Y9U24odD0+dCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KSYmT2JqZWN0LmtleXModCkubGVuZ3RoPT09MD97Zm9ybTp7fX06dCxtdChmKHtmb3JtOmt2Lm9wdGlvbmFsKCksdXJsOlYub3B0aW9uYWwoKX0pLFAobSgpLEUoKSkub3B0aW9uYWwoKSkpLHd2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7c2FtcGxpbmc6WSh7Y3JlYXRlTWVzc2FnZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLGVsaWNpdGF0aW9uOlkoe2NyZWF0ZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLEl2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7dG9vbHM6WSh7Y2FsbDpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLHp2PWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxWKS5vcHRpb25hbCgpLHNhbXBsaW5nOmYoe2NvbnRleHQ6Vi5vcHRpb25hbCgpLHRvb2xzOlYub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksZWxpY2l0YXRpb246U3Yub3B0aW9uYWwoKSxyb290czpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksdGFza3M6d3Yub3B0aW9uYWwoKSxleHRlbnNpb25zOlAobSgpLFYpLm9wdGlvbmFsKCl9KSx4dj1wZS5leHRlbmQoe3Byb3RvY29sVmVyc2lvbjptKCksY2FwYWJpbGl0aWVzOnp2LGNsaWVudEluZm86dGl9KSxUdj1lZS5leHRlbmQoe21ldGhvZDpwKCJpbml0aWFsaXplIikscGFyYW1zOnh2fSksanY9Zih7ZXhwZXJpbWVudGFsOlAobSgpLFYpLm9wdGlvbmFsKCksbG9nZ2luZzpWLm9wdGlvbmFsKCksY29tcGxldGlvbnM6Vi5vcHRpb25hbCgpLHByb21wdHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHJlc291cmNlczpmKHtzdWJzY3JpYmU6WigpLm9wdGlvbmFsKCksbGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHRvb2xzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSx0YXNrczpJdi5vcHRpb25hbCgpLGV4dGVuc2lvbnM6UChtKCksVikub3B0aW9uYWwoKX0pLE92PXRlLmV4dGVuZCh7cHJvdG9jb2xWZXJzaW9uOm0oKSxjYXBhYmlsaXRpZXM6anYsc2VydmVySW5mbzp0aSxpbnN0cnVjdGlvbnM6bSgpLm9wdGlvbmFsKCl9KSxVdj12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxuaT1lZS5leHRlbmQoe21ldGhvZDpwKCJwaW5nIikscGFyYW1zOnBlLm9wdGlvbmFsKCl9KSxQdj1mKHtwcm9ncmVzczpUKCksdG90YWw6cShUKCkpLG1lc3NhZ2U6cShtKCkpfSksTnY9Zih7Li4uZ2Uuc2hhcGUsLi4uUHYuc2hhcGUscHJvZ3Jlc3NUb2tlbjptbX0pLEphPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcHJvZ3Jlc3MiKSxwYXJhbXM6TnZ9KSxEdj1wZS5leHRlbmQoe2N1cnNvcjpwbS5vcHRpb25hbCgpfSkseG49ZWUuZXh0ZW5kKHtwYXJhbXM6RHYub3B0aW9uYWwoKX0pLFRuPXRlLmV4dGVuZCh7bmV4dEN1cnNvcjpwbS5vcHRpb25hbCgpfSksRXY9UShbIndvcmtpbmciLCJpbnB1dF9yZXF1aXJlZCIsImNvbXBsZXRlZCIsImZhaWxlZCIsImNhbmNlbGxlZCJdKSxqbj1mKHt0YXNrSWQ6bSgpLHN0YXR1czpFdix0dGw6VShbVCgpLHZuKCldKSxjcmVhdGVkQXQ6bSgpLGxhc3RVcGRhdGVkQXQ6bSgpLHBvbGxJbnRlcnZhbDpxKFQoKSksc3RhdHVzTWVzc2FnZTpxKG0oKSl9KSxIYT10ZS5leHRlbmQoe3Rhc2s6am59KSxadj1nZS5tZXJnZShqbikscW49dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy90YXNrcy9zdGF0dXMiKSxwYXJhbXM6WnZ9KSxXYT1lZS5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9nZXQiKSxwYXJhbXM6cGUuZXh0ZW5kKHt0YXNrSWQ6bSgpfSl9KSxCYT10ZS5tZXJnZShqbiksVmE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvcmVzdWx0IikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSk7dGUubG9vc2UoKTtjb25zdCBLYT14bi5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9saXN0Iil9KSxHYT1Ubi5leHRlbmQoe3Rhc2tzOkkoam4pfSksWGE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvY2FuY2VsIikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSksUnY9dGUubWVyZ2Uoam4pLHZtPWYoe3VyaTptKCksbWltZVR5cGU6cShtKCkpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLGhtPXZtLmV4dGVuZCh7dGV4dDptKCl9KSxZYT1tKCkucmVmaW5lKHQ9Pnt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fSx7bWVzc2FnZToiSW52YWxpZCBCYXNlNjQgc3RyaW5nIn0pLCRtPXZtLmV4dGVuZCh7YmxvYjpZYX0pLE9uPVEoWyJ1c2VyIiwiYXNzaXN0YW50Il0pLHZ0PWYoe2F1ZGllbmNlOkkoT24pLm9wdGlvbmFsKCkscHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxsYXN0TW9kaWZpZWQ6X28oe29mZnNldDohMH0pLm9wdGlvbmFsKCl9KSxfbT1mKHsuLi50dC5zaGFwZSwuLi56bi5zaGFwZSx1cmk6bSgpLGRlc2NyaXB0aW9uOnEobSgpKSxtaW1lVHlwZTpxKG0oKSksc2l6ZTpxKFQoKSksYW5ub3RhdGlvbnM6dnQub3B0aW9uYWwoKSxfbWV0YTpxKFkoe30pKX0pLEN2PWYoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHVyaVRlbXBsYXRlOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSksbWltZVR5cGU6cShtKCkpLGFubm90YXRpb25zOnZ0Lm9wdGlvbmFsKCksX21ldGE6cShZKHt9KSl9KSxBdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvbGlzdCIpfSksYm09VG4uZXh0ZW5kKHtyZXNvdXJjZXM6SShfbSl9KSxMdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvdGVtcGxhdGVzL2xpc3QiKX0pLE12PVRuLmV4dGVuZCh7cmVzb3VyY2VUZW1wbGF0ZXM6SShDdil9KSxRYT1wZS5leHRlbmQoe3VyaTptKCl9KSxxdj1RYSxGdj1lZS5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvcmVhZCIpLHBhcmFtczpxdn0pLHltPXRlLmV4dGVuZCh7Y29udGVudHM6SShVKFtobSwkbV0pKX0pLEp2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSksSHY9UWEsV3Y9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL3N1YnNjcmliZSIpLHBhcmFtczpIdn0pLEJ2PVFhLFZ2PWVlLmV4dGVuZCh7bWV0aG9kOnAoInJlc291cmNlcy91bnN1YnNjcmliZSIpLHBhcmFtczpCdn0pLEt2PWdlLmV4dGVuZCh7dXJpOm0oKX0pLEd2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL3VwZGF0ZWQiKSxwYXJhbXM6S3Z9KSxYdj1mKHtuYW1lOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSkscmVxdWlyZWQ6cShaKCkpfSksWXY9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246cShtKCkpLGFyZ3VtZW50czpxKEkoWHYpKSxfbWV0YTpxKFkoe30pKX0pLFF2PXhuLmV4dGVuZCh7bWV0aG9kOnAoInByb21wdHMvbGlzdCIpfSksZWg9VG4uZXh0ZW5kKHtwcm9tcHRzOkkoWXYpfSksdGg9cGUuZXh0ZW5kKHtuYW1lOm0oKSxhcmd1bWVudHM6UChtKCksbSgpKS5vcHRpb25hbCgpfSksbmg9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicHJvbXB0cy9nZXQiKSxwYXJhbXM6dGh9KSxlcz1mKHt0eXBlOnAoInRleHQiKSx0ZXh0Om0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHRzPWYoe3R5cGU6cCgiaW1hZ2UiKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLG5zPWYoe3R5cGU6cCgiYXVkaW8iKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHJoPWYoe3R5cGU6cCgidG9vbF91c2UiKSxuYW1lOm0oKSxpZDptKCksaW5wdXQ6UChtKCksRSgpKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxrbT1mKHt0eXBlOnAoInJlc291cmNlIikscmVzb3VyY2U6VShbaG0sJG1dKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLFNtPV9tLmV4dGVuZCh7dHlwZTpwKCJyZXNvdXJjZV9saW5rIil9KSxVbj1VKFtlcyx0cyxucyxTbSxrbV0pLGloPWYoe3JvbGU6T24sY29udGVudDpVbn0pLG9oPXRlLmV4dGVuZCh7ZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWVzc2FnZXM6SShpaCl9KSxhaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Byb21wdHMvbGlzdF9jaGFuZ2VkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxzaD1mKHt0aXRsZTptKCkub3B0aW9uYWwoKSxyZWFkT25seUhpbnQ6WigpLm9wdGlvbmFsKCksZGVzdHJ1Y3RpdmVIaW50OlooKS5vcHRpb25hbCgpLGlkZW1wb3RlbnRIaW50OlooKS5vcHRpb25hbCgpLG9wZW5Xb3JsZEhpbnQ6WigpLm9wdGlvbmFsKCl9KSxjaD1mKHt0YXNrU3VwcG9ydDpRKFsicmVxdWlyZWQiLCJvcHRpb25hbCIsImZvcmJpZGRlbiJdKS5vcHRpb25hbCgpfSkscnM9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksaW5wdXRTY2hlbWE6Zih7dHlwZTpwKCJvYmplY3QiKSxwcm9wZXJ0aWVzOlAobSgpLFYpLm9wdGlvbmFsKCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChFKCkpLG91dHB1dFNjaGVtYTpmKHt0eXBlOnAoIm9iamVjdCIpLHByb3BlcnRpZXM6UChtKCksVikub3B0aW9uYWwoKSxyZXF1aXJlZDpJKG0oKSkub3B0aW9uYWwoKX0pLmNhdGNoYWxsKEUoKSkub3B0aW9uYWwoKSxhbm5vdGF0aW9uczpzaC5vcHRpb25hbCgpLGV4ZWN1dGlvbjpjaC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHdtPXhuLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2xpc3QiKX0pLHVoPVRuLmV4dGVuZCh7dG9vbHM6SShycyl9KSxyaT10ZS5leHRlbmQoe2NvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6UChtKCksRSgpKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCl9KTtyaS5vcih0ZS5leHRlbmQoe3Rvb2xSZXN1bHQ6RSgpfSkpO2NvbnN0IGxoPXduLmV4dGVuZCh7bmFtZTptKCksYXJndW1lbnRzOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEltPWVlLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2NhbGwiKSxwYXJhbXM6bGh9KSxkaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Rvb2xzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7Zih7YXV0b1JlZnJlc2g6WigpLmRlZmF1bHQoITApLGRlYm91bmNlTXM6VCgpLmludCgpLm5vbm5lZ2F0aXZlKCkuZGVmYXVsdCgzMDApfSk7Y29uc3Qgem09UShbImRlYnVnIiwiaW5mbyIsIm5vdGljZSIsIndhcm5pbmciLCJlcnJvciIsImNyaXRpY2FsIiwiYWxlcnQiLCJlbWVyZ2VuY3kiXSksbWg9cGUuZXh0ZW5kKHtsZXZlbDp6bX0pLHBoPWVlLmV4dGVuZCh7bWV0aG9kOnAoImxvZ2dpbmcvc2V0TGV2ZWwiKSxwYXJhbXM6bWh9KSxmaD1nZS5leHRlbmQoe2xldmVsOnptLGxvZ2dlcjptKCkub3B0aW9uYWwoKSxkYXRhOkUoKX0pLGdoPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvbWVzc2FnZSIpLHBhcmFtczpmaH0pLHZoPWYoe25hbWU6bSgpLm9wdGlvbmFsKCl9KSxoaD1mKHtoaW50czpJKHZoKS5vcHRpb25hbCgpLGNvc3RQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpLHNwZWVkUHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxpbnRlbGxpZ2VuY2VQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpfSksJGg9Zih7bW9kZTpRKFsiYXV0byIsInJlcXVpcmVkIiwibm9uZSJdKS5vcHRpb25hbCgpfSksX2g9Zih7dHlwZTpwKCJ0b29sX3Jlc3VsdCIpLHRvb2xVc2VJZDptKCkuZGVzY3JpYmUoIlRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgdG9vbCBjYWxsLiIpLGNvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6Zih7fSkubG9vc2UoKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCksX21ldGE6UChtKCksRSgpKS5vcHRpb25hbCgpfSksYmg9X24oInR5cGUiLFtlcyx0cyxuc10pLEZuPV9uKCJ0eXBlIixbZXMsdHMsbnMscmgsX2hdKSx5aD1mKHtyb2xlOk9uLGNvbnRlbnQ6VShbRm4sSShGbildKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxraD13bi5leHRlbmQoe21lc3NhZ2VzOkkoeWgpLG1vZGVsUHJlZmVyZW5jZXM6aGgub3B0aW9uYWwoKSxzeXN0ZW1Qcm9tcHQ6bSgpLm9wdGlvbmFsKCksaW5jbHVkZUNvbnRleHQ6UShbIm5vbmUiLCJ0aGlzU2VydmVyIiwiYWxsU2VydmVycyJdKS5vcHRpb25hbCgpLHRlbXBlcmF0dXJlOlQoKS5vcHRpb25hbCgpLG1heFRva2VuczpUKCkuaW50KCksc3RvcFNlcXVlbmNlczpJKG0oKSkub3B0aW9uYWwoKSxtZXRhZGF0YTpWLm9wdGlvbmFsKCksdG9vbHM6SShycykub3B0aW9uYWwoKSx0b29sQ2hvaWNlOiRoLm9wdGlvbmFsKCl9KSxTaD1lZS5leHRlbmQoe21ldGhvZDpwKCJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIikscGFyYW1zOmtofSkseG09dGUuZXh0ZW5kKHttb2RlbDptKCksc3RvcFJlYXNvbjpxKFEoWyJlbmRUdXJuIiwic3RvcFNlcXVlbmNlIiwibWF4VG9rZW5zIl0pLm9yKG0oKSkpLHJvbGU6T24sY29udGVudDpiaH0pLFRtPXRlLmV4dGVuZCh7bW9kZWw6bSgpLHN0b3BSZWFzb246cShRKFsiZW5kVHVybiIsInN0b3BTZXF1ZW5jZSIsIm1heFRva2VucyIsInRvb2xVc2UiXSkub3IobSgpKSkscm9sZTpPbixjb250ZW50OlUoW0ZuLEkoRm4pXSl9KSx3aD1mKHt0eXBlOnAoImJvb2xlYW4iKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxkZWZhdWx0OlooKS5vcHRpb25hbCgpfSksSWg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxtaW5MZW5ndGg6VCgpLm9wdGlvbmFsKCksbWF4TGVuZ3RoOlQoKS5vcHRpb25hbCgpLGZvcm1hdDpRKFsiZW1haWwiLCJ1cmkiLCJkYXRlIiwiZGF0ZS10aW1lIl0pLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLHpoPWYoe3R5cGU6UShbIm51bWJlciIsImludGVnZXIiXSksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWluaW11bTpUKCkub3B0aW9uYWwoKSxtYXhpbXVtOlQoKS5vcHRpb25hbCgpLGRlZmF1bHQ6VCgpLm9wdGlvbmFsKCl9KSx4aD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLGVudW06SShtKCkpLGRlZmF1bHQ6bSgpLm9wdGlvbmFsKCl9KSxUaD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG9uZU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKSxkZWZhdWx0Om0oKS5vcHRpb25hbCgpfSksamg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxlbnVtOkkobSgpKSxlbnVtTmFtZXM6SShtKCkpLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLE9oPVUoW3hoLFRoXSksVWg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe3R5cGU6cCgic3RyaW5nIiksZW51bTpJKG0oKSl9KSxkZWZhdWx0OkkobSgpKS5vcHRpb25hbCgpfSksUGg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe2FueU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKX0pLGRlZmF1bHQ6SShtKCkpLm9wdGlvbmFsKCl9KSxOaD1VKFtVaCxQaF0pLERoPVUoW2poLE9oLE5oXSksRWg9VShbRGgsd2gsSWgsemhdKSxaaD13bi5leHRlbmQoe21vZGU6cCgiZm9ybSIpLm9wdGlvbmFsKCksbWVzc2FnZTptKCkscmVxdWVzdGVkU2NoZW1hOmYoe3R5cGU6cCgib2JqZWN0IikscHJvcGVydGllczpQKG0oKSxFaCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KX0pLFJoPXduLmV4dGVuZCh7bW9kZTpwKCJ1cmwiKSxtZXNzYWdlOm0oKSxlbGljaXRhdGlvbklkOm0oKSx1cmw6bSgpLnVybCgpfSksQ2g9VShbWmgsUmhdKSxBaD1lZS5leHRlbmQoe21ldGhvZDpwKCJlbGljaXRhdGlvbi9jcmVhdGUiKSxwYXJhbXM6Q2h9KSxMaD1nZS5leHRlbmQoe2VsaWNpdGF0aW9uSWQ6bSgpfSksTWg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9lbGljaXRhdGlvbi9jb21wbGV0ZSIpLHBhcmFtczpMaH0pLHFoPXRlLmV4dGVuZCh7YWN0aW9uOlEoWyJhY2NlcHQiLCJkZWNsaW5lIiwiY2FuY2VsIl0pLGNvbnRlbnQ6U24odD0+dD09PW51bGw/dm9pZCAwOnQsUChtKCksVShbbSgpLFQoKSxaKCksSShtKCkpXSkpLm9wdGlvbmFsKCkpfSksRmg9Zih7dHlwZTpwKCJyZWYvcmVzb3VyY2UiKSx1cmk6bSgpfSksSmg9Zih7dHlwZTpwKCJyZWYvcHJvbXB0IiksbmFtZTptKCl9KSxIaD1wZS5leHRlbmQoe3JlZjpVKFtKaCxGaF0pLGFyZ3VtZW50OmYoe25hbWU6bSgpLHZhbHVlOm0oKX0pLGNvbnRleHQ6Zih7YXJndW1lbnRzOlAobSgpLG0oKSkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCl9KSxXaD1lZS5leHRlbmQoe21ldGhvZDpwKCJjb21wbGV0aW9uL2NvbXBsZXRlIikscGFyYW1zOkhofSksQmg9dGUuZXh0ZW5kKHtjb21wbGV0aW9uOlkoe3ZhbHVlczpJKG0oKSkubWF4KDEwMCksdG90YWw6cShUKCkuaW50KCkpLGhhc01vcmU6cShaKCkpfSl9KSxWaD1mKHt1cmk6bSgpLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSxuYW1lOm0oKS5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEtoPWVlLmV4dGVuZCh7bWV0aG9kOnAoInJvb3RzL2xpc3QiKSxwYXJhbXM6cGUub3B0aW9uYWwoKX0pLEdoPXRlLmV4dGVuZCh7cm9vdHM6SShWaCl9KSxYaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Jvb3RzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7VShbbmksVHYsV2gscGgsbmgsUXYsQXYsTHYsRnYsV3YsVnYsSW0sd20sV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxVdixYaCxxbl0pO1UoW3FhLHhtLFRtLHFoLEdoLEJhLEdhLEhhXSk7VShbbmksU2gsQWgsS2gsV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxnaCxHdixKdixkaCxhaCxxbixNaF0pO1UoW3FhLE92LEJoLG9oLGVoLGJtLE12LHltLHJpLHVoLEJhLEdhLEhhXSk7Y2xhc3MgRCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG4scixvKXtzdXBlcihgTUNQIGVycm9yICR7bn06ICR7cn1gKSx0aGlzLmNvZGU9bix0aGlzLmRhdGE9byx0aGlzLm5hbWU9Ik1jcEVycm9yIn1zdGF0aWMgZnJvbUVycm9yKG4scixvKXtpZihuPT09Ui5VcmxFbGljaXRhdGlvblJlcXVpcmVkJiZvKXtjb25zdCBlPW87aWYoZS5lbGljaXRhdGlvbnMpcmV0dXJuIG5ldyBZaChlLmVsaWNpdGF0aW9ucyxyKX1yZXR1cm4gbmV3IEQobixyLG8pfX1jbGFzcyBZaCBleHRlbmRzIER7Y29uc3RydWN0b3IobixyPWBVUkwgZWxpY2l0YXRpb24ke24ubGVuZ3RoPjE/InMiOiIifSByZXF1aXJlZGApe3N1cGVyKFIuVXJsRWxpY2l0YXRpb25SZXF1aXJlZCxyLHtlbGljaXRhdGlvbnM6bn0pfWdldCBlbGljaXRhdGlvbnMoKXtyZXR1cm4gdGhpcy5kYXRhPy5lbGljaXRhdGlvbnM/P1tdfX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdD09PSJjb21wbGV0ZWQifHx0PT09ImZhaWxlZCJ8fHQ9PT0iY2FuY2VsbGVkIn1uZXcgU2V0KCJBQkNERUZHSElKS0xNTk9QUVJTVFVWWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5ejAxMjM0NTY3ODkiKTtmdW5jdGlvbiBBcyh0KXtjb25zdCByPXR2KHQpPy5tZXRob2Q7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgaXMgbWlzc2luZyBhIG1ldGhvZCBsaXRlcmFsIik7Y29uc3Qgbz1udihyKTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgbWV0aG9kIGxpdGVyYWwgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBvfWZ1bmN0aW9uIExzKHQsbil7Y29uc3Qgcj1lbSh0LG4pO2lmKCFyLnN1Y2Nlc3MpdGhyb3cgci5lcnJvcjtyZXR1cm4gci5kYXRhfWNvbnN0IFFoPTZlNDtjbGFzcyBlJHtjb25zdHJ1Y3RvcihuKXt0aGlzLl9vcHRpb25zPW4sdGhpcy5fcmVxdWVzdE1lc3NhZ2VJZD0wLHRoaXMuX3JlcXVlc3RIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycz1uZXcgTWFwLHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcmVzcG9uc2VIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnM9bmV3IE1hcCx0aGlzLl90aW1lb3V0SW5mbz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zPW5ldyBTZXQsdGhpcy5fdGFza1Byb2dyZXNzVG9rZW5zPW5ldyBNYXAsdGhpcy5fcmVxdWVzdFJlc29sdmVycz1uZXcgTWFwLHRoaXMuc2V0Tm90aWZpY2F0aW9uSGFuZGxlcihGYSxyPT57dGhpcy5fb25jYW5jZWwocil9KSx0aGlzLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIoSmEscj0+e3RoaXMuX29ucHJvZ3Jlc3Mocil9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKG5pLHI9Pih7fSkpLHRoaXMuX3Rhc2tTdG9yZT1uPy50YXNrU3RvcmUsdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT1uPy50YXNrTWVzc2FnZVF1ZXVlLHRoaXMuX3Rhc2tTdG9yZSYmKHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoV2EsYXN5bmMocixvKT0+e2NvbnN0IGU9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soci5wYXJhbXMudGFza0lkLG8uc2Vzc2lvbklkKTtpZighZSl0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsIkZhaWxlZCB0byByZXRyaWV2ZSB0YXNrOiBUYXNrIG5vdCBmb3VuZCIpO3JldHVybnsuLi5lfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoVmEsYXN5bmMocixvKT0+e2NvbnN0IGU9YXN5bmMoKT0+e2NvbnN0IGk9ci5wYXJhbXMudGFza0lkO2lmKHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUpe2xldCBzO2Zvcig7cz1hd2FpdCB0aGlzLl90YXNrTWVzc2FnZVF1ZXVlLmRlcXVldWUoaSxvLnNlc3Npb25JZCk7KXtpZihzLnR5cGU9PT0icmVzcG9uc2UifHxzLnR5cGU9PT0iZXJyb3IiKXtjb25zdCBjPXMubWVzc2FnZSx1PWMuaWQsbD10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldCh1KTtpZihsKWlmKHRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZGVsZXRlKHUpLHMudHlwZT09PSJyZXNwb25zZSIpbChjKTtlbHNle2NvbnN0IGc9Yyx2PW5ldyBEKGcuZXJyb3IuY29kZSxnLmVycm9yLm1lc3NhZ2UsZy5lcnJvci5kYXRhKTtsKHYpfWVsc2V7Y29uc3QgZz1zLnR5cGU9PT0icmVzcG9uc2UiPyJSZXNwb25zZSI6IkVycm9yIjt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgJHtnfSBoYW5kbGVyIG1pc3NpbmcgZm9yIHJlcXVlc3QgJHt1fWApKX1jb250aW51ZX1hd2FpdCB0aGlzLl90cmFuc3BvcnQ/LnNlbmQocy5tZXNzYWdlLHtyZWxhdGVkUmVxdWVzdElkOm8ucmVxdWVzdElkfSl9fWNvbnN0IGE9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soaSxvLnNlc3Npb25JZCk7aWYoIWEpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtpfWApO2lmKCFqZShhLnN0YXR1cykpcmV0dXJuIGF3YWl0IHRoaXMuX3dhaXRGb3JUYXNrVXBkYXRlKGksby5zaWduYWwpLGF3YWl0IGUoKTtpZihqZShhLnN0YXR1cykpe2NvbnN0IHM9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2tSZXN1bHQoaSxvLnNlc3Npb25JZCk7cmV0dXJuIHRoaXMuX2NsZWFyVGFza1F1ZXVlKGkpLHsuLi5zLF9tZXRhOnsuLi5zLl9tZXRhLFtPZV06e3Rhc2tJZDppfX19fXJldHVybiBhd2FpdCBlKCl9O3JldHVybiBhd2FpdCBlKCl9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKEthLGFzeW5jKHIsbyk9Pnt0cnl7Y29uc3R7dGFza3M6ZSxuZXh0Q3Vyc29yOml9PWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5saXN0VGFza3Moci5wYXJhbXM/LmN1cnNvcixvLnNlc3Npb25JZCk7cmV0dXJue3Rhc2tzOmUsbmV4dEN1cnNvcjppLF9tZXRhOnt9fX1jYXRjaChlKXt0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsYEZhaWxlZCB0byBsaXN0IHRhc2tzOiAke2UgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWApfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoWGEsYXN5bmMocixvKT0+e3RyeXtjb25zdCBlPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWUpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtyLnBhcmFtcy50YXNrSWR9YCk7aWYoamUoZS5zdGF0dXMpKXRocm93IG5ldyBEKFIuSW52YWxpZFBhcmFtcyxgQ2Fubm90IGNhbmNlbCB0YXNrIGluIHRlcm1pbmFsIHN0YXR1czogJHtlLnN0YXR1c31gKTthd2FpdCB0aGlzLl90YXNrU3RvcmUudXBkYXRlVGFza1N0YXR1cyhyLnBhcmFtcy50YXNrSWQsImNhbmNlbGxlZCIsIkNsaWVudCBjYW5jZWxsZWQgdGFzayBleGVjdXRpb24uIixvLnNlc3Npb25JZCksdGhpcy5fY2xlYXJUYXNrUXVldWUoci5wYXJhbXMudGFza0lkKTtjb25zdCBpPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZCBhZnRlciBjYW5jZWxsYXRpb246ICR7ci5wYXJhbXMudGFza0lkfWApO3JldHVybntfbWV0YTp7fSwuLi5pfX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgRD9lOm5ldyBEKFIuSW52YWxpZFJlcXVlc3QsYEZhaWxlZCB0byBjYW5jZWwgdGFzazogJHtlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1gKX19KSl9YXN5bmMgX29uY2FuY2VsKG4pe2lmKCFuLnBhcmFtcy5yZXF1ZXN0SWQpcmV0dXJuO3RoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy5nZXQobi5wYXJhbXMucmVxdWVzdElkKT8uYWJvcnQobi5wYXJhbXMucmVhc29uKX1fc2V0dXBUaW1lb3V0KG4scixvLGUsaT0hMSl7dGhpcy5fdGltZW91dEluZm8uc2V0KG4se3RpbWVvdXRJZDpzZXRUaW1lb3V0KGUsciksc3RhcnRUaW1lOkRhdGUubm93KCksdGltZW91dDpyLG1heFRvdGFsVGltZW91dDpvLHJlc2V0VGltZW91dE9uUHJvZ3Jlc3M6aSxvblRpbWVvdXQ6ZX0pfV9yZXNldFRpbWVvdXQobil7Y29uc3Qgcj10aGlzLl90aW1lb3V0SW5mby5nZXQobik7aWYoIXIpcmV0dXJuITE7Y29uc3Qgbz1EYXRlLm5vdygpLXIuc3RhcnRUaW1lO2lmKHIubWF4VG90YWxUaW1lb3V0JiZvPj1yLm1heFRvdGFsVGltZW91dCl0aHJvdyB0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobiksRC5mcm9tRXJyb3IoUi5SZXF1ZXN0VGltZW91dCwiTWF4aW11bSB0b3RhbCB0aW1lb3V0IGV4Y2VlZGVkIix7bWF4VG90YWxUaW1lb3V0OnIubWF4VG90YWxUaW1lb3V0LHRvdGFsRWxhcHNlZDpvfSk7cmV0dXJuIGNsZWFyVGltZW91dChyLnRpbWVvdXRJZCksci50aW1lb3V0SWQ9c2V0VGltZW91dChyLm9uVGltZW91dCxyLnRpbWVvdXQpLCEwfV9jbGVhbnVwVGltZW91dChuKXtjb25zdCByPXRoaXMuX3RpbWVvdXRJbmZvLmdldChuKTtyJiYoY2xlYXJUaW1lb3V0KHIudGltZW91dElkKSx0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobikpfWFzeW5jIGNvbm5lY3Qobil7aWYodGhpcy5fdHJhbnNwb3J0KXRocm93IG5ldyBFcnJvcigiQWxyZWFkeSBjb25uZWN0ZWQgdG8gYSB0cmFuc3BvcnQuIENhbGwgY2xvc2UoKSBiZWZvcmUgY29ubmVjdGluZyB0byBhIG5ldyB0cmFuc3BvcnQsIG9yIHVzZSBhIHNlcGFyYXRlIFByb3RvY29sIGluc3RhbmNlIHBlciBjb25uZWN0aW9uLiIpO3RoaXMuX3RyYW5zcG9ydD1uO2NvbnN0IHI9dGhpcy50cmFuc3BvcnQ/Lm9uY2xvc2U7dGhpcy5fdHJhbnNwb3J0Lm9uY2xvc2U9KCk9PntyPy4oKSx0aGlzLl9vbmNsb3NlKCl9O2NvbnN0IG89dGhpcy50cmFuc3BvcnQ/Lm9uZXJyb3I7dGhpcy5fdHJhbnNwb3J0Lm9uZXJyb3I9aT0+e28/LihpKSx0aGlzLl9vbmVycm9yKGkpfTtjb25zdCBlPXRoaXMuX3RyYW5zcG9ydD8ub25tZXNzYWdlO3RoaXMuX3RyYW5zcG9ydC5vbm1lc3NhZ2U9KGksYSk9PntlPy4oaSxhKSxabihpKXx8JHYoaSk/dGhpcy5fb25yZXNwb25zZShpKTpDcyhpKT90aGlzLl9vbnJlcXVlc3QoaSxhKTpodihpKT90aGlzLl9vbm5vdGlmaWNhdGlvbihpKTp0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoaSl9YCkpfSxhd2FpdCB0aGlzLl90cmFuc3BvcnQuc3RhcnQoKX1fb25jbG9zZSgpe2NvbnN0IG49dGhpcy5fcmVzcG9uc2VIYW5kbGVyczt0aGlzLl9yZXNwb25zZUhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcHJvZ3Jlc3NIYW5kbGVycy5jbGVhcigpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5jbGVhcigpLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmNsZWFyKCk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fdGltZW91dEluZm8udmFsdWVzKCkpY2xlYXJUaW1lb3V0KG8udGltZW91dElkKTt0aGlzLl90aW1lb3V0SW5mby5jbGVhcigpO2Zvcihjb25zdCBvIG9mIHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy52YWx1ZXMoKSlvLmFib3J0KCk7dGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7Y29uc3Qgcj1ELmZyb21FcnJvcihSLkNvbm5lY3Rpb25DbG9zZWQsIkNvbm5lY3Rpb24gY2xvc2VkIik7dGhpcy5fdHJhbnNwb3J0PXZvaWQgMCx0aGlzLm9uY2xvc2U/LigpO2Zvcihjb25zdCBvIG9mIG4udmFsdWVzKCkpbyhyKX1fb25lcnJvcihuKXt0aGlzLm9uZXJyb3I/LihuKX1fb25ub3RpZmljYXRpb24obil7Y29uc3Qgcj10aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrTm90aWZpY2F0aW9uSGFuZGxlcjtyIT09dm9pZCAwJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5yKG4pKS5jYXRjaChvPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5jYXVnaHQgZXJyb3IgaW4gbm90aWZpY2F0aW9uIGhhbmRsZXI6ICR7b31gKSkpfV9vbnJlcXVlc3QobixyKXtjb25zdCBvPXRoaXMuX3JlcXVlc3RIYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrUmVxdWVzdEhhbmRsZXIsZT10aGlzLl90cmFuc3BvcnQsaT1uLnBhcmFtcz8uX21ldGE/LltPZV0/LnRhc2tJZDtpZihvPT09dm9pZCAwKXtjb25zdCBsPXtqc29ucnBjOiIyLjAiLGlkOm4uaWQsZXJyb3I6e2NvZGU6Ui5NZXRob2ROb3RGb3VuZCxtZXNzYWdlOiJNZXRob2Qgbm90IGZvdW5kIn19O2kmJnRoaXMuX3Rhc2tNZXNzYWdlUXVldWU/dGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKGkse3R5cGU6ImVycm9yIixtZXNzYWdlOmwsdGltZXN0YW1wOkRhdGUubm93KCl9LGU/LnNlc3Npb25JZCkuY2F0Y2goZz0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBlbnF1ZXVlIGVycm9yIHJlc3BvbnNlOiAke2d9YCkpKTplPy5zZW5kKGwpLmNhdGNoKGc9PnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gc2VuZCBhbiBlcnJvciByZXNwb25zZTogJHtnfWApKSk7cmV0dXJufWNvbnN0IGE9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuc2V0KG4uaWQsYSk7Y29uc3Qgcz12dihuLnBhcmFtcyk/bi5wYXJhbXMudGFzazp2b2lkIDAsYz10aGlzLl90YXNrU3RvcmU/dGhpcy5yZXF1ZXN0VGFza1N0b3JlKG4sZT8uc2Vzc2lvbklkKTp2b2lkIDAsdT17c2lnbmFsOmEuc2lnbmFsLHNlc3Npb25JZDplPy5zZXNzaW9uSWQsX21ldGE6bi5wYXJhbXM/Ll9tZXRhLHNlbmROb3RpZmljYXRpb246YXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3JlbGF0ZWRSZXF1ZXN0SWQ6bi5pZH07aSYmKGcucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSksYXdhaXQgdGhpcy5ub3RpZmljYXRpb24obCxnKX0sc2VuZFJlcXVlc3Q6YXN5bmMobCxnLHYpPT57aWYoYS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgRChSLkNvbm5lY3Rpb25DbG9zZWQsIlJlcXVlc3Qgd2FzIGNhbmNlbGxlZCIpO2NvbnN0ICQ9ey4uLnYscmVsYXRlZFJlcXVlc3RJZDpuLmlkfTtpJiYhJC5yZWxhdGVkVGFzayYmKCQucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSk7Y29uc3QgeT0kLnJlbGF0ZWRUYXNrPy50YXNrSWQ/P2k7cmV0dXJuIHkmJmMmJmF3YWl0IGMudXBkYXRlVGFza1N0YXR1cyh5LCJpbnB1dF9yZXF1aXJlZCIpLGF3YWl0IHRoaXMucmVxdWVzdChsLGcsJCl9LGF1dGhJbmZvOnI/LmF1dGhJbmZvLHJlcXVlc3RJZDpuLmlkLHJlcXVlc3RJbmZvOnI/LnJlcXVlc3RJbmZvLHRhc2tJZDppLHRhc2tTdG9yZTpjLHRhc2tSZXF1ZXN0ZWRUdGw6cz8udHRsLGNsb3NlU1NFU3RyZWFtOnI/LmNsb3NlU1NFU3RyZWFtLGNsb3NlU3RhbmRhbG9uZVNTRVN0cmVhbTpyPy5jbG9zZVN0YW5kYWxvbmVTU0VTdHJlYW19O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntzJiZ0aGlzLmFzc2VydFRhc2tIYW5kbGVyQ2FwYWJpbGl0eShuLm1ldGhvZCl9KS50aGVuKCgpPT5vKG4sdSkpLnRoZW4oYXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3Jlc3VsdDpsLGpzb25ycGM6IjIuMCIsaWQ6bi5pZH07aSYmdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT9hd2FpdCB0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UoaSx7dHlwZToicmVzcG9uc2UiLG1lc3NhZ2U6Zyx0aW1lc3RhbXA6RGF0ZS5ub3coKX0sZT8uc2Vzc2lvbklkKTphd2FpdCBlPy5zZW5kKGcpfSxhc3luYyBsPT57aWYoYS5zaWduYWwuYWJvcnRlZClyZXR1cm47Y29uc3QgZz17anNvbnJwYzoiMi4wIixpZDpuLmlkLGVycm9yOntjb2RlOk51bWJlci5pc1NhZmVJbnRlZ2VyKGwuY29kZSk/bC5jb2RlOlIuSW50ZXJuYWxFcnJvcixtZXNzYWdlOmwubWVzc2FnZT8/IkludGVybmFsIGVycm9yIiwuLi5sLmRhdGEhPT12b2lkIDAmJntkYXRhOmwuZGF0YX19fTtpJiZ0aGlzLl90YXNrTWVzc2FnZVF1ZXVlP2F3YWl0IHRoaXMuX2VucXVldWVUYXNrTWVzc2FnZShpLHt0eXBlOiJlcnJvciIsbWVzc2FnZTpnLHRpbWVzdGFtcDpEYXRlLm5vdygpfSxlPy5zZXNzaW9uSWQpOmF3YWl0IGU/LnNlbmQoZyl9KS5jYXRjaChsPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2U6ICR7bH1gKSkpLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuZ2V0KG4uaWQpPT09YSYmdGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShuLmlkKX0pfV9vbnByb2dyZXNzKG4pe2NvbnN0e3Byb2dyZXNzVG9rZW46ciwuLi5vfT1uLnBhcmFtcyxlPU51bWJlcihyKSxpPXRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZ2V0KGUpO2lmKCFpKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSBwcm9ncmVzcyBub3RpZmljYXRpb24gZm9yIGFuIHVua25vd24gdG9rZW46ICR7SlNPTi5zdHJpbmdpZnkobil9YCkpO3JldHVybn1jb25zdCBhPXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZ2V0KGUpLHM9dGhpcy5fdGltZW91dEluZm8uZ2V0KGUpO2lmKHMmJmEmJnMucmVzZXRUaW1lb3V0T25Qcm9ncmVzcyl0cnl7dGhpcy5fcmVzZXRUaW1lb3V0KGUpfWNhdGNoKGMpe3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX2NsZWFudXBUaW1lb3V0KGUpLGEoYyk7cmV0dXJufWkobyl9X29ucmVzcG9uc2Uobil7Y29uc3Qgcj1OdW1iZXIobi5pZCksbz10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldChyKTtpZihvKXtpZih0aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmRlbGV0ZShyKSxabihuKSlvKG4pO2Vsc2V7Y29uc3QgYT1uZXcgRChuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7byhhKX1yZXR1cm59Y29uc3QgZT10aGlzLl9yZXNwb25zZUhhbmRsZXJzLmdldChyKTtpZihlPT09dm9pZCAwKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSByZXNwb25zZSBmb3IgYW4gdW5rbm93biBtZXNzYWdlIElEOiAke0pTT04uc3RyaW5naWZ5KG4pfWApKTtyZXR1cm59dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5kZWxldGUociksdGhpcy5fY2xlYW51cFRpbWVvdXQocik7bGV0IGk9ITE7aWYoWm4obikmJm4ucmVzdWx0JiZ0eXBlb2Ygbi5yZXN1bHQ9PSJvYmplY3QiKXtjb25zdCBhPW4ucmVzdWx0O2lmKGEudGFzayYmdHlwZW9mIGEudGFzaz09Im9iamVjdCIpe2NvbnN0IHM9YS50YXNrO3R5cGVvZiBzLnRhc2tJZD09InN0cmluZyImJihpPSEwLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5zZXQocy50YXNrSWQscikpfX1pZihpfHx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZShyKSxabihuKSllKG4pO2Vsc2V7Y29uc3QgYT1ELmZyb21FcnJvcihuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7ZShhKX19Z2V0IHRyYW5zcG9ydCgpe3JldHVybiB0aGlzLl90cmFuc3BvcnR9YXN5bmMgY2xvc2UoKXthd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmNsb3NlKCl9YXN5bmMqcmVxdWVzdFN0cmVhbShuLHIsbyl7Y29uc3R7dGFzazplfT1vPz97fTtpZighZSl7dHJ5e3lpZWxke3R5cGU6InJlc3VsdCIscmVzdWx0OmF3YWl0IHRoaXMucmVxdWVzdChuLHIsbyl9fWNhdGNoKGEpe3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjphIGluc3RhbmNlb2YgRD9hOm5ldyBEKFIuSW50ZXJuYWxFcnJvcixTdHJpbmcoYSkpfX1yZXR1cm59bGV0IGk7dHJ5e2NvbnN0IGE9YXdhaXQgdGhpcy5yZXF1ZXN0KG4sSGEsbyk7aWYoYS50YXNrKWk9YS50YXNrLnRhc2tJZCx5aWVsZHt0eXBlOiJ0YXNrQ3JlYXRlZCIsdGFzazphLnRhc2t9O2Vsc2UgdGhyb3cgbmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNyZWF0aW9uIGRpZCBub3QgcmV0dXJuIGEgdGFzayIpO2Zvcig7Oyl7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldFRhc2soe3Rhc2tJZDppfSxvKTtpZih5aWVsZHt0eXBlOiJ0YXNrU3RhdHVzIix0YXNrOnN9LGplKHMuc3RhdHVzKSl7cy5zdGF0dXM9PT0iY29tcGxldGVkIj95aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTpzLnN0YXR1cz09PSJmYWlsZWQiP3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSBmYWlsZWRgKX06cy5zdGF0dXM9PT0iY2FuY2VsbGVkIiYmKHlpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSB3YXMgY2FuY2VsbGVkYCl9KTtyZXR1cm59aWYocy5zdGF0dXM9PT0iaW5wdXRfcmVxdWlyZWQiKXt5aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTtyZXR1cm59Y29uc3QgYz1zLnBvbGxJbnRlcnZhbD8/dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzthd2FpdCBuZXcgUHJvbWlzZSh1PT5zZXRUaW1lb3V0KHUsYykpLG8/LnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKX19Y2F0Y2goYSl7eWllbGR7dHlwZToiZXJyb3IiLGVycm9yOmEgaW5zdGFuY2VvZiBEP2E6bmV3IEQoUi5JbnRlcm5hbEVycm9yLFN0cmluZyhhKSl9fX1yZXF1ZXN0KG4scixvKXtjb25zdHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YSx0YXNrOnMscmVsYXRlZFRhc2s6Y309bz8/e307cmV0dXJuIG5ldyBQcm9taXNlKCh1LGwpPT57Y29uc3QgZz1HPT57bChHKX07aWYoIXRoaXMuX3RyYW5zcG9ydCl7ZyhuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKSk7cmV0dXJufWlmKHRoaXMuX29wdGlvbnM/LmVuZm9yY2VTdHJpY3RDYXBhYmlsaXRpZXM9PT0hMCl0cnl7dGhpcy5hc3NlcnRDYXBhYmlsaXR5Rm9yTWV0aG9kKG4ubWV0aG9kKSxzJiZ0aGlzLmFzc2VydFRhc2tDYXBhYmlsaXR5KG4ubWV0aG9kKX1jYXRjaChHKXtnKEcpO3JldHVybn1vPy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7Y29uc3Qgdj10aGlzLl9yZXF1ZXN0TWVzc2FnZUlkKyssJD17Li4ubixqc29ucnBjOiIyLjAiLGlkOnZ9O28/Lm9ucHJvZ3Jlc3MmJih0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLnNldCh2LG8ub25wcm9ncmVzcyksJC5wYXJhbXM9ey4uLm4ucGFyYW1zLF9tZXRhOnsuLi5uLnBhcmFtcz8uX21ldGF8fHt9LHByb2dyZXNzVG9rZW46dn19KSxzJiYoJC5wYXJhbXM9ey4uLiQucGFyYW1zLHRhc2s6c30pLGMmJigkLnBhcmFtcz17Li4uJC5wYXJhbXMsX21ldGE6ey4uLiQucGFyYW1zPy5fbWV0YXx8e30sW09lXTpjfX0pO2NvbnN0IHk9Rz0+e3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX2NsZWFudXBUaW1lb3V0KHYpLHRoaXMuX3RyYW5zcG9ydD8uc2VuZCh7anNvbnJwYzoiMi4wIixtZXRob2Q6Im5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIixwYXJhbXM6e3JlcXVlc3RJZDp2LHJlYXNvbjpTdHJpbmcoRyl9fSx7cmVsYXRlZFJlcXVlc3RJZDplLHJlc3VtcHRpb25Ub2tlbjppLG9ucmVzdW1wdGlvbnRva2VuOmF9KS5jYXRjaChNPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgY2FuY2VsbGF0aW9uOiAke019YCkpKTtjb25zdCBXPUcgaW5zdGFuY2VvZiBEP0c6bmV3IEQoUi5SZXF1ZXN0VGltZW91dCxTdHJpbmcoRykpO2woVyl9O3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuc2V0KHYsRz0+e2lmKCFvPy5zaWduYWw/LmFib3J0ZWQpe2lmKEcgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gbChHKTt0cnl7Y29uc3QgVz1lbShyLEcucmVzdWx0KTtXLnN1Y2Nlc3M/dShXLmRhdGEpOmwoVy5lcnJvcil9Y2F0Y2goVyl7bChXKX19fSksbz8uc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9Pnt5KG8/LnNpZ25hbD8ucmVhc29uKX0pO2NvbnN0IEg9bz8udGltZW91dD8/UWgsTD0oKT0+eShELmZyb21FcnJvcihSLlJlcXVlc3RUaW1lb3V0LCJSZXF1ZXN0IHRpbWVkIG91dCIse3RpbWVvdXQ6SH0pKTt0aGlzLl9zZXR1cFRpbWVvdXQodixILG8/Lm1heFRvdGFsVGltZW91dCxMLG8/LnJlc2V0VGltZW91dE9uUHJvZ3Jlc3M/PyExKTtjb25zdCBxZT1jPy50YXNrSWQ7aWYocWUpe2NvbnN0IEc9Vz0+e2NvbnN0IE09dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5nZXQodik7TT9NKFcpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNwb25zZSBoYW5kbGVyIG1pc3NpbmcgZm9yIHNpZGUtY2hhbm5lbGVkIHJlcXVlc3QgJHt2fWApKX07dGhpcy5fcmVxdWVzdFJlc29sdmVycy5zZXQodixHKSx0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UocWUse3R5cGU6InJlcXVlc3QiLG1lc3NhZ2U6JCx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pLmNhdGNoKFc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKFcpfSl9ZWxzZSB0aGlzLl90cmFuc3BvcnQuc2VuZCgkLHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YX0pLmNhdGNoKEc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKEcpfSl9KX1hc3luYyBnZXRUYXNrKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9nZXQiLHBhcmFtczpufSxCYSxyKX1hc3luYyBnZXRUYXNrUmVzdWx0KG4scixvKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRhc2tzL3Jlc3VsdCIscGFyYW1zOm59LHIsbyl9YXN5bmMgbGlzdFRhc2tzKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9saXN0IixwYXJhbXM6bn0sR2Escil9YXN5bmMgY2FuY2VsVGFzayhuLHIpe3JldHVybiB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidGFza3MvY2FuY2VsIixwYXJhbXM6bn0sUnYscil9YXN5bmMgbm90aWZpY2F0aW9uKG4scil7aWYoIXRoaXMuX3RyYW5zcG9ydCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKTt0aGlzLmFzc2VydE5vdGlmaWNhdGlvbkNhcGFiaWxpdHkobi5tZXRob2QpO2NvbnN0IG89cj8ucmVsYXRlZFRhc2s/LnRhc2tJZDtpZihvKXtjb25zdCBzPXsuLi5uLGpzb25ycGM6IjIuMCIscGFyYW1zOnsuLi5uLnBhcmFtcyxfbWV0YTp7Li4ubi5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX07YXdhaXQgdGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKG8se3R5cGU6Im5vdGlmaWNhdGlvbiIsbWVzc2FnZTpzLHRpbWVzdGFtcDpEYXRlLm5vdygpfSk7cmV0dXJufWlmKCh0aGlzLl9vcHRpb25zPy5kZWJvdW5jZWROb3RpZmljYXRpb25NZXRob2RzPz9bXSkuaW5jbHVkZXMobi5tZXRob2QpJiYhbi5wYXJhbXMmJiFyPy5yZWxhdGVkUmVxdWVzdElkJiYhcj8ucmVsYXRlZFRhc2spe2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmhhcyhuLm1ldGhvZCkpcmV0dXJuO3RoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmFkZChuLm1ldGhvZCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmRlbGV0ZShuLm1ldGhvZCksIXRoaXMuX3RyYW5zcG9ydClyZXR1cm47bGV0IHM9ey4uLm4sanNvbnJwYzoiMi4wIn07cj8ucmVsYXRlZFRhc2smJihzPXsuLi5zLHBhcmFtczp7Li4ucy5wYXJhbXMsX21ldGE6ey4uLnMucGFyYW1zPy5fbWV0YXx8e30sW09lXTpyLnJlbGF0ZWRUYXNrfX19KSx0aGlzLl90cmFuc3BvcnQ/LnNlbmQocyxyKS5jYXRjaChjPT50aGlzLl9vbmVycm9yKGMpKX0pO3JldHVybn1sZXQgYT17Li4ubixqc29ucnBjOiIyLjAifTtyPy5yZWxhdGVkVGFzayYmKGE9ey4uLmEscGFyYW1zOnsuLi5hLnBhcmFtcyxfbWV0YTp7Li4uYS5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX0pLGF3YWl0IHRoaXMuX3RyYW5zcG9ydC5zZW5kKGEscil9c2V0UmVxdWVzdEhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuYXNzZXJ0UmVxdWVzdEhhbmRsZXJDYXBhYmlsaXR5KG8pLHRoaXMuX3JlcXVlc3RIYW5kbGVycy5zZXQobywoZSxpKT0+e2NvbnN0IGE9THMobixlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHIoYSxpKSl9KX1yZW1vdmVSZXF1ZXN0SGFuZGxlcihuKXt0aGlzLl9yZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG4pfWFzc2VydENhblNldFJlcXVlc3RIYW5kbGVyKG4pe2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVycy5oYXMobikpdGhyb3cgbmV3IEVycm9yKGBBIHJlcXVlc3QgaGFuZGxlciBmb3IgJHtufSBhbHJlYWR5IGV4aXN0cywgd2hpY2ggd291bGQgYmUgb3ZlcnJpZGRlbmApfXNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnNldChvLGU9Pntjb25zdCBpPUxzKG4sZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKGkpKX0pfXJlbW92ZU5vdGlmaWNhdGlvbkhhbmRsZXIobil7dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZGVsZXRlKG4pfV9jbGVhbnVwVGFza1Byb2dyZXNzSGFuZGxlcihuKXtjb25zdCByPXRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5nZXQobik7ciE9PXZvaWQgMCYmKHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHIpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5kZWxldGUobikpfWFzeW5jIF9lbnF1ZXVlVGFza01lc3NhZ2UobixyLG8pe2lmKCF0aGlzLl90YXNrU3RvcmV8fCF0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGVucXVldWUgdGFzayBtZXNzYWdlOiB0YXNrU3RvcmUgYW5kIHRhc2tNZXNzYWdlUXVldWUgYXJlIG5vdCBjb25maWd1cmVkIik7Y29uc3QgZT10aGlzLl9vcHRpb25zPy5tYXhUYXNrUXVldWVTaXplO2F3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZW5xdWV1ZShuLHIsbyxlKX1hc3luYyBfY2xlYXJUYXNrUXVldWUobixyKXtpZih0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXtjb25zdCBvPWF3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZGVxdWV1ZUFsbChuLHIpO2Zvcihjb25zdCBlIG9mIG8paWYoZS50eXBlPT09InJlcXVlc3QiJiZDcyhlLm1lc3NhZ2UpKXtjb25zdCBpPWUubWVzc2FnZS5pZCxhPXRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZ2V0KGkpO2E/KGEobmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNhbmNlbGxlZCBvciBjb21wbGV0ZWQiKSksdGhpcy5fcmVxdWVzdFJlc29sdmVycy5kZWxldGUoaSkpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNvbHZlciBtaXNzaW5nIGZvciByZXF1ZXN0ICR7aX0gZHVyaW5nIHRhc2sgJHtufSBjbGVhbnVwYCkpfX19YXN5bmMgX3dhaXRGb3JUYXNrVXBkYXRlKG4scil7bGV0IG89dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzt0cnl7Y29uc3QgZT1hd2FpdCB0aGlzLl90YXNrU3RvcmU/LmdldFRhc2sobik7ZT8ucG9sbEludGVydmFsJiYobz1lLnBvbGxJbnRlcnZhbCl9Y2F0Y2h7fXJldHVybiBuZXcgUHJvbWlzZSgoZSxpKT0+e2lmKHIuYWJvcnRlZCl7aShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKTtyZXR1cm59Y29uc3QgYT1zZXRUaW1lb3V0KGUsbyk7ci5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PntjbGVhclRpbWVvdXQoYSksaShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKX0se29uY2U6ITB9KX0pfXJlcXVlc3RUYXNrU3RvcmUobixyKXtjb25zdCBvPXRoaXMuX3Rhc2tTdG9yZTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIk5vIHRhc2sgc3RvcmUgY29uZmlndXJlZCIpO3JldHVybntjcmVhdGVUYXNrOmFzeW5jIGU9PntpZighbil0aHJvdyBuZXcgRXJyb3IoIk5vIHJlcXVlc3QgcHJvdmlkZWQiKTtyZXR1cm4gYXdhaXQgby5jcmVhdGVUYXNrKGUsbi5pZCx7bWV0aG9kOm4ubWV0aG9kLHBhcmFtczpuLnBhcmFtc30scil9LGdldFRhc2s6YXN5bmMgZT0+e2NvbnN0IGk9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLCJGYWlsZWQgdG8gcmV0cmlldmUgdGFzazogVGFzayBub3QgZm91bmQiKTtyZXR1cm4gaX0sc3RvcmVUYXNrUmVzdWx0OmFzeW5jKGUsaSxhKT0+e2F3YWl0IG8uc3RvcmVUYXNrUmVzdWx0KGUsaSxhLHIpO2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYocyl7Y29uc3QgYz1xbi5wYXJzZSh7bWV0aG9kOiJub3RpZmljYXRpb25zL3Rhc2tzL3N0YXR1cyIscGFyYW1zOnN9KTthd2FpdCB0aGlzLm5vdGlmaWNhdGlvbihjKSxqZShzLnN0YXR1cykmJnRoaXMuX2NsZWFudXBUYXNrUHJvZ3Jlc3NIYW5kbGVyKGUpfX0sZ2V0VGFza1Jlc3VsdDplPT5vLmdldFRhc2tSZXN1bHQoZSxyKSx1cGRhdGVUYXNrU3RhdHVzOmFzeW5jKGUsaSxhKT0+e2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIXMpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrICIke2V9IiBub3QgZm91bmQgLSBpdCBtYXkgaGF2ZSBiZWVuIGNsZWFuZWQgdXBgKTtpZihqZShzLnN0YXR1cykpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBDYW5ub3QgdXBkYXRlIHRhc2sgIiR7ZX0iIGZyb20gdGVybWluYWwgc3RhdHVzICIke3Muc3RhdHVzfSIgdG8gIiR7aX0iLiBUZXJtaW5hbCBzdGF0ZXMgKGNvbXBsZXRlZCwgZmFpbGVkLCBjYW5jZWxsZWQpIGNhbm5vdCB0cmFuc2l0aW9uIHRvIG90aGVyIHN0YXRlcy5gKTthd2FpdCBvLnVwZGF0ZVRhc2tTdGF0dXMoZSxpLGEscik7Y29uc3QgYz1hd2FpdCBvLmdldFRhc2soZSxyKTtpZihjKXtjb25zdCB1PXFuLnBhcnNlKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdGFza3Mvc3RhdHVzIixwYXJhbXM6Y30pO2F3YWl0IHRoaXMubm90aWZpY2F0aW9uKHUpLGplKGMuc3RhdHVzKSYmdGhpcy5fY2xlYW51cFRhc2tQcm9ncmVzc0hhbmRsZXIoZSl9fSxsaXN0VGFza3M6ZT0+by5saXN0VGFza3MoZSxyKX19fWZ1bmN0aW9uIE1zKHQpe3JldHVybiB0IT09bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB0JCh0LG4pe2NvbnN0IHI9ey4uLnR9O2Zvcihjb25zdCBvIGluIG4pe2NvbnN0IGU9byxpPW5bZV07aWYoaT09PXZvaWQgMCljb250aW51ZTtjb25zdCBhPXJbZV07TXMoYSkmJk1zKGkpP3JbZV09ey4uLmEsLi4uaX06cltlXT1pfXJldHVybiByfSh0PT50eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eSh0LHtnZXQ6KG4scik9Pih0eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTpuKVtyXX0pOnQpKGZ1bmN0aW9uKHQpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyt0KyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO2NsYXNzIG4kIGV4dGVuZHMgZSR7X3JlZ2lzdGVyZWRNZXRob2RzPW5ldyBTZXQ7X2V2ZW50U2xvdHM9bmV3IE1hcDtvbkV2ZW50RGlzcGF0Y2gobixyKXt9X2Vuc3VyZUV2ZW50U2xvdChuKXtsZXQgcj10aGlzLl9ldmVudFNsb3RzLmdldChuKTtpZighcil7bGV0IG89dGhpcy5ldmVudFNjaGVtYXNbbl07aWYoIW8pdGhyb3cgRXJyb3IoYFVua25vd24gZXZlbnQ6ICR7U3RyaW5nKG4pfWApO3I9e2xpc3RlbmVyczpbXX0sdGhpcy5fZXZlbnRTbG90cy5zZXQobixyKTtsZXQgZT1vLnNoYXBlLm1ldGhvZC52YWx1ZTt0aGlzLl9yZWdpc3RlcmVkTWV0aG9kcy5hZGQoZSk7bGV0IGk9cjtzdXBlci5zZXROb3RpZmljYXRpb25IYW5kbGVyKG8sYT0+e2xldCBzPWEucGFyYW1zO3RoaXMub25FdmVudERpc3BhdGNoKG4scyksaS5vbkhhbmRsZXI/LihzKTtmb3IobGV0IGMgb2ZbLi4uaS5saXN0ZW5lcnNdKWMocyl9KX1yZXR1cm4gcn1zZXRFdmVudEhhbmRsZXIobixyKXtsZXQgbz10aGlzLl9lbnN1cmVFdmVudFNsb3Qobik7by5vbkhhbmRsZXImJnImJmNvbnNvbGUud2FybihgW01DUCBBcHBzXSBvbiR7U3RyaW5nKG4pfSBoYW5kbGVyIHJlcGxhY2VkLiBVc2UgYWRkRXZlbnRMaXN0ZW5lcigiJHtTdHJpbmcobil9Iiwg4oCmKSB0byBhZGQgbXVsdGlwbGUgbGlzdGVuZXJzIHdpdGhvdXQgcmVwbGFjaW5nLmApLG8ub25IYW5kbGVyPXJ9Z2V0RXZlbnRIYW5kbGVyKG4pe3JldHVybiB0aGlzLl9ldmVudFNsb3RzLmdldChuKT8ub25IYW5kbGVyfWFkZEV2ZW50TGlzdGVuZXIobixyKXt0aGlzLl9lbnN1cmVFdmVudFNsb3QobikubGlzdGVuZXJzLnB1c2gocil9cmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIpe2xldCBvPXRoaXMuX2V2ZW50U2xvdHMuZ2V0KG4pO2lmKCFvKXJldHVybjtsZXQgZT1vLmxpc3RlbmVycy5pbmRleE9mKHIpO2UhPT0tMSYmby5saXN0ZW5lcnMuc3BsaWNlKGUsMSl9c2V0UmVxdWVzdEhhbmRsZXI9KG4scik9Pnt0aGlzLl9hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4sInNldFJlcXVlc3RIYW5kbGVyIiksc3VwZXIuc2V0UmVxdWVzdEhhbmRsZXIobixyKX07c2V0Tm90aWZpY2F0aW9uSGFuZGxlcj0obixyKT0+e3RoaXMuX2Fzc2VydE1ldGhvZE5vdFJlZ2lzdGVyZWQobiwic2V0Tm90aWZpY2F0aW9uSGFuZGxlciIpLHN1cGVyLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKX07d2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZChuLHIsbyl7ciYmbyYmY29uc29sZS53YXJuKGBbTUNQIEFwcHNdICR7bn0gaGFuZGxlciByZXBsYWNlZC4gUHJldmlvdXMgaGFuZGxlciB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQuYCl9cmVwbGFjZVJlcXVlc3RIYW5kbGVyPShuLHIpPT57bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7dGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuYWRkKG8pLHN1cGVyLnNldFJlcXVlc3RIYW5kbGVyKG4scil9O19hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4scil7bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7aWYodGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuaGFzKG8pKXRocm93IEVycm9yKGBIYW5kbGVyIGZvciAiJHtvfSIgYWxyZWFkeSByZWdpc3RlcmVkICh2aWEgJHtyfSkuIFVzZSBhZGRFdmVudExpc3RlbmVyKCkgdG8gYXR0YWNoIG11bHRpcGxlIGxpc3RlbmVycywgb3IgdGhlIG9uKiBzZXR0ZXIgZm9yIHJlcGxhY2Ugc2VtYW50aWNzLmApO3RoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLmFkZChvKX19dmFyIHIkPSIyMDI2LTAxLTI2IixpJD0idWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0LXBhcnRpYWwiO2NsYXNzIG8ke2V2ZW50VGFyZ2V0O2V2ZW50U291cmNlO21lc3NhZ2VMaXN0ZW5lcjtjb25zdHJ1Y3RvcihuPXdpbmRvdy5wYXJlbnQscil7dGhpcy5ldmVudFRhcmdldD1uLHRoaXMuZXZlbnRTb3VyY2U9cix0aGlzLm1lc3NhZ2VMaXN0ZW5lcj1vPT57aWYociYmby5zb3VyY2UhPT10aGlzLmV2ZW50U291cmNlKXtjb25zb2xlLmRlYnVnKCJJZ25vcmluZyBtZXNzYWdlIGZyb20gdW5rbm93biBzb3VyY2UiLG8pO3JldHVybn1sZXQgZT1fdi5zYWZlUGFyc2Uoby5kYXRhKTtlLnN1Y2Nlc3M/KGNvbnNvbGUuZGVidWcoIlBhcnNlZCBtZXNzYWdlIixlLmRhdGEpLHRoaXMub25tZXNzYWdlPy4oZS5kYXRhKSk6by5kYXRhPy5qc29ucnBjIT09IjIuMCI/Y29uc29sZS5kZWJ1ZygiSWdub3Jpbmcgbm9uLUpTT04tUlBDIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKTooY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKSx0aGlzLm9uZXJyb3I/LihFcnJvcigiSW52YWxpZCBKU09OLVJQQyBtZXNzYWdlIHJlY2VpdmVkOiAiK2UuZXJyb3IubWVzc2FnZSkpKX19YXN5bmMgc3RhcnQoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5tZXNzYWdlTGlzdGVuZXIpfWFzeW5jIHNlbmQobixyKXtuLm1ldGhvZCE9PWkkJiZjb25zb2xlLmRlYnVnKCJTZW5kaW5nIG1lc3NhZ2UiLG4pLHRoaXMuZXZlbnRUYXJnZXQucG9zdE1lc3NhZ2UobiwiKiIpfWFzeW5jIGNsb3NlKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMubWVzc2FnZUxpc3RlbmVyKSx0aGlzLm9uY2xvc2U/LigpfW9uY2xvc2U7b25lcnJvcjtvbm1lc3NhZ2U7c2Vzc2lvbklkO3NldFByb3RvY29sVmVyc2lvbn12YXIgYSQ9VShbcCgibGlnaHQiKSxwKCJkYXJrIildKS5kZXNjcmliZSgiQ29sb3IgdGhlbWUgcHJlZmVyZW5jZSBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQuIiksenQ9VShbcCgiaW5saW5lIikscCgiZnVsbHNjcmVlbiIpLHAoInBpcCIpXSkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZSBmb3IgVUkgcHJlc2VudGF0aW9uLiIpLHMkPVUoW3AoIi0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXNlY29uZGFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1pbnZlcnNlIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWdob3N0IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWluZm8iKSxwKCItLWNvbG9yLWJhY2tncm91bmQtZGFuZ2VyIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MiKSxwKCItLWNvbG9yLWJhY2tncm91bmQtd2FybmluZyIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItdGV4dC1wcmltYXJ5IikscCgiLS1jb2xvci10ZXh0LXNlY29uZGFyeSIpLHAoIi0tY29sb3ItdGV4dC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItdGV4dC1pbnZlcnNlIikscCgiLS1jb2xvci10ZXh0LWdob3N0IikscCgiLS1jb2xvci10ZXh0LWluZm8iKSxwKCItLWNvbG9yLXRleHQtZGFuZ2VyIikscCgiLS1jb2xvci10ZXh0LXN1Y2Nlc3MiKSxwKCItLWNvbG9yLXRleHQtd2FybmluZyIpLHAoIi0tY29sb3ItdGV4dC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItYm9yZGVyLXByaW1hcnkiKSxwKCItLWNvbG9yLWJvcmRlci1zZWNvbmRhcnkiKSxwKCItLWNvbG9yLWJvcmRlci10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYm9yZGVyLWludmVyc2UiKSxwKCItLWNvbG9yLWJvcmRlci1naG9zdCIpLHAoIi0tY29sb3ItYm9yZGVyLWluZm8iKSxwKCItLWNvbG9yLWJvcmRlci1kYW5nZXIiKSxwKCItLWNvbG9yLWJvcmRlci1zdWNjZXNzIikscCgiLS1jb2xvci1ib3JkZXItd2FybmluZyIpLHAoIi0tY29sb3ItYm9yZGVyLWRpc2FibGVkIikscCgiLS1jb2xvci1yaW5nLXByaW1hcnkiKSxwKCItLWNvbG9yLXJpbmctc2Vjb25kYXJ5IikscCgiLS1jb2xvci1yaW5nLWludmVyc2UiKSxwKCItLWNvbG9yLXJpbmctaW5mbyIpLHAoIi0tY29sb3ItcmluZy1kYW5nZXIiKSxwKCItLWNvbG9yLXJpbmctc3VjY2VzcyIpLHAoIi0tY29sb3ItcmluZy13YXJuaW5nIikscCgiLS1mb250LXNhbnMiKSxwKCItLWZvbnQtbW9ubyIpLHAoIi0tZm9udC13ZWlnaHQtbm9ybWFsIikscCgiLS1mb250LXdlaWdodC1tZWRpdW0iKSxwKCItLWZvbnQtd2VpZ2h0LXNlbWlib2xkIikscCgiLS1mb250LXdlaWdodC1ib2xkIikscCgiLS1mb250LXRleHQteHMtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXNtLXNpemUiKSxwKCItLWZvbnQtdGV4dC1tZC1zaXplIikscCgiLS1mb250LXRleHQtbGctc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLXhzLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1zaXplIikscCgiLS1mb250LWhlYWRpbmctbWQtc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLWxnLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy14bC1zaXplIikscCgiLS1mb250LWhlYWRpbmctMnhsLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy0zeGwtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXhzLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LXRleHQtc20tbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtdGV4dC1tZC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC10ZXh0LWxnLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmcteHMtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLW1kLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmctbGctbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy14bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTJ4bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTN4bC1saW5lLWhlaWdodCIpLHAoIi0tYm9yZGVyLXJhZGl1cy14cyIpLHAoIi0tYm9yZGVyLXJhZGl1cy1zbSIpLHAoIi0tYm9yZGVyLXJhZGl1cy1tZCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1sZyIpLHAoIi0tYm9yZGVyLXJhZGl1cy14bCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1mdWxsIikscCgiLS1ib3JkZXItd2lkdGgtcmVndWxhciIpLHAoIi0tc2hhZG93LWhhaXJsaW5lIikscCgiLS1zaGFkb3ctc20iKSxwKCItLXNoYWRvdy1tZCIpLHAoIi0tc2hhZG93LWxnIildKS5kZXNjcmliZSgiQ1NTIHZhcmlhYmxlIGtleXMgYXZhaWxhYmxlIHRvIE1DUCBhcHBzIGZvciB0aGVtaW5nLiIpLGMkPVAocyQuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCksVShbbSgpLFllKCldKS5kZXNjcmliZShgU3R5bGUgdmFyaWFibGVzIGZvciB0aGVtaW5nIE1DUCBhcHBzLgoKSW5kaXZpZHVhbCBzdHlsZSBrZXlzIGFyZSBvcHRpb25hbCAtIGhvc3RzIG1heSBwcm92aWRlIGFueSBzdWJzZXQgb2YgdGhlc2UgdmFsdWVzLgpWYWx1ZXMgYXJlIHN0cmluZ3MgY29udGFpbmluZyBDU1MgdmFsdWVzIChjb2xvcnMsIHNpemVzLCBmb250IHN0YWNrcywgZXRjLikuCgpOb3RlOiBUaGlzIHR5cGUgdXNlcyBcYFJlY29yZDxLLCBzdHJpbmcgfCB1bmRlZmluZWQ+XGAgcmF0aGVyIHRoYW4gXGBQYXJ0aWFsPFJlY29yZDxLLCBzdHJpbmc+PlxgCmZvciBjb21wYXRpYmlsaXR5IHdpdGggWm9kIHNjaGVtYSBnZW5lcmF0aW9uLiBCb3RoIGFyZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCBmb3IgdmFsaWRhdGlvbi5gKSkuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCk7Zih7bWV0aG9kOnAoInVpL29wZW4tbGluayIpLHBhcmFtczpmKHt1cmw6bSgpLmRlc2NyaWJlKCJVUkwgdG8gb3BlbiBpbiB0aGUgaG9zdCdzIGJyb3dzZXIiKX0pfSk7dmFyIHUkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGhvc3QgZmFpbGVkIHRvIG9wZW4gdGhlIFVSTCAoZS5nLiwgZHVlIHRvIHNlY3VyaXR5IHBvbGljeSkuIil9KS5wYXNzdGhyb3VnaCgpLGwkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGRvd25sb2FkIGZhaWxlZCAoZS5nLiwgdXNlciBjYW5jZWxsZWQgb3IgaG9zdCBkZW5pZWQpLiIpfSkucGFzc3Rocm91Z2goKSxkJD1mKHtpc0Vycm9yOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJUcnVlIGlmIHRoZSBob3N0IHJlamVjdGVkIG9yIGZhaWxlZCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlLiIpfSkucGFzc3Rocm91Z2goKTtmKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9zYW5kYm94LXByb3h5LXJlYWR5IikscGFyYW1zOmYoe30pfSk7dmFyIGlzPWYoe2Nvbm5lY3REb21haW5zOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKGBPcmlnaW5zIGZvciBuZXR3b3JrIHJlcXVlc3RzIChmZXRjaC9YSFIvV2ViU29ja2V0KS4KCi0gTWFwcyB0byBDU1AgXGBjb25uZWN0LXNyY1xgIGRpcmVjdGl2ZQotIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgY29ubmVjdGlvbnMgKHNlY3VyZSBkZWZhdWx0KWApLHJlc291cmNlRG9tYWluczpJKG0oKSkub3B0aW9uYWwoKS5kZXNjcmliZSgiT3JpZ2lucyBmb3Igc3RhdGljIHJlc291cmNlcyAoaW1hZ2VzLCBzY3JpcHRzLCBzdHlsZXNoZWV0cywgZm9udHMsIG1lZGlhKS5cblxuLSBNYXBzIHRvIENTUCBgaW1nLXNyY2AsIGBzY3JpcHQtc3JjYCwgYHN0eWxlLXNyY2AsIGBmb250LXNyY2AsIGBtZWRpYS1zcmNgIGRpcmVjdGl2ZXNcbi0gV2lsZGNhcmQgc3ViZG9tYWlucyBzdXBwb3J0ZWQ6IGBodHRwczovLyouZXhhbXBsZS5jb21gXG4tIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgcmVzb3VyY2VzIChzZWN1cmUgZGVmYXVsdCkiKSxmcmFtZURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk9yaWdpbnMgZm9yIG5lc3RlZCBpZnJhbWVzLlxuXG4tIE1hcHMgdG8gQ1NQIGBmcmFtZS1zcmNgIGRpcmVjdGl2ZVxuLSBFbXB0eSBvciBvbWl0dGVkIOKGkiBubyBuZXN0ZWQgaWZyYW1lcyBhbGxvd2VkIChgZnJhbWUtc3JjICdub25lJ2ApIiksYmFzZVVyaURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkFsbG93ZWQgYmFzZSBVUklzIGZvciB0aGUgZG9jdW1lbnQuXG5cbi0gTWFwcyB0byBDU1AgYGJhc2UtdXJpYCBkaXJlY3RpdmVcbi0gRW1wdHkgb3Igb21pdHRlZCDihpIgb25seSBzYW1lIG9yaWdpbiBhbGxvd2VkIChgYmFzZS11cmkgJ3NlbGYnYCkiKX0pLG9zPWYoe2NhbWVyYTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJSZXF1ZXN0IGNhbWVyYSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGNhbWVyYWAgZmVhdHVyZS4iKSxtaWNyb3Bob25lOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYG1pY3JvcGhvbmVgIGZlYXR1cmUuIiksZ2VvbG9jYXRpb246Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUmVxdWVzdCBnZW9sb2NhdGlvbiBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGdlb2xvY2F0aW9uYCBmZWF0dXJlLiIpLGNsaXBib2FyZFdyaXRlOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgY2xpcGJvYXJkIHdyaXRlIGFjY2Vzcy5cblxuTWFwcyB0byBQZXJtaXNzaW9uIFBvbGljeSBgY2xpcGJvYXJkLXdyaXRlYCBmZWF0dXJlLiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIikscGFyYW1zOmYoe3dpZHRoOlQoKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJOZXcgd2lkdGggaW4gcGl4ZWxzLiIpLGhlaWdodDpUKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiTmV3IGhlaWdodCBpbiBwaXhlbHMuIil9KX0pO3ZhciBtJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0IikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIkNvbXBsZXRlIHRvb2wgY2FsbCBhcmd1bWVudHMgYXMga2V5LXZhbHVlIHBhaXJzLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJDb21wbGV0ZSB0b29sIGNhbGwgYXJndW1lbnRzIGFzIGtleS12YWx1ZSBwYWlycy4iKX0pfSkscCQ9Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvdG9vbC1pbnB1dC1wYXJ0aWFsIikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIil9KX0pLGYkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtY2FuY2VsbGVkIikscGFyYW1zOmYoe3JlYXNvbjptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgnT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgY2FuY2VsbGF0aW9uIChlLmcuLCAidXNlciBhY3Rpb24iLCAidGltZW91dCIpLicpfSl9KSxnJD1mKHtmb250czptKCkub3B0aW9uYWwoKX0pLHYkPWYoe3ZhcmlhYmxlczpjJC5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1MgdmFyaWFibGVzIGZvciB0aGVtaW5nIHRoZSBhcHAuIiksY3NzOmckLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNTUyBibG9ja3MgdGhhdCBhcHBzIGNhbiBpbmplY3QuIil9KSxoJD1mKHttZXRob2Q6cCgidWkvcmVzb3VyY2UtdGVhcmRvd24iKSxwYXJhbXM6Zih7fSl9KTtQKG0oKSxFKCkpO3ZhciBxcz1mKHt0ZXh0OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgdGV4dCBjb250ZW50IGJsb2Nrcy4iKSxpbWFnZTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIGltYWdlIGNvbnRlbnQgYmxvY2tzLiIpLGF1ZGlvOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgYXVkaW8gY29udGVudCBibG9ja3MuIikscmVzb3VyY2U6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBjb250ZW50IGJsb2Nrcy4iKSxyZXNvdXJjZUxpbms6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBsaW5rIGNvbnRlbnQgYmxvY2tzLiIpLHN0cnVjdHVyZWRDb250ZW50OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgc3RydWN0dXJlZCBjb250ZW50LiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvcmVxdWVzdC10ZWFyZG93biIpLHBhcmFtczpmKHt9KS5vcHRpb25hbCgpfSk7dmFyICQkPWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxQKG0oKSxobigpKS5kZXNjcmliZSgiRXhwZXJpbWVudGFsIGZlYXR1cmVzIGtleWVkIGJ5IGlkZW50aWZpZXIuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpLG9wZW5MaW5rczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIG9wZW5pbmcgZXh0ZXJuYWwgVVJMcy4iKSxkb3dubG9hZEZpbGU6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyBmaWxlIGRvd25sb2FkcyB2aWEgdWkvZG93bmxvYWQtZmlsZS4iKSxzZXJ2ZXJUb29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyB0b29scy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHRvb2wgY2FsbHMgdG8gdGhlIE1DUCBzZXJ2ZXIuIiksc2VydmVyUmVzb3VyY2VzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHJlc291cmNlcy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHJlc291cmNlIHJlYWRzIHRvIHRoZSBNQ1Agc2VydmVyLiIpLGxvZ2dpbmc6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBhY2NlcHRzIGxvZyBtZXNzYWdlcy4iKSxzYW5kYm94OmYoe3Blcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhlIGhvc3QgKGNhbWVyYSwgbWljcm9waG9uZSwgZ2VvbG9jYXRpb24pLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgZG9tYWlucyBhcHByb3ZlZCBieSB0aGUgaG9zdC4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggY29uZmlndXJhdGlvbiBhcHBsaWVkIGJ5IHRoZSBob3N0LiIpLHVwZGF0ZU1vZGVsQ29udGV4dDpxcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFjY2VwdHMgY29udGV4dCB1cGRhdGVzICh1aS91cGRhdGUtbW9kZWwtY29udGV4dCkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1vZGVsJ3MgY29udGV4dCBmb3IgZnV0dXJlIHR1cm5zLiIpLG1lc3NhZ2U6cXMub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZWNlaXZpbmcgY29udGVudCBtZXNzYWdlcyAodWkvbWVzc2FnZSkgZnJvbSB0aGUgdmlldy4iKSxzYW1wbGluZzpmKHt0b29sczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHRvb2wgdXNlIHZpYSBgdG9vbHNgIGFuZCBgdG9vbENob2ljZWAgcGFyYW1ldGVycy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgTExNIHNhbXBsaW5nIChzYW1wbGluZy9jcmVhdGVNZXNzYWdlKSBmcm9tIHRoZSB2aWV3LlxuTWlycm9ycyB0aGUgTUNQIGBDbGllbnRDYXBhYmlsaXRpZXMuc2FtcGxpbmdgIHNoYXBlIHNvIGhvc3RzIGNhbiBwYXNzIGl0IHRocm91Z2guIil9KSxfJD1mKHtleHBlcmltZW50YWw6UChtKCksUChtKCksaG4oKSkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJFeHBlcmltZW50YWwgZmVhdHVyZXMga2V5ZWQgYnkgaWRlbnRpZmllci4iKSx0b29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIHN1cHBvcnRzIHRvb2xzL2xpc3RfY2hhbmdlZCBub3RpZmljYXRpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIGV4cG9zZXMgTUNQLXN0eWxlIHRvb2xzIHRoYXQgdGhlIGhvc3QgY2FuIGNhbGwuIiksYXZhaWxhYmxlRGlzcGxheU1vZGVzOkkoenQpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZXMgdGhlIGFwcCBzdXBwb3J0cy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmYoe30pLm9wdGlvbmFsKCl9KTtmKHtjc3A6aXMub3B0aW9uYWwoKS5kZXNjcmliZSgiQ29udGVudCBTZWN1cml0eSBQb2xpY3kgY29uZmlndXJhdGlvbiBmb3IgVUkgcmVzb3VyY2VzLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBVSSByZXNvdXJjZS4iKSxkb21haW46bSgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYERlZGljYXRlZCBvcmlnaW4gZm9yIHZpZXcgc2FuZGJveC4KClVzZWZ1bCB3aGVuIHZpZXdzIG5lZWQgc3RhYmxlLCBkZWRpY2F0ZWQgb3JpZ2lucyBmb3IgT0F1dGggY2FsbGJhY2tzLCBDT1JTIHBvbGljaWVzLCBvciBBUEkga2V5IGFsbG93bGlzdHMuCgoqKkhvc3QtZGVwZW5kZW50OioqIFRoZSBmb3JtYXQgYW5kIHZhbGlkYXRpb24gcnVsZXMgZm9yIHRoaXMgZmllbGQgYXJlIGRldGVybWluZWQgYnkgZWFjaCBob3N0LiBTZXJ2ZXJzIE1VU1QgY29uc3VsdCBob3N0LXNwZWNpZmljIGRvY3VtZW50YXRpb24gZm9yIHRoZSBleHBlY3RlZCBkb21haW4gZm9ybWF0LiBDb21tb24gcGF0dGVybnMgaW5jbHVkZToKLSBIYXNoLWJhc2VkIHN1YmRvbWFpbnMgKGUuZy4sIFxge2hhc2h9LmNsYXVkZW1jcGNvbnRlbnQuY29tXGApCi0gVVJMLWRlcml2ZWQgc3ViZG9tYWlucyAoZS5nLiwgXGB3d3ctZXhhbXBsZS1jb20ub2FpdXNlcmNvbnRlbnQuY29tXGApCgpJZiBvbWl0dGVkLCBob3N0IHVzZXMgZGVmYXVsdCBzYW5kYm94IG9yaWdpbiAodHlwaWNhbGx5IHBlci1jb252ZXJzYXRpb24pLmApLHByZWZlcnNCb3JkZXI6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYFZpc3VhbCBib3VuZGFyeSBwcmVmZXJlbmNlIC0gdHJ1ZSBpZiB2aWV3IHByZWZlcnMgYSB2aXNpYmxlIGJvcmRlci4KCkJvb2xlYW4gcmVxdWVzdGluZyB3aGV0aGVyIGEgdmlzaWJsZSBib3JkZXIgYW5kIGJhY2tncm91bmQgaXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIFNwZWNpZnlpbmcgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMgaXMgcmVjb21tZW5kZWQgYmVjYXVzZSBob3N0cycgZGVmYXVsdHMgbWF5IHZhcnkuCgotIFxgdHJ1ZVxgOiByZXF1ZXN0IHZpc2libGUgYm9yZGVyICsgYmFja2dyb3VuZAotIFxgZmFsc2VcYDogcmVxdWVzdCBubyB2aXNpYmxlIGJvcmRlciArIGJhY2tncm91bmQKLSBvbWl0dGVkOiBob3N0IGRlY2lkZXMgYm9yZGVyYCl9KTtmKHttZXRob2Q6cCgidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiKSxwYXJhbXM6Zih7bW9kZTp6dC5kZXNjcmliZSgiVGhlIGRpc3BsYXkgbW9kZSBiZWluZyByZXF1ZXN0ZWQuIil9KX0pO3ZhciBiJD1mKHttb2RlOnp0LmRlc2NyaWJlKCJUaGUgZGlzcGxheSBtb2RlIHRoYXQgd2FzIGFjdHVhbGx5IHNldC4gTWF5IGRpZmZlciBmcm9tIHJlcXVlc3RlZCBpZiBub3Qgc3VwcG9ydGVkLiIpfSkucGFzc3Rocm91Z2goKSx5JD1VKFtwKCJtb2RlbCIpLHAoImFwcCIpXSkuZGVzY3JpYmUoIlRvb2wgdmlzaWJpbGl0eSBzY29wZSAtIHdobyBjYW4gYWNjZXNzIHRoZSB0b29sLiIpO2Yoe3Jlc291cmNlVXJpOm0oKS5vcHRpb25hbCgpLHZpc2liaWxpdHk6SSh5JCkub3B0aW9uYWwoKS5kZXNjcmliZShgV2hvIGNhbiBhY2Nlc3MgdGhpcyB0b29sLiBEZWZhdWx0OiBbIm1vZGVsIiwgImFwcCJdCi0gIm1vZGVsIjogVG9vbCB2aXNpYmxlIHRvIGFuZCBjYWxsYWJsZSBieSB0aGUgYWdlbnQKLSAiYXBwIjogVG9vbCBjYWxsYWJsZSBieSB0aGUgYXBwIGZyb20gdGhpcyBzZXJ2ZXIgb25seWApLGNzcDpaZSgpLm9wdGlvbmFsKCkscGVybWlzc2lvbnM6WmUoKS5vcHRpb25hbCgpfSk7Zih7bWltZVR5cGVzOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCdBcnJheSBvZiBzdXBwb3J0ZWQgTUlNRSB0eXBlcyBmb3IgVUkgcmVzb3VyY2VzLlxuTXVzdCBpbmNsdWRlIGAidGV4dC9odG1sO3Byb2ZpbGU9bWNwLWFwcCJgIGZvciBNQ1AgQXBwcyBzdXBwb3J0LicpfSk7Zih7bWV0aG9kOnAoInVpL2Rvd25sb2FkLWZpbGUiKSxwYXJhbXM6Zih7Y29udGVudHM6SShVKFtrbSxTbV0pKS5kZXNjcmliZSgiUmVzb3VyY2UgY29udGVudHMgdG8gZG93bmxvYWQg4oCUIGVtYmVkZGVkIChpbmxpbmUgZGF0YSkgb3IgbGlua2VkIChob3N0IGZldGNoZXMpLiBVc2VzIHN0YW5kYXJkIE1DUCByZXNvdXJjZSB0eXBlcy4iKX0pfSk7Zih7bWV0aG9kOnAoInVpL21lc3NhZ2UiKSxwYXJhbXM6Zih7cm9sZTpwKCJ1c2VyIikuZGVzY3JpYmUoJ01lc3NhZ2Ugcm9sZSwgY3VycmVudGx5IG9ubHkgInVzZXIiIGlzIHN1cHBvcnRlZC4nKSxjb250ZW50OkkoVW4pLmRlc2NyaWJlKCJNZXNzYWdlIGNvbnRlbnQgYmxvY2tzICh0ZXh0LCBpbWFnZSwgZXRjLikuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3NhbmRib3gtcmVzb3VyY2UtcmVhZHkiKSxwYXJhbXM6Zih7aHRtbDptKCkuZGVzY3JpYmUoIkhUTUwgY29udGVudCB0byBsb2FkIGludG8gdGhlIGlubmVyIGlmcmFtZS4iKSxzYW5kYm94Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIGlubmVyIGlmcmFtZSdzIHNhbmRib3ggYXR0cmlidXRlLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgY29uZmlndXJhdGlvbiBmcm9tIHJlc291cmNlIG1ldGFkYXRhLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgZnJvbSByZXNvdXJjZSBtZXRhZGF0YS4iKX0pfSk7dmFyIGskPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtcmVzdWx0IikscGFyYW1zOnJpLmRlc2NyaWJlKCJTdGFuZGFyZCBNQ1AgdG9vbCBleGVjdXRpb24gcmVzdWx0LiIpfSksam09Zih7dG9vbEluZm86Zih7aWQ6SW4ub3B0aW9uYWwoKS5kZXNjcmliZSgiSlNPTi1SUEMgaWQgb2YgdGhlIHRvb2xzL2NhbGwgcmVxdWVzdC4iKSx0b29sOnJzLmRlc2NyaWJlKCJUb29sIGRlZmluaXRpb24gaW5jbHVkaW5nIG5hbWUsIGlucHV0U2NoZW1hLCBldGMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJNZXRhZGF0YSBvZiB0aGUgdG9vbCBjYWxsIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgQXBwLiIpLHRoZW1lOmEkLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkN1cnJlbnQgY29sb3IgdGhlbWUgcHJlZmVyZW5jZS4iKSxzdHlsZXM6diQub3B0aW9uYWwoKS5kZXNjcmliZSgiU3R5bGUgY29uZmlndXJhdGlvbiBmb3IgdGhlbWluZyB0aGUgYXBwLiIpLGRpc3BsYXlNb2RlOnp0Lm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvdyB0aGUgVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4iKSxhdmFpbGFibGVEaXNwbGF5TW9kZXM6SSh6dCkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGlzcGxheSBtb2RlcyB0aGUgaG9zdCBzdXBwb3J0cy4iKSxjb250YWluZXJEaW1lbnNpb25zOlUoW2Yoe2hlaWdodDpUKCkuZGVzY3JpYmUoIkZpeGVkIGNvbnRhaW5lciBoZWlnaHQgaW4gcGl4ZWxzLiIpfSksZih7bWF4SGVpZ2h0OlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgaGVpZ2h0IGluIHBpeGVscy4iKX0pXSkuYW5kKFUoW2Yoe3dpZHRoOlQoKS5kZXNjcmliZSgiRml4ZWQgY29udGFpbmVyIHdpZHRoIGluIHBpeGVscy4iKX0pLGYoe21heFdpZHRoOlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgd2lkdGggaW4gcGl4ZWxzLiIpfSldKSkub3B0aW9uYWwoKS5kZXNjcmliZShgQ29udGFpbmVyIGRpbWVuc2lvbnMuIFJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlmcmFtZSBvciBvdGhlcgpjb250YWluZXIgaG9sZGluZyB0aGUgYXBwLiBTcGVjaWZ5IGVpdGhlciB3aWR0aCBvciBtYXhXaWR0aCwgYW5kIGVpdGhlciBoZWlnaHQgb3IgbWF4SGVpZ2h0LmApLGxvY2FsZTptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiVXNlcidzIGxhbmd1YWdlIGFuZCByZWdpb24gcHJlZmVyZW5jZSBpbiBCQ1AgNDcgZm9ybWF0LiIpLHRpbWVab25lOm0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJVc2VyJ3MgdGltZXpvbmUgaW4gSUFOQSBmb3JtYXQuIiksdXNlckFnZW50Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpZXIuIikscGxhdGZvcm06VShbcCgid2ViIikscCgiZGVza3RvcCIpLHAoIm1vYmlsZSIpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUGxhdGZvcm0gdHlwZSBmb3IgcmVzcG9uc2l2ZSBkZXNpZ24gZGVjaXNpb25zLiIpLGRldmljZUNhcGFiaWxpdGllczpmKHt0b3VjaDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvdWNoIGlucHV0LiIpLGhvdmVyOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJXaGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgaG92ZXIgaW50ZXJhY3Rpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGV2aWNlIGlucHV0IGNhcGFiaWxpdGllcy4iKSxzYWZlQXJlYUluc2V0czpmKHt0b3A6VCgpLmRlc2NyaWJlKCJUb3Agc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKSxyaWdodDpUKCkuZGVzY3JpYmUoIlJpZ2h0IHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksYm90dG9tOlQoKS5kZXNjcmliZSgiQm90dG9tIHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksbGVmdDpUKCkuZGVzY3JpYmUoIkxlZnQgc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk1vYmlsZSBzYWZlIGFyZWEgYm91bmRhcmllcyBpbiBwaXhlbHMuIil9KS5wYXNzdGhyb3VnaCgpLFMkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2hvc3QtY29udGV4dC1jaGFuZ2VkIikscGFyYW1zOmptLmRlc2NyaWJlKCJQYXJ0aWFsIGNvbnRleHQgdXBkYXRlIGNvbnRhaW5pbmcgb25seSBjaGFuZ2VkIGZpZWxkcy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIpLHBhcmFtczpmKHtjb250ZW50OkkoVW4pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNvbnRleHQgY29udGVudCBibG9ja3MgKHRleHQsIGltYWdlLCBldGMuKS4iKSxzdHJ1Y3R1cmVkQ29udGVudDpQKG0oKSxFKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9pbml0aWFsaXplIikscGFyYW1zOmYoe2FwcEluZm86dGkuZGVzY3JpYmUoIkFwcCBpZGVudGlmaWNhdGlvbiAobmFtZSBhbmQgdmVyc2lvbikuIiksYXBwQ2FwYWJpbGl0aWVzOl8kLmRlc2NyaWJlKCJGZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzIHRoaXMgYXBwIHByb3ZpZGVzLiIpLHByb3RvY29sVmVyc2lvbjptKCkuZGVzY3JpYmUoIlByb3RvY29sIHZlcnNpb24gdGhpcyBhcHAgc3VwcG9ydHMuIil9KX0pO3ZhciB3JD1mKHtwcm90b2NvbFZlcnNpb246bSgpLmRlc2NyaWJlKCdOZWdvdGlhdGVkIHByb3RvY29sIHZlcnNpb24gc3RyaW5nIChlLmcuLCAiMjAyNS0xMS0yMSIpLicpLGhvc3RJbmZvOnRpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpY2F0aW9uIGFuZCB2ZXJzaW9uLiIpLGhvc3RDYXBhYmlsaXRpZXM6JCQuZGVzY3JpYmUoIkZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIiksaG9zdENvbnRleHQ6am0uZGVzY3JpYmUoIlJpY2ggY29udGV4dCBhYm91dCB0aGUgaG9zdCBlbnZpcm9ubWVudC4iKX0pLnBhc3N0aHJvdWdoKCksSSQ9e3RhcmdldDoiZHJhZnQtMjAyMC0xMiJ9O2FzeW5jIGZ1bmN0aW9uIEZzKHQsbil7bGV0IHI9dFsifnN0YW5kYXJkIl07aWYoci5qc29uU2NoZW1hKXJldHVybiByLmpzb25TY2hlbWFbbl0oSSQpO2lmKHIudmVuZG9yPT09InpvZCIpe2xldHt6Om99PWF3YWl0IEFtKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5wdiksdm9pZCAwLGltcG9ydC5tZXRhLnVybCk7cmV0dXJuIG8udG9KU09OU2NoZW1hKHQse2lvOm59KX10aHJvdyBFcnJvcihgU2NoZW1hICh2ZW5kb3I6ICR7ci52ZW5kb3J9KSBkb2VzIG5vdCBpbXBsZW1lbnQgU3RhbmRhcmQgSlNPTiBTY2hlbWEgKH5zdGFuZGFyZC5qc29uU2NoZW1hKS4gVXNlIGEgbGlicmFyeSB0aGF0IGRvZXMgKHpvZCB2NCwgQXJrVHlwZSwgVmFsaWJvdCkgb3Igd3JhcCB5b3VyIHNjaGVtYSBhY2NvcmRpbmdseS5gKX1hc3luYyBmdW5jdGlvbiBKcyh0LG4scj0iIil7bGV0IG89YXdhaXQgdFsifnN0YW5kYXJkIl0udmFsaWRhdGUobik7aWYoby5pc3N1ZXMpe2xldCBlPW8uaXNzdWVzLm1hcChpPT57bGV0IGE9aS5wYXRoPy5tYXAocz0+dHlwZW9mIHM9PSJvYmplY3QiP3Mua2V5OnMpLmpvaW4oIi4iKTtyZXR1cm4gYT9gJHthfTogJHtpLm1lc3NhZ2V9YDppLm1lc3NhZ2V9KS5qb2luKCI7ICIpO3Rocm93IEVycm9yKHIrZSl9cmV0dXJuIG8udmFsdWV9Y2xhc3MgYXMgZXh0ZW5kcyBuJHtfYXBwSW5mbztfY2FwYWJpbGl0aWVzO29wdGlvbnM7X2hvc3RDYXBhYmlsaXRpZXM7X2hvc3RJbmZvO19ob3N0Q29udGV4dDtfcmVnaXN0ZXJlZFRvb2xzPXt9O19pbml0aWFsaXplZFNlbnQ9ITE7X2Fzc2VydEluaXRpYWxpemVkKG4pe2lmKHRoaXMuX2luaXRpYWxpemVkU2VudClyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gQXBwLiR7bn0oKSBjYWxsZWQgYmVmb3JlIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBBd2FpdCBhcHAuY29ubmVjdCgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBvciBtb3ZlIGRhdGEgbG9hZGluZyB0byBhbiBvbnRvb2xyZXN1bHQgaGFuZGxlci5gO2lmKHRoaXMub3B0aW9ucz8uc3RyaWN0KXRocm93IEVycm9yKHIpO2NvbnNvbGUud2FybihgJHtyfS4gVGhpcyB3aWxsIHRocm93IGluIGEgZnV0dXJlIHJlbGVhc2UuYCl9ZXZlbnRTY2hlbWFzPXt0b29saW5wdXQ6bSQsdG9vbGlucHV0cGFydGlhbDpwJCx0b29scmVzdWx0OmskLHRvb2xjYW5jZWxsZWQ6ZiQsaG9zdGNvbnRleHRjaGFuZ2VkOlMkfTtzdGF0aWMgT05FX1NIT1RfRVZFTlRTPW5ldyBTZXQoWyJ0b29saW5wdXQiLCJ0b29saW5wdXRwYXJ0aWFsIiwidG9vbHJlc3VsdCIsInRvb2xjYW5jZWxsZWQiXSk7X2V2ZXJIYWRMaXN0ZW5lcj1uZXcgU2V0O19hc3NlcnRIYW5kbGVyVGltaW5nKG4pe2lmKCFhcy5PTkVfU0hPVF9FVkVOVFMuaGFzKG4pfHx0aGlzLl9ldmVySGFkTGlzdGVuZXIuaGFzKG4pfHwodGhpcy5fZXZlckhhZExpc3RlbmVyLmFkZChuKSwhdGhpcy5faW5pdGlhbGl6ZWRTZW50KSlyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gIiR7U3RyaW5nKG4pfSIgaGFuZGxlciByZWdpc3RlcmVkIGFmdGVyIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBUaGUgaG9zdCBtYXkgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyBub3RpZmljYXRpb24uIFJlZ2lzdGVyIGhhbmRsZXJzIGJlZm9yZSBjYWxsaW5nIGFwcC5jb25uZWN0KCkuYDtpZih0aGlzLm9wdGlvbnM/LnN0cmljdCl0aHJvdyBFcnJvcihyKTtjb25zb2xlLndhcm4ocil9c2V0RXZlbnRIYW5kbGVyKG4scil7ciYmdGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5zZXRFdmVudEhhbmRsZXIobixyKX1hZGRFdmVudExpc3RlbmVyKG4scil7dGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5hZGRFdmVudExpc3RlbmVyKG4scil9b25FdmVudERpc3BhdGNoKG4scil7bj09PSJob3N0Y29udGV4dGNoYW5nZWQiJiYodGhpcy5faG9zdENvbnRleHQ9ey4uLnRoaXMuX2hvc3RDb250ZXh0LC4uLnJ9KX1jb25zdHJ1Y3RvcihuLHI9e30sbz17YXV0b1Jlc2l6ZTohMH0pe3N1cGVyKG8pLHRoaXMuX2FwcEluZm89bix0aGlzLl9jYXBhYmlsaXRpZXM9cix0aGlzLm9wdGlvbnM9byxvLmFsbG93VW5zYWZlRXZhbHx8Syh7aml0bGVzczohMH0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIobmksZT0+KGNvbnNvbGUubG9nKCJSZWNlaXZlZCBwaW5nOiIsZS5wYXJhbXMpLHt9KSksdGhpcy5zZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIsdm9pZCAwKX1yZWdpc3RlckNhcGFiaWxpdGllcyhuKXtpZih0aGlzLnRyYW5zcG9ydCl0aHJvdyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGNhcGFiaWxpdGllcyBhZnRlciB0cmFuc3BvcnQgaXMgZXN0YWJsaXNoZWQiKTt0aGlzLl9jYXBhYmlsaXRpZXM9dCQodGhpcy5fY2FwYWJpbGl0aWVzLG4pfXJlZ2lzdGVyVG9vbChuLHIsbyl7aWYodGhpcy5fcmVnaXN0ZXJlZFRvb2xzW25dKXRocm93IEVycm9yKGBUb29sICR7bn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7bGV0IGU9dGhpcyxpPSgpPT57ZS5faW5pdGlhbGl6ZWRTZW50JiZlLl9jYXBhYmlsaXRpZXMudG9vbHM/Lmxpc3RDaGFuZ2VkJiZlLnNlbmRUb29sTGlzdENoYW5nZWQoKX0sYT1yLmlucHV0U2NoZW1hIT09dm9pZCAwLHM9e3RpdGxlOnIudGl0bGUsZGVzY3JpcHRpb246ci5kZXNjcmlwdGlvbixpbnB1dFNjaGVtYTpyLmlucHV0U2NoZW1hLG91dHB1dFNjaGVtYTpyLm91dHB1dFNjaGVtYSxhbm5vdGF0aW9uczpyLmFubm90YXRpb25zLF9tZXRhOnIuX21ldGEsZW5hYmxlZDohMCxlbmFibGUoKXt0aGlzLmVuYWJsZWQ9ITAsaSgpfSxkaXNhYmxlKCl7dGhpcy5lbmFibGVkPSExLGkoKX0sdXBkYXRlKGMpe09iamVjdC5hc3NpZ24odGhpcyxjKSxpKCl9LHJlbW92ZSgpe2UuX3JlZ2lzdGVyZWRUb29sc1tuXT09PXMmJihkZWxldGUgZS5fcmVnaXN0ZXJlZFRvb2xzW25dLGkoKSl9LGhhbmRsZXI6YXN5bmMoYyx1KT0+e2lmKCFzLmVuYWJsZWQpdGhyb3cgRXJyb3IoYFRvb2wgJHtufSBpcyBkaXNhYmxlZGApO2xldCBsO2lmKGEpe2xldCBnPXMuaW5wdXRTY2hlbWEsdj1nP2F3YWl0IEpzKGcsYz8/e30sYEludmFsaWQgaW5wdXQgZm9yIHRvb2wgJHtufTogYCk6Yz8/e307bD1hd2FpdCBvKHYsdSl9ZWxzZSBsPWF3YWl0IG8odSk7cmV0dXJuIHMub3V0cHV0U2NoZW1hJiYhbC5pc0Vycm9yJiYobC5zdHJ1Y3R1cmVkQ29udGVudD1hd2FpdCBKcyhzLm91dHB1dFNjaGVtYSxsLnN0cnVjdHVyZWRDb250ZW50LGBJbnZhbGlkIG91dHB1dCBmb3IgdG9vbCAke259OiBgKSksbH19O3JldHVybiB0aGlzLl9yZWdpc3RlcmVkVG9vbHNbbl09cywhdGhpcy5fY2FwYWJpbGl0aWVzLnRvb2xzJiYhdGhpcy50cmFuc3BvcnQmJnRoaXMucmVnaXN0ZXJDYXBhYmlsaXRpZXMoe3Rvb2xzOntsaXN0Q2hhbmdlZDohMH19KSx0aGlzLmVuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCksaSgpLHN9X3Rvb2xIYW5kbGVyc0luaXRpYWxpemVkPSExO2Vuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCl7dGhpcy5fdG9vbEhhbmRsZXJzSW5pdGlhbGl6ZWR8fCh0aGlzLl90b29sSGFuZGxlcnNJbml0aWFsaXplZD0hMCx0aGlzLm9uY2FsbHRvb2w9YXN5bmMobixyKT0+e2xldCBvPXRoaXMuX3JlZ2lzdGVyZWRUb29sc1tuLm5hbWVdO2lmKCFvKXRocm93IEVycm9yKGBUb29sICR7bi5uYW1lfSBub3QgZm91bmRgKTtyZXR1cm4gby5oYW5kbGVyKG4uYXJndW1lbnRzLHIpfSx0aGlzLm9ubGlzdHRvb2xzPWFzeW5jKG4scik9Pih7dG9vbHM6YXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModGhpcy5fcmVnaXN0ZXJlZFRvb2xzKS5maWx0ZXIoKFtvLGVdKT0+ZS5lbmFibGVkKS5tYXAoYXN5bmMoW28sZV0pPT57bGV0IGk9e25hbWU6byx0aXRsZTplLnRpdGxlLGRlc2NyaXB0aW9uOmUuZGVzY3JpcHRpb24saW5wdXRTY2hlbWE6ZS5pbnB1dFNjaGVtYT9hd2FpdCBGcyhlLmlucHV0U2NoZW1hLCJpbnB1dCIpOnt0eXBlOiJvYmplY3QiLHByb3BlcnRpZXM6e319fTtyZXR1cm4gZS5vdXRwdXRTY2hlbWEmJihpLm91dHB1dFNjaGVtYT1hd2FpdCBGcyhlLm91dHB1dFNjaGVtYSwib3V0cHV0IikpLGUuYW5ub3RhdGlvbnMmJihpLmFubm90YXRpb25zPWUuYW5ub3RhdGlvbnMpLGUuX21ldGEmJihpLl9tZXRhPWUuX21ldGEpLGl9KSl9KSl9YXN5bmMgc2VuZFRvb2xMaXN0Q2hhbmdlZChuPXt9KXt0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZFRvb2xMaXN0Q2hhbmdlZCIpLGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdG9vbHMvbGlzdF9jaGFuZ2VkIixwYXJhbXM6bn0pfWdldEhvc3RDYXBhYmlsaXRpZXMoKXtyZXR1cm4gdGhpcy5faG9zdENhcGFiaWxpdGllc31nZXRIb3N0VmVyc2lvbigpe3JldHVybiB0aGlzLl9ob3N0SW5mb31nZXRIb3N0Q29udGV4dCgpe3JldHVybiB0aGlzLl9ob3N0Q29udGV4dH1nZXQgb250b29saW5wdXQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xpbnB1dCIpfXNldCBvbnRvb2xpbnB1dChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0IixuKX1nZXQgb250b29saW5wdXRwYXJ0aWFsKCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJ0b29saW5wdXRwYXJ0aWFsIil9c2V0IG9udG9vbGlucHV0cGFydGlhbChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0cGFydGlhbCIsbil9Z2V0IG9udG9vbHJlc3VsdCgpe3JldHVybiB0aGlzLmdldEV2ZW50SGFuZGxlcigidG9vbHJlc3VsdCIpfXNldCBvbnRvb2xyZXN1bHQobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoInRvb2xyZXN1bHQiLG4pfWdldCBvbnRvb2xjYW5jZWxsZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xjYW5jZWxsZWQiKX1zZXQgb250b29sY2FuY2VsbGVkKG4pe3RoaXMuc2V0RXZlbnRIYW5kbGVyKCJ0b29sY2FuY2VsbGVkIixuKX1nZXQgb25ob3N0Y29udGV4dGNoYW5nZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIpfXNldCBvbmhvc3Rjb250ZXh0Y2hhbmdlZChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigiaG9zdGNvbnRleHRjaGFuZ2VkIixuKX1fb250ZWFyZG93bjtnZXQgb250ZWFyZG93bigpe3JldHVybiB0aGlzLl9vbnRlYXJkb3dufXNldCBvbnRlYXJkb3duKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib250ZWFyZG93biIsdGhpcy5fb250ZWFyZG93bixuKSx0aGlzLl9vbnRlYXJkb3duPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIoaCQsKHIsbyk9PntpZighdGhpcy5fb250ZWFyZG93bil0aHJvdyBFcnJvcigiTm8gb250ZWFyZG93biBoYW5kbGVyIHNldCIpO3JldHVybiB0aGlzLl9vbnRlYXJkb3duKHIucGFyYW1zLG8pfSl9X29uY2FsbHRvb2w7Z2V0IG9uY2FsbHRvb2woKXtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbH1zZXQgb25jYWxsdG9vbChuKXt0aGlzLndhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQoIm9uY2FsbHRvb2wiLHRoaXMuX29uY2FsbHRvb2wsbiksdGhpcy5fb25jYWxsdG9vbD1uLHRoaXMucmVwbGFjZVJlcXVlc3RIYW5kbGVyKEltLChyLG8pPT57aWYoIXRoaXMuX29uY2FsbHRvb2wpdGhyb3cgRXJyb3IoIk5vIG9uY2FsbHRvb2wgaGFuZGxlciBzZXQiKTtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbChyLnBhcmFtcyxvKX0pfV9vbmxpc3R0b29scztnZXQgb25saXN0dG9vbHMoKXtyZXR1cm4gdGhpcy5fb25saXN0dG9vbHN9c2V0IG9ubGlzdHRvb2xzKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib25saXN0dG9vbHMiLHRoaXMuX29ubGlzdHRvb2xzLG4pLHRoaXMuX29ubGlzdHRvb2xzPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIod20sKHIsbyk9PntpZighdGhpcy5fb25saXN0dG9vbHMpdGhyb3cgRXJyb3IoIk5vIG9ubGlzdHRvb2xzIGhhbmRsZXIgc2V0Iik7cmV0dXJuIHRoaXMuX29ubGlzdHRvb2xzKHIucGFyYW1zLG8pfSl9YXNzZXJ0Q2FwYWJpbGl0eUZvck1ldGhvZChuKXtzd2l0Y2gobil7Y2FzZSJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIjppZighdGhpcy5faG9zdENhcGFiaWxpdGllcz8uc2FtcGxpbmcpdGhyb3cgRXJyb3IoYEhvc3QgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGluZyAocmVxdWlyZWQgZm9yICR7bn0pYCk7YnJlYWt9fWFzc2VydFJlcXVlc3RIYW5kbGVyQ2FwYWJpbGl0eShuKXtzd2l0Y2gobil7Y2FzZSJ0b29scy9jYWxsIjpjYXNlInRvb2xzL2xpc3QiOmlmKCF0aGlzLl9jYXBhYmlsaXRpZXMudG9vbHMpdGhyb3cgRXJyb3IoYENsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHRvb2wgY2FwYWJpbGl0eSAocmVxdWlyZWQgZm9yICR7bn0pYCk7cmV0dXJuO2Nhc2UicGluZyI6Y2FzZSJ1aS9yZXNvdXJjZS10ZWFyZG93biI6cmV0dXJuO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYE5vIGhhbmRsZXIgZm9yIG1ldGhvZCAke259IHJlZ2lzdGVyZWRgKX19YXNzZXJ0Tm90aWZpY2F0aW9uQ2FwYWJpbGl0eShuKXt9YXNzZXJ0VGFza0NhcGFiaWxpdHkobil7dGhyb3cgRXJyb3IoIlRhc2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXNzZXJ0VGFza0hhbmRsZXJDYXBhYmlsaXR5KG4pe3Rocm93IEVycm9yKCJUYXNrIGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXN5bmMgY2FsbFNlcnZlclRvb2wobixyKXtpZih0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgiY2FsbFNlcnZlclRvb2wiKSx0eXBlb2Ygbj09InN0cmluZyIpdGhyb3cgRXJyb3IoYGNhbGxTZXJ2ZXJUb29sKCkgZXhwZWN0cyBhbiBvYmplY3QgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBidXQgcmVjZWl2ZWQgYSBzdHJpbmcgKCIke259IikuIERpZCB5b3UgbWVhbjogY2FsbFNlcnZlclRvb2woeyBuYW1lOiAiJHtufSIsIGFyZ3VtZW50czogeyAuLi4gfSB9KT9gKTtyZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRvb2xzL2NhbGwiLHBhcmFtczpufSxyaSx7b25wcm9ncmVzczooKT0+e30scmVzZXRUaW1lb3V0T25Qcm9ncmVzczohMCwuLi5yfSl9YXN5bmMgcmVhZFNlcnZlclJlc291cmNlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZWFkU2VydmVyUmVzb3VyY2UiKSxhd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoicmVzb3VyY2VzL3JlYWQiLHBhcmFtczpufSx5bSxyKX1hc3luYyBsaXN0U2VydmVyUmVzb3VyY2VzKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJsaXN0U2VydmVyUmVzb3VyY2VzIiksYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InJlc291cmNlcy9saXN0IixwYXJhbXM6bn0sYm0scil9YXN5bmMgY3JlYXRlU2FtcGxpbmdNZXNzYWdlKG4scil7dGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImNyZWF0ZVNhbXBsaW5nTWVzc2FnZSIpO2xldCBvPW4udG9vbHM/VG06eG07cmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7bWV0aG9kOiJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIixwYXJhbXM6bn0sbyxyKX1zZW5kTWVzc2FnZShuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZE1lc3NhZ2UiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvbWVzc2FnZSIscGFyYW1zOm59LGQkLHIpfXNlbmRMb2cobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvbWVzc2FnZSIscGFyYW1zOm59KX11cGRhdGVNb2RlbENvbnRleHQobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoInVwZGF0ZU1vZGVsQ29udGV4dCIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIscGFyYW1zOm59LHFhLHIpfW9wZW5MaW5rKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJvcGVuTGluayIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9vcGVuLWxpbmsiLHBhcmFtczpufSx1JCxyKX1zZW5kT3Blbkxpbms9dGhpcy5vcGVuTGluaztkb3dubG9hZEZpbGUobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImRvd25sb2FkRmlsZSIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9kb3dubG9hZC1maWxlIixwYXJhbXM6bn0sbCQscil9cmVxdWVzdFRlYXJkb3duKG49e30pe3JldHVybiB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJ1aS9ub3RpZmljYXRpb25zL3JlcXVlc3QtdGVhcmRvd24iLHBhcmFtczpufSl9cmVxdWVzdERpc3BsYXlNb2RlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZXF1ZXN0RGlzcGxheU1vZGUiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiLHBhcmFtczpufSxiJCxyKX1zZW5kU2l6ZUNoYW5nZWQobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIixwYXJhbXM6bn0pfXNldHVwU2l6ZUNoYW5nZWROb3RpZmljYXRpb25zKCl7bGV0IG49ITEscj0wLG89MCxlPSgpPT57bnx8KG49ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bj0hMTtsZXQgYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscz1hLnN0eWxlLmhlaWdodDthLnN0eWxlLmhlaWdodD0ibWF4LWNvbnRlbnQiO2xldCBjPU1hdGguY2VpbChhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7YS5zdHlsZS5oZWlnaHQ9cztsZXQgdT1NYXRoLmNlaWwod2luZG93LmlubmVyV2lkdGgpOyh1IT09cnx8YyE9PW8pJiYocj11LG89Yyx0aGlzLnNlbmRTaXplQ2hhbmdlZCh7d2lkdGg6dSxoZWlnaHQ6Y30pKX0pKX07ZSgpO2xldCBpPW5ldyBSZXNpemVPYnNlcnZlcihlKTtyZXR1cm4gaS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksaS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpLCgpPT5pLmRpc2Nvbm5lY3QoKX1hc3luYyBjb25uZWN0KG49bmV3IG8kKHdpbmRvdy5wYXJlbnQsd2luZG93LnBhcmVudCkscil7aWYodGhpcy50cmFuc3BvcnQpdGhyb3cgRXJyb3IoIkFwcCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4gQ2FsbCBjbG9zZSgpIGJlZm9yZSBjb25uZWN0aW5nIGFnYWluLiIpO3RoaXMuX2luaXRpYWxpemVkU2VudD0hMSxhd2FpdCBzdXBlci5jb25uZWN0KG4pO3RyeXtsZXQgbz1hd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvaW5pdGlhbGl6ZSIscGFyYW1zOnthcHBDYXBhYmlsaXRpZXM6dGhpcy5fY2FwYWJpbGl0aWVzLGFwcEluZm86dGhpcy5fYXBwSW5mbyxwcm90b2NvbFZlcnNpb246ciR9fSx3JCxyKTtpZihvPT09dm9pZCAwKXRocm93IEVycm9yKGBTZXJ2ZXIgc2VudCBpbnZhbGlkIGluaXRpYWxpemUgcmVzdWx0OiAke299YCk7dGhpcy5faG9zdENhcGFiaWxpdGllcz1vLmhvc3RDYXBhYmlsaXRpZXMsdGhpcy5faG9zdEluZm89by5ob3N0SW5mbyx0aGlzLl9ob3N0Q29udGV4dD1vLmhvc3RDb250ZXh0LGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvaW5pdGlhbGl6ZWQifSksdGhpcy5faW5pdGlhbGl6ZWRTZW50PSEwLHRoaXMub3B0aW9ucz8uYXV0b1Jlc2l6ZSYmdGhpcy5zZXR1cFNpemVDaGFuZ2VkTm90aWZpY2F0aW9ucygpfWNhdGNoKG8pe3Rocm93IHRoaXMuY2xvc2UoKSxvfX19Y29uc3QgT209e2VuOntsb2FkaW5nOiJMb2FkaW5n4oCmIixvcGVuaW5nOiJPcGVuaW5nIGNoZWNrb3V04oCmIixwYXlpbmc6IlBheWluZyB2aWEge21ldGhvZH3igKYiLGVtcHR5Q2F0YWxvZzoiTm90aGluZyBpbiB0aGUgY2F0YWxvZy4iLG5vT3JkZXJzOiJObyBvcmRlcnMgeWV0IOKAlCBwaWNrIHNvbWV0aGluZyBmcm9tIHRoZSBjYXRhbG9nIGZpcnN0LiIscHJvZHVjdENvdW50OiJ7Y291bnR9IHByb2R1Y3RzIixvcmRlcmVkRmFsbGJhY2s6Ik9yZGVyZWQge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiJCdXkge3Byb2R1Y3R9IHdpdGggQ3VybGVzcyB3YWxsZXQiLGJhY2s6IuKGkCBDaG9vc2UgYW5vdGhlciB3YXkiLG9yZGVyQWdhaW46Ik9yZGVyIGFub3RoZXIiLHZpZXdPcmRlcnM6IlZpZXcgbXkgb3JkZXJzIOKGkiIsb3JkZXJlZDoiT3JkZXJlZCIsbm90Q29tcGxldGVkOiJOb3QgY29tcGxldGVkIixvbmVTdGVwTGVmdDoiT25lIHN0ZXAgbGVmdCIsc2lnbkluOiJTaWduIGluIHRvIEN1cmxlc3MiLHNpZ25JbkdvOiJTaWduIGluIOKGlyIsc2lnbkluV2FpdDoiVGhpcyBjYXJkIHJlY29ubmVjdHMgb24gaXRzIG93biBvbmNlIHlvdSBhcmUgaW4uIEJpbmRpbmcgYSBjYXJkIGhhcHBlbnMgdGhlcmUgdG9vLiIsc2lnbmVkSW5QYXlpbmc6IlNpZ25lZCBpbiBhcyB7ZW1haWx9IOKAlCBwYXlpbmfigKYiLHNpZ25JbkV4cGlyZWQ6IlRoYXQgc2lnbi1pbiB0aW1lZCBvdXQg4oCUIHN0YXJ0IGl0IGFnYWluIGFib3ZlLiIsc2lnbkluTmV2ZXJTdGFydGVkOiJObyBzaWduLWluIHN0YXJ0ZWQgeWV0IOKAlCB1c2UgdGhlIGxpbmsgYWJvdmUuIixvcmRlcnNGYWlsZWQ6IkNvdWxkIG5vdCBsb2FkIHlvdXIgb3JkZXJzLiIsd2FsbGV0U2FpZE5vOiJXYWxsZXQgc2FpZCBubyIsb3BlbldhbGxldDoiT3BlbiB3YWxsZXQg4oaXIixnb1BheToiR28gcGF5IOKGlyIscGF5V2FpdDoiQXBwcm92ZSBpdCBpbiB5b3VyIGJyb3dzZXIgYW5kIHRoaXMgY2FyZCB0dXJucyBpbnRvIGEgcmVjZWlwdCBvbiBpdHMgb3duLiIscGF5VGltZW91dDoiTm8gcGF5bWVudCByZWNlaXZlZCB5ZXQuIE9uY2UgeW91IGhhdmUgcGFpZCwgY2hlY2sg4oCcbXkgb3JkZXJz4oCdLiIsaGFuZGVkT3ZlcjoiSGFuZGVkIHRvIHlvdXIgYXNzaXN0YW50IixoYW5kZWRPdmVyQm9keToiVGhpcyBvbmUgaXMgcGFpZCBmcm9tIHRoZSBDdXJsZXNzIHdhbGxldCBjb25uZWN0b3IgeW91IGluc3RhbGxlZCDigJQgdGhlIGNyZWRlbnRpYWwgbGl2ZXMgdGhlcmUsIGFuZCB0aGlzIGNhcmQgY2Fubm90IHJlYWNoIGl0LiIsaGFuZGVkT3ZlcldhaXQ6IllvdXIgYXNzaXN0YW50IHdpbGwgb3BlbiB0aGUgY2hlY2tvdXQsIGdldCB5b3Ugc2lnbmVkIGluIGlmIG5lZWRlZCwgYW5kIGNvbmZpcm0gdGhlIGFtb3VudCB3aXRoIHlvdSBiZWZvcmUgYW55dGhpbmcgaXMgY2hhcmdlZC4iLHJlZnVuZDoiUmVxdWVzdCBhIHJlZnVuZCIscmVmdW5kaW5nOiJXb3JraW5n4oCmIixyZWZ1bmRGYWlsZWQ6IlRoZSByZWZ1bmQgcmVxdWVzdCBmYWlsZWQiLG9uQ2hhaW5UeDoiT24tY2hhaW4gdHg6IixwYWlkQnk6IlBhaWQgYnk6IixjYW5ub3RPcGVuOiJDb3VsZCBub3Qgb3BlbiB0aGUgY2hlY2tvdXQiLGNhcmRGYWlsZWQ6IlRoZSBjYXJkIGNvdWxkIG5vdCBsb2FkIixub3RoaW5nVG9TaG93OiJOb3RoaW5nIHRvIHNob3cgaGVyZSIsbm90aGluZ1RvU2hvd0JvZHk6IkFzayBmb3IgYSBwcm9kdWN0IGJ5IG5hbWUsIG9yIGZvciB0aGUgY2F0YWxvZy4iLHJlZnJlc2g6IlJlZnJlc2giLG9yZGVyc1RpdGxlOiJNeSBvcmRlcnMifSx6aDp7bG9hZGluZzoi5Yqg6L295Lit4oCmIixvcGVuaW5nOiLmraPlnKjlvIDnu5PotKbigKYiLHBheWluZzoi5q2j5Zyo6YCa6L+HIHttZXRob2R9IOe7k+eul+KApiIsZW1wdHlDYXRhbG9nOiLnm67lvZXph4zmsqHmnInllYblk4HjgIIiLG5vT3JkZXJzOiLov5jmsqHmnInorqLljZUg4oCU4oCUIOWFiOS7juebruW9lemHjOaMkeS4gOS7tuOAgiIscHJvZHVjdENvdW50OiJ7Y291bnR9IOS7tuWVhuWTgSIsb3JkZXJlZEZhbGxiYWNrOiLlt7LkuIvljZUge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiLnlKggQ3VybGVzcyDpkrHljIXkubB7cHJvZHVjdH0iLGJhY2s6IuKGkCDmjaLkuKrmlK/ku5jmlrnlvI8iLG9yZGVyQWdhaW46IuWGjeiuouS4gOasoSIsdmlld09yZGVyczoi5p+l55yL5oiR55qE6K6i5Y2VIOKGkiIsb3JkZXJlZDoi5bey5LiL5Y2VIixub3RDb21wbGV0ZWQ6IuacquWujOaIkCIsb25lU3RlcExlZnQ6Iui/mOW3ruS4gOatpSIsc2lnbkluOiLnmbvlvZUgQ3VybGVzcyDpkrHljIUiLHNpZ25JbkdvOiLljrvnmbvlvZUg4oaXIixzaWduSW5XYWl0OiLnmbvlvZXlrozov5nlvKDljaHkvJroh6rlt7HmjqXkuIrjgILnu5HljaHkuZ/lnKjlkIzkuIDkuKrpobXpnaLph4zjgIIiLHNpZ25lZEluUGF5aW5nOiLlt7LnmbvlvZUge2VtYWlsfSDigJTigJQg5q2j5Zyo5LuY5qy+4oCmIixzaWduSW5FeHBpcmVkOiLnmbvlvZXotoXml7bkuoYs54K55LiK6Z2i6YeN5paw5p2l5LiA5qyh44CCIixzaWduSW5OZXZlclN0YXJ0ZWQ6Iui/mOayoeW8gOWni+eZu+W9lSDigJTigJQg54K55LiK6Z2i6YKj5Liq6ZO+5o6l44CCIixvcmRlcnNGYWlsZWQ6IuiuouWNleWKoOi9veWksei0peOAgiIsd2FsbGV0U2FpZE5vOiLpkrHljIXmnKrmlL7ooYwiLG9wZW5XYWxsZXQ6IuaJk+W8gOmSseWMhSDihpciLGdvUGF5OiLljrvku5jmrL4g4oaXIixwYXlXYWl0OiLlnKjmtY/op4jlmajph4zmibnlh4blkI4s6L+Z5byg5Y2h5Lya6Ieq5bex5Y+Y5oiQ5pS25o2u44CCIixwYXlUaW1lb3V0Oifov5jmsqHmlLbliLDku5jmrL7jgILku5jlrozngrnkuIDkuIsi5oiR55qE6K6i5Y2VIueci+eci+OAgicsaGFuZGVkT3Zlcjoi5Lqk57uZ5Yqp5omL57un57utIixoYW5kZWRPdmVyQm9keToi6L+Z56yU6KaB55So5L2g6Ieq5bex6KOF55qEIEN1cmxlc3Mg6ZKx5YyF6L+e5o6l5Zmo5LuYIOKAlOKAlCDlh63mja7lnKjpgqPkuKrov57mjqXlmajph4ws6L+Z5byg5Y2h5aSf5LiN5Yiw5a6D44CCIixoYW5kZWRPdmVyV2FpdDoi5Yqp5omL5Lya5YWI6K6p5L2g55m75b2V6ZKx5YyFLOWGjemTuOS4gOW8oOWHreaNruWujOaIkOS7mOasvizmiaPmrL7liY3kvJrot5/kvaDnoa7orqTph5Hpop3jgIIiLHJlZnVuZDoi55Sz6K+36YCA5qy+IixyZWZ1bmRpbmc6IuWkhOeQhuS4reKApiIscmVmdW5kRmFpbGVkOiLpgIDmrL7nlLPor7flpLHotKUiLG9uQ2hhaW5UeDoi6ZO+5LiK5Lqk5piTOiIscGFpZEJ5OiLku5jmrL7mlrnlvI86IixjYW5ub3RPcGVuOiLmiZPkuI3lvIDnu5PotKYiLGNhcmRGYWlsZWQ6IuWNoeeJh+WKoOi9veWksei0pSIsbm90aGluZ1RvU2hvdzoi6L+Z6YeM5rKh5pyJ5Y+v5pi+56S655qE5YaF5a65Iixub3RoaW5nVG9TaG93Qm9keToi6K+05Ye65ZWG5ZOB5ZCN5a2XLOaIluiAheiuqeaIkeaJk+W8gOebruW9leOAgiIscmVmcmVzaDoi5Yi35pawIixvcmRlcnNUaXRsZToi5oiR55qE6K6i5Y2VIn19LE49dD0+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksaz10PT5TdHJpbmcodD8/IiIpLnJlcGxhY2UoL1smPD4iJ10vZyxuPT4oeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KVtuXSksUG49KHQsbik9PnQucmVwbGFjZSgvXHsoXHcrKVx9L2csKHIsbyk9PlN0cmluZyhuW29dPz9yKSksb2U9bmV3IGFzKHtuYW1lOiJzaW5vY2FyZS1jaGVja291dCIsdmVyc2lvbjoiMi4wLjAifSk7bGV0IHo9T20uZW4sQj1udWxsLHdlPW51bGwsSmU9W107Y29uc3QgVW09dD0+e2NvbnN0IG49dD8ubGFuZzsobj09PSJlbiJ8fG49PT0iemgiKSYmKHo9T21bbl0pfSx6JD0odCxuLHIpPT5gZyR7dH1yJHtufWEke3J9YCxQbT10PT57Y29uc3Qgbj0vXmcoXGQrKXIoXGQrKWEoXGQrKSQvLmV4ZWModCk7aWYoIW58fCFCKXJldHVybjtjb25zdCByPUIuZ3JvdXBzW051bWJlcihuWzFdKV0/LnJvd3NbTnVtYmVyKG5bMl0pXSxvPXI/LmFjdGlvbnNbTnVtYmVyKG5bM10pXTtpZighcnx8IW8pcmV0dXJuO2NvbnN0IGU9ci5hY3Rpb25zLmxlbmd0aD4xP2Ake3IudGl0bGV9IMK3ICR7by5sYWJlbH1gOnIudGl0bGU7cmV0dXJuey4uLm8scm93OnIudGl0bGUsZGlzcGxheTplfX0sX3Q9KHQsbik9Pntjb25zdCByPSgpPT57b2Uub3Blbkxpbmsoe3VybDpufSkuY2F0Y2goKCk9PndpbmRvdy5vcGVuKG4sIl9ibGFuayIpKX0sbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTtvPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsciksbz8uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZT0+eyhlLmtleT09PSJFbnRlciJ8fGUua2V5PT09IiAiKSYmcigpfSl9LEllPSgpPT5gPGJ1dHRvbiBjbGFzcz0iYmFjayIgaWQ9ImJhY2siPiR7ayh6LmJhY2spfTwvYnV0dG9uPmAsVWU9KCk9PntOKCJiYWNrIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2lmKEIpcmV0dXJuIGNzKEIpO2lmKHdlKXJldHVybiBzcyh3ZSl9KX0seCQ9KCk9PmA8YnV0dG9uIGNsYXNzPSJnbyIgaWQ9Im9yZGVycyI+JHtrKHoudmlld09yZGVycyl9PC9idXR0b24+YCxUJD0oKT0+e04oIm9yZGVycyIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJzcGluIj4ke2soei5sb2FkaW5nKX08L2Rpdj5gLE5tKCl9KX0seHQ9dD0+e04oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+PHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHouY2FyZEZhaWxlZCl9PC9zcGFuPjxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj48L2Rpdj5gfTtsZXQgbWk9bnVsbCxvaT0hMTtjb25zdCBpaT10PT57bWk9dDtjb25zdCBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7biYmKG4uaGlkZGVuPSF0LG4udGl0bGU9ei5yZWZyZXNoLG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix6LnJlZnJlc2gpKX0saiQ9KCk9Pntjb25zdCB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7dCYmdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntpZihvaXx8IW1pKXJldHVybjtvaT0hMCx0LmRpc2FibGVkPSEwLHQuY2xhc3NMaXN0LmFkZCgiYnVzeSIpO2NvbnN0IG49KCk9PntvaT0hMTtjb25zdCByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7ciYmKHIuZGlzYWJsZWQ9ITEsci5jbGFzc0xpc3QucmVtb3ZlKCJidXN5IikpfTttaSgpLnRoZW4obixuKX0pfSxzcz10PT57d2U9dCxCPW51bGwsaWkobnVsbCk7Y29uc3Qgbj10LnByb2R1Y3RzPz9bXTtOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PVBuKHoucHJvZHVjdENvdW50LHtjb3VudDpuLmxlbmd0aH0pLE4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBncmlkIj4ke24ubWFwKChyLG8pPT5gPGRpdiBjbGFzcz0icGNlbGwiPgogICAgICAke3IuaW1hZ2VVcmw/YDxpbWcgY2xhc3M9InBpbWciIHNyYz0iJHtrKHIuaW1hZ2VVcmwpfSIgYWx0PSIiIGxvYWRpbmc9ImxhenkiPmA6YDxkaXYgY2xhc3M9InBpbWcgbm9uZSI+JHtrKHIuY2F0ZWdvcnk/PyIiKX08L2Rpdj5gfQogICAgICA8ZGl2IGNsYXNzPSJwbmFtZSI+JHtrKHIubmFtZSl9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InBtZXRhIj4ke3IucHJpY2VEaXNwbGF5P2soci5wcmljZURpc3BsYXkpOiIifTwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJhY3QgcGJ1eSIgaWQ9InAke299Ij5CdXk8L2J1dHRvbj4KICAgIDwvZGl2PmApLmpvaW4oIiIpfHxgPGRpdiBjbGFzcz0ici1zdWIiPiR7ayh6LmVtcHR5Q2F0YWxvZyl9PC9kaXY+YH08L2Rpdj5gLG4uZm9yRWFjaCgocixvKT0+TihgcCR7b31gKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ic3BpbiI+JHtrKHoub3BlbmluZyl9PC9kaXY+YCxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToic3RhcnRfc2lub2NhcmVfY2hlY2tvdXQiLGFyZ3VtZW50czp7c2t1OnIuc2t1fX0pLnRoZW4oZT0+e2xldCBpPWU/LnN0cnVjdHVyZWRDb250ZW50O2lmKCFpKXRyeXtpPUpTT04ucGFyc2UoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibnVsbCIpfWNhdGNoe31pZihpKXthZT0hMSxscyhpLCEwKTtyZXR1cm59SHMoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibm8gYW5zd2VyIGZyb20gdGhlIHN0b3JlZnJvbnQiKX0pLmNhdGNoKGU9PkhzKFN0cmluZyhlPy5tZXNzYWdlPz9lKSkpfSkpfSxIcz10PT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBlcnIiPiR7ayh6LmNhbm5vdE9wZW4pfTwvc3Bhbj4KICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj4KICAgICR7SWUoKX08L2Rpdj5gLFVlKCl9LE8kPSh0LG4scik9Pntjb25zdCBvPXIuYWN0aW9ucy5tYXAoKGUsaSk9PmA8YnV0dG9uIGRhdGEtYWN0PSIke3okKHQsbixpKX0iIGNsYXNzPSIke2UuZXh0PyJhY3QgZXh0IjoiYWN0In0iPiR7ayhlLmxhYmVsKX0ke2UuZXh0PyIg4oaXIjoiIOKGkiJ9PC9idXR0b24+YCkuam9pbigiIik7cmV0dXJuYDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1tYWluIj48c3BhbiBjbGFzcz0ici10aXRsZSI+JHtrKHIudGl0bGUpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7ayhyLnN1Yil9PC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJyb3ctYWN0cyI+JHtvfTwvZGl2PgogICAgPC9kaXY+YH0sY3M9dD0+e2lpKG51bGwpLEI9dCx3ZT13ZT8/bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXQucHJvZHVjdC5za3U7Y29uc3Qgbj0odC5ncm91cHM/P1tdKS5tYXAoKG8sZSk9PmA8ZGl2IGNsYXNzPSJncm91cC1sYWJlbCI+JHtrKG8ubGFiZWwpfTwvZGl2PjxkaXYgY2xhc3M9InJvd3MiPiR7by5yb3dzLm1hcCgoaSxhKT0+TyQoZSxhLGkpKS5qb2luKCIiKX08L2Rpdj5gKS5qb2luKCIiKSxyPXQucHJvZHVjdC5pbWFnZVVybD9gPGltZyBjbGFzcz0iaGVybyIgc3JjPSIke2sodC5wcm9kdWN0LmltYWdlVXJsKX0iIGFsdD0iJHtrKHQucHJvZHVjdC5uYW1lKX0iIG9uZXJyb3I9InRoaXMucmVtb3ZlKCkiPmA6IiI7TigiY29udGVudCIpLmlubmVySFRNTD1gCiAgICAke3J9CiAgICA8ZGl2IGNsYXNzPSJwcmljZSI+JHtrKHQucHJvZHVjdC5wcmljZURpc3BsYXk/PyIiKX08L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN1YiI+JHtrKHQucHJvZHVjdC5uYW1lKX0ke3QucXVhbnRpdHk+MT9gIMOXICR7dC5xdWFudGl0eX1gOiIifTwvZGl2PgogICAgJHtufQogICAgICAke3dlP0llKCk6IiJ9YDtmb3IoY29uc3QgbyBvZiBBcnJheS5mcm9tKE4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b25bZGF0YS1hY3RdIikpKW8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5EbShvLmRhdGFzZXQuYWN0KSk7TigiYmFjayIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PndlJiZzcyh3ZSkpfSxObT0odD0hMSk9Pm9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJsaXN0X215X29yZGVycyIsYXJndW1lbnRzOnt9fSkudGhlbihuPT57Y29uc3Qgcj1uPy5zdHJ1Y3R1cmVkQ29udGVudDtyPy52aWV3PT09Im9yZGVycyI/dXMocik6dHx8eHQoei5vcmRlcnNGYWlsZWQpfSkuY2F0Y2gobj0+e3R8fHh0KFN0cmluZyhuPy5tZXNzYWdlPz9uKSl9KSxVJD10PT4vY2FwdHVyZWR8Y29tcGxldGVkfHBhaWQvaS50ZXN0KHQuc3RhdHVzKSYmIS9yZWZ1bmQvaS50ZXN0KHQuc3RhdHVzKSYmIXQucmVmdW5kUGVuZGluZyxQJD10PT57Y29uc3Qgbj1TdHJpbmcodCkudG9Mb3dlckNhc2UoKTtyZXR1cm5gPHNwYW4gY2xhc3M9Im9zdGF0ICR7L3JlZnVuZC8udGVzdChuKT8id2FybiI6L2NhcHR1cmVkfGNvbXBsZXRlZHxwYWlkfHNldHRsZWQvLnRlc3Qobik/Im9rIjoibXV0ZWQifSI+JHtrKHQpfTwvc3Bhbj5gfSx1cz10PT57aWYoVW0odCksSmU9dC5vcmRlcnM/P1tdLEI9bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXoub3JkZXJzVGl0bGUsaWkoKCk9Pk5tKCEwKSksIUplLmxlbmd0aCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iZW1wdHkiPiR7ayh6Lm5vT3JkZXJzKX08L2Rpdj5gO3JldHVybn1OKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyb3dzIG9saXN0Ij4ke0plLm1hcCgobixyKT0+e2NvbnN0IG89W24udG90YWwsbi5wcm90b2NvbCxuLmRhdGVdLmZpbHRlcihCb29sZWFuKS5tYXAoaykuam9pbigiIMK3ICIpO3JldHVybmA8ZGl2IGNsYXNzPSJyb3ciIGRhdGEtcm93PSIke3J9Ij4KICAgICAgPGRpdiBjbGFzcz0icm93LW1haW4iPjxzcGFuIGNsYXNzPSJyLXRpdGxlIj4ke2sobi5wcm9kdWN0fHxuLm9yZGVySWQpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7b308L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1hY3RzIj4KICAgICAgICAke1AkKG4uc3RhdHVzKX0KICAgICAgICAke1UkKG4pP2A8YnV0dG9uIGNsYXNzPSJhY3QiIGRhdGEtcmVmdW5kPSIke3J9Ij4ke2soei5yZWZ1bmQpfTwvYnV0dG9uPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+YH0pLmpvaW4oIiIpfTwvZGl2PmA7Zm9yKGNvbnN0IG4gb2YgQXJyYXkuZnJvbShOKCJjb250ZW50IikucXVlcnlTZWxlY3RvckFsbCgiYnV0dG9uW2RhdGEtcmVmdW5kXSIpKSluLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+TiQoTnVtYmVyKG4uZGF0YXNldC5yZWZ1bmQpKSl9LE4kPXQ9Pntjb25zdCBuPUplW3RdO2lmKCFuKXJldHVybjtjb25zdCByPU4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yKGBidXR0b25bZGF0YS1yZWZ1bmQ9IiR7dH0iXWApLG89TigiY29udGVudCIpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvdz0iJHt0fSJdYCk7bz8ucXVlcnlTZWxlY3RvcigiLm8tZXJyIik/LnJlbW92ZSgpLHImJihyLmRpc2FibGVkPSEwLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmRpbmcpO2NvbnN0IGU9aT0+e2lmKHImJihyLmRpc2FibGVkPSExLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmQpLCFvKXJldHVybjtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuY2xhc3NOYW1lPSJvLWVyciIsYS50ZXh0Q29udGVudD1pLG8uYXBwZW5kQ2hpbGQoYSl9O29lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJyZXF1ZXN0X3JlZnVuZCIsYXJndW1lbnRzOntvcmRlcklkOm4ub3JkZXJJZH19KS50aGVuKGk9PntsZXQgYT17fTt0cnl7YT1KU09OLnBhcnNlKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGk/LmlzRXJyb3J8fGEucmVxdWVzdGVkPT09ITEpe2UoU3RyaW5nKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/YS5tZXNzYWdlPz96LnJlZnVuZEZhaWxlZCkpO3JldHVybn1KZVt0XT17Li4ubixzdGF0dXM6YS5zdGF0dXM/PyJyZWZ1bmQgcmVxdWVzdGVkIixyZWZ1bmRQZW5kaW5nOiEwfSx1cyh7b3JkZXJzOkplfSl9KS5jYXRjaChpPT5lKFN0cmluZyhpPy5tZXNzYWdlPz9pPz96LnJlZnVuZEZhaWxlZCkpKX0sRCQ9KCk9PntpZighQilyZXR1cm47Y29uc3QgdD1CLnByb2R1Y3Q7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5oYW5kZWRPdmVyKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5oYW5kZWRPdmVyQm9keSl9PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJtb25vIj4ke2sodC5uYW1lKX0ke3QucHJpY2VEaXNwbGF5P2AgwrcgJHtrKHQucHJpY2VEaXNwbGF5KX1gOiIifTwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIj4ke2soei5oYW5kZWRPdmVyV2FpdCl9PC9kaXY+CiAgICAke0llKCl9PC9kaXY+YCxVZSgpO2NvbnN0IG49UG4oei5oYW5kT2ZmQXNrLHtwcm9kdWN0OmAke3QubmFtZX0ke0IucXVhbnRpdHk+MT9gIMOXICR7Qi5xdWFudGl0eX1gOiIifWB9KTtvZS5zZW5kTWVzc2FnZSh7cm9sZToidXNlciIsY29udGVudDpbe3R5cGU6InRleHQiLHRleHQ6bn1dfSkuY2F0Y2goKCk9Pnt9KX0sRG09dD0+e2NvbnN0IG49UG0odCk7aWYoISghbnx8IUIpKXtpZihuLmNoYXQpe0QkKCk7cmV0dXJufU4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InNwaW4iPiR7ayhQbih6LnBheWluZyx7bWV0aG9kOm4uZGlzcGxheX0pKX08L2Rpdj5gLG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOm4udG9vbCxhcmd1bWVudHM6e3NrdTpCLnByb2R1Y3Quc2t1LHF1YW50aXR5OkIucXVhbnRpdHksLi4ubi5hcmdzPz97fX19KS50aGVuKHI9PkpuKHQscikpLmNhdGNoKHI9PkpuKHQse2lzRXJyb3I6ITAsY29udGVudDpbe3RleHQ6U3RyaW5nKHI/Lm1lc3NhZ2U/P3IpfV19KSl9fSxFJD0odCxuLHIpPT57Y29uc3Qgbz1OKCJwd2FpdCIpO2xldCBlPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ZT0hMH0pO2xldCBpPTA7Y29uc3QgYT0oKT0+e2V8fG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJnZXRfc2lub2NhcmVfb3JkZXJfc3RhdHVzIixhcmd1bWVudHM6e3Nlc3Npb25JZDp0LG1lcmNoYW50SWQ6bn19KS50aGVuKHM9PntpZihlKXJldHVybjtsZXQgYz17fTt0cnl7Yz1KU09OLnBhcnNlKHM/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGMucGFpZCl7Sm4ocixzKTtyZXR1cm59aWYoKytpPjIwMCl7byYmKG8udGV4dENvbnRlbnQ9ei5wYXlUaW1lb3V0KTtyZXR1cm59c2V0VGltZW91dChhLDNlMyl9KS5jYXRjaCgoKT0+e2V8fHNldFRpbWVvdXQoYSw0ZTMpfSl9O3NldFRpbWVvdXQoYSwzZTMpfSxaJD10PT57Y29uc3Qgbj1OKCJ3d2FpdCIpO2xldCByPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57cj0hMH0pO2NvbnN0IG89KCk9PntyfHxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToiY3VybGVzc193YWxsZXRfbG9naW5fc3RhdHVzIixhcmd1bWVudHM6e319KS50aGVuKGU9PntpZihyKXJldHVybjtsZXQgaT17fTt0cnl7aT1KU09OLnBhcnNlKGU/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGkuc2lnbmVkSW4pe24mJihuLnRleHRDb250ZW50PVBuKHouc2lnbmVkSW5QYXlpbmcse2VtYWlsOmkuZW1haWw/PyIifSkpLERtKHQpO3JldHVybn1pZihpLmV4cGlyZWQpe24mJihuLnRleHRDb250ZW50PXouc2lnbkluRXhwaXJlZCk7cmV0dXJufWlmKGkubmV2ZXJTdGFydGVkKXtuJiYobi50ZXh0Q29udGVudD16LnNpZ25Jbk5ldmVyU3RhcnRlZCk7cmV0dXJufXNldFRpbWVvdXQobywyZTMpfSkuY2F0Y2goKCk9PntyfHxzZXRUaW1lb3V0KG8sM2UzKX0pfTtzZXRUaW1lb3V0KG8sMmUzKX0sSm49KHQsbik9Pntjb25zdCByPVBtKHQpO2xldCBvPXt9O3RyeXtvPUpTT04ucGFyc2Uobj8uY29udGVudD8uWzBdPy50ZXh0Pz8ie30iKX1jYXRjaHt9aWYocj8uZXh0JiZvLnVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vbmVTdGVwTGVmdCl9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwYXlsaW5rIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHouZ29QYXkpfTwvc3Bhbj48L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsX3QoInBheWxpbmsiLFN0cmluZyhvLnVybCkpLFVlKCk7cmV0dXJufWlmKG8uYXdhaXRpbmdQYXltZW50KXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoub25lU3RlcExlZnQpfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKG8ubWVzc2FnZT8/IiIpfTwvZGl2PgogICAgICAke28udG90YWw/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhTdHJpbmcoby50b3RhbCkpfTwvZGl2PmA6IiJ9CiAgICAgICR7by5wYXlVcmw/YDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwZ28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5nb1BheSl9PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIiBpZD0icHdhaXQiPiR7ayh6LnBheVdhaXQpfTwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ucGF5VXJsJiZfdCgicGdvIixTdHJpbmcoby5wYXlVcmwpKSxVZSgpLG8uc2Vzc2lvbklkJiZvLm1lcmNoYW50SWQmJkUkKFN0cmluZyhvLnNlc3Npb25JZCksU3RyaW5nKG8ubWVyY2hhbnRJZCksdCk7cmV0dXJufWlmKG8ubmVlZHNMb2dpbiYmby5sb2dpblVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHRvZG8iPiR7ayh6LnNpZ25Jbil9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJ3Z28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5zaWduSW5Hbyl9PC9zcGFuPgogICAgICAgICR7by51c2VyQ29kZT9gPHNwYW4gY2xhc3M9InVjb2RlIj4ke2soby51c2VyQ29kZSl9PC9zcGFuPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIHdhaXRpbmciIGlkPSJ3d2FpdCI+JHtrKHouc2lnbkluV2FpdCl9PC9kaXY+CiAgICAgICR7SWUoKX08L2Rpdj5gLF90KCJ3Z28iLFN0cmluZyhvLmxvZ2luVXJsKSksVWUoKSxaJCh0KTtyZXR1cm59aWYoby53YWxsZXRSZWZ1c2VkKXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoud2FsbGV0U2FpZE5vKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/PyIiKX08L2Rpdj4KICAgICAgJHtvLndhbGxldFVybD9gPGRpdiBjbGFzcz0ibG9naW5yb3ciPjxzcGFuIGNsYXNzPSJhY3QgcHJpbWFyeSIgaWQ9IndvcGVuIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHoub3BlbldhbGxldCl9PC9zcGFuPjwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ud2FsbGV0VXJsJiZfdCgid29wZW4iLFN0cmluZyhvLndhbGxldFVybCkpLFVlKCk7cmV0dXJufWNvbnN0IGU9by5vcmRlcmVkPz9vLmJvb2tlZDtpZihuPy5pc0Vycm9yfHwoZT09PXZvaWQgMD9vLnN0YXR1cyE9PSJjYXB0dXJlZCImJm8uc3RhdHVzIT09ImNvbXBsZXRlZCI6ZT09PSExKSl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHoubm90Q29tcGxldGVkKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/P28ucmVhc29uPz9uPy5jb250ZW50Py5bMF0/LnRleHQ/PyIiKX08L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsVWUoKTtyZXR1cm59RW0obyl9LEVtPXQ9PntpaShudWxsKSxCJiYoTigibWVyY2hhbnQiKS50ZXh0Q29udGVudD1CLnByb2R1Y3Quc2t1KTtjb25zdCBuPXQucGFpZFJsdXNkPz90LnBhaWRVc2RjPz90LnRvdGFsPz8iIixyPXQudHhIYXNoLG89dC5leHBsb3JlcjtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vcmRlcmVkKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2sodC5tZXNzYWdlPz9Qbih6Lm9yZGVyZWRGYWxsYmFjayx7cHJvZHVjdDp0LnByb2R1Y3Q/P0I/LnByb2R1Y3QubmFtZT8/IiJ9KSl9PC9kaXY+CiAgICAke3QucGF5ZXI/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayh6LnBhaWRCeSl9ICR7ayhTdHJpbmcodC5wYXllcikpfTwvZGl2PmA6IiJ9CiAgICAke24/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhuKX08L2Rpdj5gOiIifQogICAgJHtyP2A8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5vbkNoYWluVHgpfSAke28/YDxzcGFuIGNsYXNzPSJ0eCIgaWQ9InR4bGluayIgcm9sZT0ibGluayIgdGFiaW5kZXg9IjAiPiR7ayhyKX0g4oaXPC9zcGFuPmA6YDxzcGFuIGNsYXNzPSJtb25vIj4ke2socil9PC9zcGFuPmB9PC9kaXY+YDoiIn0KICAgIDxkaXYgY2xhc3M9ImN0YS1yb3ciPiR7eCQoKX08YnV0dG9uIGNsYXNzPSJiYWNrIiBpZD0iYWdhaW4iPiR7ayh6Lm9yZGVyQWdhaW4pfTwvYnV0dG9uPjwvZGl2PgogIDwvZGl2PmAsciYmbyYmX3QoInR4bGluayIsU3RyaW5nKG8pKSxUJCgpLE4oImFnYWluIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e0ImJmNzKEIpfSl9O2xldCBhZT0hMSxidD1udWxsLHBpPW51bGwsYWk9ITEseXQ9bnVsbDtjb25zdCBscz0odCxuPSExKT0+e2lmKCF0KXJldHVybjtpZihVbSh0KSx0LnZpZXc9PT0icHJvZHVjdHMiKXtzcyh0KSxhZT0hMCxidD1udWxsLHBpPW51bGwsYWk9ITE7cmV0dXJufWlmKHQudmlldz09PSJvcmRlcnMiKXt1cyh0KSxhZT0hMDtyZXR1cm59aWYodC5vcmRlcmVkIT09dm9pZCAwfHx0LmJvb2tlZCE9PXZvaWQgMHx8dC5wYWlkIT09dm9pZCAwfHx0LmF3YWl0aW5nUGF5bWVudHx8dC5uZWVkc0xvZ2lufHx0LndhbGxldFJlZnVzZWQpe2FlPSEwLEpuKCIiLHtjb250ZW50Olt7dGV4dDpKU09OLnN0cmluZ2lmeSh0KX1dfSk7cmV0dXJufWlmKHQudmlldyE9PSJjaGVja291dCJ8fCF0LnByb2R1Y3Q/LnNrdSl7YWV8fChhZT0hMCxOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5ub3RoaW5nVG9TaG93KX08L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKHoubm90aGluZ1RvU2hvd0JvZHkpfTwvZGl2PjwvZGl2PmApO3JldHVybn1jb25zdCByPXQucHJvZHVjdC5za3U9PT1idCxvPSEhdC5yZWNlaXB0JiYhYWk7aWYoIShhZSYmIW8mJiEobiYmIXIpKSl7aWYoYWU9ITAsYnQ9dC5wcm9kdWN0LnNrdSxwaT10LnByb2R1Y3QubmFtZT8/bnVsbCxhaT0hIXQucmVjZWlwdCx0LnJlY2VpcHQpe0I9dCxFbSh0LnJlY2VpcHQpO3JldHVybn1jcyh0KX19LFIkPSgpPT5vZS5nZXRIb3N0Q29udGV4dCgpPy50b29sSW5mbz8udG9vbD8ubmFtZT8/InN0YXJ0X3Npbm9jYXJlX2NoZWNrb3V0IixIbj0odCxuPSEwKT0+e2NvbnN0IHI9UiQoKTtvZS5jYWxsU2VydmVyVG9vbCh7bmFtZTpyLGFyZ3VtZW50czp7Li4udCwuLi5uP3tfX3JlaHlkcmF0ZToxfTp7fX19KS50aGVuKG89Pntjb25zdCBlPW8/LnN0cnVjdHVyZWRDb250ZW50O2U/bHMoZSk6YWV8fHh0KHoubm90aGluZ1RvU2hvd0JvZHkpfSkuY2F0Y2gobz0+e2FlfHx4dChTdHJpbmcobz8ubWVzc2FnZT8/bykpfSl9LEMkPXQ9Pntjb25zdCBuPXR5cGVvZiB0LnNrdT09InN0cmluZyI/dC5za3UudHJpbSgpOiIiO2lmKG4pcmV0dXJuIG4hPT1idDtjb25zdCByPXR5cGVvZiB0LnF1ZXJ5PT0ic3RyaW5nIj90LnF1ZXJ5LnRyaW0oKToiIjtyZXR1cm4gcj8hYCR7cGk/PyIifSAke2J0Pz8iIn1gLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoci50b0xvd2VyQ2FzZSgpKTohMX07aiQoKTtvZS5vbnRvb2xyZXN1bHQ9dD0+bHModD8uc3RydWN0dXJlZENvbnRlbnQsITApO29lLm9udG9vbGlucHV0PXQ9Pntjb25zdCBuPXQ/LmFyZ3VtZW50cz8/e307aWYoIWFlKXt5dD1uLEhuKG4pO3JldHVybn1DJChuKSYmKHl0PW4sYWU9ITEsSG4obiwhMSkpfTtvZS5vbmhvc3Rjb250ZXh0Y2hhbmdlZD0oKT0+e307b2UuY29ubmVjdCgpLnRoZW4oKCk9Pntjb25zdCB0PW9lLmdldEhvc3RDb250ZXh0KCksbj10Py50b29sSW5mbz8uYXJndW1lbnRzPz90Py50b29sSW5wdXQ/LmFyZ3VtZW50cz8/dD8uYXJndW1lbnRzO24mJiFhZSYmKHl0PW4sSG4oeXQpKSxzZXRUaW1lb3V0KCgpPT57YWV8fEhuKHl0Pz97fSl9LDFlMyl9KS5jYXRjaCh0PT54dChTdHJpbmcodD8ubWVzc2FnZT8/dCkpKTs8L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZCI+CiAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlIj5TaW5vY2FyZTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibWVyY2hhbnQiIGlkPSJtZXJjaGFudCI+PC9zcGFuPgogICAgICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2giIGlkPSJyZWZyZXNoIiBoaWRkZW4+CiAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi40IgogICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgPHBhdGggZD0iTTIwIDExYTggOCAwIDEgMC0xLjggNiIgLz4KICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz0iMjAgNCAyMCAxMSAxMyAxMSIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY29udGVudCI+PGRpdiBjbGFzcz0iZW1wdHkiPkxvYWRpbmfigKY8L2Rpdj48L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo=',\n 'base64',\n).toString('utf8');\n"],"mappings":";;;AAEA,SAAS,kBAAkB;AAC3B,SAAS,cAAc,YAAY,QAAQ,qBAAqB;AAChE,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACQd,IAAM,aAAa,CAAC,SAAS,OAAO,YAAY,UAAU,WAAW,WAAW;AAIhF,IAAM,aAAa,CAAC,UACzB,OAAO,UAAU,YAAa,WAAiC,SAAS,KAAK;AAuBxE,IAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,MAAM,CAAC,GAAG,UAAU;AAAA,EACpB,aAAa;AACf;AAmBO,IAAM,gBAAgB,CAAC,QAAyB;AACrD,QAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,KAAK,EAAE,YAAY,IAAI;AACpE,SAAO,WAAW,MAAM,IAAI,aAAa,mBAAmB,MAAM,CAAC,KAAK;AAC1E;AAGO,IAAM,iBAAiB,CAAC,YAC7B,QAAQ,gBAAgB,WAAM,QAAQ,SAAS,KAAK,KAAK,eAAe,OAAO,CAAC;AAQlF,IAAM,WAAW,CAAC,aAChB,CAAC,QAAQ,SAAS,MAAM,EAAE,SAAS,SAAS,YAAY,CAAC,IAAI,IAAI;AAG5D,IAAM,cAAc,CAAC,QAAgB,aAA6B;AACvE,QAAM,KAAK,SAAS,QAAQ;AAC5B,SAAO,IAAI,SAAS,MAAM,IAAI,eAAe,SAAS,EAAE,uBAAuB,GAAG,CAAC,CAAC,IAAI,QAAQ;AAClG;AA0BO,IAAM,iBAAiB,CAC5B,OACAA,WACiB;AACjB,QAAMC,OAAM,OAAOD,OAAM,OAAO,EAAE,EAAE,KAAK;AACzC,MAAIC,MAAK;AACP,UAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,YAAY,MAAMA,KAAI,YAAY,CAAC;AAC3E,QAAI,MAAO,QAAO,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,EACpD;AAIA,QAAM,SAASA,QAAO,OAAOD,OAAM,SAAS,EAAE,GAAG,KAAK,EAAE,YAAY;AACpE,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,OAAO;AAElC,QAAM,QAAQ,MAAM,OAAO,CAAC,OAAO,GAAG,KAAK,KAAK,EAAE,YAAY,MAAM,KAAK;AACzE,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,EAAG,QAAO,EAAE,MAAM,SAAS,SAAS,MAAM,CAAC,EAAE;AAE9E,QAAM,UAAU,MAAM,OAAO,CAAC,OAAO,GAAG,KAAK,YAAY,EAAE,SAAS,KAAK,CAAC;AAC1E,MAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAG,QAAO,EAAE,MAAM,SAAS,SAAS,QAAQ,CAAC,EAAE;AACpF,MAAI,CAAC,QAAQ,OAAQ,QAAO,EAAE,MAAM,OAAO;AAK3C,QAAM,iBAAiB,QAAQ,OAAO,CAAC,OAAO;AAC5C,UAAM,OAAO,GAAG,KAAK,YAAY;AACjC,QAAI,KAAK,KAAK,QAAQ,KAAK;AAC3B,WAAO,OAAO,IAAI;AAChB,YAAM,QAAQ,KAAK,KAAK,MAAM,MAAM;AACpC,UAAI,UAAU,UAAa,CAAC,WAAW,KAAK,KAAK,EAAG,QAAO;AAC3D,WAAK,KAAK,QAAQ,OAAO,KAAK,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,eAAe,WAAW,KAAK,eAAe,CAAC,GAAG;AACpD,WAAO,EAAE,MAAM,SAAS,SAAS,eAAe,CAAC,EAAE;AAAA,EACrD;AACA,SAAO,EAAE,MAAM,aAAa,YAAY,QAAQ;AAClD;;;ACvIO,IAAM,YAAY;AAgBlB,IAAM,gBAAgB,CAAC,yBAAyB;AAiBhD,IAAM,SAAS,CAAC,aAAqB;AAAA,EAC1C,IAAI,EAAE,aAAa,QAAQ;AAAA,EAC3B,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,2BAA2B;AAC7B;AAUO,IAAM,aAAa,CAAC,OAA2D,CAAC,MAAM;AAC3F,QAAM,kBAAkB,KAAK,gBAAgB;AAC7C,SAAO;AAAA,IACL,IAAI,EAAE,KAAK,EAAE,iBAAiB,gBAAgB,CAAC,EAAE,EAAE;AAAA,IACnD,oBAAoB,EAAE,iBAAiB,CAAC,GAAG,kBAAkB,gBAAgB;AAAA,IAC7E,GAAI,KAAK,eAAe,EAAE,uBAAuB,KAAK,aAAa,IAAI,CAAC;AAAA,EAC1E;AACF;AAcO,IAAM,gBAAgB,CAAC,QAAgB,UAA2B,MAAM,WAAW,MAAM;;;ACEzF,IAAM,eAAe,CAAC,WAMR;AAAA,EACnB,MAAM;AAAA,EACN,SAAS,MAAM;AAAA,EACf,UAAU,KAAK,IAAI,MAAM,YAAY,GAAG,CAAC;AAAA,EACzC,QAAQ,MAAM;AAAA,EACd,SAAS,MAAM,WAAW;AAAA,EAC1B,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAC3C;;;ACjEO,IAAM,oBAAoB,CAAC,SAChC;AAAA,EACE,KAAK;AAAA;AAAA,EAEL;AAAA,EACA,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAI,KAAK,SAAS,CAAC;AAAA,EACnB,oFAAoF,KAAK,gBAAgB,SAAS;AACpH,EAAE,KAAK,IAAI;;;ACrBb,IAAM,WAAW,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAEvE,IAAM,MAAM;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AACf;AACA,IAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,aACE;AACJ;AAmBO,IAAM,kBAAkB,CAAC,SAA2C;AAAA,EACzE;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,UAAU,iBAAiB;AAAA,IAC3C;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,IAAI;AAAA,MAClB,UAAU,CAAC,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa,kJAAkJ,KAAK,cAAc;AAAA,IAClL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,KAAK,OAAO,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,KAAK,SAAS;AAAA,MAC5B,UAAU,CAAC,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,KAAK,OAAO,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAC/E,YAAY,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAChF,OAAO,EAAE,MAAM,UAAU,aAAa,6BAAwB;AAAA,MAChE;AAAA,MACA,UAAU,CAAC,aAAa,cAAc,OAAO;AAAA,IAC/C;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,KAAK,SAAS;AAAA,MAC5B,UAAU,CAAC,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,SAAS;AAAA,QAC5B,YAAY,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,MACvF;AAAA,MACA,UAAU,CAAC,aAAa,YAAY;AAAA,IACtC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,4CAAuC;AAAA,QAC/E,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AACF;;;AC/JO,IAAM,eAAe,CAAC,cAAkC;AAAA,EAC7D,MAAM;AAAA,EACN,OAAO,SAAS;AAAA,EAChB,UAAU,CAAC,GAAG,QAAQ;AACxB;AAoCO,IAAM,aAAa,CAAC,YAAqC;AAAA,EAC9D,MAAM;AAAA,EACN,QAAQ,OAAO;AAAA,IACb,CAAC,OAAiB;AAAA,MAChB,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE,gBACN,EAAE,cAAc,WAAW,aACzB,oBACA,qBACF,EAAE;AAAA,MACN,eAAe,QAAQ,EAAE,aAAa;AAAA,MACtC,SAAS,EAAE,WAAW,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,QAAK,GAAG,QAAQ,EAAE,EAAE,KAAK,IAAI,KAAK;AAAA,MAC9E,OAAO,YAAY,OAAO,EAAE,UAAU,CAAC,GAAG,OAAO,EAAE,YAAY,KAAK,CAAC;AAAA,MACrE,UAAU,EAAE;AAAA,MACZ,MAAM,EAAE,WAAW,MAAM,GAAG,EAAE,KAAK;AAAA,IACrC;AAAA,EACF;AACF;;;ANtCA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC;AAAA,EAEE,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,OACX;AAGP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAEE,wBAAwB;AAAA,EACxB;AAAA,OACK;AACP,SAAiC,0BAA0B;AAC3D,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,0BAA0B;AACnC,SAAS,UAAU,YAAY,UAAU,kBAAkB;;;AO3EpD,IAAM,qBAA6B,OAAO;AAAA,EAC/C;AAAA,EACA;AACF,EAAE,SAAS,MAAM;;;APoIjB,IAAM,YAAY,QAAQ,IAAI,qBAAqB,0BAA0B,QAAQ,OAAO,EAAE;AAQ9F,IAAM,eAAe,QAAQ,IAAI,2BAA2B,UAAU,QAAQ,OAAO,EAAE;AACvF,IAAM,WAAW,GAAG,QAAQ;AAM5B,IAAM,MAAM,CAAC,eAAyC;AAKpD,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kCAAkC;AAC9D,SAAO,EAAE,SAAS,UAAU,YAAY,OAAO,MAAM;AACvD;AACA,IAAM,QAAQ,QAAQ,IAAI;AAW1B,IAAM,SAAS,MAAM;AACnB,QAAM,OAAO,QAAQ,IAAI,qBAAqB,KAAK;AACnD,QAAM,QAAQ,QAAQ,IAAI,sBAAsB,KAAK;AACrD,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO;AAC5B,SAAO,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAClE,GAAG;AACH,IAAM,gBAAgB,QAAQ,IAAI,2BAA2B;AAC7D,IAAM,mBAAmB,QAAQ,IAAI;AACrC,IAAM,iBAAiB,QAAQ,IAAI;AAQnC,IAAM,SAAS,mBAAmB,EAAE,SAAS,SAAS,CAAC;AAKvD,IAAI,UAAsE;AAM1E,IAAM,cAAc,MAA+D;AACjF,QAAM,MAAM,OAAO,QAAQ;AAC3B,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,EAAG,EAAE;AAChF;AAMA,IAAI,mBAAmB;AAEvB,IAAM,eAAe,YAAkD;AACrE,MAAI,QAAS,QAAO;AACpB,QAAM,UAAU,MAAM,OAAO,iBAAiB;AAC9C,YAAU;AACV,qBAAmB;AAInB,UACG,KAAK,EACL,MAAM,MAAM,MAAS,EACrB,QAAQ,MAAM;AACb,cAAU;AAAA,EACZ,CAAC;AACH,SAAO;AACT;AAWA,IAAM,WAA4C;AAAA,EAChD,CAAC,yBAAyB,gEAAc,gFAAe;AAAA,EACvD,CAAC,eAAe,gEAAc,6FAAkB;AAAA,EAChD,CAAC,iBAAiB,gEAAc,mGAAmB;AAAA,EACnD,CAAC,wBAAwB,4EAAgB,oEAAa;AAAA,EACtD,CAAC,mBAAmB,wFAAkB,sFAAgB;AAAA,EACtD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,CAAC,oBAAoB,oDAAY,sFAAgB;AACnD;AAKA,IAAM,gBAAgB,CACpB,QACsE;AACtE,QAAM,MAAM,IAAI;AAChB,QAAM,MAAM,SAAS,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC;AAChD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf,SAAS,MACL,qDAAa,IAAI,CAAC,CAAC,uCAAS,IAAI,CAAC,CAAC,KAClC,wCAAU,GAAG;AAAA;AAAA;AAAA,UAGjB,WAAW,GAAG,QAAQ;AAAA,UACtB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AACA,IAAM,WAAW,QAAQ,IAAI;AAC7B,IAAM,kCAAkC,CAAC,CAAC,kBAAkB,WAAW,UAAU;AAKjF,IAAM,iBAAiB,QAAQ,IAAI,+BAA+B;AAClE,IAAM,qBAAqB,QAAQ,IAAI,6BAA6B;AAepE,IAAM,yBAAyB,OAC7B,aACA,aAC2B;AAC3B,MAAI,CAAC,oBAAoB,CAAC,eAAgB,QAAO;AAIjD,MAAI,mCAAmC,CAAC,gBAAgB;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,OACX,MACA,MACA,UAAU,UAC2B;AACrC,UAAM,MAAM,MAAM,MAAM,6BAA6B,IAAI,IAAI;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,gBAAgB;AAAA,QACzC,gBAAgB;AAAA,QAChB,GAAI,UAAU,EAAE,kBAAkB,qBAAqB,IAAI,CAAC;AAAA,MAC9D;AAAA,MACA,MAAM,IAAI,gBAAgB,IAAI;AAAA,IAChC,CAAC;AACD,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,UAAU,IAAI,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO,WAAW,EAAE,EAAE;AAC5F,WAAO;AAAA,EACT;AAGA,QAAM,KACJ,YACA,QAAQ,MAAM,KAAK,mBAAmB,EAAE,MAAM,QAAQ,eAAe,WAAW,CAAC,GAAG,EAAE;AACxF,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,4CAA4C;AAAA,MAC5C,0BAA0B,SAAS,YAAY;AAAA,MAC/C,4BAA4B,OAAO,WAAW;AAAA,MAC9C,4BAA4B,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,GAAG;AAAA,IACxE;AAAA,IACA;AAAA,EACF,EAAE,MAAM,CAAC,QAAiB;AAGxB,QAAI,YAAY,uBAAuB,KAAK,OAAO,GAAG,CAAC,GAAG;AACxD,YAAM,IAAI;AAAA,QACR,gCAAgC,QAAQ;AAAA,MAC1C;AAAA,IACF;AACA,UAAM;AAAA,EACR,CAAC;AACD,SAAO,OAAO,IAAI,EAAE;AACtB;AAGA,IAAM,UAAU,OAAU,MAAc,OAAoB,CAAC,MAAkB;AAC7E,QAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,IAAI;AAAA,IAC5C,GAAG;AAAA,IACH,SAAS,EAAE,gBAAgB,oBAAoB,GAAI,KAAK,WAAW,CAAC,EAAG;AAAA,EACzE,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI;AAAA,MACR,oBAAoB,IAAI,OAAO,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAQ,MAAM,IAAI,KAAK;AACzB;AAgBA,IAAM,eAAe,QAAQ,IAAI,gBAAgB;AACjD,IAAI;AACJ,IAAM,cAAc,MAAoC;AACtD,0BAAwB,YAAY;AAClC,QAAI,aAAc,QAAO,iBAAiB;AAC1C,UAAM,IAAI,QAAQ,IAAI;AACtB,WAAO,IAAI,qBAAqB,CAAC,IAAI;AAAA,EACvC,GAAG;AACH,SAAO;AACT;AACA,IAAM,UAAU,CAAC,cAA8B,IAAI,OAAO,SAAS,IAAI,KAAK,QAAQ,CAAC,CAAC;AAOtF,IAAM,WAAW,OAAO,MAAgD;AACtE,QAAM,SAAU,MAAM,YAAY,KAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACxF,SAAO,qBAAqB,MAAM,gBAAgB,EAAE,QAAQ,cAAc,EAAE,CAAC,CAAC;AAChF;AAOA,IAAM,YAAY,QAAQ,IAAI;AAC9B,IAAM,WAAW,QAAQ,IAAI,oBAAoB;AACjD,IAAI,kBAAqC;AACzC,IAAM,YAAY,MAAyB;AACzC,MAAI,gBAAiB,QAAO;AAC5B,MAAI,CAAC,UAAW,QAAO;AACvB,oBAAkB,WAAW,SAAS,SAAS;AAC/C,SAAO;AACT;AAKA,IAAM,aAAa,QAAQ,IAAI,kBAAkB;AACjD,IAAI;AACJ,IAAM,oBAAoB,MAAkC;AAC1D,2BAAyB,YAAY;AACnC,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,EAAG,QAAO;AACf,QAAI;AACF,aAAO,MAAM,oBAAoB,CAAC;AAAA,IACpC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AACH,SAAO;AACT;AAIA,IAAM,oBAAoB,OAAO,OAAe,SAAyC;AACvF,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,YAAY;AAAA,MAClC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE,UAAU,aAAa,CAAC;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,UAAM,IAAK,MAAM,IAAI,KAAK;AAC1B,UAAM,WAAW,GAAG,QAAQ,SAAS,CAAC;AACtC,QAAI,QAAQ;AACZ,eAAW,KAAK,UAAU;AACxB,eAAS,OAAO,GAAG,SAAS,MAAM,QAAQ,MAAM,aAAa,UAAU,CAAC;AAAA,IAC1E;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,IAAM,cAAc,QAAQ,IAAI,mBAAmB;AACnD,IAAM,wBAAwB,QAAQ,IAAI;AAC1C,IAAM,4BAA4B,QAAQ,IAAI;AAG9C,IAAM,sBAAsB,QAAQ,IAAI,uBAAuB;AAS/D,IAAM,YAAY,QAAQ,IAAI,iBAAiB;AAC/C,IAAM,0BAA0B,QAAQ,IAAI;AAC5C,IAAM,wBAAwB,OAAO,QAAQ,IAAI,yBAAyB,GAAK;AAI/E,IAAM,sBAAsB,OAAO,cAAuC;AACxE,MAAI,CAAC,sBAAuB,OAAM,IAAI,MAAM,2BAA2B;AACvE,MAAI,CAAC,0BAA2B,OAAM,IAAI,MAAM,+BAA+B;AAC/E,QAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAClD,QAAM,MAAM,MAAM,MAAM,GAAG,WAAW,kBAAkB;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,mBAAmB,sBAAsB;AAAA,IACxF,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,UAAU,YAAY,KAAK,IAAI,CAAC;AAAA,MAChC,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,mBAAmB,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,EAAE,MAAM,IAAK,MAAM,IAAI,KAAK;AAClC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,gCAAgC;AAC5D,SAAO;AACT;AAKA,IAAM,iBAAiB,OAAU,OAAkD;AACjF,QAAM,SAAS,IAAI,WAAW,QAAQ;AACtC,QAAM,OAAO,QAAQ;AACrB,MAAI;AACF,WAAO,MAAM,GAAG,MAAM;AAAA,EACxB,UAAE;AACA,UAAM,OAAO,WAAW,EAAE,MAAM,MAAM,MAAS;AAAA,EACjD;AACF;AAKA,IAAM,eAAe,OACnB,QACA,OACA,aACA,WACoB;AACpB,MAAI;AACF,UAAM,MAAM,MAAM,OAAO,QAAQ,EAAE,SAAS,iBAAiB,SAAS,OAAO,MAAM,OAAO,CAAC;AAC3F,UAAM,OAAO,IAAI,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,eAAe,EAAE,YAAY,MAAM;AAC5F,WAAO,MAAM,WAAW;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,IAAM,WAAW,OACf,QACA,GACAE,YAEA,yBAAyB,MAAM,gBAAgB,EAAE,cAAc,GAAG,QAAAA,SAAQ,OAAO,CAAC,CAAC;AAerF,IAAM,cACJ,QAAQ,IAAI,6BAA6B,KAAK,QAAQ,GAAG,iCAAiC;AAC5F,IAAM,UAAU,QAAQ,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI;AAExF,IAAM,aAAa,CAAC,MAAgC;AAClD,MAAI;AAGF,QAAI;AACF,oBAAc,aAAa,KAAK,UAAU,EAAE,SAAS,QAAQ,EAAE,CAAC,GAAG;AAAA,QACjE,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,QACE,QAAO,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,EAC1C,QAAQ;AAAA,EAER;AACF;AAEA,IAAM,aAAa,MAA0B;AAC3C,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC;AAI1D,UAAM,IAAI,MAAM;AAEhB,QAAI,MAAM,YAAY,WAAW,CAAC,GAAG,aAAa,KAAK,MAAM,EAAE,SAAS,IAAI,KAAK,IAAI,GAAG;AACtF,aAAO,aAAa,EAAE,OAAO,KAAK,CAAC;AACnC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAI,cAAkC,WAAW;AAmBjD,IAAI,eAAoC;AA0BxC,IAAM,kBAAkB,oBAAI,IAA0B;AAOtD,IAAM,aACJ,QAAQ,IAAI,4BAA4B,KAAK,QAAQ,GAAG,mCAAmC;AAC7F,IAAM,oBAAoB,MAAY;AAIpC,MAAI,CAAC,QAAS;AACd,MAAI;AAKF,UAAM,SAAS,IAAI,IAAI,eAAe;AACtC,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AAMxD,UAAI,KAAK,YAAY,SAAS;AAC5B,mBAAW,CAAC,GAAG,CAAC,KAAK,KAAK,UAAU,KAAK,YAAY,CAAC;AACpD,cAAI,CAAC,OAAO,IAAI,CAAC,EAAG,QAAO,IAAI,GAAG,CAAC;AAAA,MACvC;AAAA,IACF,QAAQ;AAAA,IAER;AAGA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAQ,KAAI,CAAC,gBAAgB,IAAI,CAAC,EAAG,iBAAgB,IAAI,GAAG,CAAC;AAGlF,UAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,GAAG;AACxC,kBAAc,KAAK,KAAK,UAAU,EAAE,SAAS,cAAc,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG;AAAA,MACjF,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AACD,eAAW,KAAK,UAAU;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AACA,IAAI,SAAS;AACX,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AAazD,QAAI,MAAM,YAAY,SAAS;AAY7B,iBAAW,CAAC,GAAG,CAAC,KAAK,MAAM,UAAU,MAAM,YAAY,CAAC,EAAG,iBAAgB,IAAI,GAAG,CAAC;AAAA,IACrF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAMA,IAAM,cAAc,CAClBC,MACA,UAaG;AACH,MAAIA,QAAO,MAAM,SAAS;AAKxB,SAAK,QAAQ,kBAAkB;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,KAAAA;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAKhB,SAAS,MAAM,WAAW,MAAM,aAAa,MAAM;AAAA;AAAA,QAEnD,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,MAClC,CAAC;AAAA,IACH,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,oBAAgB,IAAIA,MAAK;AAAA,MACvB,KAAAA;AAAA,MACA,MAAM,OAAO,MAAM,WAAW,EAAE;AAAA,MAChC,UAAU,MAAM;AAAA,MAChB,OAAQ,MAAM,SAAS,MAAM,YAAY,MAAM,aAAa,MAAM;AAAA,MAGlE,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAID,QAAI,cAAc,QAAQA,KAAK,cAAa,UAAU;AACtD,sBAAkB;AAAA,EACpB;AACA,SAAO,KAAK,KAAK;AACnB;AAoCA,IAAM,kBAAmC;AAAA,EACvC;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,gBAAM,MAAM,8BAA8B,CAAC;AAAA,MAChE;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,wCAAU,MAAM,iCAAiC,MAAM,KAAK,CAAC;AAAA,MAClF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,wCAAU,MAAM,sBAAsB,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,wCAAU,MAAM,+BAA+B,MAAM,KAAK,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,kCAAS,MAAM,gCAAgC,KAAK,KAAK,CAAC;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,gBAAM,MAAM,2BAA2B,CAAC;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,gBAAM,MAAM,4BAA4B,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,MAAM,4BAA4B;AAAA,UACnD,EAAE,OAAO,cAAS,MAAM,4BAA4B,MAAM,EAAE,KAAK,OAAO,EAAE;AAAA,QAC5E;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,MAAM,6BAA6B,MAAM,EAAE,OAAO,SAAS,EAAE;AAAA,UAC9E,EAAE,OAAO,cAAS,MAAM,4BAA4B,MAAM,EAAE,KAAK,WAAW,EAAE;AAAA,QAChF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,MAAM,6BAA6B;AAAA,UACpD,EAAE,OAAO,cAAS,MAAM,4BAA4B,MAAM,EAAE,KAAK,QAAQ,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,UAAU,MAAM,+BAA+B,CAAC;AAAA,MACrE;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS,CAAC,EAAE,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;AAOA,IAAM,YAAY,CAAC,SACjB,KAAK,oBAAoB,OACrB,kBACA,gBAAgB;AAAA,EAAI,CAAC,MACnB,EAAE,MAAM,WAAW,cAAI,IACnB;AAAA,IACE,GAAG;AAAA,IACH,MAAM,EAAE,KAAK,IAAI,CAAC,OAAO;AAAA,MACvB,GAAG;AAAA,MACH,OAAO;AAAA,MACP,KAAK;AAAA,MACL,SAAS,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,8BAAe,EAAE;AAAA,IACjE,EAAE;AAAA,EACJ,IACA;AACN;AAMN,IAAM,WAAW,CAAC,MAAoB,MACpC,aAAa;AAAA,EACX,SAAS;AAAA,IACP,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,cAAc,KAAK;AAAA,IACnB,UAAU,KAAK;AAAA,EACjB;AAAA,EACA,UAAU,KAAK;AAAA,EACf,QAAQ,UAAU,IAAI;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,KAAK;AAAA,IACZ,UAAU,EAAE;AAAA,IACZ,OAAO,EAAE,SAAS,KAAK;AAAA,IACvB,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE;AAAA,IACX,QAAQ,EAAE;AAAA,IACV,UAAU,EAAE;AAAA,IACZ,SAAS,EAAE;AAAA,EACb;AACF,CAAC;AAeH,IAAM,sBAAsB;AAC5B,IAAM,eAAe,GAAG,mBAAmB;AAM3C,IAAM,mBAAmB,OAAO,YAAY;AAE5C,IAAM,cAAc,WAAW;AAO/B,IAAM,eAAe,gBAAgB;AAAA,EACnC,gBACE;AACJ,CAAC;AAKD,IAAM,aAAwB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,QAChE,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,iBAAiB;AAAA,MAC5B,YAAY;AAAA,QACV,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,QAChE,KAAK;AAAA,UACH,MAAM;AAAA,UACN,MAAM,CAAC,QAAQ,QAAQ,YAAY,OAAO;AAAA,UAC1C,aACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,cAAc;AAAA,MACzB,YAAY;AAAA,QACV,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,QAChE,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,CAAC,QAAQ,QAAQ;AAAA,UACvB,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAC,KAAK;AAAA,MAChB,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAChD;AACF;AAEA,IAAM,QAAmB,CAAC,GAAG,cAAc,GAAG,UAAU;AAOxD,IAAM,aAAa,oBAAI,IAAI,CAAC,0BAA0B,2BAA2B,gBAAgB,CAAC;AAElG,IAAM,OAAO,CAAC,WAAoB;AAAA,EAChC,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE,CAAC;AAC3E;AAaA,IAAM,eAAe,kBAAkB;AAAA,EACrC,SACE;AAAA,EACF,aACE;AAAA,EACF,cAAc;AAAA,EACd,OAAO;AAAA,IACL;AAAA,EACF;AACF,CAAC;AAMD,IAAM,UAAW,cAAc,YAAY,GAAG,EAAE,iBAAiB,EAA0B;AAE3F,IAAM,SAAS,IAAI;AAAA,EACjB,EAAE,MAAM,YAAY,SAAS,QAAQ;AAAA,EACrC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,cAAc,aAAa;AAC3E;AAEA,OAAO,kBAAkB,wBAAwB,aAAa;AAAA,EAC5D,OAAO,MAAM,IAAI,CAAC,MAAO,WAAW,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,GAAG,OAAO,iBAAiB,IAAI,CAAE;AAC1F,EAAE;AAEF,OAAO,kBAAkB,4BAA4B,aAAa;AAAA,EAChE,WAAW;AAAA,IACT,EAAE,KAAK,cAAc,MAAM,qBAAqB,UAAU,WAAW,OAAO,YAAY;AAAA,EAC1F;AACF,EAAE;AACF,OAAO,kBAAkB,2BAA2B,OAAO,QAAQ;AAKjE,QAAM,QAAQ,IAAI,OAAO;AACzB,MAAI,CAAC,cAAc,qBAAqB,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAC5F,SAAO;AAAA,IACL,UAAU,CAAC,EAAE,KAAK,OAAO,UAAU,WAAW,MAAM,oBAAoB,OAAO,YAAY,CAAC;AAAA,EAC9F;AACF,CAAC;AAED,OAAO,kBAAkB,uBAAuB,OAAO,QAAQ;AAC7D,QAAM,OAAQ,IAAI,OAAO,aAAa,CAAC;AACvC,MAAI;AACF,QAAI,IAAI,OAAO,SAAS,0BAA0B;AAQhD,YAAM,EAAE,MAAM,IAAI,MAAM;AAAA,QACtB,WAAW,cAAc,KAAK,QAAQ,CAAC;AAAA,MACzC;AACA,YAAM,OAAO,aAAa,KAAK;AAC/B,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QAC/D,mBAAmB;AAAA,QACnB,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,SAAS,wBAAwB;AAC9C,YAAMA,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAM,UAAU,MAAM,QAAiB,YAAY,mBAAmBA,IAAG,CAAC,EAAE;AAC5E,aAAO,KAAK,OAAO;AAAA,IACrB;AAKA,QAAI,IAAI,OAAO,SAAS,2BAA2B;AAGjD,YAAM,WAAW,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK,WAAW,KAAK,QAAQ,EAAE,EAAE,KAAK;AACxF,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AAKvD,YAAM,YACJ,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,KAAK,KAAK,gBAAgB;AAK9E,UAAI,CAAC,UAAU;AACb,YAAI,aAAa,cAAc,SAAS;AACtC,gBAAMC,WAAU,gBAAgB,IAAI,aAAa,GAAG;AACpD,cAAIA,UAAS;AACX,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,aAAa,IAAI,IAAI,CAAC;AAAA,cAC1E,mBAAmB,SAAS,cAAcA,QAAO;AAAA,cACjD,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAGA,YAAI,CAAC,cAAc;AACjB,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AACA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gBAAgB,aAAa,IAAI,IAAI,CAAC;AAAA,UAC/E,mBAAmB,SAAS,YAAY;AAAA,UACxC,OAAO;AAAA,QACT;AAAA,MACF;AAKA,UAAI,UAA0B;AAC9B,UAAI,aAAwB,CAAC;AAC7B,UAAI;AACF,kBAAU,MAAM,QAAiB,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,MAC7E,QAAQ;AACN,cAAM,EAAE,MAAM,IAAI,MAAM,QAA8B,UAAU;AAChE,cAAM,QAAQ,eAAe,OAAO,EAAE,KAAK,SAAS,CAAC;AACrD,YAAI,MAAM,SAAS,QAAS,WAAU,MAAM;AAAA,iBACnC,MAAM,SAAS,YAAa,cAAa,MAAM;AAAA,MAC1D;AACA,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA;AAAA;AAAA;AAAA,cAIN,MAAM,WAAW,SACb,SAAI,QAAQ,6BAAS,WAAW,MAAM,mEAAiB,WACpD,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,GAAG,EAChC,KAAK,QAAG,CAAC,KACZ,wCAAU,QAAQ;AAAA,YACxB;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,WAAW,eAAe,OAAO;AAwBvC,YAAM,oBACJ,aAAa,cAAc,QAAQ,QAAQ,OAAO,aAAa,UAC3D,gBAAgB,IAAI,QAAQ,GAAG,IAC/B;AACN,qBAAe;AAAA,QACb,KAAK,QAAQ;AAAA,QACb,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,UAAAD;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,iBAAiB,QAAQ,WAAW;AAAA;AAAA;AAAA,QAGpC,SAAS,oBAAoB,OAAO;AAAA,MACtC;AACA,wBAAkB;AAClB,YAAM,UAAU;AAChB,UAAI,SAAS;AACX,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,QAAQ,IAAI,KAAK,QAAQ,KAAK,CAAC;AAAA,UACnF,mBAAmB,SAAS,cAAc,OAAO;AAAA,UACjD,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,gBAAgB,QAAQ,IAAI,KAAK,QAAQ;AAAA,UACjD;AAAA,QACF;AAAA,QACA,mBAAmB,SAAS,YAAY;AAAA,QACxC,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,SAAS,gCAAgC;AACtD,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,UAKR,MAAM,KAAK,UAAU;AAAA,YACnB,KAAAD;AAAA,YACA,UAAAC;AAAA,YACA,GAAI,YAAY,MAAM,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,eAAe,KAAK;AAAA,QACpB,MAAM,KAAK;AAAA,QACX,SAAS,oBAAoB,KAAK,IAAI,gBAAW,KAAK,GAAG,YAAY,KAAK,aAAa;AAAA,MACzF,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,yBAAyB;AAC/C,YAAM,MAAM,OAAO,QAAQ;AAC3B,YAAM,OAAO,OAAO;AAIpB,gBAAU;AACV,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,WAAW;AAAA,cACX,KAAK,KAAK,SAAS;AAAA,cACnB,SAAS,MAAM,sBAAO,IAAI,KAAK,WAAM;AAAA,YACvC,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,SAAS,+BAA+B;AACrD,YAAM,MAAM,OAAO,QAAQ;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,cACT,MACI,EAAE,UAAU,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,QAAQ,aAAa,IACzE;AAAA,gBACE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAMV,SAAS,QAAQ,OAAO;AAAA,gBACxB,SAAS,CAAC,WAAW;AAAA,gBACrB,cAAc,CAAC,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAO3B,QAAQ;AAAA,gBACR,MAAM;AAAA,cACR;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAQA,QACE,IAAI,OAAO,SAAS,8BACpB,IAAI,OAAO,SAAS,+BACpB;AACA,YAAM,YAAY,IAAI,OAAO,SAAS;AAKtC,UAAI,aAAa,CAAC,OAAO,QAAQ,GAAG;AASlC,cAAM,QAAQ,MAAM,aAAa;AACjC,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,YAAY;AAAA,gBACZ,UAAU,MAAM;AAAA,gBAChB,UAAU,MAAM;AAAA,gBAChB,SACE;AAAA,gBACF,MAAM;AAAA,cACR,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AAEvD,YAAM,UAAU,MAAM,QAKnB,iBAAiB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AAKD,UAAI,QAAQ;AACZ,UAAI,WAAW;AAKb,cAAM,EAAE,QAAQ,SAAS,IAAI;AAAA,UAC3B,MAAM,oBAAoB,IAAI,QAAQ,UAAU,GAAG,QAAQ,SAAS;AAAA,QACtE;AACA,YAAI;AACJ,YAAI;AACF,uBAAa,MAAM,OAAO,cAAc;AAAA,YACtC;AAAA,YACA;AAAA,YACA,aAAa,QAAQ;AAAA,UACvB,CAAC;AAAA,QACH,SAAS,KAAK;AAGZ,iBAAO,cAAc,GAAY;AAAA,QACnC;AACA,gBAAQ,WAAW;AACnB,gBAAQ,OAAO;AAAA,UACb,gCAAgC,WAAW,KAAK,QAAQ,MAAM,IAAI,QAAQ;AAAA;AAAA,QAC5E;AAAA,MACF,WAAW,CAAC,oBAAoB,CAAC,gBAAgB;AAK/C,gBAAQ,OAAO;AAAA,UACb;AAAA,QACF;AAAA,MACF,OAAO;AAGL,YAAI,OAAO;AACX,YAAI;AACF,gBAAM,EAAE,QAAQ,SAAS,IAAI;AAAA,YAC3B,MAAM,oBAAoB,IAAI,QAAQ,UAAU,GAAG,QAAQ,SAAS;AAAA,UACtE;AACA,iBAAO;AACP,gBAAM,SAAS,MAAM,uBAAuB,QAAQ,QAAQ;AAC5D,cAAI,QAAQ;AACV,oBAAQ;AACR,oBAAQ,OAAO,MAAM,yBAAyB,MAAM,QAAQ,MAAM,IAAI,QAAQ;AAAA,CAAI;AAAA,UACpF;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM,IAAI;AACV,gBAAM,MAAM,EAAE,OAAO,QAAQ,EAAE,OAAO,WAAW;AACjD,gBAAM,OAAO,kBAAkB,IAAI,MAAM,EAAE,OAAO,GAAG,MAAM,YAAY,GAAG,MAAM,EAAE;AAKlF,cAAI,CAAC,oBAAoB;AACvB,kBAAM,IAAI;AAAA,cACR,GAAG,IAAI;AAAA,YACT;AAAA,UACF;AACA,kBAAQ,OAAO,MAAM,kBAAkB,IAAI,2BAAsB,aAAa;AAAA,CAAI;AAAA,QACpF;AAAA,MACF;AAEA,YAAM,QAAS,MAAM,iBAAiB,IAAI,QAAQ,UAAU,GAAG,QAAQ,WAAW,KAAK;AAIvF,aAAO,YAAYD,MAAK;AAAA,QACtB,SAAS,MAAM,WAAW;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,UAAAC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV,OAAO,YAAY,mBAAmB;AAAA,QACtC,QAAQ,MAAM;AAAA;AAAA;AAAA,QAGd,SAAS,MAAM,OAAO,MAAM,QAAQ;AAAA,QACpC,SAAS,WAAW,QAAQ,IAAI,SAAMA,SAAQ,WAAM,QAAQ,aAAa,aAAa,MAAM,MAAM;AAAA,MACpG,CAAC;AAAA,IACH;AAuBA,QAAI,IAAI,OAAO,SAAS,+BAA+B;AACrD,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AASA,UAAI,CAAC,OAAO,QAAQ,GAAG;AACrB,cAAM,QAAQ,MAAM,aAAa;AACjC,eAAO,KAAK;AAAA,UACV,YAAY;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,SACE;AAAA,UACF,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,YAAM,EAAE,MAAM,IAAI,MAAM,OAAO,cAAc;AAC7C,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SACE;AAAA,UACF,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,YAAM,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAC9D,YAAM,OAAO,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,MAAM,CAAC;AAChE,UAAI,CAAC,MAAM;AACT,eAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS,gEAAc,KAAK;AAAA,UAC5B,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,YAAY,EAAE;AAAA,QAC9D,CAAC;AAAA,MACH;AAEA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,UAAU,MAAM,QAQnB,iBAAiB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AAQD,YAAM,KAAK,MAAM,OAAO,GAAG;AAC3B,YAAM,CAAC,WAAW,GAAG,IAAI,KAAK,GAAG,QAAQ,iBAAiB,KAAK,EAAE,MAAM,KAAK;AAC5E,YAAM,WAAW,EAAE,SAAS,UAAU,OAAO,MAAM;AACnD,YAAM,QAAQ,QAAQ,SAASA,YAAW,KAAK,QAAQ,CAAC;AACxD,UAAI;AAIF,cAAM,iBAAiB,UAAU;AAAA,UAC/B,iBAAiB,QAAQ;AAAA,UACzB,QAAQ,KAAK;AAAA,UACb,cAAc;AAAA,UACd,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,cACE,UAAU,QAAQ;AAAA,cAClB,iBAAiB,QAAQ;AAAA,cACzB,SAAS,qCAAqC,QAAQ,GAAG;AAAA,cACzD,eAAe,EAAE,QAAQ,MAAM,cAAc,QAAQ,SAAS;AAAA,cAC9D,cAAc,OAAOA,SAAQ;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR,WAAW,aAAa;AAAA,YACxB,UAAU,KAAK,KAAK,GAAG,KAAK;AAAA,YAC5B,cAAc,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMjB,iBAAiB;AAAA,cACf,MAAM,GAAG,QAAQ;AAAA,cACjB,OAAO;AAAA,cACP,MAAM;AAAA,cACN,OAAO;AAAA,cACP,aAAa;AAAA,cACb,KAAK;AAAA,YACP;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,IAAI;AACV,eAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS,gEAAc,EAAE,OAAO;AAAA,UAChC,UAAU,EAAE,YAAY;AAAA,UACxB,WAAW,QAAQ;AAAA,UACnB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,aAAa,UAAU;AAAA,UACtC,iBAAiB,QAAQ;AAAA,UACzB,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,IAAI;AACV,eAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS,oDAAY,EAAE,OAAO;AAAA,UAC9B,UAAU,EAAE,YAAY;AAAA,UACxB,WAAW,QAAQ;AAAA,UACnB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA,aAAO,KAAK;AAAA;AAAA;AAAA,QAGV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,SACE;AAAA,QACF,aAAa,SAAS,IAAI,eAAe;AAAA,QACzC,kBAAkB,SAAS;AAAA,QAC3B,iBAAiB,QAAQ;AAAA,QACzB,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,MAAM,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,YAAY;AAAA,QAC7C,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA;AAAA;AAAA,QAGf,YAAY;AAAA,UACV,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,QACE;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAKA,QAAI,IAAI,OAAO,SAAS,4BAA4B;AAClD,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AACA,YAAM,kBAAkB,OAAO,KAAK,mBAAmB,EAAE;AACzD,UAAI,CAAC,iBAAiB;AACpB,eAAO,KAAK,EAAE,OAAO,iEAAiE,CAAC;AAAA,MACzF;AACA,YAAM,QAAQ,MAAM,kBAAkB,EAAE,SAAS,UAAU,OAAO,MAAM,GAAG,eAAe;AAC1F,aAAO,KAAK;AAAA;AAAA;AAAA,QAGV,QAAQ,MAAM;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,YAAY,MAAM,cAAc;AAAA,QAChC,UAAU,MAAM,YAAY;AAAA,QAC5B,qBAAqB,MAAM;AAAA,QAC3B,SAAS,MAAM,SACX,2PACA;AAAA,QACJ,MAAM,MAAM,SACR,kJACA;AAAA,MACN,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,iCAAiC;AACvD,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,UAAU,MAAM,QAKnB,iBAAiB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AAID,YAAM,EAAE,QAAQ,SAAS,IAAI;AAAA,QAC3B,MAAM,oBAAoB,IAAI,QAAQ,UAAU,GAAG,QAAQ,SAAS;AAAA,MACtE;AACA,aAAO,KAAK;AAAA;AAAA;AAAA,QAGV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKf,MAAM,4NAA4N,MAAM,gBAAgB,QAAQ,oBAAoB,QAAQ,UAAU,oDAAoD,QAAQ,SAAS,mBAAmB,QAAQ,UAAU;AAAA,MAClZ,CAAC;AAAA,IACH;AAGA,QAAI,IAAI,OAAO,SAAS,2BAA2B;AACjD,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AACA,YAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,YAAM,QAAQ,OAAO,KAAK,SAAS,EAAE;AACrC,YAAM,aAAa,OAAO,KAAK,cAAc,EAAE;AAC/C,UAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY;AACvC,eAAO,KAAK,EAAE,OAAO,gEAAgE,CAAC;AAAA,MACxF;AAGA,YAAM,SAAS,WAAW,MAAM,oBAAoB,IAAI,UAAU,GAAG,SAAS,CAAC;AAC/E,YAAM,QAAS,MAAM,iBAAiB,IAAI,UAAU,GAAG,WAAW,KAAK;AAIvE,YAAM,UAAU,MAAM,WAAW;AAIjC,aAAO,YAAY,QAAQ,OAAO,IAAI;AAAA,QACpC;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM,OAAO,MAAM;AAAA,QAC5B,SAAS,YAAY,SAAS,qDAAqD,MAAM,MAAM;AAAA,MACjG,CAAC;AAAA,IACH;AAGA,QAAI,IAAI,OAAO,SAAS,uBAAuB;AAC7C,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,UAAU,MAAM,QAKnB,iBAAiB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AACD,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ,GAAG,WAAW,sBAAsB,mBAAmB,QAAQ,SAAS,CAAC;AAAA,QACjF,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA;AAAA;AAAA,QAGf,MAAM;AAAA,QACN,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,6BAA6B;AACnD,UAAI,CAAC,OAAO;AACV,eAAO,KAAK,EAAE,OAAO,kDAAkD,CAAC;AAAA,MAC1E;AACA,YAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,YAAM,aAAa,OAAO,KAAK,cAAc,EAAE;AAC/C,YAAM,UAAU,MAAM,oBAAoB,IAAI,UAAU,GAAG,SAAS;AACpE,YAAM,OAAO,QAAQ,WAAW;AAChC,YAAM,SAAS,WAAW,OAAO;AAGjC,aAAO,YAAY,OAAQ,QAAQ,OAAO,KAAM,IAAI;AAAA,QAClD,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,OACL,wDACA;AAAA,MACN,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,4BAA4B;AAClD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uDAAuD,CAAC;AAAA,UACxF,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,MACJ,KAAK,QAAQ,SACT,SACA,KAAK,QAAQ,aACX,aACA,KAAK,QAAQ,UACX,UACA;AAOV,UAAI,QAAQ,QAAQ;AAClB,cAAME,WAAU,MAAM,QAOnB,iBAAiB;AAAA,UAClB,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,KAAAH,MAAK,UAAAC,WAAU,KAAK,QAAQ,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,QACzF,CAAC;AACD,cAAM,OAAOE,SAAQ,MAAM,UAAU,CAAC;AACtC,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,gDAAgD;AAG3E,cAAM,QAAQ,MAAM,YAAY;AAChC,YAAI,OAAO;AACT,gBAAM,OAAO,MAAM,YAAY;AAAA,YAC7B,SAAS,KAAK;AAAA,YACd,OAAO,MAAM;AAAA,YACb,OAAO,KAAK;AAAA,UACd,CAAC;AACD,cAAI,OAAO,OAAOA,SAAQ,MAAM,GAAG;AACjC,kBAAM,YAAY,KAAK,YAAY;AACnC,mBAAO,KAAK;AAAA,cACV,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,QAAQ,MAAM;AAAA,cACd,SAAS,KAAK;AAAA,cACd,MAAM,QAAQ,IAAI;AAAA,cAClB,MAAM,QAAQ,OAAOA,SAAQ,MAAM,CAAC;AAAA,cACpC,QAAQ,YAAY,8BAA8B;AAAA,cAClD,SAAS,gBAAgB,MAAM,OAAO,QAAQ,QAAQ,IAAI,CAAC,OAAO,KAAK,OAAO,WAAW,QAAQ,OAAOA,SAAQ,MAAM,CAAC,CAAC,IAAI,YAAY,oDAAoD,uCAAuC;AAAA,YACrO,CAAC;AAAA,UACH;AAAA,QACF;AAIA,cAAM,WAAW,MAAM,SAAS,IAAI;AACpC,cAAM,UAAU,MAAM;AAAA,UACpB,GAAG,QAAQ,QAAQ,mBAAmBA,SAAQ,UAAU,CAAC,sBAAsB,mBAAmBA,SAAQ,SAAS,CAAC;AAAA,UACpH;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,KAAK;AAAA,cAC9B,aAAa;AAAA,YACf;AAAA,YACA,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,UACtC;AAAA,QACF;AACA,cAAM,OAAQ,MAAM,QAAQ,KAAK;AACjC,YAAI,QAAQ,WAAW,KAAK;AAC1B,gBAAM,IAAI,MAAM,sBAAsB,QAAQ,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,QACjF;AACA,cAAM,WAAW,QAAQ,OAAOA,SAAQ,MAAM,CAAC;AAC/C,eAAO,YAAYH,MAAK;AAAA,UACtB,SAAS,KAAK,WAAW;AAAA,UACzB,SAASG,SAAQ;AAAA,UACjB,UAAAF;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU,GAAG,QAAQ;AAAA,UACrB,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,sBAAsB;AAAA,UACtB,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,UACd,WAAWE,SAAQ;AAAA,UACnB,SAAS,WAAWA,SAAQ,IAAI,SAAMF,SAAQ,gBAAW,QAAQ,6BAA6B,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,QAC1H,CAAC;AAAA,MACH;AAOA,UAAI,QAAQ,YAAY;AACtB,cAAM,YAAY,MAAM,kBAAkB;AAC1C,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AACA,cAAME,WAAU,MAAM,QAOnB,iBAAiB;AAAA,UAClB,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU;AAAA,YACnB,KAAAH;AAAA,YACA,UAAAC;AAAA,YACA,KAAK;AAAA,YACL,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,UAClC,CAAC;AAAA,QACH,CAAC;AACD,cAAM,OAAOE,SAAQ,MAAM,UAAU,CAAC;AACtC,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uDAAuD;AAElF,cAAM,QAAQ,MAAM,qBAAqB,SAAS;AAClD,cAAM,OAAO,MAAM,kBAAkB,OAAO,KAAK,KAAK;AACtD,cAAM,OAAO,OAAO,KAAK,iBAAiB;AAC1C,YAAI,SAAS,QAAQ,OAAO,MAAM;AAChC,iBAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,SAAS,KAAK;AAAA,YACd,MAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,YAChC,MAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,YAChC,QAAQ;AAAA,YACR,SAAS,gBAAgB,KAAK,SAAS,OAAO,KAAK,QAAQ,CAAC,CAAC,YAAY,KAAK,OAAO,YAAY,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,UACzH,CAAC;AAAA,QACH;AAIA,cAAM,WAAW,MAAM,sBAAsB;AAAA,UAC3C,cAAc;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,UAAU,MAAM;AAAA,UACpB,GAAG,QAAQ,QAAQ,mBAAmBA,SAAQ,UAAU,CAAC,sBAAsB,mBAAmBA,SAAQ,SAAS,CAAC;AAAA,UACpH;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,KAAK;AAAA,cAC9B,aAAa;AAAA,YACf;AAAA,YACA,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,UACtC;AAAA,QACF;AACA,cAAM,OAAQ,MAAM,QAAQ,KAAK;AACjC,YAAI,QAAQ,WAAW,KAAK;AAC1B,gBAAM,IAAI,MAAM,0BAA0B,QAAQ,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,QACrF;AACA,cAAM,WAAW,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAC3C,eAAO,YAAYH,MAAK;AAAA,UACtB,SAAS,KAAK,WAAW;AAAA,UACzB,SAASG,SAAQ;AAAA,UACjB,UAAAF;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU,GAAG,QAAQ;AAAA,UACrB,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,sBACE;AAAA,UACF,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,UACd,WAAWE,SAAQ;AAAA,UACnB,SAAS,WAAWA,SAAQ,IAAI,SAAMF,SAAQ,gBAAW,QAAQ,gCAAgC,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,QAC7H,CAAC;AAAA,MACH;AAQA,UAAI,QAAQ,SAAS;AACnB,cAAMF,UAAS,UAAU;AACzB,YAAI,CAACA,SAAQ;AACX,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AACA,cAAMI,WAAU,MAAM,QAOnB,iBAAiB;AAAA,UAClB,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,KAAAH,MAAK,UAAAC,WAAU,KAAK,SAAS,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,QAC1F,CAAC;AACD,cAAM,OAAOE,SAAQ,MAAM,UAAU,CAAC;AACtC,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iDAAiD;AAI5E,cAAM,SAAS,KAAK,OAAO;AAC3B,cAAM,YAAY,MAAM,eAAe,OAAO,WAAW;AACvD,gBAAM,OAAO,SACT,MAAM,aAAa,QAAQJ,QAAO,gBAAgB,KAAK,OAAO,MAAM,IACpE;AACJ,cAAI,OAAO,IAAI,IAAI,OAAO,KAAK,iBAAiB,GAAG;AACjD,mBAAO,EAAE,MAAM,UAAU,KAAsB;AAAA,UACjD;AACA,iBAAO,EAAE,MAAM,UAAU,MAAM,SAAS,QAAQ,MAAMA,OAAM,EAAE;AAAA,QAChE,CAAC;AACD,YAAI,UAAU,aAAa,MAAM;AAC/B,iBAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQA,QAAO;AAAA,YACf,SAAS,KAAK;AAAA,YACd,MAAM,GAAG,UAAU,IAAI;AAAA,YACvB,MAAM,GAAG,KAAK,iBAAiB;AAAA,YAC/B,SAAS,gBAAgBA,QAAO,cAAc,UAAU,UAAU,IAAI,iBAAiB,KAAK,iBAAiB;AAAA,UAC/G,CAAC;AAAA,QACH;AAIA,cAAM,UAAU,MAAM;AAAA,UACpB,GAAG,QAAQ,QAAQ,mBAAmBI,SAAQ,UAAU,CAAC,sBAAsB,mBAAmBA,SAAQ,SAAS,CAAC;AAAA,UACpH;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,KAAK;AAAA,cAC9B,aAAa,UAAU;AAAA,YACzB;AAAA,YACA,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,UACtC;AAAA,QACF;AACA,cAAM,OAAQ,MAAM,QAAQ,KAAK;AACjC,YAAI,QAAQ,WAAW,KAAK;AAC1B,gBAAM,IAAI,MAAM,uBAAuB,QAAQ,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,QAClF;AACA,eAAO,YAAYH,MAAK;AAAA,UACtB,SAAS,KAAK,WAAW;AAAA,UACzB,SAASG,SAAQ;AAAA,UACjB,UAAAF;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AAAA,UACT,WAAW,GAAG,KAAK,iBAAiB;AAAA,UACpC,OAAO,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,sBACE;AAAA,UACF,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,UACd,WAAWE,SAAQ;AAAA,UACnB,SAAS,WAAWA,SAAQ,IAAI,SAAMF,SAAQ,gBAAW,KAAK,iBAAiB,sDAAsD,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,QACjK,CAAC;AAAA,MACH;AAKA,YAAM,UAAU,MAAM,QAQnB,iBAAiB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AAKD,YAAM,iBAAiB,MAAM,mBAAmB;AAAA,QAC9C,UAAU,QAAQ,YAAY;AAAA,QAC9B,QAAQ,EAAE,SAAS,QAAQ,MAAM,QAAQ,YAAY,cAAc;AAAA,QACnE,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAGD,YAAM,UACJ,EAAE,iBAAiB,eAAe;AACpC,UAAI,qBAAqB;AACzB,UAAI,aAAa;AACf,YAAI,KAAK,MAAM,YAAY,SAAS,IAAI,KAAK,IAAI,GAAG;AAClD,wBAAc;AACd,qBAAW,IAAI;AAAA,QACjB,OAAO;AACL,kBAAQ,iBAAiB,YAAY;AACrC,+BAAqB;AAAA,QACvB;AAAA,MACF;AACA,YAAM,MAAM,GAAG,QAAQ,QAAQ,mBAAmB,QAAQ,UAAU,CAAC,sBAAsB,mBAAmB,QAAQ,SAAS,CAAC;AAChI,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,UAAU,KAAK,GAAG;AAAA,QAChF,MAAM,KAAK,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,MAC/C,CAAC;AACD,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,UAAU,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAG/C,YACE,sBACA,2EAA2E,KAAK,OAAO,GACvF;AACA,iBAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,WAAW;AAAA,YACX,SAAS,QAAQ;AAAA,YACjB,OAAO,QAAQ;AAAA,YACf,eAAe,SAAI,aAAa,aAAa,eAAe,OAAO,CAAC;AAAA,YACpE,SAAS,YAAY,QAAQ,IAAI,KAAK,QAAQ,aAAa,oDAA+C,aAAa,YAAY;AAAA,UACrI,CAAC;AAAA,QACH;AACA,cAAM,IAAI,MAAM,mBAAmB,IAAI,MAAM,KAAK,OAAO,EAAE;AAAA,MAC7D;AACA,YAAM,MAAO,MAAM,IAAI,KAAK;AAC5B,aAAO,YAAYD,MAAK;AAAA,QACtB,SAAS,IAAI,WAAW;AAAA,QACxB,SAAS,QAAQ;AAAA,QACjB,UAAAC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV,OAAO;AAAA;AAAA;AAAA,QAGP,sBAAsB;AAAA;AAAA;AAAA,QAGtB,gBAAgB,qBACZ,8BAAyB,aAAa,YAAY,gCAClD;AAAA,QACJ,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,SAAS,WAAW,QAAQ,IAAI,SAAMA,SAAQ,WAAM,QAAQ,aAAa,0CAA0C,IAAI,MAAM,IAAI,qBAAqB,qCAA2B,aAAa,YAAY,yCAAyC,EAAE;AAAA,MACvP,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,6BAA6B;AACnD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uDAAuD,CAAC;AAAA,UACxF,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AAMvD,UAAI,KAAK,UAAU,UAAU;AAC3B,cAAM,YAAY,MAAM,kBAAkB;AAC1C,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AACA,cAAM,EAAE,YAAAG,YAAW,IAAI,MAAM,QAAgC,SAAS;AACtE,cAAMD,WAAU,MAAM,QAQnB,kBAAkB;AAAA,UACnB,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,KAAAH,MAAK,UAAAC,WAAU,UAAU,QAAQ,OAAO,SAAS,CAAC;AAAA,QAC3E,CAAC;AACD,cAAMI,QAAOF,SAAQ,UAAU,CAAC;AAChC,YAAI,CAACE,MAAM,OAAM,IAAI,MAAM,2DAA2D;AAGtF,cAAM,QAAQ,MAAM,qBAAqB,SAAS;AAClD,cAAM,OAAO,MAAM,kBAAkB,OAAOA,MAAK,KAAK;AACtD,cAAM,OAAO,OAAOA,MAAK,iBAAiB;AAC1C,YAAI,SAAS,QAAQ,OAAO,MAAM;AAChC,iBAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,SAASA,MAAK;AAAA,YACd,MAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,YAChC,MAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,YAChC,QAAQ;AAAA,YACR,SAAS,gBAAgB,KAAK,SAAS,OAAO,KAAK,QAAQ,CAAC,CAAC,YAAYA,MAAK,OAAO,YAAY,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,UACzH,CAAC;AAAA,QACH;AAGA,cAAMC,YAAW,MAAM,sBAAsB;AAAA,UAC3C,cAAcD;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,cAAME,WAAU,MAAM,MAAM,GAAG,QAAQ,SAAS,mBAAmBH,WAAU,CAAC,aAAa;AAAA,UACzF,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK;AAAA,YAC9B,aAAaE;AAAA,UACf;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,WAAWH,SAAQ,UAAU,CAAC;AAAA,QACvD,CAAC;AACD,cAAMK,QAAQ,MAAMD,SAAQ,KAAK;AAKjC,YAAIA,SAAQ,WAAW,KAAK;AAC1B,gBAAM,IAAI,MAAM,yBAAyBA,SAAQ,MAAM,KAAK,KAAK,UAAUC,KAAI,CAAC,EAAE;AAAA,QACpF;AACA,cAAMC,YAAW,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;AAC3C,cAAM,UAAUJ,MAAK,YAAY,kBAAkB,oBAAoB;AAGvE,eAAO,YAAYL,MAAK;AAAA,UACtB,SAASQ,MAAK,WAAW;AAAA,UACzB,SAASL,SAAQ;AAAA,UACjB,UAAAF;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAUE,SAAQ;AAAA,UAClB,UAAU,GAAGM,SAAQ;AAAA,UACrB,OAAOJ,MAAK;AAAA,UACZ,SAASA,MAAK;AAAA,UACd,sBACE;AAAA,UACF,QAAQG,MAAK;AAAA,UACb,QAAQA,MAAK;AAAA,UACb,UAAUA,MAAK,SACX,kCAAkCA,MAAK,MAAM,GAAG,OAAO,KACvD;AAAA,UACJ,iBAAiBA,MAAK;AAAA,UACtB,WAAWL,SAAQ;AAAA,UACnB,SAAS,WAAWA,SAAQ,IAAI,SAAMF,SAAQ,gBAAWQ,SAAQ,oCAAiCJ,MAAK,KAAK,KAAKG,MAAK,MAAM;AAAA,QAC9H,CAAC;AAAA,MACH;AAEA,YAAM,EAAE,WAAW,IAAI,MAAM,QAAgC,SAAS;AAKtE,YAAM,UAAU,MAAM,QAQnB,kBAAkB;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAR,MAAK,UAAAC,WAAU,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5E,CAAC;AACD,YAAM,OAAO,QAAQ,UAAU,CAAC;AAChC,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,oDAAoD;AAK/E,YAAM,QAAQ,MAAM,YAAY;AAChC,UAAI,OAAO;AACT,cAAM,OAAO,MAAM,YAAY;AAAA,UAC7B,SAAS,KAAK;AAAA,UACd,OAAO,MAAM;AAAA,UACb,OAAO,KAAK;AAAA,QACd,CAAC;AACD,YAAI,OAAO,OAAO,QAAQ,MAAM,GAAG;AACjC,gBAAM,YAAY,KAAK,YAAY;AACnC,iBAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ,MAAM;AAAA,YACd,SAAS,KAAK;AAAA,YACd,MAAM,QAAQ,IAAI;AAAA,YAClB,MAAM,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAAA,YACpC,QAAQ,YAAY,8BAA8B;AAAA,YAClD,SAAS,gBAAgB,MAAM,OAAO,QAAQ,QAAQ,IAAI,CAAC,OAAO,KAAK,OAAO,WAAW,QAAQ,OAAO,QAAQ,MAAM,CAAC,CAAC,IAAI,YAAY,mEAAmE,uCAAuC;AAAA,UACpP,CAAC;AAAA,QACH;AAAA,MACF;AAIA,YAAM,WAAW,MAAM,SAAS,IAAI;AACpC,YAAM,UAAU,MAAM,MAAM,GAAG,QAAQ,SAAS,mBAAmB,UAAU,CAAC,aAAa;AAAA,QACzF,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK;AAAA,UAC9B,aAAa;AAAA,QACf;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,MACvD,CAAC;AACD,YAAM,OAAQ,MAAM,QAAQ,KAAK;AAKjC,UAAI,QAAQ,WAAW,KAAK;AAC1B,cAAM,IAAI,MAAM,kBAAkB,QAAQ,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,MAC7E;AACA,YAAM,WAAW,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAC/C,aAAO,YAAYD,MAAK;AAAA,QACtB,SAAS,KAAK,WAAW;AAAA,QACzB,SAAS,QAAQ;AAAA,QACjB,UAAAC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU,QAAQ;AAAA,QAClB,UAAU,GAAG,QAAQ;AAAA,QACrB,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,iBAAiB,KAAK;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,SAAS,WAAW,QAAQ,IAAI,SAAMA,SAAQ,gBAAW,QAAQ,kCAAkC,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,MAC/H,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,qBAAqB;AAC3C,YAAM,QAAQ,MAAM,YAAY;AAChC,UAAI,CAAC,OAAO;AACV,eAAO,KAAK;AAAA,UACV,YAAY;AAAA,UACZ,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,CAAC,SAAS,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3C,YAAY,EAAE,SAAS,gBAAgB,OAAO,MAAM,QAAQ,CAAC;AAAA,QAC7D,YAAY,EAAE,SAAS,QAAQ,OAAO,MAAM,QAAQ,CAAC;AAAA,MACvD,CAAC;AACD,aAAO,KAAK;AAAA,QACV,SAAS,MAAM;AAAA,QACf,UAAU,EAAE,gBAAgB,QAAQ,OAAO,GAAG,MAAM,QAAQ,OAAO,EAAE;AAAA,QACrE,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,8BAA8B;AACpD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uDAAuD,CAAC;AAAA,UACxF,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMF,UAAS,UAAU;AACzB,UAAI,CAACA,SAAQ;AACX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMC,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,EAAE,WAAW,IAAI,MAAM,QAAgC,SAAS;AAKtE,YAAM,UAAU,MAAM,QAQnB,kBAAkB;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAD,MAAK,UAAAC,WAAU,UAAU,QAAQ,CAAC;AAAA,MAC3D,CAAC;AACD,YAAM,OAAO,QAAQ,UAAU,CAAC;AAChC,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qDAAqD;AAKhF,YAAM,SAAS,KAAK,OAAO;AAC3B,YAAM,YAAY,MAAM,eAAe,OAAO,WAAW;AACvD,cAAM,OAAO,SACT,MAAM,aAAa,QAAQF,QAAO,gBAAgB,KAAK,OAAO,MAAM,IACpE;AACJ,YAAI,OAAO,IAAI,IAAI,OAAO,KAAK,iBAAiB,GAAG;AACjD,iBAAO,EAAE,MAAM,UAAU,KAAsB;AAAA,QACjD;AACA,eAAO,EAAE,MAAM,UAAU,MAAM,SAAS,QAAQ,MAAMA,OAAM,EAAE;AAAA,MAChE,CAAC;AACD,UAAI,UAAU,aAAa,MAAM;AAC/B,eAAO,KAAK;AAAA,UACV,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQA,QAAO;AAAA,UACf,SAAS,KAAK;AAAA,UACd,MAAM,GAAG,UAAU,IAAI;AAAA,UACvB,MAAM,GAAG,KAAK,iBAAiB;AAAA,UAC/B,SAAS,gBAAgBA,QAAO,cAAc,UAAU,UAAU,IAAI,iBAAiB,KAAK,iBAAiB;AAAA,QAC/G,CAAC;AAAA,MACH;AAGA,YAAM,WAAW,UAAU;AAC3B,YAAM,UAAU,MAAM,MAAM,GAAG,QAAQ,SAAS,mBAAmB,UAAU,CAAC,aAAa;AAAA,QACzF,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK;AAAA,UAC9B,aAAa;AAAA,QACf;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,MACvD,CAAC;AACD,YAAM,OAAQ,MAAM,QAAQ,KAAK;AAKjC,UAAI,QAAQ,WAAW,KAAK;AAC1B,cAAM,IAAI,MAAM,mBAAmB,QAAQ,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,MAC9E;AACA,aAAO,YAAYC,MAAK;AAAA,QACtB,SAAS,KAAK,WAAW;AAAA,QACzB,SAAS,QAAQ;AAAA,QACjB,UAAAC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU,QAAQ;AAAA,QAClB,WAAW,GAAG,KAAK,iBAAiB;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK,SAAS,yCAAyC,KAAK,MAAM,KAAK;AAAA,QACjF,iBAAiB,KAAK;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,SAAS,WAAW,QAAQ,IAAI,SAAMA,SAAQ,gBAAW,KAAK,iBAAiB,wCAAwC,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,MACnJ,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,gCAAgC;AACtD,UAAI,CAAC,yBAAyB,CAAC,2BAA2B;AACxD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,UAAU,MAAM,QAAiB,YAAY,mBAAmBD,IAAG,CAAC,EAAE,EAAE;AAAA,QAC5E,MAAM;AAAA,MACR;AACA,YAAM,cAAc,SAAS,QAAQA;AAOrC,YAAM,QAAQ,MAAM,oBAAoB,mBAAmB;AAC3D,YAAM,MAAM,MAAM,QASf,qBAAqB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,KAAAA,MAAK,MAAM,CAAC,EAAE,CAAC;AAChF,YAAM,YACJ,IAAI,UAAU,QAAQ,IAAI,WACtB,IAAI,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,QAAQ,KAChD,IAAI,mBAAmB;AAC7B,YAAM,SAAS,IAAI,UAAU;AAC7B,YAAM,WAAW,IAAI,YAAY,QAAQ,WAAW;AAIpD,YAAM,UAAU,WACZ,WAAW,WAAW,SAAMC,SAAQ,8BAAyB,SAAS,wGAAmG,MAAM,oIAC/K,WAAW,WAAW,SAAMA,SAAQ,8BAAyB,SAAS,wDAAwD,MAAM;AACxI,aAAO,YAAYD,MAAK;AAAA,QACtB,SAAS,IAAI,OAAO,aAAa;AAAA,QACjC,SAAS;AAAA,QACT,UAAAC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU,WACN,GAAG,SAAS,+CACZ,GAAG,SAAS;AAAA,QAChB,YAAY,IAAI,OAAO;AAAA,QACvB,sBACE;AAAA,QACF;AAAA,QACA,SAAS,IAAI;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,4BAA4B;AAClD,UAAI,CAAC,yBAAyB;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAMD,OAAM,OAAO,KAAK,OAAO,EAAE;AACjC,YAAMC,YAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC;AACvD,YAAM,UAAU,MAAM,QAAiB,YAAY,mBAAmBD,IAAG,CAAC,EAAE,EAAE;AAAA,QAC5E,MAAM;AAAA,MACR;AACA,YAAM,cAAc,SAAS,QAAQA;AAOrC,YAAM,SAAS,MAAM,QAAsD,iBAAiB;AAAA,QAC1F,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAAA,KAAI,CAAC;AAAA,MAC9B,CAAC;AACD,UAAI,OAAO,WAAW,sBAAsB,CAAC,OAAO,iBAAiB;AACnE,cAAM,IAAI,MAAM,sCAAsC,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,MAChF;AACA,YAAM,EAAE,YAAY,OAAO,IAAI,MAAM,qBAAqB;AAAA,QACxD,iBAAiB,OAAO;AAAA,QACxB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC,EAAE,MAAM,CAAC,MAAe;AACvB,cAAM,IAAI;AAAA,UACR,yBAA0B,EAAY,OAAO;AAAA,QAC/C;AAAA,MACF,CAAC;AACD,YAAM,MAAM,MAAM,QAKf,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,KAAAA,MAAK,WAAW,CAAC,EAAE,CAAC;AACjF,YAAM,UAAU,IAAI,wBAAwB,KAAK,QAAQ,CAAC,CAAC;AAC3D,YAAM,UAAU,IAAI,WAAW;AAC/B,aAAO,YAAYA,MAAK;AAAA,QACtB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAAC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ,UAAU,aAAa,IAAI;AAAA,QACnC,SAAS,IAAI;AAAA,QACb;AAAA,QACA,SAAS,WAAW,WAAW,SAAMA,SAAQ,mCAA2B,OAAO,uCAAuC,OAAO,MAAM,GAAG,EAAE,CAAC,kMAAwL,IAAI,kBAAkB,QAAQ,IAAI,eAAe,MAAM,EAAE;AAAA,MAC5X,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,qBAAqB;AAC3C,YAAMF,UAAS,UAAU;AACzB,UAAI,CAACA,SAAQ;AACX,eAAO,KAAK;AAAA,UACV,YAAY;AAAA,UACZ,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,SAAS,QAAQ,IAAI,qBAAqB;AAChD,YAAM,YAAY;AAClB,YAAM,OAAO,MAAM;AAAA,QAAe,CAAC,WACjC,aAAa,QAAQA,QAAO,gBAAgB,WAAW,MAAM;AAAA,MAC/D;AACA,aAAO,KAAK;AAAA,QACV,SAASA,QAAO;AAAA,QAChB,SAAS;AAAA,QACT,OAAO,GAAG,IAAI;AAAA,QACd;AAAA,QACA,UAAU,qCAAqCA,QAAO,cAAc;AAAA,QACpE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,kBAAkB;AAExC,YAAM,EAAE,OAAO,IAAI,MAAM,QAYtB,SAAS;AAMZ,YAAM,OAAO,WAAW,MAAM;AAG9B,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,OAAO,SACT,YAAY,OAAO,MAAM,0GACzB;AAAA,UACN;AAAA,QACF;AAAA,QACA,mBAAmB;AAAA,QACnB,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,SAAS,kBAAkB;AACxC,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uDAAuD,CAAC;AAAA,UACxF,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,UAAU,OAAO,KAAK,WAAW,EAAE;AACzC,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,2CAA2C;AAGzE,YAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,uBAAuB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,UAAU,KAAK,GAAG;AAAA,QAChF,MAAM,KAAK,UAAU,EAAE,SAAS,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,OAAU,CAAC;AAAA,MACzF,CAAC;AACD,YAAM,MAAO,MAAM,IAAI,KAAK;AAK5B,UAAI,CAAC,IAAI,IAAI;AAKX,cAAM,SACH,OAAO,IAAI,UAAU,YAAY,IAAI,OAAO,YAC5C,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,OAC7C,IAAI,WACJ,QAAQ,IAAI,MAAM;AACpB,cAAM,IAAI,MAAM,OAAO,MAAM,CAAC;AAAA,MAChC;AACA,aAAO,KAAK;AAAA,QACV,WAAW;AAAA,QACX,iBAAiB,IAAI,eAAe;AAAA,QACpC,QAAQ,IAAI,eAAe;AAAA,QAC3B,SAAS,wBAAwB,OAAO;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,0BAA0B;AAChD,YAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,UAAI,CAAC,OAAO,SAAS,YAAY,KAAK,gBAAgB,GAAG;AACvD,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC;AAC9D,YAAM,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAS,EAAE,YAAY;AACvE,YAAM,YAAY,KAAK,MAAM,eAAe,GAAG;AAE/C,YAAM,UAAU,MAAM,kBAAkB;AAAA,QACtC,QAAQ,gDAAsC,YAAY,QAAQ,KAAK;AAAA,QACvE,aAAa,EAAE,UAAU;AAAA,QACzB;AAAA,MACF,CAAC;AACD,oBAAc,EAAE,SAAS,cAAc,UAAU;AACjD,iBAAW,WAAW;AACtB,aAAO,KAAK;AAAA,QACV,YAAY;AAAA,QACZ,mBAAmB,SAAI,aAAa,eAAe,OAAO,CAAC;AAAA,QAC3D;AAAA,QACA,SAAS,qDAAgD,YAAY,oBAAoB,SAAS;AAAA,MACpG,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,uBAAuB;AAC7C,UAAI,CAAC,eAAe,KAAK,MAAM,YAAY,SAAS,IAAI,KAAK,IAAI,GAAG;AAClE,sBAAc;AACd,mBAAW,IAAI;AACf,eAAO,KAAK;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,aAAO,KAAK;AAAA,QACV,YAAY;AAAA,QACZ,mBAAmB,SAAI,YAAY,aAAa,eAAe,OAAO,CAAC;AAAA,QACvE,WAAW,YAAY;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO,SAAS,uBAAuB;AAC7C,YAAM,MAAM,gBAAgB;AAC5B,oBAAc;AACd,iBAAW,IAAI;AACf,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,SAAS,MACL,2FACA;AAAA,MACN,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,IAAI,OAAO,IAAI,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,EAChG,SAAS,KAAK;AACZ,WAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAW,IAAc,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,EAChG;AACF,CAAC;AAED,MAAM,OAAO,QAAQ,IAAI,qBAAqB,CAAC;","names":["query","sku","wallet","sku","quantity","receipt","session","merchantId","reqs","xPayment","paidRes","paid","paidUsdc"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../packages/internal/sinocare-storefront/src/catalog.ts","../../../packages/internal/sinocare-storefront/src/card.ts","../../../packages/internal/sinocare-storefront/src/checkout.ts","../../../packages/internal/sinocare-storefront/src/instructions.ts","../../../packages/internal/sinocare-storefront/src/tools.ts","../../../packages/internal/sinocare-storefront/src/views.ts","../src/checkout-card.generated.ts"],"sourcesContent":["#!/usr/bin/env node\n// Buyer-side AP2: sign the PaymentMandate as a real ES256 JWS bound to the cart.\nimport { createHash } from 'node:crypto';\nimport { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n// What this storefront and the wallet connector say and show in common — the\n// aisles, the card metadata, the model instructions, the twelve shared tools,\n// and the catalogue/order views. Private to this repo, so it is bundled into\n// dist rather than resolved by name (see tsup.config.ts).\nimport {\n CARD_MIME,\n type CheckoutGroup,\n type Product,\n type ToolDef,\n buildInstructions,\n categoryQuery,\n checkoutView,\n ordersView,\n priceDisplayOf,\n productsView,\n resolveProduct,\n servesCardUri,\n storefrontTools,\n uiMeta,\n widgetMeta,\n} from '@agentbank/sinocare-storefront';\n// Buyer-side MPP · Tempo — parse the 402 challenge, pay the on-chain TIP-20\n// transfer, build the Payment credential. Same SDK, different subpath.\nimport {\n type AcpClientOptions,\n completeCheckout,\n purchaseOf,\n readCheckoutSession,\n totalOf,\n} from '@curless/agentbank-protocols/acp';\nimport {\n type Ap2IntentMandate,\n signIntentMandate,\n signPaymentMandate,\n} from '@curless/agentbank-protocols/ap2';\n// Buyer-side USDC-over-Solana x402 — build + partially sign an SPL transfer, the\n// facilitator co-signs feePayer + submits. Same SDK, different subpath.\nimport {\n type SolanaX402Requirements,\n addressFromSecretKey,\n secretKeyFromString,\n signSolanaX402Payment,\n} from '@curless/agentbank-protocols/solana';\nimport { payMppTempoChallenge } from '@curless/agentbank-protocols/tempo';\nimport {\n type UaagError,\n checkout as uaagCheckout,\n checkoutState as uaagCheckoutState,\n createIntent as uaagCreateIntent,\n} from '@curless/agentbank-protocols/uaag';\n// Buyer-side x402 lives in the SDK — sign EIP-3009, encode X-PAYMENT, read USDC\n// balance. The demo never hand-rolls the signing.\nimport {\n type Eip712Signer,\n type X402PaymentRequirements,\n cdpAccountSigner,\n encodeXPaymentHeader,\n signX402Payment,\n signerFromPrivateKey,\n usdcBalance,\n} from '@curless/agentbank-protocols/x402';\n// Buyer-side RLUSD/XRPL x402 — sign an Ed25519 Payment, encode X-PAYMENT. Same\n// SDK, different subpath. encodeXPaymentHeader collides with /x402's, so alias it.\nimport {\n type XrplPaymentRequirements,\n encodeXPaymentHeader as encodeXrplXPaymentHeader,\n signXrplPayment,\n} from '@curless/agentbank-protocols/xrpl';\nimport { type PaymentCredential, createBuyerSession } from '@curless/agentbank-sdk';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Hex } from 'viem';\nimport { generatePrivateKey } from 'viem/accounts';\nimport { Client as XrplClient, Wallet as XrplWallet } from 'xrpl';\n// The checkout MCP App card (a single self-contained HTML), built from\n// examples/sinocare-demo/widget and served as a ui:// resource.\nimport { CHECKOUT_CARD_HTML } from './checkout-card.generated.js';\n\n// @curless/sinocare-demo — a SIMULATED \"Sinocare\" storefront MCP for the BUYER.\n// Ordering is end-to-end agentic:\n// 1. browse + place an order via Sinocare's merchant backend\n// (mcp.curless.ai/sinocare) — the merchant prices it and opens a\n// merchant-quoted ACP checkout session with its own key;\n// 2. THIS buyer agent completes the charge over ACP with its own payment\n// credential (test card) — the merchant set the price, the agent pays.\n// The storefront never sees the merchant's key; it holds only its OWN buyer\n// token, exactly like a real agent buyer.\n//\n// Run (Claude Desktop / any MCP client):\n// npx -y @curless/sinocare-demo\n// with env:\n// AGENTBANK_AGENT_TOKEN the buyer's agentbank agent key (agb_…, agent:execute).\n// SINOCARE_BUYER_NAME / SINOCARE_BUYER_EMAIL who this agent buys for (optional;\n// unset = anonymous orders, as before)\n// Use a TEST, no-org key (the demo org is shared).\n// AGENTBANK_API_URL base URL (default https://mcp.curless.ai; set\n// http://localhost:3000 for local dev).\n// AGENTBANK_PAYMENT_TOKEN delegated card token (default pm_card_visa).\n// Real ACP credential (optional) — mint a Shared Payment Token per order\n// instead of reusing a plain card token. This is what a buyer's WALLET does\n// when an agent asks to spend: the token is scoped to one seller, one amount,\n// one currency and a short expiry, so it can buy nothing else.\n// STRIPE_AGENT_SECRET_KEY the BUYER side's Stripe key (the wallet's PSP).\n// Must be a DIFFERENT Stripe account from the\n// seller's — an SPT cannot be granted to yourself.\n// AGENTBANK_SELLER_PROFILE the seller's Stripe profile id (profile_…) that\n// the gateway redeems with.\n// STRIPE_AGENT_PAYMENT_METHOD optional pm_… to mint from; in test mode a\n// throwaway one is created from tok_visa.\n// Set all of these and buy_sinocare_product_acp pays with a real spt_; leave\n// them unset and it falls back to AGENTBANK_PAYMENT_TOKEN.\n// Two guards, both OFF by default — an order here is one click in the card,\n// and a Sinocare room is €1,280–2,900:\n// SINOCARE_ALLOW_LIVE_WALLET=1 allow minting with a LIVE key (REAL money).\n// SINOCARE_WALLET_FALLBACK=1 if minting fails, pay with the plain card\n// token instead of failing the order.\n// Without them a live key refuses to mint, and a mint failure fails the\n// order rather than silently paying with an unscoped credential.\n// x402 USDC (EVM) — pick ONE signer:\n// X402_SIGNER=cdp a CDP Server Wallet, zero raw key (for MAINNET);\n// needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET.\n// X402_PAYER_PRIVATE_KEY a local funded wallet key (testnet or mainnet).\n// The gateway's mode (test/live key) decides the network it quotes; fund the\n// buyer wallet with USDC on that network.\n// x402 RLUSD (XRP Ledger) — for buy_sinocare_product_rlusd / xrpl_buyer_wallet:\n// XRPL_BUYER_SEED an `sEd…` testnet seed (Ed25519) holding RLUSD + a\n// little test XRP for the fee/reserve.\n// XRPL_TESTNET_WSS RPC (default wss://s.altnet.rippletest.net:51233).\n// XRPL_RLUSD_ISSUER RLUSD issuer r-address (default = testnet issuer).\n//\n// IMPORTANT: only JSON-RPC may be written to stdout (the MCP stdio transport).\n// Never console.log here — diagnostics go to stderr.\n\nconst API_BASE = (process.env.AGENTBANK_API_URL ?? 'https://mcp.curless.ai').replace(/\\/$/, '');\n// Where the buyer's hosted pages live. Separate from the API base because the\n// buyer wallet became its own service on 2026-08-27 and took those pages with\n// it — the side that SERVES a page owns its address, and a link built from the\n// API's base was a link to a page that had moved.\n//\n// Falls back to the API base, so an unconfigured deployment keeps working: the\n// gateway still answers /buyer/* today, and will until it is retired.\nconst WALLET_BASE = (process.env.BUYER_WALLET_PUBLIC_URL ?? API_BASE).replace(/\\/$/, '');\nconst SINOCARE = `${API_BASE}/sinocare`;\n\n// The buyer's ACP client. Every order below reads the session's real total\n// and completes through this rather than hand-writing /acp/... — the two calls\n// were written out twice already, and both copies re-derived that the\n// authoritative amount is on the session, not in the backend's display string.\nconst acp = (merchantId: string): AcpClientOptions => {\n // Throw rather than send an empty bearer. Every caller below already refuses\n // to open a checkout without a token, so reaching here without one is a bug\n // in this file — and an empty Authorization header would surface as a 401\n // from the gateway, which reads like a credential problem on the buyer's end.\n if (!TOKEN) throw new Error('AGENTBANK_AGENT_TOKEN is not set');\n return { baseUrl: API_BASE, merchantId, token: TOKEN };\n};\nconst TOKEN = process.env.AGENTBANK_AGENT_TOKEN;\n\n// WHO this agent is buying for. A buyer agent is the only party that knows its\n// user's identity — the merchant never meets them — so it is the only place this\n// can enter the system. Sent on every checkout, and from there it reaches the\n// order, the card provider's customer record, the Curless mirror and the Shopify\n// order.\n//\n// Unset → nothing is sent, and every order stays anonymous exactly as before.\n// Deliberately NOT defaulted to a placeholder: a fabricated buyer would travel\n// into a merchant's financial records and Shopify would email the address.\nconst BUYER = (() => {\n const name = process.env.SINOCARE_BUYER_NAME?.trim();\n const email = process.env.SINOCARE_BUYER_EMAIL?.trim();\n if (!name && !email) return undefined;\n return { ...(name ? { name } : {}), ...(email ? { email } : {}) };\n})();\nconst PAYMENT_TOKEN = process.env.AGENTBANK_PAYMENT_TOKEN ?? 'pm_card_visa';\nconst STRIPE_AGENT_KEY = process.env.STRIPE_AGENT_SECRET_KEY;\nconst SELLER_PROFILE = process.env.AGENTBANK_SELLER_PROFILE;\n\n// The BUYER's Curless wallet, signed into at runtime by the person buying —\n// not configuration. Two ways to pay by card now sit side by side: the agent's\n// own Stripe key (STRIPE_AGENT_SECRET_KEY above, the demo's original path), and\n// this, where the credential is minted from the card the buyer bound and capped\n// by the limits the buyer set. Both stay: the wallet is the one being built,\n// and the agent-key path is what still works when nobody has signed in.\nconst wallet = createBuyerSession({ baseUrl: API_BASE });\n\n// One browser sign-in at a time, shared by whoever asks. Two cards (or a card\n// and the model) each starting their own would show the person two different\n// codes for the same wallet, and only one of them would ever complete.\nlet pending: Awaited<ReturnType<typeof wallet.startDeviceLogin>> | null = null;\n\n/**\n * The signed-in wallet owner, as a buyer block — or undefined when nobody is\n * signed in (the agent-key ACP path, which keeps SINOCARE_BUYER_EMAIL).\n */\nconst walletBuyer = (): { buyer: { email: string; name?: string } } | undefined => {\n const who = wallet.current();\n if (!who) return undefined;\n return { buyer: { email: who.email, ...(who.name ? { name: who.name } : {}) } };\n};\n\n// Whether a sign-in was ever STARTED here. `pending` alone cannot say: it is\n// null both before anyone begins and after one times out, and reporting those\n// two as the same thing is how \"nobody has signed in yet\" got told to someone\n// as \"your code expired\".\nlet loginEverStarted = false;\n\nconst pendingLogin = async (): Promise<NonNullable<typeof pending>> => {\n if (pending) return pending;\n const started = await wallet.startDeviceLogin();\n pending = started;\n loginEverStarted = true;\n // The session adopts itself when the person finishes; this just clears the\n // slot so a later sign-in starts fresh. Errors are the poller's to report —\n // swallowing them here would leave a dead login pinned forever.\n started\n .wait()\n .catch(() => undefined)\n .finally(() => {\n pending = null;\n });\n return started;\n};\n\n// The gateway's spend-policy reasons, said to the PERSON. Mirrors the codes\n// `evaluatePolicy` emits; anything unmapped falls through to the gateway's own\n// wording rather than being swallowed, so a new code shows up as English text\n// instead of disappearing.\n// The gateway's refusals, said to the PERSON — each with its OWN next step.\n// One shared \"想付的话可以先调高限额\" tail was wrong for every reason that is\n// not a limit: it told someone whose wallet has no card at all to go raise a\n// cap, which sends them to the wrong screen and leaves the actual problem\n// unmentioned.\nconst REFUSALS: Array<[RegExp, string, string]> = [\n [/per_transaction_limit/, '超过了你设的单笔上限', '可以在钱包里调高单笔上限。'],\n [/daily_limit/, '超过了你设的当日上限', '可以调高当日上限,或者明天再来。'],\n [/monthly_limit/, '超过了你设的当月上限', '可以调高当月上限,或者下个月再来。'],\n [/merchant_not_allowed/, '这个商家不在你的白名单里', '把它加进白名单就能付。'],\n [/mcc_not_allowed/, '这个商家类别不在你的白名单里', '把这个类别加进白名单就能付。'],\n [\n /no approval step yet/,\n '金额超过了你设的\"需要我批准\"的门槛,而现在还没有审批环节',\n '把这个门槛调高或清掉就能付。',\n ],\n [/no card is bound/, '这个钱包还没绑卡', '去钱包页面绑一张卡再回来付。'],\n];\n\n// A wallet refusal is not a payment failure, and the difference matters to the\n// person: nothing was charged. Rendered through the card's `message`, so it has\n// to be JSON and it has to be readable.\nconst walletRefusal = (\n err: Error,\n): { content: Array<{ type: 'text'; text: string }>; isError: true } => {\n const raw = err.message;\n const hit = REFUSALS.find(([re]) => re.test(raw));\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n walletRefused: true,\n message: hit\n ? `钱包没付这笔 —— ${hit[1]}。没有扣款。${hit[2]}`\n : `钱包没付这笔:${raw}。没有扣款。`,\n // The wallet page is where every one of these is fixed, so the card\n // can hand the person somewhere to go rather than a dead end.\n walletUrl: `${API_BASE}/buyer/wallet`,\n next: \"this is the BUYER'S OWN limit, not a payment failure. Tell them which limit stopped it and offer to raise it with wallet_set_limits — do NOT retry with another payment method.\",\n }),\n },\n ],\n isError: true,\n };\n};\nconst AGENT_PM = process.env.STRIPE_AGENT_PAYMENT_METHOD;\nconst STRIPE_AGENT_SECRET_KEY_IS_LIVE = !!STRIPE_AGENT_KEY?.startsWith('sk_live_');\n// Two deliberate escape hatches, both off by default:\n// SINOCARE_ALLOW_LIVE_WALLET=1 — mint with a live key (real money, see below).\n// SINOCARE_WALLET_FALLBACK=1 — if minting fails, pay with the plain card\n// token anyway instead of failing the order.\nconst WALLET_LIVE_OK = process.env.SINOCARE_ALLOW_LIVE_WALLET === '1';\nconst WALLET_FALLBACK_OK = process.env.SINOCARE_WALLET_FALLBACK === '1';\n\n// Mint a REAL ACP Shared Payment Token for exactly this order — the buyer\n// wallet's half of agentic commerce. Scoped to the seller's profile, this\n// amount, this currency, 15 minutes; the agent can spend it nowhere else.\n// Returns null when the wallet side isn't configured, so the demo falls back to\n// the plain card token it has always used. Plain fetch — no Stripe SDK here.\n// ⚠️ The throwaway card is minted FRESH per order, deliberately. A\n// PaymentMethod built from a single-use token (tok_visa) and never attached to\n// a Customer is CONSUMED once a PaymentIntent draws on it — Stripe then refuses\n// to issue an SPT against it (\"The payment method is in a consumed or deleted\n// state\"). Caching one per process therefore broke every order after the\n// first. One extra test-mode API call per order is the price of a wallet that\n// works twice.\n\nconst mintSharedPaymentToken = async (\n amountMinor: number,\n currency: string,\n): Promise<string | null> => {\n if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) return null;\n // A live key here means a order charges a REAL card for the full product\n // price (€1,280–2,900) the moment someone clicks pay in the card — with no\n // confirmation step anywhere. Refuse unless that is explicitly what you want.\n if (STRIPE_AGENT_SECRET_KEY_IS_LIVE && !WALLET_LIVE_OK) {\n throw new Error(\n 'refusing to mint with a LIVE Stripe key — a order would charge a real card for the full product price. Set SINOCARE_ALLOW_LIVE_WALLET=1 if that is genuinely intended.',\n );\n }\n const post = async (\n path: string,\n body: Record<string, string>,\n preview = false,\n ): Promise<Record<string, unknown>> => {\n const res = await fetch(`https://api.stripe.com/v1/${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${STRIPE_AGENT_KEY}`,\n 'content-type': 'application/x-www-form-urlencoded',\n ...(preview ? { 'stripe-version': '2026-04-22.preview' } : {}),\n },\n body: new URLSearchParams(body),\n });\n const json = (await res.json()) as { id?: string; error?: { message?: string } };\n if (!res.ok) throw new Error(`stripe ${path} -> ${res.status}: ${json.error?.message ?? ''}`);\n return json as Record<string, unknown>;\n };\n // The card the token draws on. A real wallet uses the customer's saved card;\n // in test mode a fresh throwaway one stands in for every order (see above).\n const pm =\n AGENT_PM ??\n String((await post('payment_methods', { type: 'card', 'card[token]': 'tok_visa' })).id);\n const spt = await post(\n 'shared_payment/issued_tokens',\n {\n payment_method: pm,\n 'seller_details[network_business_profile]': SELLER_PROFILE,\n 'usage_limits[currency]': currency.toLowerCase(),\n 'usage_limits[max_amount]': String(amountMinor),\n 'usage_limits[expires_at]': String(Math.floor(Date.now() / 1000) + 900),\n },\n true,\n ).catch((err: unknown) => {\n // A PINNED card hits the same one-shot wall, and there we can't just mint a\n // new one — say so instead of surfacing Stripe's bare message.\n if (AGENT_PM && /consumed or deleted/i.test(String(err))) {\n throw new Error(\n `STRIPE_AGENT_PAYMENT_METHOD (${AGENT_PM}) is spent — a payment method built from a single-use token can back exactly one charge. Unset it and the demo mints a fresh throwaway card per order, or pin one attached to a Customer.`,\n );\n }\n throw err;\n });\n return String(spt.id);\n};\n\n// Sinocare backend (public — no buyer token; the merchant key lives there).\nconst backend = async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n const res = await fetch(`${SINOCARE}${path}`, {\n ...init,\n headers: { 'content-type': 'application/json', ...(init.headers ?? {}) },\n });\n if (!res.ok) {\n throw new Error(\n `sinocare-backend ${path} -> ${res.status}: ${await res.text().catch(() => '')}`,\n );\n }\n return (await res.json()) as T;\n};\n\n// --- x402 (stablecoin) payment --------------------------------------------\n// x402 settles USDC. The amount is now MERCHANT-QUOTED: sinocare-backend opens a\n// merchant-quoted x402 session via the SDK and sets the USDC price (a small\n// fixed test charge on testnet). The buyer just signs + pays the session — it\n// never computes or passes the amount.\n\n// The buyer's x402 signer, resolved once and cached:\n// • X402_SIGNER=cdp → a Coinbase CDP Server Wallet (zero raw key; for\n// mainnet — needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET)\n// • X402_PAYER_PRIVATE_KEY → a local key (testnet/mainnet)\n// • neither → null (signX402 falls back to a throwaway key,\n// which only settles under a STUB facilitator)\n// Returning the Eip712Signer (address + signTypedData) lets both the balance\n// pre-flight and the wallet tool read .address regardless of signer kind.\nconst useCdpSigner = process.env.X402_SIGNER === 'cdp';\nlet buyerSignerPromise: Promise<Eip712Signer | null> | undefined;\nconst buyerSigner = (): Promise<Eip712Signer | null> => {\n buyerSignerPromise ??= (async () => {\n if (useCdpSigner) return cdpAccountSigner();\n const k = process.env.X402_PAYER_PRIVATE_KEY as Hex | undefined;\n return k ? signerFromPrivateKey(k) : null;\n })();\n return buyerSignerPromise;\n};\nconst fmtUsdc = (baseUnits: bigint): string => `${(Number(baseUnits) / 1e6).toFixed(2)} USDC`;\n\n// Answer an x402 402 challenge: sign an EIP-3009 transferWithAuthorization (via\n// the buyer x402 SDK) → base64 X-PAYMENT header. With a REAL facilitator (Base\n// Sepolia or mainnet) the signer must hold USDC on that chain — configure a CDP\n// wallet or X402_PAYER_PRIVATE_KEY; without either a throwaway key signs, which\n// only settles under a STUB facilitator.\nconst signX402 = async (r: X402PaymentRequirements): Promise<string> => {\n const signer = (await buyerSigner()) ?? (await signerFromPrivateKey(generatePrivateKey()));\n return encodeXPaymentHeader(await signX402Payment({ signer, requirements: r }));\n};\n\n// --- RLUSD (XRP Ledger) x402 payment --------------------------------------\n// The buyer's XRPL wallet, from XRPL_BUYER_SEED (an `sEd…` seed → Ed25519). A\n// real buyer holds this in a wallet; the demo derives it from env. Null when\n// unset — the RLUSD tool then tells the user to configure it. Unlike USDC there\n// is no throwaway fallback: settling RLUSD needs a funded, trust-lined account.\nconst XRPL_SEED = process.env.XRPL_BUYER_SEED;\nconst XRPL_RPC = process.env.XRPL_TESTNET_WSS ?? 'wss://s.altnet.rippletest.net:51233';\nlet xrplWalletCache: XrplWallet | null = null;\nconst xrplBuyer = (): XrplWallet | null => {\n if (xrplWalletCache) return xrplWalletCache;\n if (!XRPL_SEED) return null;\n xrplWalletCache = XrplWallet.fromSeed(XRPL_SEED);\n return xrplWalletCache;\n};\n\n// USDC-over-Solana buyer: SOLANA_BUYER_SECRET is a devnet Solana secret key (a\n// solana-keygen JSON array or a base58 string) holding devnet USDC. Cached as a\n// promise (base58 decode is async). SOLANA_RPC fetches balances + a blockhash.\nconst SOLANA_RPC = process.env.SOLANA_RPC_URL ?? 'https://api.devnet.solana.com';\nlet solanaSecretPromise: Promise<Uint8Array | null> | undefined;\nconst solanaBuyerSecret = (): Promise<Uint8Array | null> => {\n solanaSecretPromise ??= (async () => {\n const s = process.env.SOLANA_BUYER_SECRET;\n if (!s) return null;\n try {\n return await secretKeyFromString(s);\n } catch {\n return null;\n }\n })();\n return solanaSecretPromise;\n};\n\n// The buyer's USDC balance (base units) across its token accounts for a mint, via\n// a raw Solana JSON-RPC call (no SPL SDK). null on any RPC error → skip pre-flight.\nconst solanaUsdcBalance = async (owner: string, mint: string): Promise<number | null> => {\n try {\n const res = await fetch(SOLANA_RPC, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getTokenAccountsByOwner',\n params: [owner, { mint }, { encoding: 'jsonParsed' }],\n }),\n });\n // biome-ignore lint/suspicious/noExplicitAny: raw JSON-RPC shape\n const j = (await res.json()) as any;\n const accounts = j?.result?.value ?? [];\n let total = 0;\n for (const a of accounts) {\n total += Number(a?.account?.data?.parsed?.info?.tokenAmount?.amount ?? 0);\n }\n return total;\n } catch {\n return null;\n }\n};\n\n// Skyfire KYAPay — the BUYER mints a Skyfire-SIGNED PAY token (Skyfire's key signs\n// it; unlike the crypto rails the buyer can't self-sign) and presents it to the\n// MERCHANT backend, which charges it via the merchant SDK. SKYFIRE_BUYER_API_KEY\n// mints (buyer agent key from the Skyfire dashboard); SKYFIRE_SELLER_SERVICE_ID is\n// the seller service the payment authorizes. The agentbank key that verifies +\n// charges is the MERCHANT backend's, not the demo's.\nconst SKYFIRE_API = process.env.SKYFIRE_API_URL ?? 'https://api.skyfire.xyz';\nconst SKYFIRE_BUYER_API_KEY = process.env.SKYFIRE_BUYER_API_KEY;\nconst SKYFIRE_SELLER_SERVICE_ID = process.env.SKYFIRE_SELLER_SERVICE_ID;\n// A small fixed test charge (USD quote → settles USDC). Pin with SKYFIRE_TEST_AMOUNT.\n// 0.001 keeps each test charge tiny so a small Skyfire balance covers many runs.\nconst SKYFIRE_TEST_AMOUNT = process.env.SKYFIRE_TEST_AMOUNT ?? '0.001';\n\n// --- MPP · Tempo — on-chain TIP-20 settlement (Tempo payments chain, testnet) ---\n// MPP's `tempo` method: agentbank answers with a 402 whose signed challenge carries\n// the on-chain terms; the buyer wallet (TEMPO_BUYER_PRIVATE_KEY, funded pathUSD via\n// the Tempo faucet) pays with transferWithMemo; agentbank verifies the transfer\n// on-chain by tx hash. The buyer side (pay + credential) is the SDK\n// @curless/agentbank-protocols/tempo — the demo only holds config. A tiny fixed\n// amount so a small balance covers many runs.\nconst TEMPO_RPC = process.env.TEMPO_RPC_URL ?? 'https://rpc.moderato.tempo.xyz';\nconst TEMPO_BUYER_PRIVATE_KEY = process.env.TEMPO_BUYER_PRIVATE_KEY as Hex | undefined;\nconst MPP_TEMPO_TEST_AMOUNT = Number(process.env.MPP_TEMPO_TEST_AMOUNT ?? 10000); // 0.01 pathUSD (6dp)\n\n// Mint a Skyfire PAY token (Skyfire ES256-signs it) authorizing `amountUsd` to our\n// seller service — returned as a JWT the buyer presents in the x-kyapay-token header.\nconst mintSkyfirePayToken = async (amountUsd: string): Promise<string> => {\n if (!SKYFIRE_BUYER_API_KEY) throw new Error('set SKYFIRE_BUYER_API_KEY');\n if (!SKYFIRE_SELLER_SERVICE_ID) throw new Error('set SKYFIRE_SELLER_SERVICE_ID');\n const expiresAt = Math.floor(Date.now() / 1000) + 300;\n const res = await fetch(`${SKYFIRE_API}/api/v1/tokens`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'skyfire-api-key': SKYFIRE_BUYER_API_KEY },\n body: JSON.stringify({\n type: 'pay',\n buyerTag: `sinocare-${Date.now()}`,\n tokenAmount: amountUsd,\n sellerServiceId: SKYFIRE_SELLER_SERVICE_ID,\n expiresAt,\n }),\n });\n if (!res.ok) {\n throw new Error(`skyfire mint -> ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n const { token } = (await res.json()) as { token?: string };\n if (!token) throw new Error('skyfire mint returned no token');\n return token;\n};\n\n// Run a callback with a connected XRPL client, always disconnecting after — so a\n// order opens ONE connection for the balance pre-flight AND the signing autofill\n// instead of one each.\nconst withXrplClient = async <T>(fn: (c: XrplClient) => Promise<T>): Promise<T> => {\n const client = new XrplClient(XRPL_RPC);\n await client.connect();\n try {\n return await fn(client);\n } finally {\n await client.disconnect().catch(() => undefined);\n }\n};\n\n// Read the buyer's balance of an XRPL IOU (RLUSD) via account_lines — the trust\n// line to the issuer for that currency. Returns the decimal string balance, '0'\n// if no trust line / no funds. Uses the caller's connected client.\nconst rlusdBalance = async (\n client: XrplClient,\n owner: string,\n currencyHex: string,\n issuer: string,\n): Promise<string> => {\n try {\n const res = await client.request({ command: 'account_lines', account: owner, peer: issuer });\n const line = res.result.lines.find((l) => l.currency === currencyHex && l.account === issuer);\n return line?.balance ?? '0';\n } catch {\n return '0';\n }\n};\n\n// Answer an XRPL x402 402 challenge: sign a standard Payment (Ed25519, invoice\n// bound as a Memo) via the buyer /xrpl SDK → base64 X-PAYMENT, using the caller's\n// connected client for autofill. The wallet must hold RLUSD + a little test XRP.\nconst signXrpl = async (\n client: XrplClient,\n r: XrplPaymentRequirements,\n wallet: XrplWallet,\n): Promise<string> =>\n encodeXrplXPaymentHeader(await signXrplPayment({ requirements: r, wallet, client }));\n\n// A standing AP2 IntentMandate (delegated order authority). The user signs it\n// ONCE via authorize_agent_budget; buy_sinocare_product_ucp then attaches it so\n// the agent can complete orders within the cap without confirming each one.\n// In-memory for the session (a real buyer wallet would persist + re-sign it).\ntype AgentBudget = { mandate: Ap2IntentMandate; maxAmountEur: number; expiresAt: string };\n\n// Persist the standing authorization across restarts. It's a delegation the user\n// signs ONCE (authorize_agent_budget); keeping it only in memory meant a process\n// restart silently dropped the cap, letting an over-budget order slip through.\n// The mandate is a self-contained signed JWS, so persisting + re-presenting it\n// stays cryptographically valid (we store it, we don't re-sign). Keyed to the\n// agent token so a different buyer can't inherit a stale grant; an expired grant\n// is dropped on load. Override the path with SINOCARE_DEMO_BUDGET_FILE.\nconst BUDGET_FILE =\n process.env.SINOCARE_DEMO_BUDGET_FILE ?? join(homedir(), '.agentbank-sinocare-budget.json');\nconst tokenFp = TOKEN ? createHash('sha256').update(TOKEN).digest('hex').slice(0, 16) : '';\n\nconst saveBudget = (b: AgentBudget | null): void => {\n try {\n // mode 0o600: the file holds a signed IntentMandate (a bearer authorization);\n // keep it owner-only, not world-readable, even in a demo home dir.\n if (b)\n writeFileSync(BUDGET_FILE, JSON.stringify({ tokenFp, budget: b }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n else rmSync(BUDGET_FILE, { force: true });\n } catch {\n /* best-effort: a demo persistence hiccup must never break order */\n }\n};\n\nconst loadBudget = (): AgentBudget | null => {\n try {\n const saved = JSON.parse(readFileSync(BUDGET_FILE, 'utf8')) as {\n tokenFp?: string;\n budget?: AgentBudget;\n };\n const b = saved.budget;\n // Ignore a grant signed for a different token, or one that has expired.\n if (saved.tokenFp !== tokenFp || !b?.expiresAt || Date.parse(b.expiresAt) < Date.now()) {\n rmSync(BUDGET_FILE, { force: true });\n return null;\n }\n return b;\n } catch {\n return null;\n }\n};\n\nlet agentBudget: AgentBudget | null = loadBudget();\n\n// The last checkout the card was opened for. The MCP-App host doesn't reliably\n// deliver the initial tool result to the widget (it self-heals by re-invoking\n// start_sinocare_checkout with NO args) — so we replay the last pick here, or the\n// card would hang on \"Loading…\". Mirrors the merchant card's read-tools-work-\n// with-empty-args behavior.\ntype CheckoutPick = {\n sku: string;\n name: string;\n priceEur: string;\n quantity: number;\n imageUrl?: string;\n externalShopify?: boolean; // the external link lands on Shopify checkout\n // Has THIS pick been paid? Drives picker-vs-receipt on rehydrate without\n // deleting the order record — a fresh re-open of an already-ordered product\n // stays a picker (ordered=false) while its past receipt is kept intact.\n ordered?: boolean;\n};\nlet lastCheckout: CheckoutPick | null = null;\n\n// Completed orders, by sku — so a checkout card that gets REHYDRATED (the host\n// re-invokes start_sinocare_checkout when the user leaves the conversation and\n// comes back) shows the receipt for that product instead of resetting to the\n// payment picker. Ordering hands off to the conversation (card → sendMessage →\n// the agent runs buy_sinocare_product_*), so the card's own DOM \"已发起\" note is\n// lost on reload; without this the reloaded card always re-rendered the picker\n// even though the product was already paid for. In-memory for the process (same\n// lifetime + same-process assumption as lastCheckout — one long-lived stdio\n// server per Claude session). Keyed by sku, which the card passes to book_* with\n// the exact sku it opened the checkout for, so the keys line up. PERSISTED to\n// disk (see below): without that, opening the card from another conversation — a\n// fresh stdio process with an empty map — lost every order, so a paid product's\n// card rehydrated to the payment picker as if never ordered.\ntype OrderReceipt = {\n sku: string;\n name: string;\n protocol?: string;\n total?: string; // human total: amountDisplay / priceEur / paidUsdc / paidRlusd\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\nconst completedOrders = new Map<string, OrderReceipt>();\n\n// Persist the card's checkout state (last pick + order receipts) across restarts\n// and conversations, so returning to a paid product's card shows its receipt\n// instead of resetting to the picker — and so a fresh \"buy it again\" starts\n// clean. Keyed to the agent token so a different buyer starts empty. Override the\n// path with SINOCARE_DEMO_STATE_FILE.\nconst STATE_FILE =\n process.env.SINOCARE_DEMO_STATE_FILE ?? join(homedir(), '.agentbank-sinocare-checkout.json');\nconst saveCheckoutState = (): void => {\n // No buyer token → no stable identity to key on. Persisting under an empty\n // tokenFp would pool every anonymous buyer into one shared file (and let one\n // clobber another), so keep this session's state in memory only.\n if (!tokenFp) return;\n try {\n // Read-merge-write: a sibling process (another conversation for the SAME\n // buyer) may have ordered between our startup snapshot and now. Union its\n // orders with ours — ours wins ties (we just acted) — so our stale\n // snapshot never clobbers a order another conversation recorded.\n const merged = new Map(completedOrders);\n try {\n const disk = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n orders?: Array<[string, OrderReceipt]>;\n /** Pre-2026-08-21 spelling. Read, never written — see the loader below. */\n bookings?: Array<[string, OrderReceipt]>;\n };\n if (disk.tokenFp === tokenFp) {\n for (const [k, v] of disk.orders ?? disk.bookings ?? [])\n if (!merged.has(k)) merged.set(k, v);\n }\n } catch {\n /* no readable prior file — just write ours */\n }\n // Fold the union back into memory so this long-lived process also sees a\n // sibling conversation's orders on its next rehydrate (no restart needed).\n for (const [k, v] of merged) if (!completedOrders.has(k)) completedOrders.set(k, v);\n // Atomic replace: write a temp then rename, so a concurrent reader never\n // observes a half-written file.\n const tmp = `${STATE_FILE}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify({ tokenFp, lastCheckout, orders: [...merged] }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n renameSync(tmp, STATE_FILE);\n } catch {\n /* best-effort: a demo persistence hiccup must never break the card */\n }\n};\nif (tokenFp) {\n try {\n const saved = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n lastCheckout?: CheckoutPick | null;\n orders?: Array<[string, OrderReceipt]>;\n /**\n * The key this file used before 2026-08-21, when the demo still spoke the\n * resort vocabulary it was forked from. Read so an existing state file\n * keeps its receipts — `orders ?? []` alone would read every one of them\n * as absent and silently drop the lot on the next write.\n */\n bookings?: Array<[string, OrderReceipt]>;\n };\n // Ignore state saved under a different buyer token.\n if (saved.tokenFp === tokenFp) {\n // ⚠️ `orders` ONLY. `lastCheckout` is deliberately NOT restored.\n //\n // It exists for one case: a card self-healing with no arguments, where\n // the server replays the last pick so the widget fills instead of\n // hanging. Restored from disk it does that to a card belonging to a\n // DIFFERENT product — restart the app, ask for a new hotel, and the card\n // renders the previous order's receipt, which reads as having ordered\n // something you did not.\n //\n // `orders` is safe to restore because it is keyed by sku: it is only\n // ever consulted for a product someone actually asked about.\n for (const [k, v] of saved.orders ?? saved.bookings ?? []) completedOrders.set(k, v);\n }\n } catch {\n /* no persisted state yet — start empty */\n }\n}\n\n// Record a completed order (only when it actually settled) and return the tool\n// result — so every buy_sinocare_product_* success is remembered for rehydration\n// in ONE place. Pulls the human fields off the result value the tool already\n// built (total shape differs by rail: total / paidUsdc / paidRlusd / priceEur).\nconst finishOrder = (\n sku: string,\n value: Record<string, unknown> & {\n ordered?: boolean;\n /**\n * What ACTUALLY paid — required, so a new payment path cannot forget it.\n *\n * The card used to label a receipt with the button the person clicked. When\n * a chosen method could not go through and the order settled another way,\n * that filed the charge under a method with no part in it: four real\n * payments were shown as \"paid by the Curless wallet\" while the wallet had\n * never been signed in.\n */\n payer: string;\n },\n) => {\n if (sku && value.ordered) {\n // Record the sale on the Shopify side, if the catalog is Shopify-backed.\n // Fire-and-forget: the order already settled through agentbank, so a\n // writeback failure must never affect the tool result. The backend no-ops\n // when Shopify isn't configured, so this is safe to call unconditionally.\n void backend('/shopify-order', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity: value.quantity,\n protocol: value.protocol,\n // Canonical writeback idempotency key: the settled order/PI id (also the\n // searchable Shopify tag), falling back to the checkout session id so\n // EVERY protocol dedups. A missing key means no dedup, and a hung-call\n // re-fire would then create a duplicate Shopify order.\n orderId: value.orderId ?? value.sessionId ?? value.paymentIntentId,\n // So the Shopify order lands under a customer, not anonymously.\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n }).catch(() => {});\n completedOrders.set(sku, {\n sku,\n name: String(value.product ?? ''),\n protocol: value.protocol as string | undefined,\n total: (value.total ?? value.paidUsdc ?? value.paidRlusd ?? value.priceEur) as\n | string\n | undefined,\n status: value.status as string | undefined,\n orderId: value.orderId as string | undefined,\n txHash: value.txHash as string | undefined,\n explorer: value.explorer as string | undefined,\n message: value.message as string | undefined,\n });\n // Mark this pick as paid so a later rehydrate resolves to the receipt — not\n // by the presence of a order record (which we now keep across re-opens),\n // but by whether THIS checkout was actually completed.\n if (lastCheckout?.sku === sku) lastCheckout.ordered = true;\n saveCheckoutState();\n }\n return text(value);\n};\n\n// ── what the checkout card offers ────────────────────────────────────────────\n/**\n * The two axes agentbank spans (money × protocol), laid out by GROUP.\n *\n * ⚠️ This is SERVER-side now, and that is what lets one card serve both shops:\n * the wallet connector sends its own three rows to the same card. A card that\n * hard-codes the payment table has to be forked per storefront, which is\n * exactly how there came to be two of them.\n *\n * • Curless 钱包 — first, and standing alone. Filing it under \"卡 · Stripe\"\n * would describe the plumbing rather than the choice:\n * everything below is how the AGENT pays, this is how the\n * PERSON pays. Three rows, because there are three\n * genuinely different ways a wallet reaches a merchant,\n * and which applies is decided by what the BUYER has\n * installed. Least-setup-required is last.\n * • 外链 — the other thing a PERSON does: leave the conversation\n * and pay on the merchant's own page.\n * • 卡 · Stripe — ACP / UCP. No coin/chain axis, so the protocol is the row.\n * • 稳定币 · 公链 — USDC·Base / USDC·Solana / RLUSD·XRPL. The chain is\n * independent of the PROTOCOL: bare x402 AND a UCP session\n * both settle any chain, so each row offers the protocol as\n * a sub-choice. UCP therefore appears under both 卡 and\n * 稳定币 — that is the two-axis point.\n * • 稳定币 · Agent 原生 — Skyfire and MPP·Tempo. These are STABLECOINS TOO; they\n * were once titled by protocol, which flipped the axis and\n * made them look like a different KIND of money. Skyfire\n * settles USDC on BASE — the same coin and chain as the\n * x402 row above. What differs is CUSTODY, not the money:\n * x402 = the buyer signs from their OWN wallet (EIP-3009);\n * Skyfire = the buyer PRE-FUNDS a Skyfire wallet and\n * Skyfire signs on their behalf, which is why that rail\n * reports a remaining balance and never a tx hash.\n */\nconst SINOCARE_GROUPS: CheckoutGroup[] = [\n {\n label: 'Curless 钱包',\n rows: [\n {\n title: 'Curless 买家钱包',\n sub: '登录后用自己绑的卡 · 受自己设的限额约束',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_wallet' }],\n },\n {\n title: '钱包连接器(独立 MCP)',\n sub: '你自己装的 Curless 钱包铸凭据 · 在聊天里完成',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_wallet_handoff', chat: true }],\n },\n {\n title: '浏览器里确认付款',\n sub: '什么都不用装 · 打开链接看清金额再批准',\n actions: [{ label: '生成付款链接', tool: 'pay_sinocare_hosted' }],\n },\n ],\n },\n {\n // ⚠️ ITS OWN GROUP, AND THE SUBTITLE SAYS WHY.\n //\n // Every other row on this card ends in money moving. This one does not:\n // UnionPay authenticates the cardholder and hands back a one-time token for\n // the MERCHANT to charge through their own UnionPay acceptance, which\n // Sinocare does not have. Filing it under 卡 next to ACP/UCP would put a\n // button that cannot pay beside two that can, and the difference would be\n // invisible until someone read the result.\n label: '银联 · UnionPay Agent Pay',\n rows: [\n {\n title: '银联卡(UAAG)',\n sub: '用你钱包里绑的银联卡 · 银联页面认证 · 演示止于凭证签发,不扣款',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_uaag_handoff', chat: true }],\n },\n ],\n },\n {\n label: '外链 · 商家收银台',\n rows: [\n {\n title: 'Shopify / Payment Link',\n sub: '在浏览器里打开商家的收银页 · 卡',\n actions: [{ label: '打开付款页', tool: 'create_sinocare_payment_link', ext: true }],\n },\n ],\n },\n {\n label: '卡 · Stripe',\n rows: [\n {\n title: 'ACP',\n sub: 'Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_acp' }],\n },\n {\n title: 'UCP',\n sub: 'AP2 授权 · Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_ucp', args: { pay: 'card' } }],\n },\n ],\n },\n {\n label: '稳定币 · 公链(x402 / UCP)',\n rows: [\n {\n title: 'USDC · Base',\n sub: 'EVM · EIP-3009 签',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc' } },\n ],\n },\n {\n title: 'USDC · Solana',\n sub: 'SVM · 部分签 · facilitator 代付 gas',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402', args: { chain: 'solana' } },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc-sol' } },\n ],\n },\n {\n title: 'RLUSD · XRP Ledger',\n sub: 'Ed25519 签 · 自建 facilitator',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_rlusd' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'rlusd' } },\n ],\n },\n ],\n },\n {\n label: '稳定币 · Agent 原生协议',\n rows: [\n {\n title: 'USDC · Base(Skyfire 托管)',\n sub: 'Skyfire 签 JWT · KYA 身份 + 付款授权 · 买家预充值余额',\n actions: [{ label: 'KYAPay', tool: 'buy_sinocare_product_skyfire' }],\n },\n {\n title: 'pathUSD · Tempo',\n sub: 'HTTP-402 · 链上 TIP-20 transferWithMemo',\n actions: [{ label: 'MPP', tool: 'buy_sinocare_product_mpp' }],\n },\n ],\n },\n];\n\n/**\n * The payment table for THIS product. The 外链 row names Shopify only when this\n * product is Shopify-backed (its link lands on Shopify's own checkout); the\n * static wording stays generic otherwise, so the label never lies.\n */\nconst groupsFor = (pick: CheckoutPick): CheckoutGroup[] =>\n pick.externalShopify !== true\n ? SINOCARE_GROUPS\n : SINOCARE_GROUPS.map((g) =>\n g.label.startsWith('外链')\n ? {\n ...g,\n rows: g.rows.map((r) => ({\n ...r,\n title: 'Shopify 结账',\n sub: '在 Shopify 收银台支付(Shopify Payments)',\n actions: r.actions.map((a) => ({ ...a, label: '去 Shopify 支付' })),\n })),\n }\n : g,\n );\n\n/**\n * The checkout card's payload for a pick — the picker, or the receipt when THIS\n * checkout is the one that was paid.\n */\nconst pickView = (pick: CheckoutPick, r?: OrderReceipt) =>\n checkoutView({\n product: {\n sku: pick.sku,\n name: pick.name,\n priceDisplay: pick.priceEur,\n imageUrl: pick.imageUrl,\n },\n quantity: pick.quantity,\n groups: groupsFor(pick),\n lang: 'zh',\n receipt: r && {\n protocol: r.protocol,\n total: r.total ?? pick.priceEur,\n status: r.status,\n orderId: r.orderId,\n txHash: r.txHash,\n explorer: r.explorer,\n message: r.message,\n },\n });\n\n// MCP App card (a single ui:// resource, TWO views chosen by structuredContent.\n// view). start_sinocare_checkout → the payment-method picker; list_my_orders → the\n// buyer's orders (each refundable). Both advertise it on BOTH their tool\n// definition AND their result via _meta.ui.resourceUri (mirrors the merchant card\n// — the host needs it on the tool to know it renders a widget); each returns its\n// data as structuredContent, and the card calls the book_* / request_refund /\n// create_sinocare_payment_link tools back.\n// ⚠️ BUMP THIS WHENEVER widget/ CHANGES. The host caches the card's HTML by\n// this URI, so shipping new widget code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture. Three widget changes\n// went out today without a bump, and the receipt/picker fix appeared to have\n// no effect at all because of it.\nconst CHECKOUT_URI_PREFIX = 'ui://sinocare/';\nconst CHECKOUT_URI = `${CHECKOUT_URI_PREFIX}card-v33.html`;\n// The mime type, the two host namespaces and the image allow-list all live in\n// the shared package now. Each of them fails SILENTLY when wrong — an omitted\n// `resourceDomains` blocks every product photo before it leaves the starting\n// line — and two copies meant a fix could look applied while this shop still\n// rendered a row of broken images.\nconst CHECKOUT_UI_META = uiMeta(CHECKOUT_URI);\n// No `widgetDomain`: this one is stdio and has no public origin to name.\nconst WIDGET_META = widgetMeta();\n\n// The twelve tools BOTH Sinocare storefronts advertise — same names, same\n// schemas, same wording. They were two tables until 2026-08-14, and the copies\n// had drifted into telling two models two different things about the same\n// purchase: one was told a wallet refusal must stop the sale, the other was not.\n// Only the checkout card's payment vocabulary is ours.\nconst SHARED_TOOLS = storefrontTools({\n checkoutOffers:\n 'It offers Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger) in the conversation, the buyer\\u2019s own Curless wallet, a UnionPay card the buyer bound to that wallet (UAAG \\u2014 which ends at a credential, not a payment), and an external hosted Payment Link page.',\n});\n\n// This storefront's own — the other six rails, the AP2 standing authorization\n// and the two on-chain wallet read-outs. The wallet connector advertises none\n// of them, which is the entire difference between the two shops.\nconst RAIL_TOOLS: ToolDef[] = [\n {\n name: 'create_sinocare_payment_link',\n description:\n \"Create a Payment Link for a product — a PUBLIC hosted checkout page (like a Stripe Payment Link) the user opens in a browser to pay (test-mode card). Returns the URL. Mostly invoked by the checkout card's 'Payment Link' button; the external-link payment path.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'start_sinocare_uaag_handoff',\n description:\n 'Buy a Sinocare product over UnionPay Agent Pay (UAAG). Sinocare prices it and opens a checkout session; UnionPay then authenticates the CARDHOLDER on its own page (3DS / Passkey) and issues a one-time payment token. \\u26a0\\ufe0f This is a HANDOFF, not a completed purchase \\u2014 and the distinction is subtle enough that the first person through it got it wrong. UnionPay\\u2019s page is titled \\u300c\\u786e\\u8ba4\\u652f\\u4ed8\\u300d and shows the amount, merchant and items, so the cardholder really is approving THIS purchase. What their approval produces is a one-time token + DTVC, which the spec describes as the INPUT to an authorization (\\u201cused in authorization\\u201d, \\u201csubmitted \\u2026 for payment authorization\\u201d, \\u201cF23 of authorization\\u201d) \\u2014 a message nobody has sent yet. So after they confirm: they authorised it, AND no money moved. Saying only one of those is wrong either way. UnionPay\\u2019s model has the MERCHANT charge that credential \\u2014 it is shaped like an ordinary UnionPay card (token as the card number, DTVC as the CVV2), so the merchant needs UnionPay acceptance. Sinocare\\u2019s demo checkout has none, so nothing is charged and no order is placed. Returns ordered:false always.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n cardId: {\n type: 'string',\n description:\n \"OPTIONAL, and normally omit it. The storefront reads the buyer's bound UnionPay cards from their own wallet session and uses the one they have; pass this only to pick between several. A uaagcard_… you did not get from that list is a guess, and UnionPay answers a wrong one with a 404 that does not say what was wrong.\",\n },\n },\n },\n },\n {\n name: 'get_sinocare_uaag_status',\n description:\n 'Has UnionPay issued the payment credential yet? Pass the paymentIntentId from start_sinocare_uaag_handoff. The cardholder authenticates in their own browser and this server is never told when they finish, so this is the only way to know. \\u26a0\\ufe0f `issued: true` means a one-time token + DTVC now exist \\u2014 it does NOT mean the order is paid. The MERCHANT charges that credential through their own UnionPay acceptance, which Sinocare does not have, so this demo stops there on purpose. Never report it as paid.',\n inputSchema: {\n type: 'object',\n required: ['paymentIntentId'],\n properties: {\n paymentIntentId: {\n type: 'string',\n description: 'from start_sinocare_uaag_handoff',\n },\n },\n },\n },\n {\n name: 'buy_sinocare_product_acp',\n description:\n 'Buy a Sinocare product over ACP (Agentic Commerce Protocol) — Sinocare prices the product and opens a merchant-quoted checkout session; this agent completes it with a delegated card credential, settling on the card rail (test mode). One of THREE ways to pay: ACP (card) / UCP (card) / x402 (USDC). The card rail is an implementation detail, not a separate payment choice. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_ucp',\n description:\n 'Buy a Sinocare product over UCP (Universal Commerce Protocol, ucp.dev) — Sinocare prices it and opens a UCP checkout session. UCP \"supports x402\", and x402 is chain-agnostic, so the SAME UCP session settles FOUR ways (pass `pay`): `card` (default) → the agent authorizes with an AP2 PaymentMandate bound to the cart, settled on the card rail (test mode, same as ACP); `usdc` → the gateway freezes an x402 challenge and the agent pays with a signed EIP-3009 X-PAYMENT (USDC on Base/EVM); `usdc-sol` → same, on Solana — the agent partially signs an SPL transfer the facilitator co-signs + submits (USDC on Solana, buyer needs no SOL); `rlusd` → an XRPL x402 challenge, a signed XRPL Payment (Ed25519, no gas), on the XRP Ledger. The three stablecoin ways all settle on-chain over the stablecoin rail — currency + chain just pick the rail. The standing authorization (authorize_agent_budget) is attached on the card path. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n pay: {\n type: 'string',\n enum: ['card', 'usdc', 'usdc-sol', 'rlusd'],\n description:\n 'payment method for this UCP session: card (default), usdc (x402 · USDC on Base/EVM), usdc-sol (x402 · USDC on Solana), or rlusd (x402 · RLUSD on the XRP Ledger)',\n },\n },\n },\n },\n {\n name: 'authorize_agent_budget',\n description:\n 'Delegate autonomous Sinocare order to this agent via an AP2 IntentMandate: you sign a STANDING authorization (a spend cap per order + a time window) ONCE, and the agent can then complete UCP orders within it without confirming each purchase. Bookings over the cap (or after it expires) are rejected by the gateway. This is the AP2 \"user authorizes intent, agent acts within it\" delegation.',\n inputSchema: {\n type: 'object',\n required: ['maxAmountEur'],\n properties: {\n maxAmountEur: {\n type: 'number',\n description: 'spend cap PER order, in EUR (e.g. 2000)',\n },\n hours: {\n type: 'integer',\n description: 'how long the authorization lasts, in hours (default 24)',\n },\n },\n },\n },\n {\n name: 'agent_budget_status',\n description:\n 'Show the current standing AP2 order authorization (spend cap + expiry), or that none is set.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'revoke_agent_budget',\n description:\n 'Revoke the standing AP2 purchase authorization — the agent must get a fresh one (authorize_agent_budget) to buy autonomously again.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_x402',\n description:\n 'Buy a Sinocare product and pay in USDC over x402. `chain` picks the USDC chain: `base` (default) → EVM, a signed EIP-3009 authorization; `solana` → an SVM transfer the buyer partially signs and the facilitator co-signs (feePayer) + submits (buyer needs no SOL). The merchant receives USDC at its address on that chain. Returns the order + the USDC amount paid (+ the Solana tx on the solana path).',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n chain: {\n type: 'string',\n enum: ['base', 'solana'],\n description: 'USDC chain: base (default, EVM) or solana',\n },\n },\n },\n },\n {\n name: 'x402_buyer_wallet',\n description:\n 'Show the wallet that pays for x402 (USDC) orders — its address and USDC balance on Base Sepolia (testnet) + Base (mainnet), and where to top it up. Use this to check funds before order with USDC.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_rlusd',\n description:\n \"Buy a Sinocare product and pay in RLUSD (Ripple USD) over x402 on the XRP Ledger. Sinocare opens a merchant-quoted RLUSD session; this agent signs a standard XRPL Payment (Ed25519, no gas — the buyer pays the tiny XRPL fee) and Curless's self-hosted facilitator submits it on-ledger. Same x402 protocol as the USDC tool, different chain. Returns the order + the RLUSD amount paid + the XRPL tx.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_skyfire',\n description:\n \"Buy a Sinocare product over Skyfire KYAPay (agent-native JWT payments). The buyer mints a Skyfire-SIGNED PAY token (via Skyfire, authorizing a small USDC charge to Sinocare — unlike the crypto rails the buyer can't self-sign, Skyfire signs it) and presents it to the Sinocare merchant backend, which charges it via the merchant SDK; agentbank verifies it against Skyfire's live JWKS — proving the agent's identity (Know Your Agent) AND the payment authorization — and records the USDC payment intent. PRODUCTION Skyfire (real token, real verify). Needs SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID (to mint). Returns the verification + the recorded payment intent (agentbank verifies + records the authorization; it does not auto-capture).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_mpp',\n description:\n \"Buy a Sinocare product over MPP (Machine Payments Protocol) settled on the Tempo payments chain. agentbank answers the unpaid request with an HTTP-402 Payment challenge whose SIGNED terms carry the on-chain payment (TIP-20 pathUSD token, merchant recipient, memo=challenge binding); the buyer's Tempo wallet pays it with transferWithMemo; the credential proves it by tx HASH and agentbank VERIFIES the on-chain transfer read-only, then captures the payment intent. Real Tempo testnet, on-chain stablecoin — no card, no gateway signing. Needs AGENTBANK_AGENT_TOKEN + TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'xrpl_buyer_wallet',\n description:\n 'Show the XRPL wallet that pays for RLUSD orders — its classic r-address and RLUSD trust-line balance on the XRP Ledger testnet. Use this to check funds before order with RLUSD.',\n inputSchema: { type: 'object', properties: {} },\n },\n];\n\nconst TOOLS: ToolDef[] = [...SHARED_TOOLS, ...RAIL_TOOLS];\n\n// ⚠️ A card declaration is a promise that THIS result is renderable by THAT\n// card, so it goes only on tools whose result the card can draw. Attaching it\n// to everything told the host that a product LIST renders the checkout card:\n// the host drew the card, the card found no view it knew, and it sat on\n// \"Loading…\" for ever under a tool that had answered perfectly.\nconst CARD_TOOLS = new Set(['list_sinocare_products', 'start_sinocare_checkout', 'list_my_orders']);\n\nconst text = (value: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n});\n\n// Server instructions — hosts (Claude Desktop) inject these into the model's\n// context. The point: when the user wants to buy, OPEN THE CARD, don't retype\n// the payment menu as prose. Left to its own devices the model reads the seven\n// buy_* tools and helpfully lists ACP / UCP / x402 / RLUSD as a text bullet\n// list and asks — but the whole UX is the visual card, where the user clicks a\n// method and pays in place. So make the card the default and the text list a\n// non-UI fallback only.\n//\n// The shape and the hard rules are shared with the wallet connector; the\n// payment sentence is not, and must not be — that shop has one method in three\n// shapes and this one has seven rails to explain.\nconst INSTRUCTIONS = buildInstructions({\n opening:\n 'Sinocare storefront (buyer side). The card IS the shop. When the user wants to buy something — \"buy\", \"order\", \"我要买…\", \"再来一盒试纸\" — call start_sinocare_checkout (pass the product `sku`, or a `query` name such as \"Safe-Accu\") to open the visual checkout card, where they pick a payment method and pay by clicking.',\n paymentCard:\n 'Do NOT enumerate the payment methods (ACP / UCP / x402 / RLUSD / Curless wallet / Payment Link) as text and ask which one — that is what the card is for.',\n orderedField: 'ordered',\n extra: [\n 'Call the buy_sinocare_product_* tools directly only when the card is unavailable or the user explicitly asked for a specific rail in a plain-text flow.',\n ],\n});\n\n// Read at runtime (dist/index.js → ../package.json), never written here. It said\n// '0.5.0' while the package shipped 0.62.1 — fifty-seven minors of drift in the\n// version a host displays, invisible because nothing in the repo reads it.\n// @curless/agentbank-mcp fixed the identical bug this way long ago.\nconst VERSION = (createRequire(import.meta.url)('../package.json') as { version: string }).version;\n\nconst server = new Server(\n { name: 'sinocare', version: VERSION },\n { capabilities: { tools: {}, resources: {} }, instructions: INSTRUCTIONS },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => (CARD_TOOLS.has(t.name) ? { ...t, _meta: CHECKOUT_UI_META } : t)),\n}));\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: CHECKOUT_URI, name: 'Sinocare checkout', mimeType: CARD_MIME, _meta: WIDGET_META },\n ],\n}));\nserver.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n // ANY version of our card uri gets the CURRENT card — see the note in the\n // wallet connector. Bumping the uri busts a host's cache; refusing the old\n // one turns a stale card into \"there was a problem displaying content\", with\n // nothing the person can do about it.\n const asked = req.params.uri;\n if (!servesCardUri(CHECKOUT_URI_PREFIX, asked)) throw new Error(`unknown resource: ${asked}`);\n return {\n contents: [{ uri: asked, mimeType: CARD_MIME, text: CHECKOUT_CARD_HTML, _meta: WIDGET_META }],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (req) => {\n const args = (req.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (req.params.name === 'list_sinocare_products') {\n // `products`, and a `view` the card dispatches on. This returned\n // `{currency, count, products}` — the product storefront's shape, left\n // behind by a rename that changed identifiers and not payloads. The card\n // reads `products`, got undefined, and drew nothing.\n // The aisles and the \"an unknown one means all of them\" rule are shared\n // with the wallet connector — they were written out four times between\n // the two shops, and adding an aisle only ever fixed half of them.\n const { items } = await backend<{ items: Product[] }>(\n `/catalog${categoryQuery(args.category)}`,\n );\n const view = productsView(items);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(view) }],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'get_sinocare_product') {\n const sku = String(args.sku ?? '');\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`);\n return text(product);\n }\n\n // Visual checkout: return the MCP App card (payment picker) + the product as\n // structuredContent. The card's buttons call the book_* /\n // create_sinocare_payment_link tools; the card renders their results.\n if (req.params.name === 'start_sinocare_checkout') {\n // Accept a `sku` (exact) OR a `query`/`product`/`name` (e.g. \"Safe AQ Smart\")\n // so the agent doesn't need the exact sku to open the card.\n const idOrName = String(args.sku ?? args.query ?? args.product ?? args.name ?? '').trim();\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // The card sets __rehydrate when it re-invokes to fill itself (reload /\n // self-heal), never on a fresh agent-initiated checkout. Only on rehydrate\n // do we show a completed order's receipt instead of the picker — so an\n // explicit \"buy X again\" from the agent still opens the picker.\n const rehydrate =\n args.__rehydrate === true || args.__rehydrate === 1 || args.__rehydrate === '1';\n\n // No product given = the card self-healing (empty-arg re-invoke) — replay the\n // last pick so the widget fills in instead of hanging on \"Loading…\". If that\n // last checkout has since been ordered, show its receipt on rehydrate.\n if (!idOrName) {\n if (rehydrate && lastCheckout?.ordered) {\n const receipt = completedOrders.get(lastCheckout.sku);\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n }\n // Nothing to replay: answer \"pick a product\" rather than volunteering\n // whichever one came last. The card shows its own empty state.\n if (!lastCheckout) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'Pick a product first (list_sinocare_products), then open its checkout.',\n },\n ],\n isError: true,\n };\n }\n return {\n content: [{ type: 'text' as const, text: `Checkout for ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n // Resolve: try the exact sku first, then the shared resolver over the\n // catalog. It never guesses between several matches — \"Safe-Accu\" and\n // \"Safe-Accu2\" differ by one character, and this card ends in a charge.\n let product: Product | null = null;\n let candidates: Product[] = [];\n try {\n product = await backend<Product>(`/catalog/${encodeURIComponent(idOrName)}`);\n } catch {\n const { items } = await backend<{ items: Product[] }>('/catalog');\n const match = resolveProduct(items, { sku: idOrName });\n if (match.kind === 'found') product = match.product;\n else if (match.kind === 'ambiguous') candidates = match.candidates;\n }\n if (!product) {\n return {\n content: [\n {\n type: 'text' as const,\n // Says 商品 / 目录, not 度假村. This storefront was forked from a\n // resort demo and inherited its vocabulary wholesale, in a shop\n // that sells blood-glucose meters — a miss the buyer reads.\n text: candidates.length\n ? `“${idOrName}” 对上了 ${candidates.length} 件商品 —— 说清是哪件:${candidates\n .map((c) => `${c.name}(${c.sku})`)\n .join('、')}`\n : `目录里没有 “${idOrName}” —— 用 list_sinocare_products 看可选项,或传它的 sku。`,\n },\n ],\n isError: true,\n };\n }\n\n const priceEur = priceDisplayOf(product);\n // Rehydrating an already-BOOKED product's card → show its receipt, not the\n // picker (fixes: pay, leave the conversation, come back, and the card had\n // reset to the payment selection). The card self-heals by re-invoking with\n // its ORIGINAL args (the sku) + __rehydrate. EXCEPTION: a deliberate \"buy\n // it again\" is a fresh (non-rehydrate) open that leaves THIS sku's pick\n // unordered; its immediate self-heal must resolve to the picker, so suppress\n // the receipt only while this sku is the one being freshly re-opened. Past\n // receipts are kept intact (never deleted), so #6's cross-conversation\n // records — and OTHER ordered cards in the same conversation — still\n // rehydrate to their receipts.\n // Is THIS checkout paid? Not \"has this product ever been bought\".\n //\n // The receipt used to be looked up by sku, which treats a product as a\n // purchase. It is not: opening a checkout for something you ordered last\n // week is a NEW order. With 42 of 44 products recorded, that lookup made\n // almost every card render as an already-paid receipt the moment it\n // self-healed — no payment involved — and hid the payment picker behind\n // a order that had happened days ago.\n //\n // So the question is answered by the checkout in hand: the pick we just\n // had open, for this same product, that was actually paid. A fresh open\n // replaces it with an unpaid one (below), which is what makes \"buy it\n // again\" resolve to the picker.\n const rehydratedReceipt =\n rehydrate && lastCheckout?.sku === product.sku && lastCheckout.ordered\n ? completedOrders.get(product.sku)\n : undefined;\n lastCheckout = {\n sku: product.sku,\n name: product.name,\n priceEur,\n quantity,\n imageUrl: product.imageUrl,\n externalShopify: product.source === 'shopify',\n // Preserve ordered only when rehydrating a paid pick; a fresh open is a\n // new, unpaid order (ordered stays falsy → the card shows the picker).\n ordered: rehydratedReceipt ? true : undefined,\n };\n saveCheckoutState(); // persist the new lastCheckout across processes\n const receipt = rehydratedReceipt;\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${product.name} (${priceEur}).` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `Checkout for ${product.name} (${priceEur}). Pick a payment method in the card — Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger), or a Payment Link (hosted page).`,\n },\n ],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'create_sinocare_payment_link') {\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const link = await backend<{ url: string; amountDisplay: string; name: string }>(\n '/checkout-link',\n {\n method: 'POST',\n // Paying from the wallet means the WALLET's owner is the buyer, so\n // the merchant records that email. Otherwise the order is filed under\n // SINOCARE_BUYER_EMAIL and never appears in the wallet's own 订单 —\n // \"我的订单\" is joined on the email the order was placed with.\n body: JSON.stringify({\n sku,\n quantity,\n ...(walletBuyer() ?? (BUYER ? { buyer: BUYER } : {})),\n }),\n },\n );\n return text({\n url: link.url,\n amountDisplay: link.amountDisplay,\n name: link.name,\n message: `Payment page for ${link.name} — open ${link.url} to pay (${link.amountDisplay}).`,\n });\n }\n\n if (req.params.name === 'curless_wallet_logout') {\n const who = wallet.current();\n await wallet.logout();\n // Drop the pending browser sign-in too, if one is mid-flight — otherwise\n // \"signed out\" would be followed by that login completing and silently\n // signing them back in.\n pending = null;\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n signedOut: true,\n was: who?.email ?? null,\n message: who ? `已退出 ${who.email}。` : '本来就没有登录。',\n }),\n },\n ],\n };\n }\n\n if (req.params.name === 'curless_wallet_login_status') {\n const who = wallet.current();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n who\n ? { signedIn: true, email: who.email, mode: who.mode, wallet: 'storefront' }\n : {\n signedIn: false,\n // Three answers, not two. \"waiting\" is a sign-in in flight,\n // \"expired\" is one that ran out, and neither is \"nobody\n // started one\" — which used to be reported as expired and\n // read back to the person as \"your code timed out\" when\n // they had never been given a code.\n waiting: Boolean(pending),\n expired: !pending && loginEverStarted,\n neverStarted: !pending && !loginEverStarted,\n // WHICH wallet. This storefront holds its own buyer session\n // for the in-card method; a separately-installed Curless\n // wallet connector holds a different one, and this tool can\n // say nothing about that. Reported as contradicting each\n // other otherwise — reasonably, since both were called \"the\n // wallet\".\n wallet: 'storefront',\n note: 'this is the session THIS storefront holds (the in-card wallet method). A separately-installed Curless wallet connector has its own session — ask that connector, not this tool.',\n },\n ),\n },\n ],\n };\n }\n\n // ACP, twice over: the agent mints the credential from ITS OWN Stripe key\n // (buy_sinocare_product_acp), or the buyer's Curless wallet mints it from the\n // card that buyer bound (buy_sinocare_product_wallet). Everything after the\n // credential — the session, the complete, the writeback — is identical, so\n // it is one handler: two code paths would drift, and the difference that\n // matters is only WHERE the token comes from and WHOSE limits applied.\n if (\n req.params.name === 'buy_sinocare_product_acp' ||\n req.params.name === 'buy_sinocare_product_wallet'\n ) {\n const viaWallet = req.params.name === 'buy_sinocare_product_wallet';\n // Check the signature BEFORE asking Sinocare to price anything. Opening a\n // checkout session we already know cannot be paid leaves the merchant an\n // order that will never complete, and shows the person a backend error\n // when the actual problem is that nobody signed in.\n if (viaWallet && !wallet.current()) {\n // Start the browser sign-in HERE, before Sinocare is asked to price\n // anything: a checkout session opened for someone who cannot pay is an\n // order the merchant will never see completed.\n //\n // JSON, not prose — the card renders `message` and the model reads\n // `next`. Prose fails the card's JSON.parse and gets shown to the person\n // verbatim, which is how an instruction meant for the model once ended\n // up on screen in English.\n const login = await pendingLogin();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '在浏览器里登录你的 Curless 钱包,登录完这张卡会自己接上。登录后就能用你自己绑的卡付款,并受你自己设的限额约束。',\n next: 'show the person the login link; the card polls on its own. Do NOT ask them for an email here — the sign-in happens in their browser.',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // 1. Sinocare prices the product + opens a merchant-quoted ACP session.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. Ask the buyer's wallet for a credential scoped to THIS order. The\n // session's real total has to come off the session itself — the backend\n // only hands back a display string (\"€1,920\"), and an SPT's cap is an\n // integer in minor units. No wallet configured → keep the card token.\n let token = PAYMENT_TOKEN;\n if (viaWallet) {\n // The buyer's wallet decides. It reads the same real total off the ACP\n // session, checks the limits THAT PERSON set, and mints against the card\n // THEY bound — so a refusal here is the buyer's own cap, not a payment\n // failure, and it is reported that way rather than retried around.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n let credential: PaymentCredential;\n try {\n credential = await wallet.payCredential({\n amount,\n currency,\n merchantRef: session.merchantId,\n });\n } catch (err) {\n // The checkout session stays open and unpaid, which is correct — the\n // person may raise their limit and pay it. Nothing was charged.\n return walletRefusal(err as Error);\n }\n token = credential.token;\n process.stderr.write(\n `sinocare-demo: wallet minted ${credential.token} for ${amount} ${currency}\\n`,\n );\n } else if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) {\n // Say so once, out loud: a silent fallback here looks identical to a\n // successful SPT payment from the outside (the seller mints its own pm_\n // either way), which is exactly how you end up believing you tested\n // something you didn't.\n process.stderr.write(\n 'sinocare-demo: paying ACP with the plain card token — set STRIPE_AGENT_SECRET_KEY and AGENTBANK_SELLER_PROFILE to mint a real SPT per order\\n',\n );\n } else {\n // Which fetch failed matters, and node's \"fetch failed\" hides the real\n // reason in .cause — without both you get a message that says nothing.\n let step = 'read session';\n try {\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n step = 'mint SPT';\n const minted = await mintSharedPaymentToken(amount, currency);\n if (minted) {\n token = minted;\n process.stderr.write(`sinocare-demo: minted ${minted} for ${amount} ${currency}\\n`);\n }\n } catch (err) {\n const e = err as Error & { cause?: { code?: string; message?: string } };\n const why = e.cause?.code ?? e.cause?.message ?? '';\n const what = `SPT FAILED at [${step}]: ${e.message}${why ? ` (cause: ${why})` : ''}`;\n // Strict by default. Configuring a wallet says you want a credential\n // bound to THIS seller, amount and expiry; quietly paying with an\n // unscoped card token instead is a downgrade, not graceful\n // degradation — and the order still succeeds, so nobody notices.\n if (!WALLET_FALLBACK_OK) {\n throw new Error(\n `${what} — refusing to fall back to an unscoped card token. Set SINOCARE_WALLET_FALLBACK=1 to allow that.`,\n );\n }\n process.stderr.write(`sinocare-demo: ${what} — falling back to ${PAYMENT_TOKEN}\\n`);\n }\n }\n // 3. This buyer agent completes the charge over ACP with that credential.\n const order = (await completeCheckout(acp(session.merchantId), session.sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n return finishOrder(sku, {\n ordered: order.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'acp',\n payer: viaWallet ? 'curless-wallet' : 'agent-key',\n status: order.status,\n // An ACP complete can omit order.id; fall back to the (always-present,\n // stable) checkout session id so the writeback always has a dedup key.\n orderId: order.order?.id ?? session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged (${order.status}).`,\n });\n }\n\n // ── mode 2 · step 1: open a checkout for a wallet this server cannot reach ──\n // ── UnionPay Agent Pay (UAAG) ─────────────────────────────\n //\n // ⚠️ THIS FLOW DOES NOT END IN A PAYMENT, AND SAYS SO.\n //\n // Every other rail here settles through the Curless gateway: we charge, we\n // capture, the ledger records it. UnionPay works the other way — UAAG\n // authenticates the cardholder and hands the AGENT a one-time token and a\n // DTVC. The MERCHANT charges it, and the credential is shaped like an\n // ordinary UnionPay card on purpose: token in the card-number field,\n // DTVC in the CVV2 field (dynamicDataType has one enum value,\n // DYNAMIC_CARD_SECURITY_CODE). So what the merchant needs is UnionPay\n // acceptance, not a special token capability. This demo's checkout has\n // no UnionPay acceptance, so the flow stops at the credential.\n\n //\n // Sinocare has no UnionPay acquiring, and neither do we. So the honest demo\n // runs the whole agentic half — identity, intent, cardholder\n // authentication, credential issuance — and stops where a real merchant\n // would take over. `ordered` is false and `settlement` says why, because a\n // result that mentioned neither would be read as a receipt.\n if (req.params.name === 'start_sinocare_uaag_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n // ⚠️ THE CARD ID IS NOT AN ARGUMENT A MODEL CAN INVENT.\n //\n // §4.3 and §4.4 both name the card, and UnionPay files a binding under\n // (agent, consumer identity) — get either half wrong and it is a 404 that\n // does not say which half. The only party that knows which cards this\n // buyer bound is the buyer's own wallet, so it is read from the session\n // here rather than accepted from the caller. Asking the model for a\n // `uaagcard_…` is asking it to guess a capability.\n if (!wallet.current()) {\n const login = await pendingLogin();\n return text({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '要用银联卡付款,得先登录你自己的 Curless 钱包 —— 卡绑在那里,只有它知道你绑了哪几张。',\n next: 'show the person this link and stop. Do not pay another way.',\n });\n }\n const { cards } = await wallet.unionPayCards();\n if (cards.length === 0) {\n return text({\n ordered: false,\n blocked: 'no_unionpay_card',\n message:\n '你的 Curless 钱包里还没有绑定的银联卡。绑卡在钱包连接器里做(wallet_bind_unionpay_card),不在这个店里 —— 银联要在他们自己的页面上收卡。',\n next: 'tell them to bind a UnionPay card in their wallet connector first. Do NOT retry this tool, and do NOT offer to take the card number here.',\n });\n }\n const named = typeof args.cardId === 'string' ? args.cardId : '';\n const card = named ? cards.find((c) => c.id === named) : cards[0];\n if (!card) {\n return text({\n ordered: false,\n blocked: 'unknown_card',\n message: `你的钱包里没有这张卡:${named}`,\n cards: cards.map((c) => ({ id: c.id, last4: c.panLastFour })),\n });\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n sku: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n\n // An ACP checkout session IS a payment intent — same id, by design — so\n // the UAAG calls hang off the session Sinocare just opened, without\n // inventing a second identifier for one order. The amount is read off it\n // and never named here: UnionPay shows the cardholder a number and asks\n // them to authorise THAT, so a total named twice can display one figure\n // and settle another.\n const me = await wallet.me();\n const [firstName, ...rest] = (me.name ?? 'Curless Buyer').trim().split(/\\s+/);\n const uaagOpts = { baseUrl: API_BASE, token: TOKEN };\n const unit = (session.amount / quantity / 100).toFixed(2);\n try {\n // ⚠️ Register the intent BEFORE asking to pay. Checkout refuses an\n // intent UnionPay never registered — this used to be skipped here, with\n // a comment saying it was needed, which is not the same as doing it.\n await uaagCreateIntent(uaagOpts, {\n paymentIntentId: session.sessionId,\n cardId: card.id,\n merchantName: 'Sinocare',\n merchantUrl: 'https://www.sinocare.com',\n items: [\n {\n itemName: session.name,\n itemDescription: session.name,\n itemUrl: `https://www.sinocare.com/products/${session.sku}`,\n itemUnitPrice: { amount: unit, currencyCode: session.currency },\n itemQuantity: String(quantity),\n },\n ],\n delivery: {\n firstName: firstName || 'Curless',\n lastName: rest.join(' ') || 'Buyer',\n emailAddress: me.email,\n // ⚠️ Required whenever anything ships, which is every item unless\n // the whole order is DIGITAL — the field table calls it conditional\n // and the condition is almost always true. Demo address: this shop\n // never collected one, and inventing a plausible-looking real\n // address would be worse than an obvious placeholder.\n deliveryAddress: {\n name: me.name ?? 'Curless Buyer',\n line1: '1 Demo Street',\n city: 'HongKong',\n state: 'HK',\n countryCode: 'HK',\n zip: '999077',\n },\n },\n });\n } catch (err) {\n const e = err as UaagError;\n return text({\n ordered: false,\n blocked: 'uaag_intent_refused',\n message: `银联没有接受这笔意图:${e.message}`,\n declined: e.declined ?? false,\n sessionId: session.sessionId,\n next: 'repeat what UnionPay said and stop. Do NOT retry, and do NOT pay another way without asking.',\n });\n }\n\n let checkout: Awaited<ReturnType<typeof uaagCheckout>>;\n try {\n checkout = await uaagCheckout(uaagOpts, {\n paymentIntentId: session.sessionId,\n cardId: card.id,\n });\n } catch (err) {\n const e = err as UaagError;\n return text({\n ordered: false,\n blocked: 'uaag_checkout_refused',\n message: `银联收银台没能开:${e.message}`,\n declined: e.declined ?? false,\n sessionId: session.sessionId,\n next: 'repeat what UnionPay said and stop.',\n });\n }\n\n return text({\n // Never true on this path. UnionPay issues a credential; the merchant\n // charges it, and Sinocare cannot.\n ordered: false,\n awaitingPayment: true,\n // ⚠️ Tell them what the page says BEFORE they see it. It is titled\n // 确认支付 and shows the amount — so \"authenticate\" undersells it and\n // the person is left thinking they paid. They authorise; nobody charges.\n message:\n '银联收银台已开好。页面上写的是「确认支付」并显示金额 —— 你确认的是这笔购买本身,确认后银联把一次性支付凭证回调给我们。⚠️ 卡不会在那一刻被扣款:扣款要商户拿这张凭证走自己的银联收单,三诺没有,所以演示到凭证为止。',\n checkoutUrl: checkout.upi.checkoutUrl ?? null,\n srcCorrelationId: checkout.srcCorrelationId,\n paymentIntentId: session.sessionId,\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n card: { id: card.id, last4: card.panLastFour },\n product: session.name,\n total: session.amountDisplay,\n // ⚠️ The honest ending, as data rather than prose — so the card and the\n // model both get it instead of one of them inferring a sale.\n settlement: {\n settled: false,\n by: 'merchant',\n reason:\n 'UnionPay 把一次性支付凭证交给 Agent,由商户的收单机构扣款。三诺没有银联收单,所以这笔不会被扣款,也不会生成订单。',\n },\n next: 'show the person the checkoutUrl. When they say they are done, call get_sinocare_uaag_status with this paymentIntentId — this server is never told when they finish. Do NOT claim the order was placed, and do NOT fall back to another rail without asking.',\n });\n }\n\n // ⚠️ THE OTHER HALF. Without this, start_sinocare_uaag_handoff is a dead\n // end: it hands over a URL and the credential arrives later, on a callback\n // to the gateway that this storefront never sees.\n if (req.params.name === 'get_sinocare_uaag_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const paymentIntentId = String(args.paymentIntentId ?? '');\n if (!paymentIntentId) {\n return text({ error: 'paymentIntentId is required (from start_sinocare_uaag_handoff)' });\n }\n const state = await uaagCheckoutState({ baseUrl: API_BASE, token: TOKEN }, paymentIntentId);\n return text({\n // ⚠️ `issued` is not `paid`, and the two are one word apart in every\n // language this will be read in. A credential exists; nobody charged it.\n issued: state.issued,\n ordered: false,\n paid: false,\n paymentIntentId,\n credential: state.credential ?? null,\n issuedAt: state.issuedAt ?? null,\n paymentIntentStatus: state.paymentIntentStatus,\n // ⚠️ THE WORDING MATTERS, AND THE FIRST PERSON THROUGH THIS GOT IT\n // WRONG — reasonably. UnionPay's page says 确认支付 and shows the amount,\n // the merchant and the items, so the cardholder DID confirm a payment.\n // Answering that with a bare `paid: false` reads as \"it failed\".\n //\n // What is true is narrower and stranger: they authorised it, and the\n // ISO 8583 authorization that would actually move money has not been\n // sent. The spec says so in the fields themselves — paymentToken \"can\n // be used in authorization\", the cryptogram is \"submitted along with\n // the payment token for payment authorization\", panSequenceNumber goes\n // \"in F23 of authorization\". Those are inputs to a message nobody has\n // sent yet, and the party who sends it is the merchant's acquirer.\n message: state.issued\n ? '持卡人已在银联页面确认支付,银联已签发一次性支付凭证(令牌 + DTVC)。⚠️ 但钱还没动:凭证是一条尚未发出的授权报文的入参,要由商户的银联收单机构去发。三诺没有银联收单,所以演示到此为止。'\n : '还没有。持卡人还没在银联页面上点「确认支付」,或者刚点完、回调还没到。',\n next: state.issued\n ? 'Say BOTH halves, in this order: the cardholder confirmed the payment and UnionPay issued the credential — AND nothing has been charged yet, because the credential is the input to an authorization the MERCHANT\\u2019s acquirer still has to send, and Sinocare has no UnionPay acceptance. Do not say it failed, and do not say it is paid. Both are wrong.'\n : 'tell them it is not done yet and let them finish on UnionPay\\u2019s page. Do not retry in a tight loop.',\n });\n }\n\n if (req.params.name === 'start_sinocare_wallet_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // The authoritative total, off the session — the backend's amountDisplay\n // is a string for a human (\"€1,920\") and a credential is capped by an\n // integer in minor units.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n return text({\n // This OPENED a checkout; it did not pay for one. Said explicitly\n // because a result that mentions neither used to render as a receipt.\n ordered: false,\n awaitingPayment: true,\n message: '结账已开好。接下来在你自己的 Curless 钱包连接器里铸一张凭据,再回来完成付款。',\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n amount,\n currency,\n product: session.name,\n total: session.amountDisplay,\n // Spells out the sign-in step. Without it the model calls\n // wallet_pay_credential, gets \"nobody is signed in\", and has to invent\n // what to do next — which is how a order the person asked to pay\n // from their own wallet ends up settled some other way.\n next: `on the Curless wallet connector: if nobody is signed in, call wallet_login FIRST, show the person the link it returns, and wait until they say they have finished in their browser. Then wallet_pay_credential({ amount: ${amount}, currency: \"${currency}\", merchantRef: \"${session.merchantId}\" }), then pay_sinocare_with_token({ sessionId: \"${session.sessionId}\", merchantId: \"${session.merchantId}\", token }). If the wallet still refuses, STOP and tell the person what it said — do not pay this another way.`,\n });\n }\n\n // ── mode 2 · step 2: the merchant completes, with its own key ──\n if (req.params.name === 'pay_sinocare_with_token') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const token = String(args.token ?? '');\n const merchantId = String(args.merchantId ?? '');\n if (!sessionId || !token || !merchantId) {\n return text({ error: 'pay_sinocare_with_token needs sessionId, merchantId and token' });\n }\n // What this checkout was for comes off the checkout, not out of this\n // process's memory — the confirmation can arrive in a different one.\n const bought = purchaseOf(await readCheckoutSession(acp(merchantId), sessionId));\n const order = (await completeCheckout(acp(merchantId), sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n const ordered = order.status === 'completed';\n // Same exit as the other ten order paths. Returning a bare result here\n // is what let someone pay the same holiday three times: the card had no\n // idea it had been bought, so it rehydrated to the picker.\n return finishOrder(bought?.sku ?? '', {\n ordered,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (separate connector)',\n status: order.status,\n orderId: order.order?.id ?? sessionId,\n message: `Checkout ${sessionId} completed with the credential the wallet minted (${order.status}).`,\n });\n }\n\n // ── mode 3: hand the person a link and let them approve in a browser ──\n if (req.params.name === 'pay_sinocare_hosted') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n return text({\n ordered: false,\n awaitingPayment: true,\n message: '在浏览器里打开这个链接,看清金额再批准。这里还没有扣任何款。',\n payUrl: `${WALLET_BASE}/buyer/pay?session=${encodeURIComponent(session.sessionId)}`,\n sessionId: session.sessionId,\n product: session.name,\n total: session.amountDisplay,\n // Say plainly that nothing has been paid yet. A tool that returns a\n // link and a product name reads like a receipt if it does not.\n paid: false,\n merchantId: session.merchantId,\n next: 'show the person this link. Nothing has been charged yet — they approve it in their browser. Then call get_sinocare_order_status with this sessionId.',\n });\n }\n\n if (req.params.name === 'get_sinocare_order_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const merchantId = String(args.merchantId ?? '');\n const session = await readCheckoutSession(acp(merchantId), sessionId);\n const paid = session.status === 'completed';\n const bought = purchaseOf(session);\n // The approval happened in a browser, so THIS is the only moment the demo\n // learns of it. Record the order here or it is never recorded at all.\n return finishOrder(paid ? (bought?.sku ?? '') : '', {\n ordered: paid,\n paid,\n sessionId,\n status: session.status,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (hosted approval)',\n orderId: sessionId,\n message: paid\n ? 'Paid — the buyer approved it in their browser.'\n : 'Not paid yet. They have not finished approving it.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_ucp') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const pay =\n args.pay === 'usdc'\n ? 'usdc'\n : args.pay === 'usdc-sol'\n ? 'usdc-sol'\n : args.pay === 'rlusd'\n ? 'rlusd'\n : 'card';\n\n // USDC path: the merchant quotes the UCP session in USDC (a small test\n // charge); the gateway freezes an x402 challenge on it, and this buyer pays\n // with an X-PAYMENT (EIP-3009) at /complete — settled over the stablecoin\n // rail, same money-movement as buy_sinocare_product_x402 but via a UCP\n // session (one protocol, two payment methods).\n if (pay === 'usdc') {\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: X402PaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'usdc', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC UCP session missing its x402 requirements');\n\n // Pre-flight balance check (skipped in throwaway-key / STUB mode).\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the frozen challenge, then complete the UCP session with an\n // X-PAYMENT header — the gateway settles it over the stablecoin rail.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization: 'x402 EIP-3009 (signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC (x402) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // USDC-on-Solana path: the merchant quotes the UCP session in USDC on Solana;\n // the gateway freezes an SVM x402 challenge on it, and this buyer PARTIALLY\n // signs an SPL transfer (facilitator co-signs feePayer + submits) at /complete —\n // same UCP wire as the EVM USDC path, only the chain flips. Proves \"UCP supports\n // x402\" is chain-agnostic.\n if (pay === 'usdc-sol') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key holding USDC) to pay USDC-on-Solana over UCP',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: SolanaX402Requirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity,\n pay: 'usdc-sol',\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC-Solana UCP session missing its x402 requirements');\n\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Partially sign the frozen SVM challenge, then complete the UCP session with\n // the X-PAYMENT — the gateway settles it over the stablecoin rail (x402.org).\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc-sol settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc-sol',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // RLUSD path: the merchant quotes the UCP session in RLUSD; the gateway\n // freezes an XRPL x402 challenge on it, and this buyer signs a standard XRPL\n // Payment (Ed25519, no gas — buyer pays the tiny XRPL fee) which the self-\n // hosted facilitator submits on-ledger. Same money-movement as\n // buy_sinocare_product_rlusd, but over a UCP session — the SAME UCP wire the\n // card/USDC paths use, only the currency flips the chain to the XRP Ledger.\n if (pay === 'rlusd') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: XrplPaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'rlusd', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('RLUSD UCP session missing its x402 requirements');\n\n // One XRPL connection for the balance pre-flight AND the signing autofill\n // (same as buy_sinocare_product_rlusd): sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Complete the UCP session with the signed XRPL Payment as an X-PAYMENT —\n // the gateway settles it over the stablecoin rail (XRPL facilitator).\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': preflight.xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'rlusd',\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 XRPL Payment (Ed25519, signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via UCP + RLUSD (x402 on the XRP Ledger) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // CARD path (default).\n // 1. Sinocare prices the product + opens a merchant-quoted UCP session,\n // returning a merchant-signed AP2 CartMandate for it.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n cartMandate: { cartHash: string };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. This buyer agent authorizes payment with an AP2 PaymentMandate — a\n // real ES256 JWS bound to the cart's hash (UCP AP2 Mandates extension).\n // Programmatic completion, no human trusted-UI handoff; the gateway\n // cryptographically verifies the mandate, then settles on the card rail.\n const paymentMandate = await signPaymentMandate({\n cartHash: session.cartMandate.cartHash,\n method: { handler: 'card', type: 'card', credential: PAYMENT_TOKEN },\n amount: session.amount,\n currency: session.currency,\n });\n // Attach the standing authorization if one is active — the gateway then\n // checks this order is within the user's delegated cap. Drop it if expired.\n const mandate: { payment_mandate: typeof paymentMandate; intent_mandate?: Ap2IntentMandate } =\n { payment_mandate: paymentMandate };\n let underAuthorization = false;\n if (agentBudget) {\n if (Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null; // expired — buy normally (no standing auth)\n saveBudget(null);\n } else {\n mandate.intent_mandate = agentBudget.mandate;\n underAuthorization = true;\n }\n }\n const url = `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ payment: { mandate } }),\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n // A standing-authorization rejection (over cap / expired) → a clean,\n // explanatory result instead of a raw error, so the agent can react.\n if (\n underAuthorization &&\n /intent mandate rejected|exceeds_intent_max_amount|intent_mandate_expired/.test(errText)\n ) {\n return text({\n ordered: false,\n blockedBy: 'standing-authorization',\n product: session.name,\n total: session.amountDisplay,\n authorizedCap: `€${agentBudget?.maxAmountEur.toLocaleString('en-IE')}`,\n message: `Blocked: ${session.name} (${session.amountDisplay}) is over your standing authorization (cap €${agentBudget?.maxAmountEur}, or it expired). Raise it with authorize_agent_budget, or book a cheaper product.`,\n });\n }\n throw new Error(`ucp complete -> ${res.status}: ${errText}`);\n }\n const out = (await res.json()) as { status?: string; id?: string };\n return finishOrder(sku, {\n ordered: out.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n // The payment was ALWAYS authorized by a signed AP2 PaymentMandate — this\n // says so explicitly so it can't be misread as \"unauthorized\".\n paymentAuthorization: 'AP2 PaymentMandate (signed + verified)',\n // The OPTIONAL standing budget (authorize_agent_budget): applied here, or\n // not set for this order. \"not set\" ≠ unauthorized — see above.\n standingBudget: underAuthorization\n ? `applied (within your €${agentBudget?.maxAmountEur} cap, no per-order confirm)`\n : 'not set',\n status: out.status,\n orderId: out.id,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged via UCP + AP2 PaymentMandate (${out.status})${underAuthorization ? ` — under your standing €${agentBudget?.maxAmountEur} authorization, no per-order confirm` : ''}.`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_x402') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n\n // Solana path (chain=solana): USDC over Solana (SVM). The merchant quotes a\n // Solana USDC session; this buyer builds + PARTIALLY signs an SPL transfer,\n // the x402.org facilitator co-signs as feePayer + sponsors the fee + submits.\n // Same merchant-quoted session shape as the EVM/USDC path, only the chain flips.\n if (args.chain === 'solana') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key — solana-keygen JSON array or base58 — holding devnet USDC) to pay USDC-on-Solana orders',\n },\n ],\n isError: true,\n };\n }\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: SolanaX402Requirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'USDC', chain: 'solana' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant Solana USDC session missing payment requirements');\n\n // Balance pre-flight (skip on RPC error) against the merchant's quote.\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Sign the frozen quote (facilitator sponsors the fee), then pay { sessionId }.\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`solana x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n const cluster = reqs.network === 'solana-devnet' ? '?cluster=devnet' : '';\n // finishOrder (not text) so a Solana order is recorded like every other\n // rail — the card rehydrates to a receipt on reload instead of the picker.\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits + sponsors gas)',\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash\n ? `https://explorer.solana.com/tx/${paid.txHash}${cluster}`\n : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 · USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted x402 session — IT sets the USDC\n // price (the gateway has no Sinocare catalog). We just pay it; we never\n // compute or pass the amount. Same shape as the ACP `/checkout-acp` flow.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: X402PaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant x402 session missing payment requirements');\n\n // Pre-flight: a real payer key + a real facilitator + an empty wallet = a\n // cryptic on-chain decline. Check the balance first (skipped in throwaway-\n // key / STUB mode) against the MERCHANT's quoted amount.\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com (20 USDC / 2h) and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the merchant's frozen quote, then pay the session — the amount is\n // set by the merchant; we just reference { sessionId }.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 (merchant-quoted) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'x402_buyer_wallet') {\n const buyer = await buyerSigner();\n if (!buyer) {\n return text({\n configured: false,\n message:\n 'No buyer signer configured — x402 signs with a throwaway, unfunded key (only settles under a STUB facilitator). Set X402_SIGNER=cdp (+ CDP_API_KEY_ID/_SECRET/_WALLET_SECRET) for a CDP Server Wallet, or X402_PAYER_PRIVATE_KEY for a local key, to pay real testnet/mainnet USDC.',\n });\n }\n const [sepolia, mainnet] = await Promise.all([\n usdcBalance({ network: 'base-sepolia', owner: buyer.address }),\n usdcBalance({ network: 'base', owner: buyer.address }),\n ]);\n return text({\n address: buyer.address,\n balances: { 'base-sepolia': fmtUsdc(sepolia), base: fmtUsdc(mainnet) },\n faucet: 'https://faucet.circle.com (Base Sepolia USDC — 20 / 2h per address)',\n note: 'Fund this address with USDC to pay for x402 orders. Testnet: use the faucet. Mainnet: send real USDC on Base.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_rlusd') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted RLUSD session — IT sets the price\n // (the gateway holds no Sinocare catalog). We just pay it. Same shape as the\n // USDC x402 flow, only `currency: 'RLUSD'` flips the chain to the XRP Ledger.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: XrplPaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'RLUSD' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant RLUSD session missing payment requirements');\n\n // One XRPL connection for both the balance pre-flight AND the signing\n // autofill. Pre-flight catches an unfunded / trust-line-less wallet before\n // we bother signing; on enough balance we sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Pay the session (amount is merchant-set; we just reference { sessionId }).\n const xPayment = preflight.xPayment;\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash ? `https://testnet.xrpl.org/transactions/${paid.txHash}` : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via x402 on the XRP Ledger to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_skyfire') {\n if (!SKYFIRE_BUYER_API_KEY || !SKYFIRE_SELLER_SERVICE_ID) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID to mint a Skyfire pay token (the merchant backend charges it via the merchant SDK)',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // The BUYER mints a Skyfire-signed PAY token (Skyfire's key signs it — the\n // buyer can't self-sign), then presents it to the MERCHANT backend, which\n // charges it via the merchant SDK (checkout.chargeSkyfire → the gateway\n // verifies it against Skyfire's live JWKS and records/settles). Three-layer:\n // buyer mints, merchant charges — the demo never calls the gateway directly.\n const token = await mintSkyfirePayToken(SKYFIRE_TEST_AMOUNT);\n const out = await backend<{\n agent?: { verified?: boolean; subject?: string };\n paymentIntentId?: string;\n status?: string;\n currency?: string;\n amount?: number;\n // True when a seller-charge redeemed the token (real USDC moved); false =\n // verified + recorded ('initiated', no money).\n settled?: boolean;\n }>('/checkout-skyfire', { method: 'POST', body: JSON.stringify({ sku, token }) });\n const amountStr =\n out.amount != null && out.currency\n ? `${(out.amount / 1e6).toFixed(6)} ${out.currency}`\n : `~${SKYFIRE_TEST_AMOUNT} USD`;\n const status = out.status ?? 'initiated';\n const captured = out.settled === true || status === 'captured';\n // Two terminal states, both a successful order: CAPTURED (seller-charge\n // configured → real USDC moved) vs VERIFIED+RECORDED (no seller key → PI\n // initiated, no money moved).\n const message = captured\n ? `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} charged (Skyfire redeemed the PAY token buyer → seller) and the payment intent is captured (PI ${status}). agentbank verified the agent + payment authorization against Skyfire's live JWKS, then settled it via Skyfire seller-charge.`\n : `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} verified against Skyfire's live JWKS + recorded (PI ${status}). agentbank verified the agent + payment authorization and recorded it; no seller key is configured, so it did not auto-capture and no money moved.`;\n return finishOrder(sku, {\n ordered: out.agent?.verified === true,\n product: productName,\n quantity,\n protocol: 'skyfire',\n payer: 'skyfire buyer token',\n paidUsdc: captured\n ? `${amountStr} (Skyfire KYAPay — charged, captured)`\n : `${amountStr} (Skyfire KYAPay authorization, recorded)`,\n buyerAgent: out.agent?.subject,\n paymentAuthorization:\n 'Skyfire KYAPay PAY token (Skyfire ES256-signed, verified against the live JWKS)',\n status,\n orderId: out.paymentIntentId,\n message,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_mpp') {\n if (!TEMPO_BUYER_PRIVATE_KEY) {\n return {\n content: [\n {\n type: 'text',\n text: 'set TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key) to pay via MPP · Tempo',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // Three-layer MPP · Tempo — the demo talks only to the MERCHANT backend,\n // which mediates the HTTP-402 dance via the merchant SDK (checkout.openMPP):\n // 1. ask the backend to open the charge → it returns the 402 challenge;\n // 2. the buyer pays it on Tempo (SDK @curless/agentbank-protocols/tempo);\n // 3. hand the credential back to the backend → it settles.\n const opened = await backend<{ status: string; wwwAuthenticate?: string }>('/checkout-mpp', {\n method: 'POST',\n body: JSON.stringify({ sku }),\n });\n if (opened.status !== 'payment_required' || !opened.wwwAuthenticate) {\n throw new Error(`mpp open expected a challenge, got ${JSON.stringify(opened)}`);\n }\n const { credential, txHash } = await payMppTempoChallenge({\n wwwAuthenticate: opened.wwwAuthenticate,\n privateKey: TEMPO_BUYER_PRIVATE_KEY,\n rpcUrl: TEMPO_RPC,\n }).catch((e: unknown) => {\n throw new Error(\n `mpp tempo pay failed (${(e as Error).message}) — is the gateway's TEMPO_RECIPIENT set + the buyer wallet funded?`,\n );\n });\n const out = await backend<{\n status?: string;\n paymentIntentId?: string;\n amount?: number;\n currency?: string;\n }>('/checkout-mpp', { method: 'POST', body: JSON.stringify({ sku, credential }) });\n const paidStr = `${(MPP_TEMPO_TEST_AMOUNT / 1e6).toFixed(6)} pathUSD (Tempo TIP-20, on-chain)`;\n const settled = out.status === 'settled';\n return finishOrder(sku, {\n ordered: settled,\n product: productName,\n quantity,\n protocol: 'mpp',\n payer: 'buyer chain wallet (MPP·Tempo)',\n total: paidStr,\n paidUsdc: paidStr,\n status: settled ? 'captured' : out.status,\n orderId: out.paymentIntentId,\n txHash,\n message: `Ordered ${productName} × ${quantity} via MPP · Tempo — paid ${paidStr} to Sinocare on the Tempo chain (tx ${txHash.slice(0, 14)}…). The merchant backend issued the HTTP-402 challenge (via the merchant SDK) and, after the buyer paid on-chain, VERIFIED the TIP-20 transfer by hash — capturing the payment intent${out.paymentIntentId ? ` (PI ${out.paymentIntentId})` : ''}.`,\n });\n }\n\n if (req.params.name === 'xrpl_buyer_wallet') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return text({\n configured: false,\n message:\n 'No XRPL buyer wallet — set XRPL_BUYER_SEED (an sEd… testnet seed) to pay RLUSD orders. Fund it with testnet RLUSD (a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve.',\n });\n }\n const issuer = process.env.XRPL_RLUSD_ISSUER ?? 'rQhWct2fv4Vc4KRjRgMrxa8xPN9Zx9iLKV';\n const RLUSD_HEX = '524C555344000000000000000000000000000000';\n const have = await withXrplClient((client) =>\n rlusdBalance(client, wallet.classicAddress, RLUSD_HEX, issuer),\n );\n return text({\n address: wallet.classicAddress,\n network: 'xrpl:1 (testnet)',\n rlusd: `${have} RLUSD`,\n issuer,\n explorer: `https://testnet.xrpl.org/accounts/${wallet.classicAddress}`,\n note: 'Fund this address with testnet RLUSD (needs a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve to pay RLUSD orders.',\n });\n }\n\n if (req.params.name === 'list_my_orders') {\n // The merchant backend lists its orders (single-merchant demo = my orders).\n const { orders } = await backend<{\n orders: Array<{\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt: string;\n // Set when a refund has already been asked for on this order.\n refundRequest?: { id: string; status: string } | null;\n }>;\n }>('/orders');\n // Shared with the wallet connector: the currency scaling (a 50000 RLUSD\n // order is 0.05, not 500 — the amount is minor units at the CURRENCY's\n // own scale) and the rule that a pending refund request outranks the\n // payment status, because this list is where the buyer decides whether to\n // ask, and `paid` beside a live 申请退款 button invites a second request.\n const view = ordersView(orders);\n // Render the orders CARD (structuredContent + _meta), not a plain JSON table —\n // the card lists each order with a 申请退款 button.\n return {\n content: [\n {\n type: 'text' as const,\n text: orders.length\n ? `You have ${orders.length} Sinocare order(s) — shown in the card (each settled one has a 申请退款 button).`\n : 'No Sinocare orders yet.',\n },\n ],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'request_refund') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const orderId = String(args.orderId ?? '');\n if (!orderId) throw new Error('orderId is required (from list_my_orders)');\n // The BUYER asks the gateway directly (its own agent token) — the merchant\n // then approves/rejects from its MCP. Money moves only on approval+Curless.\n const res = await fetch(`${API_BASE}/v1/refund-requests`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ orderId, reason: args.reason ? String(args.reason) : undefined }),\n });\n const out = (await res.json()) as {\n refundRequest?: { id: string; status: string };\n error?: { message?: string; type?: string } | string;\n message?: string;\n };\n if (!res.ok) {\n // The gateway's typed errors carry a message written for a human (\"this\n // order has already been refunded\", \"already has an open refund\n // request\"). Surface THAT — a raw JSON dump of the envelope is what the\n // buyer used to get, which tells them nothing about what to do next.\n const detail =\n (typeof out.error === 'object' && out.error?.message) ||\n (typeof out.error === 'string' ? out.error : '') ||\n out.message ||\n `HTTP ${res.status}`;\n throw new Error(String(detail));\n }\n return text({\n requested: true,\n refundRequestId: out.refundRequest?.id,\n status: out.refundRequest?.status,\n message: `Refund requested for ${orderId}. Sinocare will review and approve or reject it.`,\n });\n }\n\n if (req.params.name === 'authorize_agent_budget') {\n const maxAmountEur = Number(args.maxAmountEur);\n if (!Number.isFinite(maxAmountEur) || maxAmountEur <= 0) {\n throw new Error('maxAmountEur must be a positive number (EUR)');\n }\n const hours = Math.max(1, Math.floor(Number(args.hours) || 24));\n const expiresAt = new Date(Date.now() + hours * 3_600_000).toISOString();\n const maxAmount = Math.round(maxAmountEur * 100); // EUR minor units (cents)\n // The user signs the delegation as a real AP2 IntentMandate (ES256 JWS).\n const mandate = await signIntentMandate({\n prompt: `Autonomous Sinocare order — up to €${maxAmountEur} for ${hours}h`,\n constraints: { maxAmount },\n expiresAt,\n });\n agentBudget = { mandate, maxAmountEur, expiresAt };\n saveBudget(agentBudget); // survive a process restart\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt,\n message: `Agent authorized to buy from Sinocare up to €${maxAmountEur} per order until ${expiresAt}. It can now complete UCP purchases under that cap without asking you to confirm each one; over-cap or expired purchases are rejected by the gateway.`,\n });\n }\n\n if (req.params.name === 'agent_budget_status') {\n if (!agentBudget || Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null;\n saveBudget(null);\n return text({\n authorized: false,\n message: 'No active order authorization — use authorize_agent_budget to delegate one.',\n });\n }\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${agentBudget.maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt: agentBudget.expiresAt,\n });\n }\n\n if (req.params.name === 'revoke_agent_budget') {\n const had = agentBudget !== null;\n agentBudget = null;\n saveBudget(null);\n return text({\n revoked: had,\n message: had\n ? 'Purchase authorization revoked — the agent needs a fresh one to buy autonomously.'\n : 'No authorization was set.',\n });\n }\n\n return { content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }], isError: true };\n } catch (err) {\n return { content: [{ type: 'text', text: `Error: ${(err as Error).message}` }], isError: true };\n }\n});\n\nawait server.connect(new StdioServerTransport());\n","/**\n * The Sinocare catalogue, as both storefronts read it.\n *\n * The aisles were written out four times — twice in a tool's `enum`, twice in a\n * filter — and adding `analyzer` fixed two of the four. The shop then answered\n * \"analyzer\" with the whole catalogue on one storefront and with the right two\n * products on the other, which reads as a bug in the catalogue rather than in\n * the two lists that had drifted apart.\n */\n\n/**\n * The aisles a product can be in. ONE list: the tool schemas and the filters\n * are all built from it, so a new aisle cannot be half-added.\n */\nexport const CATEGORIES = ['meter', 'cgm', 'analyzer', 'strips', 'lancets', 'accessory'] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\nexport const isCategory = (value: unknown): value is Category =>\n typeof value === 'string' && (CATEGORIES as readonly string[]).includes(value);\n\n/**\n * A product as the merchant backend spells it.\n *\n * These field names are the MERCHANT's, not ours. A card that renamed\n * `priceDisplay` to `priceEur` on the way through rendered a product with no\n * price at all — and a checkout that does not show what it costs is the one\n * thing it must never be.\n */\nexport type Product = {\n sku: string;\n name: string;\n category?: string;\n price?: number;\n currency?: string;\n priceDisplay?: string;\n description?: string;\n imageUrl?: string;\n source?: string;\n};\n\n/** The `category` property, for a tool's inputSchema. Built from CATEGORIES. */\nexport const categoryProperty = {\n type: 'string',\n enum: [...CATEGORIES],\n description: 'narrow to one aisle',\n} as const;\n\n/**\n * Narrow a catalogue to one aisle.\n *\n * An UNKNOWN category returns everything. A shop that answers a typo with \"no\n * products\" reads as an empty shop, and the person cannot tell the difference\n * between \"we do not sell that\" and \"you spelled it wrong\".\n */\nexport const filterByCategory = <T extends { category?: unknown }>(\n items: readonly T[],\n raw: unknown,\n): T[] => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n if (!isCategory(wanted)) return [...items];\n return items.filter((item) => String(item.category ?? '') === wanted);\n};\n\n/** The `?category=` a backend catalogue call should carry, or '' for all of it. */\nexport const categoryQuery = (raw: unknown): string => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n return isCategory(wanted) ? `?category=${encodeURIComponent(wanted)}` : '';\n};\n\n/** What a product costs, as a person reads it. */\nexport const priceDisplayOf = (product: Product): string =>\n product.priceDisplay ?? `€${((product.price ?? 0) / 100).toLocaleString('en-IE')}`;\n\n/**\n * Minor units at the CURRENCY's own scale — 2 for fiat, 6 for the stablecoins\n * this gateway settles. Dividing everything by 100 turns a 50000 RLUSD order\n * into 500 instead of 0.05, which is the same mistake in the direction that\n * costs the most.\n */\nconst decimals = (currency: string): number =>\n ['USDC', 'RLUSD', 'USDT'].includes(currency.toUpperCase()) ? 6 : 2;\n\n/** An amount in minor units, as a person reads it. */\nexport const formatMinor = (amount: number, currency: string): string => {\n const dp = decimals(currency);\n return `${(amount / 10 ** dp).toLocaleString('en-IE', { maximumFractionDigits: dp })} ${currency}`;\n};\n\n/**\n * Which product someone meant.\n *\n * ⚠️ An ambiguous name is NEVER guessed. \"Safe-Accu\" and \"Safe-Accu2\" differ by\n * one character, and every caller of this ends in a checkout — one of them in a\n * charge. Taking the first of several matches is how the wrong box of strips\n * gets paid for, so several matches is an answer ('ambiguous') with the\n * candidates attached, not a pick.\n *\n * In order: the exact sku, then an exact name, then the only product where what\n * was typed ends on a WORD BOUNDARY, then the only product that contains it at\n * all.\n *\n * That third step is what makes \"Safe-Accu\" answerable in a catalogue that also\n * sells \"Safe-Accu2\": the query is a whole token of the first name and only\n * part of a token in the second, so this is a distinction, not a coin toss.\n * Without it the one product name the instructions tell the model to try came\n * back as \"matches 2 products — say which one\".\n */\nexport type ProductMatch =\n | { kind: 'found'; product: Product }\n | { kind: 'ambiguous'; candidates: Product[] }\n | { kind: 'none' };\n\nexport const resolveProduct = (\n items: readonly Product[],\n query: { sku?: unknown; query?: unknown },\n): ProductMatch => {\n const sku = String(query.sku ?? '').trim();\n if (sku) {\n const bySku = items.find((it) => it.sku.toLowerCase() === sku.toLowerCase());\n if (bySku) return { kind: 'found', product: bySku };\n }\n // A sku that matched nothing may still be a NAME — hosts and people both pass\n // one in the `sku` field, and refusing to look would answer \"no such product\"\n // for something on the shelf.\n const typed = (sku || String(query.query ?? '')).trim().toLowerCase();\n if (!typed) return { kind: 'none' };\n\n const exact = items.filter((it) => it.name.trim().toLowerCase() === typed);\n if (exact.length === 1 && exact[0]) return { kind: 'found', product: exact[0] };\n\n const partial = items.filter((it) => it.name.toLowerCase().includes(typed));\n if (partial.length === 1 && partial[0]) return { kind: 'found', product: partial[0] };\n if (!partial.length) return { kind: 'none' };\n\n // Does what was typed END a word in this name? \"safe-accu\" does in \"Safe-Accu\n // Blood Glucose…\" (a space follows) and does not in \"Safe-Accu2 …\" (a digit\n // does).\n const onWordBoundary = partial.filter((it) => {\n const name = it.name.toLowerCase();\n let at = name.indexOf(typed);\n while (at !== -1) {\n const after = name[at + typed.length];\n if (after === undefined || !/[a-z0-9]/.test(after)) return true;\n at = name.indexOf(typed, at + 1);\n }\n return false;\n });\n if (onWordBoundary.length === 1 && onWordBoundary[0]) {\n return { kind: 'found', product: onWordBoundary[0] };\n }\n return { kind: 'ambiguous', candidates: partial };\n};\n","/**\n * What a storefront has to say about its checkout card, and to two different\n * hosts at once.\n *\n * Both storefronts serve the same card under their own `ui://` uri, and both\n * had their own copy of this metadata. The copies drifted in the two places\n * that fail SILENTLY — the image allow-list and the ChatGPT keys — so one shop\n * showed photos and the other showed nothing, with no error anywhere.\n */\n\n/**\n * ⚠️ `text/html;profile=mcp-app`.\n *\n * `text/html+skybridge` is a plausible near-miss that fails silently: the host\n * stops recognising the resource as a card and answers \"there was a problem\n * displaying content\".\n */\nexport const CARD_MIME = 'text/html;profile=mcp-app';\n\n/**\n * WHERE THE CARD MAY LOAD IMAGES FROM.\n *\n * ⚠️ An MCP App runs in a sandboxed iframe and the spec is explicit: an empty\n * or omitted `resourceDomains` means NO network resources. Every product photo\n * is then blocked before it leaves the starting line — not by the CDN, not by\n * the markup — and the grid renders as broken-image icons. That exact omission\n * cost three rounds of \"the pictures still aren't showing\" on the moody\n * storefront, chased through theories about the CDN, and then cost it again\n * here because the fix landed in one storefront's copy.\n *\n * The catalogue is served from a Shopify store, and Shopify re-hosts whatever\n * image a product was created with, so the photos come off Shopify's CDN.\n */\nexport const IMAGE_ORIGINS = ['https://cdn.shopify.com'];\n\n/**\n * \"This tool's result is renderable by that card.\"\n *\n * ⚠️ Declare it ONLY on tools whose result the card can actually draw.\n * Blanket-attaching it told the host that a product LIST renders the checkout\n * card: the host drew the card, the card got `{products:[…]}` with no view it\n * knew, and it sat on \"Loading…\" for ever — under a tool that had worked\n * perfectly and returned exactly what was asked for.\n *\n * Both host namespaces, because they read different ones: `ui.resourceUri` is\n * MCP Apps (Claude), `openai/outputTemplate` is ChatGPT's Apps SDK, and\n * `openai/widgetAccessible` is what lets the rendered card call back into these\n * tools — which is the entire interaction, so without it every click in the\n * card does nothing.\n */\nexport const uiMeta = (cardUri: string) => ({\n ui: { resourceUri: cardUri },\n 'ui/resourceUri': cardUri,\n 'openai/outputTemplate': cardUri,\n 'openai/widgetAccessible': true,\n});\n\n/**\n * The card resource's own metadata: what it may load, and (remote storefronts\n * only) the origin it is served from.\n *\n * `widgetDomain` is for a storefront that HAS a public origin. A stdio server\n * has none — passing its gateway URL there would name an origin the card is not\n * served from.\n */\nexport const widgetMeta = (opts: { widgetDomain?: string; imageOrigins?: string[] } = {}) => {\n const resourceDomains = opts.imageOrigins ?? IMAGE_ORIGINS;\n return {\n ui: { csp: { resourceDomains, connectDomains: [] } },\n 'openai/widgetCSP': { connect_domains: [], resource_domains: resourceDomains },\n ...(opts.widgetDomain ? { 'openai/widgetDomain': opts.widgetDomain } : {}),\n };\n};\n\n/**\n * Does this storefront serve the uri a host is asking for?\n *\n * ⚠️ ANY version of OUR card uri gets the CURRENT card.\n *\n * Versioning the uri busts host caches — that is why it is bumped. But a host\n * that cached an OLD uri keeps asking for it, and answering \"unknown resource\"\n * turns a merely stale card into a broken one: the host reports \"there was a\n * problem displaying content\" and there is nothing the person can do about it.\n * So the bump keeps its job (a new uri is a cache miss and fetches fresh) and\n * loses its sting (an old uri still gets a card).\n */\nexport const servesCardUri = (prefix: string, asked: string): boolean => asked.startsWith(prefix);\n","/**\n * WHAT THE CHECKOUT CARD IS HANDED, and what it may draw.\n *\n * The card used to know both shops: one copy hard-coded seven rails in a\n * `GROUPS` table, the other hard-coded three wallet rows in a `ROWS` table, and\n * each knew the tool names to call. A card that knows its shop is a card that\n * has to be forked per shop — which is how there came to be two of them.\n *\n * So the shop sends its own payment table and the card draws whatever arrives.\n * The card knows how a group, a row and an action LOOK; it does not know what\n * this shop sells or how it takes money.\n */\nimport type { Product } from './catalog.js';\n\n/** One clickable thing in a payment row — a tool call, or a link out. */\nexport type CheckoutAction = {\n label: string;\n /** The tool this button calls. It must be a tool of THIS server. */\n tool: string;\n /** Merged over `{sku, quantity}` when the button is pressed. */\n args?: Record<string, unknown>;\n /** Opens a URL from the result rather than rendering a receipt. */\n ext?: boolean;\n /**\n * Finish this one in the CONVERSATION, not in the card.\n *\n * A widget may only call tools on the server that gave it —\n * `callServerTool` takes a tool name and no server — so a credential living\n * in a separately-installed wallet connector is out of reach. Dressed up as\n * a click-to-pay button it produced a card that opened a checkout, said\n * \"one step left\", and left the person with nothing to press.\n */\n chat?: boolean;\n};\n\n/**\n * One row of the picker.\n *\n * ONE consistent axis wherever money has a denomination: the title is WHAT you\n * pay and WHERE it settles, the actions are WHICH protocol carries it. A card\n * rail is the exception, and only because it has no coin/chain axis at all.\n */\nexport type CheckoutRow = {\n title: string;\n sub: string;\n actions: CheckoutAction[];\n};\n\nexport type CheckoutGroup = { label: string; rows: CheckoutRow[] };\n\n/** A settled order, as the card shows it back. */\nexport type CheckoutReceipt = {\n /** What ACTUALLY paid, as the SERVER reports it — never the button clicked. */\n payer?: string;\n total?: string;\n protocol?: string;\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\n\n/**\n * The checkout card's payload.\n *\n * ⚠️ `product` is nested, and its fields are the MERCHANT's own names. Copying\n * the price into a `priceEur` on the way through is what once rendered a\n * product with no price at all, and a checkout that does not show what it\n * costs is the one thing it must never be.\n */\nexport type CheckoutView = {\n view: 'checkout';\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity: number;\n groups: CheckoutGroup[];\n /**\n * Set ONLY when THIS checkout was paid — not when this product has ever been\n * bought. Looking it up by sku treats a product as a purchase: on an account\n * that had bought 42 of 44 products, almost every card rendered as an\n * already-paid receipt the moment it self-healed, hiding the payment options\n * behind an order from days earlier.\n */\n receipt?: CheckoutReceipt | null;\n /** Which language the card's own chrome speaks. Default English. */\n lang?: CardLang;\n};\n\nexport const checkoutView = (input: {\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity?: number;\n groups: CheckoutGroup[];\n receipt?: CheckoutReceipt | null;\n lang?: CardLang;\n}): CheckoutView => ({\n view: 'checkout',\n product: input.product,\n quantity: Math.max(input.quantity ?? 1, 1),\n groups: input.groups,\n receipt: input.receipt ?? null,\n ...(input.lang ? { lang: input.lang } : {}),\n});\n\n// ── the card's own words ─────────────────────────────────────────────────────\n/**\n * The strings the CARD owns, in the languages the two shops speak.\n *\n * Everything a SHOP says — group labels, row titles, button labels, every\n * `message` — comes from that shop over the wire, so the two keep their own\n * voice. These fifteen are the card's own furniture, and they are here rather\n * than in the widget because one widget source is built to one file: a card\n * that hard-coded them would have to be forked to speak the other language,\n * which is the fork this whole change removes.\n */\nexport type CardLang = 'en' | 'zh';\n\nexport type CardCopy = {\n loading: string;\n opening: string;\n /** `{method}` — the row the person clicked. */\n paying: string;\n emptyCatalog: string;\n noOrders: string;\n /** `{count}` — how many products are on the shelf. */\n productCount: string;\n /** `{product}` — what the receipt is for, when the server sent no message. */\n orderedFallback: string;\n /** `{product}` — the one sentence the card says on the person's behalf. */\n handOffAsk: string;\n back: string;\n orderAgain: string;\n viewOrders: string;\n ordered: string;\n notCompleted: string;\n oneStepLeft: string;\n signIn: string;\n signInGo: string;\n signInWait: string;\n /** `{email}` — who just finished signing in, while the payment goes through. */\n signedInPaying: string;\n signInExpired: string;\n /**\n * Never having started a sign-in is NOT a timeout. Telling someone their code\n * expired when they were never given one sends them looking for a mistake\n * they did not make.\n */\n signInNeverStarted: string;\n ordersFailed: string;\n walletSaidNo: string;\n openWallet: string;\n goPay: string;\n payWait: string;\n payTimeout: string;\n handedOver: string;\n handedOverBody: string;\n handedOverWait: string;\n refund: string;\n refunding: string;\n refundFailed: string;\n onChainTx: string;\n paidBy: string;\n cannotOpen: string;\n cardFailed: string;\n nothingToShow: string;\n nothingToShowBody: string;\n refresh: string;\n ordersTitle: string;\n};\n\nexport const CARD_COPY: Record<CardLang, CardCopy> = {\n en: {\n loading: 'Loading…',\n opening: 'Opening checkout…',\n paying: 'Paying via {method}…',\n emptyCatalog: 'Nothing in the catalog.',\n noOrders: 'No orders yet — pick something from the catalog first.',\n productCount: '{count} products',\n orderedFallback: 'Ordered {product}',\n handOffAsk: 'Buy {product} with Curless wallet',\n back: '← Choose another way',\n orderAgain: 'Order another',\n viewOrders: 'View my orders →',\n ordered: 'Ordered',\n notCompleted: 'Not completed',\n oneStepLeft: 'One step left',\n signIn: 'Sign in to Curless',\n signInGo: 'Sign in ↗',\n signInWait:\n 'This card reconnects on its own once you are in. Binding a card happens there too.',\n signedInPaying: 'Signed in as {email} — paying…',\n signInExpired: 'That sign-in timed out — start it again above.',\n signInNeverStarted: 'No sign-in started yet — use the link above.',\n ordersFailed: 'Could not load your orders.',\n walletSaidNo: 'Wallet said no',\n openWallet: 'Open wallet ↗',\n goPay: 'Go pay ↗',\n payWait: 'Approve it in your browser and this card turns into a receipt on its own.',\n payTimeout: 'No payment received yet. Once you have paid, check “my orders”.',\n handedOver: 'Handed to your assistant',\n handedOverBody:\n 'This one is paid from the Curless wallet connector you installed — the credential lives there, and this card cannot reach it.',\n handedOverWait:\n 'Your assistant will open the checkout, get you signed in if needed, and confirm the amount with you before anything is charged.',\n refund: 'Request a refund',\n refunding: 'Working…',\n refundFailed: 'The refund request failed',\n onChainTx: 'On-chain tx:',\n paidBy: 'Paid by:',\n cannotOpen: 'Could not open the checkout',\n cardFailed: 'The card could not load',\n nothingToShow: 'Nothing to show here',\n nothingToShowBody: 'Ask for a product by name, or for the catalog.',\n refresh: 'Refresh',\n ordersTitle: 'My orders',\n },\n zh: {\n loading: '加载中…',\n opening: '正在开结账…',\n paying: '正在通过 {method} 结算…',\n emptyCatalog: '目录里没有商品。',\n noOrders: '还没有订单 —— 先从目录里挑一件。',\n productCount: '{count} 件商品',\n orderedFallback: '已下单 {product}',\n handOffAsk: '用 Curless 钱包买{product}',\n back: '← 换个支付方式',\n orderAgain: '再订一次',\n viewOrders: '查看我的订单 →',\n ordered: '已下单',\n notCompleted: '未完成',\n oneStepLeft: '还差一步',\n signIn: '登录 Curless 钱包',\n signInGo: '去登录 ↗',\n signInWait: '登录完这张卡会自己接上。绑卡也在同一个页面里。',\n signedInPaying: '已登录 {email} —— 正在付款…',\n signInExpired: '登录超时了,点上面重新来一次。',\n signInNeverStarted: '还没开始登录 —— 点上面那个链接。',\n ordersFailed: '订单加载失败。',\n walletSaidNo: '钱包未放行',\n openWallet: '打开钱包 ↗',\n goPay: '去付款 ↗',\n payWait: '在浏览器里批准后,这张卡会自己变成收据。',\n payTimeout: '还没收到付款。付完点一下\"我的订单\"看看。',\n handedOver: '交给助手继续',\n handedOverBody:\n '这笔要用你自己装的 Curless 钱包连接器付 —— 凭据在那个连接器里,这张卡够不到它。',\n handedOverWait: '助手会先让你登录钱包,再铸一张凭据完成付款,扣款前会跟你确认金额。',\n refund: '申请退款',\n refunding: '处理中…',\n refundFailed: '退款申请失败',\n onChainTx: '链上交易:',\n paidBy: '付款方式:',\n cannotOpen: '打不开结账',\n cardFailed: '卡片加载失败',\n nothingToShow: '这里没有可显示的内容',\n nothingToShowBody: '说出商品名字,或者让我打开目录。',\n refresh: '刷新',\n ordersTitle: '我的订单',\n },\n};\n","/**\n * The storefront's `instructions` — a SPEC FOR THE MODEL, not documentation.\n *\n * The host injects this into the model's context, so every rule here is load-\n * bearing. Left to itself the model reads the tool list, renders the catalogue\n * card, and then ALSO pops a chooser asking which product to buy — over a grid\n * where every tile already has a Buy button. A card the model talks over has\n * replaced nothing.\n *\n * ⚠️ The two storefronts do NOT say the same thing, and must not.\n *\n * The seven-rail demo has to explain a choice between ACP / UCP / x402 /\n * RLUSD / Payment Link; the wallet connector has three wallet shapes and no\n * rails at all. What they share is the SHAPE and the handful of rules that\n * were each learned by watching the model get it wrong. So the payment\n * sentence is the caller's, and everything around it is fixed here.\n */\nexport type InstructionOptions = {\n /** One line: whose shop this is, and that the card IS the shop. */\n opening: string;\n /**\n * How THIS storefront's checkout card lets someone pay, and the matching\n * \"do not retype the options as text\" rule. The one genuinely different\n * paragraph.\n */\n paymentCard: string;\n /**\n * The field a tool sets when an order actually went through. Named because\n * the closing rule quotes it, and the two storefronts spell it differently\n * (`ordered` here, `booked` in the older seven-rail demo).\n */\n orderedField?: string;\n /** Anything only this storefront needs — a hand-off chain, a rail fallback. */\n extra?: string[];\n};\n\nexport const buildInstructions = (opts: InstructionOptions): string =>\n [\n opts.opening,\n // Every one of these was added after watching the model do the opposite.\n 'To show what is for sale, call list_sinocare_products ONCE and STOP. Do NOT then ask which one, and do NOT retype the products as a numbered list — the person picks by tapping Buy in the card. Say at most one short line, e.g. \"Here is the Sinocare catalog — tap Buy on any of them.\"',\n opts.paymentCard,\n 'Only fall back to describing things in prose if the card genuinely cannot be shown (a host with no UI).',\n 'When the person names a product, open its checkout directly rather than asking them to confirm. If the name is ambiguous or unknown, show the catalog card and let them pick a tile.',\n 'IN THE CHAT, “buy with Curless wallet” means start_sinocare_wallet_handoff. Pass the product when you have it — the card puts it in that message for you; with no product named at all, call the tool with no arguments and let it try. The other two wallet paths are driven by the CARD: the person taps them and the card finishes in place, so do not run those from the chat.',\n ...(opts.extra ?? []),\n `Nothing is charged until the person acts. A tool that opens a checkout returns \\`${opts.orderedField ?? 'ordered'}: false\\` — report it as opened, never as bought.`,\n ].join('\\n');\n","/**\n * The tools BOTH Sinocare storefronts advertise, in one place.\n *\n * A tool description is read by a model deciding whether to move money, which\n * is why the two copies drifting mattered: the same tool told one host that a\n * wallet refusal must stop the purchase and told the other nothing at all.\n * Both tables also carried `quantity: 'number of guests/weeks'` — left over\n * from a resort demo, in a shop that sells boxes of test strips.\n *\n * The seven-rail demo adds its own rail tools on top of these; only the\n * checkout card's payment vocabulary is genuinely per-storefront, so that one\n * sentence is a parameter and everything else is fixed.\n */\nimport { categoryProperty } from './catalog.js';\n\nexport type ToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n};\n\n/** `quantity`, in a shop that sells boxes of things. */\nconst quantity = { type: 'integer', description: 'how many, default 1' } as const;\n\nconst sku = {\n type: 'string',\n description: \"the product's exact sku (from list_sinocare_products)\",\n};\nconst query = {\n type: 'string',\n description:\n \"the product NAME (e.g. 'Safe AQ Smart') — used when the exact sku is not known; resolved against the live catalog. Pass `sku` OR `query`.\",\n};\n\nexport type StorefrontToolOptions = {\n /**\n * What the checkout card offers, in this storefront's own vocabulary — the\n * three wallet shapes, or the seven rails. Appended to a fixed description,\n * because \"open the card instead of listing the options as text\" is the same\n * instruction in both shops and only the list differs.\n */\n checkoutOffers: string;\n};\n\n/**\n * The tools both storefronts advertise, in the order a buyer meets them.\n *\n * ⚠️ Every name here must have a dispatch case on both sides. A range-edit once\n * deleted four cases while the table still advertised them, and the server\n * answered \"unknown tool\" for tools it had just listed.\n */\nexport const storefrontTools = (opts: StorefrontToolOptions): ToolDef[] => [\n {\n name: 'list_sinocare_products',\n description:\n 'Browse the Sinocare catalog AS A CARD — every tile opens a checkout for that product, so the person picks and pays in one place. Prefer this over listing the catalog as text. Optional `category` filter: meter | cgm | analyzer | strips | lancets | accessory.',\n inputSchema: {\n type: 'object',\n properties: { category: categoryProperty },\n },\n },\n {\n name: 'get_sinocare_product',\n description:\n 'One Sinocare product by its sku (from list_sinocare_products), with its price and what is in the box.',\n inputSchema: {\n type: 'object',\n properties: { sku },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_checkout',\n description: `THE DEFAULT WAY TO BUY. Open the visual checkout card for a product, so the person picks how to pay by clicking IN THE CARD instead of typing. ${opts.checkoutOffers} When someone wants to buy, CALL THIS — do not list the payment options as text and ask which one. Identify the product: pass its \\`sku\\` OR a \\`query\\` name (e.g. 'Safe-Accu'). To show the whole catalog instead, call list_sinocare_products — it renders as a card too, and every tile opens that product's checkout.`,\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'buy_sinocare_product_wallet',\n description:\n 'Order and pay in one call, from the Curless wallet THIS storefront holds a session for: the wallet mints a credential from the card THEY bound, capped by the limits THEY set, scoped to this seller and this amount for 15 minutes. If nobody is signed in it returns a browser sign-in link and orders nothing — show the person the link; the card polls on its own and pays once they finish. Do NOT ask them for a password in the chat. ⚠️ If the wallet refuses — over their own limit, no card bound — say what it said and STOP; do not pay for this another way. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_wallet_handoff',\n description:\n \"HAND-OFF, step 1 — what “Buy with Curless wallet” in the chat means. Pass the sku or product name whenever you have one; the card writes the product into that message, so usually you do. If the person genuinely named nothing, call this with no arguments: the server falls back to a checkout opened on THIS connection, and answers with the product and amount either way — confirm that with them before minting any credential. Open a Sinocare checkout to be paid by a SEPARATELY-INSTALLED Curless wallet connector. Returns {sessionId, merchantId, amount, currency} and charges nothing. Next: call that connector's `wallet_pay_credential` with exactly this amount, currency and merchantRef=merchantId, then pass the token it returns to `pay_sinocare_with_token`. This needs that connector installed; only if it is genuinely absent fall back to buy_sinocare_product_wallet or pay_sinocare_hosted. ⚠️ If the wallet refuses — not signed in, over their own limit, no card bound — STOP and repeat what it said. Do NOT pay for this another way: they chose to pay from their own wallet, and settling it elsewhere spends different money and reports it as theirs.\",\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'pay_sinocare_with_token',\n description:\n 'HAND-OFF, step 2. Complete a checkout opened by start_sinocare_wallet_handoff using a credential minted elsewhere (a Stripe shared payment token, spt_…). Sinocare completes with its own merchant key and never sees a card. WHEN THE PERSON NAMES NO PRODUCT — “buy with Curless wallet”, “pay for this” — CALL THIS WITH NO ARGUMENTS. The storefront resolves whichever product they just opened a card for, and names it back to you; it refuses when there is none. Do NOT ask which item first: the server knows, and a tool result from a card never reached you.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n merchantId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n token: { type: 'string', description: 'spt_… from the wallet' },\n },\n required: ['sessionId', 'merchantId', 'token'],\n },\n },\n {\n name: 'pay_sinocare_hosted',\n description:\n 'HOSTED. Open a checkout and hand back a link the person approves in their own browser — they see the amount and the merchant before anything is charged, and the gateway completes it. Needs nothing installed anywhere. Nothing is charged by this call: poll get_sinocare_order_status afterwards, do not claim it is paid until that says so, and do not pay for it another way while they are still on the page. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'get_sinocare_order_status',\n description:\n 'Has this checkout been paid? Use after pay_sinocare_hosted — the approval happens in a browser and this server is never told when it does. `completed` means the money moved.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string' },\n merchantId: { type: 'string', description: 'from the tool that opened this checkout' },\n },\n required: ['sessionId', 'merchantId'],\n },\n },\n {\n name: 'curless_wallet_login_status',\n description:\n 'Is anyone signed into the wallet THIS storefront holds? A separately-installed Curless wallet connector has its own session and this tool knows nothing about it — ask that connector instead. The checkout card polls this by itself; you do not normally need to.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'curless_wallet_logout',\n description:\n 'Sign out of the wallet session this storefront holds, and revoke it so it cannot be used again. Use when the person asks to sign out, or is done and someone else may use this machine. Says nothing about a separately-installed wallet connector.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'list_my_orders',\n description:\n 'Orders placed through this storefront, newest first, with id, product, amount and status. Renders as a card where each settled order has a refund button; the order id is what request_refund takes.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'request_refund',\n description:\n 'Ask Sinocare to refund an order. Pass the order id (ord_…) from list_my_orders and an optional reason. The buyer asks; the merchant approves from its own tools, and money moves only on approval.',\n inputSchema: {\n type: 'object',\n properties: {\n orderId: { type: 'string', description: 'order id from list_my_orders (ord_…)' },\n reason: { type: 'string' },\n },\n required: ['orderId'],\n },\n },\n];\n","/**\n * What a tool result LOOKS like to the card.\n *\n * `view` is the card's dispatch key, and both storefronts were building these\n * shapes by hand. The catalogue view once came back as the merchant card's\n * `{currency, count, products}` after a rename that changed identifiers and not\n * payloads — the card read `products`, got undefined, and drew nothing.\n */\nimport { type Product, formatMinor } from './catalog.js';\n\n/** The catalogue, as the card's product grid reads it. */\nexport const productsView = (products: readonly Product[]) => ({\n view: 'products' as const,\n count: products.length,\n products: [...products],\n});\n\n/** An order as the merchant backend lists it. */\nexport type BackendOrder = {\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol?: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt?: string;\n /** Set when a refund has already been asked for on this order. */\n refundRequest?: { id: string; status: string } | null;\n};\n\n/** One order as the card's list reads it. */\nexport type OrderRow = {\n orderId: string;\n status: string;\n refundPending: boolean;\n product: string;\n total: string;\n protocol?: string;\n date: string;\n};\n\n/**\n * The buyer's orders, as the card's list reads them.\n *\n * A PENDING refund request outranks the payment status here, because this list\n * is where the buyer decides whether to ask. `paid` beside a live \"request\n * refund\" button, on an order they already asked about, invites them to ask\n * twice. `refundPending` is a flag rather than a substring of the status, so\n * the button and the wording cannot drift apart when the gateway gains a new\n * refund-ish status tomorrow.\n */\nexport const ordersView = (orders: readonly BackendOrder[]) => ({\n view: 'orders' as const,\n orders: orders.map(\n (o): OrderRow => ({\n orderId: o.id,\n status: o.refundRequest\n ? o.refundRequest.status === 'approved'\n ? 'refund approved'\n : 'refund requested'\n : o.status,\n refundPending: Boolean(o.refundRequest),\n product: o.lineItems?.map((li) => `${li.name} ×${li.quantity}`).join(', ') ?? '',\n total: formatMinor(Number(o.amount ?? 0), String(o.currency ?? 'EUR')),\n protocol: o.protocol,\n date: o.createdAt?.slice(0, 10) ?? '',\n }),\n ),\n});\n","// GENERATED by packages/internal/sinocare-storefront/widget (`npm run build`).\n// Do not edit by hand, and do not edit the OTHER storefront's copy either — both\n// are emitted from the one card source, and they are byte-identical on purpose.\n// A single self-contained HTML (Vite + vite-plugin-singlefile, with the MCP Apps\n// SDK bundled), base64-embedded so it is bundler-safe.\n//\n// ⚠️ After regenerating, BUMP THE CARD URI in each server. A host caches the\n// card's HTML by that uri, so new card code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture, which is\n// indistinguishable from \"the fix did not work\".\nexport const CHECKOUT_CARD_HTML: string = Buffer.from(\n 'PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgICA8c3R5bGU+CiAgICAgIC8qIFRoZW1lIG9mZiB0aGUgSE9TVCdzIG93biBkZXNpZ24gdG9rZW5zICh0aGUgTUNQIEFwcHMgU0RLIGluamVjdHMgdGhlbSksCiAgICAgICAgIHNvIHRoZSBjYXJkIHNpdHMgbmF0aXZlbHkgaW5zaWRlIENsYXVkZSDigJQgbGlnaHQvZGFyaywgZm9udHMgYW5kIHJhZGlpCiAgICAgICAgIGFsbCBtYXRjaCB3aXRob3V0IHRoaXMgY2FyZCBrbm93aW5nIHdoaWNoIGlzIGluIGZvcmNlLiBUaGUgZmFsbGJhY2tzCiAgICAgICAgIGFyZSB3aGF0IGEgaG9zdCB0aGF0IGluamVjdHMgbm90aGluZyBnZXRzLiAqLwogICAgICA6cm9vdCB7CiAgICAgICAgLS1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5LCAjZmZmZmZmKTsKICAgICAgICAtLWJnLXNvZnQ6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc2Vjb25kYXJ5LCAjZjZmOGZhKTsKICAgICAgICAtLWZnOiB2YXIoLS1jb2xvci10ZXh0LXByaW1hcnksICMxYTFmMzYpOwogICAgICAgIC0tZmctc29mdDogdmFyKC0tY29sb3ItdGV4dC1zZWNvbmRhcnksICM2OTczODYpOwogICAgICAgIC0tZmctZmFpbnQ6IHZhcigtLWNvbG9yLXRleHQtdGVydGlhcnksICM4NzkyYTIpOwogICAgICAgIC0tbGluZTogdmFyKC0tY29sb3ItYm9yZGVyLXByaW1hcnksICNlM2U4ZWUpOwogICAgICAgIC0tZ29vZDogdmFyKC0tY29sb3ItdGV4dC1zdWNjZXNzLCAjMWE3ZjVhKTsKICAgICAgICAtLWdvb2QtYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc3VjY2VzcywgI2RkZjNlNCk7CiAgICAgICAgLS1iYWQ6IHZhcigtLWNvbG9yLXRleHQtZGFuZ2VyLCAjYjMyNjFlKTsKICAgICAgICAtLWJhZC1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1kYW5nZXIsICNmYmU2ZTQpOwogICAgICAgIC0td2FybjogdmFyKC0tY29sb3ItdGV4dC13YXJuaW5nLCAjOGE1YTAwKTsKICAgICAgICAtLXdhcm4tYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtd2FybmluZywgI2ZkZjBkNSk7CiAgICAgICAgLS1ibHVlOiB2YXIoLS1jb2xvci10ZXh0LWFjY2VudCwgIzI1NjNlYik7CiAgICAgICAgLS1saW5rOiB2YXIoLS1jb2xvci10ZXh0LWxpbmssIHZhcigtLWNvbG9yLXRleHQtYWNjZW50LCAjMjU2M2ViKSk7CiAgICAgICAgLS1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtbGcsIDE0cHgpOwogICAgICAgIC0tcmFkaXVzLXNtOiB2YXIoLS1ib3JkZXItcmFkaXVzLXNtLCA5cHgpOwogICAgICAgIC0tZm9udDogdmFyKC0tZm9udC1zYW5zLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZik7CiAgICAgICAgLS1tb25vOiB2YXIoLS1mb250LW1vbm8sIHVpLW1vbm9zcGFjZSwgJ1NGIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlKTsKICAgICAgfQogICAgICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KICAgICAgLmNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDEwLCAyMCwgNDAsIDAuMDQpLCAwIDJweCA1cHggcmdiYSgxMCwgMjAsIDQwLCAwLjA0KTsKICAgICAgICBtYXgtd2lkdGg6IDQ2MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLmhlYWQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweCAwOwogICAgICB9CiAgICAgIC5oZWFkIC50aXRsZSB7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDY1MDsgfQogICAgICAuaGVhZCAubWVyY2hhbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICB9CiAgICAgIC8qIFJlZnJlc2gg4oCUIGFuIG9yZGVycyBjYXJkIGlzIHRoZSBzbmFwc2hvdCBvZiBvbmUgdG9vbCBjYWxsLCBhbmQgYSByZWZ1bmQKICAgICAgICAgc3RhdHVzIGNoYW5nZXMgd2hpbGUgeW91IGFyZSBsb29raW5nIGF0IGl0ICh0aGUgbWVyY2hhbnQgYXBwcm92ZXMsIHRoZW4KICAgICAgICAgdGhlIGdhdGV3YXkgc2lnbmFscyBjb21wbGV0aW9uKS4gV2l0aG91dCB0aGlzIGJ1dHRvbiB0aGUgb25seSB3YXkgdG8KICAgICAgICAgc2VlIHRoZSBuZXcgc3RhdGUgaXMgdG8gZ28gYmFjayB0byB0aGUgY2hhdCBhbmQgYXNrIGZvciB0aGUgbGlzdCBhZ2Fpbi4KICAgICAgICAgT25seSB0aGUgb3JkZXJzIHZpZXcgc2V0cyBvbmUuICovCiAgICAgIC5oZWFkIC5yZWZyZXNoIHsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgLjEycywgYmFja2dyb3VuZCAuMTJzLCBjb2xvciAuMTJzOwogICAgICB9CiAgICAgIC5oZWFkIC5yZWZyZXNoOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgfQogICAgICAuaGVhZCAucmVmcmVzaDpkaXNhYmxlZCB7IGN1cnNvcjogZGVmYXVsdDsgb3BhY2l0eTogLjY7IH0KICAgICAgLmhlYWQgLnJlZnJlc2hbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgLmhlYWQgLnJlZnJlc2ggc3ZnIHsgd2lkdGg6IDEzcHg7IGhlaWdodDogMTNweDsgZGlzcGxheTogYmxvY2s7IH0KICAgICAgLyogQSByZWZyZXNoIG1vc3RseSBjb21lcyBiYWNrIGxvb2tpbmcgaWRlbnRpY2FsIOKAlCB3aXRob3V0IHRoZSBzcGluIGl0CiAgICAgICAgIHJlYWRzIGFzIG5vdGhpbmcgaGF2aW5nIGhhcHBlbmVkLCBhbmQgcGVvcGxlIHByZXNzIGl0IGFnYWluLiAqLwogICAgICAuaGVhZCAucmVmcmVzaC5idXN5IHN2ZyB7IGFuaW1hdGlvbjogY20tc3BpbiAuN3MgbGluZWFyIGluZmluaXRlOyB9CiAgICAgIEBrZXlmcmFtZXMgY20tc3BpbiB7IHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9CiAgICAgICNjb250ZW50IHsgcGFkZGluZzogNnB4IDIwcHggMThweDsgfQogICAgICAuaGVybyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxNTBweDsKICAgICAgICAvKiBjb250YWluLCBub3QgY292ZXI6IGNvdmVyIGZpbGxzIHRoZSBib3ggYnkgQ1VUVElORyB0aGUgcGljdHVyZSwKICAgICAgICAgICBhbmQgb24gYSBwcm9kdWN0IHNob3Qgd2hhdCBpdCBjdXRzIG9mZiBpcyB0aGUgcHJvZHVjdC4gKi8KICAgICAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAycHggMCAxMnB4OwogICAgICB9CiAgICAgIC5wcmljZSB7CiAgICAgICAgZm9udC1zaXplOiAyNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbWFyZ2luOiA2cHggMCAycHg7CiAgICAgIH0KICAgICAgLnN1YiB7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tZmctc29mdCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KICAgICAgLyogQSBwYXltZW50IGdyb3VwJ3MgaGVhZGVyLiBObyB0ZXh0LXRyYW5zZm9ybSDigJQgYSBwcm90b2NvbCBuYW1lIGxpa2UKICAgICAgICAgIng0MDIiIGlzIGRlbGliZXJhdGVseSBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2luZyBpdCBnaXZlcyAiWDQwMiIuICovCiAgICAgIC5ncm91cC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgICAgIG1hcmdpbjogMTRweCAwIDdweDsKICAgICAgfQogICAgICAuZ3JvdXAtbGFiZWw6Zmlyc3Qtb2YtdHlwZSB7IG1hcmdpbi10b3A6IDRweDsgfQogICAgICAvKiBQYXltZW50IHJvd3M6IGEgdGl0bGUgKyBzdWIgb24gdGhlIGxlZnQsIG9uZS1vci1tb3JlIGFjdGlvbiBwaWxscyBvbgogICAgICAgICB0aGUgcmlnaHQgKHRoZSBwcm90b2NvbCBzdWItY2hvaWNlKS4gKi8KICAgICAgLnJvd3MgeyBkaXNwbGF5OiBncmlkOyBnYXA6IDhweDsgfQogICAgICAucm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgLyogd3JhcCwgc28gYW4gaW5saW5lIGVycm9yICguby1lcnIsIGZsZXgtYmFzaXM6MTAwJSkgZHJvcHMgdG8gaXRzIG93bgogICAgICAgICAgIGxpbmUgaW5zdGVhZCBvZiBiZWluZyBzcXVlZXplZCBpbiBiZXNpZGUgdGhlIHN0YXR1cyBwaWxsICovCiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMXB4IDE0cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgfQogICAgICAucm93LW1haW4geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJweDsgbWluLXdpZHRoOiAwOyB9CiAgICAgIC5yLXRpdGxlIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxMy41cHg7IH0KICAgICAgLnItc3ViIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEycHg7IH0KICAgICAgLyogYWxpZ24taXRlbXM6Y2VudGVyLCBOT1QgdGhlIGRlZmF1bHQgc3RyZXRjaCDigJQgYSBzdHJldGNoZWQgLm9zdGF0IHBpbGwKICAgICAgICAgZ3Jvd3MgdG8gdGhlIG5laWdoYm91cmluZyBidXR0b24ncyBoZWlnaHQgYW5kIHJlYWRzIGFzIGEgdGFsbCBsb3BzaWRlZAogICAgICAgICBvdmFsLCBidXQgb25seSBvbiByb3dzIHRoYXQgSEFWRSBhIGJ1dHRvbiwgd2hpY2ggaXMgd2h5IGl0IGxvb2tlZCBsaWtlCiAgICAgICAgIGEgb25lLXJvdyBnbGl0Y2guICovCiAgICAgIC5yb3ctYWN0cyB7IG1hcmdpbi1sZWZ0OiBhdXRvOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgZmxleC1zaHJpbms6IDA7IH0KICAgICAgLmFjdCB7CiAgICAgICAgcGFkZGluZzogN3B4IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1NTA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xMnMsIGJhY2tncm91bmQgLjEycywgY29sb3IgLjEyczsKICAgICAgfQogICAgICAuYWN0OmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC8qIFRoZSBvbmUgYWN0aW9uIG9uIHRoZSBzY3JlZW4g4oCUIGEgYm9yZGVyZWQgZ2hvc3QgYnV0dG9uIG5leHQgdG8gYSB0ZXh0CiAgICAgICAgIGZpZWxkIHJlYWRzIGFzIG9wdGlvbmFsLCBhbmQgdGhpcyBvbmUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBzdGF0ZS4gKi8KICAgICAgLmFjdC5wcmltYXJ5IHsgYmFja2dyb3VuZDogdmFyKC0tYmx1ZSk7IGNvbG9yOiAjZmZmOyBib3JkZXItY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5hY3QucHJpbWFyeTpob3ZlciB7IGNvbG9yOiAjZmZmOyBvcGFjaXR5OiAuOTsgfQogICAgICAuYWN0OmRpc2FibGVkIHsgb3BhY2l0eTogLjU1OyBjdXJzb3I6IGRlZmF1bHQ7IH0KICAgICAgLmFjdC5leHQgeyBjb2xvcjogdmFyKC0tbGluayk7IGJvcmRlci1jb2xvcjogdmFyKC0tbGluayk7IH0KICAgICAgLmFjdC5leHQ6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ibHVlKTsgY29sb3I6ICNmZmY7IGJvcmRlci1jb2xvcjogdmFyKC0tYmx1ZSk7IH0KICAgICAgLyogT3JkZXIgc3RhdHVzIHBpbGwgKG9yZGVycyB2aWV3KSAqLwogICAgICAub2xpc3QgeyBtYXJnaW4tdG9wOiAycHg7IH0KICAgICAgLm9zdGF0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDNweCA5cHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgLm9zdGF0Lm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAub3N0YXQud2FybiB7IGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyB9CiAgICAgIC5vc3RhdC5tdXRlZCB7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyB9CiAgICAgIC8qIFdoeSBhIHJlZnVuZCByZXF1ZXN0IGZhaWxlZCwgb24gdGhlIHJvdyBpdCBiZWxvbmdzIHRvLiBTaWxlbmNlIG1hZGUgdGhlCiAgICAgICAgIGJ1eWVyIHJldHJ5IHNvbWV0aGluZyB0aGF0IGNvdWxkIG5ldmVyIHN1Y2NlZWQuICovCiAgICAgIC5vLWVyciB7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsgbWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgICAgIGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiA3cHggOXB4OyBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgICAgfQogICAgICAvKiBSZXN1bHQgc3RhdGVzICovCiAgICAgIC5yZXN1bHQgeyBwYWRkaW5nOiA0cHggMCAycHg7IH0KICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIH0KICAgICAgLmJhZGdlLm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAuYmFkZ2UuZXJyIHsgY29sb3I6IHZhcigtLWJhZCk7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IH0KICAgICAgLyogTmVpdGhlciBzdWNjZXNzIG5vciBmYWlsdXJlOiBzb21ldGhpbmcgdGhlIHBlcnNvbiBzdGlsbCBoYXMgdG8gZG8uIFJlZAogICAgICAgICB3b3VsZCB0ZWxsIHRoZW0gdGhlIHBheW1lbnQgYnJva2UsIGFuZCBpdCBkaWQgbm90IOKAlCBub3RoaW5nIHdhcwogICAgICAgICBjaGFyZ2VkLCBwcmljZWQsIG9yIGV2ZW4gYXR0ZW1wdGVkLiAqLwogICAgICAuYmFkZ2UudG9kbyB7IGNvbG9yOiB2YXIoLS13YXJuKTsgYmFja2dyb3VuZDogdmFyKC0td2Fybi1iZyk7IH0KICAgICAgLmxvZ2lucm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbjogMTJweCAwIDRweDsgZmxleC13cmFwOiB3cmFwOyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgICAgIC5lcnItbGluZSB7IGNvbG9yOiB2YXIoLS1iYWQpOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi10b3A6IDZweDsgfQogICAgICAvKiBTaG93biBzbyB0aGUgcGVyc29uIGNhbiBjaGVjayBpdCBhZ2FpbnN0IHRoZSBicm93c2VyIHBhZ2Ug4oCUIHRoZSBjb2RlIGlzCiAgICAgICAgIGEgY29uZmlybWF0aW9uLCBub3QgYSBzZWNyZXQsIGFuZCBpdCBpcyB3aGF0IHN0b3BzIGEgbGluayBzZW50IGJ5CiAgICAgICAgIHNvbWVvbmUgZWxzZSBmcm9tIGJlaW5nIGFwcHJvdmVkIHNpbGVudGx5LiAqLwogICAgICAudWNvZGUgeyBmb250OiA2MDAgMTNweCB2YXIoLS1tb25vKTsgbGV0dGVyLXNwYWNpbmc6IC4wOGVtOyBjb2xvcjogdmFyKC0tZmctc29mdCk7CiAgICAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMXB4OyBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IH0KICAgICAgLndhaXRpbmcgeyBjb2xvcjogdmFyKC0tZmctZmFpbnQpOyBmb250LXNpemU6IDEyLjVweDsgbWFyZ2luLXRvcDogMTBweDsgfQogICAgICAucmVzdWx0IC5saW5lIHsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW46IDEycHggMCA0cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IH0KICAgICAgLnJlc3VsdCAubW9ubyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMS41cHg7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9CiAgICAgIC5yZXN1bHQgYS50eCwgLnJlc3VsdCAudHggeyBjb2xvcjogdmFyKC0tbGluayk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY3Vyc29yOiBwb2ludGVyOyB9CiAgICAgIC8qIFRoZSBjYXRhbG9ndWUgbGluayB1bmRlciBhIGNoZWNrb3V0LiBTY29wZWQgYC5yZXN1bHQgYnV0dG9uLmJhY2tgCiAgICAgICAgIGJlbG93IHN0eWxlcyB0aGUgb25lIGluc2lkZSBhIFJFU1VMVDsgdGhpcyBvbmUgc2l0cyB1bmRlciB0aGUgcGF5bWVudAogICAgICAgICByb3dzLCB3aGVyZSBhIGJvcmRlcmVkIGJveCBjb21wZXRlcyB3aXRoIHRoZSB0aGluZyBpdCBzaXRzIGJlbmVhdGgg4oCUCiAgICAgICAgIHRoZSBidXR0b25zIHRoYXQgYWN0dWFsbHkgdGFrZSBtb25leS4gQSBxdWlldCB0ZXh0IGxpbmsgaW5zdGVhZC4gKi8KICAgICAgYnV0dG9uLmJhY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMTRweCBhdXRvIDJweDsKICAgICAgICBwYWRkaW5nOiA0cHggMnB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1mYWludCk7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIGJ1dHRvbi5iYWNrOmhvdmVyIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmJhY2sgewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDhweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC8qIFByaW1hcnkgZm9yd2FyZCBDVEEgYWZ0ZXIgYSBzdWNjZXNzZnVsIG9yZGVyIOKGkiB2aWV3IG9yZGVycyAqLwogICAgICAucmVzdWx0IGJ1dHRvbi5nbyB7CiAgICAgICAgbWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogOXB4IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJsdWUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IGJhY2tncm91bmQ6IHZhcigtLWJsdWUpOyBjb2xvcjogI2ZmZjsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmdvOmhvdmVyIHsgZmlsdGVyOiBicmlnaHRuZXNzKDAuOTYpOyB9CiAgICAgIC8qIFJlY2VpcHQgQ1RBcyBzaWRlIGJ5IHNpZGUuIENhbmNlbHMgdGhlIGJ1dHRvbnMnIG93biBtYXJnaW4tdG9wIHNvIHRoZQogICAgICAgICByb3cgYWxpZ25zLiAqLwogICAgICAucmVzdWx0IC5jdGEtcm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogc3RyZXRjaDsgZmxleC13cmFwOiB3cmFwOyB9CiAgICAgIC5yZXN1bHQgLmN0YS1yb3cgYnV0dG9uIHsgbWFyZ2luLXRvcDogMTRweDsgfQogICAgICAvKiBBIHNlY29uZGFyeSBzaXR0aW5nIE5FWFQgVE8gYSBwcmltYXJ5IGhhcyB0byBzaGFyZSB0aGUgcHJpbWFyeSdzIGJveCDigJQKICAgICAgICAgc2FtZSBwYWRkaW5nLCBzYW1lIHNpemUsIHNhbWUgd2VpZ2h0LiBgLmJhY2tgIGlzIHR1bmVkIGZvciBzdGFuZGluZwogICAgICAgICBhbG9uZSBhdCB0aGUgYm90dG9tIG9mIGEgdmlldyAoc21hbGxlciwgcXVpZXRlcik7IHJldXNlZCBpbiBhIHBhaXIgaXQKICAgICAgICAgY2FtZSBvdXQgc2hvcnRlciBhbmQgbGlnaHRlciB0aGFuIHRoZSBidXR0b24gYmVzaWRlIGl0LCB3aGljaCByZWFkcyBhcwogICAgICAgICBhbiB1bmZpbmlzaGVkIGNvbnRyb2wgcmF0aGVyIHRoYW4gdGhlIG90aGVyIGhhbGYgb2YgYSBjaG9pY2UuIE9ubHkgdGhlCiAgICAgICAgIGNvbG91ciBzZXBhcmF0ZXMgdGhlbS4gKi8KICAgICAgLnJlc3VsdCAuY3RhLXJvdyBidXR0b24uYmFjayB7CiAgICAgICAgcGFkZGluZzogOXB4IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMi41cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsKICAgICAgfQogICAgICAucmVzdWx0IC5jdGEtcm93IGJ1dHRvbi5iYWNrOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5lbXB0eSB7IGNvbG9yOiB2YXIoLS1mZy1mYWludCk7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMTRweCAwOyB9CiAgICAgIC5zcGluIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDEwcHggMDsgfQogICAgICAvKiBUaGUgcHJvZHVjdCBncmlkLiBDb2x1bW4gY291bnQgaXMgbGVmdCB0byBhdXRvLWZpdCDigJQgdGhlIGNhcmQgaXMgYSB2ZXJ5CiAgICAgICAgIGRpZmZlcmVudCB3aWR0aCBpbiBkaWZmZXJlbnQgaG9zdHMsIGFuZCBhIGhhcmQtY29kZWQgMyBvdmVyZmxvd3MKICAgICAgICAgc2lkZXdheXMgaW4gYSBuYXJyb3cgb25lLiAqLwogICAgICAucGdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxMTJweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMCA0cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDc2cHg7CiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nLm5vbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwLjVweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgfQogICAgICAucGNlbGwgLnBuYW1lIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDU2MDsKICAgICAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgICAgICAvKiBOYW1lcyBkaWZmZXIgaW4gbGVuZ3RoOyB1bmNsYW1wZWQgdGhleSBzdHJldGNoIGVhY2ggY2VsbCB0byBpdHMgb3duCiAgICAgICAgICAgaGVpZ2h0LiAqLwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnBjZWxsIC5wbWV0YSB7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLXRvcDogYXV0bzsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IH0KICAgICAgLnBjZWxsIC5wYnV5IHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDVweCAwOyB9CiAgICA8L3N0eWxlPgogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luPihmdW5jdGlvbigpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLnJlbExpc3Q7aWYobiYmbi5zdXBwb3J0cyYmbi5zdXBwb3J0cygibW9kdWxlcHJlbG9hZCIpKXJldHVybjtmb3IoY29uc3QgZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD0ibW9kdWxlcHJlbG9hZCJdJykpbyhlKTtuZXcgTXV0YXRpb25PYnNlcnZlcihlPT57Zm9yKGNvbnN0IGkgb2YgZSlpZihpLnR5cGU9PT0iY2hpbGRMaXN0Iilmb3IoY29uc3QgYSBvZiBpLmFkZGVkTm9kZXMpYS50YWdOYW1lPT09IkxJTksiJiZhLnJlbD09PSJtb2R1bGVwcmVsb2FkIiYmbyhhKX0pLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7ZnVuY3Rpb24gcihlKXtjb25zdCBpPXt9O3JldHVybiBlLmludGVncml0eSYmKGkuaW50ZWdyaXR5PWUuaW50ZWdyaXR5KSxlLnJlZmVycmVyUG9saWN5JiYoaS5yZWZlcnJlclBvbGljeT1lLnJlZmVycmVyUG9saWN5KSxlLmNyb3NzT3JpZ2luPT09InVzZS1jcmVkZW50aWFscyI/aS5jcmVkZW50aWFscz0iaW5jbHVkZSI6ZS5jcm9zc09yaWdpbj09PSJhbm9ueW1vdXMiP2kuY3JlZGVudGlhbHM9Im9taXQiOmkuY3JlZGVudGlhbHM9InNhbWUtb3JpZ2luIixpfWZ1bmN0aW9uIG8oZSl7aWYoZS5lcClyZXR1cm47ZS5lcD0hMDtjb25zdCBpPXIoZSk7ZmV0Y2goZS5ocmVmLGkpfX0pKCk7Y29uc3QgUm09Im1vZHVsZXByZWxvYWQiLENtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBVUkwodCxuKS5ocmVmfSxwcz17fSxBbT1mdW5jdGlvbihuLHIsbyl7bGV0IGU9UHJvbWlzZS5yZXNvbHZlKCk7aWYociYmci5sZW5ndGg+MCl7bGV0IGE9ZnVuY3Rpb24obCl7cmV0dXJuIFByb21pc2UuYWxsKGwubWFwKGc9PlByb21pc2UucmVzb2x2ZShnKS50aGVuKHY9Pih7c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnZ9KSx2PT4oe3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp2fSkpKSl9O2NvbnN0IHM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKSxjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXSIpLHU9Yz8ubm9uY2V8fGM/LmdldEF0dHJpYnV0ZSgibm9uY2UiKTtlPWEoci5tYXAobD0+e2lmKGw9Q20obCxvKSxsIGluIHBzKXJldHVybjtwc1tsXT0hMDtjb25zdCBnPWwuZW5kc1dpdGgoIi5jc3MiKSx2PWc/J1tyZWw9InN0eWxlc2hlZXQiXSc6IiI7aWYoISFvKWZvcihsZXQgSD1zLmxlbmd0aC0xO0g+PTA7SC0tKXtjb25zdCBMPXNbSF07aWYoTC5ocmVmPT09bCYmKCFnfHxMLnJlbD09PSJzdHlsZXNoZWV0IikpcmV0dXJufWVsc2UgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tocmVmPSIke2x9Il0ke3Z9YCkpcmV0dXJuO2NvbnN0IHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKHkucmVsPWc/InN0eWxlc2hlZXQiOlJtLGd8fCh5LmFzPSJzY3JpcHQiKSx5LmNyb3NzT3JpZ2luPSIiLHkuaHJlZj1sLHUmJnkuc2V0QXR0cmlidXRlKCJub25jZSIsdSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5KSxnKXJldHVybiBuZXcgUHJvbWlzZSgoSCxMKT0+e3kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSCkseS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKCk9PkwobmV3IEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7bH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShhKXtjb25zdCBzPW5ldyBFdmVudCgidml0ZTpwcmVsb2FkRXJyb3IiLHtjYW5jZWxhYmxlOiEwfSk7aWYocy5wYXlsb2FkPWEsd2luZG93LmRpc3BhdGNoRXZlbnQocyksIXMuZGVmYXVsdFByZXZlbnRlZCl0aHJvdyBhfXJldHVybiBlLnRoZW4oYT0+e2Zvcihjb25zdCBzIG9mIGF8fFtdKXMuc3RhdHVzPT09InJlamVjdGVkIiYmaShzLnJlYXNvbik7cmV0dXJuIG4oKS5jYXRjaChpKX0pfTt2YXIgZnM7Y29uc3QgZmk9T2JqZWN0LmZyZWV6ZSh7c3RhdHVzOiJhYm9ydGVkIn0pO2Z1bmN0aW9uIGQodCxuLHIpe2Z1bmN0aW9uIG8ocyxjKXtpZihzLl96b2R8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJfem9kIix7dmFsdWU6e2RlZjpjLGNvbnN0cjphLHRyYWl0czpuZXcgU2V0fSxlbnVtZXJhYmxlOiExfSkscy5fem9kLnRyYWl0cy5oYXModCkpcmV0dXJuO3MuX3pvZC50cmFpdHMuYWRkKHQpLG4ocyxjKTtjb25zdCB1PWEucHJvdG90eXBlLGw9T2JqZWN0LmtleXModSk7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2NvbnN0IHY9bFtnXTt2IGluIHN8fChzW3ZdPXVbdl0uYmluZChzKSl9fWNvbnN0IGU9cj8uUGFyZW50Pz9PYmplY3Q7Y2xhc3MgaSBleHRlbmRzIGV7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJuYW1lIix7dmFsdWU6dH0pO2Z1bmN0aW9uIGEocyl7dmFyIGM7Y29uc3QgdT1yPy5QYXJlbnQ/bmV3IGk6dGhpcztvKHUscyksKGM9dS5fem9kKS5kZWZlcnJlZD8/KGMuZGVmZXJyZWQ9W10pO2Zvcihjb25zdCBsIG9mIHUuX3pvZC5kZWZlcnJlZClsKCk7cmV0dXJuIHV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJpbml0Iix7dmFsdWU6b30pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6cz0+cj8uUGFyZW50JiZzIGluc3RhbmNlb2Ygci5QYXJlbnQ/ITA6cz8uX3pvZD8udHJhaXRzPy5oYXModCl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwibmFtZSIse3ZhbHVlOnR9KSxhfWNvbnN0IGdpPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3MgTmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCJFbmNvdW50ZXJlZCBQcm9taXNlIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZS4gVXNlIC5wYXJzZUFzeW5jKCkgaW5zdGVhZC4iKX19Y2xhc3MgV24gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihuKXtzdXBlcihgRW5jb3VudGVyZWQgdW5pZGlyZWN0aW9uYWwgdHJhbnNmb3JtIGR1cmluZyBlbmNvZGU6ICR7bn1gKSx0aGlzLm5hbWU9IlpvZEVuY29kZUVycm9yIn19KGZzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbENvbmZpZz8/KGZzLl9fem9kX2dsb2JhbENvbmZpZz17fSk7Y29uc3Qga3Q9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxDb25maWc7ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdCYmT2JqZWN0LmFzc2lnbihrdCx0KSxrdH1mdW5jdGlvbiBMbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBNbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBxbSh0KXt9ZnVuY3Rpb24gRm0odCl7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHZhbHVlIGluIGV4aGF1c3RpdmUgY2hlY2siKX1mdW5jdGlvbiBKbSh0KXt9ZnVuY3Rpb24gdmkodCl7Y29uc3Qgbj1PYmplY3QudmFsdWVzKHQpLmZpbHRlcihvPT50eXBlb2Ygbz09Im51bWJlciIpO3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtvLGVdKT0+bi5pbmRleE9mKCtvKT09PS0xKS5tYXAoKFtvLGVdKT0+ZSl9ZnVuY3Rpb24gXyh0LG49InwiKXtyZXR1cm4gdC5tYXAocj0+UyhyKSkuam9pbihuKX1mdW5jdGlvbiBSbih0LG4pe3JldHVybiB0eXBlb2Ygbj09ImJpZ2ludCI/bi50b1N0cmluZygpOm59ZnVuY3Rpb24gVHQodCl7cmV0dXJue2dldCB2YWx1ZSgpe3tjb25zdCBuPXQoKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZhbHVlIix7dmFsdWU6bn0pLG59fX19ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGx9ZnVuY3Rpb24gQm4odCl7Y29uc3Qgbj10LnN0YXJ0c1dpdGgoIl4iKT8xOjAscj10LmVuZHNXaXRoKCIkIik/dC5sZW5ndGgtMTp0Lmxlbmd0aDtyZXR1cm4gdC5zbGljZShuLHIpfWZ1bmN0aW9uIFdzKHQsbil7Y29uc3Qgcj10L24sbz1NYXRoLnJvdW5kKHIpLGU9TnVtYmVyLkVQU0lMT04qTWF0aC5tYXgoTWF0aC5hYnMociksMSk7cmV0dXJuIE1hdGguYWJzKHItbyk8ZT8wOnItb31jb25zdCBncz1TeW1ib2woImV2YWx1YXRpbmciKTtmdW5jdGlvbiBPKHQsbixyKXtsZXQgbztPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtnZXQoKXtpZihvIT09Z3MpcmV0dXJuIG89PT12b2lkIDAmJihvPWdzLG89cigpKSxvfSxzZXQoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZX0pfSxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBIbSh0KXtyZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpfWZ1bmN0aW9uIHhlKHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTpyLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9ZnVuY3Rpb24gJGUoLi4udCl7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpO09iamVjdC5hc3NpZ24obixvKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sbil9ZnVuY3Rpb24gV20odCl7cmV0dXJuICRlKHQuX3pvZC5kZWYpfWZ1bmN0aW9uIEJtKHQsbil7cmV0dXJuIG4/bi5yZWR1Y2UoKHIsbyk9PnI/LltvXSx0KTp0fWZ1bmN0aW9uIFZtKHQpe2NvbnN0IG49T2JqZWN0LmtleXModCkscj1uLm1hcChvPT50W29dKTtyZXR1cm4gUHJvbWlzZS5hbGwocikudGhlbihvPT57Y29uc3QgZT17fTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyllW25baV1dPW9baV07cmV0dXJuIGV9KX1mdW5jdGlvbiBLbSh0PTEwKXtjb25zdCBuPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0O28rKylyKz1uW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpuLmxlbmd0aCldO3JldHVybiByfWZ1bmN0aW9uIHNpKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiBCcyh0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpLnRyaW0oKS5yZXBsYWNlKC9bXlx3XHMtXS9nLCIiKS5yZXBsYWNlKC9bXHNfLV0rL2csIi0iKS5yZXBsYWNlKC9eLSt8LSskL2csIiIpfWNvbnN0IGhpPSJjYXB0dXJlU3RhY2tUcmFjZSJpbiBFcnJvcj9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZTooLi4udCk9Pnt9O2Z1bmN0aW9uIEhlKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSh0KX1jb25zdCBWcz1UdCgoKT0+e2lmKGt0LmppdGxlc3N8fHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5jbHVkZXMoIkNsb3VkZmxhcmUiKSlyZXR1cm4hMTt0cnl7Y29uc3QgdD1GdW5jdGlvbjtyZXR1cm4gbmV3IHQoIiIpLCEwfWNhdGNoe3JldHVybiExfX0pO2Z1bmN0aW9uIERlKHQpe2lmKEhlKHQpPT09ITEpcmV0dXJuITE7Y29uc3Qgbj10LmNvbnN0cnVjdG9yO2lmKG49PT12b2lkIDB8fHR5cGVvZiBuIT0iZnVuY3Rpb24iKXJldHVybiEwO2NvbnN0IHI9bi5wcm90b3R5cGU7cmV0dXJuIShIZShyKT09PSExfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiaXNQcm90b3R5cGVPZiIpPT09ITEpfWZ1bmN0aW9uIFZuKHQpe3JldHVybiBEZSh0KT97Li4udH06QXJyYXkuaXNBcnJheSh0KT9bLi4udF06dCBpbnN0YW5jZW9mIE1hcD9uZXcgTWFwKHQpOnQgaW5zdGFuY2VvZiBTZXQ/bmV3IFNldCh0KTp0fWZ1bmN0aW9uIEdtKHQpe2xldCBuPTA7Zm9yKGNvbnN0IHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmbisrO3JldHVybiBufWNvbnN0IFhtPXQ9Pntjb25zdCBuPXR5cGVvZiB0O3N3aXRjaChuKXtjYXNlInVuZGVmaW5lZCI6cmV0dXJuInVuZGVmaW5lZCI7Y2FzZSJzdHJpbmciOnJldHVybiJzdHJpbmciO2Nhc2UibnVtYmVyIjpyZXR1cm4gTnVtYmVyLmlzTmFOKHQpPyJuYW4iOiJudW1iZXIiO2Nhc2UiYm9vbGVhbiI6cmV0dXJuImJvb2xlYW4iO2Nhc2UiZnVuY3Rpb24iOnJldHVybiJmdW5jdGlvbiI7Y2FzZSJiaWdpbnQiOnJldHVybiJiaWdpbnQiO2Nhc2Uic3ltYm9sIjpyZXR1cm4ic3ltYm9sIjtjYXNlIm9iamVjdCI6cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0PT09bnVsbD8ibnVsbCI6dC50aGVuJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiZ0LmNhdGNoJiZ0eXBlb2YgdC5jYXRjaD09ImZ1bmN0aW9uIj8icHJvbWlzZSI6dHlwZW9mIE1hcDwidSImJnQgaW5zdGFuY2VvZiBNYXA/Im1hcCI6dHlwZW9mIFNldDwidSImJnQgaW5zdGFuY2VvZiBTZXQ/InNldCI6dHlwZW9mIERhdGU8InUiJiZ0IGluc3RhbmNlb2YgRGF0ZT8iZGF0ZSI6dHlwZW9mIEZpbGU8InUiJiZ0IGluc3RhbmNlb2YgRmlsZT8iZmlsZSI6Im9iamVjdCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlOiAke259YCl9fSxDbj1uZXcgU2V0KFsic3RyaW5nIiwibnVtYmVyIiwic3ltYm9sIl0pLEtzPW5ldyBTZXQoWyJzdHJpbmciLCJudW1iZXIiLCJiaWdpbnQiLCJib29sZWFuIiwic3ltYm9sIiwidW5kZWZpbmVkIl0pO2Z1bmN0aW9uIGJlKHQpe3JldHVybiB0LnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIil9ZnVuY3Rpb24gZGUodCxuLHIpe2NvbnN0IG89bmV3IHQuX3pvZC5jb25zdHIobj8/dC5fem9kLmRlZik7cmV0dXJuKCFufHxyPy5wYXJlbnQpJiYoby5fem9kLnBhcmVudD10KSxvfWZ1bmN0aW9uIGgodCl7Y29uc3Qgbj10O2lmKCFuKXJldHVybnt9O2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm57ZXJyb3I6KCk9Pm59O2lmKG4/Lm1lc3NhZ2UhPT12b2lkIDApe2lmKG4/LmVycm9yIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNwZWNpZnkgYm90aCBgbWVzc2FnZWAgYW5kIGBlcnJvcmAgcGFyYW1zIik7bi5lcnJvcj1uLm1lc3NhZ2V9cmV0dXJuIGRlbGV0ZSBuLm1lc3NhZ2UsdHlwZW9mIG4uZXJyb3I9PSJzdHJpbmciP3suLi5uLGVycm9yOigpPT5uLmVycm9yfTpufWZ1bmN0aW9uIFltKHQpe2xldCBuO3JldHVybiBuZXcgUHJveHkoe30se2dldChyLG8sZSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXQobixvLGUpfSxzZXQocixvLGUsaSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5zZXQobixvLGUsaSl9LGhhcyhyLG8pe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuaGFzKG4sbyl9LGRlbGV0ZVByb3BlcnR5KHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShuLG8pfSxvd25LZXlzKHIpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3Qub3duS2V5cyhuKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixvKX0sZGVmaW5lUHJvcGVydHkocixvLGUpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkobixvLGUpfX0pfWZ1bmN0aW9uIFModCl7cmV0dXJuIHR5cGVvZiB0PT0iYmlnaW50Ij90LnRvU3RyaW5nKCkrIm4iOnR5cGVvZiB0PT0ic3RyaW5nIj9gIiR7dH0iYDpgJHt0fWB9ZnVuY3Rpb24gR3ModCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcihuPT50W25dLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiJiZ0W25dLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIil9Y29uc3QgWHM9e3NhZmVpbnQ6W051bWJlci5NSU5fU0FGRV9JTlRFR0VSLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXSxpbnQzMjpbLTIxNDc0ODM2NDgsMjE0NzQ4MzY0N10sdWludDMyOlswLDQyOTQ5NjcyOTVdLGZsb2F0MzI6Wy0zNDAyODIzNDY2Mzg1Mjg4NmUyMiwzNDAyODIzNDY2Mzg1Mjg4NmUyMl0sZmxvYXQ2NDpbLU51bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRV19LFlzPXtpbnQ2NDpbQmlnSW50KCItOTIyMzM3MjAzNjg1NDc3NTgwOCIpLEJpZ0ludCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpXSx1aW50NjQ6W0JpZ0ludCgwKSxCaWdJbnQoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IildfTtmdW5jdGlvbiBRcyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIucGljaygpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9e307Zm9yKGNvbnN0IHMgaW4gbil7aWYoIShzIGluIHIuc2hhcGUpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7c30iYCk7bltzXSYmKGFbc109ci5zaGFwZVtzXSl9cmV0dXJuIHhlKHRoaXMsInNoYXBlIixhKSxhfSxjaGVja3M6W119KTtyZXR1cm4gZGUodCxpKX1mdW5jdGlvbiBlYyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIub21pdCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9ey4uLnQuX3pvZC5kZWYuc2hhcGV9O2Zvcihjb25zdCBzIGluIG4pe2lmKCEocyBpbiByLnNoYXBlKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6ICIke3N9ImApO25bc10mJmRlbGV0ZSBhW3NdfXJldHVybiB4ZSh0aGlzLCJzaGFwZSIsYSksYX0sY2hlY2tzOltdfSk7cmV0dXJuIGRlKHQsaSl9ZnVuY3Rpb24gdGModCxuKXtpZighRGUobikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvIGV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPXQuX3pvZC5kZWYuY2hlY2tzO2lmKHImJnIubGVuZ3RoPjApe2NvbnN0IGk9dC5fem9kLmRlZi5zaGFwZTtmb3IoY29uc3QgYSBpbiBuKWlmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxhKSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBvdmVyd3JpdGUga2V5cyBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzLiBVc2UgYC5zYWZlRXh0ZW5kKClgIGluc3RlYWQuIil9Y29uc3QgZT0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBpPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm59O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsaSksaX19KTtyZXR1cm4gZGUodCxlKX1mdW5jdGlvbiBuYyh0LG4pe2lmKCFEZShuKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gc2FmZUV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IG89ey4uLnQuX3pvZC5kZWYuc2hhcGUsLi4ubn07cmV0dXJuIHhlKHRoaXMsInNoYXBlIixvKSxvfX0pO3JldHVybiBkZSh0LHIpfWZ1bmN0aW9uIHJjKHQsbil7aWYodC5fem9kLmRlZi5jaGVja3M/Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIi5tZXJnZSgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMuIFVzZSAuc2FmZUV4dGVuZCgpIGluc3RlYWQuIik7Y29uc3Qgcj0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBvPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm4uX3pvZC5kZWYuc2hhcGV9O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsbyksb30sZ2V0IGNhdGNoYWxsKCl7cmV0dXJuIG4uX3pvZC5kZWYuY2F0Y2hhbGx9LGNoZWNrczpuLl96b2QuZGVmLmNoZWNrcz8/W119KTtyZXR1cm4gZGUodCxyKX1mdW5jdGlvbiBpYyh0LG4scil7Y29uc3QgZT1uLl96b2QuZGVmLmNoZWNrcztpZihlJiZlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiLnBhcnRpYWwoKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIik7Y29uc3QgYT0kZShuLl96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBzPW4uX3pvZC5kZWYuc2hhcGUsYz17Li4uc307aWYocilmb3IoY29uc3QgdSBpbiByKXtpZighKHUgaW4gcykpdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiAiJHt1fSJgKTtyW3VdJiYoY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdKX1lbHNlIGZvcihjb25zdCB1IGluIHMpY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdO3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsYyksY30sY2hlY2tzOltdfSk7cmV0dXJuIGRlKG4sYSl9ZnVuY3Rpb24gb2ModCxuLHIpe2NvbnN0IG89JGUobi5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3QgZT1uLl96b2QuZGVmLnNoYXBlLGk9ey4uLmV9O2lmKHIpZm9yKGNvbnN0IGEgaW4gcil7aWYoIShhIGluIGkpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7YX0iYCk7clthXSYmKGlbYV09bmV3IHQoe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6ZVthXX0pKX1lbHNlIGZvcihjb25zdCBhIGluIGUpaVthXT1uZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTplW2FdfSk7cmV0dXJuIHhlKHRoaXMsInNoYXBlIixpKSxpfX0pO3JldHVybiBkZShuLG8pfWZ1bmN0aW9uIFBlKHQsbj0wKXtpZih0LmFib3J0ZWQ9PT0hMClyZXR1cm4hMDtmb3IobGV0IHI9bjtyPHQuaXNzdWVzLmxlbmd0aDtyKyspaWYodC5pc3N1ZXNbcl0/LmNvbnRpbnVlIT09ITApcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gYWModCxuPTApe2lmKHQuYWJvcnRlZD09PSEwKXJldHVybiEwO2ZvcihsZXQgcj1uO3I8dC5pc3N1ZXMubGVuZ3RoO3IrKylpZih0Lmlzc3Vlc1tyXT8uY29udGludWU9PT0hMSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBmZSh0LG4pe3JldHVybiBuLm1hcChyPT57dmFyIG87cmV0dXJuKG89cikucGF0aD8/KG8ucGF0aD1bXSksci5wYXRoLnVuc2hpZnQodCkscn0pfWZ1bmN0aW9uICR0KHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dDp0Py5tZXNzYWdlfWZ1bmN0aW9uIGxlKHQsbixyKXtjb25zdCBvPXQubWVzc2FnZT90Lm1lc3NhZ2U6JHQodC5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lih0KSk/PyR0KG4/LmVycm9yPy4odCkpPz8kdChyLmN1c3RvbUVycm9yPy4odCkpPz8kdChyLmxvY2FsZUVycm9yPy4odCkpPz8iSW52YWxpZCBpbnB1dCIse2luc3Q6ZSxjb250aW51ZTppLGlucHV0OmEsLi4uc309dDtyZXR1cm4gcy5wYXRoPz8ocy5wYXRoPVtdKSxzLm1lc3NhZ2U9byxuPy5yZXBvcnRJbnB1dCYmKHMuaW5wdXQ9YSksc31mdW5jdGlvbiBLbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFNldD8ic2V0Ijp0IGluc3RhbmNlb2YgTWFwPyJtYXAiOnQgaW5zdGFuY2VvZiBGaWxlPyJmaWxlIjoidW5rbm93biJ9ZnVuY3Rpb24gR24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0eXBlb2YgdD09InN0cmluZyI/InN0cmluZyI6InVua25vd24ifWZ1bmN0aW9uIHcodCl7Y29uc3Qgbj10eXBlb2YgdDtzd2l0Y2gobil7Y2FzZSJudW1iZXIiOnJldHVybiBOdW1iZXIuaXNOYU4odCk/Im5hbiI6Im51bWJlciI7Y2FzZSJvYmplY3QiOntpZih0PT09bnVsbClyZXR1cm4ibnVsbCI7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4iYXJyYXkiO2NvbnN0IHI9dDtpZihyJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YocikhPT1PYmplY3QucHJvdG90eXBlJiYiY29uc3RydWN0b3IiaW4gciYmci5jb25zdHJ1Y3RvcilyZXR1cm4gci5jb25zdHJ1Y3Rvci5uYW1lfX1yZXR1cm4gbn1mdW5jdGlvbiBXZSguLi50KXtjb25zdFtuLHIsb109dDtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciP3ttZXNzYWdlOm4sY29kZToiY3VzdG9tIixpbnB1dDpyLGluc3Q6b306ey4uLm59fWZ1bmN0aW9uIFFtKHQpe3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtuLHJdKT0+TnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChuLDEwKSkpLm1hcChuPT5uWzFdKX1mdW5jdGlvbiBzYyh0KXtjb25zdCBuPWF0b2IodCkscj1uZXcgVWludDhBcnJheShuLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspcltvXT1uLmNoYXJDb2RlQXQobyk7cmV0dXJuIHJ9ZnVuY3Rpb24gY2ModCl7bGV0IG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W3JdKTtyZXR1cm4gYnRvYShuKX1mdW5jdGlvbiBlcCh0KXtjb25zdCBuPXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikscj0iPSIucmVwZWF0KCg0LW4ubGVuZ3RoJTQpJTQpO3JldHVybiBzYyhuK3IpfWZ1bmN0aW9uIHRwKHQpe3JldHVybiBjYyh0KS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9ZnVuY3Rpb24gbnAodCl7Y29uc3Qgbj10LnJlcGxhY2UoL14weC8sIiIpO2lmKG4ubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aCIpO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgvMik7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKz0yKXJbby8yXT1OdW1iZXIucGFyc2VJbnQobi5zbGljZShvLG8rMiksMTYpO3JldHVybiByfWZ1bmN0aW9uIHJwKHQpe3JldHVybiBBcnJheS5mcm9tKHQpLm1hcChuPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWNsYXNzIGlwe2NvbnN0cnVjdG9yKC4uLm4pe319Y29uc3QgJGk9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLEJJR0lOVF9GT1JNQVRfUkFOR0VTOllzLENsYXNzOmlwLE5VTUJFUl9GT1JNQVRfUkFOR0VTOlhzLGFib3J0ZWQ6UGUsYWxsb3dzRXZhbDpWcyxhc3NlcnQ6Sm0sYXNzZXJ0RXF1YWw6TG0sYXNzZXJ0SXM6cW0sYXNzZXJ0TmV2ZXI6Rm0sYXNzZXJ0Tm90RXF1YWw6TW0sYXNzaWduUHJvcDp4ZSxiYXNlNjRUb1VpbnQ4QXJyYXk6c2MsYmFzZTY0dXJsVG9VaW50OEFycmF5OmVwLGNhY2hlZDpUdCxjYXB0dXJlU3RhY2tUcmFjZTpoaSxjbGVhbkVudW06UW0sY2xlYW5SZWdleDpCbixjbG9uZTpkZSxjbG9uZURlZjpXbSxjcmVhdGVUcmFuc3BhcmVudFByb3h5OlltLGRlZmluZUxhenk6Tyxlc2M6c2ksZXNjYXBlUmVnZXg6YmUsZXhwbGljaXRseUFib3J0ZWQ6YWMsZXh0ZW5kOnRjLGZpbmFsaXplSXNzdWU6bGUsZmxvYXRTYWZlUmVtYWluZGVyOldzLGdldEVsZW1lbnRBdFBhdGg6Qm0sZ2V0RW51bVZhbHVlczp2aSxnZXRMZW5ndGhhYmxlT3JpZ2luOkduLGdldFBhcnNlZFR5cGU6WG0sZ2V0U2l6YWJsZU9yaWdpbjpLbixoZXhUb1VpbnQ4QXJyYXk6bnAsaXNPYmplY3Q6SGUsaXNQbGFpbk9iamVjdDpEZSxpc3N1ZTpXZSxqb2luVmFsdWVzOl8sanNvblN0cmluZ2lmeVJlcGxhY2VyOlJuLG1lcmdlOnJjLG1lcmdlRGVmczokZSxub3JtYWxpemVQYXJhbXM6aCxudWxsaXNoOkFlLG51bUtleXM6R20sb2JqZWN0Q2xvbmU6SG0sb21pdDplYyxvcHRpb25hbEtleXM6R3MscGFyc2VkVHlwZTp3LHBhcnRpYWw6aWMscGljazpRcyxwcmVmaXhJc3N1ZXM6ZmUscHJpbWl0aXZlVHlwZXM6S3MscHJvbWlzZUFsbE9iamVjdDpWbSxwcm9wZXJ0eUtleVR5cGVzOkNuLHJhbmRvbVN0cmluZzpLbSxyZXF1aXJlZDpvYyxzYWZlRXh0ZW5kOm5jLHNoYWxsb3dDbG9uZTpWbixzbHVnaWZ5OkJzLHN0cmluZ2lmeVByaW1pdGl2ZTpTLHVpbnQ4QXJyYXlUb0Jhc2U2NDpjYyx1aW50OEFycmF5VG9CYXNlNjR1cmw6dHAsdWludDhBcnJheVRvSGV4OnJwLHVud3JhcE1lc3NhZ2U6JHR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksdWM9KHQsbik9Pnt0Lm5hbWU9IiRab2RFcnJvciIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl96b2QiLHt2YWx1ZTp0Ll96b2QsZW51bWVyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJpc3N1ZXMiLHt2YWx1ZTpuLGVudW1lcmFibGU6ITF9KSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkobixSbiwyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidG9TdHJpbmciLHt2YWx1ZTooKT0+dC5tZXNzYWdlLGVudW1lcmFibGU6ITF9KX0sX2k9ZCgiJFpvZEVycm9yIix1YyksbWU9ZCgiJFpvZEVycm9yIix1Yyx7UGFyZW50OkVycm9yfSk7ZnVuY3Rpb24gWG4odCxuPXI9PnIubWVzc2FnZSl7Y29uc3Qgcj17fSxvPVtdO2Zvcihjb25zdCBlIG9mIHQuaXNzdWVzKWUucGF0aC5sZW5ndGg+MD8ocltlLnBhdGhbMF1dPXJbZS5wYXRoWzBdXXx8W10scltlLnBhdGhbMF1dLnB1c2gobihlKSkpOm8ucHVzaChuKGUpKTtyZXR1cm57Zm9ybUVycm9yczpvLGZpZWxkRXJyb3JzOnJ9fWZ1bmN0aW9uIFluKHQsbj1yPT5yLm1lc3NhZ2Upe2NvbnN0IHI9e19lcnJvcnM6W119LG89KGUsaT1bXSk9Pntmb3IoY29uc3QgYSBvZiBlLmlzc3VlcylpZihhLmNvZGU9PT0iaW52YWxpZF91bmlvbiImJmEuZXJyb3JzLmxlbmd0aClhLmVycm9ycy5tYXAocz0+byh7aXNzdWVzOnN9LFsuLi5pLC4uLmEucGF0aF0pKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2tleSIpbyh7aXNzdWVzOmEuaXNzdWVzfSxbLi4uaSwuLi5hLnBhdGhdKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2VsZW1lbnQiKW8oe2lzc3VlczphLmlzc3Vlc30sWy4uLmksLi4uYS5wYXRoXSk7ZWxzZXtjb25zdCBzPVsuLi5pLC4uLmEucGF0aF07aWYocy5sZW5ndGg9PT0wKXIuX2Vycm9ycy5wdXNoKG4oYSkpO2Vsc2V7bGV0IGM9cix1PTA7Zm9yKDt1PHMubGVuZ3RoOyl7Y29uc3QgbD1zW3VdO3U9PT1zLmxlbmd0aC0xPyhjW2xdPWNbbF18fHtfZXJyb3JzOltdfSxjW2xdLl9lcnJvcnMucHVzaChuKGEpKSk6Y1tsXT1jW2xdfHx7X2Vycm9yczpbXX0sYz1jW2xdLHUrK319fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBiaSh0LG49cj0+ci5tZXNzYWdlKXtjb25zdCByPXtlcnJvcnM6W119LG89KGUsaT1bXSk9Pnt2YXIgYSxzO2Zvcihjb25zdCBjIG9mIGUuaXNzdWVzKWlmKGMuY29kZT09PSJpbnZhbGlkX3VuaW9uIiYmYy5lcnJvcnMubGVuZ3RoKWMuZXJyb3JzLm1hcCh1PT5vKHtpc3N1ZXM6dX0sWy4uLmksLi4uYy5wYXRoXSkpO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfa2V5IilvKHtpc3N1ZXM6Yy5pc3N1ZXN9LFsuLi5pLC4uLmMucGF0aF0pO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfZWxlbWVudCIpbyh7aXNzdWVzOmMuaXNzdWVzfSxbLi4uaSwuLi5jLnBhdGhdKTtlbHNle2NvbnN0IHU9Wy4uLmksLi4uYy5wYXRoXTtpZih1Lmxlbmd0aD09PTApe3IuZXJyb3JzLnB1c2gobihjKSk7Y29udGludWV9bGV0IGw9cixnPTA7Zm9yKDtnPHUubGVuZ3RoOyl7Y29uc3Qgdj11W2ddLCQ9Zz09PXUubGVuZ3RoLTE7dHlwZW9mIHY9PSJzdHJpbmciPyhsLnByb3BlcnRpZXM/PyhsLnByb3BlcnRpZXM9e30pLChhPWwucHJvcGVydGllcylbdl0/PyhhW3ZdPXtlcnJvcnM6W119KSxsPWwucHJvcGVydGllc1t2XSk6KGwuaXRlbXM/PyhsLml0ZW1zPVtdKSwocz1sLml0ZW1zKVt2XT8/KHNbdl09e2Vycm9yczpbXX0pLGw9bC5pdGVtc1t2XSksJCYmbC5lcnJvcnMucHVzaChuKGMpKSxnKyt9fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBsYyh0KXtjb25zdCBuPVtdLHI9dC5tYXAobz0+dHlwZW9mIG89PSJvYmplY3QiP28ua2V5Om8pO2Zvcihjb25zdCBvIG9mIHIpdHlwZW9mIG89PSJudW1iZXIiP24ucHVzaChgWyR7b31dYCk6dHlwZW9mIG89PSJzeW1ib2wiP24ucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG8pKX1dYCk6L1teXHckXS8udGVzdChvKT9uLnB1c2goYFske0pTT04uc3RyaW5naWZ5KG8pfV1gKToobi5sZW5ndGgmJm4ucHVzaCgiLiIpLG4ucHVzaChvKSk7cmV0dXJuIG4uam9pbigiIil9ZnVuY3Rpb24geWkodCl7Y29uc3Qgbj1bXSxyPVsuLi50Lmlzc3Vlc10uc29ydCgobyxlKT0+KG8ucGF0aD8/W10pLmxlbmd0aC0oZS5wYXRoPz9bXSkubGVuZ3RoKTtmb3IoY29uc3QgbyBvZiByKW4ucHVzaChg4pyWICR7by5tZXNzYWdlfWApLG8ucGF0aD8ubGVuZ3RoJiZuLnB1c2goYCAg4oaSIGF0ICR7bGMoby5wYXRoKX1gKTtyZXR1cm4gbi5qb2luKGAKYCl9Y29uc3QganQ9dD0+KG4scixvLGUpPT57Y29uc3QgaT1vP3suLi5vLGFzeW5jOiExfTp7YXN5bmM6ITF9LGE9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGkpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBOZTtpZihhLmlzc3Vlcy5sZW5ndGgpe2NvbnN0IHM9bmV3KGU/LkVycj8/dCkoYS5pc3N1ZXMubWFwKGM9PmxlKGMsaSxLKCkpKSk7dGhyb3cgaGkocyxlPy5jYWxsZWUpLHN9cmV0dXJuIGEudmFsdWV9LGNpPWp0KG1lKSxPdD10PT5hc3luYyhuLHIsbyxlKT0+e2NvbnN0IGk9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgYT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0saSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UmJihhPWF3YWl0IGEpLGEuaXNzdWVzLmxlbmd0aCl7Y29uc3Qgcz1uZXcoZT8uRXJyPz90KShhLmlzc3Vlcy5tYXAoYz0+bGUoYyxpLEsoKSkpKTt0aHJvdyBoaShzLGU/LmNhbGxlZSksc31yZXR1cm4gYS52YWx1ZX0sdWk9T3QobWUpLFV0PXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sYXN5bmM6ITF9Onthc3luYzohMX0saT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7aWYoaSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiBpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3KHQ/P19pKShpLmlzc3Vlcy5tYXAoYT0+bGUoYSxlLEsoKSkpKX06e3N1Y2Nlc3M6ITAsZGF0YTppLnZhbHVlfX0sa2k9VXQobWUpLFB0PXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgaT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlJiYoaT1hd2FpdCBpKSxpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3IHQoaS5pc3N1ZXMubWFwKGE9PmxlKGEsZSxLKCkpKSl9OntzdWNjZXNzOiEwLGRhdGE6aS52YWx1ZX19LGRjPVB0KG1lKSxTaT10PT4obixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBqdCh0KShuLHIsZSl9LG9wPVNpKG1lKSx3aT10PT4obixyLG8pPT5qdCh0KShuLHIsbyksYXA9d2kobWUpLElpPXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxkaXJlY3Rpb246ImJhY2t3YXJkIn06e2RpcmVjdGlvbjoiYmFja3dhcmQifTtyZXR1cm4gT3QodCkobixyLGUpfSxzcD1JaShtZSksemk9dD0+YXN5bmMobixyLG8pPT5PdCh0KShuLHIsbyksY3A9emkobWUpLHhpPXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sZGlyZWN0aW9uOiJiYWNrd2FyZCJ9OntkaXJlY3Rpb246ImJhY2t3YXJkIn07cmV0dXJuIFV0KHQpKG4scixlKX0sdXA9eGkobWUpLFRpPXQ9PihuLHIsbyk9PlV0KHQpKG4scixvKSxscD1UaShtZSksamk9dD0+YXN5bmMobixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBQdCh0KShuLHIsZSl9LGRwPWppKG1lKSxPaT10PT5hc3luYyhuLHIsbyk9PlB0KHQpKG4scixvKSxtcD1PaShtZSksbWM9L15bY0NdWzAtOWEtel17Nix9JC8scGM9L15bMC05YS16XSskLyxmYz0vXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC8sZ2M9L15bMC05YS12QS1WXXsyMH0kLyx2Yz0vXltBLVphLXowLTldezI3fSQvLGhjPS9eW2EtekEtWjAtOV8tXXsyMX0kLywkYz0vXlAoPzooXGQrVyl8KD8hLipXKSg/PVxkfFRcZCkoXGQrWSk/KFxkK00pPyhcZCtEKT8oVCg/PVxkKShcZCtIKT8oXGQrTSk/KFxkKyhbLixdXGQrKT9TKT8pPykkLyxwcD0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLF9jPS9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLyxCZT10PT50P25ldyBSZWdFeHAoYF4oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tJHt0fVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9KSRgKTovXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMS04XVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMHxmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYpJC8sZnA9QmUoNCksZ3A9QmUoNiksdnA9QmUoNyksYmM9L14oPyFcLikoPyEuKlwuXC4pKFtBLVphLXowLTlfJytcLVwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVwtXSpcLikrW0EtWmEtel17Mix9JC8saHA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sJHA9L14oKFtePD4oKVxbXF1cXC4sOzpcc0AiXSsoXC5bXjw+KClcW1xdXFwuLDs6XHNAIl0rKSopfCgiLisiKSlAKChcW1swLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31dKXwoKFthLXpBLVpcLTAtOV0rXC4pK1thLXpBLVpdezIsfSkpJC8seWM9L15bXlxzQCJdezEsNjR9QFteXHNAXXsxLDI1NX0kL3UsX3A9eWMsYnA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8seXA9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2Z1bmN0aW9uIGtjKCl7cmV0dXJuIG5ldyBSZWdFeHAoeXAsInUiKX1jb25zdCBTYz0vXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC8sd2M9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KSkkLyxJYz10PT57Y29uc3Qgbj1iZSh0Pz8iOiIpO3JldHVybiBuZXcgUmVnRXhwKGBeKD86WzAtOUEtRl17Mn0ke259KXs1fVswLTlBLUZdezJ9JHxeKD86WzAtOWEtZl17Mn0ke259KXs1fVswLTlhLWZdezJ9JGApfSx6Yz0vXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC8oWzAtOV18WzEtMl1bMC05XXwzWzAtMl0pJC8seGM9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18Ojp8KFswLTlhLWZBLUZdezEsNH0pPzo6KFswLTlhLWZBLUZdezEsNH06Pyl7MCw2fSlcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC8sVGM9L14kfF4oPzpbMC05YS16QS1aKy9dezR9KSooPzooPzpbMC05YS16QS1aKy9dezJ9PT0pfCg/OlswLTlhLXpBLVorL117M309KSk/JC8sVWk9L15bQS1aYS16MC05Xy1dKiQvLGpjPS9eKD89LnsxLDI1M31cLj8kKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbLTAtOWEtekEtWl17MCw2MX1bMC05YS16QS1aXSk/KSpcLj8kLyxPYz0vXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cLikrW2EtekEtWl17Mix9JC8sUGk9L15odHRwcz8kLyxVYz0vXlwrWzEtOV1cZHs2LDE0fSQvLFBjPSIoPzooPzpcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKD86KD86MFsxMzU3OF18MVswMl0pLSg/OjBbMS05XXxbMTJdXFxkfDNbMDFdKXwoPzowWzQ2OV18MTEpLSg/OjBbMS05XXxbMTJdXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXGR8MlswLThdKSkpIixOYz1uZXcgUmVnRXhwKGBeJHtQY30kYCk7ZnVuY3Rpb24gRGModCl7Y29uc3Qgbj0iKD86WzAxXVxcZHwyWzAtM10pOlswLTVdXFxkIjtyZXR1cm4gdHlwZW9mIHQucHJlY2lzaW9uPT0ibnVtYmVyIj90LnByZWNpc2lvbj09PS0xP2Ake259YDp0LnByZWNpc2lvbj09PTA/YCR7bn06WzAtNV1cXGRgOmAke259OlswLTVdXFxkXFwuXFxkeyR7dC5wcmVjaXNpb259fWA6YCR7bn0oPzo6WzAtNV1cXGQoPzpcXC5cXGQrKT8pP2B9ZnVuY3Rpb24gRWModCl7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke0RjKHQpfSRgKX1mdW5jdGlvbiBaYyh0KXtjb25zdCBuPURjKHtwcmVjaXNpb246dC5wcmVjaXNpb259KSxyPVsiWiJdO3QubG9jYWwmJnIucHVzaCgiIiksdC5vZmZzZXQmJnIucHVzaCgiKFsrLV0oPzpbMDFdXFxkfDJbMC0zXSk6WzAtNV1cXGQpIik7Y29uc3Qgbz1gJHtufSg/OiR7ci5qb2luKCJ8Iil9KWA7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke1BjfVQoPzoke299KSRgKX1jb25zdCBSYz10PT57Y29uc3Qgbj10P2BbXFxzXFxTXXske3Q/Lm1pbmltdW0/PzB9LCR7dD8ubWF4aW11bT8/IiJ9fWA6IltcXHNcXFNdKiI7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke259JGApfSxDYz0vXi0/XGQrbj8kLyxBYz0vXi0/XGQrJC8sTmk9L14tP1xkKyg/OlwuXGQrKT8kLyxMYz0vXig/OnRydWV8ZmFsc2UpJC9pLE1jPS9ebnVsbCQvaSxxYz0vXnVuZGVmaW5lZCQvaSxGYz0vXlteQS1aXSokLyxKYz0vXlteYS16XSokLyxIYz0vXlswLTlhLWZBLUZdKiQvO2Z1bmN0aW9uIE50KHQsbil7cmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Ky9deyR7dH19JHtufSRgKX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHt0fX0kYCl9Y29uc3Qga3A9L15bMC05YS1mQS1GXXszMn0kLyxTcD1OdCgyMiwiPT0iKSx3cD1EdCgyMiksSXA9L15bMC05YS1mQS1GXXs0MH0kLyx6cD1OdCgyNywiPSIpLHhwPUR0KDI3KSxUcD0vXlswLTlhLWZBLUZdezY0fSQvLGpwPU50KDQzLCI9IiksT3A9RHQoNDMpLFVwPS9eWzAtOWEtZkEtRl17OTZ9JC8sUHA9TnQoNjQsIiIpLE5wPUR0KDY0KSxEcD0vXlswLTlhLWZBLUZdezEyOH0kLyxFcD1OdCg4NiwiPT0iKSxacD1EdCg4NiksUW49T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLGJhc2U2NDpUYyxiYXNlNjR1cmw6VWksYmlnaW50OkNjLGJvb2xlYW46TGMsYnJvd3NlckVtYWlsOmJwLGNpZHJ2NDp6YyxjaWRydjY6eGMsY3VpZDptYyxjdWlkMjpwYyxkYXRlOk5jLGRhdGV0aW1lOlpjLGRvbWFpbjpPYyxkdXJhdGlvbjokYyxlMTY0OlVjLGVtYWlsOmJjLGVtb2ppOmtjLGV4dGVuZGVkRHVyYXRpb246cHAsZ3VpZDpfYyxoZXg6SGMsaG9zdG5hbWU6amMsaHRtbDVFbWFpbDpocCxodHRwUHJvdG9jb2w6UGksaWRuRW1haWw6X3AsaW50ZWdlcjpBYyxpcHY0OlNjLGlwdjY6d2Msa3N1aWQ6dmMsbG93ZXJjYXNlOkZjLG1hYzpJYyxtZDVfYmFzZTY0OlNwLG1kNV9iYXNlNjR1cmw6d3AsbWQ1X2hleDprcCxuYW5vaWQ6aGMsbnVsbDpNYyxudW1iZXI6TmkscmZjNTMyMkVtYWlsOiRwLHNoYTFfYmFzZTY0OnpwLHNoYTFfYmFzZTY0dXJsOnhwLHNoYTFfaGV4OklwLHNoYTI1Nl9iYXNlNjQ6anAsc2hhMjU2X2Jhc2U2NHVybDpPcCxzaGEyNTZfaGV4OlRwLHNoYTM4NF9iYXNlNjQ6UHAsc2hhMzg0X2Jhc2U2NHVybDpOcCxzaGEzODRfaGV4OlVwLHNoYTUxMl9iYXNlNjQ6RXAsc2hhNTEyX2Jhc2U2NHVybDpacCxzaGE1MTJfaGV4OkRwLHN0cmluZzpSYyx0aW1lOkVjLHVsaWQ6ZmMsdW5kZWZpbmVkOnFjLHVuaWNvZGVFbWFpbDp5Yyx1cHBlcmNhc2U6SmMsdXVpZDpCZSx1dWlkNDpmcCx1dWlkNjpncCx1dWlkNzp2cCx4aWQ6Z2N9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksSj1kKCIkWm9kQ2hlY2siLCh0LG4pPT57dmFyIHI7dC5fem9kPz8odC5fem9kPXt9KSx0Ll96b2QuZGVmPW4sKHI9dC5fem9kKS5vbmF0dGFjaD8/KHIub25hdHRhY2g9W10pfSksV2M9e251bWJlcjoibnVtYmVyIixiaWdpbnQ6ImJpZ2ludCIsb2JqZWN0OiJkYXRlIn0sRGk9ZCgiJFpvZENoZWNrTGVzc1RoYW4iLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1XY1t0eXBlb2Ygbi52YWx1ZV07dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZyxpPShuLmluY2x1c2l2ZT9lLm1heGltdW06ZS5leGNsdXNpdmVNYXhpbXVtKT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24udmFsdWU8aSYmKG4uaW5jbHVzaXZlP2UubWF4aW11bT1uLnZhbHVlOmUuZXhjbHVzaXZlTWF4aW11bT1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1vPT57KG4uaW5jbHVzaXZlP28udmFsdWU8PW4udmFsdWU6by52YWx1ZTxuLnZhbHVlKXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOnIsY29kZToidG9vX2JpZyIsbWF4aW11bTp0eXBlb2Ygbi52YWx1ZT09Im9iamVjdCI/bi52YWx1ZS5nZXRUaW1lKCk6bi52YWx1ZSxpbnB1dDpvLnZhbHVlLGluY2x1c2l2ZTpuLmluY2x1c2l2ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxFaT1kKCIkWm9kQ2hlY2tHcmVhdGVyVGhhbiIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPVdjW3R5cGVvZiBuLnZhbHVlXTt0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLGk9KG4uaW5jbHVzaXZlP2UubWluaW11bTplLmV4Y2x1c2l2ZU1pbmltdW0pPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi52YWx1ZT5pJiYobi5pbmNsdXNpdmU/ZS5taW5pbXVtPW4udmFsdWU6ZS5leGNsdXNpdmVNaW5pbXVtPW4udmFsdWUpfSksdC5fem9kLmNoZWNrPW89Pnsobi5pbmNsdXNpdmU/by52YWx1ZT49bi52YWx1ZTpvLnZhbHVlPm4udmFsdWUpfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46cixjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06dHlwZW9mIG4udmFsdWU9PSJvYmplY3QiP24udmFsdWUuZ2V0VGltZSgpOm4udmFsdWUsaW5wdXQ6by52YWx1ZSxpbmNsdXNpdmU6bi5pbmNsdXNpdmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksQmM9ZCgiJFpvZENoZWNrTXVsdGlwbGVPZiIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2Qub25hdHRhY2gucHVzaChyPT57dmFyIG87KG89ci5fem9kLmJhZykubXVsdGlwbGVPZj8/KG8ubXVsdGlwbGVPZj1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1yPT57aWYodHlwZW9mIHIudmFsdWUhPXR5cGVvZiBuLnZhbHVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1peCBudW1iZXIgYW5kIGJpZ2ludCBpbiBtdWx0aXBsZV9vZiBjaGVjay4iKTsodHlwZW9mIHIudmFsdWU9PSJiaWdpbnQiP3IudmFsdWUlbi52YWx1ZT09PUJpZ0ludCgwKTpXcyhyLnZhbHVlLG4udmFsdWUpPT09MCl8fHIuaXNzdWVzLnB1c2goe29yaWdpbjp0eXBlb2Ygci52YWx1ZSxjb2RlOiJub3RfbXVsdGlwbGVfb2YiLGRpdmlzb3I6bi52YWx1ZSxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFZjPWQoIiRab2RDaGVja051bWJlckZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKSxuLmZvcm1hdD1uLmZvcm1hdHx8ImZsb2F0NjQiO2NvbnN0IHI9bi5mb3JtYXQ/LmluY2x1ZGVzKCJpbnQiKSxvPXI/ImludCI6Im51bWJlciIsW2UsaV09WHNbbi5mb3JtYXRdO3QuX3pvZC5vbmF0dGFjaC5wdXNoKGE9Pntjb25zdCBzPWEuX3pvZC5iYWc7cy5mb3JtYXQ9bi5mb3JtYXQscy5taW5pbXVtPWUscy5tYXhpbXVtPWksciYmKHMucGF0dGVybj1BYyl9KSx0Ll96b2QuY2hlY2s9YT0+e2NvbnN0IHM9YS52YWx1ZTtpZihyKXtpZighTnVtYmVyLmlzSW50ZWdlcihzKSl7YS5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6byxmb3JtYXQ6bi5mb3JtYXQsY29kZToiaW52YWxpZF90eXBlIixjb250aW51ZTohMSxpbnB1dDpzLGluc3Q6dH0pO3JldHVybn1pZighTnVtYmVyLmlzU2FmZUludGVnZXIocykpe3M+MD9hLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19iaWciLG1heGltdW06TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbm90ZToiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS4iLGluc3Q6dCxvcmlnaW46byxpbmNsdXNpdmU6ITAsY29udGludWU6IW4uYWJvcnR9KTphLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19zbWFsbCIsbWluaW11bTpOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixub3RlOiJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLiIsaW5zdDp0LG9yaWdpbjpvLGluY2x1c2l2ZTohMCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn19czxlJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06ZSxpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSkscz5pJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOmksaW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEtjPWQoIiRab2RDaGVja0JpZ0ludEZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdFtyLG9dPVlzW24uZm9ybWF0XTt0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kuZm9ybWF0PW4uZm9ybWF0LGkubWluaW11bT1yLGkubWF4aW11bT1vfSksdC5fem9kLmNoZWNrPWU9Pntjb25zdCBpPWUudmFsdWU7aTxyJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cixpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSksaT5vJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOm8saW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEdjPWQoIiRab2RDaGVja01heFNpemUiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2Uuc2l6ZTw9bi5tYXhpbXVtfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46S24oZSksY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksWGM9ZCgiJFpvZENoZWNrTWluU2l6ZSIsKHQsbik9Pnt2YXIgcjtKLmluaXQodCxuKSwocj10Ll96b2QuZGVmKS53aGVuPz8oci53aGVuPW89Pntjb25zdCBlPW8udmFsdWU7cmV0dXJuIUFlKGUpJiZlLnNpemUhPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLm1pbmltdW0/P051bWJlci5ORUdBVElWRV9JTkZJTklUWTtuLm1pbmltdW0+ZSYmKG8uX3pvZC5iYWcubWluaW11bT1uLm1pbmltdW0pfSksdC5fem9kLmNoZWNrPW89Pntjb25zdCBlPW8udmFsdWU7ZS5zaXplPj1uLm1pbmltdW18fG8uaXNzdWVzLnB1c2goe29yaWdpbjpLbihlKSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06bi5taW5pbXVtLGluY2x1c2l2ZTohMCxpbnB1dDplLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFljPWQoIiRab2RDaGVja1NpemVFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLm1pbmltdW09bi5zaXplLGUubWF4aW11bT1uLnNpemUsZS5zaXplPW4uc2l6ZX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlLGk9ZS5zaXplO2lmKGk9PT1uLnNpemUpcmV0dXJuO2NvbnN0IGE9aT5uLnNpemU7by5pc3N1ZXMucHVzaCh7b3JpZ2luOktuKGUpLC4uLmE/e2NvZGU6InRvb19iaWciLG1heGltdW06bi5zaXplfTp7Y29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4uc2l6ZX0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksUWM9ZCgiJFpvZENoZWNrTWF4TGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPD1uLm1heGltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksZXU9ZCgiJFpvZENoZWNrTWluTGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5taW5pbXVtPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5taW5pbXVtPmUmJihvLl96b2QuYmFnLm1pbmltdW09bi5taW5pbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPj1uLm1pbmltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4ubWluaW11bSxpbmNsdXNpdmU6ITAsaW5wdXQ6ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSx0dT1kKCIkWm9kQ2hlY2tMZW5ndGhFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5sZW5ndGghPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UubWluaW11bT1uLmxlbmd0aCxlLm1heGltdW09bi5sZW5ndGgsZS5sZW5ndGg9bi5sZW5ndGh9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZSxpPWUubGVuZ3RoO2lmKGk9PT1uLmxlbmd0aClyZXR1cm47Y29uc3QgYT1HbihlKSxzPWk+bi5sZW5ndGg7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsLi4ucz97Y29kZToidG9vX2JpZyIsbWF4aW11bTpuLmxlbmd0aH06e2NvZGU6InRvb19zbWFsbCIsbWluaW11bTpuLmxlbmd0aH0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksRXQ9ZCgiJFpvZENoZWNrU3RyaW5nRm9ybWF0IiwodCxuKT0+e3ZhciByLG87Si5pbml0KHQsbiksdC5fem9kLm9uYXR0YWNoLnB1c2goZT0+e2NvbnN0IGk9ZS5fem9kLmJhZztpLmZvcm1hdD1uLmZvcm1hdCxuLnBhdHRlcm4mJihpLnBhdHRlcm5zPz8oaS5wYXR0ZXJucz1uZXcgU2V0KSxpLnBhdHRlcm5zLmFkZChuLnBhdHRlcm4pKX0pLG4ucGF0dGVybj8ocj10Ll96b2QpLmNoZWNrPz8oci5jaGVjaz1lPT57bi5wYXR0ZXJuLmxhc3RJbmRleD0wLCFuLnBhdHRlcm4udGVzdChlLnZhbHVlKSYmZS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQsaW5wdXQ6ZS52YWx1ZSwuLi5uLnBhdHRlcm4/e3BhdHRlcm46bi5wYXR0ZXJuLnRvU3RyaW5nKCl9Ont9LGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfSk6KG89dC5fem9kKS5jaGVjaz8/KG8uY2hlY2s9KCk9Pnt9KX0pLG51PWQoIiRab2RDaGVja1JlZ2V4IiwodCxuKT0+e0V0LmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e24ucGF0dGVybi5sYXN0SW5kZXg9MCwhbi5wYXR0ZXJuLnRlc3Qoci52YWx1ZSkmJnIuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJyZWdleCIsaW5wdXQ6ci52YWx1ZSxwYXR0ZXJuOm4ucGF0dGVybi50b1N0cmluZygpLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLHJ1PWQoIiRab2RDaGVja0xvd2VyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RmMpLEV0LmluaXQodCxuKX0pLGl1PWQoIiRab2RDaGVja1VwcGVyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49SmMpLEV0LmluaXQodCxuKX0pLG91PWQoIiRab2RDaGVja0luY2x1ZGVzIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9YmUobi5pbmNsdWRlcyksbz1uZXcgUmVnRXhwKHR5cGVvZiBuLnBvc2l0aW9uPT0ibnVtYmVyIj9gXi57JHtuLnBvc2l0aW9ufX0ke3J9YDpyKTtuLnBhdHRlcm49byx0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kucGF0dGVybnM/PyhpLnBhdHRlcm5zPW5ldyBTZXQpLGkucGF0dGVybnMuYWRkKG8pfSksdC5fem9kLmNoZWNrPWU9PntlLnZhbHVlLmluY2x1ZGVzKG4uaW5jbHVkZXMsbi5wb3NpdGlvbil8fGUuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsaW5jbHVkZXM6bi5pbmNsdWRlcyxpbnB1dDplLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGF1PWQoIiRab2RDaGVja1N0YXJ0c1dpdGgiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgUmVnRXhwKGBeJHtiZShuLnByZWZpeCl9LipgKTtuLnBhdHRlcm4/PyhuLnBhdHRlcm49ciksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLnBhdHRlcm5zPz8oZS5wYXR0ZXJucz1uZXcgU2V0KSxlLnBhdHRlcm5zLmFkZChyKX0pLHQuX3pvZC5jaGVjaz1vPT57by52YWx1ZS5zdGFydHNXaXRoKG4ucHJlZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InN0YXJ0c193aXRoIixwcmVmaXg6bi5wcmVmaXgsaW5wdXQ6by52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxzdT1kKCIkWm9kQ2hlY2tFbmRzV2l0aCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPW5ldyBSZWdFeHAoYC4qJHtiZShuLnN1ZmZpeCl9JGApO24ucGF0dGVybj8/KG4ucGF0dGVybj1yKSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UucGF0dGVybnM/PyhlLnBhdHRlcm5zPW5ldyBTZXQpLGUucGF0dGVybnMuYWRkKHIpfSksdC5fem9kLmNoZWNrPW89PntvLnZhbHVlLmVuZHNXaXRoKG4uc3VmZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImVuZHNfd2l0aCIsc3VmZml4Om4uc3VmZml4LGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gdnModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSl9Y29uc3QgY3U9ZCgiJFpvZENoZWNrUHJvcGVydHkiLCh0LG4pPT57Si5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPW4uc2NoZW1hLl96b2QucnVuKHt2YWx1ZTpyLnZhbHVlW24ucHJvcGVydHldLGlzc3VlczpbXX0se30pO2lmKG8gaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBvLnRoZW4oZT0+dnMoZSxyLG4ucHJvcGVydHkpKTt2cyhvLHIsbi5wcm9wZXJ0eSl9fSksdXU9ZCgiJFpvZENoZWNrTWltZVR5cGUiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgU2V0KG4ubWltZSk7dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e28uX3pvZC5iYWcubWltZT1uLm1pbWV9KSx0Ll96b2QuY2hlY2s9bz0+e3IuaGFzKG8udmFsdWUudHlwZSl8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLHZhbHVlczpuLm1pbWUsaW5wdXQ6by52YWx1ZS50eXBlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGx1PWQoIiRab2RDaGVja092ZXJ3cml0ZSIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3IudmFsdWU9bi50eChyLnZhbHVlKX19KTtjbGFzcyBkdXtjb25zdHJ1Y3RvcihuPVtdKXt0aGlzLmNvbnRlbnQ9W10sdGhpcy5pbmRlbnQ9MCx0aGlzJiYodGhpcy5hcmdzPW4pfWluZGVudGVkKG4pe3RoaXMuaW5kZW50Kz0xLG4odGhpcyksdGhpcy5pbmRlbnQtPTF9d3JpdGUobil7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe24odGhpcyx7ZXhlY3V0aW9uOiJzeW5jIn0pLG4odGhpcyx7ZXhlY3V0aW9uOiJhc3luYyJ9KTtyZXR1cm59Y29uc3Qgbz1uLnNwbGl0KGAKYCkuZmlsdGVyKGE9PmEpLGU9TWF0aC5taW4oLi4uby5tYXAoYT0+YS5sZW5ndGgtYS50cmltU3RhcnQoKS5sZW5ndGgpKSxpPW8ubWFwKGE9PmEuc2xpY2UoZSkpLm1hcChhPT4iICIucmVwZWF0KHRoaXMuaW5kZW50KjIpK2EpO2Zvcihjb25zdCBhIG9mIGkpdGhpcy5jb250ZW50LnB1c2goYSl9Y29tcGlsZSgpe2NvbnN0IG49RnVuY3Rpb24scj10aGlzPy5hcmdzLGU9Wy4uLih0aGlzPy5jb250ZW50Pz9bIiJdKS5tYXAoaT0+YCAgJHtpfWApXTtyZXR1cm4gbmV3IG4oLi4ucixlLmpvaW4oYApgKSl9fWNvbnN0IG11PXttYWpvcjo0LG1pbm9yOjQscGF0Y2g6M30seD1kKCIkWm9kVHlwZSIsKHQsbik9Pnt2YXIgcjt0Pz8odD17fSksdC5fem9kLmRlZj1uLHQuX3pvZC5iYWc9dC5fem9kLmJhZ3x8e30sdC5fem9kLnZlcnNpb249bXU7Y29uc3Qgbz1bLi4udC5fem9kLmRlZi5jaGVja3M/P1tdXTt0Ll96b2QudHJhaXRzLmhhcygiJFpvZENoZWNrIikmJm8udW5zaGlmdCh0KTtmb3IoY29uc3QgZSBvZiBvKWZvcihjb25zdCBpIG9mIGUuX3pvZC5vbmF0dGFjaClpKHQpO2lmKG8ubGVuZ3RoPT09MCkocj10Ll96b2QpLmRlZmVycmVkPz8oci5kZWZlcnJlZD1bXSksdC5fem9kLmRlZmVycmVkPy5wdXNoKCgpPT57dC5fem9kLnJ1bj10Ll96b2QucGFyc2V9KTtlbHNle2NvbnN0IGU9KGEscyxjKT0+e2xldCB1PVBlKGEpLGw7Zm9yKGNvbnN0IGcgb2Ygcyl7aWYoZy5fem9kLmRlZi53aGVuKXtpZihhYyhhKXx8IWcuX3pvZC5kZWYud2hlbihhKSljb250aW51ZX1lbHNlIGlmKHUpY29udGludWU7Y29uc3Qgdj1hLmlzc3Vlcy5sZW5ndGgsJD1nLl96b2QuY2hlY2soYSk7aWYoJCBpbnN0YW5jZW9mIFByb21pc2UmJmM/LmFzeW5jPT09ITEpdGhyb3cgbmV3IE5lO2lmKGx8fCQgaW5zdGFuY2VvZiBQcm9taXNlKWw9KGw/P1Byb21pc2UucmVzb2x2ZSgpKS50aGVuKGFzeW5jKCk9Pnthd2FpdCAkLGEuaXNzdWVzLmxlbmd0aCE9PXYmJih1fHwodT1QZShhLHYpKSl9KTtlbHNle2lmKGEuaXNzdWVzLmxlbmd0aD09PXYpY29udGludWU7dXx8KHU9UGUoYSx2KSl9fXJldHVybiBsP2wudGhlbigoKT0+YSk6YX0saT0oYSxzLGMpPT57aWYoUGUoYSkpcmV0dXJuIGEuYWJvcnRlZD0hMCxhO2NvbnN0IHU9ZShzLG8sYyk7aWYodSBpbnN0YW5jZW9mIFByb21pc2Upe2lmKGMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIHUudGhlbihsPT50Ll96b2QucGFyc2UobCxjKSl9cmV0dXJuIHQuX3pvZC5wYXJzZSh1LGMpfTt0Ll96b2QucnVuPShhLHMpPT57aWYocy5za2lwQ2hlY2tzKXJldHVybiB0Ll96b2QucGFyc2UoYSxzKTtpZihzLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpe2NvbnN0IHU9dC5fem9kLnBhcnNlKHt2YWx1ZTphLnZhbHVlLGlzc3VlczpbXX0sey4uLnMsc2tpcENoZWNrczohMH0pO3JldHVybiB1IGluc3RhbmNlb2YgUHJvbWlzZT91LnRoZW4obD0+aShsLGEscykpOmkodSxhLHMpfWNvbnN0IGM9dC5fem9kLnBhcnNlKGEscyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2Upe2lmKHMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIGMudGhlbih1PT5lKHUsbyxzKSl9cmV0dXJuIGUoYyxvLHMpfX1PKHQsIn5zdGFuZGFyZCIsKCk9Pih7dmFsaWRhdGU6ZT0+e3RyeXtjb25zdCBpPWtpKHQsZSk7cmV0dXJuIGkuc3VjY2Vzcz97dmFsdWU6aS5kYXRhfTp7aXNzdWVzOmkuZXJyb3I/Lmlzc3Vlc319Y2F0Y2h7cmV0dXJuIGRjKHQsZSkudGhlbihhPT5hLnN1Y2Nlc3M/e3ZhbHVlOmEuZGF0YX06e2lzc3VlczphLmVycm9yPy5pc3N1ZXN9KX19LHZlbmRvcjoiem9kIix2ZXJzaW9uOjF9KSl9KSxadD1kKCIkWm9kU3RyaW5nIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPVsuLi50Py5fem9kLmJhZz8ucGF0dGVybnM/P1tdXS5wb3AoKT8/UmModC5fem9kLmJhZyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9U3RyaW5nKHIudmFsdWUpfWNhdGNoe31yZXR1cm4gdHlwZW9mIHIudmFsdWU9PSJzdHJpbmcifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscn19KSxGPWQoIiRab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57RXQuaW5pdCh0LG4pLFp0LmluaXQodCxuKX0pLHB1PWQoIiRab2RHVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1fYyksRi5pbml0KHQsbil9KSxmdT1kKCIkWm9kVVVJRCIsKHQsbik9PntpZihuLnZlcnNpb24pe2NvbnN0IG89e3YxOjEsdjI6Mix2MzozLHY0OjQsdjU6NSx2Njo2LHY3Ojcsdjg6OH1bbi52ZXJzaW9uXTtpZihvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVVUlEIHZlcnNpb246ICIke24udmVyc2lvbn0iYCk7bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPUJlKG8pKX1lbHNlIG4ucGF0dGVybj8/KG4ucGF0dGVybj1CZSgpKTtGLmluaXQodCxuKX0pLGd1PWQoIiRab2RFbWFpbCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49YmMpLEYuaW5pdCh0LG4pfSksdnU9ZCgiJFpvZFVSTCIsKHQsbik9PntGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3RyeXtjb25zdCBvPXIudmFsdWUudHJpbSgpO2lmKCFuLm5vcm1hbGl6ZSYmbi5wcm90b2NvbD8uc291cmNlPT09UGkuc291cmNlJiYhL15odHRwcz86XC9cLy9pLnRlc3Qobykpe3IuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InVybCIsbm90ZToiSW52YWxpZCBVUkwgZm9ybWF0IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn1jb25zdCBlPW5ldyBVUkwobyk7bi5ob3N0bmFtZSYmKG4uaG9zdG5hbWUubGFzdEluZGV4PTAsbi5ob3N0bmFtZS50ZXN0KGUuaG9zdG5hbWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgaG9zdG5hbWUiLHBhdHRlcm46bi5ob3N0bmFtZS5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5wcm90b2NvbCYmKG4ucHJvdG9jb2wubGFzdEluZGV4PTAsbi5wcm90b2NvbC50ZXN0KGUucHJvdG9jb2wuZW5kc1dpdGgoIjoiKT9lLnByb3RvY29sLnNsaWNlKDAsLTEpOmUucHJvdG9jb2wpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgcHJvdG9jb2wiLHBhdHRlcm46bi5wcm90b2NvbC5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5ub3JtYWxpemU/ci52YWx1ZT1lLmhyZWY6ci52YWx1ZT1vO3JldHVybn1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fX0pLGh1PWQoIiRab2RFbW9qaSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49a2MoKSksRi5pbml0KHQsbil9KSwkdT1kKCIkWm9kTmFub0lEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1oYyksRi5pbml0KHQsbil9KSxfdT1kKCIkWm9kQ1VJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49bWMpLEYuaW5pdCh0LG4pfSksYnU9ZCgiJFpvZENVSUQyIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1wYyksRi5pbml0KHQsbil9KSx5dT1kKCIkWm9kVUxJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49ZmMpLEYuaW5pdCh0LG4pfSksa3U9ZCgiJFpvZFhJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49Z2MpLEYuaW5pdCh0LG4pfSksU3U9ZCgiJFpvZEtTVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj12YyksRi5pbml0KHQsbil9KSx3dT1kKCIkWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVpjKG4pKSxGLmluaXQodCxuKX0pLEl1PWQoIiRab2RJU09EYXRlIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1OYyksRi5pbml0KHQsbil9KSx6dT1kKCIkWm9kSVNPVGltZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RWMobikpLEYuaW5pdCh0LG4pfSkseHU9ZCgiJFpvZElTT0R1cmF0aW9uIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj0kYyksRi5pbml0KHQsbil9KSxUdT1kKCIkWm9kSVB2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49U2MpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJpcHY0In0pLGp1PWQoIiRab2RJUHY2IiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj13YyksRi5pbml0KHQsbiksdC5fem9kLmJhZy5mb3JtYXQ9ImlwdjYiLHQuX3pvZC5jaGVjaz1yPT57dHJ5e25ldyBVUkwoYGh0dHA6Ly9bJHtyLnZhbHVlfV1gKX1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpcHY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KSxPdT1kKCIkWm9kTUFDIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1JYyhuLmRlbGltaXRlcikpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJtYWMifSksVXU9ZCgiJFpvZENJRFJ2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49emMpLEYuaW5pdCh0LG4pfSksUHU9ZCgiJFpvZENJRFJ2NiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49eGMpLEYuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57Y29uc3Qgbz1yLnZhbHVlLnNwbGl0KCIvIik7dHJ5e2lmKG8ubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3I7Y29uc3RbZSxpXT1vO2lmKCFpKXRocm93IG5ldyBFcnJvcjtjb25zdCBhPU51bWJlcihpKTtpZihgJHthfWAhPT1pKXRocm93IG5ldyBFcnJvcjtpZihhPDB8fGE+MTI4KXRocm93IG5ldyBFcnJvcjtuZXcgVVJMKGBodHRwOi8vWyR7ZX1dYCl9Y2F0Y2h7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiY2lkcnY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KTtmdW5jdGlvbiBaaSh0KXtpZih0PT09IiIpcmV0dXJuITA7aWYoL1xzLy50ZXN0KHQpfHx0Lmxlbmd0aCU0IT09MClyZXR1cm4hMTt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0IE51PWQoIiRab2RCYXNlNjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVRjKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZz0iYmFzZTY0Iix0Ll96b2QuY2hlY2s9cj0+e1ppKHIudmFsdWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJiYXNlNjQiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gRHUodCl7aWYoIVVpLnRlc3QodCkpcmV0dXJuITE7Y29uc3Qgbj10LnJlcGxhY2UoL1stX10vZyxvPT5vPT09Ii0iPyIrIjoiLyIpLHI9bi5wYWRFbmQoTWF0aC5jZWlsKG4ubGVuZ3RoLzQpKjQsIj0iKTtyZXR1cm4gWmkocil9Y29uc3QgRXU9ZCgiJFpvZEJhc2U2NFVSTCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWkpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuY29udGVudEVuY29kaW5nPSJiYXNlNjR1cmwiLHQuX3pvZC5jaGVjaz1yPT57RHUoci52YWx1ZSl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImJhc2U2NHVybCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxadT1kKCIkWm9kRTE2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWMpLEYuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gUnUodCxuPW51bGwpe3RyeXtjb25zdCByPXQuc3BsaXQoIi4iKTtpZihyLmxlbmd0aCE9PTMpcmV0dXJuITE7Y29uc3Rbb109cjtpZighbylyZXR1cm4hMTtjb25zdCBlPUpTT04ucGFyc2UoYXRvYihvKSk7cmV0dXJuISgidHlwImluIGUmJmU/LnR5cCE9PSJKV1QifHwhZS5hbGd8fG4mJighKCJhbGciaW4gZSl8fGUuYWxnIT09bikpfWNhdGNoe3JldHVybiExfX1jb25zdCBDdT1kKCIkWm9kSldUIiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57UnUoci52YWx1ZSxuLmFsZyl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6Imp3dCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxBdT1kKCIkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0IiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57bi5mbihyLnZhbHVlKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDpuLmZvcm1hdCxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFJpPWQoIiRab2ROdW1iZXIiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49dC5fem9kLmJhZy5wYXR0ZXJuPz9OaSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1OdW1iZXIoci52YWx1ZSl9Y2F0Y2h7fWNvbnN0IGU9ci52YWx1ZTtpZih0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNOYU4oZSkmJk51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gcjtjb25zdCBpPXR5cGVvZiBlPT0ibnVtYmVyIj9OdW1iZXIuaXNOYU4oZSk/Ik5hTiI6TnVtYmVyLmlzRmluaXRlKGUpP3ZvaWQgMDoiSW5maW5pdHkiOnZvaWQgMDtyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im51bWJlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dCwuLi5pP3tyZWNlaXZlZDppfTp7fX0pLHJ9fSksTHU9ZCgiJFpvZE51bWJlckZvcm1hdCIsKHQsbik9PntWYy5pbml0KHQsbiksUmkuaW5pdCh0LG4pfSksQ2k9ZCgiJFpvZEJvb2xlYW4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49TGMsdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9ISFyLnZhbHVlfWNhdGNoe31jb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJib29sZWFuIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxBaT1kKCIkWm9kQmlnSW50IiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPUNjLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG4uY29lcmNlKXRyeXtyLnZhbHVlPUJpZ0ludChyLnZhbHVlKX1jYXRjaHt9cmV0dXJuIHR5cGVvZiByLnZhbHVlPT0iYmlnaW50Inx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImJpZ2ludCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHJ9fSksTXU9ZCgiJFpvZEJpZ0ludEZvcm1hdCIsKHQsbik9PntLYy5pbml0KHQsbiksQWkuaW5pdCh0LG4pfSkscXU9ZCgiJFpvZFN5bWJvbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0ic3ltYm9sInx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InN5bWJvbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksRnU9ZCgiJFpvZFVuZGVmaW5lZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1xYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW3ZvaWQgMF0pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtyZXR1cm4gdHlwZW9mIGU+InUifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoidW5kZWZpbmVkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxKdT1kKCIkWm9kTnVsbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1NYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW251bGxdKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGU9PT1udWxsfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibnVsbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksSHU9ZCgiJFpvZEFueSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9cj0+cn0pLFd1PWQoIiRab2RVbmtub3duIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT1yPT5yfSksQnU9ZCgiJFpvZE5ldmVyIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+KHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJuZXZlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHIpfSksVnU9ZCgiJFpvZFZvaWQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiB0eXBlb2YgZT4idSJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJ2b2lkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxLdT1kKCIkWm9kRGF0ZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1uZXcgRGF0ZShyLnZhbHVlKX1jYXRjaHt9Y29uc3QgZT1yLnZhbHVlLGk9ZSBpbnN0YW5jZW9mIERhdGU7cmV0dXJuIGkmJiFOdW1iZXIuaXNOYU4oZS5nZXRUaW1lKCkpfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZGF0ZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLC4uLmk/e3JlY2VpdmVkOiJJbnZhbGlkIERhdGUifTp7fSxpbnN0OnR9KSxyfX0pO2Z1bmN0aW9uIGhzKHQsbixyKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4uZmUocix0Lmlzc3VlcykpLG4udmFsdWVbcl09dC52YWx1ZX1jb25zdCBHdT1kKCIkWm9kQXJyYXkiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiYXJyYXkiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyO3IudmFsdWU9QXJyYXkoZS5sZW5ndGgpO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IHM9ZVthXSxjPW4uZWxlbWVudC5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChjLnRoZW4odT0+aHModSxyLGEpKSk6aHMoYyxyLGEpfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIEFuKHQsbixyLG8sZSxpKXtjb25zdCBhPXIgaW4gbztpZih0Lmlzc3Vlcy5sZW5ndGgpe2lmKGUmJmkmJiFhKXJldHVybjtuLmlzc3Vlcy5wdXNoKC4uLmZlKHIsdC5pc3N1ZXMpKX1pZighYSYmIWUpe3QuaXNzdWVzLmxlbmd0aHx8bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnZvaWQgMCxwYXRoOltyXX0pO3JldHVybn10LnZhbHVlPT09dm9pZCAwP2EmJihuLnZhbHVlW3JdPXZvaWQgMCk6bi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFh1KHQpe2NvbnN0IG49T2JqZWN0LmtleXModC5zaGFwZSk7Zm9yKGNvbnN0IG8gb2YgbilpZighdC5zaGFwZT8uW29dPy5fem9kPy50cmFpdHM/LmhhcygiJFpvZFR5cGUiKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhdCBrZXkgIiR7b30iOiBleHBlY3RlZCBhIFpvZCBzY2hlbWFgKTtjb25zdCByPUdzKHQuc2hhcGUpO3JldHVybnsuLi50LGtleXM6bixrZXlTZXQ6bmV3IFNldChuKSxudW1LZXlzOm4ubGVuZ3RoLG9wdGlvbmFsS2V5czpuZXcgU2V0KHIpfX1mdW5jdGlvbiBZdSh0LG4scixvLGUsaSl7Y29uc3QgYT1bXSxzPWUua2V5U2V0LGM9ZS5jYXRjaGFsbC5fem9kLHU9Yy5kZWYudHlwZSxsPWMub3B0aW49PT0ib3B0aW9uYWwiLGc9Yy5vcHRvdXQ9PT0ib3B0aW9uYWwiO2Zvcihjb25zdCB2IGluIG4pe2lmKHY9PT0iX19wcm90b19fInx8cy5oYXModikpY29udGludWU7aWYodT09PSJuZXZlciIpe2EucHVzaCh2KTtjb250aW51ZX1jb25zdCAkPWMucnVuKHt2YWx1ZTpuW3ZdLGlzc3VlczpbXX0sbyk7JCBpbnN0YW5jZW9mIFByb21pc2U/dC5wdXNoKCQudGhlbih5PT5Bbih5LHIsdixuLGwsZykpKTpBbigkLHIsdixuLGwsZyl9cmV0dXJuIGEubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKHtjb2RlOiJ1bnJlY29nbml6ZWRfa2V5cyIsa2V5czphLGlucHV0Om4saW5zdDppfSksdC5sZW5ndGg/UHJvbWlzZS5hbGwodCkudGhlbigoKT0+cik6cn1jb25zdCBRdT1kKCIkWm9kT2JqZWN0IiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sInNoYXBlIik/LmdldCl7Y29uc3Qgcz1uLnNoYXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJzaGFwZSIse2dldDooKT0+e2NvbnN0IGM9ey4uLnN9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwic2hhcGUiLHt2YWx1ZTpjfSksY319KX1jb25zdCBvPVR0KCgpPT5YdShuKSk7Tyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT57Y29uc3Qgcz1uLnNoYXBlLGM9e307Zm9yKGNvbnN0IHUgaW4gcyl7Y29uc3QgbD1zW3VdLl96b2Q7aWYobC52YWx1ZXMpe2NbdV0/PyhjW3VdPW5ldyBTZXQpO2Zvcihjb25zdCBnIG9mIGwudmFsdWVzKWNbdV0uYWRkKGcpfX1yZXR1cm4gY30pO2NvbnN0IGU9SGUsaT1uLmNhdGNoYWxsO2xldCBhO3QuX3pvZC5wYXJzZT0ocyxjKT0+e2E/PyhhPW8udmFsdWUpO2NvbnN0IHU9cy52YWx1ZTtpZighZSh1KSlyZXR1cm4gcy5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im9iamVjdCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDp1LGluc3Q6dH0pLHM7cy52YWx1ZT17fTtjb25zdCBsPVtdLGc9YS5zaGFwZTtmb3IoY29uc3QgdiBvZiBhLmtleXMpe2NvbnN0ICQ9Z1t2XSx5PSQuX3pvZC5vcHRpbj09PSJvcHRpb25hbCIsSD0kLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIixMPSQuX3pvZC5ydW4oe3ZhbHVlOnVbdl0saXNzdWVzOltdfSxjKTtMIGluc3RhbmNlb2YgUHJvbWlzZT9sLnB1c2goTC50aGVuKHFlPT5BbihxZSxzLHYsdSx5LEgpKSk6QW4oTCxzLHYsdSx5LEgpfXJldHVybiBpP1l1KGwsdSxzLGMsby52YWx1ZSx0KTpsLmxlbmd0aD9Qcm9taXNlLmFsbChsKS50aGVuKCgpPT5zKTpzfX0pLGVsPWQoIiRab2RPYmplY3RKSVQiLCh0LG4pPT57UXUuaW5pdCh0LG4pO2NvbnN0IHI9dC5fem9kLnBhcnNlLG89VHQoKCk9Plh1KG4pKSxlPXY9Pntjb25zdCAkPW5ldyBkdShbInNoYXBlIiwicGF5bG9hZCIsImN0eCJdKSx5PW8udmFsdWUsSD1XPT57Y29uc3QgTT1zaShXKTtyZXR1cm5gc2hhcGVbJHtNfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtNfV0sIGlzc3VlczogW10gfSwgY3R4KWB9OyQud3JpdGUoImNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTsiKTtjb25zdCBMPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHFlPTA7Zm9yKGNvbnN0IFcgb2YgeS5rZXlzKUxbV109YGtleV8ke3FlKyt9YDskLndyaXRlKCJjb25zdCBuZXdSZXN1bHQgPSB7fTsiKTtmb3IoY29uc3QgVyBvZiB5LmtleXMpe2NvbnN0IE09TFtXXSxYPXNpKFcpLGRzPXZbV10sbXM9ZHM/Ll96b2Q/Lm9wdGluPT09Im9wdGlvbmFsIixabT1kcz8uX3pvZD8ub3B0b3V0PT09Im9wdGlvbmFsIjskLndyaXRlKGBjb25zdCAke019ID0gJHtIKFcpfTtgKSxtcyYmWm0/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske1h9LCAuLi5pc3MucGF0aF0gOiBbJHtYfV0KICAgICAgICAgICAgfSkpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6bXM/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAuLi5pc3MsCiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7WH0sIC4uLmlzcy5wYXRoXSA6IFske1h9XQogICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6JC53cml0ZShgCiAgICAgICAgY29uc3QgJHtNfV9wcmVzZW50ID0gJHtYfSBpbiBpbnB1dDsKICAgICAgICBpZiAoJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IHBheWxvYWQuaXNzdWVzLmNvbmNhdCgke019Lmlzc3Vlcy5tYXAoaXNzID0+ICh7CiAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtYfSwgLi4uaXNzLnBhdGhdIDogWyR7WH1dCiAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICBpZiAoISR7TX1fcHJlc2VudCAmJiAhJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHsKICAgICAgICAgICAgY29kZTogImludmFsaWRfdHlwZSIsCiAgICAgICAgICAgIGV4cGVjdGVkOiAibm9ub3B0aW9uYWwiLAogICAgICAgICAgICBpbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICBwYXRoOiBbJHtYfV0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR7TX1fcHJlc2VudCkgewogICAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGApfSQud3JpdGUoInBheWxvYWQudmFsdWUgPSBuZXdSZXN1bHQ7IiksJC53cml0ZSgicmV0dXJuIHBheWxvYWQ7Iik7Y29uc3QgRz0kLmNvbXBpbGUoKTtyZXR1cm4oVyxNKT0+Ryh2LFcsTSl9O2xldCBpO2NvbnN0IGE9SGUscz0ha3Quaml0bGVzcyx1PXMmJlZzLnZhbHVlLGw9bi5jYXRjaGFsbDtsZXQgZzt0Ll96b2QucGFyc2U9KHYsJCk9PntnPz8oZz1vLnZhbHVlKTtjb25zdCB5PXYudmFsdWU7cmV0dXJuIGEoeSk/cyYmdSYmJD8uYXN5bmM9PT0hMSYmJC5qaXRsZXNzIT09ITA/KGl8fChpPWUobi5zaGFwZSkpLHY9aSh2LCQpLGw/WXUoW10seSx2LCQsZyx0KTp2KTpyKHYsJCk6KHYuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJvYmplY3QiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6eSxpbnN0OnR9KSx2KX19KTtmdW5jdGlvbiAkcyh0LG4scixvKXtmb3IoY29uc3QgaSBvZiB0KWlmKGkuaXNzdWVzLmxlbmd0aD09PTApcmV0dXJuIG4udmFsdWU9aS52YWx1ZSxuO2NvbnN0IGU9dC5maWx0ZXIoaT0+IVBlKGkpKTtyZXR1cm4gZS5sZW5ndGg9PT0xPyhuLnZhbHVlPWVbMF0udmFsdWUsZVswXSk6KG4uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGlucHV0Om4udmFsdWUsaW5zdDpyLGVycm9yczp0Lm1hcChpPT5pLmlzc3Vlcy5tYXAoYT0+bGUoYSxvLEsoKSkpKX0pLG4pfWNvbnN0IGVyPWQoIiRab2RVbmlvbiIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLm9wdGlvbnMuc29tZShvPT5vLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3B0aW9ucy5zb21lKG89Pm8uX3pvZC5vcHRvdXQ9PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsInZhbHVlcyIsKCk9PntpZihuLm9wdGlvbnMuZXZlcnkobz0+by5fem9kLnZhbHVlcykpcmV0dXJuIG5ldyBTZXQobi5vcHRpb25zLmZsYXRNYXAobz0+QXJyYXkuZnJvbShvLl96b2QudmFsdWVzKSkpfSksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57aWYobi5vcHRpb25zLmV2ZXJ5KG89Pm8uX3pvZC5wYXR0ZXJuKSl7Y29uc3Qgbz1uLm9wdGlvbnMubWFwKGU9PmUuX3pvZC5wYXR0ZXJuKTtyZXR1cm4gbmV3IFJlZ0V4cChgXigke28ubWFwKGU9PkJuKGUuc291cmNlKSkuam9pbigifCIpfSkkYCl9fSk7Y29uc3Qgcj1uLm9wdGlvbnMubGVuZ3RoPT09MT9uLm9wdGlvbnNbMF0uX3pvZC5ydW46bnVsbDt0Ll96b2QucGFyc2U9KG8sZSk9PntpZihyKXJldHVybiByKG8sZSk7bGV0IGk9ITE7Y29uc3QgYT1bXTtmb3IoY29uc3QgcyBvZiBuLm9wdGlvbnMpe2NvbnN0IGM9cy5fem9kLnJ1bih7dmFsdWU6by52YWx1ZSxpc3N1ZXM6W119LGUpO2lmKGMgaW5zdGFuY2VvZiBQcm9taXNlKWEucHVzaChjKSxpPSEwO2Vsc2V7aWYoYy5pc3N1ZXMubGVuZ3RoPT09MClyZXR1cm4gYzthLnB1c2goYyl9fXJldHVybiBpP1Byb21pc2UuYWxsKGEpLnRoZW4ocz0+JHMocyxvLHQsZSkpOiRzKGEsbyx0LGUpfX0pO2Z1bmN0aW9uIF9zKHQsbixyLG8pe2NvbnN0IGU9dC5maWx0ZXIoaT0+aS5pc3N1ZXMubGVuZ3RoPT09MCk7cmV0dXJuIGUubGVuZ3RoPT09MT8obi52YWx1ZT1lWzBdLnZhbHVlLG4pOihlLmxlbmd0aD09PTA/bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOnQubWFwKGk9PmkuaXNzdWVzLm1hcChhPT5sZShhLG8sSygpKSkpfSk6bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOltdLGluY2x1c2l2ZTohMX0pLG4pfWNvbnN0IHRsPWQoIiRab2RYb3IiLCh0LG4pPT57ZXIuaW5pdCh0LG4pLG4uaW5jbHVzaXZlPSExO2NvbnN0IHI9bi5vcHRpb25zLmxlbmd0aD09PTE/bi5vcHRpb25zWzBdLl96b2QucnVuOm51bGw7dC5fem9kLnBhcnNlPShvLGUpPT57aWYocilyZXR1cm4gcihvLGUpO2xldCBpPSExO2NvbnN0IGE9W107Zm9yKGNvbnN0IHMgb2Ygbi5vcHRpb25zKXtjb25zdCBjPXMuX3pvZC5ydW4oe3ZhbHVlOm8udmFsdWUsaXNzdWVzOltdfSxlKTtjIGluc3RhbmNlb2YgUHJvbWlzZT8oYS5wdXNoKGMpLGk9ITApOmEucHVzaChjKX1yZXR1cm4gaT9Qcm9taXNlLmFsbChhKS50aGVuKHM9Pl9zKHMsbyx0LGUpKTpfcyhhLG8sdCxlKX19KSxubD1kKCIkWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e24uaW5jbHVzaXZlPSExLGVyLmluaXQodCxuKTtjb25zdCByPXQuX3pvZC5wYXJzZTtPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pntjb25zdCBlPXt9O2Zvcihjb25zdCBpIG9mIG4ub3B0aW9ucyl7Y29uc3QgYT1pLl96b2QucHJvcFZhbHVlcztpZighYXx8T2JqZWN0LmtleXMoYSkubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoaSl9ImApO2Zvcihjb25zdFtzLGNdb2YgT2JqZWN0LmVudHJpZXMoYSkpe2Vbc118fChlW3NdPW5ldyBTZXQpO2Zvcihjb25zdCB1IG9mIGMpZVtzXS5hZGQodSl9fXJldHVybiBlfSk7Y29uc3Qgbz1UdCgoKT0+e2NvbnN0IGU9bi5vcHRpb25zLGk9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBzPWEuX3pvZC5wcm9wVmFsdWVzPy5bbi5kaXNjcmltaW5hdG9yXTtpZighc3x8cy5zaXplPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoYSl9ImApO2Zvcihjb25zdCBjIG9mIHMpe2lmKGkuaGFzKGMpKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgIiR7U3RyaW5nKGMpfSJgKTtpLnNldChjLGEpfX1yZXR1cm4gaX0pO3QuX3pvZC5wYXJzZT0oZSxpKT0+e2NvbnN0IGE9ZS52YWx1ZTtpZighSGUoYSkpcmV0dXJuIGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6Im9iamVjdCIsaW5wdXQ6YSxpbnN0OnR9KSxlO2NvbnN0IHM9by52YWx1ZS5nZXQoYT8uW24uZGlzY3JpbWluYXRvcl0pO3JldHVybiBzP3MuX3pvZC5ydW4oZSxpKTpuLnVuaW9uRmFsbGJhY2t8fGkuZGlyZWN0aW9uPT09ImJhY2t3YXJkIj9yKGUsaSk6KGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGVycm9yczpbXSxub3RlOiJObyBtYXRjaGluZyBkaXNjcmltaW5hdG9yIixkaXNjcmltaW5hdG9yOm4uZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20oby52YWx1ZS5rZXlzKCkpLGlucHV0OmEscGF0aDpbbi5kaXNjcmltaW5hdG9yXSxpbnN0OnR9KSxlKX19KSxybD1kKCIkWm9kSW50ZXJzZWN0aW9uIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZSxpPW4ubGVmdC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pLGE9bi5yaWdodC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZXx8YSBpbnN0YW5jZW9mIFByb21pc2U/UHJvbWlzZS5hbGwoW2ksYV0pLnRoZW4oKFtjLHVdKT0+YnMocixjLHUpKTpicyhyLGksYSl9fSk7ZnVuY3Rpb24gbGkodCxuKXtpZih0PT09bilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUmJit0PT0rbilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZihEZSh0KSYmRGUobikpe2NvbnN0IHI9T2JqZWN0LmtleXMobiksbz1PYmplY3Qua2V5cyh0KS5maWx0ZXIoaT0+ci5pbmRleE9mKGkpIT09LTEpLGU9ey4uLnQsLi4ubn07Zm9yKGNvbnN0IGkgb2Ygbyl7Y29uc3QgYT1saSh0W2ldLG5baV0pO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbaSwuLi5hLm1lcmdlRXJyb3JQYXRoXX07ZVtpXT1hLmRhdGF9cmV0dXJue3ZhbGlkOiEwLGRhdGE6ZX19aWYoQXJyYXkuaXNBcnJheSh0KSYmQXJyYXkuaXNBcnJheShuKSl7aWYodC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm57dmFsaWQ6ITEsbWVyZ2VFcnJvclBhdGg6W119O2NvbnN0IHI9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGU9dFtvXSxpPW5bb10sYT1saShlLGkpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbbywuLi5hLm1lcmdlRXJyb3JQYXRoXX07ci5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6cn19cmV0dXJue3ZhbGlkOiExLG1lcmdlRXJyb3JQYXRoOltdfX1mdW5jdGlvbiBicyh0LG4scil7Y29uc3Qgbz1uZXcgTWFwO2xldCBlO2Zvcihjb25zdCBzIG9mIG4uaXNzdWVzKWlmKHMuY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyIpe2U/PyhlPXMpO2Zvcihjb25zdCBjIG9mIHMua2V5cylvLmhhcyhjKXx8by5zZXQoYyx7fSksby5nZXQoYykubD0hMH1lbHNlIHQuaXNzdWVzLnB1c2gocyk7Zm9yKGNvbnN0IHMgb2Ygci5pc3N1ZXMpaWYocy5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIilmb3IoY29uc3QgYyBvZiBzLmtleXMpby5oYXMoYyl8fG8uc2V0KGMse30pLG8uZ2V0KGMpLnI9ITA7ZWxzZSB0Lmlzc3Vlcy5wdXNoKHMpO2NvbnN0IGk9Wy4uLm9dLmZpbHRlcigoWyxzXSk9PnMubCYmcy5yKS5tYXAoKFtzXSk9PnMpO2lmKGkubGVuZ3RoJiZlJiZ0Lmlzc3Vlcy5wdXNoKHsuLi5lLGtleXM6aX0pLFBlKHQpKXJldHVybiB0O2NvbnN0IGE9bGkobi52YWx1ZSxyLnZhbHVlKTtpZighYS52YWxpZCl0aHJvdyBuZXcgRXJyb3IoYFVubWVyZ2FibGUgaW50ZXJzZWN0aW9uLiBFcnJvciBwYXRoOiAke0pTT04uc3RyaW5naWZ5KGEubWVyZ2VFcnJvclBhdGgpfWApO3JldHVybiB0LnZhbHVlPWEuZGF0YSx0fWNvbnN0IExpPWQoIiRab2RUdXBsZSIsKHQsbik9Pnt4LmluaXQodCxuKTtjb25zdCByPW4uaXRlbXM7dC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtpbnB1dDppLGluc3Q6dCxleHBlY3RlZDoidHVwbGUiLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxvO28udmFsdWU9W107Y29uc3QgYT1bXSxzPXlzKHIsIm9wdGluIiksYz15cyhyLCJvcHRvdXQiKTtpZighbi5yZXN0KXtpZihpLmxlbmd0aDxzKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cyxpbmNsdXNpdmU6ITAsaW5wdXQ6aSxpbnN0OnQsb3JpZ2luOiJhcnJheSJ9KSxvO2kubGVuZ3RoPnIubGVuZ3RoJiZvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fYmlnIixtYXhpbXVtOnIubGVuZ3RoLGluY2x1c2l2ZTohMCxpbnB1dDppLGluc3Q6dCxvcmlnaW46ImFycmF5In0pfWNvbnN0IHU9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7Y29uc3QgZz1yW2xdLl96b2QucnVuKHt2YWx1ZTppW2xdLGlzc3VlczpbXX0sZSk7ZyBpbnN0YW5jZW9mIFByb21pc2U/YS5wdXNoKGcudGhlbih2PT57dVtsXT12fSkpOnVbbF09Z31pZihuLnJlc3Qpe2xldCBsPXIubGVuZ3RoLTE7Y29uc3QgZz1pLnNsaWNlKHIubGVuZ3RoKTtmb3IoY29uc3QgdiBvZiBnKXtsKys7Y29uc3QgJD1uLnJlc3QuX3pvZC5ydW4oe3ZhbHVlOnYsaXNzdWVzOltdfSxlKTskIGluc3RhbmNlb2YgUHJvbWlzZT9hLnB1c2goJC50aGVuKHk9PmtzKHksbyxsKSkpOmtzKCQsbyxsKX19cmV0dXJuIGEubGVuZ3RoP1Byb21pc2UuYWxsKGEpLnRoZW4oKCk9PlNzKHUsbyxyLGksYykpOlNzKHUsbyxyLGksYyl9fSk7ZnVuY3Rpb24geXModCxuKXtmb3IobGV0IHI9dC5sZW5ndGgtMTtyPj0wO3ItLSlpZih0W3JdLl96b2Rbbl0hPT0ib3B0aW9uYWwiKXJldHVybiByKzE7cmV0dXJuIDB9ZnVuY3Rpb24ga3ModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSksbi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFNzKHQsbixyLG8sZSl7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspe2NvbnN0IGE9dFtpXSxzPWk8by5sZW5ndGg7aWYoYS5pc3N1ZXMubGVuZ3RoKXtpZighcyYmaT49ZSl7bi52YWx1ZS5sZW5ndGg9aTticmVha31uLmlzc3Vlcy5wdXNoKC4uLmZlKGksYS5pc3N1ZXMpKX1uLnZhbHVlW2ldPWEudmFsdWV9Zm9yKGxldCBpPW4udmFsdWUubGVuZ3RoLTE7aT49by5sZW5ndGgmJihyW2ldLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIiYmbi52YWx1ZVtpXT09PXZvaWQgMCk7aS0tKW4udmFsdWUubGVuZ3RoPWk7cmV0dXJuIG59Y29uc3QgaWw9ZCgiJFpvZFJlY29yZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIURlKGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoicmVjb3JkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdLGE9bi5rZXlUeXBlLl96b2QudmFsdWVzO2lmKGEpe3IudmFsdWU9e307Y29uc3Qgcz1uZXcgU2V0O2Zvcihjb25zdCB1IG9mIGEpaWYodHlwZW9mIHU9PSJzdHJpbmcifHx0eXBlb2YgdT09Im51bWJlciJ8fHR5cGVvZiB1PT0ic3ltYm9sIil7cy5hZGQodHlwZW9mIHU9PSJudW1iZXIiP3UudG9TdHJpbmcoKTp1KTtjb25zdCBsPW4ua2V5VHlwZS5fem9kLnJ1bih7dmFsdWU6dSxpc3N1ZXM6W119LG8pO2lmKGwgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2lmKGwuaXNzdWVzLmxlbmd0aCl7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6bC5pc3N1ZXMubWFwKCQ9PmxlKCQsbyxLKCkpKSxpbnB1dDp1LHBhdGg6W3VdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGc9bC52YWx1ZSx2PW4udmFsdWVUeXBlLl96b2QucnVuKHt2YWx1ZTplW3VdLGlzc3VlczpbXX0sbyk7diBpbnN0YW5jZW9mIFByb21pc2U/aS5wdXNoKHYudGhlbigkPT57JC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHUsJC5pc3N1ZXMpKSxyLnZhbHVlW2ddPSQudmFsdWV9KSk6KHYuaXNzdWVzLmxlbmd0aCYmci5pc3N1ZXMucHVzaCguLi5mZSh1LHYuaXNzdWVzKSksci52YWx1ZVtnXT12LnZhbHVlKX1sZXQgYztmb3IoY29uc3QgdSBpbiBlKXMuaGFzKHUpfHwoYz1jPz9bXSxjLnB1c2godSkpO2MmJmMubGVuZ3RoPjAmJnIuaXNzdWVzLnB1c2goe2NvZGU6InVucmVjb2duaXplZF9rZXlzIixpbnB1dDplLGluc3Q6dCxrZXlzOmN9KX1lbHNle3IudmFsdWU9e307Zm9yKGNvbnN0IHMgb2YgUmVmbGVjdC5vd25LZXlzKGUpKXtpZihzPT09Il9fcHJvdG9fXyJ8fCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxzKSljb250aW51ZTtsZXQgYz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOnMsaXNzdWVzOltdfSxvKTtpZihjIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHkiKTtpZih0eXBlb2Ygcz09InN0cmluZyImJk5pLnRlc3QocykmJmMuaXNzdWVzLmxlbmd0aCl7Y29uc3QgZz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOk51bWJlcihzKSxpc3N1ZXM6W119LG8pO2lmKGcgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2cuaXNzdWVzLmxlbmd0aD09PTAmJihjPWcpfWlmKGMuaXNzdWVzLmxlbmd0aCl7bi5tb2RlPT09Imxvb3NlIj9yLnZhbHVlW3NdPWVbc106ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6Yy5pc3N1ZXMubWFwKGc9PmxlKGcsbyxLKCkpKSxpbnB1dDpzLHBhdGg6W3NdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGw9bi52YWx1ZVR5cGUuX3pvZC5ydW4oe3ZhbHVlOmVbc10saXNzdWVzOltdfSxvKTtsIGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2gobC50aGVuKGc9PntnLmlzc3Vlcy5sZW5ndGgmJnIuaXNzdWVzLnB1c2goLi4uZmUocyxnLmlzc3VlcykpLHIudmFsdWVbYy52YWx1ZV09Zy52YWx1ZX0pKToobC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHMsbC5pc3N1ZXMpKSxyLnZhbHVlW2MudmFsdWVdPWwudmFsdWUpfX1yZXR1cm4gaS5sZW5ndGg/UHJvbWlzZS5hbGwoaSkudGhlbigoKT0+cik6cn19KSxvbD1kKCIkWm9kTWFwIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtpZighKGUgaW5zdGFuY2VvZiBNYXApKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibWFwIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdO3IudmFsdWU9bmV3IE1hcDtmb3IoY29uc3RbYSxzXW9mIGUpe2NvbnN0IGM9bi5rZXlUeXBlLl96b2QucnVuKHt2YWx1ZTphLGlzc3VlczpbXX0sbyksdT1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlfHx1IGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2goUHJvbWlzZS5hbGwoW2MsdV0pLnRoZW4oKFtsLGddKT0+e3dzKGwsZyxyLGEsZSx0LG8pfSkpOndzKGMsdSxyLGEsZSx0LG8pfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIHdzKHQsbixyLG8sZSxpLGEpe3QuaXNzdWVzLmxlbmd0aCYmKENuLmhhcyh0eXBlb2Ygbyk/ci5pc3N1ZXMucHVzaCguLi5mZShvLHQuaXNzdWVzKSk6ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoibWFwIixpbnB1dDplLGluc3Q6aSxpc3N1ZXM6dC5pc3N1ZXMubWFwKHM9PmxlKHMsYSxLKCkpKX0pKSxuLmlzc3Vlcy5sZW5ndGgmJihDbi5oYXModHlwZW9mIG8pP3IuaXNzdWVzLnB1c2goLi4uZmUobyxuLmlzc3VlcykpOnIuaXNzdWVzLnB1c2goe29yaWdpbjoibWFwIixjb2RlOiJpbnZhbGlkX2VsZW1lbnQiLGlucHV0OmUsaW5zdDppLGtleTpvLGlzc3VlczpuLmlzc3Vlcy5tYXAocz0+bGUocyxhLEsoKSkpfSkpLHIudmFsdWUuc2V0KHQudmFsdWUsbi52YWx1ZSl9Y29uc3QgYWw9ZCgiJFpvZFNldCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIShlIGluc3RhbmNlb2YgU2V0KSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7aW5wdXQ6ZSxpbnN0OnQsZXhwZWN0ZWQ6InNldCIsY29kZToiaW52YWxpZF90eXBlIn0pLHI7Y29uc3QgaT1bXTtyLnZhbHVlPW5ldyBTZXQ7Zm9yKGNvbnN0IGEgb2YgZSl7Y29uc3Qgcz1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6YSxpc3N1ZXM6W119LG8pO3MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChzLnRoZW4oYz0+SXMoYyxyKSkpOklzKHMscil9cmV0dXJuIGkubGVuZ3RoP1Byb21pc2UuYWxsKGkpLnRoZW4oKCk9PnIpOnJ9fSk7ZnVuY3Rpb24gSXModCxuKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4udC5pc3N1ZXMpLG4udmFsdWUuYWRkKHQudmFsdWUpfWNvbnN0IHNsPWQoIiRab2RFbnVtIiwodCxuKT0+e3guaW5pdCh0LG4pO2NvbnN0IHI9dmkobi5lbnRyaWVzKSxvPW5ldyBTZXQocik7dC5fem9kLnZhbHVlcz1vLHQuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4oJHtyLmZpbHRlcihlPT5Dbi5oYXModHlwZW9mIGUpKS5tYXAoZT0+dHlwZW9mIGU9PSJzdHJpbmciP2JlKGUpOmUudG9TdHJpbmcoKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShlLGkpPT57Y29uc3QgYT1lLnZhbHVlO3JldHVybiBvLmhhcyhhKXx8ZS5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOnIsaW5wdXQ6YSxpbnN0OnR9KSxlfX0pLGNsPWQoIiRab2RMaXRlcmFsIiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLG4udmFsdWVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIGxpdGVyYWwgc2NoZW1hIHdpdGggbm8gdmFsaWQgdmFsdWVzIik7Y29uc3Qgcj1uZXcgU2V0KG4udmFsdWVzKTt0Ll96b2QudmFsdWVzPXIsdC5fem9kLnBhdHRlcm49bmV3IFJlZ0V4cChgXigke24udmFsdWVzLm1hcChvPT50eXBlb2Ygbz09InN0cmluZyI/YmUobyk6bz9iZShvLnRvU3RyaW5nKCkpOlN0cmluZyhvKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO3JldHVybiByLmhhcyhpKXx8by5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOm4udmFsdWVzLGlucHV0OmksaW5zdDp0fSksb319KSx1bD1kKCIkWm9kRmlsZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGUgaW5zdGFuY2VvZiBGaWxlfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZmlsZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksbGw9ZCgiJFpvZFRyYW5zZm9ybSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKHQuY29uc3RydWN0b3IubmFtZSk7Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO2lmKG8uYXN5bmMpcmV0dXJuKGUgaW5zdGFuY2VvZiBQcm9taXNlP2U6UHJvbWlzZS5yZXNvbHZlKGUpKS50aGVuKGE9PihyLnZhbHVlPWEsci5mYWxsYmFjaz0hMCxyKSk7aWYoZSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiByLnZhbHVlPWUsci5mYWxsYmFjaz0hMCxyfX0pO2Z1bmN0aW9uIHpzKHQsbil7cmV0dXJuIG49PT12b2lkIDAmJih0Lmlzc3Vlcy5sZW5ndGh8fHQuZmFsbGJhY2spP3tpc3N1ZXM6W10sdmFsdWU6dm9pZCAwfTp0fWNvbnN0IE1pPWQoIiRab2RPcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2Qub3B0b3V0PSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzP25ldyBTZXQoWy4uLm4uaW5uZXJUeXBlLl96b2QudmFsdWVzLHZvaWQgMF0pOnZvaWQgMCksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57Y29uc3Qgcj1uLmlubmVyVHlwZS5fem9kLnBhdHRlcm47cmV0dXJuIHI/bmV3IFJlZ0V4cChgXigke0JuKHIuc291cmNlKX0pPyRgKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmlubmVyVHlwZS5fem9kLm9wdGluPT09Im9wdGlvbmFsIil7Y29uc3QgZT1yLnZhbHVlLGk9bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtyZXR1cm4gaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGE9PnpzKGEsZSkpOnpzKGksZSl9cmV0dXJuIHIudmFsdWU9PT12b2lkIDA/cjpuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfX0pLGRsPWQoIiRab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxtbD1kKCIkWm9kTnVsbGFibGUiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsIm9wdGluIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwicGF0dGVybiIsKCk9Pntjb25zdCByPW4uaW5uZXJUeXBlLl96b2QucGF0dGVybjtyZXR1cm4gcj9uZXcgUmVnRXhwKGBeKCR7Qm4oci5zb3VyY2UpfXxudWxsKSRgKTp2b2lkIDB9KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM/bmV3IFNldChbLi4ubi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsbnVsbF0pOnZvaWQgMCksdC5fem9kLnBhcnNlPShyLG8pPT5yLnZhbHVlPT09bnVsbD9yOm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxwbD1kKCIkWm9kRGVmYXVsdCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIixPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtpZihyLnZhbHVlPT09dm9pZCAwKXJldHVybiByLnZhbHVlPW4uZGVmYXVsdFZhbHVlLHI7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+eHMoaSxuKSk6eHMoZSxuKX19KTtmdW5jdGlvbiB4cyh0LG4pe3JldHVybiB0LnZhbHVlPT09dm9pZCAwJiYodC52YWx1ZT1uLmRlZmF1bHRWYWx1ZSksdH1jb25zdCBmbD1kKCIkWm9kUHJlZmF1bHQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCJ8fHIudmFsdWU9PT12b2lkIDAmJihyLnZhbHVlPW4uZGVmYXVsdFZhbHVlKSxuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pKX0pLGdsPWQoIiRab2ROb25PcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+e2NvbnN0IHI9bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM7cmV0dXJuIHI/bmV3IFNldChbLi4ucl0uZmlsdGVyKG89Pm8hPT12b2lkIDApKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5UcyhpLHQpKTpUcyhlLHQpfX0pO2Z1bmN0aW9uIFRzKHQsbil7cmV0dXJuIXQuaXNzdWVzLmxlbmd0aCYmdC52YWx1ZT09PXZvaWQgMCYmdC5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnQudmFsdWUsaW5zdDpufSksdH1jb25zdCB2bD1kKCIkWm9kU3VjY2VzcyIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKCJab2RTdWNjZXNzIik7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aS5pc3N1ZXMubGVuZ3RoPT09MCxyKSk6KHIudmFsdWU9ZS5pc3N1ZXMubGVuZ3RoPT09MCxyKX19KSxobD1kKCIkWm9kQ2F0Y2giLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT4oci52YWx1ZT1pLnZhbHVlLGkuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6aS5pc3N1ZXMubWFwKGE9PmxlKGEsbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpKTooci52YWx1ZT1lLnZhbHVlLGUuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6ZS5pc3N1ZXMubWFwKGk9PmxlKGksbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpfX0pLCRsPWQoIiRab2ROYU4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT4oKHR5cGVvZiByLnZhbHVlIT0ibnVtYmVyInx8IU51bWJlci5pc05hTihyLnZhbHVlKSkmJnIuaXNzdWVzLnB1c2goe2lucHV0OnIudmFsdWUsaW5zdDp0LGV4cGVjdGVkOiJuYW4iLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxyKX0pLHFpPWQoIiRab2RQaXBlIiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmluLl96b2QudmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLmluLl96b2Qub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLm91dC5fem9kLm9wdG91dCksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT5uLmluLl96b2QucHJvcFZhbHVlcyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5ObihhLG4uaW4sbykpOk5uKGksbi5pbixvKX1jb25zdCBlPW4uaW4uX3pvZC5ydW4ocixvKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9Pk5uKGksbi5vdXQsbykpOk5uKGUsbi5vdXQsbyl9fSk7ZnVuY3Rpb24gTm4odCxuLHIpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpuLl96b2QucnVuKHt2YWx1ZTp0LnZhbHVlLGlzc3Vlczp0Lmlzc3VlcyxmYWxsYmFjazp0LmZhbGxiYWNrfSxyKX1jb25zdCBGaT1kKCIkWm9kQ29kZWMiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW4uX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW4uX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3V0Ll96b2Qub3B0b3V0KSxPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pm4uaW4uX3pvZC5wcm9wVmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZigoby5kaXJlY3Rpb258fCJmb3J3YXJkIik9PT0iZm9yd2FyZCIpe2NvbnN0IGk9bi5pbi5fem9kLnJ1bihyLG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZT9pLnRoZW4oYT0+RG4oYSxuLG8pKTpEbihpLG4sbyl9ZWxzZXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5EbihhLG4sbykpOkRuKGksbixvKX19fSk7ZnVuY3Rpb24gRG4odCxuLHIpe2lmKHQuaXNzdWVzLmxlbmd0aClyZXR1cm4gdC5hYm9ydGVkPSEwLHQ7aWYoKHIuZGlyZWN0aW9ufHwiZm9yd2FyZCIpPT09ImZvcndhcmQiKXtjb25zdCBlPW4udHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5vdXQscikpOkVuKHQsZSxuLm91dCxyKX1lbHNle2NvbnN0IGU9bi5yZXZlcnNlVHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5pbixyKSk6RW4odCxlLG4uaW4scil9fWZ1bmN0aW9uIEVuKHQsbixyLG8pe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpyLl96b2QucnVuKHt2YWx1ZTpuLGlzc3Vlczp0Lmlzc3Vlc30sbyl9Y29uc3QgX2w9ZCgiJFpvZFByZXByb2Nlc3MiLCh0LG4pPT57cWkuaW5pdCh0LG4pfSksYmw9ZCgiJFpvZFJlYWRvbmx5IiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRvdXQpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihqcyk6anMoZSl9fSk7ZnVuY3Rpb24ganModCl7cmV0dXJuIHQudmFsdWU9T2JqZWN0LmZyZWV6ZSh0LnZhbHVlKSx0fWNvbnN0IHlsPWQoIiRab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eC5pbml0KHQsbik7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbyBvZiBuLnBhcnRzKWlmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpe2lmKCFvLl96b2QucGF0dGVybil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0LCBubyBwYXR0ZXJuIGZvdW5kOiAke1suLi5vLl96b2QudHJhaXRzXS5zaGlmdCgpfWApO2NvbnN0IGU9by5fem9kLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHA/by5fem9kLnBhdHRlcm4uc291cmNlOm8uX3pvZC5wYXR0ZXJuO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7by5fem9kLnRyYWl0c31gKTtjb25zdCBpPWUuc3RhcnRzV2l0aCgiXiIpPzE6MCxhPWUuZW5kc1dpdGgoIiQiKT9lLmxlbmd0aC0xOmUubGVuZ3RoO3IucHVzaChlLnNsaWNlKGksYSkpfWVsc2UgaWYobz09PW51bGx8fEtzLmhhcyh0eXBlb2Ygbykpci5wdXNoKGJlKGAke299YCkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtvfWApO3QuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4ke3Iuam9pbigiIil9JGApLHQuX3pvZC5wYXJzZT0obyxlKT0+dHlwZW9mIG8udmFsdWUhPSJzdHJpbmciPyhvLmlzc3Vlcy5wdXNoKHtpbnB1dDpvLnZhbHVlLGluc3Q6dCxleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUifSksbyk6KHQuX3pvZC5wYXR0ZXJuLmxhc3RJbmRleD0wLHQuX3pvZC5wYXR0ZXJuLnRlc3Qoby52YWx1ZSl8fG8uaXNzdWVzLnB1c2goe2lucHV0Om8udmFsdWUsaW5zdDp0LGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQ/PyJ0ZW1wbGF0ZV9saXRlcmFsIixwYXR0ZXJuOnQuX3pvZC5wYXR0ZXJuLnNvdXJjZX0pLG8pfSksa2w9ZCgiJFpvZEZ1bmN0aW9uIiwodCxuKT0+KHguaW5pdCh0LG4pLHQuX2RlZj1uLHQuX3pvZC5kZWY9bix0LmltcGxlbWVudD1yPT57aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb24iKTtyZXR1cm4gZnVuY3Rpb24oLi4ubyl7Y29uc3QgZT10Ll9kZWYuaW5wdXQ/Y2kodC5fZGVmLmlucHV0LG8pOm8saT1SZWZsZWN0LmFwcGx5KHIsdGhpcyxlKTtyZXR1cm4gdC5fZGVmLm91dHB1dD9jaSh0Ll9kZWYub3V0cHV0LGkpOml9fSx0LmltcGxlbWVudEFzeW5jPXI9PntpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIik7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKC4uLm8pe2NvbnN0IGU9dC5fZGVmLmlucHV0P2F3YWl0IHVpKHQuX2RlZi5pbnB1dCxvKTpvLGk9YXdhaXQgUmVmbGVjdC5hcHBseShyLHRoaXMsZSk7cmV0dXJuIHQuX2RlZi5vdXRwdXQ/YXdhaXQgdWkodC5fZGVmLm91dHB1dCxpKTppfX0sdC5fem9kLnBhcnNlPShyLG8pPT50eXBlb2Ygci52YWx1ZSE9ImZ1bmN0aW9uIj8oci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoiZnVuY3Rpb24iLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscik6KHQuX2RlZi5vdXRwdXQmJnQuX2RlZi5vdXRwdXQuX3pvZC5kZWYudHlwZT09PSJwcm9taXNlIj9yLnZhbHVlPXQuaW1wbGVtZW50QXN5bmMoci52YWx1ZSk6ci52YWx1ZT10LmltcGxlbWVudChyLnZhbHVlKSxyKSx0LmlucHV0PSguLi5yKT0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gQXJyYXkuaXNBcnJheShyWzBdKT9uZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0Om5ldyBMaSh7dHlwZToidHVwbGUiLGl0ZW1zOnJbMF0scmVzdDpyWzFdfSksb3V0cHV0OnQuX2RlZi5vdXRwdXR9KTpuZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0OnJbMF0sb3V0cHV0OnQuX2RlZi5vdXRwdXR9KX0sdC5vdXRwdXQ9cj0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IG8oe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDp0Ll9kZWYuaW5wdXQsb3V0cHV0OnJ9KX0sdCkpLFNsPWQoIiRab2RQcm9taXNlIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+UHJvbWlzZS5yZXNvbHZlKHIudmFsdWUpLnRoZW4oZT0+bi5pbm5lclR5cGUuX3pvZC5ydW4oe3ZhbHVlOmUsaXNzdWVzOltdfSxvKSl9KSx3bD1kKCIkWm9kTGF6eSIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwiaW5uZXJUeXBlIiwoKT0+e2NvbnN0IHI9bjtyZXR1cm4gci5fY2FjaGVkSW5uZXJ8fChyLl9jYWNoZWRJbm5lcj1uLmdldHRlcigpKSxyLl9jYWNoZWRJbm5lcn0pLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ucGF0dGVybiksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5wcm9wVmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5vcHRpbj8/dm9pZCAwKSxPKHQuX3pvZCwib3B0b3V0IiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0Pz92b2lkIDApLHQuX3pvZC5wYXJzZT0ocixvKT0+dC5fem9kLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfSksSWw9ZCgiJFpvZEN1c3RvbSIsKHQsbik9PntKLmluaXQodCxuKSx4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PnIsdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPXIudmFsdWUsZT1uLmZuKG8pO2lmKGUgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBlLnRoZW4oaT0+T3MoaSxyLG8sdCkpO09zKGUscixvLHQpfX0pO2Z1bmN0aW9uIE9zKHQsbixyLG8pe2lmKCF0KXtjb25zdCBlPXtjb2RlOiJjdXN0b20iLGlucHV0OnIsaW5zdDpvLHBhdGg6Wy4uLm8uX3pvZC5kZWYucGF0aD8/W11dLGNvbnRpbnVlOiFvLl96b2QuZGVmLmFib3J0fTtvLl96b2QuZGVmLnBhcmFtcyYmKGUucGFyYW1zPW8uX3pvZC5kZWYucGFyYW1zKSxuLmlzc3Vlcy5wdXNoKFdlKGUpKX19Y29uc3QgUnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itit2LHZgSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9LGZpbGU6e3VuaXQ6Itio2KfZitiqIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sYXJyYXk6e3VuaXQ6Iti52YbYtdixIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sc2V0Ont1bml0OiLYudmG2LXYsSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLZhdiv2K7ZhCIsZW1haWw6Itio2LHZitivINil2YTZg9iq2LHZiNmG2YoiLHVybDoi2LHYp9io2LciLGVtb2ppOiLYpdmK2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Itiq2KfYsdmK2K4g2YjZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZGF0ZToi2KrYp9ix2YrYriDYqNmF2LnZitin2LEgSVNPIix0aW1lOiLZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZHVyYXRpb246ItmF2K/YqSDYqNmF2LnZitin2LEgSVNPIixpcHY0OiLYudmG2YjYp9mGIElQdjQiLGlwdjY6Iti52YbZiNin2YYgSVB2NiIsY2lkcnY0OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NCIsY2lkcnY2OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NiIsYmFzZTY0OiLZhtmO2LUg2KjYqtix2YXZitiyIGJhc2U2NC1lbmNvZGVkIixiYXNlNjR1cmw6ItmG2Y7YtSDYqNiq2LHZhdmK2LIgYmFzZTY0dXJsLWVuY29kZWQiLGpzb25fc3RyaW5nOiLZhtmO2LUg2LnZhNmJINmH2YrYptipIEpTT04iLGUxNjQ6Itix2YLZhSDZh9in2KrZgSDYqNmF2LnZitin2LEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLZhdiv2K7ZhCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNmF2K/YrtmE2KfYqiDYutmK2LEg2YXZgtio2YjZhNipOiDZitmB2KrYsdi2INil2K/Yrtin2YQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR92Iwg2YjZhNmD2YYg2KrZhSDYpdiv2K7Yp9mEICR7c31gOmDZhdiv2K7ZhNin2Kog2LrZitixINmF2YLYqNmI2YTYqTog2YrZgdiq2LHYtiDYpdiv2K7Yp9mEICR7aX3YjCDZiNmE2YPZhiDYqtmFINil2K/Yrtin2YQgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YXYr9iu2YTYp9iqINi62YrYsSDZhdmC2KjZiNmE2Kk6INmK2YHYqtix2LYg2KXYr9iu2KfZhCAke1MoZS52YWx1ZXNbMF0pfWA6YNin2K7YqtmK2KfYsSDYutmK2LEg2YXZgtio2YjZhDog2YrYqtmI2YLYuSDYp9mG2KrZgtin2KEg2KPYrdivINmH2LDZhyDYp9mE2K7Zitin2LHYp9iqOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gINij2YPYqNixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INij2YYg2KrZg9mI2YYgJHtlLm9yaWdpbj8/Itin2YTZgtmK2YXYqSJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsSJ9YDpg2KPZg9io2LEg2YXZhiDYp9mE2YTYp9iy2YU6INmK2YHYqtix2LYg2KPZhiDYqtmD2YjZhiAke2Uub3JpZ2luPz8i2KfZhNmC2YrZhdipIn0gJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqNiv2KMg2KjZgCAiJHtlLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YbYqtmH2Yog2KjZgCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqti22YXZkdmO2YYgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYt9in2KjZgiDYp9mE2YbZhdi3ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSDYutmK2LEg2YXZgtio2YjZhGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDYsdmC2YUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YPZiNmGINmF2YYg2YXYttin2LnZgdin2KogJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YXYudix2YEke2Uua2V5cy5sZW5ndGg+MT8i2KfYqiI6IiJ9INi62LHZitioJHtlLmtleXMubGVuZ3RoPjE/ItipIjoiIn06ICR7XyhlLmtleXMsItiMICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNmF2LnYsdmBINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIn19fTtmdW5jdGlvbiBDcCgpe3JldHVybntsb2NhbGVFcnJvcjpScCgpfX1jb25zdCBBcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoic2ltdm9sIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJvbG1hbMSxZMSxciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImVtYWlsIGFkZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRldGltZSIsZGF0ZToiSVNPIGRhdGUiLHRpbWU6IklTTyB0aW1lIixkdXJhdGlvbjoiSVNPIGR1cmF0aW9uIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBudW1iZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFlhbmzEscWfIGTJmXnJmXI6IGfDtnpsyZluaWzJmW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBkYXhpbCBvbGFuICR7c31gOmBZYW5sxLHFnyBkyZl5yZlyOiBnw7Z6bMmZbmlsyZluICR7aX0sIGRheGlsIG9sYW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gWWFubMSxxZ8gZMmZecmZcjogZ8O2emzJmW5pbMmZbiAke1MoZS52YWx1ZXNbMF0pfWA6YFlhbmzEscWfIHNlw6dpbTogYcWfYcSfxLFkYWvEsWxhcmRhbiBiaXJpIG9sbWFsxLFkxLFyOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudCJ9YDpgw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBracOnaWs6IGfDtnpsyZluaWzJmW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YMOHb3gga2nDp2lrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5wcmVmaXh9IiBpbMmZIGJhxZ9sYW1hbMSxZMSxcmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gWWFubMSxxZ8gbcmZdG46ICIke2kuc3VmZml4fSIgaWzJmSBiaXRtyZlsaWRpcmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5pbmNsdWRlc30iIGRheGlsIG9sbWFsxLFkxLFyYDppLmZvcm1hdD09PSJyZWdleCI/YFlhbmzEscWfIG3JmXRuOiAke2kucGF0dGVybn0gxZ9hYmxvbnVuYSB1ecSfdW4gb2xtYWzEsWTEsXJgOmBZYW5sxLHFnyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gWWFubMSxxZ8gyZlkyZlkOiAke2UuZGl2aXNvcn0gaWzJmSBiw7Zsw7xuyZkgYmlsyZluIG9sbWFsxLFkxLFyYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYcOnYXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGF4aWxpbmTJmSB5YW5sxLHFnyBhw6dhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iWWFubMSxxZ8gZMmZecmZciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYXhpbGluZMmZIHlhbmzEscWfIGTJmXnJmXJgO2RlZmF1bHQ6cmV0dXJuIllhbmzEscWfIGTJmXnJmXIifX19O2Z1bmN0aW9uIExwKCl7cmV0dXJue2xvY2FsZUVycm9yOkFwKCl9fWZ1bmN0aW9uIFVzKHQsbixyLG8pe2NvbnN0IGU9TWF0aC5hYnModCksaT1lJTEwLGE9ZSUxMDA7cmV0dXJuIGE+PTExJiZhPD0xOT9vOmk9PT0xP246aT49MiYmaTw9ND9yOm99Y29uc3QgTXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToi0YHRltC80LLQsNC7IixmZXc6ItGB0ZbQvNCy0LDQu9GLIixtYW55OiLRgdGW0LzQstCw0LvQsNGeIn0sdmVyYjoi0LzQtdGG0YwifSxhcnJheTp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LHNldDp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LGZpbGU6e3VuaXQ6e29uZToi0LHQsNC50YIiLGZldzoi0LHQsNC50YLRiyIsbWFueToi0LHQsNC50YLQsNGeIn0sdmVyYjoi0LzQtdGG0YwifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0YPQstC+0LQiLGVtYWlsOiJlbWFpbCDQsNC00YDQsNGBIix1cmw6IlVSTCIsZW1vamk6ItGN0LzQvtC00LfRliIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINC00LDRgtCwINGWINGH0LDRgSIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0YfQsNGBIixkdXJhdGlvbjoiSVNPINC/0YDQsNGG0Y/Qs9C70LDRgdGG0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LDRgSIsaXB2NjoiSVB2NiDQsNC00YDQsNGBIixjaWRydjQ6IklQdjQg0LTRi9GP0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00YvRj9C/0LDQt9C+0L0iLGJhc2U2NDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjQiLGJhc2U2NHVybDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJKU09OINGA0LDQtNC+0LoiLGUxNjQ6ItC90YPQvNCw0YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLRg9Cy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItC70ZbQuiIsYXJyYXk6ItC80LDRgdGW0Z4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtDog0YfQsNC60LDRntGB0Y8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINGe0LLQvtC0OiDRh9Cw0LrQsNGe0YHRjyAke2l9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQ6INGH0LDQutCw0LvQsNGB0Y8gJHtTKGUudmFsdWVzWzBdKX1gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINCy0LDRgNGL0Y/QvdGCOiDRh9Cw0LrQsNGe0YHRjyDQsNC00LfRltC9INC3ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWF4aW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINCy0Y/Qu9GW0LrRljog0YfQsNC60LDQu9Cw0YHRjywg0YjRgtC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9GN0L3QvdC1In0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LLRj9C70ZbQutGWOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0Y3QvdC90LUifSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWluaW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINC80LDQu9GLOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbn0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LzQsNC70Ys6INGH0LDQutCw0LvQsNGB0Y8sINGI0YLQviAke2Uub3JpZ2lufSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQv9Cw0YfRi9C90LDRhtGG0LAg0LcgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQt9Cw0LrQsNC90YfQstCw0YbRhtCwINC90LAgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DQndGP0L/RgNCw0LLRltC70YzQvdGLINGA0LDQtNC+0Lo6INC/0LDQstGW0L3QtdC9INC30LzRj9GI0YfQsNGG0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0YDQsNC00L7Qujog0L/QsNCy0ZbQvdC10L0g0LDQtNC/0LDQstGP0LTQsNGG0Ywg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQu9GW0Lo6INC/0LDQstGW0L3QtdC9INCx0YvRhtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9Cw0LfQvdCw0L3RiyAke2Uua2V5cy5sZW5ndGg+MT8i0LrQu9GO0YfRiyI6ItC60LvRjtGHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQutC70Y7RhyDRgyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndGP0L/RgNCw0LLRltC70YzQvdCw0LUg0LfQvdCw0YfRjdC90L3QtSDRniAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCJ9fX07ZnVuY3Rpb24gcXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6TXAoKX19Y29uc3QgRnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ItGB0LjQvNCy0L7Qu9CwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sZmlsZTp7dW5pdDoi0LHQsNC50YLQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sc2V0Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0YXQvtC0IixlbWFpbDoi0LjQvNC10LnQuyDQsNC00YDQtdGBIix1cmw6IlVSTCIsZW1vamk6ItC10LzQvtC00LbQuCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINCy0YDQtdC80LUiLGRhdGU6IklTTyDQtNCw0YLQsCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0L/RgNC+0LTRitC70LbQuNGC0LXQu9C90L7RgdGCIixpcHY0OiJJUHY0INCw0LTRgNC10YEiLGlwdjY6IklQdjYg0LDQtNGA0LXRgSIsY2lkcnY0OiJJUHY0INC00LjQsNC/0LDQt9C+0L0iLGNpZHJ2NjoiSVB2NiDQtNC40LDQv9Cw0LfQvtC9IixiYXNlNjQ6ImJhc2U2NC3QutC+0LTQuNGA0LDQvSDQvdC40LciLGJhc2U2NHVybDoiYmFzZTY0dXJsLdC60L7QtNC40YDQsNC9INC90LjQtyIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC3IixlMTY0OiJFLjE2NCDQvdC+0LzQtdGAIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdC+0LQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLRh9C40YHQu9C+IixhcnJheToi0LzQsNGB0LjQsiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQ6INC+0YfQsNC60LLQsNC9IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L0gJHtzfWA6YNCd0LXQstCw0LvQuNC00LXQvSDQstGF0L7QtDog0L7Rh9Cw0LrQstCw0L0gJHtpfSwg0L/QvtC70YPRh9C10L0gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0OiDQvtGH0LDQutCy0LDQvSAke1MoZS52YWx1ZXNbMF0pfWA6YNCd0LXQstCw0LvQuNC00L3QsCDQvtC/0YbQuNGPOiDQvtGH0LDQutCy0LDQvdC+INC10LTQvdC+INC+0YIgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCi0LLRitGA0LTQtSDQs9C+0LvRj9C80L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW4/PyLRgdGC0L7QudC90L7RgdGCIn0g0LTQsCDRgdGK0LTRitGA0LbQsCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtCwIn1gOmDQotCy0YrRgNC00LUg0LPQvtC70Y/QvNC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2luPz8i0YHRgtC+0LnQvdC+0YHRgiJ9INC00LAg0LHRitC00LUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0KLQstGK0YDQtNC1INC80LDQu9C60L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW59INC00LAg0YHRitC00YrRgNC20LAgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNCi0LLRitGA0LTQtSDQvNCw0LvQutC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2lufSDQtNCwINCx0YrQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtpZihpLmZvcm1hdD09PSJzdGFydHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQv9C+0YfQstCwINGBICIke2kucHJlZml4fSJgO2lmKGkuZm9ybWF0PT09ImVuZHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQstGK0YDRiNCy0LAg0YEgIiR7aS5zdWZmaXh9ImA7aWYoaS5mb3JtYXQ9PT0iaW5jbHVkZXMiKXJldHVybmDQndC10LLQsNC70LjQtNC10L0g0L3QuNC3OiDRgtGA0Y/QsdCy0LAg0LTQsCDQstC60LvRjtGH0LLQsCAiJHtpLmluY2x1ZGVzfSJgO2lmKGkuZm9ybWF0PT09InJlZ2V4IilyZXR1cm5g0J3QtdCy0LDQu9C40LTQtdC9INC90LjQtzog0YLRgNGP0LHQstCwINC00LAg0YHRitCy0L/QsNC00LAg0YEgJHtpLnBhdHRlcm59YDtsZXQgYT0i0J3QtdCy0LDQu9C40LTQtdC9IjtyZXR1cm4gaS5mb3JtYXQ9PT0iZW1vamkiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZXRpbWUiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZSImJihhPSLQndC10LLQsNC70LjQtNC90LAiKSxpLmZvcm1hdD09PSJ0aW1lIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QviIpLGkuZm9ybWF0PT09ImR1cmF0aW9uIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QsCIpLGAke2F9ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10LLQsNC70LjQtNC90L4g0YfQuNGB0LvQvjog0YLRgNGP0LHQstCwINC00LAg0LHRitC00LUg0LrRgNCw0YLQvdC+INC90LAgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g0J3QtdGA0LDQt9C/0L7Qt9C90LDRgiR7ZS5rZXlzLmxlbmd0aD4xPyLQuCI6IiJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC+0LLQtSI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNCd0LXQstCw0LvQuNC00L3QsCDRgdGC0L7QudC90L7RgdGCINCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQifX19O2Z1bmN0aW9uIEpwKCl7cmV0dXJue2xvY2FsZUVycm9yOkZwKCl9fWNvbnN0IEhwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXLDoGN0ZXJzIix2ZXJiOiJjb250ZW5pciJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJjb250ZW5pciJ9LGFycmF5Ont1bml0OiJlbGVtZW50cyIsdmVyYjoiY29udGVuaXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRzIix2ZXJiOiJjb250ZW5pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyYWRhIixlbWFpbDoiYWRyZcOnYSBlbGVjdHLDsm5pY2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgaSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYWRhIElTTyIsaXB2NDoiYWRyZcOnYSBJUHY0IixpcHY2OiJhZHJlw6dhIElQdjYiLGNpZHJ2NDoicmFuZyBJUHY0IixjaWRydjY6InJhbmcgSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiY2FkZW5hIGNvZGlmaWNhZGEgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwdXMgaW52w6BsaWQ6IHMnZXNwZXJhdmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBzJ2hhIHJlYnV0ICR7c31gOmBUaXB1cyBpbnbDoGxpZDogcydlc3BlcmF2YSAke2l9LCBzJ2hhIHJlYnV0ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFZhbG9yIGludsOgbGlkOiBzJ2VzcGVyYXZhICR7UyhlLnZhbHVlc1swXSl9YDpgT3BjacOzIGludsOgbGlkYTogcydlc3BlcmF2YSB1bmEgZGUgJHtfKGUudmFsdWVzLCIgbyAiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DoHhpbSI6Im1lbnlzIGRlIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BNYXNzYSBncmFuOiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2luPz8iZWwgdmFsb3IifSBjb250aW5ndcOpcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifWA6YE1hc3NhIGdyYW46IHMnZXNwZXJhdmEgcXVlICR7ZS5vcmlnaW4/PyJlbCB2YWxvciJ9IGZvcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DrW5pbSI6Im3DqXMgZGUiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBjb250aW5ndcOpcyAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBmb3MgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGRlIGNvbWVuw6dhciBhbWIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gRm9ybWF0IGludsOgbGlkOiBoYSBkJ2FjYWJhciBhbWIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGQnaW5jbG91cmUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEZvcm1hdCBpbnbDoGxpZDogaGEgZGUgY29pbmNpZGlyIGFtYiBlbCBwYXRyw7MgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludsOgbGlkIHBlciBhICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOgbGlkOiBoYSBkZSBzZXIgbcO6bHRpcGxlIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENsYXUke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IG5vIHJlY29uZWd1ZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENsYXUgaW52w6BsaWRhIGEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6BsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEVsZW1lbnQgaW52w6BsaWQgYSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iRW50cmFkYSBpbnbDoGxpZGEifX19O2Z1bmN0aW9uIFdwKCl7cmV0dXJue2xvY2FsZUVycm9yOkhwKCl9fWNvbnN0IEJwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrxa8iLHZlcmI6Im3DrXQifSxmaWxlOnt1bml0OiJiYWp0xa8iLHZlcmI6Im3DrXQifSxhcnJheTp7dW5pdDoicHJ2a8WvIix2ZXJiOiJtw610In0sc2V0Ont1bml0OiJwcnZrxa8iLHZlcmI6Im3DrXQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicmVndWzDoXJuw60gdsO9cmF6IixlbWFpbDoiZS1tYWlsb3bDoSBhZHJlc2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdHVtIGEgxI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGRhdGU6ImRhdHVtIHZlIGZvcm3DoXR1IElTTyIsdGltZToixI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGR1cmF0aW9uOiJkb2JhIHRydsOhbsOtIElTTyIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6InJvenNhaCBJUHY0IixjaWRydjY6InJvenNhaCBJUHY2IixiYXNlNjQ6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0IixiYXNlNjR1cmw6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoixZlldMSbemVjIHZlIGZvcm3DoXR1IEpTT04iLGUxNjQ6IsSNw61zbG8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJ2c3R1cCJ9LG89e25hbjoiTmFOIixudW1iZXI6IsSNw61zbG8iLHN0cmluZzoixZlldMSbemVjIixmdW5jdGlvbjoiZnVua2NlIixhcnJheToicG9sZSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXBsYXRuw70gdnN0dXA6IG/EjWVrw6F2w6FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG9iZHLFvmVubyAke3N9YDpgTmVwbGF0bsO9IHZzdHVwOiBvxI1la8OhdsOhbm8gJHtpfSwgb2JkcsW+ZW5vICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5lcGxhdG7DvSB2c3R1cDogb8SNZWvDoXbDoW5vICR7UyhlLnZhbHVlc1swXSl9YDpgTmVwbGF0bsOhIG1vxb5ub3N0OiBvxI1la8OhdsOhbmEgamVkbmEgeiBob2Rub3QgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEhvZG5vdGEgamUgcMWZw61sacWhIHZlbGvDoTogJHtlLm9yaWdpbj8/ImhvZG5vdGEifSBtdXPDrSBtw610ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBydmvFryJ9YDpgSG9kbm90YSBqZSBwxZnDrWxpxaEgdmVsa8OhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSG9kbm90YSBqZSBwxZnDrWxpxaEgbWFsw6E6ICR7ZS5vcmlnaW4/PyJob2Rub3RhIn0gbXVzw60gbcOtdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJwcnZrxa8ifWA6YEhvZG5vdGEgamUgcMWZw61sacWhIG1hbMOhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5lcGxhdG7DvSDFmWV0xJt6ZWM6IG11c8OtIHphxI3DrW5hdCBuYSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBrb27EjWl0IG5hICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmVwbGF0bsO9IMWZZXTEm3plYzogbXVzw60gb2JzYWhvdmF0ICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBvZHBvdsOtZGF0IHZ6b3J1ICR7aS5wYXR0ZXJufWA6YE5lcGxhdG7DvSBmb3Jtw6F0ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOZXBsYXRuw6kgxI3DrXNsbzogbXVzw60gYsO9dCBuw6Fzb2JrZW0gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmV6bsOhbcOpIGtsw63EjWU6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmVwbGF0bsO9IGtsw63EjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXBsYXRuw70gdnN0dXAiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmVwbGF0bsOhIGhvZG5vdGEgdiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVwbGF0bsO9IHZzdHVwIn19fTtmdW5jdGlvbiBWcCgpe3JldHVybntsb2NhbGVFcnJvcjpCcCgpfX1jb25zdCBLcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiaGF2ZGUifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiaGF2ZGUifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiJpbmRlaG9sZHQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiaW5kZWhvbGR0In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1tYWlsYWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsw6Z0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsw6Z0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGVkIixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwta29kZXQgc3RyZW5nIixqc29uX3N0cmluZzoiSlNPTi1zdHJlbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4iLHN0cmluZzoic3RyZW5nIixudW1iZXI6InRhbCIsYm9vbGVhbjoiYm9vbGVhbiIsYXJyYXk6Imxpc3RlIixvYmplY3Q6Im9iamVrdCIsc2V0OiJzw6Z0IixmaWxlOiJmaWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZ3QgaW5wdXQ6IGZvcnZlbnRlZGUgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBmaWsgJHtzfWA6YFVneWxkaWd0IGlucHV0OiBmb3J2ZW50ZWRlICR7aX0sIGZpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BVZ3lsZGlnIHbDpnJkaTogZm9ydmVudGVkZSAke1MoZS52YWx1ZXNbMF0pfWA6YFVneWxkaWd0IHZhbGc6IGZvcnZlbnRlZGUgZW4gYWYgZsO4bGdlbmRlICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9ICR7YS52ZXJifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudGVyIn1gOmBGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9IGhhdmRlICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSAke2EudmVyYn0gJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSBoYXZkZSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IHNrYWwgZW5kZSBtZWQgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BVZ3lsZGlnIHN0cmVuZzogc2thbCBpbmRlaG9sZGUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWd0IHRhbDogc2thbCB2w6ZyZSBkZWxlbGlndCBtZWQgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/IlVrZW5kdGUgbsO4Z2xlciI6IlVrZW5kdCBuw7hnbGUifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGdsZSBpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJVZ3lsZGlndCBpbnB1dDogbWF0Y2hlciBpbmdlbiBhZiBkZSB0aWxsYWR0ZSB0eXBlciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHbDpnJkaSBpICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJVZ3lsZGlndCBpbnB1dCJ9fX07ZnVuY3Rpb24gR3AoKXtyZXR1cm57bG9jYWxlRXJyb3I6S3AoKX19Y29uc3QgWHA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IlplaWNoZW4iLHZlcmI6Inp1IGhhYmVuIn0sZmlsZTp7dW5pdDoiQnl0ZXMiLHZlcmI6Inp1IGhhYmVuIn0sYXJyYXk6e3VuaXQ6IkVsZW1lbnRlIix2ZXJiOiJ6dSBoYWJlbiJ9LHNldDp7dW5pdDoiRWxlbWVudGUiLHZlcmI6Inp1IGhhYmVuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IkVpbmdhYmUiLGVtYWlsOiJFLU1haWwtQWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJFbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLURhdHVtIHVuZCAtVWhyemVpdCIsZGF0ZToiSVNPLURhdHVtIix0aW1lOiJJU08tVWhyemVpdCIsZHVyYXRpb246IklTTy1EYXVlciIsaXB2NDoiSVB2NC1BZHJlc3NlIixpcHY2OiJJUHY2LUFkcmVzc2UiLGNpZHJ2NDoiSVB2NC1CZXJlaWNoIixjaWRydjY6IklQdjYtQmVyZWljaCIsYmFzZTY0OiJCYXNlNjQtY29kaWVydGVyIFN0cmluZyIsYmFzZTY0dXJsOiJCYXNlNjQtVVJMLWNvZGllcnRlciBTdHJpbmciLGpzb25fc3RyaW5nOiJKU09OLVN0cmluZyIsZTE2NDoiRS4xNjQtTnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiRWluZ2FiZSJ9LG89e25hbjoiTmFOIixudW1iZXI6IlphaGwiLGFycmF5OiJBcnJheSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BVbmfDvGx0aWdlIEVpbmdhYmU6IGVyd2FydGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZXJoYWx0ZW4gJHtzfWA6YFVuZ8O8bHRpZ2UgRWluZ2FiZTogZXJ3YXJ0ZXQgJHtpfSwgZXJoYWx0ZW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVW5nw7xsdGlnZSBFaW5nYWJlOiBlcndhcnRldCAke1MoZS52YWx1ZXNbMF0pfWA6YFVuZ8O8bHRpZ2UgT3B0aW9uOiBlcndhcnRldCBlaW5lIHZvbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUgZ3Jvw586IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW4/PyJXZXJ0In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iRWxlbWVudGUifSBoYXRgOmBadSBncm/DnzogZXJ3YXJ0ZXQsIGRhc3MgJHtlLm9yaWdpbj8/IldlcnQifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gaXN0YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH0gaGF0YDpgWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBpc3RgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIG1pdCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BVbmfDvGx0aWdlciBTdHJpbmc6IG11c3MgbWl0ICIke2kuc3VmZml4fSIgZW5kZW5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzICIke2kuaW5jbHVkZXN9IiBlbnRoYWx0ZW5gOmkuZm9ybWF0PT09InJlZ2V4Ij9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIGRlbSBNdXN0ZXIgJHtpLnBhdHRlcm59IGVudHNwcmVjaGVuYDpgVW5nw7xsdGlnOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gVW5nw7xsdGlnZSBaYWhsOiBtdXNzIGVpbiBWaWVsZmFjaGVzIHZvbiAke2UuZGl2aXNvcn0gc2VpbmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJVbmJla2FubnRlIFNjaGzDvHNzZWwiOiJVbmJla2FubnRlciBTY2hsw7xzc2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gVW5nw7xsdGlnZXIgU2NobMO8c3NlbCBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVW5nw7xsdGlnZSBFaW5nYWJlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFVuZ8O8bHRpZ2VyIFdlcnQgaW4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVuZ8O8bHRpZ2UgRWluZ2FiZSJ9fX07ZnVuY3Rpb24gWXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6WHAoKX19Y29uc3QgUXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Is+HzrHPgc6xzrrPhM6uz4HOtc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6Is69zrEgzq3Ph861zrkifSxhcnJheTp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LHNldDp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LG1hcDp7dW5pdDoizrrOsc+EzrHPh8+Jz4HOrs+DzrXOuc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Is61zq/Pg86/zrTOv8+CIixlbWFpbDoizrTOuc61z43OuM+Fzr3Pg863IGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gzrfOvM61z4HOv868zrfOvc6vzrEgzrrOsc65IM+Oz4HOsSIsZGF0ZToiSVNPIM63zrzOtc+Bzr/OvM63zr3Or86xIix0aW1lOiJJU08gz47Pgc6xIixkdXJhdGlvbjoiSVNPIM60zrnOrM+BzrrOtc65zrEiLGlwdjQ6Is60zrnOtc+NzrjPhc69z4POtyBJUHY0IixpcHY2OiLOtM65zrXPjc64z4XOvc+DzrcgSVB2NiIsbWFjOiLOtM65zrXPjc64z4XOvc+DzrcgTUFDIixjaWRydjQ6Is61z43Pgc6/z4IgSVB2NCIsY2lkcnY2OiLOtc+Nz4HOv8+CIElQdjYiLGJhc2U2NDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjQiLGJhc2U2NHVybDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiLPg8+FzrzOss6/zrvOv8+DzrXOuc+BzqwgSlNPTiIsZTE2NDoizrHPgc65zrjOvM+Mz4IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLOtc6vz4POv860zr/PgiJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybiB0eXBlb2YgZS5leHBlY3RlZD09InN0cmluZyImJi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YM6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+COiDOsc69zrHOvM61zr3PjM+EzrHOvSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIM67zq7Phs64zrfOus61ICR7c31gOmDOnM63IM6tzrPOus+Fz4HOtyDOtc6vz4POv860zr/PgjogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtpfSwgzrvOrs+GzrjOt866zrUgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gzpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4I6IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7UyhlLnZhbHVlc1swXSl9YDpgzpzOtyDOrc6zzrrPhc+BzrcgzrXPgM65zrvOv86zzq46IM6xzr3Osc68zrXOvc+Mz4TOsc69IM6tzr3OsSDOsc+Az4wgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YM6gzr/Ou8+NIM68zrXOs86szrvOvzogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtlLm9yaWdpbj8/Is+EzrnOvM6uIn0gzr3OsSDOrc+HzrXOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLPg8+Ezr/Ouc+HzrXOr86xIn1gOmDOoM6/zrvPjSDOvM61zrPOrM67zr86IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7ZS5vcmlnaW4/PyLPhM65zrzOriJ9IM69zrEgzrXOr869zrHOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM6tz4fOtc65ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM61zq/Ovc6xzrkgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgzr7Otc66zrnOvc6sIM68zrUgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM61zrvOtc65z47Ovc61zrkgzrzOtSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM6xzrnPgc65zqzOts61zrkgzrzOtSDPhM6/IM68zr/PhM6vzrLOvyAke2kucGF0dGVybn1gOmDOnM63IM6tzrPOus+Fz4HOvzogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/z4IgzrHPgc65zrjOvM+Mz4I6IM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gzobOs869z4nPg8+EJHtlLmtleXMubGVuZ3RoPjE/Is6xIjoizr8ifSDOus67zrXOuc60JHtlLmtleXMubGVuZ3RoPjE/Is65zqwiOiLOryJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/IM66zrvOtc65zrTOryDPg8+Ezr8gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIs6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+CIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYM6czrcgzq3Os866z4XPgc63IM+EzrnOvM6uIM+Dz4TOvyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4izpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4IifX19O2Z1bmN0aW9uIGVmKCl7cmV0dXJue2xvY2FsZUVycm9yOlFwKCl9fWNvbnN0IHRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjaGFyYWN0ZXJzIix2ZXJiOiJ0byBoYXZlIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoiaXRlbXMiLHZlcmI6InRvIGhhdmUifSxzZXQ6e3VuaXQ6Iml0ZW1zIix2ZXJiOiJ0byBoYXZlIn0sbWFwOnt1bml0OiJlbnRyaWVzIix2ZXJiOiJ0byBoYXZlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZW1haWwgYWRkcmVzcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdGV0aW1lIixkYXRlOiJJU08gZGF0ZSIsdGltZToiSVNPIHRpbWUiLGR1cmF0aW9uOiJJU08gZHVyYXRpb24iLGlwdjQ6IklQdjQgYWRkcmVzcyIsaXB2NjoiSVB2NiBhZGRyZXNzIixtYWM6Ik1BQyBhZGRyZXNzIixjaWRydjQ6IklQdjQgcmFuZ2UiLGNpZHJ2NjoiSVB2NiByYW5nZSIsYmFzZTY0OiJiYXNlNjQtZW5jb2RlZCBzdHJpbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIixqc29uX3N0cmluZzoiSlNPTiBzdHJpbmciLGUxNjQ6IkUuMTY0IG51bWJlciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuYEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7aX0sIHJlY2VpdmVkICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7UyhlLnZhbHVlc1swXSl9YDpgSW52YWxpZCBvcHRpb246IGV4cGVjdGVkIG9uZSBvZiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gaGF2ZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50cyJ9YDpgVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gYmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIHNtYWxsOiBleHBlY3RlZCAke2Uub3JpZ2lufSB0byBoYXZlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUb28gc21hbGw6IGV4cGVjdGVkICR7ZS5vcmlnaW59IHRvIGJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BJbnZhbGlkIHN0cmluZzogbXVzdCBzdGFydCB3aXRoICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEludmFsaWQgc3RyaW5nOiBtdXN0IGVuZCB3aXRoICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gSW52YWxpZCBzdHJpbmc6IG11c3QgaW5jbHVkZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gSW52YWxpZCBzdHJpbmc6IG11c3QgbWF0Y2ggcGF0dGVybiAke2kucGF0dGVybn1gOmBJbnZhbGlkICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBJbnZhbGlkIG51bWJlcjogbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFVucmVjb2duaXplZCBrZXkke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEludmFsaWQga2V5IGluICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiBlLm9wdGlvbnMmJkFycmF5LmlzQXJyYXkoZS5vcHRpb25zKSYmZS5vcHRpb25zLmxlbmd0aD4wP2BJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7ZS5vcHRpb25zLm1hcChhPT5gJyR7YX0nYCkuam9pbigiIHwgIil9YDoiSW52YWxpZCBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJbnZhbGlkIHZhbHVlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnZhbGlkIGlucHV0In19fTtmdW5jdGlvbiB6bCgpe3JldHVybntsb2NhbGVFcnJvcjp0ZigpfX1jb25zdCBuZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0cm9qbiIsdmVyYjoiaGF2aSJ9LGZpbGU6e3VuaXQ6ImJhanRvam4iLHZlcmI6ImhhdmkifSxhcnJheTp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9LHNldDp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbmlnbyIsZW1haWw6InJldGFkcmVzbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW/EnWlvIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08tZGF0b3RlbXBvIixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLXRlbXBvIixkdXJhdGlvbjoiSVNPLWRhxa1ybyIsaXB2NDoiSVB2NC1hZHJlc28iLGlwdjY6IklQdjYtYWRyZXNvIixjaWRydjQ6IklQdjQtcmFuZ28iLGNpZHJ2NjoiSVB2Ni1yYW5nbyIsYmFzZTY0OiI2NC11bWUga29kaXRhIGthcmFrdHJhcm8iLGJhc2U2NHVybDoiVVJMLTY0LXVtZSBrb2RpdGEga2FyYWt0cmFybyIsanNvbl9zdHJpbmc6IkpTT04ta2FyYWt0cmFybyIsZTE2NDoiRS4xNjQtbm9tYnJvIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW5pZ28ifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJub21icm8iLGFycmF5OiJ0YWJlbG8iLG51bGw6InNlbnZhbG9yYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXZhbGlkYSBlbmlnbzogYXRlbmRpxJ1pcyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJpY2V2acSdaXMgJHtzfWA6YE5ldmFsaWRhIGVuaWdvOiBhdGVuZGnEnWlzICR7aX0sIHJpY2V2acSdaXMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gTmV2YWxpZGEgZW5pZ286IGF0ZW5kacSdaXMgJHtTKGUudmFsdWVzWzBdKX1gOmBOZXZhbGlkYSBvcGNpbzogYXRlbmRpxJ1pcyB1bnUgZWwgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRybyBncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbj8/InZhbG9ybyJ9IGhhdnUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9qbiJ9YDpgVHJvIGdyYW5kYTogYXRlbmRpxJ1pcyBrZSAke2Uub3JpZ2luPz8idmFsb3JvIn0gaGF2dSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm8gbWFsZ3JhbmRhOiBhdGVuZGnEnWlzIGtlICR7ZS5vcmlnaW59IGhhdnUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRybyBtYWxncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbn0gZXN0dSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMga29tZW5jacSdaSBwZXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMgZmluacSdaSBwZXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZhbGlkYSBrYXJha3RyYXJvOiBkZXZhcyBpbmtsdXppdmkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmFsaWRhIGthcmFrdHJhcm86IGRldmFzIGtvbmdydWkga3VuIGxhIG1vZGVsbyAke2kucGF0dGVybn1gOmBOZXZhbGlkYSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2YWxpZGEgbm9tYnJvOiBkZXZhcyBlc3RpIG9ibG8gZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVrb25hdGEke2Uua2V5cy5sZW5ndGg+MT8iaiI6IiJ9IMWdbG9zaWxvJHtlLmtleXMubGVuZ3RoPjE/ImoiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZhbGlkYSDFnWxvc2lsbyBlbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmV2YWxpZGEgZW5pZ28iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2YWxpZGEgdmFsb3JvIGVuICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZhbGlkYSBlbmlnbyJ9fX07ZnVuY3Rpb24gcmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6bmYoKX19Y29uc3Qgb2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImNhcmFjdGVyZXMiLHZlcmI6InRlbmVyIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRlbmVyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50cmFkYSIsZW1haWw6ImRpcmVjY2nDs24gZGUgY29ycmVvIGVsZWN0csOzbmljbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZmVjaGEgeSBob3JhIElTTyIsZGF0ZToiZmVjaGEgSVNPIix0aW1lOiJob3JhIElTTyIsZHVyYXRpb246ImR1cmFjacOzbiBJU08iLGlwdjQ6ImRpcmVjY2nDs24gSVB2NCIsaXB2NjoiZGlyZWNjacOzbiBJUHY2IixjaWRydjQ6InJhbmdvIElQdjQiLGNpZHJ2NjoicmFuZ28gSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhZGEgZW4gYmFzZTY0Iixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4iLHN0cmluZzoidGV4dG8iLG51bWJlcjoibsO6bWVybyIsYm9vbGVhbjoiYm9vbGVhbm8iLGFycmF5OiJhcnJlZ2xvIixvYmplY3Q6Im9iamV0byIsc2V0OiJjb25qdW50byIsZmlsZToiYXJjaGl2byIsZGF0ZToiZmVjaGEiLGJpZ2ludDoibsO6bWVybyBncmFuZGUiLHN5bWJvbDoic8OtbWJvbG8iLHVuZGVmaW5lZDoiaW5kZWZpbmlkbyIsbnVsbDoibnVsbyIsZnVuY3Rpb246ImZ1bmNpw7NuIixtYXA6Im1hcGEiLHJlY29yZDoicmVnaXN0cm8iLHR1cGxlOiJ0dXBsYSIsZW51bToiZW51bWVyYWNpw7NuIix1bmlvbjoidW5pw7NuIixsaXRlcmFsOiJsaXRlcmFsIixwcm9taXNlOiJwcm9tZXNhIix2b2lkOiJ2YWPDrW8iLG5ldmVyOiJudW5jYSIsdW5rbm93bjoiZGVzY29ub2NpZG8iLGFueToiY3VhbHF1aWVyYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BFbnRyYWRhIGludsOhbGlkYTogc2UgZXNwZXJhYmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCByZWNpYmlkbyAke3N9YDpgRW50cmFkYSBpbnbDoWxpZGE6IHNlIGVzcGVyYWJhICR7aX0sIHJlY2liaWRvICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHJhZGEgaW52w6FsaWRhOiBzZSBlc3BlcmFiYSAke1MoZS52YWx1ZXNbMF0pfWA6YE9wY2nDs24gaW52w6FsaWRhOiBzZSBlc3BlcmFiYSB1bmEgZGUgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuIGE/YERlbWFzaWFkbyBncmFuZGU6IHNlIGVzcGVyYWJhIHF1ZSAke3M/PyJ2YWxvciJ9IHR1dmllcmEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9zIn1gOmBEZW1hc2lhZG8gZ3JhbmRlOiBzZSBlc3BlcmFiYSBxdWUgJHtzPz8idmFsb3IifSBmdWVyYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BEZW1hc2lhZG8gcGVxdWXDsW86IHNlIGVzcGVyYWJhIHF1ZSAke3N9IHR1dmllcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YERlbWFzaWFkbyBwZXF1ZcOxbzogc2UgZXNwZXJhYmEgcXVlICR7c30gZnVlcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29tZW56YXIgY29uICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgdGVybWluYXIgZW4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIGluY2x1aXIgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29pbmNpZGlyIGNvbiBlbCBwYXRyw7NuICR7aS5wYXR0ZXJufWA6YEludsOhbGlkbyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTsO6bWVybyBpbnbDoWxpZG86IGRlYmUgc2VyIG3Dumx0aXBsbyBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBMbGF2ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gZGVzY29ub2NpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYExsYXZlIGludsOhbGlkYSBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbG9yIGludsOhbGlkbyBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIn19fTtmdW5jdGlvbiBhZigpe3JldHVybntsb2NhbGVFcnJvcjpvZigpfX1jb25zdCBzZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi2qnYp9ix2Kfaqdiq2LEiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifSxmaWxlOnt1bml0OiLYqNin24zYqiIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LGFycmF5Ont1bml0OiLYotuM2KrZhSIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LHNldDp7dW5pdDoi2KLbjNiq2YUiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2YjYsdmI2K/bjCIsZW1haWw6Itii2K/YsdizINin24zZhduM2YQiLHVybDoiVVJMIixlbW9qaToi2KfbjNmF2YjYrNuMIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLYqtin2LHbjNiuINmIINiy2YXYp9mGINin24zYstmIIixkYXRlOiLYqtin2LHbjNiuINin24zYstmIIix0aW1lOiLYstmF2KfZhiDYp9uM2LLZiCIsZHVyYXRpb246ItmF2K/YqiDYstmF2KfZhiDYp9uM2LLZiCIsaXB2NDoiSVB2NCDYotiv2LHYsyIsaXB2NjoiSVB2NiDYotiv2LHYsyIsY2lkcnY0OiJJUHY0INiv2KfZhdmG2YciLGNpZHJ2NjoiSVB2NiDYr9in2YXZhtmHIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkINix2LTYqtmHIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINix2LTYqtmHIixqc29uX3N0cmluZzoiSlNPTiDYsdi02KrZhyIsZTE2NDoiRS4xNjQg2LnYr9ivIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/bjCJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itii2LHYp9uM2YcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9INmF24zigIzYqNmI2K/YjCAke3N9INiv2LHbjNin2YHYqiDYtNivYDpg2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtpfSDZhduM4oCM2KjZiNiv2IwgJHtzfSDYr9ix24zYp9mB2Kog2LTYr2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtTKGUudmFsdWVzWzBdKX0g2YXbjOKAjNio2YjYr2A6YNqv2LLbjNmG2Ycg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqINuM2qnbjCDYp9iyICR7XyhlLnZhbHVlcywifCIpfSDZhduM4oCM2KjZiNivYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNiu24zZhNuMINio2LLYsdqvOiAke2Uub3JpZ2luPz8i2YXZgtiv2KfYsSJ9INio2KfbjNivICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYtdixIn0g2KjYp9i02K9gOmDYrtuM2YTbjCDYqNiy2LHarzogJHtlLm9yaWdpbj8/ItmF2YLYr9in2LEifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYrtuM2YTbjCDaqdmI2obaqTogJHtlLm9yaWdpbn0g2KjYp9uM2K8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDYqNin2LTYr2A6YNiu24zZhNuMINqp2YjahtqpOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2KcgIiR7aS5wcmVmaXh9IiDYtNix2YjYuSDYtNmI2K9gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYqNinICIke2kuc3VmZml4fSIg2KrZhdin2YUg2LTZiNivYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYtNin2YXZhCAiJHtpLmluY2x1ZGVzfSIg2KjYp9i02K9gOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2Kcg2KfZhNqv2YjbjCAke2kucGF0dGVybn0g2YXYt9in2KjZgtiqINiv2KfYtNiq2Ycg2KjYp9i02K9gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9mF2LnYqtio2LFgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g2LnYr9ivINmG2KfZhdi52KrYqNixOiDYqNin24zYryDZhdi22LHYqCAke2UuZGl2aXNvcn0g2KjYp9i02K9gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDaqdmE24zYryR7ZS5rZXlzLmxlbmd0aD4xPyLZh9in24wiOiIifSDZhtin2LTZhtin2LM6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g2qnZhNuM2K8g2YbYp9i02YbYp9izINiv2LEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g2YXZgtiv2KfYsSDZhtin2YXYudiq2KjYsSDYr9ixICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLZiNix2YjYr9uMINmG2KfZhdi52KrYqNixIn19fTtmdW5jdGlvbiBjZigpe3JldHVybntsb2NhbGVFcnJvcjpzZigpfX1jb25zdCB1Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoibWVya2tpw6QiLHN1YmplY3Q6Im1lcmtraWpvbm9uIn0sZmlsZTp7dW5pdDoidGF2dWEiLHN1YmplY3Q6InRpZWRvc3RvbiJ9LGFycmF5Ont1bml0OiJhbGtpb3RhIixzdWJqZWN0OiJsaXN0YW4ifSxzZXQ6e3VuaXQ6ImFsa2lvdGEiLHN1YmplY3Q6ImpvdWtvbiJ9LG51bWJlcjp7dW5pdDoiIixzdWJqZWN0OiJsdXZ1biJ9LGJpZ2ludDp7dW5pdDoiIixzdWJqZWN0OiJzdXVyZW4ga29rb25haXNsdXZ1biJ9LGludDp7dW5pdDoiIixzdWJqZWN0OiJrb2tvbmFpc2x1dnVuIn0sZGF0ZTp7dW5pdDoiIixzdWJqZWN0OiJww6RpdsOkbcOkw6Ryw6RuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InPDpMOkbm7DtmxsaW5lbiBsYXVzZWtlIixlbWFpbDoic8OkaGvDtnBvc3Rpb3NvaXRlIix1cmw6IlVSTC1vc29pdGUiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLWFpa2FsZWltYSIsZGF0ZToiSVNPLXDDpGl2w6Rtw6TDpHLDpCIsdGltZToiSVNPLWFpa2EiLGR1cmF0aW9uOiJJU08ta2VzdG8iLGlwdjQ6IklQdjQtb3NvaXRlIixpcHY2OiJJUHY2LW9zb2l0ZSIsY2lkcnY0OiJJUHY0LWFsdWUiLGNpZHJ2NjoiSVB2Ni1hbHVlIixiYXNlNjQ6ImJhc2U2NC1rb29kYXR0dSBtZXJra2lqb25vIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rb29kYXR0dSBtZXJra2lqb25vIixqc29uX3N0cmluZzoiSlNPTi1tZXJra2lqb25vIixlMTY0OiJFLjE2NC1sdWt1Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidGVtcGxhYXR0aW1lcmtraWpvbm8ifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgb2xpICR7c31gOmBWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluICR7aX0sIG9saSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IG9sbGEgJHtTKGUudmFsdWVzWzBdKX1gOmBWaXJoZWVsbGluZW4gdmFsaW50YTogdMOkeXR5eSBvbGxhIHlrc2kgc2V1cmFhdmlzdGE6ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BMaWlhbiBzdXVyaTogJHthLnN1YmplY3R9IHTDpHl0eXkgb2xsYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YC50cmltKCk6YExpaWFuIHN1dXJpOiBhcnZvbiB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTGlpYW4gcGllbmk6ICR7YS5zdWJqZWN0fSB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWAudHJpbSgpOmBMaWlhbiBwaWVuaTogYXJ2b24gdMOkeXR5eSBvbGxhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IGFsa2FhICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFZpcmhlZWxsaW5lbiBzecO2dGU6IHTDpHl0eXkgbG9wcHVhICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSBzaXPDpGx0w6TDpCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSB2YXN0YXRhIHPDpMOkbm7DtmxsaXN0w6QgbGF1c2VrZXR0YSAke2kucGF0dGVybn1gOmBWaXJoZWVsbGluZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFZpcmhlZWxsaW5lbiBsdWt1OiB0w6R5dHl5IG9sbGEgbHV2dW4gJHtlLmRpdmlzb3J9IG1vbmlrZXJ0YWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJUdW50ZW1hdHRvbWF0IGF2YWltZXQiOiJUdW50ZW1hdG9uIGF2YWluIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGF2YWluIHRpZXR1ZWVzc2EiO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIlZpcmhlZWxsaW5lbiB1bmlvbmkiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGFydm8gam91a29zc2EiO2RlZmF1bHQ6cmV0dXJuIlZpcmhlZWxsaW5lbiBzecO2dGUifX19O2Z1bmN0aW9uIGxmKCl7cmV0dXJue2xvY2FsZUVycm9yOnVmKCl9fWNvbnN0IGRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3TDqHJlcyIsdmVyYjoiYXZvaXIifSxmaWxlOnt1bml0OiJvY3RldHMiLHZlcmI6ImF2b2lyIn0sYXJyYXk6e3VuaXQ6IsOpbMOpbWVudHMiLHZlcmI6ImF2b2lyIn0sc2V0Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyw6llIixlbWFpbDoiYWRyZXNzZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUgZXQgaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e3N0cmluZzoiY2hhw65uZSIsbnVtYmVyOiJub21icmUiLGludDoiZW50aWVyIixib29sZWFuOiJib29sw6llbiIsYmlnaW50OiJncmFuZCBlbnRpZXIiLHN5bWJvbDoic3ltYm9sZSIsdW5kZWZpbmVkOiJpbmTDqWZpbmkiLG51bGw6Im51bGwiLG5ldmVyOiJqYW1haXMiLHZvaWQ6InZpZGUiLGRhdGU6ImRhdGUiLGFycmF5OiJ0YWJsZWF1IixvYmplY3Q6Im9iamV0Iix0dXBsZToidHVwbGUiLHJlY29yZDoiZW5yZWdpc3RyZW1lbnQiLG1hcDoiY2FydGUiLHNldDoiZW5zZW1ibGUiLGZpbGU6ImZpY2hpZXIiLG5vbm9wdGlvbmFsOiJub24tb3B0aW9ubmVsIixuYW46Ik5hTiIsZnVuY3Rpb246ImZvbmN0aW9uIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0gYXR0ZW5kdSwgJHtzfSByZcOndWA6YEVudHLDqWUgaW52YWxpZGUgOiAke2l9IGF0dGVuZHUsICR7c30gcmXDp3VgfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiAke1MoZS52YWx1ZXNbMF0pfSBhdHRlbmR1YDpgT3B0aW9uIGludmFsaWRlIDogdW5lIHZhbGV1ciBwYXJtaSAke18oZS52YWx1ZXMsInwiKX0gYXR0ZW5kdWVgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBncmFuZCA6ICR7b1tlLm9yaWdpbl0/PyJ2YWxldXIifSBkb2l0ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLDqWzDqW1lbnQocykifWA6YFRyb3AgZ3JhbmQgOiAke29bZS5vcmlnaW5dPz8idmFsZXVyIn0gZG9pdCDDqnRyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgw6p0cmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGNvbW1lbmNlciBwYXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgc2UgdGVybWluZXIgcGFyICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgaW5jbHVyZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vZMOobGUgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBtZigpe3JldHVybntsb2NhbGVFcnJvcjpkZigpfX1jb25zdCBwZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0w6hyZXMiLHZlcmI6ImF2b2lyIn0sZmlsZTp7dW5pdDoib2N0ZXRzIix2ZXJiOiJhdm9pciJ9LGFycmF5Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9LHNldDp7dW5pdDoiw6lsw6ltZW50cyIsdmVyYjoiYXZvaXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50csOpZSIsZW1haWw6ImFkcmVzc2UgY291cnJpZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUtaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmXDp3UgJHtzfWA6YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7aX0sIHJlw6d1ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7UyhlLnZhbHVlc1swXSl9YDpgT3B0aW9uIGludmFsaWRlIDogYXR0ZW5kdSBsJ3VuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaQiOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIGdyYW5kIDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbj8/ImxhIHZhbGV1ciJ9IGFpdCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcCBncmFuZCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW4/PyJsYSB2YWxldXIifSBzb2l0ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaUiOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gYWl0ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gc29pdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29tbWVuY2VyIHBhciAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBzZSB0ZXJtaW5lciBwYXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBpbmNsdXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBmZigpe3JldHVybntsb2NhbGVFcnJvcjpwZigpfX1jb25zdCBnZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7bGFiZWw6Itee15fXqNeV15bXqiIsZ2VuZGVyOiJmIn0sbnVtYmVyOntsYWJlbDoi157Xodek16giLGdlbmRlcjoibSJ9LGJvb2xlYW46e2xhYmVsOiLXoteo15og15HXldec15nXkNeg15kiLGdlbmRlcjoibSJ9LGJpZ2ludDp7bGFiZWw6IkJpZ0ludCIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15oiLGdlbmRlcjoibSJ9LGFycmF5OntsYWJlbDoi157Xoteo15oiLGdlbmRlcjoibSJ9LG9iamVjdDp7bGFiZWw6IteQ15XXkdeZ15nXp9eYIixnZW5kZXI6Im0ifSxudWxsOntsYWJlbDoi16LXqNeaINeo15nXpyAobnVsbCkiLGdlbmRlcjoibSJ9LHVuZGVmaW5lZDp7bGFiZWw6Itei16jXmiDXnNeQINee15XXkteT16ggKHVuZGVmaW5lZCkiLGdlbmRlcjoibSJ9LHN5bWJvbDp7bGFiZWw6Iteh15nXnteR15XXnCAoU3ltYm9sKSIsZ2VuZGVyOiJtIn0sZnVuY3Rpb246e2xhYmVsOiLXpNeV16DXp9em15nXlCIsZ2VuZGVyOiJmIn0sbWFwOntsYWJlbDoi157XpNeUIChNYXApIixnZW5kZXI6ImYifSxzZXQ6e2xhYmVsOiLXp9eR15XXpteUIChTZXQpIixnZW5kZXI6ImYifSxmaWxlOntsYWJlbDoi16fXldeR16UiLGdlbmRlcjoibSJ9LHByb21pc2U6e2xhYmVsOiJQcm9taXNlIixnZW5kZXI6Im0ifSxOYU46e2xhYmVsOiJOYU4iLGdlbmRlcjoibSJ9LHVua25vd246e2xhYmVsOiLXoteo15og15zXkCDXmdeT15XXoiIsZ2VuZGVyOiJtIn0sdmFsdWU6e2xhYmVsOiLXoteo15oiLGdlbmRlcjoibSJ9fSxuPXtzdHJpbmc6e3VuaXQ6Iteq15XXldeZ150iLHNob3J0TGFiZWw6Iten16bXqCIsbG9uZ0xhYmVsOiLXkNeo15XXmiJ9LGZpbGU6e3VuaXQ6IteR15nXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sYXJyYXk6e3VuaXQ6Itek16jXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sc2V0Ont1bml0OiLXpNeo15nXmNeZ150iLHNob3J0TGFiZWw6Iten15jXnyIsbG9uZ0xhYmVsOiLXkteT15XXnCJ9LG51bWJlcjp7dW5pdDoiIixzaG9ydExhYmVsOiLXp9eY158iLGxvbmdMYWJlbDoi15LXk9eV15wifX0scj11PT51P3RbdV06dm9pZCAwLG89dT0+e2NvbnN0IGw9cih1KTtyZXR1cm4gbD9sLmxhYmVsOnU/P3QudW5rbm93bi5sYWJlbH0sZT11PT5g15Qke28odSl9YCxpPXU9PihyKHUpPy5nZW5kZXI/PyJtIik9PT0iZiI/Item16jXmdeb15Qg15zXlNeZ15XXqiI6Item16jXmdeaINec15TXmdeV16oiLGE9dT0+dT9uW3VdPz9udWxsOm51bGwscz17cmVnZXg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGVtYWlsOntsYWJlbDoi15vXqteV15HXqiDXkNeZ157XmdeZ15wiLGdlbmRlcjoiZiJ9LHVybDp7bGFiZWw6Iteb16rXldeR16og16jXqdeqIixnZW5kZXI6ImYifSxlbW9qaTp7bGFiZWw6IteQ15nXnteV15In15kiLGdlbmRlcjoibSJ9LHV1aWQ6e2xhYmVsOiJVVUlEIixnZW5kZXI6Im0ifSxuYW5vaWQ6e2xhYmVsOiJuYW5vaWQiLGdlbmRlcjoibSJ9LGd1aWQ6e2xhYmVsOiJHVUlEIixnZW5kZXI6Im0ifSxjdWlkOntsYWJlbDoiY3VpZCIsZ2VuZGVyOiJtIn0sY3VpZDI6e2xhYmVsOiJjdWlkMiIsZ2VuZGVyOiJtIn0sdWxpZDp7bGFiZWw6IlVMSUQiLGdlbmRlcjoibSJ9LHhpZDp7bGFiZWw6IlhJRCIsZ2VuZGVyOiJtIn0sa3N1aWQ6e2xhYmVsOiJLU1VJRCIsZ2VuZGVyOiJtIn0sZGF0ZXRpbWU6e2xhYmVsOiLXqteQ16jXmdeaINeV15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15ogSVNPIixnZW5kZXI6Im0ifSx0aW1lOntsYWJlbDoi15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZHVyYXRpb246e2xhYmVsOiLXntep15og15bXntefIElTTyIsZ2VuZGVyOiJtIn0saXB2NDp7bGFiZWw6Iteb16rXldeR16ogSVB2NCIsZ2VuZGVyOiJmIn0saXB2Njp7bGFiZWw6Iteb16rXldeR16ogSVB2NiIsZ2VuZGVyOiJmIn0sY2lkcnY0OntsYWJlbDoi15jXldeV15cgSVB2NCIsZ2VuZGVyOiJtIn0sY2lkcnY2OntsYWJlbDoi15jXldeV15cgSVB2NiIsZ2VuZGVyOiJtIn0sYmFzZTY0OntsYWJlbDoi157Xl9eo15XXlteqINeR15HXodeZ16EgNjQiLGdlbmRlcjoiZiJ9LGJhc2U2NHVybDp7bGFiZWw6Itee15fXqNeV15bXqiDXkdeR16HXmdehIDY0INec15vXqteV15HXldeqINeo16nXqiIsZ2VuZGVyOiJmIn0sanNvbl9zdHJpbmc6e2xhYmVsOiLXnteX16jXldeW16ogSlNPTiIsZ2VuZGVyOiJmIn0sZTE2NDp7bGFiZWw6Itee16HXpNeoIEUuMTY0IixnZW5kZXI6Im0ifSxqd3Q6e2xhYmVsOiJKV1QiLGdlbmRlcjoibSJ9LGVuZHNfd2l0aDp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0saW5jbHVkZXM6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGxvd2VyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0sc3RhcnRzX3dpdGg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LHVwcGVyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn19LGM9e25hbjoiTmFOIn07cmV0dXJuIHU9Pntzd2l0Y2godS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGw9dS5leHBlY3RlZCxnPWNbbD8/IiJdPz9vKGwpLHY9dyh1LmlucHV0KSwkPWNbdl0/P3Rbdl0/LmxhYmVsPz92O3JldHVybi9eW0EtWl0vLnRlc3QodS5leHBlY3RlZCk/YNen15zXmCDXnNeQINeq16fXmdefOiDXpteo15nXmiDXnNeU15nXldeqIGluc3RhbmNlb2YgJHt1LmV4cGVjdGVkfSwg15TXqten15HXnCAkeyR9YDpg16fXnNeYINec15Ag16rXp9eZ1586INem16jXmdeaINec15TXmdeV16ogJHtnfSwg15TXqten15HXnCAkeyR9YH1jYXNlImludmFsaWRfdmFsdWUiOntpZih1LnZhbHVlcy5sZW5ndGg9PT0xKXJldHVybmDXoteo15og15zXkCDXqten15nXnzog15TXoteo15og15fXmdeZ15Eg15zXlNeZ15XXqiAke1ModS52YWx1ZXNbMF0pfWA7Y29uc3QgbD11LnZhbHVlcy5tYXAoJD0+UygkKSk7aWYodS52YWx1ZXMubGVuZ3RoPT09MilyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsWzBdfSDXkNeVICR7bFsxXX1gO2NvbnN0IGc9bFtsLmxlbmd0aC0xXTtyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsLnNsaWNlKDAsLTEpLmpvaW4oIiwgIil9INeQ15UgJHtnfWB9Y2FzZSJ0b29fYmlnIjp7Y29uc3QgbD1hKHUub3JpZ2luKSxnPWUodS5vcmlnaW4/PyJ2YWx1ZSIpO2lmKHUub3JpZ2luPT09InN0cmluZyIpcmV0dXJuYCR7bD8ubG9uZ0xhYmVsPz8i15DXqNeV15oifSDXnteT15k6ICR7Z30g16bXqNeZ15vXlCDXnNeU15vXmdecICR7dS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7bD8udW5pdD8/IiJ9ICR7dS5pbmNsdXNpdmU/IteQ15Ug16TXl9eV16oiOiLXnNeb15wg15TXmdeV16rXqCJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g16fXmNefINeQ15Ug16nXldeV15Qg15wtJHt1Lm1heGltdW19YDpg16fXmNefINeeLSR7dS5tYXhpbXVtfWA7cmV0dXJuYNeS15PXldecINee15PXmTogJHtnfSDXpteo15nXmiDXnNeU15nXldeqICR7eX1gfWlmKHUub3JpZ2luPT09ImFycmF5Inx8dS5vcmlnaW49PT0ic2V0Iil7Y29uc3QgeT11Lm9yaWdpbj09PSJzZXQiPyLXpteo15nXm9eUIjoi16bXqNeZ15oiLEg9dS5pbmNsdXNpdmU/YCR7dS5tYXhpbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINek15fXldeqYDpg16TXl9eV16og154tJHt1Lm1heGltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g15LXk9eV15wg157Xk9eZOiAke2d9ICR7eX0g15zXlNeb15nXnCAke0h9YC50cmltKCl9Y29uc3Qgdj11LmluY2x1c2l2ZT8iPD0iOiI8IiwkPWkodS5vcmlnaW4/PyJ2YWx1ZSIpO3JldHVybiBsPy51bml0P2Ake2wubG9uZ0xhYmVsfSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1heGltdW0udG9TdHJpbmcoKX0gJHtsLnVuaXR9YDpgJHtsPy5sb25nTGFiZWw/PyLXkteT15XXnCJ9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBsPWEodS5vcmlnaW4pLGc9ZSh1Lm9yaWdpbj8/InZhbHVlIik7aWYodS5vcmlnaW49PT0ic3RyaW5nIilyZXR1cm5gJHtsPy5zaG9ydExhYmVsPz8i16fXpteoIn0g157Xk9eZOiAke2d9INem16jXmdeb15Qg15zXlNeb15nXnCAke3UubWluaW11bS50b1N0cmluZygpfSAke2w/LnVuaXQ/PyIifSAke3UuaW5jbHVzaXZlPyLXkNeVINeZ15XXqteoIjoi15zXpNeX15XXqiJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g15LXk9eV15wg15DXlSDXqdeV15XXlCDXnC0ke3UubWluaW11bX1gOmDXkteT15XXnCDXni0ke3UubWluaW11bX1gO3JldHVybmDXp9eY158g157Xk9eZOiAke2d9INem16jXmdeaINec15TXmdeV16ogJHt5fWB9aWYodS5vcmlnaW49PT0iYXJyYXkifHx1Lm9yaWdpbj09PSJzZXQiKXtjb25zdCB5PXUub3JpZ2luPT09InNldCI/Item16jXmdeb15QiOiLXpteo15nXmiI7aWYodS5taW5pbXVtPT09MSYmdS5pbmNsdXNpdmUpe2NvbnN0IEw9KHUub3JpZ2luPT09InNldCIsItec16TXl9eV16og16TXqNeZ15gg15DXl9eTIik7cmV0dXJuYNen15jXnyDXnteT15k6ICR7Z30gJHt5fSDXnNeU15vXmdecICR7TH1gfWNvbnN0IEg9dS5pbmNsdXNpdmU/YCR7dS5taW5pbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINeZ15XXqteoYDpg15nXldeq16gg154tJHt1Lm1pbmltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g16fXmNefINee15PXmTogJHtnfSAke3l9INec15TXm9eZ15wgJHtIfWAudHJpbSgpfWNvbnN0IHY9dS5pbmNsdXNpdmU/Ij49IjoiPiIsJD1pKHUub3JpZ2luPz8idmFsdWUiKTtyZXR1cm4gbD8udW5pdD9gJHtsLnNob3J0TGFiZWx9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWluaW11bS50b1N0cmluZygpfSAke2wudW5pdH1gOmAke2w/LnNob3J0TGFiZWw/PyLXp9eY158ifSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBsPXU7aWYobC5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteX15nXnCDXkSAiJHtsLnByZWZpeH0iYDtpZihsLmZvcm1hdD09PSJlbmRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXodeq15nXmdedINeRICIke2wuc3VmZml4fSJgO2lmKGwuZm9ybWF0PT09ImluY2x1ZGVzIilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeb15zXldecICIke2wuaW5jbHVkZXN9ImA7aWYobC5mb3JtYXQ9PT0icmVnZXgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteQ15nXnSDXnNeq15HXoNeZ16ogJHtsLnBhdHRlcm59YDtjb25zdCBnPXNbbC5mb3JtYXRdLHY9Zz8ubGFiZWw/P2wuZm9ybWF0LHk9KGc/LmdlbmRlcj8/Im0iKT09PSJmIj8i16rXp9eZ16DXlCI6Iteq16fXmdefIjtyZXR1cm5gJHt2fSDXnNeQICR7eX1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g157Xodek16gg15zXkCDXqten15nXnzog15fXmdeZ15Eg15zXlNeZ15XXqiDXnteb16TXnNeUINep15wgJHt1LmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g157XpNeq15cke3Uua2V5cy5sZW5ndGg+MT8i15XXqiI6IiJ9INec15Ag157XlteV15Qke3Uua2V5cy5sZW5ndGg+MT8i15nXnSI6IteUIn06ICR7Xyh1LmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4i16nXk9eUINec15Ag16rXp9eZ158g15HXkNeV15HXmdeZ16fXmCI7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ158g15Eke2UodS5vcmlnaW4/PyJhcnJheSIpfWA7ZGVmYXVsdDpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158ifX19O2Z1bmN0aW9uIHZmKCl7cmV0dXJue2xvY2FsZUVycm9yOmdmKCl9fWNvbnN0IGhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrb3ZhIix2ZXJiOiJpbWF0aSJ9LGZpbGU6e3VuaXQ6ImJhanRvdmEiLHZlcmI6ImltYXRpIn0sYXJyYXk6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifSxzZXQ6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidW5vcyIsZW1haWw6ImVtYWlsIGFkcmVzYSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGkgdnJpamVtZSIsZGF0ZToiSVNPIGRhdHVtIix0aW1lOiJJU08gdnJpamVtZSIsZHVyYXRpb246IklTTyB0cmFqYW5qZSIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6IklQdjQgcmFzcG9uIixjaWRydjY6IklQdjYgcmFzcG9uIixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuaSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbmkgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHRla3N0IixlMTY0OiJFLjE2NCBicm9qIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidW5vcyJ9LG89e25hbjoiTmFOIixzdHJpbmc6InRla3N0IixudW1iZXI6ImJyb2oiLGJvb2xlYW46ImJvb2xlYW4iLGFycmF5OiJuaXoiLG9iamVjdDoib2JqZWt0IixzZXQ6InNrdXAiLGZpbGU6ImRhdG90ZWthIixkYXRlOiJkYXR1bSIsYmlnaW50OiJiaWdpbnQiLHN5bWJvbDoic2ltYm9sIix1bmRlZmluZWQ6InVuZGVmaW5lZCIsbnVsbDoibnVsbCIsZnVuY3Rpb246ImZ1bmtjaWphIixtYXA6Im1hcGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTmVpc3ByYXZhbiB1bm9zOiBvxI1la3VqZSBzZSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGEgcHJpbWxqZW5vIGplICR7c31gOmBOZWlzcHJhdmFuIHVub3M6IG/EjWVrdWplIHNlICR7aX0sIGEgcHJpbWxqZW5vIGplICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5laXNwcmF2bmEgdnJpamVkbm9zdDogb8SNZWtpdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5laXNwcmF2bmEgb3BjaWphOiBvxI1la2l2YW5vIGplZG5vIG9kICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmV2ZWxpa286IG/EjWVraXZhbm8gZGEgJHtzPz8idnJpamVkbm9zdCJ9IGltYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW5hdGEifWA6YFByZXZlbGlrbzogb8SNZWtpdmFubyBkYSAke3M/PyJ2cmlqZWRub3N0In0gYnVkZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gaW1hICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gYnVkZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSB6YXBvxI1pbmphdGkgcyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHphdnLFoWF2YXRpIHMgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHNhZHLFvmF2YXRpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIG9kZ292YXJhdGkgdXpvcmt1ICR7aS5wYXR0ZXJufWA6YE5laXNwcmF2bmEgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5laXNwcmF2YW4gYnJvajogbW9yYSBiaXRpIHZpxaFla3JhdG5payBvZCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOZXByZXBvem5hdCR7ZS5rZXlzLmxlbmd0aD4xPyJpIGtsanXEjWV2aSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZWlzcHJhdmFuIGtsanXEjSB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5laXNwcmF2bmEgdnJpamVkbm9zdCB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIn19fTtmdW5jdGlvbiAkZigpe3JldHVybntsb2NhbGVFcnJvcjpoZigpfX1jb25zdCBfZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6ImxlZ3llbiJ9LGZpbGU6e3VuaXQ6ImJ5dGUiLHZlcmI6ImxlZ3llbiJ9LGFycmF5Ont1bml0OiJlbGVtIix2ZXJiOiJsZWd5ZW4ifSxzZXQ6e3VuaXQ6ImVsZW0iLHZlcmI6ImxlZ3llbiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJiZW1lbmV0IixlbWFpbDoiZW1haWwgY8OtbSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGlkxZFiw6lseWVnIixkYXRlOiJJU08gZMOhdHVtIix0aW1lOiJJU08gaWTFkSIsZHVyYXRpb246IklTTyBpZMWRaW50ZXJ2YWxsdW0iLGlwdjQ6IklQdjQgY8OtbSIsaXB2NjoiSVB2NiBjw61tIixjaWRydjQ6IklQdjQgdGFydG9tw6FueSIsY2lkcnY2OiJJUHY2IHRhcnRvbcOhbnkiLGJhc2U2NDoiYmFzZTY0LWvDs2RvbHQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rw7Nkb2x0IHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBzesOhbSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImJlbWVuZXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJzesOhbSIsYXJyYXk6InTDtm1iIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YMOJcnbDqW55dGVsZW4gYmVtZW5ldDogYSB2w6FydCDDqXJ0w6lrIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YDpgw4lydsOpbnl0ZWxlbiBiZW1lbmV0OiBhIHbDoXJ0IMOpcnTDqWsgJHtpfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDiXJ2w6lueXRlbGVuIGJlbWVuZXQ6IGEgdsOhcnQgw6lydMOpayAke1MoZS52YWx1ZXNbMF0pfWA6YMOJcnbDqW55dGVsZW4gb3BjacOzOiB2YWxhbWVseWlrIMOpcnTDqWsgdsOhcnQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDumwgbmFneTogJHtlLm9yaWdpbj8/IsOpcnTDqWsifSBtw6lyZXRlIHTDumwgbmFneSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtIn1gOmBUw7psIG5hZ3k6IGEgYmVtZW5ldGkgw6lydMOpayAke2Uub3JpZ2luPz8iw6lydMOpayJ9IHTDumwgbmFneTogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IG3DqXJldGUgdMO6bCBraWNzaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IHTDumwga2ljc2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMOJcnbDqW55dGVsZW4gc3RyaW5nOiAiJHtpLnByZWZpeH0iIMOpcnTDqWtrZWwga2VsbCBrZXpkxZFkbmllYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DDiXJ2w6lueXRlbGVuIHN0cmluZzogIiR7aS5zdWZmaXh9IiDDqXJ0w6lra2VsIGtlbGwgdsOpZ3rFkWRuaWVgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICIke2kuaW5jbHVkZXN9IiDDqXJ0w6lrZXQga2VsbCB0YXJ0YWxtYXpuaWFgOmkuZm9ybWF0PT09InJlZ2V4Ij9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICR7aS5wYXR0ZXJufSBtaW50w6FuYWsga2VsbCBtZWdmZWxlbG5pZWA6YMOJcnbDqW55dGVsZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYMOJcnbDqW55dGVsZW4gc3rDoW06ICR7ZS5kaXZpc29yfSB0w7ZiYnN6w7Zyw7Zzw6luZWsga2VsbCBsZW5uaWVgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBJc21lcmV0bGVuIGt1bGNzJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDDiXJ2w6lueXRlbGVuIGt1bGNzICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDiXJ2w6lueXRlbGVuIGJlbWVuZXQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gw4lydsOpbnl0ZWxlbiDDqXJ0w6lrOiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iw4lydsOpbnl0ZWxlbiBiZW1lbmV0In19fTtmdW5jdGlvbiBiZigpe3JldHVybntsb2NhbGVFcnJvcjpfZigpfX1mdW5jdGlvbiBQcyh0LG4scil7cmV0dXJuIE1hdGguYWJzKHQpPT09MT9uOnJ9ZnVuY3Rpb24gRmUodCl7aWYoIXQpcmV0dXJuIiI7Y29uc3Qgbj1bItWhIiwi1aUiLCLVqCIsItWrIiwi1bgiLCLVuNaCIiwi1oUiXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIHQrKG4uaW5jbHVkZXMocik/ItW2Ijoi1agiKX1jb25zdCB5Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDp7b25lOiLVttW31aHVtiIsbWFueToi1bbVt9Wh1bbVttWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9LGZpbGU6e3VuaXQ6e29uZToi1aLVodW11akiLG1hbnk6ItWi1aHVtdWp1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sYXJyYXk6e3VuaXQ6e29uZToi1b/VodaA1oAiLG1hbnk6ItW/1aHWgNaA1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sc2V0Ont1bml0OntvbmU6ItW/1aHWgNaAIixtYW55OiLVv9Wh1oDWgNWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLVtNW41oLVv9aEIixlbWFpbDoi1afVrC4g1bDVodW91oHVpSIsdXJsOiJVUkwiLGVtb2ppOiLVp9W01bjVu9WrIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g1aHVtNW91aHVqdWr1b4g1ocg1arVodW0IixkYXRlOiJJU08g1aHVtNW91aHVqdWr1b4iLHRpbWU6IklTTyDVqtWh1bQiLGR1cmF0aW9uOiJJU08g1b/Wh9W41bLVuNaC1anVtdW41oLVtiIsaXB2NDoiSVB2NCDVsNWh1b3WgdWlIixpcHY2OiJJUHY2INWw1aHVvdaB1aUiLGNpZHJ2NDoiSVB2NCDVtNWr1bvVodWv1aHVtdaEIixjaWRydjY6IklQdjYg1bTVq9W71aHVr9Wh1bXWhCIsYmFzZTY0OiJiYXNlNjQg1bHWh9Wh1bnVodaD1bjVviDVv9W41bIiLGJhc2U2NHVybDoiYmFzZTY0dXJsINWx1ofVodW51aHWg9W41b4g1b/VuNWyIixqc29uX3N0cmluZzoiSlNPTiDVv9W41bIiLGUxNjQ6IkUuMTY0INWw1aHVtNWh1oAiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLVtNW41oLVv9aEIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi1anVq9W+IixhcnJheToi1abVodW21aPVvtWh1a4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDVvdW/1aHWgdW+1aXVrCDVpyAke3N9YDpg1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtpfSwg1b3Vv9Wh1oHVvtWl1awg1acgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtTKGUudmFsdWVzWzFdKX1gOmDVjdWt1aHVrCDVv9Wh1oDVotWl1oDVodWv4oCkINW91brVodW91b7VuNaC1bQg1afWgCDVsNWl1b/Wh9W11aHVrNW21aXWgNWr1oEg1bTVpdWv1ajVnSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1heGltdW0pLGM9UHMocyxhLnVuaXQub25lLGEudW5pdC5tYW55KTtyZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWv1bjWgtW21aXVttWhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWs1avVttWrICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5taW5pbXVtKSxjPVBzKHMsYS51bml0Lm9uZSxhLnVuaXQubWFueSk7cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVr9W41oLVttWl1bbVoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVrNWr1bbVqyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g1Y3VrdWh1awg1b/VuNWy4oCkINW61aXVv9aEINWnINW91a/VvdW+1asgIiR7aS5wcmVmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DVjdWt1aHVrCDVv9W41bLigKQg1brVpdW/1oQg1acg1aHVvtWh1oDVv9W+1asgIiR7aS5zdWZmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVutWh1oDVuNaC1bbVodWv1asgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVsNWh1bTVodW61aHVv9Wh1b3VrdWh1bbVqyAke2kucGF0dGVybn0g1bHWh9Wh1bnVodaD1avVtmA6YNWN1a3VodWsICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDVjdWt1aHVrCDVqdWr1b7igKQg1brVpdW/1oQg1acg1aLVodWm1bTVodW61aHVv9Wr1a8g1azVq9W21asgJHtlLmRpdmlzb3J9LdWrYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g1YnVs9Wh1bbVodW51b7VodWuINWi1aHVttWh1azVqyR7ZS5rZXlzLmxlbmd0aD4xPyLVttWl1oAiOiIifS4gJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDVjdWt1aHVrCDVotWh1bbVodWs1asgJHtGZShlLm9yaWdpbil9LdW41oLVtGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDVjdWt1aHVrCDVodaA1arVpdaEICR7RmUoZS5vcmlnaW4pfS3VuNaC1bRgO2RlZmF1bHQ6cmV0dXJuItWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bQifX19O2Z1bmN0aW9uIGtmKCl7cmV0dXJue2xvY2FsZUVycm9yOnlmKCl9fWNvbnN0IFNmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrYXJha3RlciIsdmVyYjoibWVtaWxpa2kifSxmaWxlOnt1bml0OiJieXRlIix2ZXJiOiJtZW1pbGlraSJ9LGFycmF5Ont1bml0OiJpdGVtIix2ZXJiOiJtZW1pbGlraSJ9LHNldDp7dW5pdDoiaXRlbSIsdmVyYjoibWVtaWxpa2kifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhbmdnYWwgZGFuIHdha3R1IGZvcm1hdCBJU08iLGRhdGU6InRhbmdnYWwgZm9ybWF0IElTTyIsdGltZToiamFtIGZvcm1hdCBJU08iLGR1cmF0aW9uOiJkdXJhc2kgZm9ybWF0IElTTyIsaXB2NDoiYWxhbWF0IElQdjQiLGlwdjY6ImFsYW1hdCBJUHY2IixjaWRydjQ6InJlbnRhbmcgYWxhbWF0IElQdjQiLGNpZHJ2NjoicmVudGFuZyBhbGFtYXQgSVB2NiIsYmFzZTY0OiJzdHJpbmcgZGVuZ2FuIGVua29kZSBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRlbmdhbiBlbmtvZGUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoic3RyaW5nIEpTT04iLGUxNjQ6ImFuZ2thIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGRpdGVyaW1hICR7c31gOmBJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke2l9LCBkaXRlcmltYSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gc2FsYWggc2F0dSBkYXJpICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWhhcmFwa2FuICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IG1lbWlsaWtpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbiJ9YDpgVGVybGFsdSBiZXNhcjogZGloYXJhcGthbiAke2Uub3JpZ2luPz8idmFsdWUifSBtZW5qYWRpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVtaWxpa2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVuamFkaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gU3RyaW5nIHRpZGFrIHZhbGlkOiBoYXJ1cyBkaW11bGFpIGRlbmdhbiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BTdHJpbmcgdGlkYWsgdmFsaWQ6IGhhcnVzIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgbWVueWVydGFrYW4gIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgc2VzdWFpIHBvbGEgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IHRpZGFrIHZhbGlkYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYEFuZ2thIHRpZGFrIHZhbGlkOiBoYXJ1cyBrZWxpcGF0YW4gZGFyaSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBLdW5jaSB0aWRhayBkaWtlbmFsaSAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEt1bmNpIHRpZGFrIHZhbGlkIGRpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayB2YWxpZCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBOaWxhaSB0aWRhayB2YWxpZCBkaSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgdGlkYWsgdmFsaWQifX19O2Z1bmN0aW9uIHdmKCl7cmV0dXJue2xvY2FsZUVycm9yOlNmKCl9fWNvbnN0IElmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJzdGFmaSIsdmVyYjoiYcOwIGhhZmEifSxmaWxlOnt1bml0OiJiw6Z0aSIsdmVyYjoiYcOwIGhhZmEifSxhcnJheTp7dW5pdDoiaGx1dGkiLHZlcmI6ImHDsCBoYWZhIn0sc2V0Ont1bml0OiJobHV0aSIsdmVyYjoiYcOwIGhhZmEifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZ2lsZGkiLGVtYWlsOiJuZXRmYW5nIix1cmw6InZlZnNsw7PDsCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGFnc2V0bmluZyBvZyB0w61taSIsZGF0ZToiSVNPIGRhZ3NldG5pbmciLHRpbWU6IklTTyB0w61taSIsZHVyYXRpb246IklTTyB0w61tYWxlbmdkIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyZW5ndXIiLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyZW5ndXIiLGpzb25fc3RyaW5nOiJKU09OIHN0cmVuZ3VyIixlMTY0OiJFLjE2NCB0w7ZsdWdpbGRpIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZ2lsZGkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJuw7ptZXIiLGFycmF5OiJmeWxraSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BSYW5ndCBnaWxkaTogw57DuiBzbMOzc3QgaW5uICR7c30gw75hciBzZW0gw6EgYcOwIHZlcmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9YDpgUmFuZ3QgZ2lsZGk6IMOew7ogc2zDs3N0IGlubiAke3N9IMO+YXIgc2VtIMOhIGHDsCB2ZXJhICR7aX1gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFJhbmd0IGdpbGRpOiBnZXJ0IHLDocOwIGZ5cmlyICR7UyhlLnZhbHVlc1swXSl9YDpgw5NnaWx0IHZhbDogbcOhIHZlcmEgZWl0dCBhZiBlZnRpcmZhcmFuZGkgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE9mIHN0w7NydDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbj8/ImdpbGRpIn0gaGFmaSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJobHV0aSJ9YDpgT2Ygc3TDs3J0OiBnZXJ0IGVyIHLDocOwIGZ5cmlyIGHDsCAke2Uub3JpZ2luPz8iZ2lsZGkifSBzw6kgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gaGFmaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gc8OpICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgYnlyamEgw6EgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGVuZGEgw6EgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgaW5uaWhhbGRhICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgZnlsZ2phIG15bnN0cmkgJHtpLnBhdHRlcm59YDpgUmFuZ3QgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFLDtm5nIHRhbGE6IHZlcsOwdXIgYcOwIHZlcmEgbWFyZ2ZlbGRpIGFmICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYMOTw75la2t0ICR7ZS5rZXlzLmxlbmd0aD4xPyJpciBseWtsYXIiOiJ1ciBseWtpbGwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBSYW5ndXIgbHlraWxsIMOtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJSYW5ndCBnaWxkaSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBSYW5ndCBnaWxkaSDDrSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iUmFuZ3QgZ2lsZGkifX19O2Z1bmN0aW9uIHpmKCl7cmV0dXJue2xvY2FsZUVycm9yOklmKCl9fWNvbnN0IHhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhdHRlcmkiLHZlcmI6ImF2ZXJlIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiYXZlcmUifSxhcnJheTp7dW5pdDoiZWxlbWVudGkiLHZlcmI6ImF2ZXJlIn0sc2V0Ont1bml0OiJlbGVtZW50aSIsdmVyYjoiYXZlcmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJpbmRpcml6em8gZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBvcmEgSVNPIixkYXRlOiJkYXRhIElTTyIsdGltZToib3JhIElTTyIsZHVyYXRpb246ImR1cmF0YSBJU08iLGlwdjQ6ImluZGlyaXp6byBJUHY0IixpcHY2OiJpbmRpcml6em8gSVB2NiIsY2lkcnY0OiJpbnRlcnZhbGxvIElQdjQiLGNpZHJ2NjoiaW50ZXJ2YWxsbyBJUHY2IixiYXNlNjQ6InN0cmluZ2EgY29kaWZpY2F0YSBpbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhdGEgaW4gYmFzZTY0Iixqc29uX3N0cmluZzoic3RyaW5nYSBKU09OIixlMTY0OiJudW1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im51bWVybyIsYXJyYXk6InZldHRvcmUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gSW5wdXQgbm9uIHZhbGlkbzogYXR0ZXNvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmljZXZ1dG8gJHtzfWA6YElucHV0IG5vbiB2YWxpZG86IGF0dGVzbyAke2l9LCByaWNldnV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCBub24gdmFsaWRvOiBhdHRlc28gJHtTKGUudmFsdWVzWzBdKX1gOmBPcHppb25lIG5vbiB2YWxpZGE6IGF0dGVzbyB1bm8gdHJhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wcG8gZ3JhbmRlOiAke2Uub3JpZ2luPz8idmFsb3JlIn0gZGV2ZSBhdmVyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50aSJ9YDpgVHJvcHBvIGdyYW5kZTogJHtlLm9yaWdpbj8/InZhbG9yZSJ9IGRldmUgZXNzZXJlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRyb3BwbyBwaWNjb2xvOiAke2Uub3JpZ2lufSBkZXZlIGF2ZXJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wcG8gcGljY29sbzogJHtlLm9yaWdpbn0gZGV2ZSBlc3NlcmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZ2Egbm9uIHZhbGlkYTogZGV2ZSBpbml6aWFyZSBjb24gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gU3RyaW5nYSBub24gdmFsaWRhOiBkZXZlIHRlcm1pbmFyZSBjb24gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgaW5jbHVkZXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgY29ycmlzcG9uZGVyZSBhbCBwYXR0ZXJuICR7aS5wYXR0ZXJufWA6YElucHV0IG5vbiB2YWxpZG86ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW1lcm8gbm9uIHZhbGlkbzogZGV2ZSBlc3NlcmUgdW4gbXVsdGlwbG8gZGkgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2hpYXYke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImUifSBub24gcmljb25vc2NpdXQke2Uua2V5cy5sZW5ndGg+MT8iZSI6ImEifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGlhdmUgbm9uIHZhbGlkYSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvcmUgbm9uIHZhbGlkbyBpbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyJ9fX07ZnVuY3Rpb24gVGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6eGYoKX19Y29uc3QgamY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuaWh+WtlyIsdmVyYjoi44Gn44GC44KLIn0sZmlsZTp7dW5pdDoi44OQ44Kk44OIIix2ZXJiOiLjgafjgYLjgosifSxhcnJheTp7dW5pdDoi6KaB57SgIix2ZXJiOiLjgafjgYLjgosifSxzZXQ6e3VuaXQ6Iuimgee0oCIsdmVyYjoi44Gn44GC44KLIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuWFpeWKm+WApCIsZW1haWw6IuODoeODvOODq+OCouODieODrOOCuSIsdXJsOiJVUkwiLGVtb2ppOiLntbXmloflrZciLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTT+aXpeaZgiIsZGF0ZToiSVNP5pel5LuYIix0aW1lOiJJU0/mmYLliLsiLGR1cmF0aW9uOiJJU0/mnJ/plpMiLGlwdjQ6IklQdjTjgqLjg4njg6zjgrkiLGlwdjY6IklQdjbjgqLjg4njg6zjgrkiLGNpZHJ2NDoiSVB2NOevhOWbsiIsY2lkcnY2OiJJUHY256+E5ZuyIixiYXNlNjQ6ImJhc2U2NOOCqOODs+OCs+ODvOODieaWh+Wtl+WIlyIsYmFzZTY0dXJsOiJiYXNlNjR1cmzjgqjjg7PjgrPjg7zjg4nmloflrZfliJciLGpzb25fc3RyaW5nOiJKU09O5paH5a2X5YiXIixlMTY0OiJFLjE2NOeVquWPtyIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuWFpeWKm+WApCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuaVsOWApCIsYXJyYXk6IumFjeWIlyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DnhKHlirnjgarlhaXlips6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfeOBjOacn+W+heOBleOCjOOBvuOBl+OBn+OBjOOAgSR7c33jgYzlhaXlipvjgZXjgozjgb7jgZfjgZ9gOmDnhKHlirnjgarlhaXlips6ICR7aX3jgYzmnJ/lvoXjgZXjgozjgb7jgZfjgZ/jgYzjgIEke3N944GM5YWl5Yqb44GV44KM44G+44GX44GfYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DnhKHlirnjgarlhaXlips6ICR7UyhlLnZhbHVlc1swXSl944GM5pyf5b6F44GV44KM44G+44GX44GfYDpg54Sh5Yq544Gq6YG45oqeOiAke18oZS52YWx1ZXMsIuOAgSIpfeOBruOBhOOBmuOCjOOBi+OBp+OBguOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i5Lul5LiL44Gn44GC44KLIjoi44KI44KK5bCP44GV44GEIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHthLnVuaXQ/PyLopoHntKAifSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtpfeW/heimgeOBjOOBguOCiuOBvuOBmWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLku6XkuIrjgafjgYLjgosiOiLjgojjgorlpKfjgY3jgYQiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOWwj+OBleOBmeOBjuOCi+WApDogJHtlLm9yaWdpbn3jga8ke2UubWluaW11bS50b1N0cmluZygpfSR7YS51bml0fSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlsI/jgZXjgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW5944GvJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2l95b+F6KaB44GM44GC44KK44G+44GZYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5wcmVmaXh9IuOBp+Wni+OBvuOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g54Sh5Yq544Gq5paH5a2X5YiXOiAiJHtpLnN1ZmZpeH0i44Gn57WC44KP44KL5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5pbmNsdWRlc30i44KS5ZCr44KA5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeWKueOBquaWh+Wtl+WIlzog44OR44K/44O844OzJHtpLnBhdHRlcm5944Gr5LiA6Ie044GZ44KL5b+F6KaB44GM44GC44KK44G+44GZYDpg54Sh5Yq544GqJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeWKueOBquaVsOWApDogJHtlLmRpdmlzb3J944Gu5YCN5pWw44Gn44GC44KL5b+F6KaB44GM44GC44KK44G+44GZYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g6KqN6K2Y44GV44KM44Gm44GE44Gq44GE44Kt44O8JHtlLmtleXMubGVuZ3RoPjE/Iue+pCI6IiJ9OiAke18oZS5rZXlzLCLjgIEiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufeWGheOBrueEoeWKueOBquOCreODvGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i54Sh5Yq544Gq5YWl5YqbIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW595YaF44Gu54Sh5Yq544Gq5YCkYDtkZWZhdWx0OnJldHVybiLnhKHlirnjgarlhaXlipsifX19O2Z1bmN0aW9uIE9mKCl7cmV0dXJue2xvY2FsZUVycm9yOmpmKCl9fWNvbnN0IFVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLhg6Hhg5jhg5vhg5Hhg53hg5rhg50iLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxmaWxlOnt1bml0OiLhg5Hhg5Dhg5jhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxhcnJheTp7dW5pdDoi4YOU4YOa4YOU4YOb4YOU4YOc4YOi4YOYIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn0sc2V0Ont1bml0OiLhg5Thg5rhg5Thg5vhg5Thg5zhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4YOo4YOU4YOn4YOV4YOQ4YOc4YOQIixlbWFpbDoi4YOU4YOaLeGDpOGDneGDoeGDouGDmOGDoSDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLHVybDoiVVJMIixlbW9qaToi4YOU4YOb4YOd4YOv4YOYIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLhg5fhg5Dhg6Dhg5jhg6bhg5gt4YOT4YOg4YOdIixkYXRlOiLhg5fhg5Dhg6Dhg5jhg6bhg5giLHRpbWU6IuGDk+GDoOGDnSIsZHVyYXRpb246IuGDruGDkOGDnOGDkuGDoOGDq+GDmuGDmOGDleGDneGDkeGDkCIsaXB2NDoiSVB2NCDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLGlwdjY6IklQdjYg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYIixjaWRydjQ6IklQdjQg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixjaWRydjY6IklQdjYg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixiYXNlNjQ6ImJhc2U2NC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixiYXNlNjR1cmw6ImJhc2U2NHVybC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixqc29uX3N0cmluZzoiSlNPTiDhg5Xhg5Thg5rhg5giLGUxNjQ6IkUuMTY0IOGDnOGDneGDm+GDlOGDoOGDmCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuGDoOGDmOGDquGDruGDleGDmCIsc3RyaW5nOiLhg5Xhg5Thg5rhg5giLGJvb2xlYW46IuGDkeGDo+GDmuGDlOGDkOGDnOGDmCIsZnVuY3Rpb246IuGDpOGDo+GDnOGDpeGDquGDmOGDkCIsYXJyYXk6IuGDm+GDkOGDoeGDmOGDleGDmCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOo4YOU4YOn4YOV4YOQ4YOc4YOQOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWA6YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2l9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7UyhlLnZhbHVlc1swXSl9YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOY4YOQIOGDlOGDoOGDly3hg5Thg6Dhg5fhg5ggJHtfKGUudmFsdWVzLCJ8Iil9LeGDk+GDkOGDnGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhg5bhg5Thg5Phg5vhg5Thg6Lhg5Dhg5Mg4YOT4YOY4YOT4YOYOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggJHtlLm9yaWdpbj8/IuGDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDk+GDmOGDk+GDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW4/PyLhg5vhg5zhg5jhg6jhg5Xhg5zhg5Thg5rhg53hg5Hhg5AifSDhg5jhg6fhg53hg6EgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59IOGDmOGDp+GDneGDoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDmOGDrOGDp+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnByZWZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDm+GDl+GDkOGDleGDoOGDk+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnN1ZmZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOV4YOU4YOa4YOYOiDhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhICIke2kuaW5jbHVkZXN9Ii3hg6FgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDqOGDlOGDlOGDoeGDkOGDkeGDkOGDm+GDlOGDkeGDneGDk+GDlOGDoSDhg6jhg5Dhg5Hhg5rhg53hg5zhg6EgJHtpLnBhdHRlcm59YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOg4YOY4YOq4YOu4YOV4YOYOiDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhICR7ZS5kaXZpc29yfS3hg5jhg6Eg4YOv4YOU4YOg4YOQ4YOT4YOYYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g4YOj4YOq4YOc4YOd4YOR4YOYIOGDkuGDkOGDoeGDkOGDpuGDlOGDkSR7ZS5rZXlzLmxlbmd0aD4xPyLhg5Thg5Hhg5giOiLhg5gifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOS4YOQ4YOh4YOQ4YOm4YOU4YOR4YOYICR7ZS5vcmlnaW59LeGDqOGDmGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOb4YOc4YOY4YOo4YOV4YOc4YOU4YOa4YOd4YOR4YOQICR7ZS5vcmlnaW59LeGDqOGDmGA7ZGVmYXVsdDpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9fX07ZnVuY3Rpb24gUGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6VWYoKX19Y29uc3QgTmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuGej+GeveGeouGegOGfkuGen+GemiIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn0sZmlsZTp7dW5pdDoi4Z6U4Z+DIix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxhcnJheTp7dW5pdDoi4Z6S4Z624Z6P4Z67Iix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxzZXQ6e3VuaXQ6IuGekuGetuGej+GeuyIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGemyIsZW1haWw6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGek+GeouGfiuGeuOGemOGfguGemyIsdXJsOiJVUkwiLGVtb2ppOiLhnp/hnonhn5LhnonhnrbhnqLhnrbhnprhnpjhn5Lhnpjhno7hn40iLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuGegOGetuGem+GelOGemuGet+GeheGfkuGehuGfgeGekSDhnpPhnrfhnoThnpjhn4nhn4ThnoQgSVNPIixkYXRlOiLhnoDhnrbhnpvhnpThnprhnrfhnoXhn5Lhnobhn4HhnpEgSVNPIix0aW1lOiLhnpjhn4nhn4ThnoQgSVNPIixkdXJhdGlvbjoi4Z6a4Z6Z4Z+I4Z6W4Z+B4Z6bIElTTyIsaXB2NDoi4Z6i4Z624Z6f4Z6Z4Z6K4Z+S4Z6L4Z624Z6TIElQdjQiLGlwdjY6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixjaWRydjQ6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY0IixjaWRydjY6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixiYXNlNjQ6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGeouGfiuGet+GegOGevOGeiiBiYXNlNjQiLGJhc2U2NHVybDoi4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6i4Z+K4Z634Z6A4Z684Z6KIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemiBKU09OIixlMTY0OiLhnpvhn4HhnoEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpsifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLhnpvhn4HhnoEiLGFycmF5OiLhnqLhnrbhnprhn4EgKEFycmF5KSIsbnVsbDoi4Z6C4Z+S4Z6Y4Z624Z6T4Z6P4Z6Y4Z+S4Z6b4Z+DIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpvhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWA6YOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGem+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtpfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6U4Z6J4Z+S4Z6F4Z684Z6b4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke1MoZS52YWx1ZXNbMF0pfWA6YOGeh+GemOGfkuGemuGevuGen+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhnofhnrbhnpjhnr3hnpnhnoDhn5LhnpPhnrvhnoThnoXhn4bhno7hn4ThnpggJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLhnpLhnrbhno/hnrsifWA6YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhno/hnrzhnoXhnpbhn4HhnoDhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7ZS5vcmlnaW59ICR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4Z6P4Z684Z6F4Z6W4Z+B4Z6A4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke2Uub3JpZ2lufSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoXhnrbhnpThn4vhnpXhn5Lhno/hnr7hnpjhnorhn4ThnpkgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGelOGeieGfkuGeheGelOGfi+GeiuGfhOGemSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnpjhnrbhnpMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhno/hn4LhnpXhn5LhnoLhnrzhnpXhn5LhnoLhnoThnpPhnrnhnoThnpHhnpjhn5LhnprhnoThn4vhnorhn4LhnpvhnpThnrbhnpPhnoDhn4bhno7hno/hn4sgJHtpLnBhdHRlcm59YDpg4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhnpvhn4HhnoHhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6P4Z+C4Z6H4Z624Z6W4Z6g4Z674Z6C4Z674Z6O4Z6T4Z+DICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOGemuGegOGeg+GevuGeieGen+GfhOGemOGet+Gek+Gen+GfkuGeguGetuGem+Gfi+GfliAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOGen+GfhOGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIn19fTtmdW5jdGlvbiB4bCgpe3JldHVybntsb2NhbGVFcnJvcjpOZigpfX1mdW5jdGlvbiBEZigpe3JldHVybiB4bCgpfWNvbnN0IEVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLrrLjsnpAiLHZlcmI6InRvIGhhdmUifSxmaWxlOnt1bml0OiLrsJTsnbTtirgiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoi6rCcIix2ZXJiOiJ0byBoYXZlIn0sc2V0Ont1bml0OiLqsJwiLHZlcmI6InRvIGhhdmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi7J6F66ClIixlbWFpbDoi7J2066mU7J28IOyjvOyGjCIsdXJsOiJVUkwiLGVtb2ppOiLsnbTrqqjsp4AiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDrgqDsp5zsi5zqsIQiLGRhdGU6IklTTyDrgqDsp5wiLHRpbWU6IklTTyDsi5zqsIQiLGR1cmF0aW9uOiJJU08g6riw6rCEIixpcHY0OiJJUHY0IOyjvOyGjCIsaXB2NjoiSVB2NiDso7zshowiLGNpZHJ2NDoiSVB2NCDrspTsnIQiLGNpZHJ2NjoiSVB2NiDrspTsnIQiLGJhc2U2NDoiYmFzZTY0IOyduOy9lOuUqSDrrLjsnpDsl7QiLGJhc2U2NHVybDoiYmFzZTY0dXJsIOyduOy9lOuUqSDrrLjsnpDsl7QiLGpzb25fc3RyaW5nOiJKU09OIOusuOyekOyXtCIsZTE2NDoiRS4xNjQg67KI7Zi4Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi7J6F66ClIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g7J6Y66q765CcIOyeheugpTog7JiI7IOBIO2DgOyeheydgCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIOuwm+ydgCDtg4DsnoXsnYAgJHtzfeyeheuLiOuLpGA6YOyemOuqu+uQnCDsnoXroKU6IOyYiOyDgSDtg4DsnoXsnYAgJHtpfSwg67Cb7J2AIO2DgOyeheydgCAke3N97J6F64uI64ukYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DsnpjrqrvrkJwg7J6F66ClOiDqsJLsnYAgJHtTKGUudmFsdWVzWzBdKX0g7J207Ja07JW8IO2VqeuLiOuLpGA6YOyemOuqu+uQnCDsmLXshZg6ICR7XyhlLnZhbHVlcywi65iQ64qUICIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i7J207ZWYIjoi66+466eMIixhPWk9PT0i66+466eMIj8i7J207Ja07JW8IO2VqeuLiOuLpCI6IuyXrOyVvCDtlanri4jri6QiLHM9bihlLm9yaWdpbiksYz1zPy51bml0Pz8i7JqU7IaMIjtyZXR1cm4gcz9gJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDtgb3ri4jri6Q6ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtjfSAke2l9JHthfWA6YCR7ZS5vcmlnaW4/PyLqsJIifeydtCDrhIjrrLQg7YG964uI64ukOiAke2UubWF4aW11bS50b1N0cmluZygpfSAke2l9JHthfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLsnbTsg4EiOiLstIjqs7wiLGE9aT09PSLsnbTsg4EiPyLsnbTslrTslbwg7ZWp64uI64ukIjoi7Jes7JW8IO2VqeuLiOuLpCIscz1uKGUub3JpZ2luKSxjPXM/LnVuaXQ/PyLsmpTshowiO3JldHVybiBzP2Ake2Uub3JpZ2luPz8i6rCSIn3snbQg64SI66y0IOyekeyKteuLiOuLpDogJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2N9ICR7aX0ke2F9YDpgJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDsnpHsirXri4jri6Q6ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7aX0ke2F9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6ICIke2kucHJlZml4fSIo7Jy8KeuhnCDsi5zsnpHtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLnN1ZmZpeH0iKOycvCnroZwg64Gd64KY7JW8IO2VqeuLiOuLpGA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLmluY2x1ZGVzfSLsnYQo66W8KSDtj6ztlajtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJyZWdleCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6IOygleq3nOyLnSAke2kucGF0dGVybn0g7Yyo7YS06rO8IOydvOy5mO2VtOyVvCDtlanri4jri6RgOmDsnpjrqrvrkJwgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOyemOuqu+uQnCDsiKvsnpA6ICR7ZS5kaXZpc29yfeydmCDrsLDsiJjsl6zslbwg7ZWp64uI64ukYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g7J247Iud7ZWgIOyImCDsl4bripQg7YKkOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOyemOuqu+uQnCDtgqQ6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLsnpjrqrvrkJwg7J6F66ClIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOyemOuqu+uQnCDqsJI6ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLsnpjrqrvrkJwg7J6F66ClIn19fTtmdW5jdGlvbiBaZigpe3JldHVybntsb2NhbGVFcnJvcjpFZigpfX1jb25zdCBodD10PT50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7ZnVuY3Rpb24gTnModCl7Y29uc3Qgbj1NYXRoLmFicyh0KSxyPW4lMTAsbz1uJTEwMDtyZXR1cm4gbz49MTEmJm88PTE5fHxyPT09MD8ibWFueSI6cj09PTE/Im9uZSI6ImZldyJ9Y29uc3QgUmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToic2ltYm9saXMiLGZldzoic2ltYm9saWFpIixtYW55OiJzaW1ib2xpxbMifSx2ZXJiOntzbWFsbGVyOntpbmNsdXNpdmU6InR1cmkgYsWrdGkgbmUgaWxnZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIHRydW1wZXNuxJcga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIHRydW1wZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIGlsZ2VzbsSXIGthaXAifX19LGZpbGU6e3VuaXQ6e29uZToiYmFpdGFzIixmZXc6ImJhaXRhaSIsbWFueToiYmFpdMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIGRpZGVzbmlzIGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSBixat0aSBtYcW+ZXNuaXMga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIG1hxb5lc25pcyBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgYsWrdGkgZGlkZXNuaXMga2FpcCJ9fX0sYXJyYXk6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fSxzZXQ6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fX07ZnVuY3Rpb24gbihlLGksYSxzKXtjb25zdCBjPXRbZV0/P251bGw7cmV0dXJuIGM9PT1udWxsP2M6e3VuaXQ6Yy51bml0W2ldLHZlcmI6Yy52ZXJiW3NdW2E/ImluY2x1c2l2ZSI6Im5vdEluY2x1c2l2ZSJdfX1jb25zdCByPXtyZWdleDoixK92ZXN0aXMiLGVtYWlsOiJlbC4gcGHFoXRvIGFkcmVzYXMiLHVybDoiVVJMIixlbW9qaToiamF1c3R1a2FzIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGF0YSBpciBsYWlrYXMiLGRhdGU6IklTTyBkYXRhIix0aW1lOiJJU08gbGFpa2FzIixkdXJhdGlvbjoiSVNPIHRydWttxJciLGlwdjQ6IklQdjQgYWRyZXNhcyIsaXB2NjoiSVB2NiBhZHJlc2FzIixjaWRydjQ6IklQdjQgdGlua2xvIHByZWZpa3NhcyAoQ0lEUikiLGNpZHJ2NjoiSVB2NiB0aW5rbG8gcHJlZmlrc2FzIChDSURSKSIsYmFzZTY0OiJiYXNlNjQgdcW+a29kdW90YSBlaWx1dMSXIixiYXNlNjR1cmw6ImJhc2U2NHVybCB1xb5rb2R1b3RhIGVpbHV0xJciLGpzb25fc3RyaW5nOiJKU09OIGVpbHV0xJciLGUxNjQ6IkUuMTY0IG51bWVyaXMiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEr3Zlc3RpcyJ9LG89e25hbjoiTmFOIixudW1iZXI6InNrYWnEjWl1cyIsYmlnaW50OiJzdmVpa2FzaXMgc2thacSNaXVzIixzdHJpbmc6ImVpbHV0xJciLGJvb2xlYW46ImxvZ2luxJcgcmVpa8WhbcSXIix1bmRlZmluZWQ6Im5lYXBpYnLEl8W+dGEgcmVpa8WhbcSXIixmdW5jdGlvbjoiZnVua2NpamEiLHN5bWJvbDoic2ltYm9saXMiLGFycmF5OiJtYXN5dmFzIixvYmplY3Q6Im9iamVrdGFzIixudWxsOiJudWxpbsSXIHJlaWvFoW3ElyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH1gOmBHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSAke2l9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BQcml2YWxvIGLFq3RpICR7UyhlLnZhbHVlc1swXSl9YDpgUHJpdmFsbyBixat0aSB2aWVuYXMgacWhICR7XyhlLnZhbHVlcywifCIpfSBwYXNpcmlua2ltxbNgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9b1tlLm9yaWdpbl0/P2Uub3JpZ2luLGE9bihlLm9yaWdpbixOcyhOdW1iZXIoZS5tYXhpbXVtKSksZS5pbmNsdXNpdmU/PyExLCJzbWFsbGVyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgZGlkZXNuaXMga2FpcCI6Im1hxb5lc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPW9bZS5vcmlnaW5dPz9lLm9yaWdpbixhPW4oZS5vcmlnaW4sTnMoTnVtYmVyKGUubWluaW11bSkpLGUuaW5jbHVzaXZlPz8hMSwiYmlnZ2VyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgbWHFvmVzbmlzIGthaXAiOiJkaWRlc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcHJhc2lkxJd0aSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcGFzaWJhaWd0aSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEVpbHV0xJcgcHJpdmFsbyDEr3RyYXVrdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEVpbHV0xJcgcHJpdmFsbyBhdGl0aWt0aSAke2kucGF0dGVybn1gOmBOZXRlaXNpbmdhcyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gU2thacSNaXVzIHByaXZhbG8gYsWrdGkgJHtlLmRpdmlzb3J9IGthcnRvdGluaXMuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVhdHBhxb5pbnQke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImFzIn0gcmFrdCR7ZS5rZXlzLmxlbmd0aD4xPyJhaSI6ImFzIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iUmFzdGFzIGtsYWlkaW5nYXMgcmFrdGFzIjtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMiO2Nhc2UiaW52YWxpZF9lbGVtZW50Ijp7Y29uc3QgaT1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuYCR7aHQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gdHVyaSBrbGFpZGluZ8SFIMSvdmVzdMSvYH1kZWZhdWx0OnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMifX19O2Z1bmN0aW9uIENmKCl7cmV0dXJue2xvY2FsZUVycm9yOlJmKCl9fWNvbnN0IEFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLQt9C90LDRhtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxmaWxlOnt1bml0OiLQsdCw0ZjRgtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxhcnJheTp7dW5pdDoi0YHRgtCw0LLQutC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxzZXQ6e3VuaXQ6ItGB0YLQsNCy0LrQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0L3QtdGBIixlbWFpbDoi0LDQtNGA0LXRgdCwINC90LAg0LUt0L/QvtGI0YLQsCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7Rn9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0YPQvCDQuCDQstGA0LXQvNC1IixkYXRlOiJJU08g0LTQsNGC0YPQvCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0LLRgNC10LzQtdGC0YDQsNC10ZrQtSIsaXB2NDoiSVB2NCDQsNC00YDQtdGB0LAiLGlwdjY6IklQdjYg0LDQtNGA0LXRgdCwIixjaWRydjQ6IklQdjQg0L7Qv9GB0LXQsyIsY2lkcnY2OiJJUHY2INC+0L/RgdC10LMiLGJhc2U2NDoiYmFzZTY0LdC10L3QutC+0LTQuNGA0LDQvdCwINC90LjQt9CwIixiYXNlNjR1cmw6ImJhc2U2NHVybC3QtdC90LrQvtC00LjRgNCw0L3QsCDQvdC40LfQsCIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC30LAiLGUxNjQ6IkUuMTY0INCx0YDQvtGYIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLQvdC10YEifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLQsdGA0L7RmCIsYXJyYXk6ItC90LjQt9CwIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCT0YDQtdGI0LXQvSDQstC90LXRgTog0YHQtSDQvtGH0LXQutGD0LLQsCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC/0YDQuNC80LXQvdC+ICR7c31gOmDQk9GA0LXRiNC10L0g0LLQvdC10YE6INGB0LUg0L7Rh9C10LrRg9Cy0LAgJHtpfSwg0L/RgNC40LzQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgJHtTKGUudmFsdWVzWzBdKX1gOmDQk9GA0LXRiNCw0L3QsCDQvtC/0YbQuNGY0LA6INGB0LUg0L7Rh9C10LrRg9Cy0LAg0LXQtNC90LAgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LPQvtC70LXQvDog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2luPz8i0LLRgNC10LTQvdC+0YHRgtCwIn0g0LTQsCDQuNC80LAgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i0LXQu9C10LzQtdC90YLQuCJ9YDpg0J/RgNC10LzQvdC+0LPRgyDQs9C+0LvQtdC8OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW4/PyLQstGA0LXQtNC90L7RgdGC0LAifSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LzQsNC7OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW59INC00LAg0LjQvNCwICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQn9GA0LXQvNC90L7Qs9GDINC80LDQuzog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2lufSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0LfQsNC/0L7Rh9C90YPQstCwINGB0L4gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LDQttC10YfQutCwINC90LjQt9CwOiDQvNC+0YDQsCDQtNCwINC30LDQstGA0YjRg9Cy0LAg0YHQviAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQstCw0LbQtdGH0LrQsCDQvdC40LfQsDog0LzQvtGA0LAg0LTQsCDQstC60LvRg9GH0YPQstCwICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0L7QtNCz0L7QsNGA0LAg0L3QsCDQv9Cw0YLQtdGA0L3QvtGCICR7aS5wYXR0ZXJufWA6YEludmFsaWQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCT0YDQtdGI0LXQvSDQsdGA0L7RmDog0LzQvtGA0LAg0LTQsCDQsdC40LTQtSDQtNC10LvQuNCyINGB0L4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/ItCd0LXQv9GA0LXQv9C+0LfQvdCw0LXQvdC4INC60LvRg9GH0LXQstC4Ijoi0J3QtdC/0YDQtdC/0L7Qt9C90LDQtdC9INC60LvRg9GHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0JPRgNC10YjQtdC9INC60LvRg9GHINCy0L4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCT0YDQtdGI0LXQvSDQstC90LXRgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQk9GA0LXRiNC90LAg0LLRgNC10LTQvdC+0YHRgiDQstC+ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQk9GA0LXRiNC10L0g0LLQvdC10YEifX19O2Z1bmN0aW9uIExmKCl7cmV0dXJue2xvY2FsZUVycm9yOkFmKCl9fWNvbnN0IE1mPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJha3NhcmEiLHZlcmI6Im1lbXB1bnlhaSJ9LGZpbGU6e3VuaXQ6ImJhaXQiLHZlcmI6Im1lbXB1bnlhaSJ9LGFycmF5Ont1bml0OiJlbGVtZW4iLHZlcmI6Im1lbXB1bnlhaSJ9LHNldDp7dW5pdDoiZWxlbWVuIix2ZXJiOiJtZW1wdW55YWkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZS1tZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhcmlraCBtYXNhIElTTyIsZGF0ZToidGFyaWtoIElTTyIsdGltZToibWFzYSBJU08iLGR1cmF0aW9uOiJ0ZW1wb2ggSVNPIixpcHY0OiJhbGFtYXQgSVB2NCIsaXB2NjoiYWxhbWF0IElQdjYiLGNpZHJ2NDoianVsYXQgSVB2NCIsY2lkcnY2OiJqdWxhdCBJUHY2IixiYXNlNjQ6InN0cmluZyBkaWtvZGthbiBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRpa29ka2FuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6InN0cmluZyBKU09OIixlMTY0OiJub21ib3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im5vbWJvciJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayBzYWg6IGRpamFuZ2thIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZGl0ZXJpbWEgJHtzfWA6YElucHV0IHRpZGFrIHNhaDogZGlqYW5na2EgJHtpfSwgZGl0ZXJpbWEgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW5wdXQgdGlkYWsgc2FoOiBkaWphbmdrYSAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgc2FoOiBkaWphbmdrYSBzYWxhaCBzYXR1IGRhcmlwYWRhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVuIn1gOmBUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSBhZGFsYWggJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVGVybGFsdSBrZWNpbDogZGlqYW5na2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUZXJsYWx1IGtlY2lsOiBkaWphbmdrYSAke2Uub3JpZ2lufSBhZGFsYWggJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcm11bGEgZGVuZ2FuICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIG1lbmdhbmR1bmdpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBzZXBhZGFuIGRlbmdhbiBjb3JhayAke2kucGF0dGVybn1gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0gdGlkYWsgc2FoYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJvciB0aWRhayBzYWg6IHBlcmx1IGdhbmRhYW4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS3VuY2kgdGlkYWsgZGlrZW5hbGk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS3VuY2kgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayBzYWgiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmlsYWkgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnB1dCB0aWRhayBzYWgifX19O2Z1bmN0aW9uIHFmKCl7cmV0dXJue2xvY2FsZUVycm9yOk1mKCl9fWNvbnN0IEZmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWtlbnMiLHZlcmI6ImhlZWZ0In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6ImhlZWZ0In0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW52b2VyIixlbWFpbDoiZW1haWxhZHJlcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGVuIHRpamQiLGRhdGU6IklTTyBkYXR1bSIsdGltZToiSVNPIHRpamQiLGR1cmF0aW9uOiJJU08gZHV1ciIsaXB2NDoiSVB2NC1hZHJlcyIsaXB2NjoiSVB2Ni1hZHJlcyIsY2lkcnY0OiJJUHY0LWJlcmVpayIsY2lkcnY2OiJJUHY2LWJlcmVpayIsYmFzZTY0OiJiYXNlNjQtZ2Vjb2RlZXJkZSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjQgVVJMLWdlY29kZWVyZGUgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHN0cmluZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW52b2VyIn0sbz17bmFuOiJOYU4iLG51bWJlcjoiZ2V0YWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT25nZWxkaWdlIGludm9lcjogdmVyd2FjaHQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBvbnR2aW5nICR7c31gOmBPbmdlbGRpZ2UgaW52b2VyOiB2ZXJ3YWNodCAke2l9LCBvbnR2aW5nICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE9uZ2VsZGlnZSBpbnZvZXI6IHZlcndhY2h0ICR7UyhlLnZhbHVlc1swXSl9YDpgT25nZWxkaWdlIG9wdGllOiB2ZXJ3YWNodCDDqcOpbiB2YW4gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8ibGFhdCI6ZS5vcmlnaW49PT0ic3RyaW5nIj8ibGFuZyI6Imdyb290IjtyZXR1cm4gYT9gVGUgJHtzfTogdmVyd2FjaHQgZGF0ICR7ZS5vcmlnaW4/PyJ3YWFyZGUifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50ZW4ifSAke2EudmVyYn1gOmBUZSAke3N9OiB2ZXJ3YWNodCBkYXQgJHtlLm9yaWdpbj8/IndhYXJkZSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSBpc2B9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8idnJvZWciOmUub3JpZ2luPT09InN0cmluZyI/ImtvcnQiOiJrbGVpbiI7cmV0dXJuIGE/YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gaXNgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gT25nZWxkaWdlIHRla3N0OiBtb2V0IG1ldCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgb3AgIiR7aS5zdWZmaXh9IiBlaW5kaWdlbmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgIiR7aS5pbmNsdWRlc30iIGJldmF0dGVuYDppLmZvcm1hdD09PSJyZWdleCI/YE9uZ2VsZGlnZSB0ZWtzdDogbW9ldCBvdmVyZWVua29tZW4gbWV0IHBhdHJvb24gJHtpLnBhdHRlcm59YDpgT25nZWxkaWc6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPbmdlbGRpZyBnZXRhbDogbW9ldCBlZW4gdmVlbHZvdWQgdmFuICR7ZS5kaXZpc29yfSB6aWpuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gT25iZWtlbmRlIGtleSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT25nZWxkaWdlIGtleSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iT25nZWxkaWdlIGludm9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBPbmdlbGRpZ2Ugd2FhcmRlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJPbmdlbGRpZ2UgaW52b2VyIn19fTtmdW5jdGlvbiBKZigpe3JldHVybntsb2NhbGVFcnJvcjpGZigpfX1jb25zdCBIZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiw6UgaGEifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiw6UgaGEifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiLDpSBpbm5laG9sZGUifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiw6UgaW5uZWhvbGRlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1wb3N0YWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsZXR0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsZXR0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGV0IixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0ZXIiLGNpZHJ2NjoiSVB2Ni1zcGVrdGVyIixiYXNlNjQ6ImJhc2U2NC1lbmtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5rb2RldCBzdHJlbmciLGpzb25fc3RyaW5nOiJKU09OLXN0cmVuZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJ0YWxsIixhcnJheToibGlzdGUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmlrayAke3N9YDpgVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0ICR7aX0sIGZpa2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVWd5bGRpZyB2ZXJkaTogZm9ydmVudGV0ICR7UyhlLnZhbHVlc1swXSl9YDpgVWd5bGRpZyB2YWxnOiBmb3J2ZW50ZXQgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZvciBzdG9yKHQpOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdGlsIMOlIGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlciJ9YDpgRm9yIHN0b3IodCk6IGZvcnZlbnRldCAke2Uub3JpZ2luPz8idmFsdWUifSB0aWwgw6UgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRm9yIGxpdGUobik6IGZvcnZlbnRldCAke2Uub3JpZ2lufSB0aWwgw6UgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEZvciBsaXRlKG4pOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbn0gdGlsIMOlIGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IG3DpSBlbmRlIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFVneWxkaWcgc3RyZW5nOiBtw6UgaW5uZWhvbGRlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWcgdGFsbDogbcOlIHbDpnJlIGV0IG11bHRpcGx1bSBhdiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iVWtqZW50ZSBuw7hrbGVyIjoiVWtqZW50IG7DuGtrZWwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGtrZWwgaSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVWd5bGRpZyBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHZlcmRpIGkgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVneWxkaWcgaW5wdXQifX19O2Z1bmN0aW9uIFdmKCl7cmV0dXJue2xvY2FsZUVycm9yOkhmKCl9fWNvbnN0IEJmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJoYXJmIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6InVuc3VyIix2ZXJiOiJvbG1hbMSxZMSxciJ9LHNldDp7dW5pdDoidW5zdXIiLHZlcmI6Im9sbWFsxLFkxLFyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImdpcmVuIixlbWFpbDoiZXBvc3RhZ8OiaCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGhlbmfDom3EsSIsZGF0ZToiSVNPIHRhcmloaSIsdGltZToiSVNPIHphbWFuxLEiLGR1cmF0aW9uOiJJU08gbcO8ZGRldGkiLGlwdjQ6IklQdjQgbmnFn8OibsSxIixpcHY2OiJJUHY2IG5pxZ/Dom7EsSIsY2lkcnY0OiJJUHY0IG1lbnppbGkiLGNpZHJ2NjoiSVB2NiBtZW56aWxpIixiYXNlNjQ6ImJhc2U2NC3Fn2lmcmVsaSBtZXRpbiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtxZ9pZnJlbGkgbWV0aW4iLGpzb25fc3RyaW5nOiJKU09OIG1ldGluIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImdpcmVuIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibnVtYXJhIixhcnJheToic2FmIixudWxsOiJnYXliIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEbDonNpdCBnaXJlbjogdW11bGFuIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYWzEsW5hbiAke3N9YDpgRsOic2l0IGdpcmVuOiB1bXVsYW4gJHtpfSwgYWzEsW5hbiAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BGw6JzaXQgZ2lyZW46IHVtdWxhbiAke1MoZS52YWx1ZXNbMF0pfWA6YEbDonNpdCB0ZXJjaWg6IG3Du3RlYmVybGVyICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9IG9sbWFsxLF5ZMSxLmB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZhemxhIGvDvMOnw7xrOiAke2Uub3JpZ2lufSwgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBrw7zDp8O8azogJHtlLm9yaWdpbn0sICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBvbG1hbMSxeWTEsS5gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gRsOic2l0IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsS5gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEbDonNpdCBtZXRpbjogIiR7aS5zdWZmaXh9IiBpbGUgYml0bWVsaS5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gRsOic2l0IG1ldGluOiAiJHtpLmluY2x1ZGVzfSIgaWh0aXbDoiBldG1lbGkuYDppLmZvcm1hdD09PSJyZWdleCI/YEbDonNpdCBtZXRpbjogJHtpLnBhdHRlcm59IG5ha8WfxLFuYSB1eW1hbMSxLmA6YEbDonNpdCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gRsOic2l0IHNhecSxOiAke2UuZGl2aXNvcn0ga2F0xLEgb2xtYWzEsXlkxLEuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYW5haHRhciAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGnDp2luIHRhbsSxbm1heWFuIGFuYWh0YXIgdmFyLmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2lyZW4gdGFuxLFuYW1hZMSxLiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbiB0YW7EsW5tYXlhbiBrxLF5bWV0IHZhci5gO2RlZmF1bHQ6cmV0dXJuIkvEsXltZXQgdGFuxLFuYW1hZMSxLiJ9fX07ZnVuY3Rpb24gVmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6QmYoKX19Y29uc3QgS2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LGZpbGU6e3VuaXQ6Itio2KfbjNm82LMiLHZlcmI6ItmI2YTYsdmKIn0sYXJyYXk6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LHNldDp7dW5pdDoi2KrZiNqp2YoiLHZlcmI6ItmI2YTYsdmKIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItmI2LHZiNiv2YoiLGVtYWlsOiLYqNix24zamtmG2KfZhNuM2qkiLHVybDoi24zZiCDYotixINin2YQiLGVtb2ppOiLYp9uM2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItmG24zZvNmHINin2Ygg2YjYrtiqIixkYXRlOiLZhtuQ2bzZhyIsdGltZToi2YjYrtiqIixkdXJhdGlvbjoi2YXZiNiv2YciLGlwdjQ6ItivIElQdjQg2b7YqtmHIixpcHY2OiLYryBJUHY2INm+2KrZhyIsY2lkcnY0OiLYryBJUHY0INiz2KfYrdmHIixjaWRydjY6ItivIElQdjYg2LPYp9it2YciLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQg2YXYqtmGIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINmF2KrZhiIsanNvbl9zdHJpbmc6IkpTT04g2YXYqtmGIixlMTY0OiLYryBFLjE2NCDYtNmF25DYsdmHIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/ZiiJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itin2LHbkCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DZhtin2LPZhSDZiNix2YjYr9mKOiDYqNin24zYryBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGA6YNmG2KfYs9mFINmI2LHZiNiv2Yo6INio2KfbjNivICR7aX0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YbYp9iz2YUg2YjYsdmI2K/Zijog2KjYp9uM2K8gJHtTKGUudmFsdWVzWzBdKX0g2YjYp9uMYDpg2YbYp9iz2YUg2KfZhtiq2K7Yp9ioOiDYqNin24zYryDbjNmIINmE2YcgJHtfKGUudmFsdWVzLCJ8Iil9INqF2K7ZhyDZiNin24xgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsdmI2YbZhyJ9INmI2YTYsdmKYDpg2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2YjZimB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNqJ24zYsSDaqdmI2obZhtuMOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INmI2YTYsdmKYDpg2onbjNixINqp2YjahtmG24w6ICR7ZS5vcmlnaW59INio2KfbjNivICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDZiNmKYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5wcmVmaXh9IiDYs9ix2Ycg2b7bjNmEINi02YpgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5zdWZmaXh9IiDYs9ix2Ycg2b7Yp9uMINiq2Ycg2YjYsdiz2YraltmKYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8gIiR7aS5pbmNsdWRlc30iINmI2YTYsdmKYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gJHtpLnBhdHRlcm59INiz2LHZhyDZhdi32KfYqNmC2Kog2YjZhNix2YpgOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9iz2YUg2K/bjGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDZhtin2LPZhSDYudiv2K86INio2KfbjNivINivICR7ZS5kaXZpc29yfSDZhdi22LHYqCDZiNmKYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YbYp9iz2YUgJHtlLmtleXMubGVuZ3RoPjE/Itqp2YTbjNqJ2YjZhtmHIjoi2qnZhNuM2okifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDZhtin2LPZhSDaqdmE24zaiSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDZhtin2LPZhSDYudmG2LXYsSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2RlZmF1bHQ6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiJ9fX07ZnVuY3Rpb24gR2YoKXtyZXR1cm57bG9jYWxlRXJyb3I6S2YoKX19Y29uc3QgWGY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWvDs3ciLHZlcmI6Im1pZcSHIn0sZmlsZTp7dW5pdDoiYmFqdMOzdyIsdmVyYjoibWllxIcifSxhcnJheTp7dW5pdDoiZWxlbWVudMOzdyIsdmVyYjoibWllxIcifSxzZXQ6e3VuaXQ6ImVsZW1lbnTDs3ciLHZlcmI6Im1pZcSHIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Ind5cmHFvGVuaWUiLGVtYWlsOiJhZHJlcyBlbWFpbCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZGF0YSBpIGdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGRhdGU6ImRhdGEgdyBmb3JtYWNpZSBJU08iLHRpbWU6ImdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGR1cmF0aW9uOiJjemFzIHRyd2FuaWEgSVNPIixpcHY0OiJhZHJlcyBJUHY0IixpcHY2OiJhZHJlcyBJUHY2IixjaWRydjQ6Inpha3JlcyBJUHY0IixjaWRydjY6Inpha3JlcyBJUHY2IixiYXNlNjQ6ImNpxIVnIHpuYWvDs3cgemFrb2Rvd2FueSB3IGZvcm1hY2llIGJhc2U2NCIsYmFzZTY0dXJsOiJjacSFZyB6bmFrw7N3IHpha29kb3dhbnkgdyBmb3JtYWNpZSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjacSFZyB6bmFrw7N3IHcgZm9ybWFjaWUgSlNPTiIsZTE2NDoibGljemJhIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoid2VqxZtjaWUifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJsaWN6YmEiLGFycmF5OiJ0YWJsaWNhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5pZXByYXdpZMWCb3dlIGRhbmUgd2VqxZtjaW93ZTogb2N6ZWtpd2FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG90cnp5bWFubyAke3N9YDpgTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlOiBvY3pla2l3YW5vICR7aX0sIG90cnp5bWFubyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2U6IG9jemVraXdhbm8gJHtTKGUudmFsdWVzWzBdKX1gOmBOaWVwcmF3aWTFgm93YSBvcGNqYTogb2N6ZWtpd2FubyBqZWRuZWogeiB3YXJ0b8WbY2kgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFphIGR1xbxhIHdhcnRvxZvEhzogb2N6ZWtpd2FubywgxbxlICR7ZS5vcmlnaW4/PyJ3YXJ0b8WbxIcifSBixJlkemllIG1pZcSHICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnTDs3cifWA6YFpieXQgZHXFvCh5L2EvZSk6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSB3eW5vc2nEhyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BaYSBtYcWCYSB3YXJ0b8WbxIc6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSBtaWXEhyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50w7N3In1gOmBaYnl0IG1hxYIoeS9hL2UpOiBvY3pla2l3YW5vLCDFvGUgJHtlLm9yaWdpbj8/IndhcnRvxZvEhyJ9IGLEmWR6aWUgd3lub3NpxIcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemFjenluYcSHIHNpxJkgb2QgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmllcHJhd2lkxYJvd3kgY2nEhWcgem5ha8OzdzogbXVzaSBrb8WEY3p5xIcgc2nEmSBuYSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemF3aWVyYcSHICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOaWVwcmF3aWTFgm93eSBjacSFZyB6bmFrw7N3OiBtdXNpIG9kcG93aWFkYcSHIHd6b3Jjb3dpICR7aS5wYXR0ZXJufWA6YE5pZXByYXdpZMWCb3coeS9hL2UpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOaWVwcmF3aWTFgm93YSBsaWN6YmE6IG11c2kgYnnEhyB3aWVsb2tyb3Rub8WbY2nEhSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOaWVyb3pwb3puYW5lIGtsdWN6ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmllcHJhd2lkxYJvd3kga2x1Y3ogdyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5pZXByYXdpZMWCb3dhIHdhcnRvxZvEhyB3ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2UifX19O2Z1bmN0aW9uIFlmKCl7cmV0dXJue2xvY2FsZUVycm9yOlhmKCl9fWNvbnN0IFFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmVzIix2ZXJiOiJ0ZXIifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoidGVyIn0sYXJyYXk6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifSxzZXQ6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicGFkcsOjbyIsZW1haWw6ImVuZGVyZcOnbyBkZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYcOnw6NvIElTTyIsaXB2NDoiZW5kZXJlw6dvIElQdjQiLGlwdjY6ImVuZGVyZcOnbyBJUHY2IixjaWRydjQ6ImZhaXhhIGRlIElQdjQiLGNpZHJ2NjoiZmFpeGEgZGUgSVB2NiIsYmFzZTY0OiJ0ZXh0byBjb2RpZmljYWRvIGVtIGJhc2U2NCIsYmFzZTY0dXJsOiJVUkwgY29kaWZpY2FkYSBlbSBiYXNlNjQiLGpzb25fc3RyaW5nOiJ0ZXh0byBKU09OIixlMTY0OiJuw7ptZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50cmFkYSJ9LG89e25hbjoiTmFOIixudW1iZXI6Im7Dum1lcm8iLG51bGw6Im51bG8ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwbyBpbnbDoWxpZG86IGVzcGVyYWRvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmVjZWJpZG8gJHtzfWA6YFRpcG8gaW52w6FsaWRvOiBlc3BlcmFkbyAke2l9LCByZWNlYmlkbyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyYWRhIGludsOhbGlkYTogZXNwZXJhZG8gJHtTKGUudmFsdWVzWzBdKX1gOmBPcMOnw6NvIGludsOhbGlkYTogZXNwZXJhZGEgdW1hIGRhcyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTXVpdG8gZ3JhbmRlOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbj8/InZhbG9yIn0gdGl2ZXNzZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3MifWA6YE11aXRvIGdyYW5kZTogZXNwZXJhZG8gcXVlICR7ZS5vcmlnaW4/PyJ2YWxvciJ9IGZvc3NlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE11aXRvIHBlcXVlbm86IGVzcGVyYWRvIHF1ZSAke2Uub3JpZ2lufSB0aXZlc3NlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBNdWl0byBwZXF1ZW5vOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbn0gZm9zc2UgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBjb21lw6dhciBjb20gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVGV4dG8gaW52w6FsaWRvOiBkZXZlIHRlcm1pbmFyIGNvbSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBpbmNsdWlyICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BUZXh0byBpbnbDoWxpZG86IGRldmUgY29ycmVzcG9uZGVyIGFvIHBhZHLDo28gJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludsOhbGlkb2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOhbGlkbzogZGV2ZSBzZXIgbcO6bHRpcGxvIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoYXZlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSBkZXNjb25oZWNpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENoYXZlIGludsOhbGlkYSBlbSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iRW50cmFkYSBpbnbDoWxpZGEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVmFsb3IgaW52w6FsaWRvIGVtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJDYW1wbyBpbnbDoWxpZG8ifX19O2Z1bmN0aW9uIGVnKCl7cmV0dXJue2xvY2FsZUVycm9yOlFmKCl9fWNvbnN0IHRnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmUiLHZlcmI6InPEgyBhaWLEgyJ9LGZpbGU6e3VuaXQ6Im9jdGXIm2kiLHZlcmI6InPEgyBhaWLEgyJ9LGFycmF5Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sc2V0Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sbWFwOnt1bml0OiJpbnRyxINyaSIsdmVyYjoic8SDIGFpYsSDIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImludHJhcmUiLGVtYWlsOiJhZHJlc8SDIGRlIGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXTEgyDImWkgb3LEgyBJU08iLGRhdGU6ImRhdMSDIElTTyIsdGltZToib3LEgyBJU08iLGR1cmF0aW9uOiJkdXJhdMSDIElTTyIsaXB2NDoiYWRyZXPEgyBJUHY0IixpcHY2OiJhZHJlc8SDIElQdjYiLG1hYzoiYWRyZXPEgyBNQUMiLGNpZHJ2NDoiaW50ZXJ2YWwgSVB2NCIsY2lkcnY2OiJpbnRlcnZhbCBJUHY2IixiYXNlNjQ6IsiZaXIgY29kYXQgYmFzZTY0IixiYXNlNjR1cmw6IsiZaXIgY29kYXQgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiyJlpciBKU09OIixlMTY0OiJudW3Eg3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnRyYXJlIn0sbz17bmFuOiJOYU4iLHN0cmluZzoiyJlpciIsbnVtYmVyOiJudW3Eg3IiLGJvb2xlYW46ImJvb2xlYW4iLGZ1bmN0aW9uOiJmdW5jyJtpZSIsYXJyYXk6Im1hdHJpY2UiLG9iamVjdDoib2JpZWN0Iix1bmRlZmluZWQ6Im5lZGVmaW5pdCIsc3ltYm9sOiJzaW1ib2wiLGJpZ2ludDoibnVtxINyIG1hcmUiLHZvaWQ6InZvaWQiLG5ldmVyOiJuZXZlciIsbWFwOiJoYXJ0xIMiLHNldDoic2V0In07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybmBJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7aX0sIHByaW1pdCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT3DIm2l1bmUgaW52YWxpZMSDOiBhyJl0ZXB0YXQgdW5hIGRpbnRyZSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gUHJlYSBtYXJlOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbj8/InZhbG9hcmVhIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlIn1gOmBQcmVhIG1hcmU6IGHImXRlcHRhdCBjYSAke2Uub3JpZ2luPz8idmFsb2FyZWEifSBzxIMgZmllICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZWEgbWljOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVhIG1pYzogYciZdGVwdGF0IGNhICR7ZS5vcmlnaW59IHPEgyBmaWUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgw65uY2VhcMSDIGN1ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgdGVybWluZSBjdSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgaW5jbHVkxIMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgcG90cml2ZWFzY8SDIGN1IG1vZGVsdWwgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludmFsaWQ6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW3Eg3IgaW52YWxpZDogdHJlYnVpZSBzxIMgZmllIG11bHRpcGx1IGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoZWkgbmVyZWN1bm9zY3V0ZTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGVpZSBpbnZhbGlkxIMgw65uICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnRyYXJlIGludmFsaWTEgyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvYXJlIGludmFsaWTEgyDDrm4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkludHJhcmUgaW52YWxpZMSDIn19fTtmdW5jdGlvbiBuZygpe3JldHVybntsb2NhbGVFcnJvcjp0ZygpfX1mdW5jdGlvbiBEcyh0LG4scixvKXtjb25zdCBlPU1hdGguYWJzKHQpLGk9ZSUxMCxhPWUlMTAwO3JldHVybiBhPj0xMSYmYTw9MTk/bzppPT09MT9uOmk+PTImJmk8PTQ/cjpvfWNvbnN0IHJnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OntvbmU6ItGB0LjQvNCy0L7QuyIsZmV3OiLRgdC40LzQstC+0LvQsCIsbWFueToi0YHQuNC80LLQvtC70L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxmaWxlOnt1bml0OntvbmU6ItCx0LDQudGCIixmZXc6ItCx0LDQudGC0LAiLG1hbnk6ItCx0LDQudGCIn0sdmVyYjoi0LjQvNC10YLRjCJ9LGFycmF5Ont1bml0OntvbmU6ItGN0LvQtdC80LXQvdGCIixmZXc6ItGN0LvQtdC80LXQvdGC0LAiLG1hbnk6ItGN0LvQtdC80LXQvdGC0L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxzZXQ6e3VuaXQ6e29uZToi0Y3Qu9C10LzQtdC90YIiLGZldzoi0Y3Qu9C10LzQtdC90YLQsCIsbWFueToi0Y3Qu9C10LzQtdC90YLQvtCyIn0sdmVyYjoi0LjQvNC10YLRjCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLQstCy0L7QtCIsZW1haWw6ImVtYWlsINCw0LTRgNC10YEiLHVybDoiVVJMIixlbW9qaToi0Y3QvNC+0LTQt9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0LAg0Lgg0LLRgNC10LzRjyIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0LLRgNC10LzRjyIsZHVyYXRpb246IklTTyDQtNC70LjRgtC10LvRjNC90L7RgdGC0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LXRgSIsaXB2NjoiSVB2NiDQsNC00YDQtdGBIixjaWRydjQ6IklQdjQg0LTQuNCw0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00LjQsNC/0LDQt9C+0L0iLGJhc2U2NDoi0YHRgtGA0L7QutCwINCyINGE0L7RgNC80LDRgtC1IGJhc2U2NCIsYmFzZTY0dXJsOiLRgdGC0YDQvtC60LAg0LIg0YTQvtGA0LzQsNGC0LUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiSlNPTiDRgdGC0YDQvtC60LAiLGUxNjQ6ItC90L7QvNC10YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLQstCy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItGH0LjRgdC70L4iLGFycmF5OiLQvNCw0YHRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L3QviAke3N9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7aX0sINC/0L7Qu9GD0YfQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCw0YDQuNCw0L3Rgjog0L7QttC40LTQsNC70L7RgdGMINC+0LTQvdC+INC40LcgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5tYXhpbXVtKSxjPURzKHMsYS51bml0Lm9uZSxhLnVuaXQuZmV3LGEudW5pdC5tYW55KTtyZXR1cm5g0KHQu9C40YjQutC+0Lwg0LHQvtC70YzRiNC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC40LUifSDQsdGD0LTQtdGCINC40LzQtdGC0YwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7Y31gfXJldHVybmDQodC70LjRiNC60L7QvCDQsdC+0LvRjNGI0L7QtSDQt9C90LDRh9C10L3QuNC1OiDQvtC20LjQtNCw0LvQvtGB0YwsINGH0YLQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90LjQtSJ9INCx0YPQtNC10YIgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1pbmltdW0pLGM9RHMocyxhLnVuaXQub25lLGEudW5pdC5mZXcsYS51bml0Lm1hbnkpO3JldHVybmDQodC70LjRiNC60L7QvCDQvNCw0LvQtdC90YzQutC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbn0g0LHRg9C00LXRgiDQuNC80LXRgtGMICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0KHQu9C40YjQutC+0Lwg0LzQsNC70LXQvdGM0LrQvtC1INC30L3QsNGH0LXQvdC40LU6INC+0LbQuNC00LDQu9C+0YHRjCwg0YfRgtC+ICR7ZS5vcmlnaW59INCx0YPQtNC10YIgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0L3QsNGH0LjQvdCw0YLRjNGB0Y8g0YEgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDQt9Cw0LrQsNC90YfQuNCy0LDRgtGM0YHRjyDQvdCwICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDRgdC+0LTQtdGA0LbQsNGC0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0YHQvtC+0YLQstC10YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvdGDICR7aS5wYXR0ZXJufWA6YNCd0LXQstC10YDQvdGL0LkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCd0LXQstC10YDQvdC+0LUg0YfQuNGB0LvQvjog0LTQvtC70LbQvdC+INCx0YvRgtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9C+0LfQvdCw0L3QvSR7ZS5rZXlzLmxlbmd0aD4xPyLRi9C1Ijoi0YvQuSJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC4IjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdCy0LXRgNC90YvQuSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LXRgNC90YvQtSDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0J3QtdCy0LXRgNC90L7QtSDQt9C90LDRh9C10L3QuNC1INCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQtdGA0L3Ri9C1INCy0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtSJ9fX07ZnVuY3Rpb24gaWcoKXtyZXR1cm57bG9jYWxlRXJyb3I6cmcoKX19Y29uc3Qgb2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWtvdiIsdmVyYjoiaW1ldGkifSxmaWxlOnt1bml0OiJiYWp0b3YiLHZlcmI6ImltZXRpIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidm5vcyIsZW1haWw6ImUtcG/FoXRuaSBuYXNsb3YiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXR1bSBpbiDEjWFzIixkYXRlOiJJU08gZGF0dW0iLHRpbWU6IklTTyDEjWFzIixkdXJhdGlvbjoiSVNPIHRyYWphbmplIixpcHY0OiJJUHY0IG5hc2xvdiIsaXB2NjoiSVB2NiBuYXNsb3YiLGNpZHJ2NDoib2JzZWcgSVB2NCIsY2lkcnY2OiJvYnNlZyBJUHY2IixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuIG5peiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbiBuaXoiLGpzb25fc3RyaW5nOiJKU09OIG5peiIsZTE2NDoiRS4xNjQgxaF0ZXZpbGthIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidm5vcyJ9LG89e25hbjoiTmFOIixudW1iZXI6IsWhdGV2aWxvIixhcnJheToidGFiZWxhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5ldmVsamF2ZW4gdm5vczogcHJpxI1ha292YW5vIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcHJlamV0byAke3N9YDpgTmV2ZWxqYXZlbiB2bm9zOiBwcmnEjWFrb3Zhbm8gJHtpfSwgcHJlamV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOZXZlbGphdmVuIHZub3M6IHByacSNYWtvdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5ldmVsamF2bmEgbW/Fvm5vc3Q6IHByacSNYWtvdmFubyBlbm8gaXptZWQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSBpbWVsbyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3YifWA6YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BQcmVtYWpobm86IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbn0gaW1lbG8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFByZW1hamhubzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2ZWxqYXZlbiBuaXo6IG1vcmEgc2UgemHEjWV0aSB6ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHNlIGtvbsSNYXRpIHogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZlbGphdmVuIG5pejogbW9yYSB2c2Vib3ZhdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHVzdHJlemF0aSB2em9yY3UgJHtpLnBhdHRlcm59YDpgTmV2ZWxqYXZlbiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2ZWxqYXZubyDFoXRldmlsbzogbW9yYSBiaXRpIHZlxI1rcmF0bmlrICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5lcHJlcG96bmFuJHtlLmtleXMubGVuZ3RoPjE/Imkga2xqdcSNaSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZlbGphdmVuIGtsanXEjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXZlbGphdmVuIHZub3MiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2ZWxqYXZuYSB2cmVkbm9zdCB2ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZlbGphdmVuIHZub3MifX19O2Z1bmN0aW9uIGFnKCl7cmV0dXJue2xvY2FsZUVycm9yOm9nKCl9fWNvbnN0IHNnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWNrZW4iLHZlcmI6ImF0dCBoYSJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJhdHQgaGEifSxhcnJheTp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9LHNldDp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJyZWd1bGrDpHJ0IHV0dHJ5Y2siLGVtYWlsOiJlLXBvc3RhZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTy1kYXR1bSBvY2ggdGlkIixkYXRlOiJJU08tZGF0dW0iLHRpbWU6IklTTy10aWQiLGR1cmF0aW9uOiJJU08tdmFyYWt0aWdoZXQiLGlwdjQ6IklQdjQtaW50ZXJ2YWxsIixpcHY2OiJJUHY2LWludGVydmFsbCIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGFkIHN0csOkbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWtvZGFkIHN0csOkbmciLGpzb25fc3RyaW5nOiJKU09OLXN0csOkbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Im1hbGwtbGl0ZXJhbCJ9LG89e25hbjoiTmFOIixudW1iZXI6ImFudGFsIixhcnJheToibGlzdGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmljayAke3N9YDpgT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7aX0sIGZpY2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT2dpbHRpZ3QgdmFsOiBmw7ZydsOkbnRhZGUgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnQifWA6YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YXQgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRsO2ciBsaXRlKHQpOiBmw7ZydsOkbnRhZGUgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEbDtnIgbGl0ZSh0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBiw7ZyamEgbWVkICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIHNsdXRhIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIGlubmVow6VsbGEgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIG1hdGNoYSBtw7Zuc3RyZXQgIiR7aS5wYXR0ZXJufSJgOmBPZ2lsdGlnKHQpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPZ2lsdGlndCB0YWw6IG3DpXN0ZSB2YXJhIGVuIG11bHRpcGVsIGF2ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJPa8OkbmRhIG55Y2tsYXIiOiJPa8OkbmQgbnlja2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT2dpbHRpZyBueWNrZWwgaSAke2Uub3JpZ2luPz8idsOkcmRldCJ9YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJPZ2lsdGlnIGlucHV0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE9naWx0aWd0IHbDpHJkZSBpICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In1gO2RlZmF1bHQ6cmV0dXJuIk9naWx0aWcgaW5wdXQifX19O2Z1bmN0aW9uIGNnKCl7cmV0dXJue2xvY2FsZUVycm9yOnNnKCl9fWNvbnN0IHVnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLgro7grrTgr4HgrqTgr43grqTgr4HgrpXgr43grpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxmaWxlOnt1bml0OiLgrqrgr4jgrp/gr43grp/gr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxhcnJheTp7dW5pdDoi4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn0sc2V0Ont1bml0OiLgrongrrHgr4Hgrqrgr43grqrgr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4K6J4K6z4K+N4K6z4K+A4K6f4K+BIixlbWFpbDoi4K6u4K6/4K6p4K+N4K6p4K6e4K+N4K6a4K6y4K+NIOCuruCvgeCuleCuteCusOCuvyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIOCupOCvh+CupOCuvyDgrqjgr4fgrrDgrq7gr40iLGRhdGU6IklTTyDgrqTgr4fgrqTgrr8iLHRpbWU6IklTTyDgrqjgr4fgrrDgrq7gr40iLGR1cmF0aW9uOiJJU08g4K6V4K6+4K6yIOCuheCus+CuteCvgSIsaXB2NDoiSVB2NCDgrq7gr4HgrpXgrrXgrrDgrr8iLGlwdjY6IklQdjYg4K6u4K+B4K6V4K614K6w4K6/IixjaWRydjQ6IklQdjQg4K614K6w4K6u4K+N4K6q4K+BIixjaWRydjY6IklQdjYg4K614K6w4K6u4K+N4K6q4K+BIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkIOCumuCusOCuruCvjSIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCDgrprgrrDgrq7gr40iLGpzb25fc3RyaW5nOiJKU09OIOCumuCusOCuruCvjSIsZTE2NDoiRS4xNjQg4K6O4K6j4K+NIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLgro7grqPgr40iLGFycmF5OiLgroXgrqPgrr8iLG51bGw6IuCuteCvhuCuseCvgeCuruCviCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DgrqTgrrXgrrHgrr7grqkg4K6J4K6z4K+N4K6z4K+A4K6f4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWA6YOCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2l9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7UyhlLnZhbHVlc1swXSl9YDpg4K6k4K614K6x4K6+4K6pIOCuteCuv+CusOCvgeCuquCvjeCuquCuruCvjTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7XyhlLnZhbHVlcywifCIpfSDgrofgrrLgr40g4K6S4K6p4K+N4K6x4K+BYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CulSDgrqrgr4bgrrDgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2luPz8i4K6u4K6k4K6/4K6q4K+N4K6q4K+BIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIn0g4K6G4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrq7grr/grpUg4K6q4K+G4K6w4K6/4K6v4K6k4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtlLm9yaWdpbj8/IuCuruCupOCuv+CuquCvjeCuquCvgSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CuleCumuCvjSDgrprgrr/grrHgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9IOCuhuCulSDgrofgrrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDpg4K6u4K6/4K6V4K6a4K+NIOCumuCuv+CuseCuv+Cur+CupOCvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnByZWZpeH0iIOCuh+CusuCvjSDgrqTgr4rgrp/grpngr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnN1ZmZpeH0iIOCuh+CusuCvjSDgrq7gr4Hgrp/grr/grrXgrp/gr4jgrq8g4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOCupOCuteCuseCuvuCuqSDgrprgrrDgrq7gr406ICIke2kuaW5jbHVkZXN9IiDgrpAg4K6J4K6z4K+N4K6z4K6f4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6aS5mb3JtYXQ9PT0icmVnZXgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAke2kucGF0dGVybn0g4K6u4K+B4K6x4K+I4K6q4K6+4K6f4K+N4K6f4K+B4K6f4K6p4K+NIOCuquCviuCusOCvgeCuqOCvjeCupCDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrqTgrrXgrrHgrr7grqkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOCupOCuteCuseCuvuCuqSDgro7grqPgr406ICR7ZS5kaXZpc29yfSDgrofgrqngr40g4K6q4K6y4K6u4K6+4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDgroXgrp/gr4jgrq/grr7grrPgrq7gr40g4K6k4K+G4K6w4K6/4K6v4K6+4K6kIOCuteCuv+CumuCviCR7ZS5rZXlzLmxlbmd0aD4xPyLgrpXgrrPgr40iOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuteCuv+CumuCviGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuruCupOCuv+CuquCvjeCuquCvgWA7ZGVmYXVsdDpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSJ9fX07ZnVuY3Rpb24gbGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6dWcoKX19Y29uc3QgZGc9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuC4leC4seC4p+C4reC4seC4geC4qeC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In0sZmlsZTp7dW5pdDoi4LmE4Lia4LiV4LmMIix2ZXJiOiLguITguKfguKPguKHguLUifSxhcnJheTp7dW5pdDoi4Lij4Liy4Lii4LiB4Liy4LijIix2ZXJiOiLguITguKfguKPguKHguLUifSxzZXQ6e3VuaXQ6IuC4o+C4suC4ouC4geC4suC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuC4guC5ieC4reC4oeC4ueC4peC4l+C4teC5iOC4m+C5ieC4reC4mSIsZW1haWw6IuC4l+C4teC5iOC4reC4ouC4ueC5iOC4reC4teC5gOC4oeC4pSIsdXJsOiJVUkwiLGVtb2ppOiLguK3guLTguYLguKHguIjguLQiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuC4p+C4seC4meC4l+C4teC5iOC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGRhdGU6IuC4p+C4seC4meC4l+C4teC5iOC5geC4muC4miBJU08iLHRpbWU6IuC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGR1cmF0aW9uOiLguIrguYjguKfguIfguYDguKfguKXguLLguYHguJrguJogSVNPIixpcHY0OiLguJfguLXguYjguK3guKLguLnguYggSVB2NCIsaXB2Njoi4LiX4Li14LmI4Lit4Lii4Li54LmIIElQdjYiLGNpZHJ2NDoi4LiK4LmI4Lin4LiHIElQIOC5geC4muC4miBJUHY0IixjaWRydjY6IuC4iuC5iOC4p+C4hyBJUCDguYHguJrguJogSVB2NiIsYmFzZTY0OiLguILguYnguK3guITguKfguLLguKHguYHguJrguJogQmFzZTY0IixiYXNlNjR1cmw6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBCYXNlNjQg4Liq4Liz4Lir4Lij4Lix4LiaIFVSTCIsanNvbl9zdHJpbmc6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBKU09OIixlMTY0OiLguYDguJrguK3guKPguYzguYLguJfguKPguKjguLHguJ7guJfguYzguKPguLDguKvguKfguYjguLLguIfguJvguKPguLDguYDguJfguKggKEUuMTY0KSIsand0OiLguYLguJfguYDguITguJkgSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLguILguYnguK3guKHguLnguKXguJfguLXguYjguJvguYnguK3guJkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLguJXguLHguKfguYDguKXguIIiLGFycmF5OiLguK3guLLguKPguYzguYDguKPguKLguYwgKEFycmF5KSIsbnVsbDoi4LmE4Lih4LmI4Lih4Li14LiE4LmI4LiyIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g4LmB4LiV4LmI4LmE4LiU4LmJ4Lij4Lix4LiaICR7c31gOmDguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke2l9IOC5geC4leC5iOC5hOC4lOC5ieC4o+C4seC4miAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DguITguYjguLLguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke1MoZS52YWx1ZXNbMF0pfWA6YOC4leC4seC4p+C5gOC4peC4t+C4reC4geC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiE4Lin4Lij4LmA4Lib4LmH4LiZ4Lir4LiZ4Li24LmI4LiH4LmD4LiZICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i4LmE4Lih4LmI4LmA4LiB4Li04LiZIjoi4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4LiyIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4Lij4Liy4Lii4LiB4Liy4LijIn1gOmDguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuC4reC4ouC5iOC4suC4h+C4meC5ieC4reC4oiI6IuC4oeC4suC4geC4geC4p+C5iOC4siIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4Liy4LiB4Liz4Lir4LiZ4LiUOiAke2Uub3JpZ2lufSDguITguKfguKPguKHguLUke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4geC4s+C4q+C4meC4lDogJHtlLm9yaWdpbn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4guC4tuC5ieC4meC4leC5ieC4meC4lOC5ieC4p+C4oiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4peC4h+C4l+C5ieC4suC4ouC4lOC5ieC4p+C4oiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOC4o+C4ueC4m+C5geC4muC4muC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4Lih4Li1ICIke2kuaW5jbHVkZXN9IiDguK3guKLguLnguYjguYPguJnguILguYnguK3guITguKfguLLguKFgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguJXguKPguIfguIHguLHguJrguKPguLnguJvguYHguJrguJrguJfguLXguYjguIHguLPguKvguJnguJQgJHtpLnBhdHRlcm59YDpg4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g4LiV4Lix4Lin4LmA4Lil4LiC4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguYDguJvguYfguJnguIjguLPguJnguKfguJnguJfguLXguYjguKvguLLguKPguJTguYnguKfguKIgJHtlLmRpdmlzb3J9IOC5hOC4lOC5ieC4peC4h+C4leC4seC4p2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOC4nuC4muC4hOC4teC4ouC5jOC4l+C4teC5iOC5hOC4oeC5iOC4o+C4ueC5ieC4iOC4seC4gTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDguITguLXguKLguYzguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguYPguJkgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LmE4Lih4LmI4LiV4Lij4LiH4LiB4Lix4Lia4Lij4Li54Lib4LmB4Lia4Lia4Lii4Li54LmA4LiZ4Li14Lii4LiZ4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiU4LmE4Lin4LmJIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4h+C5g+C4mSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4LiC4LmJ4Lit4Lih4Li54Lil4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHIn19fTtmdW5jdGlvbiBtZygpe3JldHVybntsb2NhbGVFcnJvcjpkZygpfX1jb25zdCBwZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6Im9sbWFsxLEifSxmaWxlOnt1bml0OiJiYXl0Iix2ZXJiOiJvbG1hbMSxIn0sYXJyYXk6e3VuaXQ6IsO2xJ9lIix2ZXJiOiJvbG1hbMSxIn0sc2V0Ont1bml0OiLDtsSfZSIsdmVyYjoib2xtYWzEsSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJnaXJkaSIsZW1haWw6ImUtcG9zdGEgYWRyZXNpIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gdGFyaWggdmUgc2FhdCIsZGF0ZToiSVNPIHRhcmloIix0aW1lOiJJU08gc2FhdCIsZHVyYXRpb246IklTTyBzw7xyZSIsaXB2NDoiSVB2NCBhZHJlc2kiLGlwdjY6IklQdjYgYWRyZXNpIixjaWRydjQ6IklQdjQgYXJhbMSxxJ/EsSIsY2lkcnY2OiJJUHY2IGFyYWzEscSfxLEiLGJhc2U2NDoiYmFzZTY0IGlsZSDFn2lmcmVsZW5tacWfIG1ldGluIixiYXNlNjR1cmw6ImJhc2U2NHVybCBpbGUgxZ9pZnJlbGVubWnFnyBtZXRpbiIsanNvbl9zdHJpbmc6IkpTT04gZGl6ZXNpIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IsWeYWJsb24gZGl6ZXNpIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gR2XDp2Vyc2l6IGRlxJ9lcjogYmVrbGVuZW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBhbMSxbmFuICR7c31gOmBHZcOnZXJzaXogZGXEn2VyOiBiZWtsZW5lbiAke2l9LCBhbMSxbmFuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEdlw6dlcnNpeiBkZcSfZXI6IGJla2xlbmVuICR7UyhlLnZhbHVlc1swXSl9YDpgR2XDp2Vyc2l6IHNlw6dlbmVrOiBhxZ9hxJ/EsWRha2lsZXJkZW4gYmlyaSBvbG1hbMSxOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dvayBiw7x5w7xrOiBiZWtsZW5lbiAke2Uub3JpZ2luPz8iZGXEn2VyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iw7bEn2UifWA6YMOHb2sgYsO8ecO8azogYmVrbGVuZW4gJHtlLm9yaWdpbj8/ImRlxJ9lciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb2sga8O8w6fDvGs6IGJla2xlbmVuICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDDh29rIGvDvMOnw7xrOiBiZWtsZW5lbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnN1ZmZpeH0iIGlsZSBiaXRtZWxpYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEdlw6dlcnNpeiBtZXRpbjogIiR7aS5pbmNsdWRlc30iIGnDp2VybWVsaWA6aS5mb3JtYXQ9PT0icmVnZXgiP2BHZcOnZXJzaXogbWV0aW46ICR7aS5wYXR0ZXJufSBkZXNlbmluZSB1eW1hbMSxYDpgR2XDp2Vyc2l6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBHZcOnZXJzaXogc2F5xLE6ICR7ZS5kaXZpc29yfSBpbGUgdGFtIGLDtmzDvG5lYmlsbWVsaWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFRhbsSxbm1heWFuIGFuYWh0YXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gacOnaW5kZSBnZcOnZXJzaXogYW5haHRhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2XDp2Vyc2l6IGRlxJ9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbmRlIGdlw6dlcnNpeiBkZcSfZXJgO2RlZmF1bHQ6cmV0dXJuIkdlw6dlcnNpeiBkZcSfZXIifX19O2Z1bmN0aW9uIGZnKCl7cmV0dXJue2xvY2FsZUVycm9yOnBnKCl9fWNvbnN0IGdnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLRgdC40LzQstC+0LvRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifSxmaWxlOnt1bml0OiLQsdCw0LnRgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LHNldDp7dW5pdDoi0LXQu9C10LzQtdC90YLRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIixlbWFpbDoi0LDQtNGA0LXRgdCwINC10LvQtdC60YLRgNC+0L3QvdC+0Zcg0L/QvtGI0YLQuCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7QtNC30ZYiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItC00LDRgtCwINGC0LAg0YfQsNGBIElTTyIsZGF0ZToi0LTQsNGC0LAgSVNPIix0aW1lOiLRh9Cw0YEgSVNPIixkdXJhdGlvbjoi0YLRgNC40LLQsNC70ZbRgdGC0YwgSVNPIixpcHY0OiLQsNC00YDQtdGB0LAgSVB2NCIsaXB2Njoi0LDQtNGA0LXRgdCwIElQdjYiLGNpZHJ2NDoi0LTRltCw0L/QsNC30L7QvSBJUHY0IixjaWRydjY6ItC00ZbQsNC/0LDQt9C+0L0gSVB2NiIsYmFzZTY0OiLRgNGP0LTQvtC6INGDINC60L7QtNGD0LLQsNC90L3RliBiYXNlNjQiLGJhc2U2NHVybDoi0YDRj9C00L7QuiDRgyDQutC+0LTRg9Cy0LDQvdC90ZYgYmFzZTY0dXJsIixqc29uX3N0cmluZzoi0YDRj9C00L7QuiBKU09OIixlMTY0OiLQvdC+0LzQtdGAIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi0YfQuNGB0LvQviIsYXJyYXk6ItC80LDRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L7RgtGA0LjQvNCw0L3QviAke3N9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7aX0sINC+0YLRgNC40LzQsNC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QsCDQvtC/0YbRltGPOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyDQvtC00L3QtSDQtyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0JfQsNC90LDQtNGC0L4g0LLQtdC70LjQutC1OiDQvtGH0ZbQutGD0ZTRgtGM0YHRjywg0YnQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90L3RjyJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtGW0LIifWA6YNCX0LDQvdCw0LTRgtC+INCy0LXQu9C40LrQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC90Y8ifSDQsdGD0LTQtSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0g0LHRg9C00LUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQv9C+0YfQuNC90LDRgtC40YHRjyDQtyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DQndC10L/RgNCw0LLQuNC70YzQvdC40Lkg0YDRj9C00L7Qujog0L/QvtCy0LjQvdC10L0g0LfQsNC60ZbQvdGH0YPQstCw0YLQuNGB0Y8g0L3QsCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQvNGW0YHRgtC40YLQuCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INGA0Y/QtNC+0Lo6INC/0L7QstC40L3QtdC9INCy0ZbQtNC/0L7QstGW0LTQsNGC0Lgg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INGH0LjRgdC70L46INC/0L7QstC40L3QvdC+INCx0YPRgtC4INC60YDQsNGC0L3QuNC8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNC+0LfQv9GW0LfQvdCw0L3QuNC5INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItGWIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INC60LvRjtGHINGDICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLQndC10L/RgNCw0LLQuNC70YzQvdGWINCy0YXRltC00L3RliDQtNCw0L3RliI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INC30L3QsNGH0LXQvdC90Y8g0YMgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWIn19fTtmdW5jdGlvbiBUbCgpe3JldHVybntsb2NhbGVFcnJvcjpnZygpfX1mdW5jdGlvbiB2Zygpe3JldHVybiBUbCgpfWNvbnN0IGhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLYrdix2YjZgSIsdmVyYjoi24HZiNmG2KcifSxmaWxlOnt1bml0OiLYqNin2KbZudizIix2ZXJiOiLbgdmI2YbYpyJ9LGFycmF5Ont1bml0OiLYotim2bnZhdiyIix2ZXJiOiLbgdmI2YbYpyJ9LHNldDp7dW5pdDoi2KLYptm52YXYsiIsdmVyYjoi24HZiNmG2KcifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2KfZhiDZvtm5IixlbWFpbDoi2KfbjCDZhduM2YQg2KfbjNqI2LHbjNizIix1cmw6ItuM2Ygg2KLYsSDYp9uM2YQiLGVtb2ppOiLYp9uM2YXZiNis24wiLHV1aWQ6ItuM2Ygg24zZiCDYotim24wg2ojbjCIsdXVpZHY0OiLbjNmIINuM2Ygg2KLYptuMINqI24wg2YjbjCA0Iix1dWlkdjY6ItuM2Ygg24zZiCDYotim24wg2ojbjCDZiNuMIDYiLG5hbm9pZDoi2YbbjNmG2Ygg2KLYptuMINqI24wiLGd1aWQ6Itis24wg24zZiCDYotim24wg2ojbjCIsY3VpZDoi2LPbjCDbjNmIINii2KbbjCDaiNuMIixjdWlkMjoi2LPbjCDbjNmIINii2KbbjCDaiNuMIDIiLHVsaWQ6ItuM2Ygg2KfbjNmEINii2KbbjCDaiNuMIix4aWQ6Itin24zaqdizINii2KbbjCDaiNuMIixrc3VpZDoi2qnbkiDYp9uM2LMg24zZiCDYotim24wg2ojbjCIsZGF0ZXRpbWU6Itii2KbbjCDYp9uM2LMg2KfZiCDaiNuM2bkg2bnYp9im2YUiLGRhdGU6Itii2KbbjCDYp9uM2LMg2KfZiCDYqtin2LHbjNiuIix0aW1lOiLYotim24wg2KfbjNizINin2Ygg2YjZgtiqIixkdXJhdGlvbjoi2KLYptuMINin24zYsyDYp9mIINmF2K/YqiIsaXB2NDoi2KLYptuMINm+24wg2YjbjCA0INin24zaiNix24zYsyIsaXB2Njoi2KLYptuMINm+24wg2YjbjCA2INin24zaiNix24zYsyIsY2lkcnY0OiLYotim24wg2b7bjCDZiNuMIDQg2LHbjNmG2KwiLGNpZHJ2Njoi2KLYptuMINm+24wg2YjbjCA2INix24zZhtisIixiYXNlNjQ6Itio24zYsyA2NCDYp9mGINqp2YjaiNqIINiz2bnYsdmG2q8iLGJhc2U2NHVybDoi2KjbjNizIDY0INuM2Ygg2KLYsSDYp9uM2YQg2KfZhiDaqdmI2ojaiCDYs9m52LHZhtqvIixqc29uX3N0cmluZzoi2KzbkiDYp9uM2LMg2KfZiCDYp9uM2YYg2LPZudix2YbaryIsZTE2NDoi2KfbjCAxNjQg2YbZhdio2LEiLGp3dDoi2KzbkiDaiNio2YTbjNmIINm524wiLHRlbXBsYXRlX2xpdGVyYWw6Itin2YYg2b7ZuSJ9LG89e25hbjoiTmFOIixudW1iZXI6ItmG2YXYqNixIixhcnJheToi2KLYsduSIixudWxsOiLZhtmEIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNi62YTYtyDYp9mGINm+2bk6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDZhdiq2YjZgti5INiq2r7Yp9iMICR7c30g2YXZiNi12YjZhCDbgdmI2KdgOmDYutmE2Lcg2KfZhiDZvtm5OiAke2l9INmF2KrZiNmC2Lkg2Kravtin2IwgJHtzfSDZhdmI2LXZiNmEINuB2YjYp2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2LrZhNi3INin2YYg2b7ZuTogJHtTKGUudmFsdWVzWzBdKX0g2YXYqtmI2YLYuSDYqtq+2KdgOmDYutmE2Lcg2KLZvti02YY6ICR7XyhlLnZhbHVlcywifCIpfSDZhduM2rog2LPbkiDYp9uM2qkg2YXYqtmI2YLYuSDYqtq+2KdgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2KjbgdiqINio2pHYpzogJHtlLm9yaWdpbj8/ItmI24zZhNuM2YgifSDaqduSICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYp9i12LEifSDbgdmI2YbbkiDZhdiq2YjZgti5INiq2r7bkmA6YNio24HYqiDYqNqR2Kc6ICR7ZS5vcmlnaW4/PyLZiNuM2YTbjNmIIn0g2qnYpyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g24HZiNmG2Kcg2YXYqtmI2YLYuSDYqtq+2KdgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYqNuB2Kog2obavtmI2bnYpzogJHtlLm9yaWdpbn0g2qnbkiAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INuB2YjZhtuSINmF2KrZiNmC2Lkg2KravtuSYDpg2KjbgdiqINqG2r7ZiNm52Kc6ICR7ZS5vcmlnaW59INqp2KcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9INuB2YjZhtinINmF2KrZiNmC2Lkg2KravtinYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNi62YTYtyDYs9m52LHZhtqvOiAiJHtpLnByZWZpeH0iINiz25Ig2LTYsdmI2Lkg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g2LrZhNi3INiz2bnYsdmG2q86ICIke2kuc3VmZml4fSIg2b7YsSDYrtiq2YUg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DYutmE2Lcg2LPZudix2YbarzogIiR7aS5pbmNsdWRlc30iINi02KfZhdmEINuB2YjZhtinINqG2KfbgduM25JgOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LrZhNi3INiz2bnYsdmG2q86INm+24zZudix2YYgJHtpLnBhdHRlcm59INiz25Ig2YXbjNqGINuB2YjZhtinINqG2KfbgduM25JgOmDYutmE2LcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNi62YTYtyDZhtmF2KjYsTogJHtlLmRpdmlzb3J9INqp2Kcg2YXYttin2LnZgSDbgdmI2YbYpyDahtin24HbjNuSYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2LrbjNixINiq2LPZhNuM2YUg2LTYr9uBINqp24wke2Uua2V5cy5sZW5ndGg+MT8i2LIiOiIifTogJHtfKGUua2V5cywi2IwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g2YXbjNq6INi62YTYtyDaqduMYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLYutmE2Lcg2KfZhiDZvtm5IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW59INmF24zauiDYutmE2Lcg2YjbjNmE24zZiGA7ZGVmYXVsdDpyZXR1cm4i2LrZhNi3INin2YYg2b7ZuSJ9fX07ZnVuY3Rpb24gJGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6aGcoKX19Y29uc3QgX2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImJlbGdpIix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sZmlsZTp7dW5pdDoiYmF5dCIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LGFycmF5Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sbWFwOnt1bml0OiJ5b3p1diIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJraXJpc2giLGVtYWlsOiJlbGVrdHJvbiBwb2NodGEgbWFuemlsaSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIHNhbmEgdmEgdmFxdGkiLGRhdGU6IklTTyBzYW5hIix0aW1lOiJJU08gdmFxdCIsZHVyYXRpb246IklTTyBkYXZvbWl5bGlrIixpcHY0OiJJUHY0IG1hbnppbCIsaXB2NjoiSVB2NiBtYW56aWwiLG1hYzoiTUFDIG1hbnppbCIsY2lkcnY0OiJJUHY0IGRpYXBhem9uIixjaWRydjY6IklQdjYgZGlhcGF6b24iLGJhc2U2NDoiYmFzZTY0IGtvZGxhbmdhbiBzYXRyIixiYXNlNjR1cmw6ImJhc2U2NHVybCBrb2RsYW5nYW4gc2F0ciIsanNvbl9zdHJpbmc6IkpTT04gc2F0ciIsZTE2NDoiRS4xNjQgcmFxYW0iLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJraXJpc2gifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJyYXFhbSIsYXJyYXk6Im1hc3NpdiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOb3Rv4oCYZ+KAmHJpIGtpcmlzaDoga3V0aWxnYW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBxYWJ1bCBxaWxpbmdhbiAke3N9YDpgTm90b+KAmGfigJhyaSBraXJpc2g6IGt1dGlsZ2FuICR7aX0sIHFhYnVsIHFpbGluZ2FuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5vdG/igJhn4oCYcmkga2lyaXNoOiBrdXRpbGdhbiAke1MoZS52YWx1ZXNbMF0pfWA6YE5vdG/igJhn4oCYcmkgdmFyaWFudDogcXV5aWRhZ2lsYXJkYW4gYmlyaSBrdXRpbGdhbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdH0gJHthLnZlcmJ9YDpgSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTm90b+KAmGfigJhyaSBzYXRyOiAiJHtpLnByZWZpeH0iIGJpbGFuIGJvc2hsYW5pc2hpIGtlcmFrYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuc3VmZml4fSIgYmlsYW4gdHVnYXNoaSBrZXJha2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuaW5jbHVkZXN9IiBuaSBv4oCYeiBpY2hpZ2Egb2xpc2hpIGtlcmFrYDppLmZvcm1hdD09PSJyZWdleCI/YE5vdG/igJhn4oCYcmkgc2F0cjogJHtpLnBhdHRlcm59IHNoYWJsb25pZ2EgbW9zIGtlbGlzaGkga2VyYWtgOmBOb3Rv4oCYZ+KAmHJpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb3Rv4oCYZ+KAmHJpIHJhcWFtOiAke2UuZGl2aXNvcn0gbmluZyBrYXJyYWxpc2kgYm/igJhsaXNoaSBrZXJha2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5vbWHigJlsdW0ga2FsaXQke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGFnaSBrYWxpdCBub3Rv4oCYZ+KAmHJpYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOb3Rv4oCYZ+KAmHJpIGtpcmlzaCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYSBub3Rv4oCYZ+KAmHJpIHFpeW1hdGA7ZGVmYXVsdDpyZXR1cm4iTm90b+KAmGfigJhyaSBraXJpc2gifX19O2Z1bmN0aW9uIGJnKCl7cmV0dXJue2xvY2FsZUVycm9yOl9nKCl9fWNvbnN0IHlnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrw70gdOG7sSIsdmVyYjoiY8OzIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiY8OzIn0sYXJyYXk6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifSxzZXQ6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoixJHhuqd1IHbDoG8iLGVtYWlsOiLEkeG7i2EgY2jhu4kgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Im5nw6B5IGdp4budIElTTyIsZGF0ZToibmfDoHkgSVNPIix0aW1lOiJnaeG7nSBJU08iLGR1cmF0aW9uOiJraG/huqNuZyB0aOG7nWkgZ2lhbiBJU08iLGlwdjQ6IsSR4buLYSBjaOG7iSBJUHY0IixpcHY2OiLEkeG7i2EgY2jhu4kgSVB2NiIsY2lkcnY0OiJk4bqjaSBJUHY0IixjaWRydjY6ImThuqNpIElQdjYiLGJhc2U2NDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjQiLGJhc2U2NHVybDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjaHXhu5dpIEpTT04iLGUxNjQ6InPhu5EgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEkeG6p3UgdsOgbyJ9LG89e25hbjoiTmFOIixudW1iZXI6InPhu5EiLGFycmF5OiJt4bqjbmcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gxJDhuqd1IHbDoG8ga2jDtG5nIGjhu6NwIGzhu4c6IG1vbmcgxJHhu6NpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gOmDEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hzogbW9uZyDEkeG7o2kgJHtpfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YMSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSAke1MoZS52YWx1ZXNbMF0pfWA6YFTDuXkgY2jhu41uIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSBt4buZdCB0cm9uZyBjw6FjIGdpw6EgdHLhu4sgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6EgbOG7m246IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW4/PyJnacOhIHRy4buLIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBo4bqnbiB04butIn1gOmBRdcOhIGzhu5tuOiBtb25nIMSR4bujaSAke2Uub3JpZ2luPz8iZ2nDoSB0cuG7iyJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6Egbmjhu486IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgUXXDoSBuaOG7jzogbW9uZyDEkeG7o2kgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBi4bqvdCDEkeG6p3UgYuG6sW5nICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBr4bq/dCB0aMO6YyBi4bqxbmcgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgYmFvIGfhu5NtICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kga2jhu5twIHbhu5tpIG3huqt1ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBraMO0bmcgaOG7o3AgbOG7h2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBT4buRIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgbMOgIGLhu5lpIHPhu5EgY+G7p2EgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS2jDs2Ega2jDtG5nIMSRxrDhu6NjIG5o4bqtbiBk4bqhbmc6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS2jDs2Ega2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEdpw6EgdHLhu4sga2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIn19fTtmdW5jdGlvbiBrZygpe3JldHVybntsb2NhbGVFcnJvcjp5ZygpfX1jb25zdCBTZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi5a2X56ymIix2ZXJiOiLljIXlkKsifSxmaWxlOnt1bml0OiLlrZfoioIiLHZlcmI6IuWMheWQqyJ9LGFycmF5Ont1bml0OiLpobkiLHZlcmI6IuWMheWQqyJ9LHNldDp7dW5pdDoi6aG5Iix2ZXJiOiLljIXlkKsifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi6L6T5YWlIixlbWFpbDoi55S15a2Q6YKu5Lu2Iix1cmw6IlVSTCIsZW1vamk6IuihqOaDheespuWPtyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNP5pel5pyf5pe26Ze0IixkYXRlOiJJU0/ml6XmnJ8iLHRpbWU6IklTT+aXtumXtCIsZHVyYXRpb246IklTT+aXtumVvyIsaXB2NDoiSVB2NOWcsOWdgCIsaXB2NjoiSVB2NuWcsOWdgCIsY2lkcnY0OiJJUHY0572R5q61IixjaWRydjY6IklQdjbnvZHmrrUiLGJhc2U2NDoiYmFzZTY057yW56CB5a2X56ym5LiyIixiYXNlNjR1cmw6ImJhc2U2NHVybOe8lueggeWtl+espuS4siIsanNvbl9zdHJpbmc6IkpTT07lrZfnrKbkuLIiLGUxNjQ6IkUuMTY05Y+356CBIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi6L6T5YWlIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi5pWw5a2XIixhcnJheToi5pWw57uEIixudWxsOiLnqbrlgLwobnVsbCkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g5peg5pWI6L6T5YWl77ya5pyf5pybIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfe+8jOWunumZheaOpeaUtiAke3N9YDpg5peg5pWI6L6T5YWl77ya5pyf5pybICR7aX3vvIzlrp7pmYXmjqXmlLYgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g5peg5pWI6L6T5YWl77ya5pyf5pybICR7UyhlLnZhbHVlc1swXSl9YDpg5peg5pWI6YCJ6aG577ya5pyf5pyb5Lul5LiL5LmL5LiAICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flpKfvvJrmnJ/mnJsgJHtlLm9yaWdpbj8/IuWAvCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuS4quWFg+e0oCJ9YDpg5pWw5YC86L+H5aSn77ya5pyf5pybICR7ZS5vcmlnaW4/PyLlgLwifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flsI/vvJrmnJ/mnJsgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOaVsOWAvOi/h+Wwj++8muacn+acmyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75LulICIke2kucHJlZml4fSIg5byA5aS0YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvku6UgIiR7aS5zdWZmaXh9IiDnu5PlsL5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75YyF5ZCrICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvmu6HotrPmraPliJnooajovr7lvI8gJHtpLnBhdHRlcm59YDpg5peg5pWIJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOaXoOaViOaVsOWtl++8muW/hemhu+aYryAke2UuZGl2aXNvcn0g55qE5YCN5pWwYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g5Ye6546w5pyq55+l55qE6ZSuKGtleSk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit55qE6ZSuKGtleSnml6DmlYhgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuaXoOaViOi+k+WFpSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDkuK3ljIXlkKvml6DmlYjlgLwodmFsdWUpYDtkZWZhdWx0OnJldHVybiLml6DmlYjovpPlhaUifX19O2Z1bmN0aW9uIHdnKCl7cmV0dXJue2xvY2FsZUVycm9yOlNnKCl9fWNvbnN0IElnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLlrZflhYMiLHZlcmI6IuaTgeaciSJ9LGZpbGU6e3VuaXQ6IuS9jeWFg+e1hCIsdmVyYjoi5pOB5pyJIn0sYXJyYXk6e3VuaXQ6IumgheebriIsdmVyYjoi5pOB5pyJIn0sc2V0Ont1bml0OiLpoIXnm64iLHZlcmI6IuaTgeaciSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLovLjlhaUiLGVtYWlsOiLpg7Xku7blnLDlnYAiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDml6XmnJ/mmYLplpMiLGRhdGU6IklTTyDml6XmnJ8iLHRpbWU6IklTTyDmmYLplpMiLGR1cmF0aW9uOiJJU08g5pyf6ZaTIixpcHY0OiJJUHY0IOS9jeWdgCIsaXB2NjoiSVB2NiDkvY3lnYAiLGNpZHJ2NDoiSVB2NCDnr4TlnI0iLGNpZHJ2NjoiSVB2NiDnr4TlnI0iLGJhc2U2NDoiYmFzZTY0IOe3qOeivOWtl+S4siIsYmFzZTY0dXJsOiJiYXNlNjR1cmwg57eo56K85a2X5LiyIixqc29uX3N0cmluZzoiSlNPTiDlrZfkuLIiLGUxNjQ6IkUuMTY0IOaVuOWAvCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Iui8uOWFpSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH3vvIzkvYbmlLbliLAgJHtzfWA6YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke2l977yM5L2G5pS25YiwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke1MoZS52YWx1ZXNbMF0pfWA6YOeEoeaViOeahOmBuOmghe+8mumgkOacn+eCuuS7peS4i+WFtuS4reS5i+S4gCAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pW45YC86YGO5aSn77ya6aCQ5pyfICR7ZS5vcmlnaW4/PyLlgLwifSDmh4nngrogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i5YCL5YWD57SgIn1gOmDmlbjlgLzpgY7lpKfvvJrpoJDmnJ8gJHtlLm9yaWdpbj8/IuWAvCJ9IOaHieeCuiAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjku6UgIiR7aS5wcmVmaXh9IiDplovpoK1gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOS7pSAiJHtpLnN1ZmZpeH0iIOe1kOWwvmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjljIXlkKsgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOespuWQiOagvOW8jyAke2kucGF0dGVybn1gOmDnhKHmlYjnmoQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeaViOeahOaVuOWtl++8muW/hemgiOeCuiAke2UuZGl2aXNvcn0g55qE5YCN5pW4YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g54Sh5rOV6K2Y5Yil55qE6Y215YC8JHtlLmtleXMubGVuZ3RoPjE/IuWAkSI6IiJ977yaJHtfKGUua2V5cywi44CBIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE6Y215YC8YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE5YC8YDtkZWZhdWx0OnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwifX19O2Z1bmN0aW9uIHpnKCl7cmV0dXJue2xvY2FsZUVycm9yOklnKCl9fWNvbnN0IHhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLDoG1pIix2ZXJiOiJuw60ifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoibsOtIn0sYXJyYXk6e3VuaXQ6Im5rYW4iLHZlcmI6Im7DrSJ9LHNldDp7dW5pdDoibmthbiIsdmVyYjoibsOtIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuG6ucyAcuG7jSDDrGLDoXfhu41sw6kiLGVtYWlsOiLDoGTDrXLhurnMgXPDrCDDrG3hurnMgWzDrCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiw6Brw7Nrw7IgSVNPIixkYXRlOiLhu41q4buNzIEgSVNPIix0aW1lOiLDoGvDs2vDsiBJU08iLGR1cmF0aW9uOiLDoGvDs2vDsiB0w7MgcMOpIElTTyIsaXB2NDoiw6Bkw61y4bq5zIFzw6wgSVB2NCIsaXB2Njoiw6Bkw61y4bq5zIFzw6wgSVB2NiIsY2lkcnY0OiLDoGdiw6hnYsOoIElQdjQiLGNpZHJ2Njoiw6BnYsOoZ2LDqCBJUHY2IixiYXNlNjQ6IuG7jcyAcuG7jcyAIHTDrSBhIGvhu43MgSBuw60gYmFzZTY0IixiYXNlNjR1cmw6IuG7jcyAcuG7jcyAIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuG7jcyAcuG7jcyAIEpTT04iLGUxNjQ6Im7hu43MgW1iw6AgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhurnMgHLhu40gw6xiw6F34buNbMOpIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibuG7jcyBbWLDoCIsYXJyYXk6ImFrb3Dhu40ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gw4xiw6F34buNbMOpIGHhuaPDrOG5o2U6IGEgbsOtIGzDoXRpIGZpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgw6Bt4buNzIAgYSByw60gJHtzfWA6YMOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlOiBhIG7DrSBsw6F0aSBmaSAke2l9LCDDoG3hu43MgCBhIHLDrSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDjGLDoXfhu41sw6kgYeG5o8Os4bmjZTogYSBuw60gbMOhdGkgZmkgJHtTKGUudmFsdWVzWzBdKX1gOmDDgOG5o8OgecOgbiBh4bmjw6zhuaNlOiB5YW4g4buNzIBrYW4gbMOhcmEgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDsyBw4buNzIAgasO5OiBhIG7DrSBsw6F0aSBq4bq5zIEgcMOpICR7ZS5vcmlnaW4/PyJpeWUifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtfSAke2EudW5pdH1gOmBUw7MgcOG7jcyAIGrDuTogYSBuw60gbMOhdGkgauG6ucyBICR7aX0ke2UubWF4aW11bX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BLw6lyw6kganU6IGEgbsOtIGzDoXRpIGrhurnMgSBww6kgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bX0gJHthLnVuaXR9YDpgS8OpcsOpIGp1OiBhIG7DrSBsw6F0aSBq4bq5zIEgJHtpfSR7ZS5taW5pbXVtfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGLhurnMgHLhurnMgCBw4bq5zIBsw7ogIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBwYXLDrSBw4bq5zIBsw7ogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIG7DrSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBiw6Egw6Bw4bq54bq5cuG6uSBtdSAke2kucGF0dGVybn1gOmBB4bmjw6zhuaNlOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTuG7jcyBbWLDoCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGrhurnMgSDDqHnDoCBww61ww61uIHRpICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYELhu410w6xuw6wgw6DDrG3hu43MgDogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBC4buNdMOsbsOsIGHhuaPDrOG5o2UgbsOtbsO6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDjGLDoXfhu41sw6kgYeG5o8Os4bmjZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJeWUgYeG5o8Os4bmjZSBuw61uw7ogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlIn19fTtmdW5jdGlvbiBUZygpe3JldHVybntsb2NhbGVFcnJvcjp4ZygpfX1jb25zdCBKaT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYXI6Q3AsYXo6THAsYmU6cXAsYmc6SnAsY2E6V3AsY3M6VnAsZGE6R3AsZGU6WXAsZWw6ZWYsZW46emwsZW86cmYsZXM6YWYsZmE6Y2YsZmk6bGYsZnI6bWYsZnJDQTpmZixoZTp2ZixocjokZixodTpiZixoeTprZixpZDp3Zixpczp6ZixpdDpUZixqYTpPZixrYTpQZixraDpEZixrbTp4bCxrbzpaZixsdDpDZixtazpMZixtczpxZixubDpKZixubzpXZixvdGE6VmYscGw6WWYscHM6R2YscHQ6ZWcscm86bmcscnU6aWcsc2w6YWcsc3Y6Y2csdGE6bGcsdGg6bWcsdHI6ZmcsdWE6dmcsdWs6VGwsdXI6JGcsdXo6Ymcsdmk6a2cseW86VGcsemhDTjp3Zyx6aFRXOnpnfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO3ZhciBFcztjb25zdCBIaT1TeW1ib2woIlpvZE91dHB1dCIpLFdpPVN5bWJvbCgiWm9kSW5wdXQiKTtjbGFzcyBqbHtjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD1uZXcgV2Vha01hcCx0aGlzLl9pZG1hcD1uZXcgTWFwfWFkZChuLC4uLnIpe2NvbnN0IG89clswXTtyZXR1cm4gdGhpcy5fbWFwLnNldChuLG8pLG8mJnR5cGVvZiBvPT0ib2JqZWN0IiYmImlkImluIG8mJnRoaXMuX2lkbWFwLnNldChvLmlkLG4pLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5fbWFwPW5ldyBXZWFrTWFwLHRoaXMuX2lkbWFwPW5ldyBNYXAsdGhpc31yZW1vdmUobil7Y29uc3Qgcj10aGlzLl9tYXAuZ2V0KG4pO3JldHVybiByJiZ0eXBlb2Ygcj09Im9iamVjdCImJiJpZCJpbiByJiZ0aGlzLl9pZG1hcC5kZWxldGUoci5pZCksdGhpcy5fbWFwLmRlbGV0ZShuKSx0aGlzfWdldChuKXtjb25zdCByPW4uX3pvZC5wYXJlbnQ7aWYocil7Y29uc3Qgbz17Li4udGhpcy5nZXQocik/P3t9fTtkZWxldGUgby5pZDtjb25zdCBlPXsuLi5vLC4uLnRoaXMuX21hcC5nZXQobil9O3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg/ZTp2b2lkIDB9cmV0dXJuIHRoaXMuX21hcC5nZXQobil9aGFzKG4pe3JldHVybiB0aGlzLl9tYXAuaGFzKG4pfX1mdW5jdGlvbiB0cigpe3JldHVybiBuZXcgamx9KEVzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbFJlZ2lzdHJ5Pz8oRXMuX196b2RfZ2xvYmFsUmVnaXN0cnk9dHIoKSk7Y29uc3QgY2U9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxSZWdpc3RyeTtmdW5jdGlvbiBPbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIiwuLi5oKG4pfSl9ZnVuY3Rpb24gVWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsY29lcmNlOiEwLC4uLmgobil9KX1mdW5jdGlvbiBCaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImVtYWlsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIExuKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZ3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBWaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gS2kodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1dWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsdmVyc2lvbjoidjQiLC4uLmgobil9KX1mdW5jdGlvbiBHaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSx2ZXJzaW9uOiJ2NiIsLi4uaChuKX0pfWZ1bmN0aW9uIFhpKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXVpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLHZlcnNpb246InY3IiwuLi5oKG4pfSl9ZnVuY3Rpb24gbnIodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmwiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gWWkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJlbW9qaSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBRaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Im5hbm9pZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBlbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImN1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gdG8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJjdWlkMiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBubyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InVsaWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gcm8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ4aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gaW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJrc3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBvbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImlwdjQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gYW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJpcHY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIFBsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoibWFjIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHVvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGxvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0dXJsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIG1vKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZTE2NCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBwbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Imp3dCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1jb25zdCBmbz17QW55Om51bGwsTWludXRlOi0xLFNlY29uZDowLE1pbGxpc2Vjb25kOjMsTWljcm9zZWNvbmQ6Nn07ZnVuY3Rpb24gTmwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRldGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLG9mZnNldDohMSxsb2NhbDohMSxwcmVjaXNpb246bnVsbCwuLi5oKG4pfSl9ZnVuY3Rpb24gRGwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRlIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIEVsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLHByZWNpc2lvbjpudWxsLC4uLmgobil9KX1mdW5jdGlvbiBabCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImR1cmF0aW9uIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIFJsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQ2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY29lcmNlOiEwLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoic2FmZWludCIsLi4uaChuKX0pfWZ1bmN0aW9uIExsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrOiJudW1iZXJfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImZsb2F0MzIiLC4uLmgobil9KX1mdW5jdGlvbiBNbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJmbG9hdDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gcWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoiaW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJ1aW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBKbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYm9vbGVhbiIsLi4uaChuKX0pfWZ1bmN0aW9uIEhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJib29sZWFuIixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFdsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLC4uLmgobil9KX1mdW5jdGlvbiBCbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYmlnaW50Iixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFZsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLGNoZWNrOiJiaWdpbnRfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gS2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImJpZ2ludCIsY2hlY2s6ImJpZ2ludF9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoidWludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gR2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN5bWJvbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmRlZmluZWQiLC4uLmgobil9KX1mdW5jdGlvbiBZbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFFsKHQpe3JldHVybiBuZXcgdCh7dHlwZToiYW55In0pfWZ1bmN0aW9uIGVkKHQpe3JldHVybiBuZXcgdCh7dHlwZToidW5rbm93biJ9KX1mdW5jdGlvbiB0ZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibmV2ZXIiLC4uLmgobil9KX1mdW5jdGlvbiBuZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidm9pZCIsLi4uaChuKX0pfWZ1bmN0aW9uIHJkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJkYXRlIiwuLi5oKG4pfSl9ZnVuY3Rpb24gaWQodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImRhdGUiLGNvZXJjZTohMCwuLi5oKG4pfSl9ZnVuY3Rpb24gb2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im5hbiIsLi4uaChuKX0pfWZ1bmN0aW9uIHllKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIHVlKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIGtlKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIGllKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIHJyKHQpe3JldHVybiBrZSgwLHQpfWZ1bmN0aW9uIGlyKHQpe3JldHVybiB5ZSgwLHQpfWZ1bmN0aW9uIG9yKHQpe3JldHVybiB1ZSgwLHQpfWZ1bmN0aW9uIGFyKHQpe3JldHVybiBpZSgwLHQpfWZ1bmN0aW9uIEVlKHQsbil7cmV0dXJuIG5ldyBCYyh7Y2hlY2s6Im11bHRpcGxlX29mIiwuLi5oKG4pLHZhbHVlOnR9KX1mdW5jdGlvbiBMZSh0LG4pe3JldHVybiBuZXcgR2Moe2NoZWNrOiJtYXhfc2l6ZSIsLi4uaChuKSxtYXhpbXVtOnR9KX1mdW5jdGlvbiBTZSh0LG4pe3JldHVybiBuZXcgWGMoe2NoZWNrOiJtaW5fc2l6ZSIsLi4uaChuKSxtaW5pbXVtOnR9KX1mdW5jdGlvbiBudCh0LG4pe3JldHVybiBuZXcgWWMoe2NoZWNrOiJzaXplX2VxdWFscyIsLi4uaChuKSxzaXplOnR9KX1mdW5jdGlvbiBydCh0LG4pe3JldHVybiBuZXcgUWMoe2NoZWNrOiJtYXhfbGVuZ3RoIiwuLi5oKG4pLG1heGltdW06dH0pfWZ1bmN0aW9uIHplKHQsbil7cmV0dXJuIG5ldyBldSh7Y2hlY2s6Im1pbl9sZW5ndGgiLC4uLmgobiksbWluaW11bTp0fSl9ZnVuY3Rpb24gaXQodCxuKXtyZXR1cm4gbmV3IHR1KHtjaGVjazoibGVuZ3RoX2VxdWFscyIsLi4uaChuKSxsZW5ndGg6dH0pfWZ1bmN0aW9uIFJ0KHQsbil7cmV0dXJuIG5ldyBudSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoicmVnZXgiLC4uLmgobikscGF0dGVybjp0fSl9ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIG5ldyBydSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoibG93ZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gQXQodCl7cmV0dXJuIG5ldyBpdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoidXBwZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gTHQodCxuKXtyZXR1cm4gbmV3IG91KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsLi4uaChuKSxpbmNsdWRlczp0fSl9ZnVuY3Rpb24gTXQodCxuKXtyZXR1cm4gbmV3IGF1KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJzdGFydHNfd2l0aCIsLi4uaChuKSxwcmVmaXg6dH0pfWZ1bmN0aW9uIHF0KHQsbil7cmV0dXJuIG5ldyBzdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoiZW5kc193aXRoIiwuLi5oKG4pLHN1ZmZpeDp0fSl9ZnVuY3Rpb24gc3IodCxuLHIpe3JldHVybiBuZXcgY3Uoe2NoZWNrOiJwcm9wZXJ0eSIscHJvcGVydHk6dCxzY2hlbWE6biwuLi5oKHIpfSl9ZnVuY3Rpb24gRnQodCxuKXtyZXR1cm4gbmV3IHV1KHtjaGVjazoibWltZV90eXBlIixtaW1lOnQsLi4uaChuKX0pfWZ1bmN0aW9uIF9lKHQpe3JldHVybiBuZXcgbHUoe2NoZWNrOiJvdmVyd3JpdGUiLHR4OnR9KX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gX2Uobj0+bi5ub3JtYWxpemUodCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIF9lKHQ9PnQudHJpbSgpKX1mdW5jdGlvbiBXdCgpe3JldHVybiBfZSh0PT50LnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIEJ0KCl7cmV0dXJuIF9lKHQ9PnQudG9VcHBlckNhc2UoKSl9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gX2UodD0+QnModCkpfWZ1bmN0aW9uIGFkKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImFycmF5IixlbGVtZW50Om4sLi4uaChyKX0pfWZ1bmN0aW9uIGpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4sLi4uaChyKX0pfWZ1bmN0aW9uIE9nKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4saW5jbHVzaXZlOiExLC4uLmgocil9KX1mdW5jdGlvbiBVZyh0LG4scixvKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnIsZGlzY3JpbWluYXRvcjpuLC4uLmgobyl9KX1mdW5jdGlvbiBQZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6bixyaWdodDpyfSl9ZnVuY3Rpb24gTmcodCxuLHIsbyl7Y29uc3QgZT1yIGluc3RhbmNlb2YgeCxpPWU/bzpyLGE9ZT9yOm51bGw7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0dXBsZSIsaXRlbXM6bixyZXN0OmEsLi4uaChpKX0pfWZ1bmN0aW9uIERnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToicmVjb3JkIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIEVnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToibWFwIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIFpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InNldCIsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIFJnKHQsbixyKXtjb25zdCBvPUFycmF5LmlzQXJyYXkobik/T2JqZWN0LmZyb21FbnRyaWVzKG4ubWFwKGU9PltlLGVdKSk6bjtyZXR1cm4gbmV3IHQoe3R5cGU6ImVudW0iLGVudHJpZXM6bywuLi5oKHIpfSl9ZnVuY3Rpb24gQ2codCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZW51bSIsZW50cmllczpuLC4uLmgocil9KX1mdW5jdGlvbiBBZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJsaXRlcmFsIix2YWx1ZXM6QXJyYXkuaXNBcnJheShuKT9uOltuXSwuLi5oKHIpfSl9ZnVuY3Rpb24gc2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImZpbGUiLC4uLmgobil9KX1mdW5jdGlvbiBMZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06bn0pfWZ1bmN0aW9uIE1nKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBxZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbGFibGUiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gRmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZGVmYXVsdCIsaW5uZXJUeXBlOm4sZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yKCk6Vm4ocil9fSl9ZnVuY3Rpb24gSmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiBIZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3VjY2VzcyIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBXZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJjYXRjaCIsaW5uZXJUeXBlOm4sY2F0Y2hWYWx1ZTp0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yOigpPT5yfSl9ZnVuY3Rpb24gQmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToicGlwZSIsaW46bixvdXQ6cn0pfWZ1bmN0aW9uIFZnKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBLZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0ZW1wbGF0ZV9saXRlcmFsIixwYXJ0czpuLC4uLmgocil9KX1mdW5jdGlvbiBHZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibGF6eSIsZ2V0dGVyOm59KX1mdW5jdGlvbiBYZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToicHJvbWlzZSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBjZCh0LG4scil7Y29uc3Qgbz1oKHIpO3JldHVybiBvLmFib3J0Pz8oby5hYm9ydD0hMCksbmV3IHQoe3R5cGU6ImN1c3RvbSIsY2hlY2s6ImN1c3RvbSIsZm46biwuLi5vfSl9ZnVuY3Rpb24gdWQodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiY3VzdG9tIixjaGVjazoiY3VzdG9tIixmbjpuLC4uLmgocil9KX1mdW5jdGlvbiBsZCh0LG4pe2NvbnN0IHI9ZGQobz0+KG8uYWRkSXNzdWU9ZT0+e2lmKHR5cGVvZiBlPT0ic3RyaW5nIilvLmlzc3Vlcy5wdXNoKFdlKGUsby52YWx1ZSxyLl96b2QuZGVmKSk7ZWxzZXtjb25zdCBpPWU7aS5mYXRhbCYmKGkuY29udGludWU9ITEpLGkuY29kZT8/KGkuY29kZT0iY3VzdG9tIiksaS5pbnB1dD8/KGkuaW5wdXQ9by52YWx1ZSksaS5pbnN0Pz8oaS5pbnN0PXIpLGkuY29udGludWU/PyhpLmNvbnRpbnVlPSFyLl96b2QuZGVmLmFib3J0KSxvLmlzc3Vlcy5wdXNoKFdlKGkpKX19LHQoby52YWx1ZSxvKSksbik7cmV0dXJuIHJ9ZnVuY3Rpb24gZGQodCxuKXtjb25zdCByPW5ldyBKKHtjaGVjazoiY3VzdG9tIiwuLi5oKG4pfSk7cmV0dXJuIHIuX3pvZC5jaGVjaz10LHJ9ZnVuY3Rpb24gbWQodCl7Y29uc3Qgbj1uZXcgSih7Y2hlY2s6ImRlc2NyaWJlIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sZGVzY3JpcHRpb246dH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIHBkKHQpe2NvbnN0IG49bmV3IEooe2NoZWNrOiJtZXRhIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sLi4udH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIGZkKHQsbil7Y29uc3Qgcj1oKG4pO2xldCBvPXIudHJ1dGh5Pz9bInRydWUiLCIxIiwieWVzIiwib24iLCJ5IiwiZW5hYmxlZCJdLGU9ci5mYWxzeT8/WyJmYWxzZSIsIjAiLCJubyIsIm9mZiIsIm4iLCJkaXNhYmxlZCJdO3IuY2FzZSE9PSJzZW5zaXRpdmUiJiYobz1vLm1hcCgkPT50eXBlb2YgJD09InN0cmluZyI/JC50b0xvd2VyQ2FzZSgpOiQpLGU9ZS5tYXAoJD0+dHlwZW9mICQ9PSJzdHJpbmciPyQudG9Mb3dlckNhc2UoKTokKSk7Y29uc3QgaT1uZXcgU2V0KG8pLGE9bmV3IFNldChlKSxzPXQuQ29kZWM/P0ZpLGM9dC5Cb29sZWFuPz9DaSx1PXQuU3RyaW5nPz9adCxsPW5ldyB1KHt0eXBlOiJzdHJpbmciLGVycm9yOnIuZXJyb3J9KSxnPW5ldyBjKHt0eXBlOiJib29sZWFuIixlcnJvcjpyLmVycm9yfSksdj1uZXcgcyh7dHlwZToicGlwZSIsaW46bCxvdXQ6Zyx0cmFuc2Zvcm06KCgkLHkpPT57bGV0IEg9JDtyZXR1cm4gci5jYXNlIT09InNlbnNpdGl2ZSImJihIPUgudG9Mb3dlckNhc2UoKSksaS5oYXMoSCk/ITA6YS5oYXMoSCk/ITE6KHkuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLGV4cGVjdGVkOiJzdHJpbmdib29sIix2YWx1ZXM6Wy4uLmksLi4uYV0saW5wdXQ6eS52YWx1ZSxpbnN0OnYsY29udGludWU6ITF9KSx7fSl9KSxyZXZlcnNlVHJhbnNmb3JtOigoJCx5KT0+JD09PSEwP29bMF18fCJ0cnVlIjplWzBdfHwiZmFsc2UiKSxlcnJvcjpyLmVycm9yfSk7cmV0dXJuIHZ9ZnVuY3Rpb24gS3QodCxuLHIsbz17fSl7Y29uc3QgZT1oKG8pLGk9ey4uLmgobyksY2hlY2s6InN0cmluZ19mb3JtYXQiLHR5cGU6InN0cmluZyIsZm9ybWF0Om4sZm46dHlwZW9mIHI9PSJmdW5jdGlvbiI/cjpzPT5yLnRlc3QocyksLi4uZX07cmV0dXJuIHIgaW5zdGFuY2VvZiBSZWdFeHAmJihpLnBhdHRlcm49ciksbmV3IHQoaSl9ZnVuY3Rpb24gVmUodCl7bGV0IG49dD8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cmV0dXJuIG49PT0iZHJhZnQtNCImJihuPSJkcmFmdC0wNCIpLG49PT0iZHJhZnQtNyImJihuPSJkcmFmdC0wNyIpLHtwcm9jZXNzb3JzOnQucHJvY2Vzc29ycz8/e30sbWV0YWRhdGFSZWdpc3RyeTp0Py5tZXRhZGF0YT8/Y2UsdGFyZ2V0Om4sdW5yZXByZXNlbnRhYmxlOnQ/LnVucmVwcmVzZW50YWJsZT8/InRocm93IixvdmVycmlkZTp0Py5vdmVycmlkZT8/KCgpPT57fSksaW86dD8uaW8/PyJvdXRwdXQiLGNvdW50ZXI6MCxzZWVuOm5ldyBNYXAsY3ljbGVzOnQ/LmN5Y2xlcz8/InJlZiIscmV1c2VkOnQ/LnJldXNlZD8/ImlubGluZSIsZXh0ZXJuYWw6dD8uZXh0ZXJuYWw/P3ZvaWQgMH19ZnVuY3Rpb24gQyh0LG4scj17cGF0aDpbXSxzY2hlbWFQYXRoOltdfSl7dmFyIG87Y29uc3QgZT10Ll96b2QuZGVmLGk9bi5zZWVuLmdldCh0KTtpZihpKXJldHVybiBpLmNvdW50Kyssci5zY2hlbWFQYXRoLmluY2x1ZGVzKHQpJiYoaS5jeWNsZT1yLnBhdGgpLGkuc2NoZW1hO2NvbnN0IGE9e3NjaGVtYTp7fSxjb3VudDoxLGN5Y2xlOnZvaWQgMCxwYXRoOnIucGF0aH07bi5zZWVuLnNldCh0LGEpO2NvbnN0IHM9dC5fem9kLnRvSlNPTlNjaGVtYT8uKCk7aWYocylhLnNjaGVtYT1zO2Vsc2V7Y29uc3QgbD17Li4ucixzY2hlbWFQYXRoOlsuLi5yLnNjaGVtYVBhdGgsdF0scGF0aDpyLnBhdGh9O2lmKHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSl0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEobixhLnNjaGVtYSxsKTtlbHNle2NvbnN0IHY9YS5zY2hlbWEsJD1uLnByb2Nlc3NvcnNbZS50eXBlXTtpZighJCl0aHJvdyBuZXcgRXJyb3IoYFt0b0pTT05TY2hlbWFdOiBOb24tcmVwcmVzZW50YWJsZSB0eXBlIGVuY291bnRlcmVkOiAke2UudHlwZX1gKTskKHQsbix2LGwpfWNvbnN0IGc9dC5fem9kLnBhcmVudDtnJiYoYS5yZWZ8fChhLnJlZj1nKSxDKGcsbixsKSxuLnNlZW4uZ2V0KGcpLmlzUGFyZW50PSEwKX1jb25zdCBjPW4ubWV0YWRhdGFSZWdpc3RyeS5nZXQodCk7cmV0dXJuIGMmJk9iamVjdC5hc3NpZ24oYS5zY2hlbWEsYyksbi5pbz09PSJpbnB1dCImJnJlKHQpJiYoZGVsZXRlIGEuc2NoZW1hLmV4YW1wbGVzLGRlbGV0ZSBhLnNjaGVtYS5kZWZhdWx0KSxuLmlvPT09ImlucHV0IiYmIl9wcmVmYXVsdCJpbiBhLnNjaGVtYSYmKChvPWEuc2NoZW1hKS5kZWZhdWx0Pz8oby5kZWZhdWx0PWEuc2NoZW1hLl9wcmVmYXVsdCkpLGRlbGV0ZSBhLnNjaGVtYS5fcHJlZmF1bHQsbi5zZWVuLmdldCh0KS5zY2hlbWF9ZnVuY3Rpb24gS2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkO2lmKHMpe2NvbnN0IGM9by5nZXQocyk7aWYoYyYmYyE9PWFbMF0pdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2NoZW1hIGlkICIke3N9IiBkZXRlY3RlZCBkdXJpbmcgSlNPTiBTY2hlbWEgY29udmVyc2lvbi4gVHdvIGRpZmZlcmVudCBzY2hlbWFzIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBpZCB3aGVuIGNvbnZlcnRlZCB0b2dldGhlci5gKTtvLnNldChzLGFbMF0pfX1jb25zdCBlPWE9Pntjb25zdCBzPXQudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjtpZih0LmV4dGVybmFsKXtjb25zdCBnPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KGFbMF0pPy5pZCx2PXQuZXh0ZXJuYWwudXJpPz8oeT0+eSk7aWYoZylyZXR1cm57cmVmOnYoZyl9O2NvbnN0ICQ9YVsxXS5kZWZJZD8/YVsxXS5zY2hlbWEuaWQ/P2BzY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJuIGFbMV0uZGVmSWQ9JCx7ZGVmSWQ6JCxyZWY6YCR7digiX19zaGFyZWQiKX0jLyR7c30vJHskfWB9fWlmKGFbMV09PT1yKXJldHVybntyZWY6IiMifTtjb25zdCB1PWAjLyR7c30vYCxsPWFbMV0uc2NoZW1hLmlkPz9gX19zY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJue2RlZklkOmwscmVmOnUrbH19LGk9YT0+e2lmKGFbMV0uc2NoZW1hLiRyZWYpcmV0dXJuO2NvbnN0IHM9YVsxXSx7cmVmOmMsZGVmSWQ6dX09ZShhKTtzLmRlZj17Li4ucy5zY2hlbWF9LHUmJihzLmRlZklkPXUpO2NvbnN0IGw9cy5zY2hlbWE7Zm9yKGNvbnN0IGcgaW4gbClkZWxldGUgbFtnXTtsLiRyZWY9Y307aWYodC5jeWNsZXM9PT0idGhyb3ciKWZvcihjb25zdCBhIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IHM9YVsxXTtpZihzLmN5Y2xlKXRocm93IG5ldyBFcnJvcihgQ3ljbGUgZGV0ZWN0ZWQ6ICMvJHtzLmN5Y2xlPy5qb2luKCIvIil9Lzxyb290PgoKU2V0IHRoZSBcYGN5Y2xlc1xgIHBhcmFtZXRlciB0byBcYCJyZWYiXGAgdG8gcmVzb2x2ZSBjeWNsaWNhbCBzY2hlbWFzIHdpdGggZGVmcy5gKX1mb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPWFbMV07aWYobj09PWFbMF0pe2koYSk7Y29udGludWV9aWYodC5leHRlcm5hbCl7Y29uc3QgdT10LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChhWzBdKT8uaWQ7aWYobiE9PWFbMF0mJnUpe2koYSk7Y29udGludWV9fWlmKHQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkKXtpKGEpO2NvbnRpbnVlfWlmKHMuY3ljbGUpe2koYSk7Y29udGludWV9aWYocy5jb3VudD4xJiZ0LnJldXNlZD09PSJyZWYiKXtpKGEpO2NvbnRpbnVlfX19ZnVuY3Rpb24gR2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89cz0+e2NvbnN0IGM9dC5zZWVuLmdldChzKTtpZihjLnJlZj09PW51bGwpcmV0dXJuO2NvbnN0IHU9Yy5kZWY/P2Muc2NoZW1hLGw9ey4uLnV9LGc9Yy5yZWY7aWYoYy5yZWY9bnVsbCxnKXtvKGcpO2NvbnN0ICQ9dC5zZWVuLmdldChnKSx5PSQuc2NoZW1hO2lmKHkuJHJlZiYmKHQudGFyZ2V0PT09ImRyYWZ0LTA3Inx8dC50YXJnZXQ9PT0iZHJhZnQtMDQifHx0LnRhcmdldD09PSJvcGVuYXBpLTMuMCIpPyh1LmFsbE9mPXUuYWxsT2Y/P1tdLHUuYWxsT2YucHVzaCh5KSk6T2JqZWN0LmFzc2lnbih1LHkpLE9iamVjdC5hc3NpZ24odSxsKSxzLl96b2QucGFyZW50PT09Zylmb3IoY29uc3QgTCBpbiB1KUw9PT0iJHJlZiJ8fEw9PT0iYWxsT2YifHxMIGluIGx8fGRlbGV0ZSB1W0xdO2lmKHkuJHJlZiYmJC5kZWYpZm9yKGNvbnN0IEwgaW4gdSlMPT09IiRyZWYifHxMPT09ImFsbE9mInx8TCBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVtMXSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZltMXSkmJmRlbGV0ZSB1W0xdfWNvbnN0IHY9cy5fem9kLnBhcmVudDtpZih2JiZ2IT09Zyl7byh2KTtjb25zdCAkPXQuc2Vlbi5nZXQodik7aWYoJD8uc2NoZW1hLiRyZWYmJih1LiRyZWY9JC5zY2hlbWEuJHJlZiwkLmRlZikpZm9yKGNvbnN0IHkgaW4gdSl5PT09IiRyZWYifHx5PT09ImFsbE9mInx8eSBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVt5XSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZlt5XSkmJmRlbGV0ZSB1W3ldfXQub3ZlcnJpZGUoe3pvZFNjaGVtYTpzLGpzb25TY2hlbWE6dSxwYXRoOmMucGF0aD8/W119KX07Zm9yKGNvbnN0IHMgb2ZbLi4udC5zZWVuLmVudHJpZXMoKV0ucmV2ZXJzZSgpKW8oc1swXSk7Y29uc3QgZT17fTtpZih0LnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj9lLiRzY2hlbWE9Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIjp0LnRhcmdldD09PSJkcmFmdC0wNyI/ZS4kc2NoZW1hPSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiOnQudGFyZ2V0PT09ImRyYWZ0LTA0Ij9lLiRzY2hlbWE9Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6dC50YXJnZXQsdC5leHRlcm5hbD8udXJpKXtjb25zdCBzPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KG4pPy5pZDtpZighcyl0aHJvdyBuZXcgRXJyb3IoIlNjaGVtYSBpcyBtaXNzaW5nIGFuIGBpZGAgcHJvcGVydHkiKTtlLiRpZD10LmV4dGVybmFsLnVyaShzKX1PYmplY3QuYXNzaWduKGUsci5kZWY/P3Iuc2NoZW1hKTtjb25zdCBpPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQobik/LmlkO2khPT12b2lkIDAmJmUuaWQ9PT1pJiZkZWxldGUgZS5pZDtjb25zdCBhPXQuZXh0ZXJuYWw/LmRlZnM/P3t9O2Zvcihjb25zdCBzIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IGM9c1sxXTtjLmRlZiYmYy5kZWZJZCYmKGMuZGVmLmlkPT09Yy5kZWZJZCYmZGVsZXRlIGMuZGVmLmlkLGFbYy5kZWZJZF09Yy5kZWYpfXQuZXh0ZXJuYWx8fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wJiYodC50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiI/ZS4kZGVmcz1hOmUuZGVmaW5pdGlvbnM9YSk7dHJ5e2NvbnN0IHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJ+c3RhbmRhcmQiLHt2YWx1ZTp7Li4ublsifnN0YW5kYXJkIl0sanNvblNjaGVtYTp7aW5wdXQ6U3QobiwiaW5wdXQiLHQucHJvY2Vzc29ycyksb3V0cHV0OlN0KG4sIm91dHB1dCIsdC5wcm9jZXNzb3JzKX19LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITF9KSxzfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiRXJyb3IgY29udmVydGluZyBzY2hlbWEgdG8gSlNPTi4iKX19ZnVuY3Rpb24gcmUodCxuKXtjb25zdCByPW4/P3tzZWVuOm5ldyBTZXR9O2lmKHIuc2Vlbi5oYXModCkpcmV0dXJuITE7ci5zZWVuLmFkZCh0KTtjb25zdCBvPXQuX3pvZC5kZWY7aWYoby50eXBlPT09InRyYW5zZm9ybSIpcmV0dXJuITA7aWYoby50eXBlPT09ImFycmF5IilyZXR1cm4gcmUoby5lbGVtZW50LHIpO2lmKG8udHlwZT09PSJzZXQiKXJldHVybiByZShvLnZhbHVlVHlwZSxyKTtpZihvLnR5cGU9PT0ibGF6eSIpcmV0dXJuIHJlKG8uZ2V0dGVyKCkscik7aWYoby50eXBlPT09InByb21pc2UifHxvLnR5cGU9PT0ib3B0aW9uYWwifHxvLnR5cGU9PT0ibm9ub3B0aW9uYWwifHxvLnR5cGU9PT0ibnVsbGFibGUifHxvLnR5cGU9PT0icmVhZG9ubHkifHxvLnR5cGU9PT0iZGVmYXVsdCJ8fG8udHlwZT09PSJwcmVmYXVsdCIpcmV0dXJuIHJlKG8uaW5uZXJUeXBlLHIpO2lmKG8udHlwZT09PSJpbnRlcnNlY3Rpb24iKXJldHVybiByZShvLmxlZnQscil8fHJlKG8ucmlnaHQscik7aWYoby50eXBlPT09InJlY29yZCJ8fG8udHlwZT09PSJtYXAiKXJldHVybiByZShvLmtleVR5cGUscil8fHJlKG8udmFsdWVUeXBlLHIpO2lmKG8udHlwZT09PSJwaXBlIilyZXR1cm4gdC5fem9kLnRyYWl0cy5oYXMoIiRab2RDb2RlYyIpPyEwOnJlKG8uaW4scil8fHJlKG8ub3V0LHIpO2lmKG8udHlwZT09PSJvYmplY3QiKXtmb3IoY29uc3QgZSBpbiBvLnNoYXBlKWlmKHJlKG8uc2hhcGVbZV0scikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InVuaW9uIil7Zm9yKGNvbnN0IGUgb2Ygby5vcHRpb25zKWlmKHJlKGUscikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InR1cGxlIil7Zm9yKGNvbnN0IGUgb2Ygby5pdGVtcylpZihyZShlLHIpKXJldHVybiEwO3JldHVybiEhKG8ucmVzdCYmcmUoby5yZXN0LHIpKX1yZXR1cm4hMX1jb25zdCBnZD0odCxuPXt9KT0+cj0+e2NvbnN0IG89VmUoey4uLnIscHJvY2Vzc29yczpufSk7cmV0dXJuIEModCxvKSxLZShvLHQpLEdlKG8sdCl9LFN0PSh0LG4scj17fSk9Pm89Pntjb25zdHtsaWJyYXJ5T3B0aW9uczplLHRhcmdldDppfT1vPz97fSxhPVZlKHsuLi5lPz97fSx0YXJnZXQ6aSxpbzpuLHByb2Nlc3NvcnM6cn0pO3JldHVybiBDKHQsYSksS2UoYSx0KSxHZShhLHQpfSxZZz17Z3VpZDoidXVpZCIsdXJsOiJ1cmkiLGRhdGV0aW1lOiJkYXRlLXRpbWUiLGpzb25fc3RyaW5nOiJqc29uLXN0cmluZyIscmVnZXg6IiJ9LHZkPSh0LG4scixvKT0+e2NvbnN0IGU9cjtlLnR5cGU9InN0cmluZyI7Y29uc3R7bWluaW11bTppLG1heGltdW06YSxmb3JtYXQ6cyxwYXR0ZXJuczpjLGNvbnRlbnRFbmNvZGluZzp1fT10Ll96b2QuYmFnO2lmKHR5cGVvZiBpPT0ibnVtYmVyIiYmKGUubWluTGVuZ3RoPWkpLHR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4TGVuZ3RoPWEpLHMmJihlLmZvcm1hdD1ZZ1tzXT8/cyxlLmZvcm1hdD09PSIiJiZkZWxldGUgZS5mb3JtYXQscz09PSJ0aW1lIiYmZGVsZXRlIGUuZm9ybWF0KSx1JiYoZS5jb250ZW50RW5jb2Rpbmc9dSksYyYmYy5zaXplPjApe2NvbnN0IGw9Wy4uLmNdO2wubGVuZ3RoPT09MT9lLnBhdHRlcm49bFswXS5zb3VyY2U6bC5sZW5ndGg+MSYmKGUuYWxsT2Y9Wy4uLmwubWFwKGc9Pih7Li4ubi50YXJnZXQ9PT0iZHJhZnQtMDcifHxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj97dHlwZToic3RyaW5nIn06e30scGF0dGVybjpnLnNvdXJjZX0pKV0pfX0saGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLHttaW5pbXVtOmksbWF4aW11bTphLGZvcm1hdDpzLG11bHRpcGxlT2Y6YyxleGNsdXNpdmVNYXhpbXVtOnUsZXhjbHVzaXZlTWluaW11bTpsfT10Ll96b2QuYmFnO3R5cGVvZiBzPT0ic3RyaW5nIiYmcy5pbmNsdWRlcygiaW50Iik/ZS50eXBlPSJpbnRlZ2VyIjplLnR5cGU9Im51bWJlciI7Y29uc3QgZz10eXBlb2YgbD09Im51bWJlciImJmw+PShpPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpLHY9dHlwZW9mIHU9PSJudW1iZXIiJiZ1PD0oYT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSwkPW4udGFyZ2V0PT09ImRyYWZ0LTA0Inx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiO2c/JD8oZS5taW5pbXVtPWwsZS5leGNsdXNpdmVNaW5pbXVtPSEwKTplLmV4Y2x1c2l2ZU1pbmltdW09bDp0eXBlb2YgaT09Im51bWJlciImJihlLm1pbmltdW09aSksdj8kPyhlLm1heGltdW09dSxlLmV4Y2x1c2l2ZU1heGltdW09ITApOmUuZXhjbHVzaXZlTWF4aW11bT11OnR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4aW11bT1hKSx0eXBlb2YgYz09Im51bWJlciImJihlLm11bHRpcGxlT2Y9Yyl9LCRkPSh0LG4scixvKT0+e3IudHlwZT0iYm9vbGVhbiJ9LF9kPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sYmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiU3ltYm9scyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0seWQ9KHQsbixyLG8pPT57bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyhyLnR5cGU9InN0cmluZyIsci5udWxsYWJsZT0hMCxyLmVudW09W251bGxdKTpyLnR5cGU9Im51bGwifSxrZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJVbmRlZmluZWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LFNkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIlZvaWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LHdkPSh0LG4scixvKT0+e3Iubm90PXt9fSxJZD0odCxuLHIsbyk9Pnt9LHpkPSh0LG4scixvKT0+e30seGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiRGF0ZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sVGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9dmkoZS5lbnRyaWVzKTtpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0ibnVtYmVyIikmJihyLnR5cGU9Im51bWJlciIpLGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJzdHJpbmciKSYmKHIudHlwZT0ic3RyaW5nIiksci5lbnVtPWl9LGpkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPVtdO2Zvcihjb25zdCBhIG9mIGUudmFsdWVzKWlmKGE9PT12b2lkIDApe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkxpdGVyYWwgYHVuZGVmaW5lZGAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9ZWxzZSBpZih0eXBlb2YgYT09ImJpZ2ludCIpe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBsaXRlcmFscyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKTtpLnB1c2goTnVtYmVyKGEpKX1lbHNlIGkucHVzaChhKTtpZihpLmxlbmd0aCE9PTApaWYoaS5sZW5ndGg9PT0xKXtjb25zdCBhPWlbMF07ci50eXBlPWE9PT1udWxsPyJudWxsIjp0eXBlb2YgYSxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj9yLmVudW09W2FdOnIuY29uc3Q9YX1lbHNlIGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJudW1iZXIiKSYmKHIudHlwZT0ibnVtYmVyIiksaS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpJiYoci50eXBlPSJzdHJpbmciKSxpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0iYm9vbGVhbiIpJiYoci50eXBlPSJib29sZWFuIiksaS5ldmVyeShhPT5hPT09bnVsbCkmJihyLnR5cGU9Im51bGwiKSxyLmVudW09aX0sT2Q9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTmFOIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxVZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QucGF0dGVybjtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlBhdHRlcm4gbm90IGZvdW5kIGluIHRlbXBsYXRlIGxpdGVyYWwiKTtlLnR5cGU9InN0cmluZyIsZS5wYXR0ZXJuPWkuc291cmNlfSxQZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT17dHlwZToic3RyaW5nIixmb3JtYXQ6ImJpbmFyeSIsY29udGVudEVuY29kaW5nOiJiaW5hcnkifSx7bWluaW11bTphLG1heGltdW06cyxtaW1lOmN9PXQuX3pvZC5iYWc7YSE9PXZvaWQgMCYmKGkubWluTGVuZ3RoPWEpLHMhPT12b2lkIDAmJihpLm1heExlbmd0aD1zKSxjP2MubGVuZ3RoPT09MT8oaS5jb250ZW50TWVkaWFUeXBlPWNbMF0sT2JqZWN0LmFzc2lnbihlLGkpKTooT2JqZWN0LmFzc2lnbihlLGkpLGUuYW55T2Y9Yy5tYXAodT0+KHtjb250ZW50TWVkaWFUeXBlOnV9KSkpOk9iamVjdC5hc3NpZ24oZSxpKX0sTmQ9KHQsbixyLG8pPT57ci50eXBlPSJib29sZWFuIn0sRGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiQ3VzdG9tIHR5cGVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxFZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sWmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiVHJhbnNmb3JtcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sUmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTWFwIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxDZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJTZXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LEFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWYse21pbmltdW06YSxtYXhpbXVtOnN9PXQuX3pvZC5iYWc7dHlwZW9mIGE9PSJudW1iZXIiJiYoZS5taW5JdGVtcz1hKSx0eXBlb2Ygcz09Im51bWJlciImJihlLm1heEl0ZW1zPXMpLGUudHlwZT0iYXJyYXkiLGUuaXRlbXM9QyhpLmVsZW1lbnQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsIml0ZW1zIl19KX0sTGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLGk9dC5fem9kLmRlZjtlLnR5cGU9Im9iamVjdCIsZS5wcm9wZXJ0aWVzPXt9O2NvbnN0IGE9aS5zaGFwZTtmb3IoY29uc3QgdSBpbiBhKWUucHJvcGVydGllc1t1XT1DKGFbdV0sbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsInByb3BlcnRpZXMiLHVdfSk7Y29uc3Qgcz1uZXcgU2V0KE9iamVjdC5rZXlzKGEpKSxjPW5ldyBTZXQoWy4uLnNdLmZpbHRlcih1PT57Y29uc3QgbD1pLnNoYXBlW3VdLl96b2Q7cmV0dXJuIG4uaW89PT0iaW5wdXQiP2wub3B0aW49PT12b2lkIDA6bC5vcHRvdXQ9PT12b2lkIDB9KSk7Yy5zaXplPjAmJihlLnJlcXVpcmVkPUFycmF5LmZyb20oYykpLGkuY2F0Y2hhbGw/Ll96b2QuZGVmLnR5cGU9PT0ibmV2ZXIiP2UuYWRkaXRpb25hbFByb3BlcnRpZXM9ITE6aS5jYXRjaGFsbD9pLmNhdGNoYWxsJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkuY2F0Y2hhbGwsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIl19KSk6bi5pbz09PSJvdXRwdXQiJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz0hMSl9LGdvPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPWUuaW5jbHVzaXZlPT09ITEsYT1lLm9wdGlvbnMubWFwKChzLGMpPT5DKHMsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsaT8ib25lT2YiOiJhbnlPZiIsY119KSk7aT9yLm9uZU9mPWE6ci5hbnlPZj1hfSxNZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUubGVmdCxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwiYWxsT2YiLDBdfSksYT1DKGUucmlnaHQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFsbE9mIiwxXX0pLHM9dT0+ImFsbE9mImluIHUmJk9iamVjdC5rZXlzKHUpLmxlbmd0aD09PTEsYz1bLi4ucyhpKT9pLmFsbE9mOltpXSwuLi5zKGEpP2EuYWxsT2Y6W2FdXTtyLmFsbE9mPWN9LHFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJhcnJheSI7Y29uc3QgYT1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8icHJlZml4SXRlbXMiOiJpdGVtcyIscz1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyInx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyJpdGVtcyI6ImFkZGl0aW9uYWxJdGVtcyIsYz1pLml0ZW1zLm1hcCgodiwkKT0+Qyh2LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLGEsJF19KSksdT1pLnJlc3Q/QyhpLnJlc3Qsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgscywuLi5uLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/W2kuaXRlbXMubGVuZ3RoXTpbXV19KTpudWxsO24udGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyhlLnByZWZpeEl0ZW1zPWMsdSYmKGUuaXRlbXM9dSkpOm4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oZS5pdGVtcz17YW55T2Y6Y30sdSYmZS5pdGVtcy5hbnlPZi5wdXNoKHUpLGUubWluSXRlbXM9Yy5sZW5ndGgsdXx8KGUubWF4SXRlbXM9Yy5sZW5ndGgpKTooZS5pdGVtcz1jLHUmJihlLmFkZGl0aW9uYWxJdGVtcz11KSk7Y29uc3R7bWluaW11bTpsLG1heGltdW06Z309dC5fem9kLmJhZzt0eXBlb2YgbD09Im51bWJlciImJihlLm1pbkl0ZW1zPWwpLHR5cGVvZiBnPT0ibnVtYmVyIiYmKGUubWF4SXRlbXM9Zyl9LEZkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJvYmplY3QiO2NvbnN0IGE9aS5rZXlUeXBlLGM9YS5fem9kLmJhZz8ucGF0dGVybnM7aWYoaS5tb2RlPT09Imxvb3NlIiYmYyYmYy5zaXplPjApe2NvbnN0IGw9QyhpLnZhbHVlVHlwZSxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwicGF0dGVyblByb3BlcnRpZXMiLCIqIl19KTtlLnBhdHRlcm5Qcm9wZXJ0aWVzPXt9O2Zvcihjb25zdCBnIG9mIGMpZS5wYXR0ZXJuUHJvcGVydGllc1tnLnNvdXJjZV09bH1lbHNlKG4udGFyZ2V0PT09ImRyYWZ0LTA3Inx8bi50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiIpJiYoZS5wcm9wZXJ0eU5hbWVzPUMoaS5rZXlUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJwcm9wZXJ0eU5hbWVzIl19KSksZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkudmFsdWVUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJhZGRpdGlvbmFsUHJvcGVydGllcyJdfSk7Y29uc3QgdT1hLl96b2QudmFsdWVzO2lmKHUpe2NvbnN0IGw9Wy4uLnVdLmZpbHRlcihnPT50eXBlb2YgZz09InN0cmluZyJ8fHR5cGVvZiBnPT0ibnVtYmVyIik7bC5sZW5ndGg+MCYmKGUucmVxdWlyZWQ9bCl9fSxKZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUuaW5uZXJUeXBlLG4sbyksYT1uLnNlZW4uZ2V0KHQpO24udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oYS5yZWY9ZS5pbm5lclR5cGUsci5udWxsYWJsZT0hMCk6ci5hbnlPZj1baSx7dHlwZToibnVsbCJ9XX0sSGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFdkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLHIuZGVmYXVsdD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUuZGVmYXVsdFZhbHVlKSl9LEJkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLG4uaW89PT0iaW5wdXQiJiYoci5fcHJlZmF1bHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmRlZmF1bHRWYWx1ZSkpKX0sVmQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGU7bGV0IGE7dHJ5e2E9ZS5jYXRjaFZhbHVlKHZvaWQgMCl9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIGNhdGNoIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKU09OIFNjaGVtYSIpfXIuZGVmYXVsdD1hfSxLZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1lLmluLl96b2QudHJhaXRzLmhhcygiJFpvZFRyYW5zZm9ybSIpLGE9bi5pbz09PSJpbnB1dCI/aT9lLm91dDplLmluOmUub3V0O0MoYSxuLG8pO2NvbnN0IHM9bi5zZWVuLmdldCh0KTtzLnJlZj1hfSxHZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZSxyLnJlYWRPbmx5PSEwfSxYZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZX0sdm89KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFlkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmlubmVyVHlwZTtDKGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZX0sZGk9e3N0cmluZzp2ZCxudW1iZXI6aGQsYm9vbGVhbjokZCxiaWdpbnQ6X2Qsc3ltYm9sOmJkLG51bGw6eWQsdW5kZWZpbmVkOmtkLHZvaWQ6U2QsbmV2ZXI6d2QsYW55OklkLHVua25vd246emQsZGF0ZTp4ZCxlbnVtOlRkLGxpdGVyYWw6amQsbmFuOk9kLHRlbXBsYXRlX2xpdGVyYWw6VWQsZmlsZTpQZCxzdWNjZXNzOk5kLGN1c3RvbTpEZCxmdW5jdGlvbjpFZCx0cmFuc2Zvcm06WmQsbWFwOlJkLHNldDpDZCxhcnJheTpBZCxvYmplY3Q6TGQsdW5pb246Z28saW50ZXJzZWN0aW9uOk1kLHR1cGxlOnFkLHJlY29yZDpGZCxudWxsYWJsZTpKZCxub25vcHRpb25hbDpIZCxkZWZhdWx0OldkLHByZWZhdWx0OkJkLGNhdGNoOlZkLHBpcGU6S2QscmVhZG9ubHk6R2QscHJvbWlzZTpYZCxvcHRpb25hbDp2byxsYXp5OllkfTtmdW5jdGlvbiBobyh0LG4pe2lmKCJfaWRtYXAiaW4gdCl7Y29uc3Qgbz10LGU9VmUoey4uLm4scHJvY2Vzc29yczpkaX0pLGk9e307Zm9yKGNvbnN0IGMgb2Ygby5faWRtYXAuZW50cmllcygpKXtjb25zdFt1LGxdPWM7QyhsLGUpfWNvbnN0IGE9e30scz17cmVnaXN0cnk6byx1cmk6bj8udXJpLGRlZnM6aX07ZS5leHRlcm5hbD1zO2Zvcihjb25zdCBjIG9mIG8uX2lkbWFwLmVudHJpZXMoKSl7Y29uc3RbdSxsXT1jO0tlKGUsbCksYVt1XT1HZShlLGwpfWlmKE9iamVjdC5rZXlzKGkpLmxlbmd0aD4wKXtjb25zdCBjPWUudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjthLl9fc2hhcmVkPXtbY106aX19cmV0dXJue3NjaGVtYXM6YX19Y29uc3Qgcj1WZSh7Li4ubixwcm9jZXNzb3JzOmRpfSk7cmV0dXJuIEModCxyKSxLZShyLHQpLEdlKHIsdCl9Y2xhc3MgUWd7Z2V0IG1ldGFkYXRhUmVnaXN0cnkoKXtyZXR1cm4gdGhpcy5jdHgubWV0YWRhdGFSZWdpc3RyeX1nZXQgdGFyZ2V0KCl7cmV0dXJuIHRoaXMuY3R4LnRhcmdldH1nZXQgdW5yZXByZXNlbnRhYmxlKCl7cmV0dXJuIHRoaXMuY3R4LnVucmVwcmVzZW50YWJsZX1nZXQgb3ZlcnJpZGUoKXtyZXR1cm4gdGhpcy5jdHgub3ZlcnJpZGV9Z2V0IGlvKCl7cmV0dXJuIHRoaXMuY3R4LmlvfWdldCBjb3VudGVyKCl7cmV0dXJuIHRoaXMuY3R4LmNvdW50ZXJ9c2V0IGNvdW50ZXIobil7dGhpcy5jdHguY291bnRlcj1ufWdldCBzZWVuKCl7cmV0dXJuIHRoaXMuY3R4LnNlZW59Y29uc3RydWN0b3Iobil7bGV0IHI9bj8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cj09PSJkcmFmdC00IiYmKHI9ImRyYWZ0LTA0Iikscj09PSJkcmFmdC03IiYmKHI9ImRyYWZ0LTA3IiksdGhpcy5jdHg9VmUoe3Byb2Nlc3NvcnM6ZGksdGFyZ2V0OnIsLi4ubj8ubWV0YWRhdGEmJnttZXRhZGF0YTpuLm1ldGFkYXRhfSwuLi5uPy51bnJlcHJlc2VudGFibGUmJnt1bnJlcHJlc2VudGFibGU6bi51bnJlcHJlc2VudGFibGV9LC4uLm4/Lm92ZXJyaWRlJiZ7b3ZlcnJpZGU6bi5vdmVycmlkZX0sLi4ubj8uaW8mJntpbzpuLmlvfX0pfXByb2Nlc3MobixyPXtwYXRoOltdLHNjaGVtYVBhdGg6W119KXtyZXR1cm4gQyhuLHRoaXMuY3R4LHIpfWVtaXQobixyKXtyJiYoci5jeWNsZXMmJih0aGlzLmN0eC5jeWNsZXM9ci5jeWNsZXMpLHIucmV1c2VkJiYodGhpcy5jdHgucmV1c2VkPXIucmV1c2VkKSxyLmV4dGVybmFsJiYodGhpcy5jdHguZXh0ZXJuYWw9ci5leHRlcm5hbCkpLEtlKHRoaXMuY3R4LG4pO2NvbnN0IG89R2UodGhpcy5jdHgsbikseyJ+c3RhbmRhcmQiOmUsLi4uaX09bztyZXR1cm4gaX19Y29uc3QgZXY9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLFFkPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkWm9kQW55Okh1LCRab2RBcnJheTpHdSwkWm9kQXN5bmNFcnJvcjpOZSwkWm9kQmFzZTY0Ok51LCRab2RCYXNlNjRVUkw6RXUsJFpvZEJpZ0ludDpBaSwkWm9kQmlnSW50Rm9ybWF0Ok11LCRab2RCb29sZWFuOkNpLCRab2RDSURSdjQ6VXUsJFpvZENJRFJ2NjpQdSwkWm9kQ1VJRDpfdSwkWm9kQ1VJRDI6YnUsJFpvZENhdGNoOmhsLCRab2RDaGVjazpKLCRab2RDaGVja0JpZ0ludEZvcm1hdDpLYywkWm9kQ2hlY2tFbmRzV2l0aDpzdSwkWm9kQ2hlY2tHcmVhdGVyVGhhbjpFaSwkWm9kQ2hlY2tJbmNsdWRlczpvdSwkWm9kQ2hlY2tMZW5ndGhFcXVhbHM6dHUsJFpvZENoZWNrTGVzc1RoYW46RGksJFpvZENoZWNrTG93ZXJDYXNlOnJ1LCRab2RDaGVja01heExlbmd0aDpRYywkWm9kQ2hlY2tNYXhTaXplOkdjLCRab2RDaGVja01pbWVUeXBlOnV1LCRab2RDaGVja01pbkxlbmd0aDpldSwkWm9kQ2hlY2tNaW5TaXplOlhjLCRab2RDaGVja011bHRpcGxlT2Y6QmMsJFpvZENoZWNrTnVtYmVyRm9ybWF0OlZjLCRab2RDaGVja092ZXJ3cml0ZTpsdSwkWm9kQ2hlY2tQcm9wZXJ0eTpjdSwkWm9kQ2hlY2tSZWdleDpudSwkWm9kQ2hlY2tTaXplRXF1YWxzOlljLCRab2RDaGVja1N0YXJ0c1dpdGg6YXUsJFpvZENoZWNrU3RyaW5nRm9ybWF0OkV0LCRab2RDaGVja1VwcGVyQ2FzZTppdSwkWm9kQ29kZWM6RmksJFpvZEN1c3RvbTpJbCwkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0OkF1LCRab2REYXRlOkt1LCRab2REZWZhdWx0OnBsLCRab2REaXNjcmltaW5hdGVkVW5pb246bmwsJFpvZEUxNjQ6WnUsJFpvZEVtYWlsOmd1LCRab2RFbW9qaTpodSwkWm9kRW5jb2RlRXJyb3I6V24sJFpvZEVudW06c2wsJFpvZEVycm9yOl9pLCRab2RFeGFjdE9wdGlvbmFsOmRsLCRab2RGaWxlOnVsLCRab2RGdW5jdGlvbjprbCwkWm9kR1VJRDpwdSwkWm9kSVB2NDpUdSwkWm9kSVB2NjpqdSwkWm9kSVNPRGF0ZTpJdSwkWm9kSVNPRGF0ZVRpbWU6d3UsJFpvZElTT0R1cmF0aW9uOnh1LCRab2RJU09UaW1lOnp1LCRab2RJbnRlcnNlY3Rpb246cmwsJFpvZEpXVDpDdSwkWm9kS1NVSUQ6U3UsJFpvZExhenk6d2wsJFpvZExpdGVyYWw6Y2wsJFpvZE1BQzpPdSwkWm9kTWFwOm9sLCRab2ROYU46JGwsJFpvZE5hbm9JRDokdSwkWm9kTmV2ZXI6QnUsJFpvZE5vbk9wdGlvbmFsOmdsLCRab2ROdWxsOkp1LCRab2ROdWxsYWJsZTptbCwkWm9kTnVtYmVyOlJpLCRab2ROdW1iZXJGb3JtYXQ6THUsJFpvZE9iamVjdDpRdSwkWm9kT2JqZWN0SklUOmVsLCRab2RPcHRpb25hbDpNaSwkWm9kUGlwZTpxaSwkWm9kUHJlZmF1bHQ6ZmwsJFpvZFByZXByb2Nlc3M6X2wsJFpvZFByb21pc2U6U2wsJFpvZFJlYWRvbmx5OmJsLCRab2RSZWFsRXJyb3I6bWUsJFpvZFJlY29yZDppbCwkWm9kUmVnaXN0cnk6amwsJFpvZFNldDphbCwkWm9kU3RyaW5nOlp0LCRab2RTdHJpbmdGb3JtYXQ6RiwkWm9kU3VjY2Vzczp2bCwkWm9kU3ltYm9sOnF1LCRab2RUZW1wbGF0ZUxpdGVyYWw6eWwsJFpvZFRyYW5zZm9ybTpsbCwkWm9kVHVwbGU6TGksJFpvZFR5cGU6eCwkWm9kVUxJRDp5dSwkWm9kVVJMOnZ1LCRab2RVVUlEOmZ1LCRab2RVbmRlZmluZWQ6RnUsJFpvZFVuaW9uOmVyLCRab2RVbmtub3duOld1LCRab2RWb2lkOlZ1LCRab2RYSUQ6a3UsJFpvZFhvcjp0bCwkYnJhbmQ6Z2ksJGNvbnN0cnVjdG9yOmQsJGlucHV0OldpLCRvdXRwdXQ6SGksRG9jOmR1LEpTT05TY2hlbWE6ZXYsSlNPTlNjaGVtYUdlbmVyYXRvcjpRZyxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLF9hbnk6UWwsX2FycmF5OmFkLF9iYXNlNjQ6dW8sX2Jhc2U2NHVybDpsbyxfYmlnaW50OldsLF9ib29sZWFuOkpsLF9jYXRjaDpXZyxfY2hlY2s6ZGQsX2NpZHJ2NDpzbyxfY2lkcnY2OmNvLF9jb2VyY2VkQmlnaW50OkJsLF9jb2VyY2VkQm9vbGVhbjpIbCxfY29lcmNlZERhdGU6aWQsX2NvZXJjZWROdW1iZXI6Q2wsX2NvZXJjZWRTdHJpbmc6VWwsX2N1aWQ6ZW8sX2N1aWQyOnRvLF9jdXN0b206Y2QsX2RhdGU6cmQsX2RlY29kZTp3aSxfZGVjb2RlQXN5bmM6emksX2RlZmF1bHQ6RmcsX2Rpc2NyaW1pbmF0ZWRVbmlvbjpVZyxfZTE2NDptbyxfZW1haWw6QmksX2Vtb2ppOllpLF9lbmNvZGU6U2ksX2VuY29kZUFzeW5jOklpLF9lbmRzV2l0aDpxdCxfZW51bTpSZyxfZmlsZTpzZCxfZmxvYXQzMjpMbCxfZmxvYXQ2NDpNbCxfZ3Q6a2UsX2d0ZTppZSxfZ3VpZDpMbixfaW5jbHVkZXM6THQsX2ludDpBbCxfaW50MzI6cWwsX2ludDY0OlZsLF9pbnRlcnNlY3Rpb246UGcsX2lwdjQ6b28sX2lwdjY6YW8sX2lzb0RhdGU6RGwsX2lzb0RhdGVUaW1lOk5sLF9pc29EdXJhdGlvbjpabCxfaXNvVGltZTpFbCxfand0OnBvLF9rc3VpZDppbyxfbGF6eTpHZyxfbGVuZ3RoOml0LF9saXRlcmFsOkFnLF9sb3dlcmNhc2U6Q3QsX2x0OnllLF9sdGU6dWUsX21hYzpQbCxfbWFwOkVnLF9tYXg6dWUsX21heExlbmd0aDpydCxfbWF4U2l6ZTpMZSxfbWltZTpGdCxfbWluOmllLF9taW5MZW5ndGg6emUsX21pblNpemU6U2UsX211bHRpcGxlT2Y6RWUsX25hbjpvZCxfbmFub2lkOlFpLF9uYXRpdmVFbnVtOkNnLF9uZWdhdGl2ZTppcixfbmV2ZXI6dGQsX25vbm5lZ2F0aXZlOmFyLF9ub25vcHRpb25hbDpKZyxfbm9ucG9zaXRpdmU6b3IsX25vcm1hbGl6ZTpKdCxfbnVsbDpZbCxfbnVsbGFibGU6cWcsX251bWJlcjpSbCxfb3B0aW9uYWw6TWcsX292ZXJ3cml0ZTpfZSxfcGFyc2U6anQsX3BhcnNlQXN5bmM6T3QsX3BpcGU6QmcsX3Bvc2l0aXZlOnJyLF9wcm9taXNlOlhnLF9wcm9wZXJ0eTpzcixfcmVhZG9ubHk6VmcsX3JlY29yZDpEZyxfcmVmaW5lOnVkLF9yZWdleDpSdCxfc2FmZURlY29kZTpUaSxfc2FmZURlY29kZUFzeW5jOk9pLF9zYWZlRW5jb2RlOnhpLF9zYWZlRW5jb2RlQXN5bmM6amksX3NhZmVQYXJzZTpVdCxfc2FmZVBhcnNlQXN5bmM6UHQsX3NldDpaZyxfc2l6ZTpudCxfc2x1Z2lmeTpWdCxfc3RhcnRzV2l0aDpNdCxfc3RyaW5nOk9sLF9zdHJpbmdGb3JtYXQ6S3QsX3N0cmluZ2Jvb2w6ZmQsX3N1Y2Nlc3M6SGcsX3N1cGVyUmVmaW5lOmxkLF9zeW1ib2w6R2wsX3RlbXBsYXRlTGl0ZXJhbDpLZyxfdG9Mb3dlckNhc2U6V3QsX3RvVXBwZXJDYXNlOkJ0LF90cmFuc2Zvcm06TGcsX3RyaW06SHQsX3R1cGxlOk5nLF91aW50MzI6RmwsX3VpbnQ2NDpLbCxfdWxpZDpubyxfdW5kZWZpbmVkOlhsLF91bmlvbjpqZyxfdW5rbm93bjplZCxfdXBwZXJjYXNlOkF0LF91cmw6bnIsX3V1aWQ6VmksX3V1aWR2NDpLaSxfdXVpZHY2OkdpLF91dWlkdjc6WGksX3ZvaWQ6bmQsX3hpZDpybyxfeG9yOk9nLGNsb25lOmRlLGNvbmZpZzpLLGNyZWF0ZVN0YW5kYXJkSlNPTlNjaGVtYU1ldGhvZDpTdCxjcmVhdGVUb0pTT05TY2hlbWFNZXRob2Q6Z2QsZGVjb2RlOmFwLGRlY29kZUFzeW5jOmNwLGRlc2NyaWJlOm1kLGVuY29kZTpvcCxlbmNvZGVBc3luYzpzcCxleHRyYWN0RGVmczpLZSxmaW5hbGl6ZTpHZSxmbGF0dGVuRXJyb3I6WG4sZm9ybWF0RXJyb3I6WW4sZ2xvYmFsQ29uZmlnOmt0LGdsb2JhbFJlZ2lzdHJ5OmNlLGluaXRpYWxpemVDb250ZXh0OlZlLGlzVmFsaWRCYXNlNjQ6WmksaXNWYWxpZEJhc2U2NFVSTDpEdSxpc1ZhbGlkSldUOlJ1LGxvY2FsZXM6SmksbWV0YTpwZCxwYXJzZTpjaSxwYXJzZUFzeW5jOnVpLHByZXR0aWZ5RXJyb3I6eWkscHJvY2VzczpDLHJlZ2V4ZXM6UW4scmVnaXN0cnk6dHIsc2FmZURlY29kZTpscCxzYWZlRGVjb2RlQXN5bmM6bXAsc2FmZUVuY29kZTp1cCxzYWZlRW5jb2RlQXN5bmM6ZHAsc2FmZVBhcnNlOmtpLHNhZmVQYXJzZUFzeW5jOmRjLHRvRG90UGF0aDpsYyx0b0pTT05TY2hlbWE6aG8sdHJlZWlmeUVycm9yOmJpLHV0aWw6JGksdmVyc2lvbjptdX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTtmdW5jdGlvbiAkbyh0KXtyZXR1cm4hIXQuX3pvZH1mdW5jdGlvbiBlbSh0LG4pe3JldHVybiAkbyh0KT9raSh0LG4pOnQuc2FmZVBhcnNlKG4pfWZ1bmN0aW9uIHR2KHQpe2lmKCF0KXJldHVybjtsZXQgbjtpZigkbyh0KT9uPXQuX3pvZD8uZGVmPy5zaGFwZTpuPXQuc2hhcGUsISFuKXtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7cmV0dXJuIG4oKX1jYXRjaHtyZXR1cm59cmV0dXJuIG59fWZ1bmN0aW9uIG52KHQpe2lmKCRvKHQpKXtjb25zdCBpPXQuX3pvZD8uZGVmO2lmKGkpe2lmKGkudmFsdWUhPT12b2lkIDApcmV0dXJuIGkudmFsdWU7aWYoQXJyYXkuaXNBcnJheShpLnZhbHVlcykmJmkudmFsdWVzLmxlbmd0aD4wKXJldHVybiBpLnZhbHVlc1swXX19Y29uc3Qgcj10Ll9kZWY7aWYocil7aWYoci52YWx1ZSE9PXZvaWQgMClyZXR1cm4gci52YWx1ZTtpZihBcnJheS5pc0FycmF5KHIudmFsdWVzKSYmci52YWx1ZXMubGVuZ3RoPjApcmV0dXJuIHIudmFsdWVzWzBdfWNvbnN0IG89dC52YWx1ZTtpZihvIT09dm9pZCAwKXJldHVybiBvfWNvbnN0IHJ2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxlbmRzV2l0aDpxdCxndDprZSxndGU6aWUsaW5jbHVkZXM6THQsbGVuZ3RoOml0LGxvd2VyY2FzZTpDdCxsdDp5ZSxsdGU6dWUsbWF4TGVuZ3RoOnJ0LG1heFNpemU6TGUsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5lZ2F0aXZlOmlyLG5vbm5lZ2F0aXZlOmFyLG5vbnBvc2l0aXZlOm9yLG5vcm1hbGl6ZTpKdCxvdmVyd3JpdGU6X2UscG9zaXRpdmU6cnIscHJvcGVydHk6c3IscmVnZXg6UnQsc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJpbTpIdCx1cHBlcmNhc2U6QXR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksY3I9ZCgiWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57d3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gX28odCl7cmV0dXJuIE5sKGNyLHQpfWNvbnN0IHVyPWQoIlpvZElTT0RhdGUiLCh0LG4pPT57SXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gdG0odCl7cmV0dXJuIERsKHVyLHQpfWNvbnN0IGxyPWQoIlpvZElTT1RpbWUiLCh0LG4pPT57enUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbm0odCl7cmV0dXJuIEVsKGxyLHQpfWNvbnN0IGRyPWQoIlpvZElTT0R1cmF0aW9uIiwodCxuKT0+e3h1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHJtKHQpe3JldHVybiBabChkcix0KX1jb25zdCBibz1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLGRhdGU6dG0sZGF0ZXRpbWU6X28sZHVyYXRpb246cm0sdGltZTpubX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxpbT0odCxuKT0+e19pLmluaXQodCxuKSx0Lm5hbWU9IlpvZEVycm9yIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LHtmb3JtYXQ6e3ZhbHVlOnI9PlluKHQscil9LGZsYXR0ZW46e3ZhbHVlOnI9PlhuKHQscil9LGFkZElzc3VlOnt2YWx1ZTpyPT57dC5pc3N1ZXMucHVzaChyKSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkodC5pc3N1ZXMsUm4sMil9fSxhZGRJc3N1ZXM6e3ZhbHVlOnI9Pnt0Lmlzc3Vlcy5wdXNoKC4uLnIpLHQubWVzc2FnZT1KU09OLnN0cmluZ2lmeSh0Lmlzc3VlcyxSbiwyKX19LGlzRW1wdHk6e2dldCgpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg9PT0wfX19KX0sb209ZCgiWm9kRXJyb3IiLGltKSxzZT1kKCJab2RFcnJvciIsaW0se1BhcmVudDpFcnJvcn0pLHlvPWp0KHNlKSxrbz1PdChzZSksU289VXQoc2UpLHdvPVB0KHNlKSxJbz1TaShzZSksem89d2koc2UpLHhvPUlpKHNlKSxUbz16aShzZSksam89eGkoc2UpLE9vPVRpKHNlKSxVbz1qaShzZSksUG89T2koc2UpLFpzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEd0KHQsbixyKXtjb25zdCBvPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtsZXQgZT1acy5nZXQobyk7aWYoZXx8KGU9bmV3IFNldCxacy5zZXQobyxlKSksIWUuaGFzKG4pKXtlLmFkZChuKTtmb3IoY29uc3QgaSBpbiByKXtjb25zdCBhPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KG8saSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0KCl7Y29uc3Qgcz1hLmJpbmQodGhpcyk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KSxzfSxzZXQocyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30pfX0pfX19Y29uc3Qgaj1kKCJab2RUeXBlIiwodCxuKT0+KHguaW5pdCh0LG4pLE9iamVjdC5hc3NpZ24odFsifnN0YW5kYXJkIl0se2pzb25TY2hlbWE6e2lucHV0OlN0KHQsImlucHV0Iiksb3V0cHV0OlN0KHQsIm91dHB1dCIpfX0pLHQudG9KU09OU2NoZW1hPWdkKHQse30pLHQuZGVmPW4sdC50eXBlPW4udHlwZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX2RlZiIse3ZhbHVlOm59KSx0LnBhcnNlPShyLG8pPT55byh0LHIsbyx7Y2FsbGVlOnQucGFyc2V9KSx0LnNhZmVQYXJzZT0ocixvKT0+U28odCxyLG8pLHQucGFyc2VBc3luYz1hc3luYyhyLG8pPT5rbyh0LHIsbyx7Y2FsbGVlOnQucGFyc2VBc3luY30pLHQuc2FmZVBhcnNlQXN5bmM9YXN5bmMocixvKT0+d28odCxyLG8pLHQuc3BhPXQuc2FmZVBhcnNlQXN5bmMsdC5lbmNvZGU9KHIsbyk9PklvKHQscixvKSx0LmRlY29kZT0ocixvKT0+em8odCxyLG8pLHQuZW5jb2RlQXN5bmM9YXN5bmMocixvKT0+eG8odCxyLG8pLHQuZGVjb2RlQXN5bmM9YXN5bmMocixvKT0+VG8odCxyLG8pLHQuc2FmZUVuY29kZT0ocixvKT0+am8odCxyLG8pLHQuc2FmZURlY29kZT0ocixvKT0+T28odCxyLG8pLHQuc2FmZUVuY29kZUFzeW5jPWFzeW5jKHIsbyk9PlVvKHQscixvKSx0LnNhZmVEZWNvZGVBc3luYz1hc3luYyhyLG8pPT5Qbyh0LHIsbyksR3QodCwiWm9kVHlwZSIse2NoZWNrKC4uLnIpe2NvbnN0IG89dGhpcy5kZWY7cmV0dXJuIHRoaXMuY2xvbmUoJGUobyx7Y2hlY2tzOlsuLi5vLmNoZWNrcz8/W10sLi4uci5tYXAoZT0+dHlwZW9mIGU9PSJmdW5jdGlvbiI/e196b2Q6e2NoZWNrOmUsZGVmOntjaGVjazoiY3VzdG9tIn0sb25hdHRhY2g6W119fTplKV19KSx7cGFyZW50OiEwfSl9LHdpdGgoLi4ucil7cmV0dXJuIHRoaXMuY2hlY2soLi4ucil9LGNsb25lKHIsbyl7cmV0dXJuIGRlKHRoaXMscixvKX0sYnJhbmQoKXtyZXR1cm4gdGhpc30scmVnaXN0ZXIocixvKXtyZXR1cm4gci5hZGQodGhpcyxvKSx0aGlzfSxyZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhZcihyLG8pKX0sc3VwZXJSZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhRcihyLG8pKX0sb3ZlcndyaXRlKHIpe3JldHVybiB0aGlzLmNoZWNrKF9lKHIpKX0sb3B0aW9uYWwoKXtyZXR1cm4gcSh0aGlzKX0sZXhhY3RPcHRpb25hbCgpe3JldHVybiBQcih0aGlzKX0sbnVsbGFibGUoKXtyZXR1cm4gUWUodGhpcyl9LG51bGxpc2goKXtyZXR1cm4gcShRZSh0aGlzKSl9LG5vbm9wdGlvbmFsKHIpe3JldHVybiBDcih0aGlzLHIpfSxhcnJheSgpe3JldHVybiBJKHRoaXMpfSxvcihyKXtyZXR1cm4gVShbdGhpcyxyXSl9LGFuZChyKXtyZXR1cm4gbXQodGhpcyxyKX0sdHJhbnNmb3JtKHIpe3JldHVybiBJdCh0aGlzLGJuKHIpKX0sZGVmYXVsdChyKXtyZXR1cm4gRXIodGhpcyxyKX0scHJlZmF1bHQocil7cmV0dXJuIFJyKHRoaXMscil9LGNhdGNoKHIpe3JldHVybiBNcih0aGlzLHIpfSxwaXBlKHIpe3JldHVybiBJdCh0aGlzLHIpfSxyZWFkb25seSgpe3JldHVybiBIcih0aGlzKX0sZGVzY3JpYmUocil7Y29uc3Qgbz10aGlzLmNsb25lKCk7cmV0dXJuIGNlLmFkZChvLHtkZXNjcmlwdGlvbjpyfSksb30sbWV0YSguLi5yKXtpZihyLmxlbmd0aD09PTApcmV0dXJuIGNlLmdldCh0aGlzKTtjb25zdCBvPXRoaXMuY2xvbmUoKTtyZXR1cm4gY2UuYWRkKG8sclswXSksb30saXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9LGlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc30sYXBwbHkocil7cmV0dXJuIHIodGhpcyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRlc2NyaXB0aW9uIix7Z2V0KCl7cmV0dXJuIGNlLmdldCh0KT8uZGVzY3JpcHRpb259LGNvbmZpZ3VyYWJsZTohMH0pLHQpKSxYdD1kKCJfWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+dmQodCxvLGUpO2NvbnN0IHI9dC5fem9kLmJhZzt0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbCx0Lm1pbkxlbmd0aD1yLm1pbmltdW0/P251bGwsdC5tYXhMZW5ndGg9ci5tYXhpbXVtPz9udWxsLEd0KHQsIl9ab2RTdHJpbmciLHtyZWdleCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhSdCguLi5vKSl9LGluY2x1ZGVzKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEx0KC4uLm8pKX0sc3RhcnRzV2l0aCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhNdCguLi5vKSl9LGVuZHNXaXRoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHF0KC4uLm8pKX0sbWluKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHplKC4uLm8pKX0sbWF4KC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KC4uLm8pKX0sbGVuZ3RoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKGl0KC4uLm8pKX0sbm9uZW1wdHkoLi4ubyl7cmV0dXJuIHRoaXMuY2hlY2soemUoMSwuLi5vKSl9LGxvd2VyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhDdChvKSl9LHVwcGVyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhBdChvKSl9LHRyaW0oKXtyZXR1cm4gdGhpcy5jaGVjayhIdCgpKX0sbm9ybWFsaXplKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEp0KC4uLm8pKX0sdG9Mb3dlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhXdCgpKX0sdG9VcHBlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhCdCgpKX0sc2x1Z2lmeSgpe3JldHVybiB0aGlzLmNoZWNrKFZ0KCkpfX0pfSksb3Q9ZCgiWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxYdC5pbml0KHQsbiksdC5lbWFpbD1yPT50LmNoZWNrKEJpKFl0LHIpKSx0LnVybD1yPT50LmNoZWNrKG5yKGF0LHIpKSx0Lmp3dD1yPT50LmNoZWNrKHBvKGZuLHIpKSx0LmVtb2ppPXI9PnQuY2hlY2soWWkoUXQscikpLHQuZ3VpZD1yPT50LmNoZWNrKExuKFhlLHIpKSx0LnV1aWQ9cj0+dC5jaGVjayhWaShoZSxyKSksdC51dWlkdjQ9cj0+dC5jaGVjayhLaShoZSxyKSksdC51dWlkdjY9cj0+dC5jaGVjayhHaShoZSxyKSksdC51dWlkdjc9cj0+dC5jaGVjayhYaShoZSxyKSksdC5uYW5vaWQ9cj0+dC5jaGVjayhRaShlbixyKSksdC5ndWlkPXI9PnQuY2hlY2soTG4oWGUscikpLHQuY3VpZD1yPT50LmNoZWNrKGVvKHRuLHIpKSx0LmN1aWQyPXI9PnQuY2hlY2sodG8obm4scikpLHQudWxpZD1yPT50LmNoZWNrKG5vKHJuLHIpKSx0LmJhc2U2ND1yPT50LmNoZWNrKHVvKGRuLHIpKSx0LmJhc2U2NHVybD1yPT50LmNoZWNrKGxvKG1uLHIpKSx0LnhpZD1yPT50LmNoZWNrKHJvKG9uLHIpKSx0LmtzdWlkPXI9PnQuY2hlY2soaW8oYW4scikpLHQuaXB2ND1yPT50LmNoZWNrKG9vKHNuLHIpKSx0LmlwdjY9cj0+dC5jaGVjayhhbyhjbixyKSksdC5jaWRydjQ9cj0+dC5jaGVjayhzbyh1bixyKSksdC5jaWRydjY9cj0+dC5jaGVjayhjbyhsbixyKSksdC5lMTY0PXI9PnQuY2hlY2sobW8ocG4scikpLHQuZGF0ZXRpbWU9cj0+dC5jaGVjayhfbyhyKSksdC5kYXRlPXI9PnQuY2hlY2sodG0ocikpLHQudGltZT1yPT50LmNoZWNrKG5tKHIpKSx0LmR1cmF0aW9uPXI9PnQuY2hlY2socm0ocikpfSk7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gT2wob3QsdCl9Y29uc3QgQT1kKCJab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57Ri5pbml0KHQsbiksWHQuaW5pdCh0LG4pfSksWXQ9ZCgiWm9kRW1haWwiLCh0LG4pPT57Z3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTm8odCl7cmV0dXJuIEJpKFl0LHQpfWNvbnN0IFhlPWQoIlpvZEdVSUQiLCh0LG4pPT57cHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRG8odCl7cmV0dXJuIExuKFhlLHQpfWNvbnN0IGhlPWQoIlpvZFVVSUQiLCh0LG4pPT57ZnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRW8odCl7cmV0dXJuIFZpKGhlLHQpfWZ1bmN0aW9uIFpvKHQpe3JldHVybiBLaShoZSx0KX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gR2koaGUsdCl9ZnVuY3Rpb24gQ28odCl7cmV0dXJuIFhpKGhlLHQpfWNvbnN0IGF0PWQoIlpvZFVSTCIsKHQsbik9Pnt2dS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBBbyh0KXtyZXR1cm4gbnIoYXQsdCl9ZnVuY3Rpb24gTG8odCl7cmV0dXJuIG5yKGF0LHtwcm90b2NvbDpQaSxob3N0bmFtZTpPYywuLi5oKHQpfSl9Y29uc3QgUXQ9ZCgiWm9kRW1vamkiLCh0LG4pPT57aHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTW8odCl7cmV0dXJuIFlpKFF0LHQpfWNvbnN0IGVuPWQoIlpvZE5hbm9JRCIsKHQsbik9PnskdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBxbyh0KXtyZXR1cm4gUWkoZW4sdCl9Y29uc3QgdG49ZCgiWm9kQ1VJRCIsKHQsbik9PntfdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBGbyh0KXtyZXR1cm4gZW8odG4sdCl9Y29uc3Qgbm49ZCgiWm9kQ1VJRDIiLCh0LG4pPT57YnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSm8odCl7cmV0dXJuIHRvKG5uLHQpfWNvbnN0IHJuPWQoIlpvZFVMSUQiLCh0LG4pPT57eXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSG8odCl7cmV0dXJuIG5vKHJuLHQpfWNvbnN0IG9uPWQoIlpvZFhJRCIsKHQsbik9PntrdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBXbyh0KXtyZXR1cm4gcm8ob24sdCl9Y29uc3QgYW49ZCgiWm9kS1NVSUQiLCh0LG4pPT57U3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gQm8odCl7cmV0dXJuIGlvKGFuLHQpfWNvbnN0IHNuPWQoIlpvZElQdjQiLCh0LG4pPT57VHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gVm8odCl7cmV0dXJuIG9vKHNuLHQpfWNvbnN0IG1yPWQoIlpvZE1BQyIsKHQsbik9PntPdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBLbyh0KXtyZXR1cm4gUGwobXIsdCl9Y29uc3QgY249ZCgiWm9kSVB2NiIsKHQsbik9PntqdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBHbyh0KXtyZXR1cm4gYW8oY24sdCl9Y29uc3QgdW49ZCgiWm9kQ0lEUnY0IiwodCxuKT0+e1V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIFhvKHQpe3JldHVybiBzbyh1bix0KX1jb25zdCBsbj1kKCJab2RDSURSdjYiLCh0LG4pPT57UHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gWW8odCl7cmV0dXJuIGNvKGxuLHQpfWNvbnN0IGRuPWQoIlpvZEJhc2U2NCIsKHQsbik9PntOdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gdW8oZG4sdCl9Y29uc3QgbW49ZCgiWm9kQmFzZTY0VVJMIiwodCxuKT0+e0V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIGVhKHQpe3JldHVybiBsbyhtbix0KX1jb25zdCBwbj1kKCJab2RFMTY0IiwodCxuKT0+e1p1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHRhKHQpe3JldHVybiBtbyhwbix0KX1jb25zdCBmbj1kKCJab2RKV1QiLCh0LG4pPT57Q3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHBvKGZuLHQpfWNvbnN0IE1lPWQoIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdCIsKHQsbik9PntBdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiByYSh0LG4scj17fSl7cmV0dXJuIEt0KE1lLHQsbixyKX1mdW5jdGlvbiBpYSh0KXtyZXR1cm4gS3QoTWUsImhvc3RuYW1lIixqYyx0KX1mdW5jdGlvbiBvYSh0KXtyZXR1cm4gS3QoTWUsImhleCIsSGMsdCl9ZnVuY3Rpb24gYWEodCxuKXtjb25zdCByPW4/LmVuYz8/ImhleCIsbz1gJHt0fV8ke3J9YCxlPVFuW29dO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke299YCk7cmV0dXJuIEt0KE1lLG8sZSxuKX1jb25zdCBzdD1kKCJab2ROdW1iZXIiLCh0LG4pPT57UmkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT5oZCh0LG8sZSksR3QodCwiWm9kTnVtYmVyIix7Z3QobyxlKXtyZXR1cm4gdGhpcy5jaGVjayhrZShvLGUpKX0sZ3RlKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soaWUobyxlKSl9LG1pbihvLGUpe3JldHVybiB0aGlzLmNoZWNrKGllKG8sZSkpfSxsdChvLGUpe3JldHVybiB0aGlzLmNoZWNrKHllKG8sZSkpfSxsdGUobyxlKXtyZXR1cm4gdGhpcy5jaGVjayh1ZShvLGUpKX0sbWF4KG8sZSl7cmV0dXJuIHRoaXMuY2hlY2sodWUobyxlKSl9LGludChvKXtyZXR1cm4gdGhpcy5jaGVjayh3dChvKSl9LHNhZmUobyl7cmV0dXJuIHRoaXMuY2hlY2sod3QobykpfSxwb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayhrZSgwLG8pKX0sbm9ubmVnYXRpdmUobyl7cmV0dXJuIHRoaXMuY2hlY2soaWUoMCxvKSl9LG5lZ2F0aXZlKG8pe3JldHVybiB0aGlzLmNoZWNrKHllKDAsbykpfSxub25wb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayh1ZSgwLG8pKX0sbXVsdGlwbGVPZihvLGUpe3JldHVybiB0aGlzLmNoZWNrKEVlKG8sZSkpfSxzdGVwKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soRWUobyxlKSl9LGZpbml0ZSgpe3JldHVybiB0aGlzfX0pO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPU1hdGgubWF4KHIubWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKT8/bnVsbCx0Lm1heFZhbHVlPU1hdGgubWluKHIubWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKT8/bnVsbCx0LmlzSW50PShyLmZvcm1hdD8/IiIpLmluY2x1ZGVzKCJpbnQiKXx8TnVtYmVyLmlzU2FmZUludGVnZXIoci5tdWx0aXBsZU9mPz8uNSksdC5pc0Zpbml0ZT0hMCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIFQodCl7cmV0dXJuIFJsKHN0LHQpfWNvbnN0IFRlPWQoIlpvZE51bWJlckZvcm1hdCIsKHQsbik9PntMdS5pbml0KHQsbiksc3QuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gd3QodCl7cmV0dXJuIEFsKFRlLHQpfWZ1bmN0aW9uIHNhKHQpe3JldHVybiBMbChUZSx0KX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gTWwoVGUsdCl9ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHFsKFRlLHQpfWZ1bmN0aW9uIGxhKHQpe3JldHVybiBGbChUZSx0KX1jb25zdCBjdD1kKCJab2RCb29sZWFuIiwodCxuKT0+e0NpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+JGQodCxyLG8pfSk7ZnVuY3Rpb24gWih0KXtyZXR1cm4gSmwoY3QsdCl9Y29uc3QgdXQ9ZCgiWm9kQmlnSW50IiwodCxuKT0+e0FpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+X2QodCxvKSx0Lmd0ZT0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lm1pbj0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lmd0PShvLGUpPT50LmNoZWNrKGtlKG8sZSkpLHQuZ3RlPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubHQ9KG8sZSk9PnQuY2hlY2soeWUobyxlKSksdC5sdGU9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5tYXg9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5wb3NpdGl2ZT1vPT50LmNoZWNrKGtlKEJpZ0ludCgwKSxvKSksdC5uZWdhdGl2ZT1vPT50LmNoZWNrKHllKEJpZ0ludCgwKSxvKSksdC5ub25wb3NpdGl2ZT1vPT50LmNoZWNrKHVlKEJpZ0ludCgwKSxvKSksdC5ub25uZWdhdGl2ZT1vPT50LmNoZWNrKGllKEJpZ0ludCgwKSxvKSksdC5tdWx0aXBsZU9mPShvLGUpPT50LmNoZWNrKEVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPXIubWluaW11bT8/bnVsbCx0Lm1heFZhbHVlPXIubWF4aW11bT8/bnVsbCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIGRhKHQpe3JldHVybiBXbCh1dCx0KX1jb25zdCBnbj1kKCJab2RCaWdJbnRGb3JtYXQiLCh0LG4pPT57TXUuaW5pdCh0LG4pLHV0LmluaXQodCxuKX0pO2Z1bmN0aW9uIG1hKHQpe3JldHVybiBWbChnbix0KX1mdW5jdGlvbiBwYSh0KXtyZXR1cm4gS2woZ24sdCl9Y29uc3QgcHI9ZCgiWm9kU3ltYm9sIiwodCxuKT0+e3F1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+YmQodCxyKX0pO2Z1bmN0aW9uIGZhKHQpe3JldHVybiBHbChwcix0KX1jb25zdCBmcj1kKCJab2RVbmRlZmluZWQiLCh0LG4pPT57RnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5rZCh0LHIpfSk7ZnVuY3Rpb24gWWUodCl7cmV0dXJuIFhsKGZyLHQpfWNvbnN0IGdyPWQoIlpvZE51bGwiLCh0LG4pPT57SnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT55ZCh0LHIsbyl9KTtmdW5jdGlvbiB2bih0KXtyZXR1cm4gWWwoZ3IsdCl9Y29uc3QgdnI9ZCgiWm9kQW55IiwodCxuKT0+e0h1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+SWQoKX0pO2Z1bmN0aW9uIGhuKCl7cmV0dXJuIFFsKHZyKX1jb25zdCBocj1kKCJab2RVbmtub3duIiwodCxuKT0+e1d1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+emQoKX0pO2Z1bmN0aW9uIEUoKXtyZXR1cm4gZWQoaHIpfWNvbnN0ICRyPWQoIlpvZE5ldmVyIiwodCxuKT0+e0J1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+d2QodCxyLG8pfSk7ZnVuY3Rpb24gWmUodCl7cmV0dXJuIHRkKCRyLHQpfWNvbnN0IF9yPWQoIlpvZFZvaWQiLCh0LG4pPT57VnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5TZCh0LHIpfSk7ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIG5kKF9yLHQpfWNvbnN0ICRuPWQoIlpvZERhdGUiLCh0LG4pPT57S3UuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT54ZCh0LG8pLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWF4PShvLGUpPT50LmNoZWNrKHVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pbkRhdGU9ci5taW5pbXVtP25ldyBEYXRlKHIubWluaW11bSk6bnVsbCx0Lm1heERhdGU9ci5tYXhpbXVtP25ldyBEYXRlKHIubWF4aW11bSk6bnVsbH0pO2Z1bmN0aW9uIHZhKHQpe3JldHVybiByZCgkbix0KX1jb25zdCBicj1kKCJab2RBcnJheSIsKHQsbik9PntHdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkFkKHQscixvLGUpLHQuZWxlbWVudD1uLmVsZW1lbnQsR3QodCwiWm9kQXJyYXkiLHttaW4ocixvKXtyZXR1cm4gdGhpcy5jaGVjayh6ZShyLG8pKX0sbm9uZW1wdHkocil7cmV0dXJuIHRoaXMuY2hlY2soemUoMSxyKSl9LG1heChyLG8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KHIsbykpfSxsZW5ndGgocixvKXtyZXR1cm4gdGhpcy5jaGVjayhpdChyLG8pKX0sdW53cmFwKCl7cmV0dXJuIHRoaXMuZWxlbWVudH19KX0pO2Z1bmN0aW9uIEkodCxuKXtyZXR1cm4gYWQoYnIsdCxuKX1mdW5jdGlvbiBoYSh0KXtjb25zdCBuPXQuX3pvZC5kZWYuc2hhcGU7cmV0dXJuIFEoT2JqZWN0LmtleXMobikpfWNvbnN0IGx0PWQoIlpvZE9iamVjdCIsKHQsbik9PntlbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkxkKHQscixvLGUpLE8odCwic2hhcGUiLCgpPT5uLnNoYXBlKSxHdCh0LCJab2RPYmplY3QiLHtrZXlvZigpe3JldHVybiBRKE9iamVjdC5rZXlzKHRoaXMuX3pvZC5kZWYuc2hhcGUpKX0sY2F0Y2hhbGwocil7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6cn0pfSxwYXNzdGhyb3VnaCgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxsb29zZSgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxzdHJpY3QoKXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4udGhpcy5fem9kLmRlZixjYXRjaGFsbDpaZSgpfSl9LHN0cmlwKCl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6dm9pZCAwfSl9LGV4dGVuZChyKXtyZXR1cm4gdGModGhpcyxyKX0sc2FmZUV4dGVuZChyKXtyZXR1cm4gbmModGhpcyxyKX0sbWVyZ2Uocil7cmV0dXJuIHJjKHRoaXMscil9LHBpY2socil7cmV0dXJuIFFzKHRoaXMscil9LG9taXQocil7cmV0dXJuIGVjKHRoaXMscil9LHBhcnRpYWwoLi4ucil7cmV0dXJuIGljKHluLHRoaXMsclswXSl9LHJlcXVpcmVkKC4uLnIpe3JldHVybiBvYyhrbix0aGlzLHJbMF0pfX0pfSk7ZnVuY3Rpb24gZih0LG4pe2NvbnN0IHI9e3R5cGU6Im9iamVjdCIsc2hhcGU6dD8/e30sLi4uaChuKX07cmV0dXJuIG5ldyBsdChyKX1mdW5jdGlvbiAkYSh0LG4pe3JldHVybiBuZXcgbHQoe3R5cGU6Im9iamVjdCIsc2hhcGU6dCxjYXRjaGFsbDpaZSgpLC4uLmgobil9KX1mdW5jdGlvbiBZKHQsbil7cmV0dXJuIG5ldyBsdCh7dHlwZToib2JqZWN0IixzaGFwZTp0LGNhdGNoYWxsOkUoKSwuLi5oKG4pfSl9Y29uc3QgZHQ9ZCgiWm9kVW5pb24iLCh0LG4pPT57ZXIuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gVSh0LG4pe3JldHVybiBuZXcgZHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnQsLi4uaChuKX0pfWNvbnN0IHlyPWQoIlpvZFhvciIsKHQsbik9PntkdC5pbml0KHQsbiksdGwuaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gX2EodCxuKXtyZXR1cm4gbmV3IHlyKHt0eXBlOiJ1bmlvbiIsb3B0aW9uczp0LGluY2x1c2l2ZTohMSwuLi5oKG4pfSl9Y29uc3Qga3I9ZCgiWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e2R0LmluaXQodCxuKSxubC5pbml0KHQsbil9KTtmdW5jdGlvbiBfbih0LG4scil7cmV0dXJuIG5ldyBrcih7dHlwZToidW5pb24iLG9wdGlvbnM6bixkaXNjcmltaW5hdG9yOnQsLi4uaChyKX0pfWNvbnN0IFNyPWQoIlpvZEludGVyc2VjdGlvbiIsKHQsbik9PntybC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk1kKHQscixvLGUpfSk7ZnVuY3Rpb24gbXQodCxuKXtyZXR1cm4gbmV3IFNyKHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6dCxyaWdodDpufSl9Y29uc3Qgd3I9ZCgiWm9kVHVwbGUiLCh0LG4pPT57TGkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5xZCh0LHIsbyxlKSx0LnJlc3Q9cj0+dC5jbG9uZSh7Li4udC5fem9kLmRlZixyZXN0OnJ9KX0pO2Z1bmN0aW9uIElyKHQsbixyKXtjb25zdCBvPW4gaW5zdGFuY2VvZiB4LGU9bz9yOm4saT1vP246bnVsbDtyZXR1cm4gbmV3IHdyKHt0eXBlOiJ0dXBsZSIsaXRlbXM6dCxyZXN0OmksLi4uaChlKX0pfWNvbnN0IFJlPWQoIlpvZFJlY29yZCIsKHQsbik9PntpbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkZkKHQscixvLGUpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGV9KTtmdW5jdGlvbiBQKHQsbixyKXtyZXR1cm4hbnx8IW4uX3pvZD9uZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTptKCksdmFsdWVUeXBlOnQsLi4uaChuKX0pOm5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIGJhKHQsbixyKXtjb25zdCBvPWRlKHQpO3JldHVybiBvLl96b2QudmFsdWVzPXZvaWQgMCxuZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTpvLHZhbHVlVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiB5YSh0LG4scil7cmV0dXJuIG5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sbW9kZToibG9vc2UiLC4uLmgocil9KX1jb25zdCB6cj1kKCJab2RNYXAiLCh0LG4pPT57b2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5SZCh0LHIpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGUsdC5taW49KC4uLnIpPT50LmNoZWNrKFNlKC4uLnIpKSx0Lm5vbmVtcHR5PXI9PnQuY2hlY2soU2UoMSxyKSksdC5tYXg9KC4uLnIpPT50LmNoZWNrKExlKC4uLnIpKSx0LnNpemU9KC4uLnIpPT50LmNoZWNrKG50KC4uLnIpKX0pO2Z1bmN0aW9uIGthKHQsbixyKXtyZXR1cm4gbmV3IHpyKHt0eXBlOiJtYXAiLGtleVR5cGU6dCx2YWx1ZVR5cGU6biwuLi5oKHIpfSl9Y29uc3QgeHI9ZCgiWm9kU2V0IiwodCxuKT0+e2FsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+Q2QodCxyKSx0Lm1pbj0oLi4ucik9PnQuY2hlY2soU2UoLi4ucikpLHQubm9uZW1wdHk9cj0+dC5jaGVjayhTZSgxLHIpKSx0Lm1heD0oLi4ucik9PnQuY2hlY2soTGUoLi4ucikpLHQuc2l6ZT0oLi4ucik9PnQuY2hlY2sobnQoLi4ucikpfSk7ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gbmV3IHhyKHt0eXBlOiJzZXQiLHZhbHVlVHlwZTp0LC4uLmgobil9KX1jb25zdCBDZT1kKCJab2RFbnVtIiwodCxuKT0+e3NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+VGQodCxvLGUpLHQuZW51bT1uLmVudHJpZXMsdC5vcHRpb25zPU9iamVjdC52YWx1ZXMobi5lbnRyaWVzKTtjb25zdCByPW5ldyBTZXQoT2JqZWN0LmtleXMobi5lbnRyaWVzKSk7dC5leHRyYWN0PShvLGUpPT57Y29uc3QgaT17fTtmb3IoY29uc3QgYSBvZiBvKWlmKHIuaGFzKGEpKWlbYV09bi5lbnRyaWVzW2FdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHthfSBub3QgZm91bmQgaW4gZW51bWApO3JldHVybiBuZXcgQ2Uoey4uLm4sY2hlY2tzOltdLC4uLmgoZSksZW50cmllczppfSl9LHQuZXhjbHVkZT0obyxlKT0+e2NvbnN0IGk9ey4uLm4uZW50cmllc307Zm9yKGNvbnN0IGEgb2YgbylpZihyLmhhcyhhKSlkZWxldGUgaVthXTtlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7YX0gbm90IGZvdW5kIGluIGVudW1gKTtyZXR1cm4gbmV3IENlKHsuLi5uLGNoZWNrczpbXSwuLi5oKGUpLGVudHJpZXM6aX0pfX0pO2Z1bmN0aW9uIFEodCxuKXtjb25zdCByPUFycmF5LmlzQXJyYXkodCk/T2JqZWN0LmZyb21FbnRyaWVzKHQubWFwKG89PltvLG9dKSk6dDtyZXR1cm4gbmV3IENlKHt0eXBlOiJlbnVtIixlbnRyaWVzOnIsLi4uaChuKX0pfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIG5ldyBDZSh7dHlwZToiZW51bSIsZW50cmllczp0LC4uLmgobil9KX1jb25zdCBUcj1kKCJab2RMaXRlcmFsIiwodCxuKT0+e2NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+amQodCxyLG8pLHQudmFsdWVzPW5ldyBTZXQobi52YWx1ZXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJ2YWx1ZSIse2dldCgpe2lmKG4udmFsdWVzLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC4iKTtyZXR1cm4gbi52YWx1ZXNbMF19fSl9KTtmdW5jdGlvbiBwKHQsbil7cmV0dXJuIG5ldyBUcih7dHlwZToibGl0ZXJhbCIsdmFsdWVzOkFycmF5LmlzQXJyYXkodCk/dDpbdF0sLi4uaChuKX0pfWNvbnN0IGpyPWQoIlpvZEZpbGUiLCh0LG4pPT57dWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5QZCh0LHIsbyksdC5taW49KHIsbyk9PnQuY2hlY2soU2UocixvKSksdC5tYXg9KHIsbyk9PnQuY2hlY2soTGUocixvKSksdC5taW1lPShyLG8pPT50LmNoZWNrKEZ0KEFycmF5LmlzQXJyYXkocik/cjpbcl0sbykpfSk7ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHNkKGpyLHQpfWNvbnN0IE9yPWQoIlpvZFRyYW5zZm9ybSIsKHQsbik9PntsbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlpkKHQsciksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXRocm93IG5ldyBXbih0LmNvbnN0cnVjdG9yLm5hbWUpO3IuYWRkSXNzdWU9aT0+e2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyLmlzc3Vlcy5wdXNoKFdlKGksci52YWx1ZSxuKSk7ZWxzZXtjb25zdCBhPWk7YS5mYXRhbCYmKGEuY29udGludWU9ITEpLGEuY29kZT8/KGEuY29kZT0iY3VzdG9tIiksYS5pbnB1dD8/KGEuaW5wdXQ9ci52YWx1ZSksYS5pbnN0Pz8oYS5pbnN0PXQpLHIuaXNzdWVzLnB1c2goV2UoYSkpfX07Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aSxyLmZhbGxiYWNrPSEwLHIpKTooci52YWx1ZT1lLHIuZmFsbGJhY2s9ITAscil9fSk7ZnVuY3Rpb24gYm4odCl7cmV0dXJuIG5ldyBPcih7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06dH0pfWNvbnN0IHluPWQoIlpvZE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gbmV3IHluKHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnR9KX1jb25zdCBVcj1kKCJab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e2RsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUHIodCl7cmV0dXJuIG5ldyBVcih7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTp0fSl9Y29uc3QgTnI9ZCgiWm9kTnVsbGFibGUiLCh0LG4pPT57bWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5KZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBRZSh0KXtyZXR1cm4gbmV3IE5yKHt0eXBlOiJudWxsYWJsZSIsaW5uZXJUeXBlOnR9KX1mdW5jdGlvbiB6YSh0KXtyZXR1cm4gcShRZSh0KSl9Y29uc3QgRHI9ZCgiWm9kRGVmYXVsdCIsKHQsbik9PntwbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PldkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZSx0LnJlbW92ZURlZmF1bHQ9dC51bndyYXB9KTtmdW5jdGlvbiBFcih0LG4pe3JldHVybiBuZXcgRHIoe3R5cGU6ImRlZmF1bHQiLGlubmVyVHlwZTp0LGdldCBkZWZhdWx0VmFsdWUoKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOlZuKG4pfX0pfWNvbnN0IFpyPWQoIlpvZFByZWZhdWx0IiwodCxuKT0+e2ZsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+QmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUnIodCxuKXtyZXR1cm4gbmV3IFpyKHt0eXBlOiJwcmVmYXVsdCIsaW5uZXJUeXBlOnQsZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKCk6Vm4obil9fSl9Y29uc3Qga249ZCgiWm9kTm9uT3B0aW9uYWwiLCh0LG4pPT57Z2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5IZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBDcih0LG4pe3JldHVybiBuZXcga24oe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6dCwuLi5oKG4pfSl9Y29uc3QgQXI9ZCgiWm9kU3VjY2VzcyIsKHQsbik9Pnt2bC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk5kKHQscixvKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiB4YSh0KXtyZXR1cm4gbmV3IEFyKHt0eXBlOiJzdWNjZXNzIixpbm5lclR5cGU6dH0pfWNvbnN0IExyPWQoIlpvZENhdGNoIiwodCxuKT0+e2hsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+VmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlLHQucmVtb3ZlQ2F0Y2g9dC51bndyYXB9KTtmdW5jdGlvbiBNcih0LG4pe3JldHVybiBuZXcgTHIoe3R5cGU6ImNhdGNoIixpbm5lclR5cGU6dCxjYXRjaFZhbHVlOnR5cGVvZiBuPT0iZnVuY3Rpb24iP246KCk9Pm59KX1jb25zdCBxcj1kKCJab2ROYU4iLCh0LG4pPT57JGwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5PZCh0LHIpfSk7ZnVuY3Rpb24gVGEodCl7cmV0dXJuIG9kKHFyLHQpfWNvbnN0IHB0PWQoIlpvZFBpcGUiLCh0LG4pPT57cWkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5LZCh0LHIsbyxlKSx0LmluPW4uaW4sdC5vdXQ9bi5vdXR9KTtmdW5jdGlvbiBJdCh0LG4pe3JldHVybiBuZXcgcHQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om59KX1jb25zdCBmdD1kKCJab2RDb2RlYyIsKHQsbik9PntwdC5pbml0KHQsbiksRmkuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gamEodCxuLHIpe3JldHVybiBuZXcgZnQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om4sdHJhbnNmb3JtOnIuZGVjb2RlLHJldmVyc2VUcmFuc2Zvcm06ci5lbmNvZGV9KX1mdW5jdGlvbiBPYSh0KXtjb25zdCBuPXQuX3pvZC5kZWY7cmV0dXJuIG5ldyBmdCh7dHlwZToicGlwZSIsaW46bi5vdXQsb3V0Om4uaW4sdHJhbnNmb3JtOm4ucmV2ZXJzZVRyYW5zZm9ybSxyZXZlcnNlVHJhbnNmb3JtOm4udHJhbnNmb3JtfSl9Y29uc3QgRnI9ZCgiWm9kUHJlcHJvY2VzcyIsKHQsbik9PntwdC5pbml0KHQsbiksX2wuaW5pdCh0LG4pfSksSnI9ZCgiWm9kUmVhZG9ubHkiLCh0LG4pPT57YmwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5HZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBIcih0KXtyZXR1cm4gbmV3IEpyKHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOnR9KX1jb25zdCBXcj1kKCJab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5VZCh0LHIsbyl9KTtmdW5jdGlvbiBVYSh0LG4pe3JldHVybiBuZXcgV3Ioe3R5cGU6InRlbXBsYXRlX2xpdGVyYWwiLHBhcnRzOnQsLi4uaChuKX0pfWNvbnN0IEJyPWQoIlpvZExhenkiLCh0LG4pPT57d2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5ZZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5nZXR0ZXIoKX0pO2Z1bmN0aW9uIFZyKHQpe3JldHVybiBuZXcgQnIoe3R5cGU6ImxhenkiLGdldHRlcjp0fSl9Y29uc3QgS3I9ZCgiWm9kUHJvbWlzZSIsKHQsbik9PntTbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlhkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIFBhKHQpe3JldHVybiBuZXcgS3Ioe3R5cGU6InByb21pc2UiLGlubmVyVHlwZTp0fSl9Y29uc3QgR3I9ZCgiWm9kRnVuY3Rpb24iLCh0LG4pPT57a2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5FZCh0LHIpfSk7ZnVuY3Rpb24gZXQodCl7cmV0dXJuIG5ldyBHcih7dHlwZToiZnVuY3Rpb24iLGlucHV0OkFycmF5LmlzQXJyYXkodD8uaW5wdXQpP0lyKHQ/LmlucHV0KTp0Py5pbnB1dD8/SShFKCkpLG91dHB1dDp0Py5vdXRwdXQ/P0UoKX0pfWNvbnN0IGd0PWQoIlpvZEN1c3RvbSIsKHQsbik9PntJbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkRkKHQscil9KTtmdW5jdGlvbiBOYSh0KXtjb25zdCBuPW5ldyBKKHtjaGVjazoiY3VzdG9tIn0pO3JldHVybiBuLl96b2QuY2hlY2s9dCxufWZ1bmN0aW9uIFhyKHQsbil7cmV0dXJuIGNkKGd0LHQ/PygoKT0+ITApLG4pfWZ1bmN0aW9uIFlyKHQsbj17fSl7cmV0dXJuIHVkKGd0LHQsbil9ZnVuY3Rpb24gUXIodCxuKXtyZXR1cm4gbGQodCxuKX1jb25zdCBEYT1tZCxFYT1wZDtmdW5jdGlvbiBaYSh0LG49e30pe2NvbnN0IHI9bmV3IGd0KHt0eXBlOiJjdXN0b20iLGNoZWNrOiJjdXN0b20iLGZuOm89Pm8gaW5zdGFuY2VvZiB0LGFib3J0OiEwLC4uLmgobil9KTtyZXR1cm4gci5fem9kLmJhZy5DbGFzcz10LHIuX3pvZC5jaGVjaz1vPT57by52YWx1ZSBpbnN0YW5jZW9mIHR8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6dC5uYW1lLGlucHV0Om8udmFsdWUsaW5zdDpyLHBhdGg6Wy4uLnIuX3pvZC5kZWYucGF0aD8/W11dfSl9LHJ9Y29uc3QgUmE9KC4uLnQpPT5mZCh7Q29kZWM6ZnQsQm9vbGVhbjpjdCxTdHJpbmc6b3R9LC4uLnQpO2Z1bmN0aW9uIENhKHQpe2NvbnN0IG49VnIoKCk9PlUoW20odCksVCgpLFooKSx2bigpLEkobiksUChtKCksbildKSk7cmV0dXJuIG59ZnVuY3Rpb24gU24odCxuKXtyZXR1cm4gbmV3IEZyKHt0eXBlOiJwaXBlIixpbjpibih0KSxvdXQ6bn0pfWNvbnN0IGl2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZEludGVyc2VjdGlvbjpTcixab2RKV1Q6Zm4sWm9kS1NVSUQ6YW4sWm9kTGF6eTpCcixab2RMaXRlcmFsOlRyLFpvZE1BQzptcixab2RNYXA6enIsWm9kTmFOOnFyLFpvZE5hbm9JRDplbixab2ROZXZlcjokcixab2ROb25PcHRpb25hbDprbixab2ROdWxsOmdyLFpvZE51bGxhYmxlOk5yLFpvZE51bWJlcjpzdCxab2ROdW1iZXJGb3JtYXQ6VGUsWm9kT2JqZWN0Omx0LFpvZE9wdGlvbmFsOnluLFpvZFBpcGU6cHQsWm9kUHJlZmF1bHQ6WnIsWm9kUHJlcHJvY2VzczpGcixab2RQcm9taXNlOktyLFpvZFJlYWRvbmx5OkpyLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNvZGVjOmphLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW51bTpRLGV4YWN0T3B0aW9uYWw6UHIsZmlsZTpJYSxmbG9hdDMyOnNhLGZsb2F0NjQ6Y2EsZnVuY3Rpb246ZXQsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28sanNvbjpDYSxqd3Q6bmEsa2V5b2Y6aGEsa3N1aWQ6Qm8sbGF6eTpWcixsaXRlcmFsOnAsbG9vc2VPYmplY3Q6WSxsb29zZVJlY29yZDp5YSxtYWM6S28sbWFwOmthLG1ldGE6RWEsbmFuOlRhLG5hbm9pZDpxbyxuYXRpdmVFbnVtOndhLG5ldmVyOlplLG5vbm9wdGlvbmFsOkNyLG51bGw6dm4sbnVsbGFibGU6UWUsbnVsbGlzaDp6YSxudW1iZXI6VCxvYmplY3Q6ZixvcHRpb25hbDpxLHBhcnRpYWxSZWNvcmQ6YmEscGlwZTpJdCxwcmVmYXVsdDpScixwcmVwcm9jZXNzOlNuLHByb21pc2U6UGEscmVhZG9ubHk6SHIscmVjb3JkOlAscmVmaW5lOllyLHNldDpTYSxzdHJpY3RPYmplY3Q6JGEsc3RyaW5nOm0sc3RyaW5nRm9ybWF0OnJhLHN0cmluZ2Jvb2w6UmEsc3VjY2Vzczp4YSxzdXBlclJlZmluZTpRcixzeW1ib2w6ZmEsdGVtcGxhdGVMaXRlcmFsOlVhLHRyYW5zZm9ybTpibix0dXBsZTpJcix1aW50MzI6bGEsdWludDY0OnBhLHVsaWQ6SG8sdW5kZWZpbmVkOlllLHVuaW9uOlUsdW5rbm93bjpFLHVybDpBbyx1dWlkOkVvLHV1aWR2NDpabyx1dWlkdjY6Um8sdXVpZHY3OkNvLHZvaWQ6Z2EseGlkOldvLHhvcjpfYX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxhbT17aW52YWxpZF90eXBlOiJpbnZhbGlkX3R5cGUiLHRvb19iaWc6InRvb19iaWciLHRvb19zbWFsbDoidG9vX3NtYWxsIixpbnZhbGlkX2Zvcm1hdDoiaW52YWxpZF9mb3JtYXQiLG5vdF9tdWx0aXBsZV9vZjoibm90X211bHRpcGxlX29mIix1bnJlY29nbml6ZWRfa2V5czoidW5yZWNvZ25pemVkX2tleXMiLGludmFsaWRfdW5pb246ImludmFsaWRfdW5pb24iLGludmFsaWRfa2V5OiJpbnZhbGlkX2tleSIsaW52YWxpZF9lbGVtZW50OiJpbnZhbGlkX2VsZW1lbnQiLGludmFsaWRfdmFsdWU6ImludmFsaWRfdmFsdWUiLGN1c3RvbToiY3VzdG9tIn07ZnVuY3Rpb24gc20odCl7Syh7Y3VzdG9tRXJyb3I6dH0pfWZ1bmN0aW9uIGNtKCl7cmV0dXJuIEsoKS5jdXN0b21FcnJvcn12YXIgTW47TW58fChNbj17fSk7Y29uc3QgYj17Li4uaXYsLi4ucnYsaXNvOmJvfSxvdj1uZXcgU2V0KFsiJHNjaGVtYSIsIiRyZWYiLCIkZGVmcyIsImRlZmluaXRpb25zIiwiJGlkIiwiaWQiLCIkY29tbWVudCIsIiRhbmNob3IiLCIkdm9jYWJ1bGFyeSIsIiRkeW5hbWljUmVmIiwiJGR5bmFtaWNBbmNob3IiLCJ0eXBlIiwiZW51bSIsImNvbnN0IiwiYW55T2YiLCJvbmVPZiIsImFsbE9mIiwibm90IiwicHJvcGVydGllcyIsInJlcXVpcmVkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInByb3BlcnR5TmFtZXMiLCJtaW5Qcm9wZXJ0aWVzIiwibWF4UHJvcGVydGllcyIsIml0ZW1zIiwicHJlZml4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJjb250YWlucyIsIm1pbkNvbnRhaW5zIiwibWF4Q29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuIiwiZm9ybWF0IiwibWluaW11bSIsIm1heGltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJkZXNjcmlwdGlvbiIsImRlZmF1bHQiLCJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSIsInVuZXZhbHVhdGVkSXRlbXMiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLCJpZiIsInRoZW4iLCJlbHNlIiwiZGVwZW5kZW50U2NoZW1hcyIsImRlcGVuZGVudFJlcXVpcmVkIiwibnVsbGFibGUiLCJyZWFkT25seSJdKTtmdW5jdGlvbiBhdih0LG4pe2NvbnN0IHI9dC4kc2NoZW1hO3JldHVybiByPT09Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIj8iZHJhZnQtMjAyMC0xMiI6cj09PSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiPyJkcmFmdC03IjpyPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI/ImRyYWZ0LTQiOm4/PyJkcmFmdC0yMDIwLTEyIn1mdW5jdGlvbiBzdih0LG4pe2lmKCF0LnN0YXJ0c1dpdGgoIiMiKSl0aHJvdyBuZXcgRXJyb3IoIkV4dGVybmFsICRyZWYgaXMgbm90IHN1cHBvcnRlZCwgb25seSBsb2NhbCByZWZzICgjLy4uLikgYXJlIGFsbG93ZWQiKTtjb25zdCByPXQuc2xpY2UoMSkuc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7aWYoci5sZW5ndGg9PT0wKXJldHVybiBuLnJvb3RTY2hlbWE7Y29uc3Qgbz1uLnZlcnNpb249PT0iZHJhZnQtMjAyMC0xMiI/IiRkZWZzIjoiZGVmaW5pdGlvbnMiO2lmKHJbMF09PT1vKXtjb25zdCBlPXJbMV07aWYoIWV8fCFuLmRlZnNbZV0pdGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2Ugbm90IGZvdW5kOiAke3R9YCk7cmV0dXJuIG4uZGVmc1tlXX10aHJvdyBuZXcgRXJyb3IoYFJlZmVyZW5jZSBub3QgZm91bmQ6ICR7dH1gKX1mdW5jdGlvbiB1bSh0LG4pe2lmKHQubm90IT09dm9pZCAwKXtpZih0eXBlb2YgdC5ub3Q9PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0Lm5vdCkubGVuZ3RoPT09MClyZXR1cm4gYi5uZXZlcigpO3Rocm93IG5ldyBFcnJvcigibm90IGlzIG5vdCBzdXBwb3J0ZWQgaW4gWm9kIChleGNlcHQgeyBub3Q6IHt9IH0gZm9yIG5ldmVyKSIpfWlmKHQudW5ldmFsdWF0ZWRJdGVtcyE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoInVuZXZhbHVhdGVkSXRlbXMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKHQudW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmlmIT09dm9pZCAwfHx0LnRoZW4hPT12b2lkIDB8fHQuZWxzZSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvbmRpdGlvbmFsIHNjaGVtYXMgKGlmL3RoZW4vZWxzZSkgYXJlIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmRlcGVuZGVudFNjaGVtYXMhPT12b2lkIDB8fHQuZGVwZW5kZW50UmVxdWlyZWQhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJkZXBlbmRlbnRTY2hlbWFzIGFuZCBkZXBlbmRlbnRSZXF1aXJlZCBhcmUgbm90IHN1cHBvcnRlZCIpO2lmKHQuJHJlZil7Y29uc3QgZT10LiRyZWY7aWYobi5yZWZzLmhhcyhlKSlyZXR1cm4gbi5yZWZzLmdldChlKTtpZihuLnByb2Nlc3NpbmcuaGFzKGUpKXJldHVybiBiLmxhenkoKCk9PntpZighbi5yZWZzLmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZWZzLmdldChlKX0pO24ucHJvY2Vzc2luZy5hZGQoZSk7Y29uc3QgaT1zdihlLG4pLGE9bmUoaSxuKTtyZXR1cm4gbi5yZWZzLnNldChlLGEpLG4ucHJvY2Vzc2luZy5kZWxldGUoZSksYX1pZih0LmVudW0hPT12b2lkIDApe2NvbnN0IGU9dC5lbnVtO2lmKG4udmVyc2lvbj09PSJvcGVuYXBpLTMuMCImJnQubnVsbGFibGU9PT0hMCYmZS5sZW5ndGg9PT0xJiZlWzBdPT09bnVsbClyZXR1cm4gYi5udWxsKCk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBiLm5ldmVyKCk7aWYoZS5sZW5ndGg9PT0xKXJldHVybiBiLmxpdGVyYWwoZVswXSk7aWYoZS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpKXJldHVybiBiLmVudW0oZSk7Y29uc3QgaT1lLm1hcChhPT5iLmxpdGVyYWwoYSkpO3JldHVybiBpLmxlbmd0aDwyP2lbMF06Yi51bmlvbihbaVswXSxpWzFdLC4uLmkuc2xpY2UoMildKX1pZih0LmNvbnN0IT09dm9pZCAwKXJldHVybiBiLmxpdGVyYWwodC5jb25zdCk7Y29uc3Qgcj10LnR5cGU7aWYoQXJyYXkuaXNBcnJheShyKSl7Y29uc3QgZT1yLm1hcChpPT57Y29uc3QgYT17Li4udCx0eXBlOml9O3JldHVybiB1bShhLG4pfSk7cmV0dXJuIGUubGVuZ3RoPT09MD9iLm5ldmVyKCk6ZS5sZW5ndGg9PT0xP2VbMF06Yi51bmlvbihlKX1pZighcilyZXR1cm4gYi5hbnkoKTtsZXQgbztzd2l0Y2gocil7Y2FzZSJzdHJpbmciOntsZXQgZT1iLnN0cmluZygpO2lmKHQuZm9ybWF0KXtjb25zdCBpPXQuZm9ybWF0O2k9PT0iZW1haWwiP2U9ZS5jaGVjayhiLmVtYWlsKCkpOmk9PT0idXJpInx8aT09PSJ1cmktcmVmZXJlbmNlIj9lPWUuY2hlY2soYi51cmwoKSk6aT09PSJ1dWlkInx8aT09PSJndWlkIj9lPWUuY2hlY2soYi51dWlkKCkpOmk9PT0iZGF0ZS10aW1lIj9lPWUuY2hlY2soYi5pc28uZGF0ZXRpbWUoKSk6aT09PSJkYXRlIj9lPWUuY2hlY2soYi5pc28uZGF0ZSgpKTppPT09InRpbWUiP2U9ZS5jaGVjayhiLmlzby50aW1lKCkpOmk9PT0iZHVyYXRpb24iP2U9ZS5jaGVjayhiLmlzby5kdXJhdGlvbigpKTppPT09ImlwdjQiP2U9ZS5jaGVjayhiLmlwdjQoKSk6aT09PSJpcHY2Ij9lPWUuY2hlY2soYi5pcHY2KCkpOmk9PT0ibWFjIj9lPWUuY2hlY2soYi5tYWMoKSk6aT09PSJjaWRyIj9lPWUuY2hlY2soYi5jaWRydjQoKSk6aT09PSJjaWRyLXY2Ij9lPWUuY2hlY2soYi5jaWRydjYoKSk6aT09PSJiYXNlNjQiP2U9ZS5jaGVjayhiLmJhc2U2NCgpKTppPT09ImJhc2U2NHVybCI/ZT1lLmNoZWNrKGIuYmFzZTY0dXJsKCkpOmk9PT0iZTE2NCI/ZT1lLmNoZWNrKGIuZTE2NCgpKTppPT09Imp3dCI/ZT1lLmNoZWNrKGIuand0KCkpOmk9PT0iZW1vamkiP2U9ZS5jaGVjayhiLmVtb2ppKCkpOmk9PT0ibmFub2lkIj9lPWUuY2hlY2soYi5uYW5vaWQoKSk6aT09PSJjdWlkIj9lPWUuY2hlY2soYi5jdWlkKCkpOmk9PT0iY3VpZDIiP2U9ZS5jaGVjayhiLmN1aWQyKCkpOmk9PT0idWxpZCI/ZT1lLmNoZWNrKGIudWxpZCgpKTppPT09InhpZCI/ZT1lLmNoZWNrKGIueGlkKCkpOmk9PT0ia3N1aWQiJiYoZT1lLmNoZWNrKGIua3N1aWQoKSkpfXR5cGVvZiB0Lm1pbkxlbmd0aD09Im51bWJlciImJihlPWUubWluKHQubWluTGVuZ3RoKSksdHlwZW9mIHQubWF4TGVuZ3RoPT0ibnVtYmVyIiYmKGU9ZS5tYXgodC5tYXhMZW5ndGgpKSx0LnBhdHRlcm4mJihlPWUucmVnZXgobmV3IFJlZ0V4cCh0LnBhdHRlcm4pKSksbz1lO2JyZWFrfWNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOntsZXQgZT1yPT09ImludGVnZXIiP2IubnVtYmVyKCkuaW50KCk6Yi5udW1iZXIoKTt0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5taW4odC5taW5pbXVtKSksdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubWF4KHQubWF4aW11bSkpLHR5cGVvZiB0LmV4Y2x1c2l2ZU1pbmltdW09PSJudW1iZXIiP2U9ZS5ndCh0LmV4Y2x1c2l2ZU1pbmltdW0pOnQuZXhjbHVzaXZlTWluaW11bT09PSEwJiZ0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5ndCh0Lm1pbmltdW0pKSx0eXBlb2YgdC5leGNsdXNpdmVNYXhpbXVtPT0ibnVtYmVyIj9lPWUubHQodC5leGNsdXNpdmVNYXhpbXVtKTp0LmV4Y2x1c2l2ZU1heGltdW09PT0hMCYmdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubHQodC5tYXhpbXVtKSksdHlwZW9mIHQubXVsdGlwbGVPZj09Im51bWJlciImJihlPWUubXVsdGlwbGVPZih0Lm11bHRpcGxlT2YpKSxvPWU7YnJlYWt9Y2FzZSJib29sZWFuIjp7bz1iLmJvb2xlYW4oKTticmVha31jYXNlIm51bGwiOntvPWIubnVsbCgpO2JyZWFrfWNhc2Uib2JqZWN0Ijp7Y29uc3QgZT17fSxpPXQucHJvcGVydGllc3x8e30sYT1uZXcgU2V0KHQucmVxdWlyZWR8fFtdKTtmb3IoY29uc3RbYyx1XW9mIE9iamVjdC5lbnRyaWVzKGkpKXtjb25zdCBsPW5lKHUsbik7ZVtjXT1hLmhhcyhjKT9sOmwub3B0aW9uYWwoKX1pZih0LnByb3BlcnR5TmFtZXMpe2NvbnN0IGM9bmUodC5wcm9wZXJ0eU5hbWVzLG4pLHU9dC5hZGRpdGlvbmFsUHJvcGVydGllcyYmdHlwZW9mIHQuYWRkaXRpb25hbFByb3BlcnRpZXM9PSJvYmplY3QiP25lKHQuYWRkaXRpb25hbFByb3BlcnRpZXMsbik6Yi5hbnkoKTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg9PT0wKXtvPWIucmVjb3JkKGMsdSk7YnJlYWt9Y29uc3QgbD1iLm9iamVjdChlKS5wYXNzdGhyb3VnaCgpLGc9Yi5sb29zZVJlY29yZChjLHUpO289Yi5pbnRlcnNlY3Rpb24obCxnKTticmVha31pZih0LnBhdHRlcm5Qcm9wZXJ0aWVzKXtjb25zdCBjPXQucGF0dGVyblByb3BlcnRpZXMsdT1PYmplY3Qua2V5cyhjKSxsPVtdO2Zvcihjb25zdCB2IG9mIHUpe2NvbnN0ICQ9bmUoY1t2XSxuKSx5PWIuc3RyaW5nKCkucmVnZXgobmV3IFJlZ0V4cCh2KSk7bC5wdXNoKGIubG9vc2VSZWNvcmQoeSwkKSl9Y29uc3QgZz1bXTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmZy5wdXNoKGIub2JqZWN0KGUpLnBhc3N0aHJvdWdoKCkpLGcucHVzaCguLi5sKSxnLmxlbmd0aD09PTApbz1iLm9iamVjdCh7fSkucGFzc3Rocm91Z2goKTtlbHNlIGlmKGcubGVuZ3RoPT09MSlvPWdbMF07ZWxzZXtsZXQgdj1iLmludGVyc2VjdGlvbihnWzBdLGdbMV0pO2ZvcihsZXQgJD0yOyQ8Zy5sZW5ndGg7JCsrKXY9Yi5pbnRlcnNlY3Rpb24odixnWyRdKTtvPXZ9YnJlYWt9Y29uc3Qgcz1iLm9iamVjdChlKTt0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT09ITE/bz1zLnN0cmljdCgpOnR5cGVvZiB0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT0ib2JqZWN0Ij9vPXMuY2F0Y2hhbGwobmUodC5hZGRpdGlvbmFsUHJvcGVydGllcyxuKSk6bz1zLnBhc3N0aHJvdWdoKCk7YnJlYWt9Y2FzZSJhcnJheSI6e2NvbnN0IGU9dC5wcmVmaXhJdGVtcyxpPXQuaXRlbXM7aWYoZSYmQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgYT1lLm1hcChjPT5uZShjLG4pKSxzPWkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSk/bmUoaSxuKTp2b2lkIDA7cz9vPWIudHVwbGUoYSkucmVzdChzKTpvPWIudHVwbGUoYSksdHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWluTGVuZ3RoKHQubWluSXRlbXMpKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWF4TGVuZ3RoKHQubWF4SXRlbXMpKSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtjb25zdCBhPWkubWFwKGM9Pm5lKGMsbikpLHM9dC5hZGRpdGlvbmFsSXRlbXMmJnR5cGVvZiB0LmFkZGl0aW9uYWxJdGVtcz09Im9iamVjdCI/bmUodC5hZGRpdGlvbmFsSXRlbXMsbik6dm9pZCAwO3M/bz1iLnR1cGxlKGEpLnJlc3Qocyk6bz1iLnR1cGxlKGEpLHR5cGVvZiB0Lm1pbkl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1pbkxlbmd0aCh0Lm1pbkl0ZW1zKSkpLHR5cGVvZiB0Lm1heEl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1heExlbmd0aCh0Lm1heEl0ZW1zKSkpfWVsc2UgaWYoaSE9PXZvaWQgMCl7Y29uc3QgYT1uZShpLG4pO2xldCBzPWIuYXJyYXkoYSk7dHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYocz1zLm1pbih0Lm1pbkl0ZW1zKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYocz1zLm1heCh0Lm1heEl0ZW1zKSksbz1zfWVsc2Ugbz1iLmFycmF5KGIuYW55KCkpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3J9YCl9cmV0dXJuIG99ZnVuY3Rpb24gbmUodCxuKXtpZih0eXBlb2YgdD09ImJvb2xlYW4iKXJldHVybiB0P2IuYW55KCk6Yi5uZXZlcigpO2xldCByPXVtKHQsbik7Y29uc3Qgbz10LnR5cGV8fHQuZW51bSE9PXZvaWQgMHx8dC5jb25zdCE9PXZvaWQgMDtpZih0LmFueU9mJiZBcnJheS5pc0FycmF5KHQuYW55T2YpKXtjb25zdCBzPXQuYW55T2YubWFwKHU9Pm5lKHUsbikpLGM9Yi51bmlvbihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQub25lT2YmJkFycmF5LmlzQXJyYXkodC5vbmVPZikpe2NvbnN0IHM9dC5vbmVPZi5tYXAodT0+bmUodSxuKSksYz1iLnhvcihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQuYWxsT2YmJkFycmF5LmlzQXJyYXkodC5hbGxPZikpaWYodC5hbGxPZi5sZW5ndGg9PT0wKXI9bz9yOmIuYW55KCk7ZWxzZXtsZXQgcz1vP3I6bmUodC5hbGxPZlswXSxuKTtjb25zdCBjPW8/MDoxO2ZvcihsZXQgdT1jO3U8dC5hbGxPZi5sZW5ndGg7dSsrKXM9Yi5pbnRlcnNlY3Rpb24ocyxuZSh0LmFsbE9mW3VdLG4pKTtyPXN9dC5udWxsYWJsZT09PSEwJiZuLnZlcnNpb249PT0ib3BlbmFwaS0zLjAiJiYocj1iLm51bGxhYmxlKHIpKSx0LnJlYWRPbmx5PT09ITAmJihyPWIucmVhZG9ubHkocikpLHQuZGVmYXVsdCE9PXZvaWQgMCYmKHI9ci5kZWZhdWx0KHQuZGVmYXVsdCkpO2NvbnN0IGU9e30saT1bIiRpZCIsImlkIiwiJGNvbW1lbnQiLCIkYW5jaG9yIiwiJHZvY2FidWxhcnkiLCIkZHluYW1pY1JlZiIsIiRkeW5hbWljQW5jaG9yIl07Zm9yKGNvbnN0IHMgb2YgaSlzIGluIHQmJihlW3NdPXRbc10pO2NvbnN0IGE9WyJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSJdO2Zvcihjb25zdCBzIG9mIGEpcyBpbiB0JiYoZVtzXT10W3NdKTtmb3IoY29uc3QgcyBvZiBPYmplY3Qua2V5cyh0KSlvdi5oYXMocyl8fChlW3NdPXRbc10pO3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmbi5yZWdpc3RyeS5hZGQocixlKSx0LmRlc2NyaXB0aW9uJiYocj1yLmRlc2NyaWJlKHQuZGVzY3JpcHRpb24pKSxyfWZ1bmN0aW9uIGxtKHQsbil7aWYodHlwZW9mIHQ9PSJib29sZWFuIilyZXR1cm4gdD9iLmFueSgpOmIubmV2ZXIoKTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoImZyb21KU09OU2NoZW1hIGlucHV0IGlzIG5vdCB2YWxpZCBKU09OIChwb3NzaWJseSBjeWNsaWMpOyB1c2UgJGRlZnMvJHJlZiBmb3IgcmVjdXJzaXZlIHNjaGVtYXMiKX1jb25zdCBvPWF2KHIsbj8uZGVmYXVsdFRhcmdldCksZT1yLiRkZWZzfHxyLmRlZmluaXRpb25zfHx7fSxpPXt2ZXJzaW9uOm8sZGVmczplLHJlZnM6bmV3IE1hcCxwcm9jZXNzaW5nOm5ldyBTZXQscm9vdFNjaGVtYTpyLHJlZ2lzdHJ5Om4/LnJlZ2lzdHJ5Pz9jZX07cmV0dXJuIG5lKHIsaSl9ZnVuY3Rpb24gY3YodCl7cmV0dXJuIFVsKG90LHQpfWZ1bmN0aW9uIHV2KHQpe3JldHVybiBDbChzdCx0KX1mdW5jdGlvbiBsdih0KXtyZXR1cm4gSGwoY3QsdCl9ZnVuY3Rpb24gZHYodCl7cmV0dXJuIEJsKHV0LHQpfWZ1bmN0aW9uIG12KHQpe3JldHVybiBpZCgkbix0KX1jb25zdCBkbT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYmlnaW50OmR2LGJvb2xlYW46bHYsZGF0ZTptdixudW1iZXI6dXYsc3RyaW5nOmN2fSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO0soemwoKSk7Y29uc3QgUnM9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLCRicmFuZDpnaSwkaW5wdXQ6V2ksJG91dHB1dDpIaSxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLFpvZEFueTp2cixab2RBcnJheTpicixab2RCYXNlNjQ6ZG4sWm9kQmFzZTY0VVJMOm1uLFpvZEJpZ0ludDp1dCxab2RCaWdJbnRGb3JtYXQ6Z24sWm9kQm9vbGVhbjpjdCxab2RDSURSdjQ6dW4sWm9kQ0lEUnY2OmxuLFpvZENVSUQ6dG4sWm9kQ1VJRDI6bm4sWm9kQ2F0Y2g6THIsWm9kQ29kZWM6ZnQsWm9kQ3VzdG9tOmd0LFpvZEN1c3RvbVN0cmluZ0Zvcm1hdDpNZSxab2REYXRlOiRuLFpvZERlZmF1bHQ6RHIsWm9kRGlzY3JpbWluYXRlZFVuaW9uOmtyLFpvZEUxNjQ6cG4sWm9kRW1haWw6WXQsWm9kRW1vamk6UXQsWm9kRW51bTpDZSxab2RFcnJvcjpvbSxab2RFeGFjdE9wdGlvbmFsOlVyLFpvZEZpbGU6anIsZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCgpe3JldHVybiBNbn0sWm9kRnVuY3Rpb246R3IsWm9kR1VJRDpYZSxab2RJUHY0OnNuLFpvZElQdjY6Y24sWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLFpvZEludGVyc2VjdGlvbjpTcixab2RJc3N1ZUNvZGU6YW0sWm9kSldUOmZuLFpvZEtTVUlEOmFuLFpvZExhenk6QnIsWm9kTGl0ZXJhbDpUcixab2RNQUM6bXIsWm9kTWFwOnpyLFpvZE5hTjpxcixab2ROYW5vSUQ6ZW4sWm9kTmV2ZXI6JHIsWm9kTm9uT3B0aW9uYWw6a24sWm9kTnVsbDpncixab2ROdWxsYWJsZTpOcixab2ROdW1iZXI6c3QsWm9kTnVtYmVyRm9ybWF0OlRlLFpvZE9iamVjdDpsdCxab2RPcHRpb25hbDp5bixab2RQaXBlOnB0LFpvZFByZWZhdWx0OlpyLFpvZFByZXByb2Nlc3M6RnIsWm9kUHJvbWlzZTpLcixab2RSZWFkb25seTpKcixab2RSZWFsRXJyb3I6c2UsWm9kUmVjb3JkOlJlLFpvZFNldDp4cixab2RTdHJpbmc6b3QsWm9kU3RyaW5nRm9ybWF0OkEsWm9kU3VjY2VzczpBcixab2RTeW1ib2w6cHIsWm9kVGVtcGxhdGVMaXRlcmFsOldyLFpvZFRyYW5zZm9ybTpPcixab2RUdXBsZTp3cixab2RUeXBlOmosWm9kVUxJRDpybixab2RVUkw6YXQsWm9kVVVJRDpoZSxab2RVbmRlZmluZWQ6ZnIsWm9kVW5pb246ZHQsWm9kVW5rbm93bjpocixab2RWb2lkOl9yLFpvZFhJRDpvbixab2RYb3I6eXIsX1pvZFN0cmluZzpYdCxfZGVmYXVsdDpFcixfZnVuY3Rpb246ZXQsYW55OmhuLGFycmF5OkksYmFzZTY0OlFvLGJhc2U2NHVybDplYSxiaWdpbnQ6ZGEsYm9vbGVhbjpaLGNhdGNoOk1yLGNoZWNrOk5hLGNpZHJ2NDpYbyxjaWRydjY6WW8sY2xvbmU6ZGUsY29kZWM6amEsY29lcmNlOmRtLGNvbmZpZzpLLGNvcmU6UWQsY3VpZDpGbyxjdWlkMjpKbyxjdXN0b206WHIsZGF0ZTp2YSxkZWNvZGU6em8sZGVjb2RlQXN5bmM6VG8sZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLHB2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkYnJhbmQ6Z2ksJGlucHV0OldpLCRvdXRwdXQ6SGksTkVWRVI6ZmksVGltZVByZWNpc2lvbjpmbyxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXJyb3I6b20sWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKXtyZXR1cm4gTW59LFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZElTT0RhdGU6dXIsWm9kSVNPRGF0ZVRpbWU6Y3IsWm9kSVNPRHVyYXRpb246ZHIsWm9kSVNPVGltZTpscixab2RJbnRlcnNlY3Rpb246U3IsWm9kSXNzdWVDb2RlOmFtLFpvZEpXVDpmbixab2RLU1VJRDphbixab2RMYXp5OkJyLFpvZExpdGVyYWw6VHIsWm9kTUFDOm1yLFpvZE1hcDp6cixab2ROYU46cXIsWm9kTmFub0lEOmVuLFpvZE5ldmVyOiRyLFpvZE5vbk9wdGlvbmFsOmtuLFpvZE51bGw6Z3IsWm9kTnVsbGFibGU6TnIsWm9kTnVtYmVyOnN0LFpvZE51bWJlckZvcm1hdDpUZSxab2RPYmplY3Q6bHQsWm9kT3B0aW9uYWw6eW4sWm9kUGlwZTpwdCxab2RQcmVmYXVsdDpacixab2RQcmVwcm9jZXNzOkZyLFpvZFByb21pc2U6S3IsWm9kUmVhZG9ubHk6SnIsWm9kUmVhbEVycm9yOnNlLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNsb25lOmRlLGNvZGVjOmphLGNvZXJjZTpkbSxjb25maWc6Syxjb3JlOlFkLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVjb2RlOnpvLGRlY29kZUFzeW5jOlRvLGRlZmF1bHQ6UnMsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hLHo6UnN9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksT2U9ImlvLm1vZGVsY29udGV4dHByb3RvY29sL3JlbGF0ZWQtdGFzayIsZWk9IjIuMCIsVj1Ycih0PT50IT09bnVsbCYmKHR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpKSxtbT1VKFttKCksVCgpLmludCgpXSkscG09bSgpO1koe3R0bDpUKCkub3B0aW9uYWwoKSxwb2xsSW50ZXJ2YWw6VCgpLm9wdGlvbmFsKCl9KTtjb25zdCBmdj1mKHt0dGw6VCgpLm9wdGlvbmFsKCl9KSxndj1mKHt0YXNrSWQ6bSgpfSksQWE9WSh7cHJvZ3Jlc3NUb2tlbjptbS5vcHRpb25hbCgpLFtPZV06Z3Yub3B0aW9uYWwoKX0pLHBlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx3bj1wZS5leHRlbmQoe3Rhc2s6ZnYub3B0aW9uYWwoKX0pLHZ2PXQ9PnduLnNhZmVQYXJzZSh0KS5zdWNjZXNzLGVlPWYoe21ldGhvZDptKCkscGFyYW1zOnBlLmxvb3NlKCkub3B0aW9uYWwoKX0pLGdlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx2ZT1mKHttZXRob2Q6bSgpLHBhcmFtczpnZS5sb29zZSgpLm9wdGlvbmFsKCl9KSx0ZT1ZKHtfbWV0YTpBYS5vcHRpb25hbCgpfSksSW49VShbbSgpLFQoKS5pbnQoKV0pLGZtPWYoe2pzb25ycGM6cChlaSksaWQ6SW4sLi4uZWUuc2hhcGV9KS5zdHJpY3QoKSxDcz10PT5mbS5zYWZlUGFyc2UodCkuc3VjY2VzcyxnbT1mKHtqc29ucnBjOnAoZWkpLC4uLnZlLnNoYXBlfSkuc3RyaWN0KCksaHY9dD0+Z20uc2FmZVBhcnNlKHQpLnN1Y2Nlc3MsTGE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbixyZXN1bHQ6dGV9KS5zdHJpY3QoKSxabj10PT5MYS5zYWZlUGFyc2UodCkuc3VjY2Vzczt2YXIgUjsoZnVuY3Rpb24odCl7dFt0LkNvbm5lY3Rpb25DbG9zZWQ9LTMyZTNdPSJDb25uZWN0aW9uQ2xvc2VkIix0W3QuUmVxdWVzdFRpbWVvdXQ9LTMyMDAxXT0iUmVxdWVzdFRpbWVvdXQiLHRbdC5QYXJzZUVycm9yPS0zMjcwMF09IlBhcnNlRXJyb3IiLHRbdC5JbnZhbGlkUmVxdWVzdD0tMzI2MDBdPSJJbnZhbGlkUmVxdWVzdCIsdFt0Lk1ldGhvZE5vdEZvdW5kPS0zMjYwMV09Ik1ldGhvZE5vdEZvdW5kIix0W3QuSW52YWxpZFBhcmFtcz0tMzI2MDJdPSJJbnZhbGlkUGFyYW1zIix0W3QuSW50ZXJuYWxFcnJvcj0tMzI2MDNdPSJJbnRlcm5hbEVycm9yIix0W3QuVXJsRWxpY2l0YXRpb25SZXF1aXJlZD0tMzIwNDJdPSJVcmxFbGljaXRhdGlvblJlcXVpcmVkIn0pKFJ8fChSPXt9KSk7Y29uc3QgTWE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbi5vcHRpb25hbCgpLGVycm9yOmYoe2NvZGU6VCgpLmludCgpLG1lc3NhZ2U6bSgpLGRhdGE6RSgpLm9wdGlvbmFsKCl9KX0pLnN0cmljdCgpLCR2PXQ9Pk1hLnNhZmVQYXJzZSh0KS5zdWNjZXNzLF92PVUoW2ZtLGdtLExhLE1hXSk7VShbTGEsTWFdKTtjb25zdCBxYT10ZS5zdHJpY3QoKSxidj1nZS5leHRlbmQoe3JlcXVlc3RJZDpJbi5vcHRpb25hbCgpLHJlYXNvbjptKCkub3B0aW9uYWwoKX0pLEZhPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIikscGFyYW1zOmJ2fSkseXY9Zih7c3JjOm0oKSxtaW1lVHlwZTptKCkub3B0aW9uYWwoKSxzaXplczpJKG0oKSkub3B0aW9uYWwoKSx0aGVtZTpRKFsibGlnaHQiLCJkYXJrIl0pLm9wdGlvbmFsKCl9KSx6bj1mKHtpY29uczpJKHl2KS5vcHRpb25hbCgpfSksdHQ9Zih7bmFtZTptKCksdGl0bGU6bSgpLm9wdGlvbmFsKCl9KSx0aT10dC5leHRlbmQoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHZlcnNpb246bSgpLHdlYnNpdGVVcmw6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCl9KSxrdj1tdChmKHthcHBseURlZmF1bHRzOlooKS5vcHRpb25hbCgpfSksUChtKCksRSgpKSksU3Y9U24odD0+dCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KSYmT2JqZWN0LmtleXModCkubGVuZ3RoPT09MD97Zm9ybTp7fX06dCxtdChmKHtmb3JtOmt2Lm9wdGlvbmFsKCksdXJsOlYub3B0aW9uYWwoKX0pLFAobSgpLEUoKSkub3B0aW9uYWwoKSkpLHd2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7c2FtcGxpbmc6WSh7Y3JlYXRlTWVzc2FnZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLGVsaWNpdGF0aW9uOlkoe2NyZWF0ZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLEl2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7dG9vbHM6WSh7Y2FsbDpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLHp2PWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxWKS5vcHRpb25hbCgpLHNhbXBsaW5nOmYoe2NvbnRleHQ6Vi5vcHRpb25hbCgpLHRvb2xzOlYub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksZWxpY2l0YXRpb246U3Yub3B0aW9uYWwoKSxyb290czpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksdGFza3M6d3Yub3B0aW9uYWwoKSxleHRlbnNpb25zOlAobSgpLFYpLm9wdGlvbmFsKCl9KSx4dj1wZS5leHRlbmQoe3Byb3RvY29sVmVyc2lvbjptKCksY2FwYWJpbGl0aWVzOnp2LGNsaWVudEluZm86dGl9KSxUdj1lZS5leHRlbmQoe21ldGhvZDpwKCJpbml0aWFsaXplIikscGFyYW1zOnh2fSksanY9Zih7ZXhwZXJpbWVudGFsOlAobSgpLFYpLm9wdGlvbmFsKCksbG9nZ2luZzpWLm9wdGlvbmFsKCksY29tcGxldGlvbnM6Vi5vcHRpb25hbCgpLHByb21wdHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHJlc291cmNlczpmKHtzdWJzY3JpYmU6WigpLm9wdGlvbmFsKCksbGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHRvb2xzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSx0YXNrczpJdi5vcHRpb25hbCgpLGV4dGVuc2lvbnM6UChtKCksVikub3B0aW9uYWwoKX0pLE92PXRlLmV4dGVuZCh7cHJvdG9jb2xWZXJzaW9uOm0oKSxjYXBhYmlsaXRpZXM6anYsc2VydmVySW5mbzp0aSxpbnN0cnVjdGlvbnM6bSgpLm9wdGlvbmFsKCl9KSxVdj12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxuaT1lZS5leHRlbmQoe21ldGhvZDpwKCJwaW5nIikscGFyYW1zOnBlLm9wdGlvbmFsKCl9KSxQdj1mKHtwcm9ncmVzczpUKCksdG90YWw6cShUKCkpLG1lc3NhZ2U6cShtKCkpfSksTnY9Zih7Li4uZ2Uuc2hhcGUsLi4uUHYuc2hhcGUscHJvZ3Jlc3NUb2tlbjptbX0pLEphPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcHJvZ3Jlc3MiKSxwYXJhbXM6TnZ9KSxEdj1wZS5leHRlbmQoe2N1cnNvcjpwbS5vcHRpb25hbCgpfSkseG49ZWUuZXh0ZW5kKHtwYXJhbXM6RHYub3B0aW9uYWwoKX0pLFRuPXRlLmV4dGVuZCh7bmV4dEN1cnNvcjpwbS5vcHRpb25hbCgpfSksRXY9UShbIndvcmtpbmciLCJpbnB1dF9yZXF1aXJlZCIsImNvbXBsZXRlZCIsImZhaWxlZCIsImNhbmNlbGxlZCJdKSxqbj1mKHt0YXNrSWQ6bSgpLHN0YXR1czpFdix0dGw6VShbVCgpLHZuKCldKSxjcmVhdGVkQXQ6bSgpLGxhc3RVcGRhdGVkQXQ6bSgpLHBvbGxJbnRlcnZhbDpxKFQoKSksc3RhdHVzTWVzc2FnZTpxKG0oKSl9KSxIYT10ZS5leHRlbmQoe3Rhc2s6am59KSxadj1nZS5tZXJnZShqbikscW49dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy90YXNrcy9zdGF0dXMiKSxwYXJhbXM6WnZ9KSxXYT1lZS5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9nZXQiKSxwYXJhbXM6cGUuZXh0ZW5kKHt0YXNrSWQ6bSgpfSl9KSxCYT10ZS5tZXJnZShqbiksVmE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvcmVzdWx0IikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSk7dGUubG9vc2UoKTtjb25zdCBLYT14bi5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9saXN0Iil9KSxHYT1Ubi5leHRlbmQoe3Rhc2tzOkkoam4pfSksWGE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvY2FuY2VsIikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSksUnY9dGUubWVyZ2Uoam4pLHZtPWYoe3VyaTptKCksbWltZVR5cGU6cShtKCkpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLGhtPXZtLmV4dGVuZCh7dGV4dDptKCl9KSxZYT1tKCkucmVmaW5lKHQ9Pnt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fSx7bWVzc2FnZToiSW52YWxpZCBCYXNlNjQgc3RyaW5nIn0pLCRtPXZtLmV4dGVuZCh7YmxvYjpZYX0pLE9uPVEoWyJ1c2VyIiwiYXNzaXN0YW50Il0pLHZ0PWYoe2F1ZGllbmNlOkkoT24pLm9wdGlvbmFsKCkscHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxsYXN0TW9kaWZpZWQ6X28oe29mZnNldDohMH0pLm9wdGlvbmFsKCl9KSxfbT1mKHsuLi50dC5zaGFwZSwuLi56bi5zaGFwZSx1cmk6bSgpLGRlc2NyaXB0aW9uOnEobSgpKSxtaW1lVHlwZTpxKG0oKSksc2l6ZTpxKFQoKSksYW5ub3RhdGlvbnM6dnQub3B0aW9uYWwoKSxfbWV0YTpxKFkoe30pKX0pLEN2PWYoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHVyaVRlbXBsYXRlOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSksbWltZVR5cGU6cShtKCkpLGFubm90YXRpb25zOnZ0Lm9wdGlvbmFsKCksX21ldGE6cShZKHt9KSl9KSxBdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvbGlzdCIpfSksYm09VG4uZXh0ZW5kKHtyZXNvdXJjZXM6SShfbSl9KSxMdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvdGVtcGxhdGVzL2xpc3QiKX0pLE12PVRuLmV4dGVuZCh7cmVzb3VyY2VUZW1wbGF0ZXM6SShDdil9KSxRYT1wZS5leHRlbmQoe3VyaTptKCl9KSxxdj1RYSxGdj1lZS5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvcmVhZCIpLHBhcmFtczpxdn0pLHltPXRlLmV4dGVuZCh7Y29udGVudHM6SShVKFtobSwkbV0pKX0pLEp2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSksSHY9UWEsV3Y9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL3N1YnNjcmliZSIpLHBhcmFtczpIdn0pLEJ2PVFhLFZ2PWVlLmV4dGVuZCh7bWV0aG9kOnAoInJlc291cmNlcy91bnN1YnNjcmliZSIpLHBhcmFtczpCdn0pLEt2PWdlLmV4dGVuZCh7dXJpOm0oKX0pLEd2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL3VwZGF0ZWQiKSxwYXJhbXM6S3Z9KSxYdj1mKHtuYW1lOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSkscmVxdWlyZWQ6cShaKCkpfSksWXY9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246cShtKCkpLGFyZ3VtZW50czpxKEkoWHYpKSxfbWV0YTpxKFkoe30pKX0pLFF2PXhuLmV4dGVuZCh7bWV0aG9kOnAoInByb21wdHMvbGlzdCIpfSksZWg9VG4uZXh0ZW5kKHtwcm9tcHRzOkkoWXYpfSksdGg9cGUuZXh0ZW5kKHtuYW1lOm0oKSxhcmd1bWVudHM6UChtKCksbSgpKS5vcHRpb25hbCgpfSksbmg9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicHJvbXB0cy9nZXQiKSxwYXJhbXM6dGh9KSxlcz1mKHt0eXBlOnAoInRleHQiKSx0ZXh0Om0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHRzPWYoe3R5cGU6cCgiaW1hZ2UiKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLG5zPWYoe3R5cGU6cCgiYXVkaW8iKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHJoPWYoe3R5cGU6cCgidG9vbF91c2UiKSxuYW1lOm0oKSxpZDptKCksaW5wdXQ6UChtKCksRSgpKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxrbT1mKHt0eXBlOnAoInJlc291cmNlIikscmVzb3VyY2U6VShbaG0sJG1dKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLFNtPV9tLmV4dGVuZCh7dHlwZTpwKCJyZXNvdXJjZV9saW5rIil9KSxVbj1VKFtlcyx0cyxucyxTbSxrbV0pLGloPWYoe3JvbGU6T24sY29udGVudDpVbn0pLG9oPXRlLmV4dGVuZCh7ZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWVzc2FnZXM6SShpaCl9KSxhaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Byb21wdHMvbGlzdF9jaGFuZ2VkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxzaD1mKHt0aXRsZTptKCkub3B0aW9uYWwoKSxyZWFkT25seUhpbnQ6WigpLm9wdGlvbmFsKCksZGVzdHJ1Y3RpdmVIaW50OlooKS5vcHRpb25hbCgpLGlkZW1wb3RlbnRIaW50OlooKS5vcHRpb25hbCgpLG9wZW5Xb3JsZEhpbnQ6WigpLm9wdGlvbmFsKCl9KSxjaD1mKHt0YXNrU3VwcG9ydDpRKFsicmVxdWlyZWQiLCJvcHRpb25hbCIsImZvcmJpZGRlbiJdKS5vcHRpb25hbCgpfSkscnM9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksaW5wdXRTY2hlbWE6Zih7dHlwZTpwKCJvYmplY3QiKSxwcm9wZXJ0aWVzOlAobSgpLFYpLm9wdGlvbmFsKCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChFKCkpLG91dHB1dFNjaGVtYTpmKHt0eXBlOnAoIm9iamVjdCIpLHByb3BlcnRpZXM6UChtKCksVikub3B0aW9uYWwoKSxyZXF1aXJlZDpJKG0oKSkub3B0aW9uYWwoKX0pLmNhdGNoYWxsKEUoKSkub3B0aW9uYWwoKSxhbm5vdGF0aW9uczpzaC5vcHRpb25hbCgpLGV4ZWN1dGlvbjpjaC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHdtPXhuLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2xpc3QiKX0pLHVoPVRuLmV4dGVuZCh7dG9vbHM6SShycyl9KSxyaT10ZS5leHRlbmQoe2NvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6UChtKCksRSgpKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCl9KTtyaS5vcih0ZS5leHRlbmQoe3Rvb2xSZXN1bHQ6RSgpfSkpO2NvbnN0IGxoPXduLmV4dGVuZCh7bmFtZTptKCksYXJndW1lbnRzOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEltPWVlLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2NhbGwiKSxwYXJhbXM6bGh9KSxkaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Rvb2xzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7Zih7YXV0b1JlZnJlc2g6WigpLmRlZmF1bHQoITApLGRlYm91bmNlTXM6VCgpLmludCgpLm5vbm5lZ2F0aXZlKCkuZGVmYXVsdCgzMDApfSk7Y29uc3Qgem09UShbImRlYnVnIiwiaW5mbyIsIm5vdGljZSIsIndhcm5pbmciLCJlcnJvciIsImNyaXRpY2FsIiwiYWxlcnQiLCJlbWVyZ2VuY3kiXSksbWg9cGUuZXh0ZW5kKHtsZXZlbDp6bX0pLHBoPWVlLmV4dGVuZCh7bWV0aG9kOnAoImxvZ2dpbmcvc2V0TGV2ZWwiKSxwYXJhbXM6bWh9KSxmaD1nZS5leHRlbmQoe2xldmVsOnptLGxvZ2dlcjptKCkub3B0aW9uYWwoKSxkYXRhOkUoKX0pLGdoPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvbWVzc2FnZSIpLHBhcmFtczpmaH0pLHZoPWYoe25hbWU6bSgpLm9wdGlvbmFsKCl9KSxoaD1mKHtoaW50czpJKHZoKS5vcHRpb25hbCgpLGNvc3RQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpLHNwZWVkUHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxpbnRlbGxpZ2VuY2VQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpfSksJGg9Zih7bW9kZTpRKFsiYXV0byIsInJlcXVpcmVkIiwibm9uZSJdKS5vcHRpb25hbCgpfSksX2g9Zih7dHlwZTpwKCJ0b29sX3Jlc3VsdCIpLHRvb2xVc2VJZDptKCkuZGVzY3JpYmUoIlRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgdG9vbCBjYWxsLiIpLGNvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6Zih7fSkubG9vc2UoKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCksX21ldGE6UChtKCksRSgpKS5vcHRpb25hbCgpfSksYmg9X24oInR5cGUiLFtlcyx0cyxuc10pLEZuPV9uKCJ0eXBlIixbZXMsdHMsbnMscmgsX2hdKSx5aD1mKHtyb2xlOk9uLGNvbnRlbnQ6VShbRm4sSShGbildKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxraD13bi5leHRlbmQoe21lc3NhZ2VzOkkoeWgpLG1vZGVsUHJlZmVyZW5jZXM6aGgub3B0aW9uYWwoKSxzeXN0ZW1Qcm9tcHQ6bSgpLm9wdGlvbmFsKCksaW5jbHVkZUNvbnRleHQ6UShbIm5vbmUiLCJ0aGlzU2VydmVyIiwiYWxsU2VydmVycyJdKS5vcHRpb25hbCgpLHRlbXBlcmF0dXJlOlQoKS5vcHRpb25hbCgpLG1heFRva2VuczpUKCkuaW50KCksc3RvcFNlcXVlbmNlczpJKG0oKSkub3B0aW9uYWwoKSxtZXRhZGF0YTpWLm9wdGlvbmFsKCksdG9vbHM6SShycykub3B0aW9uYWwoKSx0b29sQ2hvaWNlOiRoLm9wdGlvbmFsKCl9KSxTaD1lZS5leHRlbmQoe21ldGhvZDpwKCJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIikscGFyYW1zOmtofSkseG09dGUuZXh0ZW5kKHttb2RlbDptKCksc3RvcFJlYXNvbjpxKFEoWyJlbmRUdXJuIiwic3RvcFNlcXVlbmNlIiwibWF4VG9rZW5zIl0pLm9yKG0oKSkpLHJvbGU6T24sY29udGVudDpiaH0pLFRtPXRlLmV4dGVuZCh7bW9kZWw6bSgpLHN0b3BSZWFzb246cShRKFsiZW5kVHVybiIsInN0b3BTZXF1ZW5jZSIsIm1heFRva2VucyIsInRvb2xVc2UiXSkub3IobSgpKSkscm9sZTpPbixjb250ZW50OlUoW0ZuLEkoRm4pXSl9KSx3aD1mKHt0eXBlOnAoImJvb2xlYW4iKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxkZWZhdWx0OlooKS5vcHRpb25hbCgpfSksSWg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxtaW5MZW5ndGg6VCgpLm9wdGlvbmFsKCksbWF4TGVuZ3RoOlQoKS5vcHRpb25hbCgpLGZvcm1hdDpRKFsiZW1haWwiLCJ1cmkiLCJkYXRlIiwiZGF0ZS10aW1lIl0pLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLHpoPWYoe3R5cGU6UShbIm51bWJlciIsImludGVnZXIiXSksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWluaW11bTpUKCkub3B0aW9uYWwoKSxtYXhpbXVtOlQoKS5vcHRpb25hbCgpLGRlZmF1bHQ6VCgpLm9wdGlvbmFsKCl9KSx4aD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLGVudW06SShtKCkpLGRlZmF1bHQ6bSgpLm9wdGlvbmFsKCl9KSxUaD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG9uZU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKSxkZWZhdWx0Om0oKS5vcHRpb25hbCgpfSksamg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxlbnVtOkkobSgpKSxlbnVtTmFtZXM6SShtKCkpLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLE9oPVUoW3hoLFRoXSksVWg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe3R5cGU6cCgic3RyaW5nIiksZW51bTpJKG0oKSl9KSxkZWZhdWx0OkkobSgpKS5vcHRpb25hbCgpfSksUGg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe2FueU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKX0pLGRlZmF1bHQ6SShtKCkpLm9wdGlvbmFsKCl9KSxOaD1VKFtVaCxQaF0pLERoPVUoW2poLE9oLE5oXSksRWg9VShbRGgsd2gsSWgsemhdKSxaaD13bi5leHRlbmQoe21vZGU6cCgiZm9ybSIpLm9wdGlvbmFsKCksbWVzc2FnZTptKCkscmVxdWVzdGVkU2NoZW1hOmYoe3R5cGU6cCgib2JqZWN0IikscHJvcGVydGllczpQKG0oKSxFaCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KX0pLFJoPXduLmV4dGVuZCh7bW9kZTpwKCJ1cmwiKSxtZXNzYWdlOm0oKSxlbGljaXRhdGlvbklkOm0oKSx1cmw6bSgpLnVybCgpfSksQ2g9VShbWmgsUmhdKSxBaD1lZS5leHRlbmQoe21ldGhvZDpwKCJlbGljaXRhdGlvbi9jcmVhdGUiKSxwYXJhbXM6Q2h9KSxMaD1nZS5leHRlbmQoe2VsaWNpdGF0aW9uSWQ6bSgpfSksTWg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9lbGljaXRhdGlvbi9jb21wbGV0ZSIpLHBhcmFtczpMaH0pLHFoPXRlLmV4dGVuZCh7YWN0aW9uOlEoWyJhY2NlcHQiLCJkZWNsaW5lIiwiY2FuY2VsIl0pLGNvbnRlbnQ6U24odD0+dD09PW51bGw/dm9pZCAwOnQsUChtKCksVShbbSgpLFQoKSxaKCksSShtKCkpXSkpLm9wdGlvbmFsKCkpfSksRmg9Zih7dHlwZTpwKCJyZWYvcmVzb3VyY2UiKSx1cmk6bSgpfSksSmg9Zih7dHlwZTpwKCJyZWYvcHJvbXB0IiksbmFtZTptKCl9KSxIaD1wZS5leHRlbmQoe3JlZjpVKFtKaCxGaF0pLGFyZ3VtZW50OmYoe25hbWU6bSgpLHZhbHVlOm0oKX0pLGNvbnRleHQ6Zih7YXJndW1lbnRzOlAobSgpLG0oKSkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCl9KSxXaD1lZS5leHRlbmQoe21ldGhvZDpwKCJjb21wbGV0aW9uL2NvbXBsZXRlIikscGFyYW1zOkhofSksQmg9dGUuZXh0ZW5kKHtjb21wbGV0aW9uOlkoe3ZhbHVlczpJKG0oKSkubWF4KDEwMCksdG90YWw6cShUKCkuaW50KCkpLGhhc01vcmU6cShaKCkpfSl9KSxWaD1mKHt1cmk6bSgpLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSxuYW1lOm0oKS5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEtoPWVlLmV4dGVuZCh7bWV0aG9kOnAoInJvb3RzL2xpc3QiKSxwYXJhbXM6cGUub3B0aW9uYWwoKX0pLEdoPXRlLmV4dGVuZCh7cm9vdHM6SShWaCl9KSxYaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Jvb3RzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7VShbbmksVHYsV2gscGgsbmgsUXYsQXYsTHYsRnYsV3YsVnYsSW0sd20sV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxVdixYaCxxbl0pO1UoW3FhLHhtLFRtLHFoLEdoLEJhLEdhLEhhXSk7VShbbmksU2gsQWgsS2gsV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxnaCxHdixKdixkaCxhaCxxbixNaF0pO1UoW3FhLE92LEJoLG9oLGVoLGJtLE12LHltLHJpLHVoLEJhLEdhLEhhXSk7Y2xhc3MgRCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG4scixvKXtzdXBlcihgTUNQIGVycm9yICR7bn06ICR7cn1gKSx0aGlzLmNvZGU9bix0aGlzLmRhdGE9byx0aGlzLm5hbWU9Ik1jcEVycm9yIn1zdGF0aWMgZnJvbUVycm9yKG4scixvKXtpZihuPT09Ui5VcmxFbGljaXRhdGlvblJlcXVpcmVkJiZvKXtjb25zdCBlPW87aWYoZS5lbGljaXRhdGlvbnMpcmV0dXJuIG5ldyBZaChlLmVsaWNpdGF0aW9ucyxyKX1yZXR1cm4gbmV3IEQobixyLG8pfX1jbGFzcyBZaCBleHRlbmRzIER7Y29uc3RydWN0b3IobixyPWBVUkwgZWxpY2l0YXRpb24ke24ubGVuZ3RoPjE/InMiOiIifSByZXF1aXJlZGApe3N1cGVyKFIuVXJsRWxpY2l0YXRpb25SZXF1aXJlZCxyLHtlbGljaXRhdGlvbnM6bn0pfWdldCBlbGljaXRhdGlvbnMoKXtyZXR1cm4gdGhpcy5kYXRhPy5lbGljaXRhdGlvbnM/P1tdfX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdD09PSJjb21wbGV0ZWQifHx0PT09ImZhaWxlZCJ8fHQ9PT0iY2FuY2VsbGVkIn1uZXcgU2V0KCJBQkNERUZHSElKS0xNTk9QUVJTVFVWWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5ejAxMjM0NTY3ODkiKTtmdW5jdGlvbiBBcyh0KXtjb25zdCByPXR2KHQpPy5tZXRob2Q7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgaXMgbWlzc2luZyBhIG1ldGhvZCBsaXRlcmFsIik7Y29uc3Qgbz1udihyKTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgbWV0aG9kIGxpdGVyYWwgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBvfWZ1bmN0aW9uIExzKHQsbil7Y29uc3Qgcj1lbSh0LG4pO2lmKCFyLnN1Y2Nlc3MpdGhyb3cgci5lcnJvcjtyZXR1cm4gci5kYXRhfWNvbnN0IFFoPTZlNDtjbGFzcyBlJHtjb25zdHJ1Y3RvcihuKXt0aGlzLl9vcHRpb25zPW4sdGhpcy5fcmVxdWVzdE1lc3NhZ2VJZD0wLHRoaXMuX3JlcXVlc3RIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycz1uZXcgTWFwLHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcmVzcG9uc2VIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnM9bmV3IE1hcCx0aGlzLl90aW1lb3V0SW5mbz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zPW5ldyBTZXQsdGhpcy5fdGFza1Byb2dyZXNzVG9rZW5zPW5ldyBNYXAsdGhpcy5fcmVxdWVzdFJlc29sdmVycz1uZXcgTWFwLHRoaXMuc2V0Tm90aWZpY2F0aW9uSGFuZGxlcihGYSxyPT57dGhpcy5fb25jYW5jZWwocil9KSx0aGlzLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIoSmEscj0+e3RoaXMuX29ucHJvZ3Jlc3Mocil9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKG5pLHI9Pih7fSkpLHRoaXMuX3Rhc2tTdG9yZT1uPy50YXNrU3RvcmUsdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT1uPy50YXNrTWVzc2FnZVF1ZXVlLHRoaXMuX3Rhc2tTdG9yZSYmKHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoV2EsYXN5bmMocixvKT0+e2NvbnN0IGU9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soci5wYXJhbXMudGFza0lkLG8uc2Vzc2lvbklkKTtpZighZSl0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsIkZhaWxlZCB0byByZXRyaWV2ZSB0YXNrOiBUYXNrIG5vdCBmb3VuZCIpO3JldHVybnsuLi5lfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoVmEsYXN5bmMocixvKT0+e2NvbnN0IGU9YXN5bmMoKT0+e2NvbnN0IGk9ci5wYXJhbXMudGFza0lkO2lmKHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUpe2xldCBzO2Zvcig7cz1hd2FpdCB0aGlzLl90YXNrTWVzc2FnZVF1ZXVlLmRlcXVldWUoaSxvLnNlc3Npb25JZCk7KXtpZihzLnR5cGU9PT0icmVzcG9uc2UifHxzLnR5cGU9PT0iZXJyb3IiKXtjb25zdCBjPXMubWVzc2FnZSx1PWMuaWQsbD10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldCh1KTtpZihsKWlmKHRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZGVsZXRlKHUpLHMudHlwZT09PSJyZXNwb25zZSIpbChjKTtlbHNle2NvbnN0IGc9Yyx2PW5ldyBEKGcuZXJyb3IuY29kZSxnLmVycm9yLm1lc3NhZ2UsZy5lcnJvci5kYXRhKTtsKHYpfWVsc2V7Y29uc3QgZz1zLnR5cGU9PT0icmVzcG9uc2UiPyJSZXNwb25zZSI6IkVycm9yIjt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgJHtnfSBoYW5kbGVyIG1pc3NpbmcgZm9yIHJlcXVlc3QgJHt1fWApKX1jb250aW51ZX1hd2FpdCB0aGlzLl90cmFuc3BvcnQ/LnNlbmQocy5tZXNzYWdlLHtyZWxhdGVkUmVxdWVzdElkOm8ucmVxdWVzdElkfSl9fWNvbnN0IGE9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soaSxvLnNlc3Npb25JZCk7aWYoIWEpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtpfWApO2lmKCFqZShhLnN0YXR1cykpcmV0dXJuIGF3YWl0IHRoaXMuX3dhaXRGb3JUYXNrVXBkYXRlKGksby5zaWduYWwpLGF3YWl0IGUoKTtpZihqZShhLnN0YXR1cykpe2NvbnN0IHM9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2tSZXN1bHQoaSxvLnNlc3Npb25JZCk7cmV0dXJuIHRoaXMuX2NsZWFyVGFza1F1ZXVlKGkpLHsuLi5zLF9tZXRhOnsuLi5zLl9tZXRhLFtPZV06e3Rhc2tJZDppfX19fXJldHVybiBhd2FpdCBlKCl9O3JldHVybiBhd2FpdCBlKCl9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKEthLGFzeW5jKHIsbyk9Pnt0cnl7Y29uc3R7dGFza3M6ZSxuZXh0Q3Vyc29yOml9PWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5saXN0VGFza3Moci5wYXJhbXM/LmN1cnNvcixvLnNlc3Npb25JZCk7cmV0dXJue3Rhc2tzOmUsbmV4dEN1cnNvcjppLF9tZXRhOnt9fX1jYXRjaChlKXt0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsYEZhaWxlZCB0byBsaXN0IHRhc2tzOiAke2UgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWApfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoWGEsYXN5bmMocixvKT0+e3RyeXtjb25zdCBlPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWUpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtyLnBhcmFtcy50YXNrSWR9YCk7aWYoamUoZS5zdGF0dXMpKXRocm93IG5ldyBEKFIuSW52YWxpZFBhcmFtcyxgQ2Fubm90IGNhbmNlbCB0YXNrIGluIHRlcm1pbmFsIHN0YXR1czogJHtlLnN0YXR1c31gKTthd2FpdCB0aGlzLl90YXNrU3RvcmUudXBkYXRlVGFza1N0YXR1cyhyLnBhcmFtcy50YXNrSWQsImNhbmNlbGxlZCIsIkNsaWVudCBjYW5jZWxsZWQgdGFzayBleGVjdXRpb24uIixvLnNlc3Npb25JZCksdGhpcy5fY2xlYXJUYXNrUXVldWUoci5wYXJhbXMudGFza0lkKTtjb25zdCBpPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZCBhZnRlciBjYW5jZWxsYXRpb246ICR7ci5wYXJhbXMudGFza0lkfWApO3JldHVybntfbWV0YTp7fSwuLi5pfX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgRD9lOm5ldyBEKFIuSW52YWxpZFJlcXVlc3QsYEZhaWxlZCB0byBjYW5jZWwgdGFzazogJHtlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1gKX19KSl9YXN5bmMgX29uY2FuY2VsKG4pe2lmKCFuLnBhcmFtcy5yZXF1ZXN0SWQpcmV0dXJuO3RoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy5nZXQobi5wYXJhbXMucmVxdWVzdElkKT8uYWJvcnQobi5wYXJhbXMucmVhc29uKX1fc2V0dXBUaW1lb3V0KG4scixvLGUsaT0hMSl7dGhpcy5fdGltZW91dEluZm8uc2V0KG4se3RpbWVvdXRJZDpzZXRUaW1lb3V0KGUsciksc3RhcnRUaW1lOkRhdGUubm93KCksdGltZW91dDpyLG1heFRvdGFsVGltZW91dDpvLHJlc2V0VGltZW91dE9uUHJvZ3Jlc3M6aSxvblRpbWVvdXQ6ZX0pfV9yZXNldFRpbWVvdXQobil7Y29uc3Qgcj10aGlzLl90aW1lb3V0SW5mby5nZXQobik7aWYoIXIpcmV0dXJuITE7Y29uc3Qgbz1EYXRlLm5vdygpLXIuc3RhcnRUaW1lO2lmKHIubWF4VG90YWxUaW1lb3V0JiZvPj1yLm1heFRvdGFsVGltZW91dCl0aHJvdyB0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobiksRC5mcm9tRXJyb3IoUi5SZXF1ZXN0VGltZW91dCwiTWF4aW11bSB0b3RhbCB0aW1lb3V0IGV4Y2VlZGVkIix7bWF4VG90YWxUaW1lb3V0OnIubWF4VG90YWxUaW1lb3V0LHRvdGFsRWxhcHNlZDpvfSk7cmV0dXJuIGNsZWFyVGltZW91dChyLnRpbWVvdXRJZCksci50aW1lb3V0SWQ9c2V0VGltZW91dChyLm9uVGltZW91dCxyLnRpbWVvdXQpLCEwfV9jbGVhbnVwVGltZW91dChuKXtjb25zdCByPXRoaXMuX3RpbWVvdXRJbmZvLmdldChuKTtyJiYoY2xlYXJUaW1lb3V0KHIudGltZW91dElkKSx0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobikpfWFzeW5jIGNvbm5lY3Qobil7aWYodGhpcy5fdHJhbnNwb3J0KXRocm93IG5ldyBFcnJvcigiQWxyZWFkeSBjb25uZWN0ZWQgdG8gYSB0cmFuc3BvcnQuIENhbGwgY2xvc2UoKSBiZWZvcmUgY29ubmVjdGluZyB0byBhIG5ldyB0cmFuc3BvcnQsIG9yIHVzZSBhIHNlcGFyYXRlIFByb3RvY29sIGluc3RhbmNlIHBlciBjb25uZWN0aW9uLiIpO3RoaXMuX3RyYW5zcG9ydD1uO2NvbnN0IHI9dGhpcy50cmFuc3BvcnQ/Lm9uY2xvc2U7dGhpcy5fdHJhbnNwb3J0Lm9uY2xvc2U9KCk9PntyPy4oKSx0aGlzLl9vbmNsb3NlKCl9O2NvbnN0IG89dGhpcy50cmFuc3BvcnQ/Lm9uZXJyb3I7dGhpcy5fdHJhbnNwb3J0Lm9uZXJyb3I9aT0+e28/LihpKSx0aGlzLl9vbmVycm9yKGkpfTtjb25zdCBlPXRoaXMuX3RyYW5zcG9ydD8ub25tZXNzYWdlO3RoaXMuX3RyYW5zcG9ydC5vbm1lc3NhZ2U9KGksYSk9PntlPy4oaSxhKSxabihpKXx8JHYoaSk/dGhpcy5fb25yZXNwb25zZShpKTpDcyhpKT90aGlzLl9vbnJlcXVlc3QoaSxhKTpodihpKT90aGlzLl9vbm5vdGlmaWNhdGlvbihpKTp0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoaSl9YCkpfSxhd2FpdCB0aGlzLl90cmFuc3BvcnQuc3RhcnQoKX1fb25jbG9zZSgpe2NvbnN0IG49dGhpcy5fcmVzcG9uc2VIYW5kbGVyczt0aGlzLl9yZXNwb25zZUhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcHJvZ3Jlc3NIYW5kbGVycy5jbGVhcigpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5jbGVhcigpLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmNsZWFyKCk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fdGltZW91dEluZm8udmFsdWVzKCkpY2xlYXJUaW1lb3V0KG8udGltZW91dElkKTt0aGlzLl90aW1lb3V0SW5mby5jbGVhcigpO2Zvcihjb25zdCBvIG9mIHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy52YWx1ZXMoKSlvLmFib3J0KCk7dGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7Y29uc3Qgcj1ELmZyb21FcnJvcihSLkNvbm5lY3Rpb25DbG9zZWQsIkNvbm5lY3Rpb24gY2xvc2VkIik7dGhpcy5fdHJhbnNwb3J0PXZvaWQgMCx0aGlzLm9uY2xvc2U/LigpO2Zvcihjb25zdCBvIG9mIG4udmFsdWVzKCkpbyhyKX1fb25lcnJvcihuKXt0aGlzLm9uZXJyb3I/LihuKX1fb25ub3RpZmljYXRpb24obil7Y29uc3Qgcj10aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrTm90aWZpY2F0aW9uSGFuZGxlcjtyIT09dm9pZCAwJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5yKG4pKS5jYXRjaChvPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5jYXVnaHQgZXJyb3IgaW4gbm90aWZpY2F0aW9uIGhhbmRsZXI6ICR7b31gKSkpfV9vbnJlcXVlc3QobixyKXtjb25zdCBvPXRoaXMuX3JlcXVlc3RIYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrUmVxdWVzdEhhbmRsZXIsZT10aGlzLl90cmFuc3BvcnQsaT1uLnBhcmFtcz8uX21ldGE/LltPZV0/LnRhc2tJZDtpZihvPT09dm9pZCAwKXtjb25zdCBsPXtqc29ucnBjOiIyLjAiLGlkOm4uaWQsZXJyb3I6e2NvZGU6Ui5NZXRob2ROb3RGb3VuZCxtZXNzYWdlOiJNZXRob2Qgbm90IGZvdW5kIn19O2kmJnRoaXMuX3Rhc2tNZXNzYWdlUXVldWU/dGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKGkse3R5cGU6ImVycm9yIixtZXNzYWdlOmwsdGltZXN0YW1wOkRhdGUubm93KCl9LGU/LnNlc3Npb25JZCkuY2F0Y2goZz0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBlbnF1ZXVlIGVycm9yIHJlc3BvbnNlOiAke2d9YCkpKTplPy5zZW5kKGwpLmNhdGNoKGc9PnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gc2VuZCBhbiBlcnJvciByZXNwb25zZTogJHtnfWApKSk7cmV0dXJufWNvbnN0IGE9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuc2V0KG4uaWQsYSk7Y29uc3Qgcz12dihuLnBhcmFtcyk/bi5wYXJhbXMudGFzazp2b2lkIDAsYz10aGlzLl90YXNrU3RvcmU/dGhpcy5yZXF1ZXN0VGFza1N0b3JlKG4sZT8uc2Vzc2lvbklkKTp2b2lkIDAsdT17c2lnbmFsOmEuc2lnbmFsLHNlc3Npb25JZDplPy5zZXNzaW9uSWQsX21ldGE6bi5wYXJhbXM/Ll9tZXRhLHNlbmROb3RpZmljYXRpb246YXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3JlbGF0ZWRSZXF1ZXN0SWQ6bi5pZH07aSYmKGcucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSksYXdhaXQgdGhpcy5ub3RpZmljYXRpb24obCxnKX0sc2VuZFJlcXVlc3Q6YXN5bmMobCxnLHYpPT57aWYoYS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgRChSLkNvbm5lY3Rpb25DbG9zZWQsIlJlcXVlc3Qgd2FzIGNhbmNlbGxlZCIpO2NvbnN0ICQ9ey4uLnYscmVsYXRlZFJlcXVlc3RJZDpuLmlkfTtpJiYhJC5yZWxhdGVkVGFzayYmKCQucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSk7Y29uc3QgeT0kLnJlbGF0ZWRUYXNrPy50YXNrSWQ/P2k7cmV0dXJuIHkmJmMmJmF3YWl0IGMudXBkYXRlVGFza1N0YXR1cyh5LCJpbnB1dF9yZXF1aXJlZCIpLGF3YWl0IHRoaXMucmVxdWVzdChsLGcsJCl9LGF1dGhJbmZvOnI/LmF1dGhJbmZvLHJlcXVlc3RJZDpuLmlkLHJlcXVlc3RJbmZvOnI/LnJlcXVlc3RJbmZvLHRhc2tJZDppLHRhc2tTdG9yZTpjLHRhc2tSZXF1ZXN0ZWRUdGw6cz8udHRsLGNsb3NlU1NFU3RyZWFtOnI/LmNsb3NlU1NFU3RyZWFtLGNsb3NlU3RhbmRhbG9uZVNTRVN0cmVhbTpyPy5jbG9zZVN0YW5kYWxvbmVTU0VTdHJlYW19O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntzJiZ0aGlzLmFzc2VydFRhc2tIYW5kbGVyQ2FwYWJpbGl0eShuLm1ldGhvZCl9KS50aGVuKCgpPT5vKG4sdSkpLnRoZW4oYXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3Jlc3VsdDpsLGpzb25ycGM6IjIuMCIsaWQ6bi5pZH07aSYmdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT9hd2FpdCB0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UoaSx7dHlwZToicmVzcG9uc2UiLG1lc3NhZ2U6Zyx0aW1lc3RhbXA6RGF0ZS5ub3coKX0sZT8uc2Vzc2lvbklkKTphd2FpdCBlPy5zZW5kKGcpfSxhc3luYyBsPT57aWYoYS5zaWduYWwuYWJvcnRlZClyZXR1cm47Y29uc3QgZz17anNvbnJwYzoiMi4wIixpZDpuLmlkLGVycm9yOntjb2RlOk51bWJlci5pc1NhZmVJbnRlZ2VyKGwuY29kZSk/bC5jb2RlOlIuSW50ZXJuYWxFcnJvcixtZXNzYWdlOmwubWVzc2FnZT8/IkludGVybmFsIGVycm9yIiwuLi5sLmRhdGEhPT12b2lkIDAmJntkYXRhOmwuZGF0YX19fTtpJiZ0aGlzLl90YXNrTWVzc2FnZVF1ZXVlP2F3YWl0IHRoaXMuX2VucXVldWVUYXNrTWVzc2FnZShpLHt0eXBlOiJlcnJvciIsbWVzc2FnZTpnLHRpbWVzdGFtcDpEYXRlLm5vdygpfSxlPy5zZXNzaW9uSWQpOmF3YWl0IGU/LnNlbmQoZyl9KS5jYXRjaChsPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2U6ICR7bH1gKSkpLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuZ2V0KG4uaWQpPT09YSYmdGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShuLmlkKX0pfV9vbnByb2dyZXNzKG4pe2NvbnN0e3Byb2dyZXNzVG9rZW46ciwuLi5vfT1uLnBhcmFtcyxlPU51bWJlcihyKSxpPXRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZ2V0KGUpO2lmKCFpKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSBwcm9ncmVzcyBub3RpZmljYXRpb24gZm9yIGFuIHVua25vd24gdG9rZW46ICR7SlNPTi5zdHJpbmdpZnkobil9YCkpO3JldHVybn1jb25zdCBhPXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZ2V0KGUpLHM9dGhpcy5fdGltZW91dEluZm8uZ2V0KGUpO2lmKHMmJmEmJnMucmVzZXRUaW1lb3V0T25Qcm9ncmVzcyl0cnl7dGhpcy5fcmVzZXRUaW1lb3V0KGUpfWNhdGNoKGMpe3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX2NsZWFudXBUaW1lb3V0KGUpLGEoYyk7cmV0dXJufWkobyl9X29ucmVzcG9uc2Uobil7Y29uc3Qgcj1OdW1iZXIobi5pZCksbz10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldChyKTtpZihvKXtpZih0aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmRlbGV0ZShyKSxabihuKSlvKG4pO2Vsc2V7Y29uc3QgYT1uZXcgRChuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7byhhKX1yZXR1cm59Y29uc3QgZT10aGlzLl9yZXNwb25zZUhhbmRsZXJzLmdldChyKTtpZihlPT09dm9pZCAwKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSByZXNwb25zZSBmb3IgYW4gdW5rbm93biBtZXNzYWdlIElEOiAke0pTT04uc3RyaW5naWZ5KG4pfWApKTtyZXR1cm59dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5kZWxldGUociksdGhpcy5fY2xlYW51cFRpbWVvdXQocik7bGV0IGk9ITE7aWYoWm4obikmJm4ucmVzdWx0JiZ0eXBlb2Ygbi5yZXN1bHQ9PSJvYmplY3QiKXtjb25zdCBhPW4ucmVzdWx0O2lmKGEudGFzayYmdHlwZW9mIGEudGFzaz09Im9iamVjdCIpe2NvbnN0IHM9YS50YXNrO3R5cGVvZiBzLnRhc2tJZD09InN0cmluZyImJihpPSEwLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5zZXQocy50YXNrSWQscikpfX1pZihpfHx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZShyKSxabihuKSllKG4pO2Vsc2V7Y29uc3QgYT1ELmZyb21FcnJvcihuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7ZShhKX19Z2V0IHRyYW5zcG9ydCgpe3JldHVybiB0aGlzLl90cmFuc3BvcnR9YXN5bmMgY2xvc2UoKXthd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmNsb3NlKCl9YXN5bmMqcmVxdWVzdFN0cmVhbShuLHIsbyl7Y29uc3R7dGFzazplfT1vPz97fTtpZighZSl7dHJ5e3lpZWxke3R5cGU6InJlc3VsdCIscmVzdWx0OmF3YWl0IHRoaXMucmVxdWVzdChuLHIsbyl9fWNhdGNoKGEpe3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjphIGluc3RhbmNlb2YgRD9hOm5ldyBEKFIuSW50ZXJuYWxFcnJvcixTdHJpbmcoYSkpfX1yZXR1cm59bGV0IGk7dHJ5e2NvbnN0IGE9YXdhaXQgdGhpcy5yZXF1ZXN0KG4sSGEsbyk7aWYoYS50YXNrKWk9YS50YXNrLnRhc2tJZCx5aWVsZHt0eXBlOiJ0YXNrQ3JlYXRlZCIsdGFzazphLnRhc2t9O2Vsc2UgdGhyb3cgbmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNyZWF0aW9uIGRpZCBub3QgcmV0dXJuIGEgdGFzayIpO2Zvcig7Oyl7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldFRhc2soe3Rhc2tJZDppfSxvKTtpZih5aWVsZHt0eXBlOiJ0YXNrU3RhdHVzIix0YXNrOnN9LGplKHMuc3RhdHVzKSl7cy5zdGF0dXM9PT0iY29tcGxldGVkIj95aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTpzLnN0YXR1cz09PSJmYWlsZWQiP3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSBmYWlsZWRgKX06cy5zdGF0dXM9PT0iY2FuY2VsbGVkIiYmKHlpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSB3YXMgY2FuY2VsbGVkYCl9KTtyZXR1cm59aWYocy5zdGF0dXM9PT0iaW5wdXRfcmVxdWlyZWQiKXt5aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTtyZXR1cm59Y29uc3QgYz1zLnBvbGxJbnRlcnZhbD8/dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzthd2FpdCBuZXcgUHJvbWlzZSh1PT5zZXRUaW1lb3V0KHUsYykpLG8/LnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKX19Y2F0Y2goYSl7eWllbGR7dHlwZToiZXJyb3IiLGVycm9yOmEgaW5zdGFuY2VvZiBEP2E6bmV3IEQoUi5JbnRlcm5hbEVycm9yLFN0cmluZyhhKSl9fX1yZXF1ZXN0KG4scixvKXtjb25zdHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YSx0YXNrOnMscmVsYXRlZFRhc2s6Y309bz8/e307cmV0dXJuIG5ldyBQcm9taXNlKCh1LGwpPT57Y29uc3QgZz1HPT57bChHKX07aWYoIXRoaXMuX3RyYW5zcG9ydCl7ZyhuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKSk7cmV0dXJufWlmKHRoaXMuX29wdGlvbnM/LmVuZm9yY2VTdHJpY3RDYXBhYmlsaXRpZXM9PT0hMCl0cnl7dGhpcy5hc3NlcnRDYXBhYmlsaXR5Rm9yTWV0aG9kKG4ubWV0aG9kKSxzJiZ0aGlzLmFzc2VydFRhc2tDYXBhYmlsaXR5KG4ubWV0aG9kKX1jYXRjaChHKXtnKEcpO3JldHVybn1vPy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7Y29uc3Qgdj10aGlzLl9yZXF1ZXN0TWVzc2FnZUlkKyssJD17Li4ubixqc29ucnBjOiIyLjAiLGlkOnZ9O28/Lm9ucHJvZ3Jlc3MmJih0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLnNldCh2LG8ub25wcm9ncmVzcyksJC5wYXJhbXM9ey4uLm4ucGFyYW1zLF9tZXRhOnsuLi5uLnBhcmFtcz8uX21ldGF8fHt9LHByb2dyZXNzVG9rZW46dn19KSxzJiYoJC5wYXJhbXM9ey4uLiQucGFyYW1zLHRhc2s6c30pLGMmJigkLnBhcmFtcz17Li4uJC5wYXJhbXMsX21ldGE6ey4uLiQucGFyYW1zPy5fbWV0YXx8e30sW09lXTpjfX0pO2NvbnN0IHk9Rz0+e3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX2NsZWFudXBUaW1lb3V0KHYpLHRoaXMuX3RyYW5zcG9ydD8uc2VuZCh7anNvbnJwYzoiMi4wIixtZXRob2Q6Im5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIixwYXJhbXM6e3JlcXVlc3RJZDp2LHJlYXNvbjpTdHJpbmcoRyl9fSx7cmVsYXRlZFJlcXVlc3RJZDplLHJlc3VtcHRpb25Ub2tlbjppLG9ucmVzdW1wdGlvbnRva2VuOmF9KS5jYXRjaChNPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgY2FuY2VsbGF0aW9uOiAke019YCkpKTtjb25zdCBXPUcgaW5zdGFuY2VvZiBEP0c6bmV3IEQoUi5SZXF1ZXN0VGltZW91dCxTdHJpbmcoRykpO2woVyl9O3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuc2V0KHYsRz0+e2lmKCFvPy5zaWduYWw/LmFib3J0ZWQpe2lmKEcgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gbChHKTt0cnl7Y29uc3QgVz1lbShyLEcucmVzdWx0KTtXLnN1Y2Nlc3M/dShXLmRhdGEpOmwoVy5lcnJvcil9Y2F0Y2goVyl7bChXKX19fSksbz8uc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9Pnt5KG8/LnNpZ25hbD8ucmVhc29uKX0pO2NvbnN0IEg9bz8udGltZW91dD8/UWgsTD0oKT0+eShELmZyb21FcnJvcihSLlJlcXVlc3RUaW1lb3V0LCJSZXF1ZXN0IHRpbWVkIG91dCIse3RpbWVvdXQ6SH0pKTt0aGlzLl9zZXR1cFRpbWVvdXQodixILG8/Lm1heFRvdGFsVGltZW91dCxMLG8/LnJlc2V0VGltZW91dE9uUHJvZ3Jlc3M/PyExKTtjb25zdCBxZT1jPy50YXNrSWQ7aWYocWUpe2NvbnN0IEc9Vz0+e2NvbnN0IE09dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5nZXQodik7TT9NKFcpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNwb25zZSBoYW5kbGVyIG1pc3NpbmcgZm9yIHNpZGUtY2hhbm5lbGVkIHJlcXVlc3QgJHt2fWApKX07dGhpcy5fcmVxdWVzdFJlc29sdmVycy5zZXQodixHKSx0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UocWUse3R5cGU6InJlcXVlc3QiLG1lc3NhZ2U6JCx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pLmNhdGNoKFc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKFcpfSl9ZWxzZSB0aGlzLl90cmFuc3BvcnQuc2VuZCgkLHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YX0pLmNhdGNoKEc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKEcpfSl9KX1hc3luYyBnZXRUYXNrKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9nZXQiLHBhcmFtczpufSxCYSxyKX1hc3luYyBnZXRUYXNrUmVzdWx0KG4scixvKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRhc2tzL3Jlc3VsdCIscGFyYW1zOm59LHIsbyl9YXN5bmMgbGlzdFRhc2tzKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9saXN0IixwYXJhbXM6bn0sR2Escil9YXN5bmMgY2FuY2VsVGFzayhuLHIpe3JldHVybiB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidGFza3MvY2FuY2VsIixwYXJhbXM6bn0sUnYscil9YXN5bmMgbm90aWZpY2F0aW9uKG4scil7aWYoIXRoaXMuX3RyYW5zcG9ydCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKTt0aGlzLmFzc2VydE5vdGlmaWNhdGlvbkNhcGFiaWxpdHkobi5tZXRob2QpO2NvbnN0IG89cj8ucmVsYXRlZFRhc2s/LnRhc2tJZDtpZihvKXtjb25zdCBzPXsuLi5uLGpzb25ycGM6IjIuMCIscGFyYW1zOnsuLi5uLnBhcmFtcyxfbWV0YTp7Li4ubi5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX07YXdhaXQgdGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKG8se3R5cGU6Im5vdGlmaWNhdGlvbiIsbWVzc2FnZTpzLHRpbWVzdGFtcDpEYXRlLm5vdygpfSk7cmV0dXJufWlmKCh0aGlzLl9vcHRpb25zPy5kZWJvdW5jZWROb3RpZmljYXRpb25NZXRob2RzPz9bXSkuaW5jbHVkZXMobi5tZXRob2QpJiYhbi5wYXJhbXMmJiFyPy5yZWxhdGVkUmVxdWVzdElkJiYhcj8ucmVsYXRlZFRhc2spe2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmhhcyhuLm1ldGhvZCkpcmV0dXJuO3RoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmFkZChuLm1ldGhvZCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmRlbGV0ZShuLm1ldGhvZCksIXRoaXMuX3RyYW5zcG9ydClyZXR1cm47bGV0IHM9ey4uLm4sanNvbnJwYzoiMi4wIn07cj8ucmVsYXRlZFRhc2smJihzPXsuLi5zLHBhcmFtczp7Li4ucy5wYXJhbXMsX21ldGE6ey4uLnMucGFyYW1zPy5fbWV0YXx8e30sW09lXTpyLnJlbGF0ZWRUYXNrfX19KSx0aGlzLl90cmFuc3BvcnQ/LnNlbmQocyxyKS5jYXRjaChjPT50aGlzLl9vbmVycm9yKGMpKX0pO3JldHVybn1sZXQgYT17Li4ubixqc29ucnBjOiIyLjAifTtyPy5yZWxhdGVkVGFzayYmKGE9ey4uLmEscGFyYW1zOnsuLi5hLnBhcmFtcyxfbWV0YTp7Li4uYS5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX0pLGF3YWl0IHRoaXMuX3RyYW5zcG9ydC5zZW5kKGEscil9c2V0UmVxdWVzdEhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuYXNzZXJ0UmVxdWVzdEhhbmRsZXJDYXBhYmlsaXR5KG8pLHRoaXMuX3JlcXVlc3RIYW5kbGVycy5zZXQobywoZSxpKT0+e2NvbnN0IGE9THMobixlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHIoYSxpKSl9KX1yZW1vdmVSZXF1ZXN0SGFuZGxlcihuKXt0aGlzLl9yZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG4pfWFzc2VydENhblNldFJlcXVlc3RIYW5kbGVyKG4pe2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVycy5oYXMobikpdGhyb3cgbmV3IEVycm9yKGBBIHJlcXVlc3QgaGFuZGxlciBmb3IgJHtufSBhbHJlYWR5IGV4aXN0cywgd2hpY2ggd291bGQgYmUgb3ZlcnJpZGRlbmApfXNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnNldChvLGU9Pntjb25zdCBpPUxzKG4sZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKGkpKX0pfXJlbW92ZU5vdGlmaWNhdGlvbkhhbmRsZXIobil7dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZGVsZXRlKG4pfV9jbGVhbnVwVGFza1Byb2dyZXNzSGFuZGxlcihuKXtjb25zdCByPXRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5nZXQobik7ciE9PXZvaWQgMCYmKHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHIpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5kZWxldGUobikpfWFzeW5jIF9lbnF1ZXVlVGFza01lc3NhZ2UobixyLG8pe2lmKCF0aGlzLl90YXNrU3RvcmV8fCF0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGVucXVldWUgdGFzayBtZXNzYWdlOiB0YXNrU3RvcmUgYW5kIHRhc2tNZXNzYWdlUXVldWUgYXJlIG5vdCBjb25maWd1cmVkIik7Y29uc3QgZT10aGlzLl9vcHRpb25zPy5tYXhUYXNrUXVldWVTaXplO2F3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZW5xdWV1ZShuLHIsbyxlKX1hc3luYyBfY2xlYXJUYXNrUXVldWUobixyKXtpZih0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXtjb25zdCBvPWF3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZGVxdWV1ZUFsbChuLHIpO2Zvcihjb25zdCBlIG9mIG8paWYoZS50eXBlPT09InJlcXVlc3QiJiZDcyhlLm1lc3NhZ2UpKXtjb25zdCBpPWUubWVzc2FnZS5pZCxhPXRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZ2V0KGkpO2E/KGEobmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNhbmNlbGxlZCBvciBjb21wbGV0ZWQiKSksdGhpcy5fcmVxdWVzdFJlc29sdmVycy5kZWxldGUoaSkpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNvbHZlciBtaXNzaW5nIGZvciByZXF1ZXN0ICR7aX0gZHVyaW5nIHRhc2sgJHtufSBjbGVhbnVwYCkpfX19YXN5bmMgX3dhaXRGb3JUYXNrVXBkYXRlKG4scil7bGV0IG89dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzt0cnl7Y29uc3QgZT1hd2FpdCB0aGlzLl90YXNrU3RvcmU/LmdldFRhc2sobik7ZT8ucG9sbEludGVydmFsJiYobz1lLnBvbGxJbnRlcnZhbCl9Y2F0Y2h7fXJldHVybiBuZXcgUHJvbWlzZSgoZSxpKT0+e2lmKHIuYWJvcnRlZCl7aShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKTtyZXR1cm59Y29uc3QgYT1zZXRUaW1lb3V0KGUsbyk7ci5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PntjbGVhclRpbWVvdXQoYSksaShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKX0se29uY2U6ITB9KX0pfXJlcXVlc3RUYXNrU3RvcmUobixyKXtjb25zdCBvPXRoaXMuX3Rhc2tTdG9yZTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIk5vIHRhc2sgc3RvcmUgY29uZmlndXJlZCIpO3JldHVybntjcmVhdGVUYXNrOmFzeW5jIGU9PntpZighbil0aHJvdyBuZXcgRXJyb3IoIk5vIHJlcXVlc3QgcHJvdmlkZWQiKTtyZXR1cm4gYXdhaXQgby5jcmVhdGVUYXNrKGUsbi5pZCx7bWV0aG9kOm4ubWV0aG9kLHBhcmFtczpuLnBhcmFtc30scil9LGdldFRhc2s6YXN5bmMgZT0+e2NvbnN0IGk9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLCJGYWlsZWQgdG8gcmV0cmlldmUgdGFzazogVGFzayBub3QgZm91bmQiKTtyZXR1cm4gaX0sc3RvcmVUYXNrUmVzdWx0OmFzeW5jKGUsaSxhKT0+e2F3YWl0IG8uc3RvcmVUYXNrUmVzdWx0KGUsaSxhLHIpO2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYocyl7Y29uc3QgYz1xbi5wYXJzZSh7bWV0aG9kOiJub3RpZmljYXRpb25zL3Rhc2tzL3N0YXR1cyIscGFyYW1zOnN9KTthd2FpdCB0aGlzLm5vdGlmaWNhdGlvbihjKSxqZShzLnN0YXR1cykmJnRoaXMuX2NsZWFudXBUYXNrUHJvZ3Jlc3NIYW5kbGVyKGUpfX0sZ2V0VGFza1Jlc3VsdDplPT5vLmdldFRhc2tSZXN1bHQoZSxyKSx1cGRhdGVUYXNrU3RhdHVzOmFzeW5jKGUsaSxhKT0+e2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIXMpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrICIke2V9IiBub3QgZm91bmQgLSBpdCBtYXkgaGF2ZSBiZWVuIGNsZWFuZWQgdXBgKTtpZihqZShzLnN0YXR1cykpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBDYW5ub3QgdXBkYXRlIHRhc2sgIiR7ZX0iIGZyb20gdGVybWluYWwgc3RhdHVzICIke3Muc3RhdHVzfSIgdG8gIiR7aX0iLiBUZXJtaW5hbCBzdGF0ZXMgKGNvbXBsZXRlZCwgZmFpbGVkLCBjYW5jZWxsZWQpIGNhbm5vdCB0cmFuc2l0aW9uIHRvIG90aGVyIHN0YXRlcy5gKTthd2FpdCBvLnVwZGF0ZVRhc2tTdGF0dXMoZSxpLGEscik7Y29uc3QgYz1hd2FpdCBvLmdldFRhc2soZSxyKTtpZihjKXtjb25zdCB1PXFuLnBhcnNlKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdGFza3Mvc3RhdHVzIixwYXJhbXM6Y30pO2F3YWl0IHRoaXMubm90aWZpY2F0aW9uKHUpLGplKGMuc3RhdHVzKSYmdGhpcy5fY2xlYW51cFRhc2tQcm9ncmVzc0hhbmRsZXIoZSl9fSxsaXN0VGFza3M6ZT0+by5saXN0VGFza3MoZSxyKX19fWZ1bmN0aW9uIE1zKHQpe3JldHVybiB0IT09bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB0JCh0LG4pe2NvbnN0IHI9ey4uLnR9O2Zvcihjb25zdCBvIGluIG4pe2NvbnN0IGU9byxpPW5bZV07aWYoaT09PXZvaWQgMCljb250aW51ZTtjb25zdCBhPXJbZV07TXMoYSkmJk1zKGkpP3JbZV09ey4uLmEsLi4uaX06cltlXT1pfXJldHVybiByfSh0PT50eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eSh0LHtnZXQ6KG4scik9Pih0eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTpuKVtyXX0pOnQpKGZ1bmN0aW9uKHQpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyt0KyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO2NsYXNzIG4kIGV4dGVuZHMgZSR7X3JlZ2lzdGVyZWRNZXRob2RzPW5ldyBTZXQ7X2V2ZW50U2xvdHM9bmV3IE1hcDtvbkV2ZW50RGlzcGF0Y2gobixyKXt9X2Vuc3VyZUV2ZW50U2xvdChuKXtsZXQgcj10aGlzLl9ldmVudFNsb3RzLmdldChuKTtpZighcil7bGV0IG89dGhpcy5ldmVudFNjaGVtYXNbbl07aWYoIW8pdGhyb3cgRXJyb3IoYFVua25vd24gZXZlbnQ6ICR7U3RyaW5nKG4pfWApO3I9e2xpc3RlbmVyczpbXX0sdGhpcy5fZXZlbnRTbG90cy5zZXQobixyKTtsZXQgZT1vLnNoYXBlLm1ldGhvZC52YWx1ZTt0aGlzLl9yZWdpc3RlcmVkTWV0aG9kcy5hZGQoZSk7bGV0IGk9cjtzdXBlci5zZXROb3RpZmljYXRpb25IYW5kbGVyKG8sYT0+e2xldCBzPWEucGFyYW1zO3RoaXMub25FdmVudERpc3BhdGNoKG4scyksaS5vbkhhbmRsZXI/LihzKTtmb3IobGV0IGMgb2ZbLi4uaS5saXN0ZW5lcnNdKWMocyl9KX1yZXR1cm4gcn1zZXRFdmVudEhhbmRsZXIobixyKXtsZXQgbz10aGlzLl9lbnN1cmVFdmVudFNsb3Qobik7by5vbkhhbmRsZXImJnImJmNvbnNvbGUud2FybihgW01DUCBBcHBzXSBvbiR7U3RyaW5nKG4pfSBoYW5kbGVyIHJlcGxhY2VkLiBVc2UgYWRkRXZlbnRMaXN0ZW5lcigiJHtTdHJpbmcobil9Iiwg4oCmKSB0byBhZGQgbXVsdGlwbGUgbGlzdGVuZXJzIHdpdGhvdXQgcmVwbGFjaW5nLmApLG8ub25IYW5kbGVyPXJ9Z2V0RXZlbnRIYW5kbGVyKG4pe3JldHVybiB0aGlzLl9ldmVudFNsb3RzLmdldChuKT8ub25IYW5kbGVyfWFkZEV2ZW50TGlzdGVuZXIobixyKXt0aGlzLl9lbnN1cmVFdmVudFNsb3QobikubGlzdGVuZXJzLnB1c2gocil9cmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIpe2xldCBvPXRoaXMuX2V2ZW50U2xvdHMuZ2V0KG4pO2lmKCFvKXJldHVybjtsZXQgZT1vLmxpc3RlbmVycy5pbmRleE9mKHIpO2UhPT0tMSYmby5saXN0ZW5lcnMuc3BsaWNlKGUsMSl9c2V0UmVxdWVzdEhhbmRsZXI9KG4scik9Pnt0aGlzLl9hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4sInNldFJlcXVlc3RIYW5kbGVyIiksc3VwZXIuc2V0UmVxdWVzdEhhbmRsZXIobixyKX07c2V0Tm90aWZpY2F0aW9uSGFuZGxlcj0obixyKT0+e3RoaXMuX2Fzc2VydE1ldGhvZE5vdFJlZ2lzdGVyZWQobiwic2V0Tm90aWZpY2F0aW9uSGFuZGxlciIpLHN1cGVyLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKX07d2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZChuLHIsbyl7ciYmbyYmY29uc29sZS53YXJuKGBbTUNQIEFwcHNdICR7bn0gaGFuZGxlciByZXBsYWNlZC4gUHJldmlvdXMgaGFuZGxlciB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQuYCl9cmVwbGFjZVJlcXVlc3RIYW5kbGVyPShuLHIpPT57bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7dGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuYWRkKG8pLHN1cGVyLnNldFJlcXVlc3RIYW5kbGVyKG4scil9O19hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4scil7bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7aWYodGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuaGFzKG8pKXRocm93IEVycm9yKGBIYW5kbGVyIGZvciAiJHtvfSIgYWxyZWFkeSByZWdpc3RlcmVkICh2aWEgJHtyfSkuIFVzZSBhZGRFdmVudExpc3RlbmVyKCkgdG8gYXR0YWNoIG11bHRpcGxlIGxpc3RlbmVycywgb3IgdGhlIG9uKiBzZXR0ZXIgZm9yIHJlcGxhY2Ugc2VtYW50aWNzLmApO3RoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLmFkZChvKX19dmFyIHIkPSIyMDI2LTAxLTI2IixpJD0idWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0LXBhcnRpYWwiO2NsYXNzIG8ke2V2ZW50VGFyZ2V0O2V2ZW50U291cmNlO21lc3NhZ2VMaXN0ZW5lcjtjb25zdHJ1Y3RvcihuPXdpbmRvdy5wYXJlbnQscil7dGhpcy5ldmVudFRhcmdldD1uLHRoaXMuZXZlbnRTb3VyY2U9cix0aGlzLm1lc3NhZ2VMaXN0ZW5lcj1vPT57aWYociYmby5zb3VyY2UhPT10aGlzLmV2ZW50U291cmNlKXtjb25zb2xlLmRlYnVnKCJJZ25vcmluZyBtZXNzYWdlIGZyb20gdW5rbm93biBzb3VyY2UiLG8pO3JldHVybn1sZXQgZT1fdi5zYWZlUGFyc2Uoby5kYXRhKTtlLnN1Y2Nlc3M/KGNvbnNvbGUuZGVidWcoIlBhcnNlZCBtZXNzYWdlIixlLmRhdGEpLHRoaXMub25tZXNzYWdlPy4oZS5kYXRhKSk6by5kYXRhPy5qc29ucnBjIT09IjIuMCI/Y29uc29sZS5kZWJ1ZygiSWdub3Jpbmcgbm9uLUpTT04tUlBDIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKTooY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKSx0aGlzLm9uZXJyb3I/LihFcnJvcigiSW52YWxpZCBKU09OLVJQQyBtZXNzYWdlIHJlY2VpdmVkOiAiK2UuZXJyb3IubWVzc2FnZSkpKX19YXN5bmMgc3RhcnQoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5tZXNzYWdlTGlzdGVuZXIpfWFzeW5jIHNlbmQobixyKXtuLm1ldGhvZCE9PWkkJiZjb25zb2xlLmRlYnVnKCJTZW5kaW5nIG1lc3NhZ2UiLG4pLHRoaXMuZXZlbnRUYXJnZXQucG9zdE1lc3NhZ2UobiwiKiIpfWFzeW5jIGNsb3NlKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMubWVzc2FnZUxpc3RlbmVyKSx0aGlzLm9uY2xvc2U/LigpfW9uY2xvc2U7b25lcnJvcjtvbm1lc3NhZ2U7c2Vzc2lvbklkO3NldFByb3RvY29sVmVyc2lvbn12YXIgYSQ9VShbcCgibGlnaHQiKSxwKCJkYXJrIildKS5kZXNjcmliZSgiQ29sb3IgdGhlbWUgcHJlZmVyZW5jZSBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQuIiksenQ9VShbcCgiaW5saW5lIikscCgiZnVsbHNjcmVlbiIpLHAoInBpcCIpXSkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZSBmb3IgVUkgcHJlc2VudGF0aW9uLiIpLHMkPVUoW3AoIi0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXNlY29uZGFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1pbnZlcnNlIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWdob3N0IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWluZm8iKSxwKCItLWNvbG9yLWJhY2tncm91bmQtZGFuZ2VyIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MiKSxwKCItLWNvbG9yLWJhY2tncm91bmQtd2FybmluZyIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItdGV4dC1wcmltYXJ5IikscCgiLS1jb2xvci10ZXh0LXNlY29uZGFyeSIpLHAoIi0tY29sb3ItdGV4dC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItdGV4dC1pbnZlcnNlIikscCgiLS1jb2xvci10ZXh0LWdob3N0IikscCgiLS1jb2xvci10ZXh0LWluZm8iKSxwKCItLWNvbG9yLXRleHQtZGFuZ2VyIikscCgiLS1jb2xvci10ZXh0LXN1Y2Nlc3MiKSxwKCItLWNvbG9yLXRleHQtd2FybmluZyIpLHAoIi0tY29sb3ItdGV4dC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItYm9yZGVyLXByaW1hcnkiKSxwKCItLWNvbG9yLWJvcmRlci1zZWNvbmRhcnkiKSxwKCItLWNvbG9yLWJvcmRlci10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYm9yZGVyLWludmVyc2UiKSxwKCItLWNvbG9yLWJvcmRlci1naG9zdCIpLHAoIi0tY29sb3ItYm9yZGVyLWluZm8iKSxwKCItLWNvbG9yLWJvcmRlci1kYW5nZXIiKSxwKCItLWNvbG9yLWJvcmRlci1zdWNjZXNzIikscCgiLS1jb2xvci1ib3JkZXItd2FybmluZyIpLHAoIi0tY29sb3ItYm9yZGVyLWRpc2FibGVkIikscCgiLS1jb2xvci1yaW5nLXByaW1hcnkiKSxwKCItLWNvbG9yLXJpbmctc2Vjb25kYXJ5IikscCgiLS1jb2xvci1yaW5nLWludmVyc2UiKSxwKCItLWNvbG9yLXJpbmctaW5mbyIpLHAoIi0tY29sb3ItcmluZy1kYW5nZXIiKSxwKCItLWNvbG9yLXJpbmctc3VjY2VzcyIpLHAoIi0tY29sb3ItcmluZy13YXJuaW5nIikscCgiLS1mb250LXNhbnMiKSxwKCItLWZvbnQtbW9ubyIpLHAoIi0tZm9udC13ZWlnaHQtbm9ybWFsIikscCgiLS1mb250LXdlaWdodC1tZWRpdW0iKSxwKCItLWZvbnQtd2VpZ2h0LXNlbWlib2xkIikscCgiLS1mb250LXdlaWdodC1ib2xkIikscCgiLS1mb250LXRleHQteHMtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXNtLXNpemUiKSxwKCItLWZvbnQtdGV4dC1tZC1zaXplIikscCgiLS1mb250LXRleHQtbGctc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLXhzLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1zaXplIikscCgiLS1mb250LWhlYWRpbmctbWQtc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLWxnLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy14bC1zaXplIikscCgiLS1mb250LWhlYWRpbmctMnhsLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy0zeGwtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXhzLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LXRleHQtc20tbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtdGV4dC1tZC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC10ZXh0LWxnLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmcteHMtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLW1kLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmctbGctbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy14bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTJ4bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTN4bC1saW5lLWhlaWdodCIpLHAoIi0tYm9yZGVyLXJhZGl1cy14cyIpLHAoIi0tYm9yZGVyLXJhZGl1cy1zbSIpLHAoIi0tYm9yZGVyLXJhZGl1cy1tZCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1sZyIpLHAoIi0tYm9yZGVyLXJhZGl1cy14bCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1mdWxsIikscCgiLS1ib3JkZXItd2lkdGgtcmVndWxhciIpLHAoIi0tc2hhZG93LWhhaXJsaW5lIikscCgiLS1zaGFkb3ctc20iKSxwKCItLXNoYWRvdy1tZCIpLHAoIi0tc2hhZG93LWxnIildKS5kZXNjcmliZSgiQ1NTIHZhcmlhYmxlIGtleXMgYXZhaWxhYmxlIHRvIE1DUCBhcHBzIGZvciB0aGVtaW5nLiIpLGMkPVAocyQuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCksVShbbSgpLFllKCldKS5kZXNjcmliZShgU3R5bGUgdmFyaWFibGVzIGZvciB0aGVtaW5nIE1DUCBhcHBzLgoKSW5kaXZpZHVhbCBzdHlsZSBrZXlzIGFyZSBvcHRpb25hbCAtIGhvc3RzIG1heSBwcm92aWRlIGFueSBzdWJzZXQgb2YgdGhlc2UgdmFsdWVzLgpWYWx1ZXMgYXJlIHN0cmluZ3MgY29udGFpbmluZyBDU1MgdmFsdWVzIChjb2xvcnMsIHNpemVzLCBmb250IHN0YWNrcywgZXRjLikuCgpOb3RlOiBUaGlzIHR5cGUgdXNlcyBcYFJlY29yZDxLLCBzdHJpbmcgfCB1bmRlZmluZWQ+XGAgcmF0aGVyIHRoYW4gXGBQYXJ0aWFsPFJlY29yZDxLLCBzdHJpbmc+PlxgCmZvciBjb21wYXRpYmlsaXR5IHdpdGggWm9kIHNjaGVtYSBnZW5lcmF0aW9uLiBCb3RoIGFyZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCBmb3IgdmFsaWRhdGlvbi5gKSkuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCk7Zih7bWV0aG9kOnAoInVpL29wZW4tbGluayIpLHBhcmFtczpmKHt1cmw6bSgpLmRlc2NyaWJlKCJVUkwgdG8gb3BlbiBpbiB0aGUgaG9zdCdzIGJyb3dzZXIiKX0pfSk7dmFyIHUkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGhvc3QgZmFpbGVkIHRvIG9wZW4gdGhlIFVSTCAoZS5nLiwgZHVlIHRvIHNlY3VyaXR5IHBvbGljeSkuIil9KS5wYXNzdGhyb3VnaCgpLGwkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGRvd25sb2FkIGZhaWxlZCAoZS5nLiwgdXNlciBjYW5jZWxsZWQgb3IgaG9zdCBkZW5pZWQpLiIpfSkucGFzc3Rocm91Z2goKSxkJD1mKHtpc0Vycm9yOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJUcnVlIGlmIHRoZSBob3N0IHJlamVjdGVkIG9yIGZhaWxlZCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlLiIpfSkucGFzc3Rocm91Z2goKTtmKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9zYW5kYm94LXByb3h5LXJlYWR5IikscGFyYW1zOmYoe30pfSk7dmFyIGlzPWYoe2Nvbm5lY3REb21haW5zOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKGBPcmlnaW5zIGZvciBuZXR3b3JrIHJlcXVlc3RzIChmZXRjaC9YSFIvV2ViU29ja2V0KS4KCi0gTWFwcyB0byBDU1AgXGBjb25uZWN0LXNyY1xgIGRpcmVjdGl2ZQotIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgY29ubmVjdGlvbnMgKHNlY3VyZSBkZWZhdWx0KWApLHJlc291cmNlRG9tYWluczpJKG0oKSkub3B0aW9uYWwoKS5kZXNjcmliZSgiT3JpZ2lucyBmb3Igc3RhdGljIHJlc291cmNlcyAoaW1hZ2VzLCBzY3JpcHRzLCBzdHlsZXNoZWV0cywgZm9udHMsIG1lZGlhKS5cblxuLSBNYXBzIHRvIENTUCBgaW1nLXNyY2AsIGBzY3JpcHQtc3JjYCwgYHN0eWxlLXNyY2AsIGBmb250LXNyY2AsIGBtZWRpYS1zcmNgIGRpcmVjdGl2ZXNcbi0gV2lsZGNhcmQgc3ViZG9tYWlucyBzdXBwb3J0ZWQ6IGBodHRwczovLyouZXhhbXBsZS5jb21gXG4tIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgcmVzb3VyY2VzIChzZWN1cmUgZGVmYXVsdCkiKSxmcmFtZURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk9yaWdpbnMgZm9yIG5lc3RlZCBpZnJhbWVzLlxuXG4tIE1hcHMgdG8gQ1NQIGBmcmFtZS1zcmNgIGRpcmVjdGl2ZVxuLSBFbXB0eSBvciBvbWl0dGVkIOKGkiBubyBuZXN0ZWQgaWZyYW1lcyBhbGxvd2VkIChgZnJhbWUtc3JjICdub25lJ2ApIiksYmFzZVVyaURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkFsbG93ZWQgYmFzZSBVUklzIGZvciB0aGUgZG9jdW1lbnQuXG5cbi0gTWFwcyB0byBDU1AgYGJhc2UtdXJpYCBkaXJlY3RpdmVcbi0gRW1wdHkgb3Igb21pdHRlZCDihpIgb25seSBzYW1lIG9yaWdpbiBhbGxvd2VkIChgYmFzZS11cmkgJ3NlbGYnYCkiKX0pLG9zPWYoe2NhbWVyYTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJSZXF1ZXN0IGNhbWVyYSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGNhbWVyYWAgZmVhdHVyZS4iKSxtaWNyb3Bob25lOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYG1pY3JvcGhvbmVgIGZlYXR1cmUuIiksZ2VvbG9jYXRpb246Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUmVxdWVzdCBnZW9sb2NhdGlvbiBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGdlb2xvY2F0aW9uYCBmZWF0dXJlLiIpLGNsaXBib2FyZFdyaXRlOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgY2xpcGJvYXJkIHdyaXRlIGFjY2Vzcy5cblxuTWFwcyB0byBQZXJtaXNzaW9uIFBvbGljeSBgY2xpcGJvYXJkLXdyaXRlYCBmZWF0dXJlLiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIikscGFyYW1zOmYoe3dpZHRoOlQoKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJOZXcgd2lkdGggaW4gcGl4ZWxzLiIpLGhlaWdodDpUKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiTmV3IGhlaWdodCBpbiBwaXhlbHMuIil9KX0pO3ZhciBtJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0IikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIkNvbXBsZXRlIHRvb2wgY2FsbCBhcmd1bWVudHMgYXMga2V5LXZhbHVlIHBhaXJzLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJDb21wbGV0ZSB0b29sIGNhbGwgYXJndW1lbnRzIGFzIGtleS12YWx1ZSBwYWlycy4iKX0pfSkscCQ9Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvdG9vbC1pbnB1dC1wYXJ0aWFsIikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIil9KX0pLGYkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtY2FuY2VsbGVkIikscGFyYW1zOmYoe3JlYXNvbjptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgnT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgY2FuY2VsbGF0aW9uIChlLmcuLCAidXNlciBhY3Rpb24iLCAidGltZW91dCIpLicpfSl9KSxnJD1mKHtmb250czptKCkub3B0aW9uYWwoKX0pLHYkPWYoe3ZhcmlhYmxlczpjJC5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1MgdmFyaWFibGVzIGZvciB0aGVtaW5nIHRoZSBhcHAuIiksY3NzOmckLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNTUyBibG9ja3MgdGhhdCBhcHBzIGNhbiBpbmplY3QuIil9KSxoJD1mKHttZXRob2Q6cCgidWkvcmVzb3VyY2UtdGVhcmRvd24iKSxwYXJhbXM6Zih7fSl9KTtQKG0oKSxFKCkpO3ZhciBxcz1mKHt0ZXh0OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgdGV4dCBjb250ZW50IGJsb2Nrcy4iKSxpbWFnZTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIGltYWdlIGNvbnRlbnQgYmxvY2tzLiIpLGF1ZGlvOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgYXVkaW8gY29udGVudCBibG9ja3MuIikscmVzb3VyY2U6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBjb250ZW50IGJsb2Nrcy4iKSxyZXNvdXJjZUxpbms6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBsaW5rIGNvbnRlbnQgYmxvY2tzLiIpLHN0cnVjdHVyZWRDb250ZW50OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgc3RydWN0dXJlZCBjb250ZW50LiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvcmVxdWVzdC10ZWFyZG93biIpLHBhcmFtczpmKHt9KS5vcHRpb25hbCgpfSk7dmFyICQkPWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxQKG0oKSxobigpKS5kZXNjcmliZSgiRXhwZXJpbWVudGFsIGZlYXR1cmVzIGtleWVkIGJ5IGlkZW50aWZpZXIuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpLG9wZW5MaW5rczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIG9wZW5pbmcgZXh0ZXJuYWwgVVJMcy4iKSxkb3dubG9hZEZpbGU6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyBmaWxlIGRvd25sb2FkcyB2aWEgdWkvZG93bmxvYWQtZmlsZS4iKSxzZXJ2ZXJUb29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyB0b29scy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHRvb2wgY2FsbHMgdG8gdGhlIE1DUCBzZXJ2ZXIuIiksc2VydmVyUmVzb3VyY2VzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHJlc291cmNlcy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHJlc291cmNlIHJlYWRzIHRvIHRoZSBNQ1Agc2VydmVyLiIpLGxvZ2dpbmc6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBhY2NlcHRzIGxvZyBtZXNzYWdlcy4iKSxzYW5kYm94OmYoe3Blcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhlIGhvc3QgKGNhbWVyYSwgbWljcm9waG9uZSwgZ2VvbG9jYXRpb24pLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgZG9tYWlucyBhcHByb3ZlZCBieSB0aGUgaG9zdC4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggY29uZmlndXJhdGlvbiBhcHBsaWVkIGJ5IHRoZSBob3N0LiIpLHVwZGF0ZU1vZGVsQ29udGV4dDpxcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFjY2VwdHMgY29udGV4dCB1cGRhdGVzICh1aS91cGRhdGUtbW9kZWwtY29udGV4dCkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1vZGVsJ3MgY29udGV4dCBmb3IgZnV0dXJlIHR1cm5zLiIpLG1lc3NhZ2U6cXMub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZWNlaXZpbmcgY29udGVudCBtZXNzYWdlcyAodWkvbWVzc2FnZSkgZnJvbSB0aGUgdmlldy4iKSxzYW1wbGluZzpmKHt0b29sczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHRvb2wgdXNlIHZpYSBgdG9vbHNgIGFuZCBgdG9vbENob2ljZWAgcGFyYW1ldGVycy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgTExNIHNhbXBsaW5nIChzYW1wbGluZy9jcmVhdGVNZXNzYWdlKSBmcm9tIHRoZSB2aWV3LlxuTWlycm9ycyB0aGUgTUNQIGBDbGllbnRDYXBhYmlsaXRpZXMuc2FtcGxpbmdgIHNoYXBlIHNvIGhvc3RzIGNhbiBwYXNzIGl0IHRocm91Z2guIil9KSxfJD1mKHtleHBlcmltZW50YWw6UChtKCksUChtKCksaG4oKSkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJFeHBlcmltZW50YWwgZmVhdHVyZXMga2V5ZWQgYnkgaWRlbnRpZmllci4iKSx0b29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIHN1cHBvcnRzIHRvb2xzL2xpc3RfY2hhbmdlZCBub3RpZmljYXRpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIGV4cG9zZXMgTUNQLXN0eWxlIHRvb2xzIHRoYXQgdGhlIGhvc3QgY2FuIGNhbGwuIiksYXZhaWxhYmxlRGlzcGxheU1vZGVzOkkoenQpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZXMgdGhlIGFwcCBzdXBwb3J0cy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmYoe30pLm9wdGlvbmFsKCl9KTtmKHtjc3A6aXMub3B0aW9uYWwoKS5kZXNjcmliZSgiQ29udGVudCBTZWN1cml0eSBQb2xpY3kgY29uZmlndXJhdGlvbiBmb3IgVUkgcmVzb3VyY2VzLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBVSSByZXNvdXJjZS4iKSxkb21haW46bSgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYERlZGljYXRlZCBvcmlnaW4gZm9yIHZpZXcgc2FuZGJveC4KClVzZWZ1bCB3aGVuIHZpZXdzIG5lZWQgc3RhYmxlLCBkZWRpY2F0ZWQgb3JpZ2lucyBmb3IgT0F1dGggY2FsbGJhY2tzLCBDT1JTIHBvbGljaWVzLCBvciBBUEkga2V5IGFsbG93bGlzdHMuCgoqKkhvc3QtZGVwZW5kZW50OioqIFRoZSBmb3JtYXQgYW5kIHZhbGlkYXRpb24gcnVsZXMgZm9yIHRoaXMgZmllbGQgYXJlIGRldGVybWluZWQgYnkgZWFjaCBob3N0LiBTZXJ2ZXJzIE1VU1QgY29uc3VsdCBob3N0LXNwZWNpZmljIGRvY3VtZW50YXRpb24gZm9yIHRoZSBleHBlY3RlZCBkb21haW4gZm9ybWF0LiBDb21tb24gcGF0dGVybnMgaW5jbHVkZToKLSBIYXNoLWJhc2VkIHN1YmRvbWFpbnMgKGUuZy4sIFxge2hhc2h9LmNsYXVkZW1jcGNvbnRlbnQuY29tXGApCi0gVVJMLWRlcml2ZWQgc3ViZG9tYWlucyAoZS5nLiwgXGB3d3ctZXhhbXBsZS1jb20ub2FpdXNlcmNvbnRlbnQuY29tXGApCgpJZiBvbWl0dGVkLCBob3N0IHVzZXMgZGVmYXVsdCBzYW5kYm94IG9yaWdpbiAodHlwaWNhbGx5IHBlci1jb252ZXJzYXRpb24pLmApLHByZWZlcnNCb3JkZXI6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYFZpc3VhbCBib3VuZGFyeSBwcmVmZXJlbmNlIC0gdHJ1ZSBpZiB2aWV3IHByZWZlcnMgYSB2aXNpYmxlIGJvcmRlci4KCkJvb2xlYW4gcmVxdWVzdGluZyB3aGV0aGVyIGEgdmlzaWJsZSBib3JkZXIgYW5kIGJhY2tncm91bmQgaXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIFNwZWNpZnlpbmcgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMgaXMgcmVjb21tZW5kZWQgYmVjYXVzZSBob3N0cycgZGVmYXVsdHMgbWF5IHZhcnkuCgotIFxgdHJ1ZVxgOiByZXF1ZXN0IHZpc2libGUgYm9yZGVyICsgYmFja2dyb3VuZAotIFxgZmFsc2VcYDogcmVxdWVzdCBubyB2aXNpYmxlIGJvcmRlciArIGJhY2tncm91bmQKLSBvbWl0dGVkOiBob3N0IGRlY2lkZXMgYm9yZGVyYCl9KTtmKHttZXRob2Q6cCgidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiKSxwYXJhbXM6Zih7bW9kZTp6dC5kZXNjcmliZSgiVGhlIGRpc3BsYXkgbW9kZSBiZWluZyByZXF1ZXN0ZWQuIil9KX0pO3ZhciBiJD1mKHttb2RlOnp0LmRlc2NyaWJlKCJUaGUgZGlzcGxheSBtb2RlIHRoYXQgd2FzIGFjdHVhbGx5IHNldC4gTWF5IGRpZmZlciBmcm9tIHJlcXVlc3RlZCBpZiBub3Qgc3VwcG9ydGVkLiIpfSkucGFzc3Rocm91Z2goKSx5JD1VKFtwKCJtb2RlbCIpLHAoImFwcCIpXSkuZGVzY3JpYmUoIlRvb2wgdmlzaWJpbGl0eSBzY29wZSAtIHdobyBjYW4gYWNjZXNzIHRoZSB0b29sLiIpO2Yoe3Jlc291cmNlVXJpOm0oKS5vcHRpb25hbCgpLHZpc2liaWxpdHk6SSh5JCkub3B0aW9uYWwoKS5kZXNjcmliZShgV2hvIGNhbiBhY2Nlc3MgdGhpcyB0b29sLiBEZWZhdWx0OiBbIm1vZGVsIiwgImFwcCJdCi0gIm1vZGVsIjogVG9vbCB2aXNpYmxlIHRvIGFuZCBjYWxsYWJsZSBieSB0aGUgYWdlbnQKLSAiYXBwIjogVG9vbCBjYWxsYWJsZSBieSB0aGUgYXBwIGZyb20gdGhpcyBzZXJ2ZXIgb25seWApLGNzcDpaZSgpLm9wdGlvbmFsKCkscGVybWlzc2lvbnM6WmUoKS5vcHRpb25hbCgpfSk7Zih7bWltZVR5cGVzOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCdBcnJheSBvZiBzdXBwb3J0ZWQgTUlNRSB0eXBlcyBmb3IgVUkgcmVzb3VyY2VzLlxuTXVzdCBpbmNsdWRlIGAidGV4dC9odG1sO3Byb2ZpbGU9bWNwLWFwcCJgIGZvciBNQ1AgQXBwcyBzdXBwb3J0LicpfSk7Zih7bWV0aG9kOnAoInVpL2Rvd25sb2FkLWZpbGUiKSxwYXJhbXM6Zih7Y29udGVudHM6SShVKFtrbSxTbV0pKS5kZXNjcmliZSgiUmVzb3VyY2UgY29udGVudHMgdG8gZG93bmxvYWQg4oCUIGVtYmVkZGVkIChpbmxpbmUgZGF0YSkgb3IgbGlua2VkIChob3N0IGZldGNoZXMpLiBVc2VzIHN0YW5kYXJkIE1DUCByZXNvdXJjZSB0eXBlcy4iKX0pfSk7Zih7bWV0aG9kOnAoInVpL21lc3NhZ2UiKSxwYXJhbXM6Zih7cm9sZTpwKCJ1c2VyIikuZGVzY3JpYmUoJ01lc3NhZ2Ugcm9sZSwgY3VycmVudGx5IG9ubHkgInVzZXIiIGlzIHN1cHBvcnRlZC4nKSxjb250ZW50OkkoVW4pLmRlc2NyaWJlKCJNZXNzYWdlIGNvbnRlbnQgYmxvY2tzICh0ZXh0LCBpbWFnZSwgZXRjLikuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3NhbmRib3gtcmVzb3VyY2UtcmVhZHkiKSxwYXJhbXM6Zih7aHRtbDptKCkuZGVzY3JpYmUoIkhUTUwgY29udGVudCB0byBsb2FkIGludG8gdGhlIGlubmVyIGlmcmFtZS4iKSxzYW5kYm94Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIGlubmVyIGlmcmFtZSdzIHNhbmRib3ggYXR0cmlidXRlLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgY29uZmlndXJhdGlvbiBmcm9tIHJlc291cmNlIG1ldGFkYXRhLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgZnJvbSByZXNvdXJjZSBtZXRhZGF0YS4iKX0pfSk7dmFyIGskPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtcmVzdWx0IikscGFyYW1zOnJpLmRlc2NyaWJlKCJTdGFuZGFyZCBNQ1AgdG9vbCBleGVjdXRpb24gcmVzdWx0LiIpfSksam09Zih7dG9vbEluZm86Zih7aWQ6SW4ub3B0aW9uYWwoKS5kZXNjcmliZSgiSlNPTi1SUEMgaWQgb2YgdGhlIHRvb2xzL2NhbGwgcmVxdWVzdC4iKSx0b29sOnJzLmRlc2NyaWJlKCJUb29sIGRlZmluaXRpb24gaW5jbHVkaW5nIG5hbWUsIGlucHV0U2NoZW1hLCBldGMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJNZXRhZGF0YSBvZiB0aGUgdG9vbCBjYWxsIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgQXBwLiIpLHRoZW1lOmEkLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkN1cnJlbnQgY29sb3IgdGhlbWUgcHJlZmVyZW5jZS4iKSxzdHlsZXM6diQub3B0aW9uYWwoKS5kZXNjcmliZSgiU3R5bGUgY29uZmlndXJhdGlvbiBmb3IgdGhlbWluZyB0aGUgYXBwLiIpLGRpc3BsYXlNb2RlOnp0Lm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvdyB0aGUgVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4iKSxhdmFpbGFibGVEaXNwbGF5TW9kZXM6SSh6dCkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGlzcGxheSBtb2RlcyB0aGUgaG9zdCBzdXBwb3J0cy4iKSxjb250YWluZXJEaW1lbnNpb25zOlUoW2Yoe2hlaWdodDpUKCkuZGVzY3JpYmUoIkZpeGVkIGNvbnRhaW5lciBoZWlnaHQgaW4gcGl4ZWxzLiIpfSksZih7bWF4SGVpZ2h0OlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgaGVpZ2h0IGluIHBpeGVscy4iKX0pXSkuYW5kKFUoW2Yoe3dpZHRoOlQoKS5kZXNjcmliZSgiRml4ZWQgY29udGFpbmVyIHdpZHRoIGluIHBpeGVscy4iKX0pLGYoe21heFdpZHRoOlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgd2lkdGggaW4gcGl4ZWxzLiIpfSldKSkub3B0aW9uYWwoKS5kZXNjcmliZShgQ29udGFpbmVyIGRpbWVuc2lvbnMuIFJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlmcmFtZSBvciBvdGhlcgpjb250YWluZXIgaG9sZGluZyB0aGUgYXBwLiBTcGVjaWZ5IGVpdGhlciB3aWR0aCBvciBtYXhXaWR0aCwgYW5kIGVpdGhlciBoZWlnaHQgb3IgbWF4SGVpZ2h0LmApLGxvY2FsZTptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiVXNlcidzIGxhbmd1YWdlIGFuZCByZWdpb24gcHJlZmVyZW5jZSBpbiBCQ1AgNDcgZm9ybWF0LiIpLHRpbWVab25lOm0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJVc2VyJ3MgdGltZXpvbmUgaW4gSUFOQSBmb3JtYXQuIiksdXNlckFnZW50Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpZXIuIikscGxhdGZvcm06VShbcCgid2ViIikscCgiZGVza3RvcCIpLHAoIm1vYmlsZSIpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUGxhdGZvcm0gdHlwZSBmb3IgcmVzcG9uc2l2ZSBkZXNpZ24gZGVjaXNpb25zLiIpLGRldmljZUNhcGFiaWxpdGllczpmKHt0b3VjaDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvdWNoIGlucHV0LiIpLGhvdmVyOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJXaGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgaG92ZXIgaW50ZXJhY3Rpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGV2aWNlIGlucHV0IGNhcGFiaWxpdGllcy4iKSxzYWZlQXJlYUluc2V0czpmKHt0b3A6VCgpLmRlc2NyaWJlKCJUb3Agc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKSxyaWdodDpUKCkuZGVzY3JpYmUoIlJpZ2h0IHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksYm90dG9tOlQoKS5kZXNjcmliZSgiQm90dG9tIHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksbGVmdDpUKCkuZGVzY3JpYmUoIkxlZnQgc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk1vYmlsZSBzYWZlIGFyZWEgYm91bmRhcmllcyBpbiBwaXhlbHMuIil9KS5wYXNzdGhyb3VnaCgpLFMkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2hvc3QtY29udGV4dC1jaGFuZ2VkIikscGFyYW1zOmptLmRlc2NyaWJlKCJQYXJ0aWFsIGNvbnRleHQgdXBkYXRlIGNvbnRhaW5pbmcgb25seSBjaGFuZ2VkIGZpZWxkcy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIpLHBhcmFtczpmKHtjb250ZW50OkkoVW4pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNvbnRleHQgY29udGVudCBibG9ja3MgKHRleHQsIGltYWdlLCBldGMuKS4iKSxzdHJ1Y3R1cmVkQ29udGVudDpQKG0oKSxFKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9pbml0aWFsaXplIikscGFyYW1zOmYoe2FwcEluZm86dGkuZGVzY3JpYmUoIkFwcCBpZGVudGlmaWNhdGlvbiAobmFtZSBhbmQgdmVyc2lvbikuIiksYXBwQ2FwYWJpbGl0aWVzOl8kLmRlc2NyaWJlKCJGZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzIHRoaXMgYXBwIHByb3ZpZGVzLiIpLHByb3RvY29sVmVyc2lvbjptKCkuZGVzY3JpYmUoIlByb3RvY29sIHZlcnNpb24gdGhpcyBhcHAgc3VwcG9ydHMuIil9KX0pO3ZhciB3JD1mKHtwcm90b2NvbFZlcnNpb246bSgpLmRlc2NyaWJlKCdOZWdvdGlhdGVkIHByb3RvY29sIHZlcnNpb24gc3RyaW5nIChlLmcuLCAiMjAyNS0xMS0yMSIpLicpLGhvc3RJbmZvOnRpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpY2F0aW9uIGFuZCB2ZXJzaW9uLiIpLGhvc3RDYXBhYmlsaXRpZXM6JCQuZGVzY3JpYmUoIkZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIiksaG9zdENvbnRleHQ6am0uZGVzY3JpYmUoIlJpY2ggY29udGV4dCBhYm91dCB0aGUgaG9zdCBlbnZpcm9ubWVudC4iKX0pLnBhc3N0aHJvdWdoKCksSSQ9e3RhcmdldDoiZHJhZnQtMjAyMC0xMiJ9O2FzeW5jIGZ1bmN0aW9uIEZzKHQsbil7bGV0IHI9dFsifnN0YW5kYXJkIl07aWYoci5qc29uU2NoZW1hKXJldHVybiByLmpzb25TY2hlbWFbbl0oSSQpO2lmKHIudmVuZG9yPT09InpvZCIpe2xldHt6Om99PWF3YWl0IEFtKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5wdiksdm9pZCAwLGltcG9ydC5tZXRhLnVybCk7cmV0dXJuIG8udG9KU09OU2NoZW1hKHQse2lvOm59KX10aHJvdyBFcnJvcihgU2NoZW1hICh2ZW5kb3I6ICR7ci52ZW5kb3J9KSBkb2VzIG5vdCBpbXBsZW1lbnQgU3RhbmRhcmQgSlNPTiBTY2hlbWEgKH5zdGFuZGFyZC5qc29uU2NoZW1hKS4gVXNlIGEgbGlicmFyeSB0aGF0IGRvZXMgKHpvZCB2NCwgQXJrVHlwZSwgVmFsaWJvdCkgb3Igd3JhcCB5b3VyIHNjaGVtYSBhY2NvcmRpbmdseS5gKX1hc3luYyBmdW5jdGlvbiBKcyh0LG4scj0iIil7bGV0IG89YXdhaXQgdFsifnN0YW5kYXJkIl0udmFsaWRhdGUobik7aWYoby5pc3N1ZXMpe2xldCBlPW8uaXNzdWVzLm1hcChpPT57bGV0IGE9aS5wYXRoPy5tYXAocz0+dHlwZW9mIHM9PSJvYmplY3QiP3Mua2V5OnMpLmpvaW4oIi4iKTtyZXR1cm4gYT9gJHthfTogJHtpLm1lc3NhZ2V9YDppLm1lc3NhZ2V9KS5qb2luKCI7ICIpO3Rocm93IEVycm9yKHIrZSl9cmV0dXJuIG8udmFsdWV9Y2xhc3MgYXMgZXh0ZW5kcyBuJHtfYXBwSW5mbztfY2FwYWJpbGl0aWVzO29wdGlvbnM7X2hvc3RDYXBhYmlsaXRpZXM7X2hvc3RJbmZvO19ob3N0Q29udGV4dDtfcmVnaXN0ZXJlZFRvb2xzPXt9O19pbml0aWFsaXplZFNlbnQ9ITE7X2Fzc2VydEluaXRpYWxpemVkKG4pe2lmKHRoaXMuX2luaXRpYWxpemVkU2VudClyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gQXBwLiR7bn0oKSBjYWxsZWQgYmVmb3JlIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBBd2FpdCBhcHAuY29ubmVjdCgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBvciBtb3ZlIGRhdGEgbG9hZGluZyB0byBhbiBvbnRvb2xyZXN1bHQgaGFuZGxlci5gO2lmKHRoaXMub3B0aW9ucz8uc3RyaWN0KXRocm93IEVycm9yKHIpO2NvbnNvbGUud2FybihgJHtyfS4gVGhpcyB3aWxsIHRocm93IGluIGEgZnV0dXJlIHJlbGVhc2UuYCl9ZXZlbnRTY2hlbWFzPXt0b29saW5wdXQ6bSQsdG9vbGlucHV0cGFydGlhbDpwJCx0b29scmVzdWx0OmskLHRvb2xjYW5jZWxsZWQ6ZiQsaG9zdGNvbnRleHRjaGFuZ2VkOlMkfTtzdGF0aWMgT05FX1NIT1RfRVZFTlRTPW5ldyBTZXQoWyJ0b29saW5wdXQiLCJ0b29saW5wdXRwYXJ0aWFsIiwidG9vbHJlc3VsdCIsInRvb2xjYW5jZWxsZWQiXSk7X2V2ZXJIYWRMaXN0ZW5lcj1uZXcgU2V0O19hc3NlcnRIYW5kbGVyVGltaW5nKG4pe2lmKCFhcy5PTkVfU0hPVF9FVkVOVFMuaGFzKG4pfHx0aGlzLl9ldmVySGFkTGlzdGVuZXIuaGFzKG4pfHwodGhpcy5fZXZlckhhZExpc3RlbmVyLmFkZChuKSwhdGhpcy5faW5pdGlhbGl6ZWRTZW50KSlyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gIiR7U3RyaW5nKG4pfSIgaGFuZGxlciByZWdpc3RlcmVkIGFmdGVyIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBUaGUgaG9zdCBtYXkgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyBub3RpZmljYXRpb24uIFJlZ2lzdGVyIGhhbmRsZXJzIGJlZm9yZSBjYWxsaW5nIGFwcC5jb25uZWN0KCkuYDtpZih0aGlzLm9wdGlvbnM/LnN0cmljdCl0aHJvdyBFcnJvcihyKTtjb25zb2xlLndhcm4ocil9c2V0RXZlbnRIYW5kbGVyKG4scil7ciYmdGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5zZXRFdmVudEhhbmRsZXIobixyKX1hZGRFdmVudExpc3RlbmVyKG4scil7dGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5hZGRFdmVudExpc3RlbmVyKG4scil9b25FdmVudERpc3BhdGNoKG4scil7bj09PSJob3N0Y29udGV4dGNoYW5nZWQiJiYodGhpcy5faG9zdENvbnRleHQ9ey4uLnRoaXMuX2hvc3RDb250ZXh0LC4uLnJ9KX1jb25zdHJ1Y3RvcihuLHI9e30sbz17YXV0b1Jlc2l6ZTohMH0pe3N1cGVyKG8pLHRoaXMuX2FwcEluZm89bix0aGlzLl9jYXBhYmlsaXRpZXM9cix0aGlzLm9wdGlvbnM9byxvLmFsbG93VW5zYWZlRXZhbHx8Syh7aml0bGVzczohMH0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIobmksZT0+KGNvbnNvbGUubG9nKCJSZWNlaXZlZCBwaW5nOiIsZS5wYXJhbXMpLHt9KSksdGhpcy5zZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIsdm9pZCAwKX1yZWdpc3RlckNhcGFiaWxpdGllcyhuKXtpZih0aGlzLnRyYW5zcG9ydCl0aHJvdyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGNhcGFiaWxpdGllcyBhZnRlciB0cmFuc3BvcnQgaXMgZXN0YWJsaXNoZWQiKTt0aGlzLl9jYXBhYmlsaXRpZXM9dCQodGhpcy5fY2FwYWJpbGl0aWVzLG4pfXJlZ2lzdGVyVG9vbChuLHIsbyl7aWYodGhpcy5fcmVnaXN0ZXJlZFRvb2xzW25dKXRocm93IEVycm9yKGBUb29sICR7bn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7bGV0IGU9dGhpcyxpPSgpPT57ZS5faW5pdGlhbGl6ZWRTZW50JiZlLl9jYXBhYmlsaXRpZXMudG9vbHM/Lmxpc3RDaGFuZ2VkJiZlLnNlbmRUb29sTGlzdENoYW5nZWQoKX0sYT1yLmlucHV0U2NoZW1hIT09dm9pZCAwLHM9e3RpdGxlOnIudGl0bGUsZGVzY3JpcHRpb246ci5kZXNjcmlwdGlvbixpbnB1dFNjaGVtYTpyLmlucHV0U2NoZW1hLG91dHB1dFNjaGVtYTpyLm91dHB1dFNjaGVtYSxhbm5vdGF0aW9uczpyLmFubm90YXRpb25zLF9tZXRhOnIuX21ldGEsZW5hYmxlZDohMCxlbmFibGUoKXt0aGlzLmVuYWJsZWQ9ITAsaSgpfSxkaXNhYmxlKCl7dGhpcy5lbmFibGVkPSExLGkoKX0sdXBkYXRlKGMpe09iamVjdC5hc3NpZ24odGhpcyxjKSxpKCl9LHJlbW92ZSgpe2UuX3JlZ2lzdGVyZWRUb29sc1tuXT09PXMmJihkZWxldGUgZS5fcmVnaXN0ZXJlZFRvb2xzW25dLGkoKSl9LGhhbmRsZXI6YXN5bmMoYyx1KT0+e2lmKCFzLmVuYWJsZWQpdGhyb3cgRXJyb3IoYFRvb2wgJHtufSBpcyBkaXNhYmxlZGApO2xldCBsO2lmKGEpe2xldCBnPXMuaW5wdXRTY2hlbWEsdj1nP2F3YWl0IEpzKGcsYz8/e30sYEludmFsaWQgaW5wdXQgZm9yIHRvb2wgJHtufTogYCk6Yz8/e307bD1hd2FpdCBvKHYsdSl9ZWxzZSBsPWF3YWl0IG8odSk7cmV0dXJuIHMub3V0cHV0U2NoZW1hJiYhbC5pc0Vycm9yJiYobC5zdHJ1Y3R1cmVkQ29udGVudD1hd2FpdCBKcyhzLm91dHB1dFNjaGVtYSxsLnN0cnVjdHVyZWRDb250ZW50LGBJbnZhbGlkIG91dHB1dCBmb3IgdG9vbCAke259OiBgKSksbH19O3JldHVybiB0aGlzLl9yZWdpc3RlcmVkVG9vbHNbbl09cywhdGhpcy5fY2FwYWJpbGl0aWVzLnRvb2xzJiYhdGhpcy50cmFuc3BvcnQmJnRoaXMucmVnaXN0ZXJDYXBhYmlsaXRpZXMoe3Rvb2xzOntsaXN0Q2hhbmdlZDohMH19KSx0aGlzLmVuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCksaSgpLHN9X3Rvb2xIYW5kbGVyc0luaXRpYWxpemVkPSExO2Vuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCl7dGhpcy5fdG9vbEhhbmRsZXJzSW5pdGlhbGl6ZWR8fCh0aGlzLl90b29sSGFuZGxlcnNJbml0aWFsaXplZD0hMCx0aGlzLm9uY2FsbHRvb2w9YXN5bmMobixyKT0+e2xldCBvPXRoaXMuX3JlZ2lzdGVyZWRUb29sc1tuLm5hbWVdO2lmKCFvKXRocm93IEVycm9yKGBUb29sICR7bi5uYW1lfSBub3QgZm91bmRgKTtyZXR1cm4gby5oYW5kbGVyKG4uYXJndW1lbnRzLHIpfSx0aGlzLm9ubGlzdHRvb2xzPWFzeW5jKG4scik9Pih7dG9vbHM6YXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModGhpcy5fcmVnaXN0ZXJlZFRvb2xzKS5maWx0ZXIoKFtvLGVdKT0+ZS5lbmFibGVkKS5tYXAoYXN5bmMoW28sZV0pPT57bGV0IGk9e25hbWU6byx0aXRsZTplLnRpdGxlLGRlc2NyaXB0aW9uOmUuZGVzY3JpcHRpb24saW5wdXRTY2hlbWE6ZS5pbnB1dFNjaGVtYT9hd2FpdCBGcyhlLmlucHV0U2NoZW1hLCJpbnB1dCIpOnt0eXBlOiJvYmplY3QiLHByb3BlcnRpZXM6e319fTtyZXR1cm4gZS5vdXRwdXRTY2hlbWEmJihpLm91dHB1dFNjaGVtYT1hd2FpdCBGcyhlLm91dHB1dFNjaGVtYSwib3V0cHV0IikpLGUuYW5ub3RhdGlvbnMmJihpLmFubm90YXRpb25zPWUuYW5ub3RhdGlvbnMpLGUuX21ldGEmJihpLl9tZXRhPWUuX21ldGEpLGl9KSl9KSl9YXN5bmMgc2VuZFRvb2xMaXN0Q2hhbmdlZChuPXt9KXt0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZFRvb2xMaXN0Q2hhbmdlZCIpLGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdG9vbHMvbGlzdF9jaGFuZ2VkIixwYXJhbXM6bn0pfWdldEhvc3RDYXBhYmlsaXRpZXMoKXtyZXR1cm4gdGhpcy5faG9zdENhcGFiaWxpdGllc31nZXRIb3N0VmVyc2lvbigpe3JldHVybiB0aGlzLl9ob3N0SW5mb31nZXRIb3N0Q29udGV4dCgpe3JldHVybiB0aGlzLl9ob3N0Q29udGV4dH1nZXQgb250b29saW5wdXQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xpbnB1dCIpfXNldCBvbnRvb2xpbnB1dChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0IixuKX1nZXQgb250b29saW5wdXRwYXJ0aWFsKCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJ0b29saW5wdXRwYXJ0aWFsIil9c2V0IG9udG9vbGlucHV0cGFydGlhbChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0cGFydGlhbCIsbil9Z2V0IG9udG9vbHJlc3VsdCgpe3JldHVybiB0aGlzLmdldEV2ZW50SGFuZGxlcigidG9vbHJlc3VsdCIpfXNldCBvbnRvb2xyZXN1bHQobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoInRvb2xyZXN1bHQiLG4pfWdldCBvbnRvb2xjYW5jZWxsZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xjYW5jZWxsZWQiKX1zZXQgb250b29sY2FuY2VsbGVkKG4pe3RoaXMuc2V0RXZlbnRIYW5kbGVyKCJ0b29sY2FuY2VsbGVkIixuKX1nZXQgb25ob3N0Y29udGV4dGNoYW5nZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIpfXNldCBvbmhvc3Rjb250ZXh0Y2hhbmdlZChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigiaG9zdGNvbnRleHRjaGFuZ2VkIixuKX1fb250ZWFyZG93bjtnZXQgb250ZWFyZG93bigpe3JldHVybiB0aGlzLl9vbnRlYXJkb3dufXNldCBvbnRlYXJkb3duKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib250ZWFyZG93biIsdGhpcy5fb250ZWFyZG93bixuKSx0aGlzLl9vbnRlYXJkb3duPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIoaCQsKHIsbyk9PntpZighdGhpcy5fb250ZWFyZG93bil0aHJvdyBFcnJvcigiTm8gb250ZWFyZG93biBoYW5kbGVyIHNldCIpO3JldHVybiB0aGlzLl9vbnRlYXJkb3duKHIucGFyYW1zLG8pfSl9X29uY2FsbHRvb2w7Z2V0IG9uY2FsbHRvb2woKXtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbH1zZXQgb25jYWxsdG9vbChuKXt0aGlzLndhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQoIm9uY2FsbHRvb2wiLHRoaXMuX29uY2FsbHRvb2wsbiksdGhpcy5fb25jYWxsdG9vbD1uLHRoaXMucmVwbGFjZVJlcXVlc3RIYW5kbGVyKEltLChyLG8pPT57aWYoIXRoaXMuX29uY2FsbHRvb2wpdGhyb3cgRXJyb3IoIk5vIG9uY2FsbHRvb2wgaGFuZGxlciBzZXQiKTtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbChyLnBhcmFtcyxvKX0pfV9vbmxpc3R0b29scztnZXQgb25saXN0dG9vbHMoKXtyZXR1cm4gdGhpcy5fb25saXN0dG9vbHN9c2V0IG9ubGlzdHRvb2xzKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib25saXN0dG9vbHMiLHRoaXMuX29ubGlzdHRvb2xzLG4pLHRoaXMuX29ubGlzdHRvb2xzPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIod20sKHIsbyk9PntpZighdGhpcy5fb25saXN0dG9vbHMpdGhyb3cgRXJyb3IoIk5vIG9ubGlzdHRvb2xzIGhhbmRsZXIgc2V0Iik7cmV0dXJuIHRoaXMuX29ubGlzdHRvb2xzKHIucGFyYW1zLG8pfSl9YXNzZXJ0Q2FwYWJpbGl0eUZvck1ldGhvZChuKXtzd2l0Y2gobil7Y2FzZSJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIjppZighdGhpcy5faG9zdENhcGFiaWxpdGllcz8uc2FtcGxpbmcpdGhyb3cgRXJyb3IoYEhvc3QgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGluZyAocmVxdWlyZWQgZm9yICR7bn0pYCk7YnJlYWt9fWFzc2VydFJlcXVlc3RIYW5kbGVyQ2FwYWJpbGl0eShuKXtzd2l0Y2gobil7Y2FzZSJ0b29scy9jYWxsIjpjYXNlInRvb2xzL2xpc3QiOmlmKCF0aGlzLl9jYXBhYmlsaXRpZXMudG9vbHMpdGhyb3cgRXJyb3IoYENsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHRvb2wgY2FwYWJpbGl0eSAocmVxdWlyZWQgZm9yICR7bn0pYCk7cmV0dXJuO2Nhc2UicGluZyI6Y2FzZSJ1aS9yZXNvdXJjZS10ZWFyZG93biI6cmV0dXJuO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYE5vIGhhbmRsZXIgZm9yIG1ldGhvZCAke259IHJlZ2lzdGVyZWRgKX19YXNzZXJ0Tm90aWZpY2F0aW9uQ2FwYWJpbGl0eShuKXt9YXNzZXJ0VGFza0NhcGFiaWxpdHkobil7dGhyb3cgRXJyb3IoIlRhc2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXNzZXJ0VGFza0hhbmRsZXJDYXBhYmlsaXR5KG4pe3Rocm93IEVycm9yKCJUYXNrIGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXN5bmMgY2FsbFNlcnZlclRvb2wobixyKXtpZih0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgiY2FsbFNlcnZlclRvb2wiKSx0eXBlb2Ygbj09InN0cmluZyIpdGhyb3cgRXJyb3IoYGNhbGxTZXJ2ZXJUb29sKCkgZXhwZWN0cyBhbiBvYmplY3QgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBidXQgcmVjZWl2ZWQgYSBzdHJpbmcgKCIke259IikuIERpZCB5b3UgbWVhbjogY2FsbFNlcnZlclRvb2woeyBuYW1lOiAiJHtufSIsIGFyZ3VtZW50czogeyAuLi4gfSB9KT9gKTtyZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRvb2xzL2NhbGwiLHBhcmFtczpufSxyaSx7b25wcm9ncmVzczooKT0+e30scmVzZXRUaW1lb3V0T25Qcm9ncmVzczohMCwuLi5yfSl9YXN5bmMgcmVhZFNlcnZlclJlc291cmNlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZWFkU2VydmVyUmVzb3VyY2UiKSxhd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoicmVzb3VyY2VzL3JlYWQiLHBhcmFtczpufSx5bSxyKX1hc3luYyBsaXN0U2VydmVyUmVzb3VyY2VzKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJsaXN0U2VydmVyUmVzb3VyY2VzIiksYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InJlc291cmNlcy9saXN0IixwYXJhbXM6bn0sYm0scil9YXN5bmMgY3JlYXRlU2FtcGxpbmdNZXNzYWdlKG4scil7dGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImNyZWF0ZVNhbXBsaW5nTWVzc2FnZSIpO2xldCBvPW4udG9vbHM/VG06eG07cmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7bWV0aG9kOiJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIixwYXJhbXM6bn0sbyxyKX1zZW5kTWVzc2FnZShuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZE1lc3NhZ2UiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvbWVzc2FnZSIscGFyYW1zOm59LGQkLHIpfXNlbmRMb2cobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvbWVzc2FnZSIscGFyYW1zOm59KX11cGRhdGVNb2RlbENvbnRleHQobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoInVwZGF0ZU1vZGVsQ29udGV4dCIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIscGFyYW1zOm59LHFhLHIpfW9wZW5MaW5rKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJvcGVuTGluayIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9vcGVuLWxpbmsiLHBhcmFtczpufSx1JCxyKX1zZW5kT3Blbkxpbms9dGhpcy5vcGVuTGluaztkb3dubG9hZEZpbGUobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImRvd25sb2FkRmlsZSIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9kb3dubG9hZC1maWxlIixwYXJhbXM6bn0sbCQscil9cmVxdWVzdFRlYXJkb3duKG49e30pe3JldHVybiB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJ1aS9ub3RpZmljYXRpb25zL3JlcXVlc3QtdGVhcmRvd24iLHBhcmFtczpufSl9cmVxdWVzdERpc3BsYXlNb2RlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZXF1ZXN0RGlzcGxheU1vZGUiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiLHBhcmFtczpufSxiJCxyKX1zZW5kU2l6ZUNoYW5nZWQobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIixwYXJhbXM6bn0pfXNldHVwU2l6ZUNoYW5nZWROb3RpZmljYXRpb25zKCl7bGV0IG49ITEscj0wLG89MCxlPSgpPT57bnx8KG49ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bj0hMTtsZXQgYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscz1hLnN0eWxlLmhlaWdodDthLnN0eWxlLmhlaWdodD0ibWF4LWNvbnRlbnQiO2xldCBjPU1hdGguY2VpbChhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7YS5zdHlsZS5oZWlnaHQ9cztsZXQgdT1NYXRoLmNlaWwod2luZG93LmlubmVyV2lkdGgpOyh1IT09cnx8YyE9PW8pJiYocj11LG89Yyx0aGlzLnNlbmRTaXplQ2hhbmdlZCh7d2lkdGg6dSxoZWlnaHQ6Y30pKX0pKX07ZSgpO2xldCBpPW5ldyBSZXNpemVPYnNlcnZlcihlKTtyZXR1cm4gaS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksaS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpLCgpPT5pLmRpc2Nvbm5lY3QoKX1hc3luYyBjb25uZWN0KG49bmV3IG8kKHdpbmRvdy5wYXJlbnQsd2luZG93LnBhcmVudCkscil7aWYodGhpcy50cmFuc3BvcnQpdGhyb3cgRXJyb3IoIkFwcCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4gQ2FsbCBjbG9zZSgpIGJlZm9yZSBjb25uZWN0aW5nIGFnYWluLiIpO3RoaXMuX2luaXRpYWxpemVkU2VudD0hMSxhd2FpdCBzdXBlci5jb25uZWN0KG4pO3RyeXtsZXQgbz1hd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvaW5pdGlhbGl6ZSIscGFyYW1zOnthcHBDYXBhYmlsaXRpZXM6dGhpcy5fY2FwYWJpbGl0aWVzLGFwcEluZm86dGhpcy5fYXBwSW5mbyxwcm90b2NvbFZlcnNpb246ciR9fSx3JCxyKTtpZihvPT09dm9pZCAwKXRocm93IEVycm9yKGBTZXJ2ZXIgc2VudCBpbnZhbGlkIGluaXRpYWxpemUgcmVzdWx0OiAke299YCk7dGhpcy5faG9zdENhcGFiaWxpdGllcz1vLmhvc3RDYXBhYmlsaXRpZXMsdGhpcy5faG9zdEluZm89by5ob3N0SW5mbyx0aGlzLl9ob3N0Q29udGV4dD1vLmhvc3RDb250ZXh0LGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvaW5pdGlhbGl6ZWQifSksdGhpcy5faW5pdGlhbGl6ZWRTZW50PSEwLHRoaXMub3B0aW9ucz8uYXV0b1Jlc2l6ZSYmdGhpcy5zZXR1cFNpemVDaGFuZ2VkTm90aWZpY2F0aW9ucygpfWNhdGNoKG8pe3Rocm93IHRoaXMuY2xvc2UoKSxvfX19Y29uc3QgT209e2VuOntsb2FkaW5nOiJMb2FkaW5n4oCmIixvcGVuaW5nOiJPcGVuaW5nIGNoZWNrb3V04oCmIixwYXlpbmc6IlBheWluZyB2aWEge21ldGhvZH3igKYiLGVtcHR5Q2F0YWxvZzoiTm90aGluZyBpbiB0aGUgY2F0YWxvZy4iLG5vT3JkZXJzOiJObyBvcmRlcnMgeWV0IOKAlCBwaWNrIHNvbWV0aGluZyBmcm9tIHRoZSBjYXRhbG9nIGZpcnN0LiIscHJvZHVjdENvdW50OiJ7Y291bnR9IHByb2R1Y3RzIixvcmRlcmVkRmFsbGJhY2s6Ik9yZGVyZWQge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiJCdXkge3Byb2R1Y3R9IHdpdGggQ3VybGVzcyB3YWxsZXQiLGJhY2s6IuKGkCBDaG9vc2UgYW5vdGhlciB3YXkiLG9yZGVyQWdhaW46Ik9yZGVyIGFub3RoZXIiLHZpZXdPcmRlcnM6IlZpZXcgbXkgb3JkZXJzIOKGkiIsb3JkZXJlZDoiT3JkZXJlZCIsbm90Q29tcGxldGVkOiJOb3QgY29tcGxldGVkIixvbmVTdGVwTGVmdDoiT25lIHN0ZXAgbGVmdCIsc2lnbkluOiJTaWduIGluIHRvIEN1cmxlc3MiLHNpZ25JbkdvOiJTaWduIGluIOKGlyIsc2lnbkluV2FpdDoiVGhpcyBjYXJkIHJlY29ubmVjdHMgb24gaXRzIG93biBvbmNlIHlvdSBhcmUgaW4uIEJpbmRpbmcgYSBjYXJkIGhhcHBlbnMgdGhlcmUgdG9vLiIsc2lnbmVkSW5QYXlpbmc6IlNpZ25lZCBpbiBhcyB7ZW1haWx9IOKAlCBwYXlpbmfigKYiLHNpZ25JbkV4cGlyZWQ6IlRoYXQgc2lnbi1pbiB0aW1lZCBvdXQg4oCUIHN0YXJ0IGl0IGFnYWluIGFib3ZlLiIsc2lnbkluTmV2ZXJTdGFydGVkOiJObyBzaWduLWluIHN0YXJ0ZWQgeWV0IOKAlCB1c2UgdGhlIGxpbmsgYWJvdmUuIixvcmRlcnNGYWlsZWQ6IkNvdWxkIG5vdCBsb2FkIHlvdXIgb3JkZXJzLiIsd2FsbGV0U2FpZE5vOiJXYWxsZXQgc2FpZCBubyIsb3BlbldhbGxldDoiT3BlbiB3YWxsZXQg4oaXIixnb1BheToiR28gcGF5IOKGlyIscGF5V2FpdDoiQXBwcm92ZSBpdCBpbiB5b3VyIGJyb3dzZXIgYW5kIHRoaXMgY2FyZCB0dXJucyBpbnRvIGEgcmVjZWlwdCBvbiBpdHMgb3duLiIscGF5VGltZW91dDoiTm8gcGF5bWVudCByZWNlaXZlZCB5ZXQuIE9uY2UgeW91IGhhdmUgcGFpZCwgY2hlY2sg4oCcbXkgb3JkZXJz4oCdLiIsaGFuZGVkT3ZlcjoiSGFuZGVkIHRvIHlvdXIgYXNzaXN0YW50IixoYW5kZWRPdmVyQm9keToiVGhpcyBvbmUgaXMgcGFpZCBmcm9tIHRoZSBDdXJsZXNzIHdhbGxldCBjb25uZWN0b3IgeW91IGluc3RhbGxlZCDigJQgdGhlIGNyZWRlbnRpYWwgbGl2ZXMgdGhlcmUsIGFuZCB0aGlzIGNhcmQgY2Fubm90IHJlYWNoIGl0LiIsaGFuZGVkT3ZlcldhaXQ6IllvdXIgYXNzaXN0YW50IHdpbGwgb3BlbiB0aGUgY2hlY2tvdXQsIGdldCB5b3Ugc2lnbmVkIGluIGlmIG5lZWRlZCwgYW5kIGNvbmZpcm0gdGhlIGFtb3VudCB3aXRoIHlvdSBiZWZvcmUgYW55dGhpbmcgaXMgY2hhcmdlZC4iLHJlZnVuZDoiUmVxdWVzdCBhIHJlZnVuZCIscmVmdW5kaW5nOiJXb3JraW5n4oCmIixyZWZ1bmRGYWlsZWQ6IlRoZSByZWZ1bmQgcmVxdWVzdCBmYWlsZWQiLG9uQ2hhaW5UeDoiT24tY2hhaW4gdHg6IixwYWlkQnk6IlBhaWQgYnk6IixjYW5ub3RPcGVuOiJDb3VsZCBub3Qgb3BlbiB0aGUgY2hlY2tvdXQiLGNhcmRGYWlsZWQ6IlRoZSBjYXJkIGNvdWxkIG5vdCBsb2FkIixub3RoaW5nVG9TaG93OiJOb3RoaW5nIHRvIHNob3cgaGVyZSIsbm90aGluZ1RvU2hvd0JvZHk6IkFzayBmb3IgYSBwcm9kdWN0IGJ5IG5hbWUsIG9yIGZvciB0aGUgY2F0YWxvZy4iLHJlZnJlc2g6IlJlZnJlc2giLG9yZGVyc1RpdGxlOiJNeSBvcmRlcnMifSx6aDp7bG9hZGluZzoi5Yqg6L295Lit4oCmIixvcGVuaW5nOiLmraPlnKjlvIDnu5PotKbigKYiLHBheWluZzoi5q2j5Zyo6YCa6L+HIHttZXRob2R9IOe7k+eul+KApiIsZW1wdHlDYXRhbG9nOiLnm67lvZXph4zmsqHmnInllYblk4HjgIIiLG5vT3JkZXJzOiLov5jmsqHmnInorqLljZUg4oCU4oCUIOWFiOS7juebruW9lemHjOaMkeS4gOS7tuOAgiIscHJvZHVjdENvdW50OiJ7Y291bnR9IOS7tuWVhuWTgSIsb3JkZXJlZEZhbGxiYWNrOiLlt7LkuIvljZUge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiLnlKggQ3VybGVzcyDpkrHljIXkubB7cHJvZHVjdH0iLGJhY2s6IuKGkCDmjaLkuKrmlK/ku5jmlrnlvI8iLG9yZGVyQWdhaW46IuWGjeiuouS4gOasoSIsdmlld09yZGVyczoi5p+l55yL5oiR55qE6K6i5Y2VIOKGkiIsb3JkZXJlZDoi5bey5LiL5Y2VIixub3RDb21wbGV0ZWQ6IuacquWujOaIkCIsb25lU3RlcExlZnQ6Iui/mOW3ruS4gOatpSIsc2lnbkluOiLnmbvlvZUgQ3VybGVzcyDpkrHljIUiLHNpZ25JbkdvOiLljrvnmbvlvZUg4oaXIixzaWduSW5XYWl0OiLnmbvlvZXlrozov5nlvKDljaHkvJroh6rlt7HmjqXkuIrjgILnu5HljaHkuZ/lnKjlkIzkuIDkuKrpobXpnaLph4zjgIIiLHNpZ25lZEluUGF5aW5nOiLlt7LnmbvlvZUge2VtYWlsfSDigJTigJQg5q2j5Zyo5LuY5qy+4oCmIixzaWduSW5FeHBpcmVkOiLnmbvlvZXotoXml7bkuoYs54K55LiK6Z2i6YeN5paw5p2l5LiA5qyh44CCIixzaWduSW5OZXZlclN0YXJ0ZWQ6Iui/mOayoeW8gOWni+eZu+W9lSDigJTigJQg54K55LiK6Z2i6YKj5Liq6ZO+5o6l44CCIixvcmRlcnNGYWlsZWQ6IuiuouWNleWKoOi9veWksei0peOAgiIsd2FsbGV0U2FpZE5vOiLpkrHljIXmnKrmlL7ooYwiLG9wZW5XYWxsZXQ6IuaJk+W8gOmSseWMhSDihpciLGdvUGF5OiLljrvku5jmrL4g4oaXIixwYXlXYWl0OiLlnKjmtY/op4jlmajph4zmibnlh4blkI4s6L+Z5byg5Y2h5Lya6Ieq5bex5Y+Y5oiQ5pS25o2u44CCIixwYXlUaW1lb3V0Oifov5jmsqHmlLbliLDku5jmrL7jgILku5jlrozngrnkuIDkuIsi5oiR55qE6K6i5Y2VIueci+eci+OAgicsaGFuZGVkT3Zlcjoi5Lqk57uZ5Yqp5omL57un57utIixoYW5kZWRPdmVyQm9keToi6L+Z56yU6KaB55So5L2g6Ieq5bex6KOF55qEIEN1cmxlc3Mg6ZKx5YyF6L+e5o6l5Zmo5LuYIOKAlOKAlCDlh63mja7lnKjpgqPkuKrov57mjqXlmajph4ws6L+Z5byg5Y2h5aSf5LiN5Yiw5a6D44CCIixoYW5kZWRPdmVyV2FpdDoi5Yqp5omL5Lya5YWI6K6p5L2g55m75b2V6ZKx5YyFLOWGjemTuOS4gOW8oOWHreaNruWujOaIkOS7mOasvizmiaPmrL7liY3kvJrot5/kvaDnoa7orqTph5Hpop3jgIIiLHJlZnVuZDoi55Sz6K+36YCA5qy+IixyZWZ1bmRpbmc6IuWkhOeQhuS4reKApiIscmVmdW5kRmFpbGVkOiLpgIDmrL7nlLPor7flpLHotKUiLG9uQ2hhaW5UeDoi6ZO+5LiK5Lqk5piTOiIscGFpZEJ5OiLku5jmrL7mlrnlvI86IixjYW5ub3RPcGVuOiLmiZPkuI3lvIDnu5PotKYiLGNhcmRGYWlsZWQ6IuWNoeeJh+WKoOi9veWksei0pSIsbm90aGluZ1RvU2hvdzoi6L+Z6YeM5rKh5pyJ5Y+v5pi+56S655qE5YaF5a65Iixub3RoaW5nVG9TaG93Qm9keToi6K+05Ye65ZWG5ZOB5ZCN5a2XLOaIluiAheiuqeaIkeaJk+W8gOebruW9leOAgiIscmVmcmVzaDoi5Yi35pawIixvcmRlcnNUaXRsZToi5oiR55qE6K6i5Y2VIn19LE49dD0+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksaz10PT5TdHJpbmcodD8/IiIpLnJlcGxhY2UoL1smPD4iJ10vZyxuPT4oeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KVtuXSksUG49KHQsbik9PnQucmVwbGFjZSgvXHsoXHcrKVx9L2csKHIsbyk9PlN0cmluZyhuW29dPz9yKSksb2U9bmV3IGFzKHtuYW1lOiJzaW5vY2FyZS1jaGVja291dCIsdmVyc2lvbjoiMi4wLjAifSk7bGV0IHo9T20uZW4sQj1udWxsLHdlPW51bGwsSmU9W107Y29uc3QgVW09dD0+e2NvbnN0IG49dD8ubGFuZzsobj09PSJlbiJ8fG49PT0iemgiKSYmKHo9T21bbl0pfSx6JD0odCxuLHIpPT5gZyR7dH1yJHtufWEke3J9YCxQbT10PT57Y29uc3Qgbj0vXmcoXGQrKXIoXGQrKWEoXGQrKSQvLmV4ZWModCk7aWYoIW58fCFCKXJldHVybjtjb25zdCByPUIuZ3JvdXBzW051bWJlcihuWzFdKV0/LnJvd3NbTnVtYmVyKG5bMl0pXSxvPXI/LmFjdGlvbnNbTnVtYmVyKG5bM10pXTtpZighcnx8IW8pcmV0dXJuO2NvbnN0IGU9ci5hY3Rpb25zLmxlbmd0aD4xP2Ake3IudGl0bGV9IMK3ICR7by5sYWJlbH1gOnIudGl0bGU7cmV0dXJuey4uLm8scm93OnIudGl0bGUsZGlzcGxheTplfX0sX3Q9KHQsbik9Pntjb25zdCByPSgpPT57b2Uub3Blbkxpbmsoe3VybDpufSkuY2F0Y2goKCk9PndpbmRvdy5vcGVuKG4sIl9ibGFuayIpKX0sbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTtvPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsciksbz8uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZT0+eyhlLmtleT09PSJFbnRlciJ8fGUua2V5PT09IiAiKSYmcigpfSl9LEllPSgpPT5gPGJ1dHRvbiBjbGFzcz0iYmFjayIgaWQ9ImJhY2siPiR7ayh6LmJhY2spfTwvYnV0dG9uPmAsVWU9KCk9PntOKCJiYWNrIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2lmKEIpcmV0dXJuIGNzKEIpO2lmKHdlKXJldHVybiBzcyh3ZSl9KX0seCQ9KCk9PmA8YnV0dG9uIGNsYXNzPSJnbyIgaWQ9Im9yZGVycyI+JHtrKHoudmlld09yZGVycyl9PC9idXR0b24+YCxUJD0oKT0+e04oIm9yZGVycyIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJzcGluIj4ke2soei5sb2FkaW5nKX08L2Rpdj5gLE5tKCl9KX0seHQ9dD0+e04oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+PHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHouY2FyZEZhaWxlZCl9PC9zcGFuPjxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj48L2Rpdj5gfTtsZXQgbWk9bnVsbCxvaT0hMTtjb25zdCBpaT10PT57bWk9dDtjb25zdCBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7biYmKG4uaGlkZGVuPSF0LG4udGl0bGU9ei5yZWZyZXNoLG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix6LnJlZnJlc2gpKX0saiQ9KCk9Pntjb25zdCB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7dCYmdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntpZihvaXx8IW1pKXJldHVybjtvaT0hMCx0LmRpc2FibGVkPSEwLHQuY2xhc3NMaXN0LmFkZCgiYnVzeSIpO2NvbnN0IG49KCk9PntvaT0hMTtjb25zdCByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7ciYmKHIuZGlzYWJsZWQ9ITEsci5jbGFzc0xpc3QucmVtb3ZlKCJidXN5IikpfTttaSgpLnRoZW4obixuKX0pfSxzcz10PT57d2U9dCxCPW51bGwsaWkobnVsbCk7Y29uc3Qgbj10LnByb2R1Y3RzPz9bXTtOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PVBuKHoucHJvZHVjdENvdW50LHtjb3VudDpuLmxlbmd0aH0pLE4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBncmlkIj4ke24ubWFwKChyLG8pPT5gPGRpdiBjbGFzcz0icGNlbGwiPgogICAgICAke3IuaW1hZ2VVcmw/YDxpbWcgY2xhc3M9InBpbWciIHNyYz0iJHtrKHIuaW1hZ2VVcmwpfSIgYWx0PSIiIGxvYWRpbmc9ImxhenkiPmA6YDxkaXYgY2xhc3M9InBpbWcgbm9uZSI+JHtrKHIuY2F0ZWdvcnk/PyIiKX08L2Rpdj5gfQogICAgICA8ZGl2IGNsYXNzPSJwbmFtZSI+JHtrKHIubmFtZSl9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InBtZXRhIj4ke3IucHJpY2VEaXNwbGF5P2soci5wcmljZURpc3BsYXkpOiIifTwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJhY3QgcGJ1eSIgaWQ9InAke299Ij5CdXk8L2J1dHRvbj4KICAgIDwvZGl2PmApLmpvaW4oIiIpfHxgPGRpdiBjbGFzcz0ici1zdWIiPiR7ayh6LmVtcHR5Q2F0YWxvZyl9PC9kaXY+YH08L2Rpdj5gLG4uZm9yRWFjaCgocixvKT0+TihgcCR7b31gKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ic3BpbiI+JHtrKHoub3BlbmluZyl9PC9kaXY+YCxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToic3RhcnRfc2lub2NhcmVfY2hlY2tvdXQiLGFyZ3VtZW50czp7c2t1OnIuc2t1fX0pLnRoZW4oZT0+e2xldCBpPWU/LnN0cnVjdHVyZWRDb250ZW50O2lmKCFpKXRyeXtpPUpTT04ucGFyc2UoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibnVsbCIpfWNhdGNoe31pZihpKXthZT0hMSxscyhpLCEwKTtyZXR1cm59SHMoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibm8gYW5zd2VyIGZyb20gdGhlIHN0b3JlZnJvbnQiKX0pLmNhdGNoKGU9PkhzKFN0cmluZyhlPy5tZXNzYWdlPz9lKSkpfSkpfSxIcz10PT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBlcnIiPiR7ayh6LmNhbm5vdE9wZW4pfTwvc3Bhbj4KICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj4KICAgICR7SWUoKX08L2Rpdj5gLFVlKCl9LE8kPSh0LG4scik9Pntjb25zdCBvPXIuYWN0aW9ucy5tYXAoKGUsaSk9PmA8YnV0dG9uIGRhdGEtYWN0PSIke3okKHQsbixpKX0iIGNsYXNzPSIke2UuZXh0PyJhY3QgZXh0IjoiYWN0In0iPiR7ayhlLmxhYmVsKX0ke2UuZXh0PyIg4oaXIjoiIOKGkiJ9PC9idXR0b24+YCkuam9pbigiIik7cmV0dXJuYDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1tYWluIj48c3BhbiBjbGFzcz0ici10aXRsZSI+JHtrKHIudGl0bGUpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7ayhyLnN1Yil9PC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJyb3ctYWN0cyI+JHtvfTwvZGl2PgogICAgPC9kaXY+YH0sY3M9dD0+e2lpKG51bGwpLEI9dCx3ZT13ZT8/bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXQucHJvZHVjdC5za3U7Y29uc3Qgbj0odC5ncm91cHM/P1tdKS5tYXAoKG8sZSk9PmA8ZGl2IGNsYXNzPSJncm91cC1sYWJlbCI+JHtrKG8ubGFiZWwpfTwvZGl2PjxkaXYgY2xhc3M9InJvd3MiPiR7by5yb3dzLm1hcCgoaSxhKT0+TyQoZSxhLGkpKS5qb2luKCIiKX08L2Rpdj5gKS5qb2luKCIiKSxyPXQucHJvZHVjdC5pbWFnZVVybD9gPGltZyBjbGFzcz0iaGVybyIgc3JjPSIke2sodC5wcm9kdWN0LmltYWdlVXJsKX0iIGFsdD0iJHtrKHQucHJvZHVjdC5uYW1lKX0iIG9uZXJyb3I9InRoaXMucmVtb3ZlKCkiPmA6IiI7TigiY29udGVudCIpLmlubmVySFRNTD1gCiAgICAke3J9CiAgICA8ZGl2IGNsYXNzPSJwcmljZSI+JHtrKHQucHJvZHVjdC5wcmljZURpc3BsYXk/PyIiKX08L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN1YiI+JHtrKHQucHJvZHVjdC5uYW1lKX0ke3QucXVhbnRpdHk+MT9gIMOXICR7dC5xdWFudGl0eX1gOiIifTwvZGl2PgogICAgJHtufQogICAgICAke3dlP0llKCk6IiJ9YDtmb3IoY29uc3QgbyBvZiBBcnJheS5mcm9tKE4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b25bZGF0YS1hY3RdIikpKW8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5EbShvLmRhdGFzZXQuYWN0KSk7TigiYmFjayIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PndlJiZzcyh3ZSkpfSxObT0odD0hMSk9Pm9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJsaXN0X215X29yZGVycyIsYXJndW1lbnRzOnt9fSkudGhlbihuPT57Y29uc3Qgcj1uPy5zdHJ1Y3R1cmVkQ29udGVudDtyPy52aWV3PT09Im9yZGVycyI/dXMocik6dHx8eHQoei5vcmRlcnNGYWlsZWQpfSkuY2F0Y2gobj0+e3R8fHh0KFN0cmluZyhuPy5tZXNzYWdlPz9uKSl9KSxVJD10PT4vY2FwdHVyZWR8Y29tcGxldGVkfHBhaWQvaS50ZXN0KHQuc3RhdHVzKSYmIS9yZWZ1bmQvaS50ZXN0KHQuc3RhdHVzKSYmIXQucmVmdW5kUGVuZGluZyxQJD10PT57Y29uc3Qgbj1TdHJpbmcodCkudG9Mb3dlckNhc2UoKTtyZXR1cm5gPHNwYW4gY2xhc3M9Im9zdGF0ICR7L3JlZnVuZC8udGVzdChuKT8id2FybiI6L2NhcHR1cmVkfGNvbXBsZXRlZHxwYWlkfHNldHRsZWQvLnRlc3Qobik/Im9rIjoibXV0ZWQifSI+JHtrKHQpfTwvc3Bhbj5gfSx1cz10PT57aWYoVW0odCksSmU9dC5vcmRlcnM/P1tdLEI9bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXoub3JkZXJzVGl0bGUsaWkoKCk9Pk5tKCEwKSksIUplLmxlbmd0aCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iZW1wdHkiPiR7ayh6Lm5vT3JkZXJzKX08L2Rpdj5gO3JldHVybn1OKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyb3dzIG9saXN0Ij4ke0plLm1hcCgobixyKT0+e2NvbnN0IG89W24udG90YWwsbi5wcm90b2NvbCxuLmRhdGVdLmZpbHRlcihCb29sZWFuKS5tYXAoaykuam9pbigiIMK3ICIpO3JldHVybmA8ZGl2IGNsYXNzPSJyb3ciIGRhdGEtcm93PSIke3J9Ij4KICAgICAgPGRpdiBjbGFzcz0icm93LW1haW4iPjxzcGFuIGNsYXNzPSJyLXRpdGxlIj4ke2sobi5wcm9kdWN0fHxuLm9yZGVySWQpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7b308L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1hY3RzIj4KICAgICAgICAke1AkKG4uc3RhdHVzKX0KICAgICAgICAke1UkKG4pP2A8YnV0dG9uIGNsYXNzPSJhY3QiIGRhdGEtcmVmdW5kPSIke3J9Ij4ke2soei5yZWZ1bmQpfTwvYnV0dG9uPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+YH0pLmpvaW4oIiIpfTwvZGl2PmA7Zm9yKGNvbnN0IG4gb2YgQXJyYXkuZnJvbShOKCJjb250ZW50IikucXVlcnlTZWxlY3RvckFsbCgiYnV0dG9uW2RhdGEtcmVmdW5kXSIpKSluLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+TiQoTnVtYmVyKG4uZGF0YXNldC5yZWZ1bmQpKSl9LE4kPXQ9Pntjb25zdCBuPUplW3RdO2lmKCFuKXJldHVybjtjb25zdCByPU4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yKGBidXR0b25bZGF0YS1yZWZ1bmQ9IiR7dH0iXWApLG89TigiY29udGVudCIpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvdz0iJHt0fSJdYCk7bz8ucXVlcnlTZWxlY3RvcigiLm8tZXJyIik/LnJlbW92ZSgpLHImJihyLmRpc2FibGVkPSEwLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmRpbmcpO2NvbnN0IGU9aT0+e2lmKHImJihyLmRpc2FibGVkPSExLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmQpLCFvKXJldHVybjtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuY2xhc3NOYW1lPSJvLWVyciIsYS50ZXh0Q29udGVudD1pLG8uYXBwZW5kQ2hpbGQoYSl9O29lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJyZXF1ZXN0X3JlZnVuZCIsYXJndW1lbnRzOntvcmRlcklkOm4ub3JkZXJJZH19KS50aGVuKGk9PntsZXQgYT17fTt0cnl7YT1KU09OLnBhcnNlKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGk/LmlzRXJyb3J8fGEucmVxdWVzdGVkPT09ITEpe2UoU3RyaW5nKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/YS5tZXNzYWdlPz96LnJlZnVuZEZhaWxlZCkpO3JldHVybn1KZVt0XT17Li4ubixzdGF0dXM6YS5zdGF0dXM/PyJyZWZ1bmQgcmVxdWVzdGVkIixyZWZ1bmRQZW5kaW5nOiEwfSx1cyh7b3JkZXJzOkplfSl9KS5jYXRjaChpPT5lKFN0cmluZyhpPy5tZXNzYWdlPz9pPz96LnJlZnVuZEZhaWxlZCkpKX0sRCQ9KCk9PntpZighQilyZXR1cm47Y29uc3QgdD1CLnByb2R1Y3Q7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5oYW5kZWRPdmVyKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5oYW5kZWRPdmVyQm9keSl9PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJtb25vIj4ke2sodC5uYW1lKX0ke3QucHJpY2VEaXNwbGF5P2AgwrcgJHtrKHQucHJpY2VEaXNwbGF5KX1gOiIifTwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIj4ke2soei5oYW5kZWRPdmVyV2FpdCl9PC9kaXY+CiAgICAke0llKCl9PC9kaXY+YCxVZSgpO2NvbnN0IG49UG4oei5oYW5kT2ZmQXNrLHtwcm9kdWN0OmAke3QubmFtZX0ke0IucXVhbnRpdHk+MT9gIMOXICR7Qi5xdWFudGl0eX1gOiIifWB9KTtvZS5zZW5kTWVzc2FnZSh7cm9sZToidXNlciIsY29udGVudDpbe3R5cGU6InRleHQiLHRleHQ6bn1dfSkuY2F0Y2goKCk9Pnt9KX0sRG09dD0+e2NvbnN0IG49UG0odCk7aWYoISghbnx8IUIpKXtpZihuLmNoYXQpe0QkKCk7cmV0dXJufU4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InNwaW4iPiR7ayhQbih6LnBheWluZyx7bWV0aG9kOm4uZGlzcGxheX0pKX08L2Rpdj5gLG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOm4udG9vbCxhcmd1bWVudHM6e3NrdTpCLnByb2R1Y3Quc2t1LHF1YW50aXR5OkIucXVhbnRpdHksLi4ubi5hcmdzPz97fX19KS50aGVuKHI9PkpuKHQscikpLmNhdGNoKHI9PkpuKHQse2lzRXJyb3I6ITAsY29udGVudDpbe3RleHQ6U3RyaW5nKHI/Lm1lc3NhZ2U/P3IpfV19KSl9fSxFJD0odCxuLHIpPT57Y29uc3Qgbz1OKCJwd2FpdCIpO2xldCBlPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ZT0hMH0pO2xldCBpPTA7Y29uc3QgYT0oKT0+e2V8fG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJnZXRfc2lub2NhcmVfb3JkZXJfc3RhdHVzIixhcmd1bWVudHM6e3Nlc3Npb25JZDp0LG1lcmNoYW50SWQ6bn19KS50aGVuKHM9PntpZihlKXJldHVybjtsZXQgYz17fTt0cnl7Yz1KU09OLnBhcnNlKHM/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGMucGFpZCl7Sm4ocixzKTtyZXR1cm59aWYoKytpPjIwMCl7byYmKG8udGV4dENvbnRlbnQ9ei5wYXlUaW1lb3V0KTtyZXR1cm59c2V0VGltZW91dChhLDNlMyl9KS5jYXRjaCgoKT0+e2V8fHNldFRpbWVvdXQoYSw0ZTMpfSl9O3NldFRpbWVvdXQoYSwzZTMpfSxaJD10PT57Y29uc3Qgbj1OKCJ3d2FpdCIpO2xldCByPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57cj0hMH0pO2NvbnN0IG89KCk9PntyfHxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToiY3VybGVzc193YWxsZXRfbG9naW5fc3RhdHVzIixhcmd1bWVudHM6e319KS50aGVuKGU9PntpZihyKXJldHVybjtsZXQgaT17fTt0cnl7aT1KU09OLnBhcnNlKGU/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGkuc2lnbmVkSW4pe24mJihuLnRleHRDb250ZW50PVBuKHouc2lnbmVkSW5QYXlpbmcse2VtYWlsOmkuZW1haWw/PyIifSkpLERtKHQpO3JldHVybn1pZihpLmV4cGlyZWQpe24mJihuLnRleHRDb250ZW50PXouc2lnbkluRXhwaXJlZCk7cmV0dXJufWlmKGkubmV2ZXJTdGFydGVkKXtuJiYobi50ZXh0Q29udGVudD16LnNpZ25Jbk5ldmVyU3RhcnRlZCk7cmV0dXJufXNldFRpbWVvdXQobywyZTMpfSkuY2F0Y2goKCk9PntyfHxzZXRUaW1lb3V0KG8sM2UzKX0pfTtzZXRUaW1lb3V0KG8sMmUzKX0sSm49KHQsbik9Pntjb25zdCByPVBtKHQpO2xldCBvPXt9O3RyeXtvPUpTT04ucGFyc2Uobj8uY29udGVudD8uWzBdPy50ZXh0Pz8ie30iKX1jYXRjaHt9aWYocj8uZXh0JiZvLnVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vbmVTdGVwTGVmdCl9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwYXlsaW5rIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHouZ29QYXkpfTwvc3Bhbj48L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsX3QoInBheWxpbmsiLFN0cmluZyhvLnVybCkpLFVlKCk7cmV0dXJufWlmKG8uYXdhaXRpbmdQYXltZW50KXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoub25lU3RlcExlZnQpfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKG8ubWVzc2FnZT8/IiIpfTwvZGl2PgogICAgICAke28udG90YWw/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhTdHJpbmcoby50b3RhbCkpfTwvZGl2PmA6IiJ9CiAgICAgICR7by5wYXlVcmw/YDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwZ28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5nb1BheSl9PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIiBpZD0icHdhaXQiPiR7ayh6LnBheVdhaXQpfTwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ucGF5VXJsJiZfdCgicGdvIixTdHJpbmcoby5wYXlVcmwpKSxVZSgpLG8uc2Vzc2lvbklkJiZvLm1lcmNoYW50SWQmJkUkKFN0cmluZyhvLnNlc3Npb25JZCksU3RyaW5nKG8ubWVyY2hhbnRJZCksdCk7cmV0dXJufWlmKG8ubmVlZHNMb2dpbiYmby5sb2dpblVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHRvZG8iPiR7ayh6LnNpZ25Jbil9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJ3Z28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5zaWduSW5Hbyl9PC9zcGFuPgogICAgICAgICR7by51c2VyQ29kZT9gPHNwYW4gY2xhc3M9InVjb2RlIj4ke2soby51c2VyQ29kZSl9PC9zcGFuPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIHdhaXRpbmciIGlkPSJ3d2FpdCI+JHtrKHouc2lnbkluV2FpdCl9PC9kaXY+CiAgICAgICR7SWUoKX08L2Rpdj5gLF90KCJ3Z28iLFN0cmluZyhvLmxvZ2luVXJsKSksVWUoKSxaJCh0KTtyZXR1cm59aWYoby53YWxsZXRSZWZ1c2VkKXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoud2FsbGV0U2FpZE5vKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/PyIiKX08L2Rpdj4KICAgICAgJHtvLndhbGxldFVybD9gPGRpdiBjbGFzcz0ibG9naW5yb3ciPjxzcGFuIGNsYXNzPSJhY3QgcHJpbWFyeSIgaWQ9IndvcGVuIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHoub3BlbldhbGxldCl9PC9zcGFuPjwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ud2FsbGV0VXJsJiZfdCgid29wZW4iLFN0cmluZyhvLndhbGxldFVybCkpLFVlKCk7cmV0dXJufWNvbnN0IGU9by5vcmRlcmVkPz9vLmJvb2tlZDtpZihuPy5pc0Vycm9yfHwoZT09PXZvaWQgMD9vLnN0YXR1cyE9PSJjYXB0dXJlZCImJm8uc3RhdHVzIT09ImNvbXBsZXRlZCI6ZT09PSExKSl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHoubm90Q29tcGxldGVkKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/P28ucmVhc29uPz9uPy5jb250ZW50Py5bMF0/LnRleHQ/PyIiKX08L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsVWUoKTtyZXR1cm59RW0obyl9LEVtPXQ9PntpaShudWxsKSxCJiYoTigibWVyY2hhbnQiKS50ZXh0Q29udGVudD1CLnByb2R1Y3Quc2t1KTtjb25zdCBuPXQucGFpZFJsdXNkPz90LnBhaWRVc2RjPz90LnRvdGFsPz8iIixyPXQudHhIYXNoLG89dC5leHBsb3JlcjtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vcmRlcmVkKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2sodC5tZXNzYWdlPz9Qbih6Lm9yZGVyZWRGYWxsYmFjayx7cHJvZHVjdDp0LnByb2R1Y3Q/P0I/LnByb2R1Y3QubmFtZT8/IiJ9KSl9PC9kaXY+CiAgICAke3QucGF5ZXI/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayh6LnBhaWRCeSl9ICR7ayhTdHJpbmcodC5wYXllcikpfTwvZGl2PmA6IiJ9CiAgICAke24/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhuKX08L2Rpdj5gOiIifQogICAgJHtyP2A8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5vbkNoYWluVHgpfSAke28/YDxzcGFuIGNsYXNzPSJ0eCIgaWQ9InR4bGluayIgcm9sZT0ibGluayIgdGFiaW5kZXg9IjAiPiR7ayhyKX0g4oaXPC9zcGFuPmA6YDxzcGFuIGNsYXNzPSJtb25vIj4ke2socil9PC9zcGFuPmB9PC9kaXY+YDoiIn0KICAgIDxkaXYgY2xhc3M9ImN0YS1yb3ciPiR7eCQoKX08YnV0dG9uIGNsYXNzPSJiYWNrIiBpZD0iYWdhaW4iPiR7ayh6Lm9yZGVyQWdhaW4pfTwvYnV0dG9uPjwvZGl2PgogIDwvZGl2PmAsciYmbyYmX3QoInR4bGluayIsU3RyaW5nKG8pKSxUJCgpLE4oImFnYWluIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e0ImJmNzKEIpfSl9O2xldCBhZT0hMSxidD1udWxsLHBpPW51bGwsYWk9ITEseXQ9bnVsbDtjb25zdCBscz0odCxuPSExKT0+e2lmKCF0KXJldHVybjtpZihVbSh0KSx0LnZpZXc9PT0icHJvZHVjdHMiKXtzcyh0KSxhZT0hMCxidD1udWxsLHBpPW51bGwsYWk9ITE7cmV0dXJufWlmKHQudmlldz09PSJvcmRlcnMiKXt1cyh0KSxhZT0hMDtyZXR1cm59aWYodC5vcmRlcmVkIT09dm9pZCAwfHx0LmJvb2tlZCE9PXZvaWQgMHx8dC5wYWlkIT09dm9pZCAwfHx0LmF3YWl0aW5nUGF5bWVudHx8dC5uZWVkc0xvZ2lufHx0LndhbGxldFJlZnVzZWQpe2FlPSEwLEpuKCIiLHtjb250ZW50Olt7dGV4dDpKU09OLnN0cmluZ2lmeSh0KX1dfSk7cmV0dXJufWlmKHQudmlldyE9PSJjaGVja291dCJ8fCF0LnByb2R1Y3Q/LnNrdSl7YWV8fChhZT0hMCxOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5ub3RoaW5nVG9TaG93KX08L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKHoubm90aGluZ1RvU2hvd0JvZHkpfTwvZGl2PjwvZGl2PmApO3JldHVybn1jb25zdCByPXQucHJvZHVjdC5za3U9PT1idCxvPSEhdC5yZWNlaXB0JiYhYWk7aWYoIShhZSYmIW8mJiEobiYmIXIpKSl7aWYoYWU9ITAsYnQ9dC5wcm9kdWN0LnNrdSxwaT10LnByb2R1Y3QubmFtZT8/bnVsbCxhaT0hIXQucmVjZWlwdCx0LnJlY2VpcHQpe0I9dCxFbSh0LnJlY2VpcHQpO3JldHVybn1jcyh0KX19LFIkPSgpPT5vZS5nZXRIb3N0Q29udGV4dCgpPy50b29sSW5mbz8udG9vbD8ubmFtZT8/InN0YXJ0X3Npbm9jYXJlX2NoZWNrb3V0IixIbj0odCxuPSEwKT0+e2NvbnN0IHI9UiQoKTtvZS5jYWxsU2VydmVyVG9vbCh7bmFtZTpyLGFyZ3VtZW50czp7Li4udCwuLi5uP3tfX3JlaHlkcmF0ZToxfTp7fX19KS50aGVuKG89Pntjb25zdCBlPW8/LnN0cnVjdHVyZWRDb250ZW50O2U/bHMoZSk6YWV8fHh0KHoubm90aGluZ1RvU2hvd0JvZHkpfSkuY2F0Y2gobz0+e2FlfHx4dChTdHJpbmcobz8ubWVzc2FnZT8/bykpfSl9LEMkPXQ9Pntjb25zdCBuPXR5cGVvZiB0LnNrdT09InN0cmluZyI/dC5za3UudHJpbSgpOiIiO2lmKG4pcmV0dXJuIG4hPT1idDtjb25zdCByPXR5cGVvZiB0LnF1ZXJ5PT0ic3RyaW5nIj90LnF1ZXJ5LnRyaW0oKToiIjtyZXR1cm4gcj8hYCR7cGk/PyIifSAke2J0Pz8iIn1gLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoci50b0xvd2VyQ2FzZSgpKTohMX07aiQoKTtvZS5vbnRvb2xyZXN1bHQ9dD0+bHModD8uc3RydWN0dXJlZENvbnRlbnQsITApO29lLm9udG9vbGlucHV0PXQ9Pntjb25zdCBuPXQ/LmFyZ3VtZW50cz8/e307aWYoIWFlKXt5dD1uLEhuKG4pO3JldHVybn1DJChuKSYmKHl0PW4sYWU9ITEsSG4obiwhMSkpfTtvZS5vbmhvc3Rjb250ZXh0Y2hhbmdlZD0oKT0+e307b2UuY29ubmVjdCgpLnRoZW4oKCk9Pntjb25zdCB0PW9lLmdldEhvc3RDb250ZXh0KCksbj10Py50b29sSW5mbz8uYXJndW1lbnRzPz90Py50b29sSW5wdXQ/LmFyZ3VtZW50cz8/dD8uYXJndW1lbnRzO24mJiFhZSYmKHl0PW4sSG4oeXQpKSxzZXRUaW1lb3V0KCgpPT57YWV8fEhuKHl0Pz97fSl9LDFlMyl9KS5jYXRjaCh0PT54dChTdHJpbmcodD8ubWVzc2FnZT8/dCkpKTs8L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZCI+CiAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlIj5TaW5vY2FyZTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibWVyY2hhbnQiIGlkPSJtZXJjaGFudCI+PC9zcGFuPgogICAgICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2giIGlkPSJyZWZyZXNoIiBoaWRkZW4+CiAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi40IgogICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgPHBhdGggZD0iTTIwIDExYTggOCAwIDEgMC0xLjggNiIgLz4KICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz0iMjAgNCAyMCAxMSAxMyAxMSIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY29udGVudCI+PGRpdiBjbGFzcz0iZW1wdHkiPkxvYWRpbmfigKY8L2Rpdj48L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo=',\n 'base64',\n).toString('utf8');\n"],"mappings":"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","names":["query","sku","wallet","sku","quantity","receipt","session","merchantId","reqs","xPayment","paidRes","paid","paidUsdc"]}
|