@dockstat/outline-sync 1.1.1 → 1.1.3
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/README.md +13 -13
- package/dist/cli.js +15 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# outline-sync — `@dockstat/outline-sync`
|
|
2
2
|
|
|
3
3
|
Sync Outline (app.getoutline.com) collections ↔ Markdown in your repo.
|
|
4
|
-
Designed for
|
|
4
|
+
Designed for multi-collection pipelines.
|
|
5
5
|
Features:
|
|
6
6
|
|
|
7
7
|
* Two-way sync (pull / push / timestamp-based sync)
|
|
8
8
|
* Multi-collection support (`--collection` repeatable)
|
|
9
|
-
* Folder-based default storage (each page → `<slug>/
|
|
9
|
+
* Folder-based default storage (each page → `<slug>/README.md`, children inherit folders)
|
|
10
10
|
* Per-collection mapping file for custom paths
|
|
11
11
|
* Config-driven: `configs/outline-sync.json`, `<collection>.config.json`, `<collection>.pages.json`
|
|
12
12
|
* Whitespace/newline-agnostic diffs (formatting-only changes are ignored)
|
|
@@ -54,7 +54,7 @@ This creates/updates:
|
|
|
54
54
|
* `configs/outline-sync.json` — top-level config listing collections
|
|
55
55
|
* `configs/<collection-id>.config.json` — per-collection mapping config
|
|
56
56
|
* `configs/<collection-id>.pages.json` — assembled manifest of pages (used by sync)
|
|
57
|
-
* `docs/...` — markdown files saved folder-based (`<slug>/
|
|
57
|
+
* `docs/...` — markdown files saved folder-based (`<slug>/README.md`)
|
|
58
58
|
|
|
59
59
|
4. Run a dry-run sync:
|
|
60
60
|
|
|
@@ -143,11 +143,11 @@ docs/ # markdown files (default saveDir)
|
|
|
143
143
|
"mappings": [
|
|
144
144
|
{
|
|
145
145
|
"match": { "id": "doc-id-123" },
|
|
146
|
-
"path": "guides/setup/" // directory mapping → will place doc as guides/setup/
|
|
146
|
+
"path": "guides/setup/" // directory mapping → will place doc as guides/setup/README.md
|
|
147
147
|
},
|
|
148
148
|
{
|
|
149
149
|
"match": { "title": "API Reference" },
|
|
150
|
-
"path": "reference/
|
|
150
|
+
"path": "reference/README.md" // explicit filename mapping
|
|
151
151
|
}
|
|
152
152
|
]
|
|
153
153
|
}
|
|
@@ -158,8 +158,8 @@ Rules:
|
|
|
158
158
|
* Match by `id` (preferred) or `title` (exact match).
|
|
159
159
|
* `path` can be:
|
|
160
160
|
|
|
161
|
-
* directory-like (`guides/setup/` or any path without `.md`) → page becomes `<path>/
|
|
162
|
-
* explicit file (`reference/
|
|
161
|
+
* directory-like (`guides/setup/` or any path without `.md`) → page becomes `<path>/README.md` and children inherit that directory,
|
|
162
|
+
* explicit file (`reference/README.md`) → used verbatim (relative to project root unless you give an absolute path),
|
|
163
163
|
* bare filename → placed under parent directory or `saveDir`.
|
|
164
164
|
|
|
165
165
|
## `configs/<collection_id>.pages.json` (generated)
|
|
@@ -172,12 +172,12 @@ This is a manifest of pages used by the sync engine. Example:
|
|
|
172
172
|
"pages": [
|
|
173
173
|
{
|
|
174
174
|
"title": "Product",
|
|
175
|
-
"file": "docs/product/
|
|
175
|
+
"file": "docs/product/README.md",
|
|
176
176
|
"id": "doc-product-id",
|
|
177
177
|
"children": [
|
|
178
178
|
{
|
|
179
179
|
"title": "Getting Started",
|
|
180
|
-
"file": "docs/product/getting-started/
|
|
180
|
+
"file": "docs/product/getting-started/README.md",
|
|
181
181
|
"id": "doc-getting-started-id",
|
|
182
182
|
"children": []
|
|
183
183
|
}
|
|
@@ -208,7 +208,7 @@ Default behavior: folder-based.
|
|
|
208
208
|
For each page:
|
|
209
209
|
|
|
210
210
|
```
|
|
211
|
-
<saveDir>/<ancestor-slug>/<page-slug>/
|
|
211
|
+
<saveDir>/<ancestor-slug>/<page-slug>/README.md
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
Example Outline structure:
|
|
@@ -222,9 +222,9 @@ Example Outline structure:
|
|
|
222
222
|
Results in:
|
|
223
223
|
|
|
224
224
|
```
|
|
225
|
-
docs/product/
|
|
226
|
-
docs/product/getting-started/
|
|
227
|
-
docs/product/getting-started/install/
|
|
225
|
+
docs/product/README.md
|
|
226
|
+
docs/product/getting-started/README.md
|
|
227
|
+
docs/product/getting-started/install/README.md
|
|
228
228
|
```
|
|
229
229
|
|
|
230
230
|
You can override per-page locations in the `<collection_id>.config.json` mappings (see above).
|
package/dist/cli.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
`,"utf8")}async function
|
|
5
|
-
`,"utf8")}var
|
|
6
|
-
`,"utf8")}async function
|
|
3
|
+
var DJ=Object.defineProperty;var l=(J,X)=>{for(var Q in X)DJ(J,Q,{get:X[Q],enumerable:!0,configurable:!0,set:($)=>X[Q]=()=>$})};var S=(J,X)=>()=>(J&&(X=J(J=0)),X);class f{minLevel;colors;showTimestamp;name;constructor(J){let{level:X="INFO",colors:Q=!0,timestamp:$=!0,name:K}=J??{};this.minLevel=X,this.showTimestamp=$,this.name=K;let H=typeof process!=="undefined"&&!!process.env.NO_COLOR,z=typeof process!=="undefined"&&!!process.stdout&&!!process.stdout.isTTY;this.colors=Q&&!H&&z}shouldLog(J){return R[J]>=0&&R[J]>=R[this.minLevel]&&R[this.minLevel]<R.NONE}levelMeta(J){switch(J){case"DEBUG":return{tag:"DEBUG",color:E.debug,emoji:"\uD83D\uDC1B"};case"INFO":return{tag:"INFO",color:E.info,emoji:"ℹ️"};case"WARN":return{tag:"WARN",color:E.warn,emoji:"⚠️"};case"ERROR":return{tag:"ERROR",color:E.error,emoji:"❌"}}}timestamp(){if(!this.showTimestamp)return"";return new Date().toISOString()}padLevelTag(J){return J.padEnd(5," ")}colorize(J,X){if(!this.colors||!X)return J;return`${X}${J}${E.reset}`}format(J,X){let Q=this.levelMeta(J),$=this.timestamp(),K=this.name?`[${this.name}] `:"",H=`[ ${this.padLevelTag(Q.tag)} ]`,z=Q.emoji;if(this.colors){let W=this.colorize(H,Q.color),j=this.colorize($?`${$} `:"",E.gray),Y=this.colorize(K,E.dim);return`${j}${Y}${W} ${z} ${X}`}return`${$?`${$} `:""}${K}${H} ${z} ${X}`}write(J,X){if(!this.shouldLog(J))return;let Q=this.format(J,X);switch(J){case"DEBUG":return console.debug?console.debug(Q):console.log(Q);case"INFO":return console.info?console.info(Q):console.log(Q);case"WARN":return console.warn?console.warn(Q):console.log(Q);case"ERROR":return console.error?console.error(Q):console.log(Q)}}debug(J){this.write("DEBUG",J)}info(J){this.write("INFO",J)}warn(J){this.write("WARN",J)}error(J){this.write("ERROR",J)}child(J){return new f({level:this.minLevel,colors:this.colors,timestamp:this.showTimestamp,name:J})}setLevel(J){this.minLevel=J}}var R,E;var VJ=S(()=>{R={DEBUG:0,INFO:1,WARN:2,ERROR:3,NONE:4},E={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",gray:"\x1B[90m"}});var BJ={};l(BJ,{sleep:()=>uJ,saveTopConfig:()=>CJ,saveCollectionConfig:()=>IJ,loadTopConfig:()=>t,loadCollectionConfig:()=>hJ,getCollectionTopConfig:()=>mJ,getCollectionFilesBase:()=>o,ensureConfigDirs:()=>YJ,ensureConfigDir:()=>qJ,TOP_CONFIG_FILE:()=>F});import b from"node:fs/promises";import{existsSync as p}from"node:fs";import O from"node:path";async function qJ(J){if(Z.debug(`Ensuring config dir: ${J}`),!p(J))Z.warn(`Dir (${J}) does not exist, creating...`),await b.mkdir(J,{recursive:!0})}async function YJ(J){let X=J.collections;console.debug(`Ensuring config dir for ${X.length} collection(s)`);for(let Q of X){let $=Q.configDir;if(Z.debug(`Ensuring config dir: ${$}`),!p($))Z.warn(`Dir (${$}) does not exist, creating...`),await b.mkdir($,{recursive:!0})}}async function t(){if(Z.debug(`Loading top config from: ${F}`),!p(F))return Z.warn("Top config file not found"),null;let J=await b.readFile(F,"utf8");return JSON.parse(J)}async function CJ(J){Z.debug("Saving top config"),await YJ(J),await b.writeFile(F,`${JSON.stringify(J,null,2)}
|
|
4
|
+
`,"utf8")}async function o(J){Z.debug("Getting Collection file base");let X=await t(),Q=X.collections.find((K)=>K.id===J).configDir;if(!X||!X.collections)return Z.warn(`No Top config found for ${J}, returning default`),{pagesFile:O.join(Q,`${J}.pages.json`),configFile:O.join(Q,`${J}.config.json`),saveDir:"docs",configDir:Q};let $=X.collections.find((K)=>K.id===J);if(!$)return Z.warn(`Collection config for ${J} not found, returning default paths`),{pagesFile:O.join(Q,`${J}.pages.json`),configFile:O.join(Q,`${J}.config.json`),saveDir:"docs",configDir:".config"};return{pagesFile:$.pagesFile||O.join(Q,`${J}.pages.json`),configFile:$.configFile||O.join(Q,`${J}.config.json`),saveDir:$.saveDir||"docs",configDir:$.configFile||".config"}}async function hJ(J){Z.debug(`Loading collection config for ${J}`);let{configFile:X}=await o(J);if(!p(X))return Z.warn(`Collection config file for ${J} not found`),null;let Q=await b.readFile(X,"utf8");return JSON.parse(Q)}async function mJ(J){Z.debug(`Getting Top Collection Config for ${J}`);let X=await t();if(!X||!X.collections)return Z.debug(`No Top Config found for ${J}`),null;return X.collections.find((Q)=>Q.id===J)||null}async function IJ(J){Z.debug(`Saving Collection config for ${J.collectionId}`);let{configFile:X,configDir:Q}=await o(J.collectionId);await qJ(Q),await b.writeFile(X,`${JSON.stringify(J,null,2)}
|
|
5
|
+
`,"utf8")}var F,uJ=(J)=>new Promise((X)=>setTimeout(X,J));var MJ=S(async()=>{await N();F=O.join("outline-sync.json")});import P from"node:fs/promises";import{existsSync as s}from"node:fs";import y from"node:path";async function jJ(J){if(Z.debug(`Ensuring config dir: ${J}`),!s(J))Z.warn(`Dir (${J}) does not exist, creating...`),await P.mkdir(J,{recursive:!0})}async function JJ(J){let X=J.collections;console.debug(`Ensuring config dir for ${X.length} collection(s)`);for(let Q of X){let $=Q.configDir;if(Z.debug(`Ensuring config dir: ${$}`),!s($))Z.warn(`Dir (${$}) does not exist, creating...`),await P.mkdir($,{recursive:!0})}}async function D(){if(Z.debug(`Loading top config from: ${d}`),!s(d))return Z.warn("Top config file not found"),null;let J=await P.readFile(d,"utf8");return JSON.parse(J)}async function QJ(J){Z.debug("Saving top config"),await JJ(J),await P.writeFile(d,`${JSON.stringify(J,null,2)}
|
|
6
|
+
`,"utf8")}async function x(J){Z.debug("Getting Collection file base");let X=await D(),Q=X.collections.find((K)=>K.id===J).configDir;if(!X||!X.collections)return Z.warn(`No Top config found for ${J}, returning default`),{pagesFile:y.join(Q,`${J}.pages.json`),configFile:y.join(Q,`${J}.config.json`),saveDir:"docs",configDir:Q};let $=X.collections.find((K)=>K.id===J);if(!$)return Z.warn(`Collection config for ${J} not found, returning default paths`),{pagesFile:y.join(Q,`${J}.pages.json`),configFile:y.join(Q,`${J}.config.json`),saveDir:"docs",configDir:".config"};return{pagesFile:$.pagesFile||y.join(Q,`${J}.pages.json`),configFile:$.configFile||y.join(Q,`${J}.config.json`),saveDir:$.saveDir||"docs",configDir:$.configFile||".config"}}async function UJ(J){Z.debug(`Loading collection config for ${J}`);let{configFile:X}=await x(J);if(!s(X))return Z.warn(`Collection config file for ${J} not found`),null;let Q=await P.readFile(X,"utf8");return JSON.parse(Q)}var d,e=(J)=>new Promise((X)=>setTimeout(X,J));var r=S(async()=>{await N();d=y.join("outline-sync.json")});async function u(J,X,Q=3){let $=`${AJ}/api/${J}`;for(let K=0;K<Q;K++)try{Z.debug(`Outline request: POST ${$} (attempt ${K+1})`),Z.debug(`Payload (trimmed): ${JSON.stringify(X,null,2)}`);let H=await fetch($,{method:"POST",headers:pJ,body:JSON.stringify(X)});if(H.status===429){let W=1000*(K+1);Z.warn(`Rate limited by Outline API. Backing off ${W}ms (attempt ${K+1}).`),await e(W);continue}let z;try{z=await H.json()}catch(W){throw Z.error(`Failed to parse JSON response from ${J}: ${W}`),W}if(!H.ok)throw Z.error(`[Outline@${AJ}/api/${J}] HTTP ${H.status} - payload=${JSON.stringify(X)} response=${JSON.stringify(z)}`),new Error(`Outline API error ${H.status}: ${JSON.stringify(z)}`);return Z.debug(`Outline response for ${J} (attempt ${K+1}): ${JSON.stringify(z).slice(0,200)}${JSON.stringify(z).length>200?"...":""}`),z}catch(H){if(K===Q-1)throw Z.error(`Request to Outline failed after ${Q} attempts: ${H?.message??H}`),H;let z=500*(K+1);Z.warn(`Request failed (attempt ${K+1}): ${H?.message??H}. Retrying after ${z}ms...`),await e(z)}throw new Error("outlineRequest: unreachable")}async function kJ(){let J=[],X=0,Q=100;while(!0){let K=(await u("collections.list",{offset:X,limit:Q})).data||[];for(let H of K)J.push({id:H.id,name:H.name});if(K.length<Q)break;X+=K.length}return Z.debug(`listCollectionsPaged: returned ${J.length} collections`),J}async function wJ(J){let X=[],Q=0,$=100;while(!0){let H=(await u("documents.list",{collectionId:J,offset:Q,limit:$})).data||[];for(let z of H)X.push(z);if(H.length<$)break;Q+=H.length}return Z.debug(`listDocumentsInCollection(${J}): returned ${X.length} documents`),X}async function GJ(J){let X=await u("documents.info",{id:J});return Z.debug(`fetchDocumentInfo(${J}) -> ${X?"ok":"null"}`),X.data??null}async function LJ(J,X,Q,$){let H=await u("documents.create",{title:J,text:X,collectionId:Q,parentDocumentId:$||null,publish:!0});return Z.info(`Created document "${J}" in collection ${Q} (id=${H?.id??"unknown"})`),H.data}async function XJ(J,X,Q){let $={id:J,text:Q,publish:!0};if(X)$.title=X;let K=await u("documents.update",$);return Z.info(`Updated document id=${J}${X?` title="${X}"`:""}`),K.data}var AJ,fJ,pJ;var ZJ=S(async()=>{await r();await N();AJ=process.env.OUTLINE_BASE_URL||"https://app.getoutline.com",fJ=process.env.OUTLINE_API_KEY||"",pJ={Authorization:`Bearer ${fJ}`,"Content-Type":"application/json"}});import g from"node:fs/promises";import{existsSync as dJ}from"node:fs";import C from"node:path";import{spawnSync as sJ}from"node:child_process";function $J(J){return J.replace(/\s+/g,"")}function h(J){return J.toString().normalize("NFKD").replace(/\p{M}/gu,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)+/g,"").slice(0,120)}function rJ(J){try{let X=C.resolve(J),Q=sJ("git",["log","-1","--format=%ct","--",X],{cwd:process.cwd(),encoding:"utf8"});if(Q.status!==0)return Z.debug(`git log returned non-zero status for ${X}: ${Q.status}`),null;let $=(Q.stdout||"").trim();if(!$)return Z.debug(`git log returned no output for ${X}`),null;let K=Number($);if(Number.isNaN(K))return Z.debug(`git log output not a number for ${X}: "${$}"`),null;return K*1000}catch(X){return Z.debug(`getGitTimestampMs error for ${J}: ${X}`),null}}async function SJ(J){let X=rJ(J);if(X)return Z.debug(`Using git timestamp for ${J}: ${X}`),X;let Q=await g.stat(J);return Z.debug(`Using FS mtime for ${J}: ${Q.mtimeMs}`),Q.mtimeMs}async function a(J,X,Q=!1){if(dJ(J)){let $=`${J}.outline-sync.bak.${Date.now()}`;if(!Q)try{await g.copyFile(J,$),Z.info(`Backed up existing file to ${$}`)}catch(K){Z.warn(`Failed to back up ${J} to ${$}: ${K}`)}else Z.debug(`[dry-run] would backup existing file ${J} -> ${$}`)}else if(!Q)try{await g.mkdir(C.dirname(J),{recursive:!0}),Z.debug(`Ensured directory ${C.dirname(J)}`)}catch($){Z.warn(`Failed to create directory ${C.dirname(J)}: ${$}`)}else Z.debug(`[dry-run] would ensure directory ${C.dirname(J)}`);if(!Q)try{await g.writeFile(J,X,"utf8"),Z.info(`Wrote file ${J} (${X.length} bytes)`)}catch($){throw Z.error(`Failed to write file ${J}: ${$}`),$}else Z.debug(`[dry-run] would write file ${J} (${X.length} bytes)`)}var HJ=S(async()=>{await N()});var EJ={};l(EJ,{question:()=>n,listCollectionsPrompt:()=>aJ,bootstrapCollection:()=>cJ});import c from"node:fs/promises";import{existsSync as gJ}from"node:fs";import _ from"node:path";async function aJ(J){let X=await kJ();if(!X.length){Z.warn("No collections found for this API key.");return}if(console.info("Collections:"),X.forEach((Y,V)=>console.info(`${V+1}) ${Y.id} ${Y.name}`)),J.nonInteractive)return;let Q=await n("Select a collection by number (or press Enter to cancel): "),$=Number(Q.trim());if(!$||$<1||$>X.length){Z.warn("Cancelled collection selection.");return}let K=X[$-1];Z.info(`You chose: ${K.name} (${K.id})`),await JJ(await D()||{collections:[]});let H=await D()||{collections:[]},z=H.collections.find((Y)=>Y.id===K.id),W=(await n("Enter a base folder path for the collections config files (or press enter for default `.config`): ")).replaceAll(`
|
|
7
|
+
`,"");if(W.trim().length<=1)W=".config",Z.debug("Using default configDir `.config`");let j=(await n("Enter a base folder path for the collections markdown files (or press enter for default `docs`): ")).replaceAll(`
|
|
8
|
+
`,"");if(j.trim().length<=1)j="docs",Z.debug("Using default saveDir `docs`");if(!z)H.collections.unshift({id:K.id,name:K.name,configDir:W,saveDir:j,pagesFile:_.join(W,`${K.id}.pages.json`),configFile:_.join(W,`${K.id}.config.json`)}),await QJ(H),Z.info(`Added collection to ${_.join("configs","outline-sync.json")}`);else Z.warn("Collection already configured.")}function n(J){return new Promise((X)=>{process.stdout.write(J),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.once("data",(Q)=>{process.stdin.pause(),X(Q.toString())})})}async function cJ(J){let{collectionId:X,dryRun:Q=!1}=J;Z.info(`Bootstrapping collection ${X} (dryRun=${Q})...`);let $=await wJ(X);Z.info(`Fetched ${$.length} documents from Outline.`),Z.debug(`First 3 documents: ${JSON.stringify($.slice(0,3),null,2)}`);let K=new Map;for(let q of $)K.set(q.id,{title:q.title,file:"",id:q.id,children:[],raw:q});let H=[];for(let q of K.values()){let w=q.raw||{},G=w.parentDocumentId??w.parentId??null;if(G&&K.has(G))K.get(G).children.push(q);else H.push(q)}Z.debug(`Built document tree with ${H.length} root(s)`);let{saveDir:z}=await x(X);function W(q,w){let G=h(q.title||"untitled"),zJ=_.join(w,G),FJ=_.join(zJ,"README.md");if(q.file=FJ,q.children?.length)for(let PJ of q.children)W(PJ,zJ)}for(let q of H)W(q,z);for(let q of K.values()){let w=q.file,G=q.raw?.text??`# ${q.title}
|
|
7
9
|
|
|
8
|
-
`;if(!
|
|
9
|
-
`,"utf8"),!
|
|
10
|
-
`,"utf8");let
|
|
11
|
-
`,"utf8")}function
|
|
10
|
+
`;if(!Q)await c.mkdir(_.dirname(w),{recursive:!0}),await c.writeFile(w,G,"utf8"),Z.debug(`Wrote file: ${w}`);else Z.debug(`[dry-run] would write ${w} (${G.length} bytes)`)}function j(q){return{title:q.title,file:q.file,id:q.id,children:(q.children||[]).map(j)}}let Y={collectionId:X,pages:H.map(j)},{pagesFile:V,configFile:B,saveDir:L,configDir:U}=await x(X);if(await jJ(U),!Q){if(await c.writeFile(V,`${JSON.stringify(Y,null,2)}
|
|
11
|
+
`,"utf8"),Z.info(`Saved manifest: ${V}`),!gJ(B))await c.writeFile(B,`${JSON.stringify({collectionId:X,saveDir:L,mappings:[]},null,2)}
|
|
12
|
+
`,"utf8"),Z.info(`Created new config: ${B}`);let q=await D()||{collections:[]};if(!q.collections.find((G)=>G.id===X))q.collections.unshift({id:X,saveDir:L,pagesFile:V,configFile:B}),await QJ(q),Z.debug(`Updated top config with collection ${X}`)}else Z.debug(`[dry-run] would save pages to ${V} and config to ${B}`);Z.info(`Bootstrap complete: wrote ${V} and ${B}`)}var OJ=S(async()=>{await ZJ();await r();await HJ();await N()});var _J={};l(_J,{syncPage:()=>KJ,runSync:()=>nJ,persistPagesManifest:()=>xJ,loadPagesManifest:()=>yJ,contentsEqualIgnoringWhitespace:()=>m,applyMappingsToManifest:()=>bJ});import I from"node:fs/promises";import{existsSync as NJ}from"node:fs";import M from"node:path";async function yJ(J){let{pagesFile:X}=await x(J);if(!NJ(X))throw Z.error(`${X} not found. Run init/setup to create it`),new Error(`${X} not found. Run init/setup to create it`);let Q=await I.readFile(X,"utf8");return Z.debug(`Loaded pages manifest from ${X} (${Q.length} bytes)`),JSON.parse(Q)}async function xJ(J,X,Q=!1){let{pagesFile:$}=await x(J);if(Q){Z.debug(`[dry-run] would persist manifest to ${$}`);return}await I.writeFile($,`${JSON.stringify(X,null,2)}
|
|
13
|
+
`,"utf8"),Z.info(`Persisted manifest to ${$}`)}function bJ(J,X){let Q=X?.mappings||[];function $(H){if(!H)return!1;if(H.endsWith("/")||H.endsWith(M.sep))return!0;return M.extname(H).toLowerCase()!==".md"}function K(H,z){let W=!1;for(let Y of Q)if(Y.match?.id&&H.id===Y.match.id){let V=Y.path;if($(V)){let B=V.endsWith("/")?V:V;H.file=M.join(B,"README.md")}else H.file=V;W=!0,Z.debug(`Mapping applied by id for "${H.title}" -> ${H.file}`);break}if(!W){for(let Y of Q)if(Y.match?.title&&H.title===Y.match.title){let V=Y.path;if($(V)){let B=V.endsWith("/")?V:V;H.file=M.join(B,"README.md")}else H.file=V;W=!0,Z.debug(`Mapping applied by title for "${H.title}" -> ${H.file}`);break}}if(!H.file){let Y=h(H.title||"untitled"),V=z?M.join(z,Y):M.join(X?.saveDir||"docs",Y);H.file=M.join(V,"README.md"),Z.debug(`Inherited path for "${H.title}" -> ${H.file}`)}else if(!(M.dirname(H.file)&&M.dirname(H.file)!==".")){let V=z||X?.saveDir||"docs";H.file=M.join(V,H.file),Z.debug(`Normalized bare filename for "${H.title}" -> ${H.file}`)}else Z.debug(`Using mapped path for "${H.title}" -> ${H.file}`);let j=M.dirname(H.file);if(H.children?.length)for(let Y of H.children)K(Y,j)}for(let H of J.pages)K(H,null);return Z.debug(`Applied mappings to manifest (rules=${Q.length})`),J}function m(J,X){return $J(J)===$J(X)}async function KJ(J,X,Q,$,K){let H=Q.file,z=M.resolve(H),W=NJ(z),j=0;if(W)try{j=await SJ(z)}catch(U){Z.warn(`Failed to get local timestamp for ${z}: ${U}`),j=0}let Y=null;if(Q.id)try{Y=await GJ(Q.id)}catch(U){Z.warn(`Failed to fetch remote info for ${Q.title} (${Q.id}): ${U}`),Y=null}let V=Y?.text??null,B=Y?.updatedAt?new Date(Y.updatedAt).getTime():0;if(Z.debug(`syncPage("${Q.title}") localExists=${W} localTs=${j} remoteExists=${!!Y} remoteUpdatedAt=${B}`),!W){if(K.mode==="pull"||K.mode==="sync"||K.mode==="push"){let U=V!=null?V:`# ${Q.title}
|
|
12
14
|
|
|
13
|
-
`;await
|
|
15
|
+
`;await a(z,U,K.dryRun||!1),Z.info(`[INIT] Ensured local file for "${Q.title}" -> ${z}`)}}if(!Q.id){let U=await I.readFile(z,"utf8");if(K.dryRun)Z.info(`[dry-run][CREATE] Would create remote doc for "${Q.title}" in collection ${J}`);else try{let q=await LJ(Q.title,U,J,$);Q.id=q?.id??Q.id,Z.info(`[CREATE] Created remote "${Q.title}" id=${Q.id}`)}catch(q){Z.error(`[CREATE] Failed to create remote for ${Q.title}: ${q}`)}}else{let U=await I.readFile(z,"utf8");if(K.mode==="pull")if(V!=null&&!m(U,V))Z.info(`[PULL] Remote applied to local for "${Q.title}"`),await a(z,V??"",K.dryRun||!1);else Z.debug(`[SKIP] No change (pull) for "${Q.title}"`);else if(K.mode==="push")if(V==null||!m(U,V))if(K.dryRun)Z.info(`[dry-run][PUSH] Would update remote "${Q.title}" id=${Q.id}`);else try{await XJ(Q.id,Q.title,U),Z.info(`[PUSH] Updated remote "${Q.title}" id=${Q.id}`)}catch(q){Z.error(`[PUSH] Failed to update remote for ${Q.title}: ${q}`)}else Z.debug(`[SKIP] No change (push) for "${Q.title}"`);else if(B>j+500)if(!m(U,V??""))Z.info(`[PULL] Remote newer -> overwrite local for "${Q.title}"`),await a(z,V??"",K.dryRun||!1);else Z.debug(`[SKIP] equal after normalizing (remote newer timestamp but content same) "${Q.title}"`);else if(j>B+500)if(!m(U,V??""))if(Z.info(`[PUSH] Local newer -> update remote for "${Q.title}"`),K.dryRun)Z.info(`[dry-run] would update remote ${Q.title}`);else try{await XJ(Q.id,Q.title,U),Z.info(`[PUSH] Updated remote "${Q.title}" id=${Q.id}`)}catch(q){Z.error(`[PUSH] Failed to update remote for ${Q.title}: ${q}`)}else Z.debug(`[SKIP] equal after normalizing (local newer timestamp but content same) "${Q.title}"`);else Z.debug(`[SKIP] No changes for "${Q.title}"`)}let L=Q.id||$;if(Q.children?.length)for(let U of Q.children)await KJ(J,X,U,L,K)}async function nJ(J){let{collectionId:X,mode:Q,dryRun:$=!1}=J;Z.info(`Starting ${Q} for collection ${X} (dryRun=${$})`);let K=await yJ(X),H=await UJ(X)||{saveDir:"docs",mappings:[]};bJ(K,H);async function z(W,j){if(!W.file){let B=h(W.title||"untitled"),L=j?M.join(j,B):M.join(H.saveDir||"docs",B);W.file=M.join(L,"README.md")}else{let B=M.dirname(W.file);if(!B||B==="."){let L=j||H.saveDir||"docs";W.file=M.join(L,W.file)}}let Y=M.dirname(W.file);if(!$)try{await I.mkdir(Y,{recursive:!0}),Z.debug(`Ensured directory ${Y}`)}catch(B){Z.warn(`Failed to ensure directory ${Y}: ${B}`)}else Z.debug(`[dry-run] would ensure directory ${Y}`);let V=M.dirname(W.file);if(W.children?.length)for(let B of W.children)await z(B,V)}for(let W of K.pages)await z(W,null);Z.debug("Completed path normalization for manifest");for(let W of K.pages)await KJ(X,K,W,null,{mode:Q,dryRun:$});await xJ(X,K,$),Z.info("Done.")}var vJ=S(async()=>{await r();await HJ();await ZJ();await N()});var WJ,RJ=!1,A,T,Z,iJ,TJ,lJ,tJ,k,v,i;var N=S(async()=>{VJ();WJ=process.argv.slice(2),A={},T=[];for(let J=0;J<WJ.length;J++){let X=WJ[J];if(X==="--help"||X==="-h")T.push("--help");else if(X==="--verbose")T.push("--verbose");else if(X.startsWith("--collection=")||X.startsWith("--collection:")){let Q=X.split(/[:=]/)[1]||"";if(!A.collection)A.collection=[];A.collection.push(Q)}else if(X==="--collection"){let Q=WJ[J+1];if(Q&&!Q.startsWith("--")){if(!A.collection)A.collection=[];A.collection.push(Q),J++}}else if(X.startsWith("--")){let[Q,$]=X.replace(/^--/,"").split("=");A[Q]=$===void 0?!0:$}else T.push(X)}if(A["api-key"])process.env.OUTLINE_API_KEY=String(A["api-key"]);if(A["base-url"])process.env.OUTLINE_BASE_URL=String(A["base-url"]);if(T.includes("--verbose"))RJ=!0;Z=new f({level:RJ?"DEBUG":"INFO"});if(T.includes("--help")||A.help||A.h)console.log(`
|
|
14
16
|
Usage:
|
|
15
17
|
OUTLINE_API_KEY=... bun run bin/cli.ts [command] [--collection=ID]... [--dry-run] [--api-key="..."]
|
|
16
18
|
|
|
@@ -31,9 +33,8 @@ Flags:
|
|
|
31
33
|
Examples:
|
|
32
34
|
OUTLINE_API_KEY=... bunx @dockstat/outline-sync --collection="id1" --collection="id2" sync --dry-run
|
|
33
35
|
bun run bin/cli.ts sync --api-key="sk_xxx" --collection="id1"
|
|
34
|
-
`),process.exit(0);
|
|
35
|
-
==> bootstrapping collection ${
|
|
36
|
-
==> Running ${J} for collection ${w}`),await sj({collectionId:w,mode:J,dryRun:R});process.exit(0)}console.error("Unknown command:",Y),process.exit(1)}catch(u){console.error("ERROR:",u?.message||u),process.exit(1)}
|
|
36
|
+
`),process.exit(0);({loadTopConfig:iJ}=await MJ().then(() => BJ)),{listCollectionsPrompt:TJ,bootstrapCollection:lJ}=await OJ().then(() => EJ),{runSync:tJ}=await vJ().then(() => _J);Z.debug("Parsing positionals");k=T[0]||"sync",v=Boolean(A["dry-run"]),i=A.collection??[];Z.debug(`Parsed cmd=${k} DRY_RUN=${v} collectionsFromCli=${i}`);try{Z.debug("Loading top config");let J=await iJ()||{collections:[]};Z.debug(`Loaded: ${JSON.stringify(J)}`);let X=()=>{if(Z.debug("Resolving targets"),i.length>0)return Z.debug(`Found Collection from cli: ${JSON.stringify(i)}`),i;if(J.collections&&J.collections.length>0)return Z.debug(`Found collections in Top Config: ${JSON.stringify(J)}`),J.collections.map((Q)=>Q.id);return Z.warn("Couldn't resolve targets"),[]};if(k==="list-collections")console.debug("Listing collections"),await TJ({dryRun:v,nonInteractive:!1}),process.exit(0);if(k==="setup")console.debug("Running setup"),await TJ({dryRun:v,nonInteractive:!1}),process.exit(0);if(k==="init"){console.debug("Running init");let Q=X();if(!Q.length)throw new Error("Init requires at least one collection. Provide --collection or run setup.");for(let $ of Q)console.log(`
|
|
37
|
+
==> bootstrapping collection ${$} (dryRun=${v})`),await lJ({collectionId:$,dryRun:v});process.exit(0)}if(k==="pull"||k==="push"||k==="sync"){Z.debug("Parsing CMD (pull/push/sync)");let Q=X();if(!Q.length)throw new Error(`Command "${k}" requires at least one collection id. Provide with --collection=ID or run setup.`);let $=k==="pull"?"pull":k==="push"?"push":"sync";for(let K of Q)await tJ({collectionId:K,mode:$,dryRun:v});process.exit(0)}Z.error(`Unknown command: ${k}`),process.exit(1)}catch(J){console.error("ERROR:",J?.message||J),process.exit(1)}});await N();export{Z as logger};
|
|
37
38
|
|
|
38
|
-
//# debugId=
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2NvbmZpZy50cyIsICIuLi9saWIvb3V0bGluZUFwaS50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvaW5pdC50cyIsICIuLi9saWIvc3luY0VuZ2luZS50cyIsICIuLi9iaW4vY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFRvcENvbmZpZywgVG9wQ29sbGVjdGlvbkNvbmZpZywgQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfRElSID0gXCJjb25maWdzXCI7XG5leHBvcnQgY29uc3QgVE9QX0NPTkZJR19GSUxFID0gcGF0aC5qb2luKFwib3V0bGluZS1zeW5jLmpzb25cIik7XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29uZmlnRGlyKCkge1xuICBpZiAoIWV4aXN0c1N5bmMoQ09ORklHX0RJUikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRvcENvbmZpZygpOiBQcm9taXNlPFRvcENvbmZpZyB8IG51bGw+IHtcbiAgaWYgKCFleGlzdHNTeW5jKFRPUF9DT05GSUdfRklMRSkpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShUT1BfQ09ORklHX0ZJTEUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUb3BDb25maWc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVG9wQ29uZmlnKGNmZzogVG9wQ29uZmlnKSB7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0RpcigpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgVE9QX0NPTkZJR19GSUxFLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KGNmZywgbnVsbCwgMil9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgcGFnZXNGaWxlOiBzdHJpbmc7XG4gIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgc2F2ZURpcjogc3RyaW5nO1xufT4ge1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG5cbiAgLy8gSWYgbm8gdG9wIGNvbmZpZyBleGlzdHMsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZXNGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgICBjb25maWdGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgICAgc2F2ZURpcjogXCJkb2NzXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNvbGxlY3Rpb24gY29uZmlndXJhdGlvblxuICBjb25zdCBjb2xsZWN0aW9uQ29uZmlnID0gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoXG4gICAgKGMpID0+IGMuaWQgPT09IGNvbGxlY3Rpb25JZCxcbiAgKTtcblxuICAvLyBJZiBubyBzcGVjaWZpYyBjb2xsZWN0aW9uIGNvbmZpZyBmb3VuZCwgdXNlIGRlZmF1bHQgcGF0aHNcbiAgaWYgKCFjb2xsZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgIH07XG4gIH1cblxuICAvLyBVc2UgY3VzdG9tIHBhdGhzIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGRlZmF1bHRzXG4gIHJldHVybiB7XG4gICAgcGFnZXNGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5wYWdlc0ZpbGUgfHxcbiAgICAgIHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICBjb25maWdGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5jb25maWdGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgIHNhdmVEaXI6IGNvbGxlY3Rpb25Db25maWcuc2F2ZURpciB8fCBcImRvY3NcIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uQ29uZmlnKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbik6IFByb21pc2U8Q29sbGVjdGlvbkNvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgeyBjb25maWdGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGNvbmZpZ0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDb2xsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblRvcENvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRvcENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGNvbnN0IHRvcENvbmZpZyA9IGF3YWl0IGxvYWRUb3BDb25maWcoKTtcbiAgaWYgKCF0b3BDb25maWcgfHwgIXRvcENvbmZpZy5jb2xsZWN0aW9ucykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKSB8fCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbGxlY3Rpb25Db25maWcoYzogQ29sbGVjdGlvbkNvbmZpZykge1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXIoKTtcbiAgY29uc3QgeyBjb25maWdGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGMuY29sbGVjdGlvbklkKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGNvbmZpZ0ZpbGUsIGAke0pTT04uc3RyaW5naWZ5KGMsIG51bGwsIDIpfVxcbmAsIFwidXRmOFwiKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi9jb25maWdcIjtcbmNvbnN0IEJBU0VfVVJMID0gcHJvY2Vzcy5lbnYuT1VUTElORV9CQVNFX1VSTCB8fCBcImh0dHBzOi8vYXBwLmdldG91dGxpbmUuY29tXCI7XG5jb25zdCBBUElfS0VZID0gcHJvY2Vzcy5lbnYuT1VUTElORV9BUElfS0VZIHx8IFwiXCI7XG5jb25zdCBIRUFERVJTID0ge1xuICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7QVBJX0tFWX1gLFxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIG91dGxpbmVSZXF1ZXN0KFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBib2R5OiBhbnksXG4gIHJldHJpZXMgPSAzLFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgdXJsID0gYCR7QkFTRV9VUkx9L2FwaS8ke2VuZHBvaW50fWA7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBIRUFERVJTLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBjb25zdCBiYWNrb2ZmID0gMTAwMCAqIChhdHRlbXB0ICsgMSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmF0ZSBsaW1pdGVkLiBiYWNraW5nIG9mZiAke2JhY2tvZmZ9bXNgKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgYmFja29mZikpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW091dGxpbmVAJHtCQVNFX1VSTH0vYXBpLyR7ZW5kcG9pbnR9XSAke3Jlcy5zdGF0dXN9ICR7ZW5kcG9pbnR9IHBheWxvYWQ9YCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIFwicmVzcG9uc2U9XCIsXG4gICAgICAgICAganNvbixcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPdXRsaW5lIEFQSSBlcnJvciAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KGpzb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzIC0gMSkgdGhyb3cgZXJyO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUmVxdWVzdCBmYWlsZWQgKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0pOiAke2Vycn0uIFJldHJ5aW5nLi4uYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDAgKiAoYXR0ZW1wdCArIDEpKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIm91dGxpbmVSZXF1ZXN0OiB1bnJlYWNoYWJsZVwiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDb2xsZWN0aW9uc1BhZ2VkKCk6IFByb21pc2U8XG4gIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXVxuPiB7XG4gIGNvbnN0IG91dDogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBvZmZzZXQgPSAwO1xuICBjb25zdCBsaW1pdCA9IDEwMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJjb2xsZWN0aW9ucy5saXN0XCIsIHsgb2Zmc2V0LCBsaW1pdCB9KTtcbiAgICBjb25zdCBkYXRhID0ganNvbi5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSBvdXQucHVzaCh7IGlkOiBjLmlkLCBuYW1lOiBjLm5hbWUgfSk7XG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgbGltaXQpIGJyZWFrO1xuICAgIG9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3VtZW50c0luQ29sbGVjdGlvbihcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IG91dDogYW55W10gPSBbXTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IGxpbWl0ID0gMTAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCBvdXRsaW5lUmVxdWVzdChcImRvY3VtZW50cy5saXN0XCIsIHtcbiAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGxpbWl0LFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBqc29uLmRhdGEgfHwgW107XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGEpIG91dC5wdXNoKGQpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IGxpbWl0KSBicmVhaztcbiAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRG9jdW1lbnRJbmZvKGRvY3VtZW50SWQ6IHN0cmluZykge1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuaW5mb1wiLCB7IGlkOiBkb2N1bWVudElkIH0pO1xuICByZXR1cm4ganNvbi5kYXRhID8/IG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEb2N1bWVudChcbiAgdGl0bGU6IHN0cmluZyxcbiAgdGV4dDogc3RyaW5nLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgcGFyZW50RG9jdW1lbnRJZDogc3RyaW5nIHwgbnVsbCxcbikge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgY29sbGVjdGlvbklkLFxuICAgIHBhcmVudERvY3VtZW50SWQ6IHBhcmVudERvY3VtZW50SWQgfHwgbnVsbCxcbiAgICBwdWJsaXNoOiB0cnVlLFxuICB9O1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuY3JlYXRlXCIsIHBheWxvYWQpO1xuICByZXR1cm4ganNvbi5kYXRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRG9jdW1lbnQoXG4gIGlkOiBzdHJpbmcsXG4gIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRleHQ6IHN0cmluZyxcbikge1xuICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7IGlkLCB0ZXh0LCBwdWJsaXNoOiB0cnVlIH07XG4gIGlmICh0aXRsZSkgcGF5bG9hZC50aXRsZSA9IHRpdGxlO1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMudXBkYXRlXCIsIHBheWxvYWQpO1xuICByZXR1cm4ganNvbi5kYXRhO1xufVxuIiwKICAgICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUb3BDb25maWcsIFRvcENvbGxlY3Rpb25Db25maWcsIENvbGxlY3Rpb25Db25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ORklHX0RJUiA9IFwiY29uZmlnc1wiO1xuZXhwb3J0IGNvbnN0IFRPUF9DT05GSUdfRklMRSA9IHBhdGguam9pbihcIm91dGxpbmUtc3luYy5qc29uXCIpO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcigpIHtcbiAgaWYgKCFleGlzdHNTeW5jKENPTkZJR19ESVIpKSB7XG4gICAgYXdhaXQgZnMubWtkaXIoQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUb3BDb25maWcoKTogUHJvbWlzZTxUb3BDb25maWcgfCBudWxsPiB7XG4gIGlmICghZXhpc3RzU3luYyhUT1BfQ09ORklHX0ZJTEUpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoVE9QX0NPTkZJR19GSUxFLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVG9wQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvcENvbmZpZyhjZmc6IFRvcENvbmZpZykge1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXIoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIFRPUF9DT05GSUdfRklMRSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShjZmcsIG51bGwsIDIpfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gIHBhZ2VzRmlsZTogc3RyaW5nO1xuICBjb25maWdGaWxlOiBzdHJpbmc7XG4gIHNhdmVEaXI6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgdG9wQ29uZmlnID0gYXdhaXQgbG9hZFRvcENvbmZpZygpO1xuXG4gIC8vIElmIG5vIHRvcCBjb25maWcgZXhpc3RzLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIXRvcENvbmZpZyB8fCAhdG9wQ29uZmlnLmNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgIH07XG4gIH1cblxuICAvLyBGaW5kIHRoZSBjb2xsZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgY29sbGVjdGlvbkNvbmZpZyA9IHRvcENvbmZpZy5jb2xsZWN0aW9ucy5maW5kKFxuICAgIChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQsXG4gICk7XG5cbiAgLy8gSWYgbm8gc3BlY2lmaWMgY29sbGVjdGlvbiBjb25maWcgZm91bmQsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghY29sbGVjdGlvbkNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gVXNlIGN1c3RvbSBwYXRocyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBkZWZhdWx0c1xuICByZXR1cm4ge1xuICAgIHBhZ2VzRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcucGFnZXNGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgY29uZmlnRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcuY29uZmlnRmlsZSB8fFxuICAgICAgcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICBzYXZlRGlyOiBjb2xsZWN0aW9uQ29uZmlnLnNhdmVEaXIgfHwgXCJkb2NzXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkNvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShjb25maWdGaWxlLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ29sbGVjdGlvbkNvbmZpZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25Ub3BDb25maWcoXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuKTogUHJvbWlzZTxUb3BDb2xsZWN0aW9uQ29uZmlnIHwgbnVsbD4ge1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoKGMpID0+IGMuaWQgPT09IGNvbGxlY3Rpb25JZCkgfHwgbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDb2xsZWN0aW9uQ29uZmlnKGM6IENvbGxlY3Rpb25Db25maWcpIHtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjLmNvbGxlY3Rpb25JZCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShjb25maWdGaWxlLCBgJHtKU09OLnN0cmluZ2lmeShjLCBudWxsLCAyKX1cXG5gLCBcInV0ZjhcIik7XG59XG4iLAogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogUmVtb3ZlIEFMTCB3aGl0ZXNwYWNlIChzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikgZm9yIGNvbXBhcmlzb24uXG4gKiBUaGlzIG1ha2VzIGRpZmZzIHRvbGVyYW50IHRvIGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnlUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gIHJldHVybiB0aXRsZVxuICAgIC50b1N0cmluZygpXG4gICAgLm5vcm1hbGl6ZShcIk5GS0RcIilcbiAgICAucmVwbGFjZSgvXFxwe019L2d1LCBcIlwiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgLnJlcGxhY2UoLyheLXwtJCkrL2csIFwiXCIpXG4gICAgLnNsaWNlKDAsIDEyMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHaXRUaW1lc3RhbXBNcyhmaWxlUGF0aDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IG91dCA9IHNwYXduU3luYyhcbiAgICAgIFwiZ2l0XCIsXG4gICAgICBbXCJsb2dcIiwgXCItMVwiLCBcIi0tZm9ybWF0PSVjdFwiLCBcIi0tXCIsIHJlc29sdmVkXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKG91dC5zdGF0dXMgIT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHR4dCA9IChvdXQuc3Rkb3V0IHx8IFwiXCIpLnRyaW0oKTtcbiAgICBpZiAoIXR4dCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2VjID0gTnVtYmVyKHR4dCk7XG4gICAgaWYgKE51bWJlci5pc05hTihzZWMpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gc2VjICogMTAwMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExvY2FsVGltZXN0YW1wTXMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGdpdFRzID0gZ2V0R2l0VGltZXN0YW1wTXMoZmlsZVBhdGgpO1xuICBpZiAoZ2l0VHMpIHJldHVybiBnaXRUcztcbiAgY29uc3Qgc3QgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgcmV0dXJuIHN0Lm10aW1lTXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlV3JpdGVGaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRyeVJ1biA9IGZhbHNlLFxuKSB7XG4gIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGJhayA9IGAke2ZpbGVQYXRofS5vdXRsaW5lLXN5bmMuYmFrLiR7RGF0ZS5ub3coKX1gO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShmaWxlUGF0aCwgYmFrKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYEJhY2tlZCB1cCBleGlzdGluZyBmaWxlIHRvICR7YmFrfWApO1xuICB9IGVsc2Uge1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFkcnlSdW4pIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIFwidXRmOFwiKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbZHJ5LXJ1bl0gd291bGQgd3JpdGUgZmlsZSAke2ZpbGVQYXRofSAoJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMpYCxcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IGxpc3RDb2xsZWN0aW9uc1BhZ2VkLCBsaXN0RG9jdW1lbnRzSW5Db2xsZWN0aW9uIH0gZnJvbSBcIi4vb3V0bGluZUFwaVwiO1xuaW1wb3J0IHtcbiAgbG9hZFRvcENvbmZpZyxcbiAgc2F2ZVRvcENvbmZpZyxcbiAgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZSxcbiAgc2F2ZUNvbGxlY3Rpb25Db25maWcsXG4gIGVuc3VyZUNvbmZpZ0Rpcixcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgc2x1Z2lmeVRpdGxlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUVudHJ5LCBNYW5pZmVzdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUHJvbXB0IGhlbHBlciAoc2ltcGxlKTogcHJpbnRzIG51bWJlcmVkIGxpc3QgYW5kIHJlYWRzIGEgbGluZSBmcm9tIHN0ZGluLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdENvbGxlY3Rpb25zUHJvbXB0KG9wdHM6IHtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgbm9uSW50ZXJhY3RpdmU/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBjb2xzID0gYXdhaXQgbGlzdENvbGxlY3Rpb25zUGFnZWQoKTtcbiAgaWYgKCFjb2xzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFwiTm8gY29sbGVjdGlvbnMgZm91bmQgZm9yIHRoaXMgQVBJIGtleS5cIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUubG9nKFwiQ29sbGVjdGlvbnM6XCIpO1xuICBjb2xzLmZvckVhY2goKGMsIGkpID0+IGNvbnNvbGUubG9nKGAke2kgKyAxfSkgJHtjLmlkfVxcdCR7Yy5uYW1lfWApKTtcbiAgaWYgKG9wdHMubm9uSW50ZXJhY3RpdmUpIHJldHVybjtcbiAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgcXVlc3Rpb24oXG4gICAgXCJTZWxlY3QgYSBjb2xsZWN0aW9uIGJ5IG51bWJlciAob3IgcHJlc3MgRW50ZXIgdG8gY2FuY2VsKTogXCIsXG4gICk7XG4gIGNvbnN0IGlkeCA9IE51bWJlcihzZWxlY3Rpb24udHJpbSgpKTtcbiAgaWYgKCFpZHggfHwgaWR4IDwgMSB8fCBpZHggPiBjb2xzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ2FuY2VsbGVkLlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY2hvc2VuID0gY29sc1tpZHggLSAxXTtcbiAgY29uc29sZS5sb2coYFlvdSBjaG9zZTogJHtjaG9zZW4ubmFtZX0gKCR7Y2hvc2VuLmlkfSlgKTtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHRvcCA9IChhd2FpdCBsb2FkVG9wQ29uZmlnKCkpIHx8IHsgY29sbGVjdGlvbnM6IFtdIH07XG4gIGNvbnN0IGV4aXN0cyA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjaG9zZW4uaWQpO1xuICBpZiAoIWV4aXN0cykge1xuICAgIGNvbnN0IGRlZmF1bHRTYXZlRGlyID0gXCJkb2NzXCI7XG4gICAgdG9wLmNvbGxlY3Rpb25zLnVuc2hpZnQoe1xuICAgICAgaWQ6IGNob3Nlbi5pZCxcbiAgICAgIG5hbWU6IGNob3Nlbi5uYW1lLFxuICAgICAgc2F2ZURpcjogZGVmYXVsdFNhdmVEaXIsXG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihcImNvbmZpZ3NcIiwgYCR7Y2hvc2VuLmlkfS5wYWdlcy5qc29uYCksXG4gICAgICBjb25maWdGaWxlOiBwYXRoLmpvaW4oXCJjb25maWdzXCIsIGAke2Nob3Nlbi5pZH0uY29uZmlnLmpzb25gKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzYXZlVG9wQ29uZmlnKHRvcCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQWRkZWQgY29sbGVjdGlvbiB0byAke3BhdGguam9pbihcImNvbmZpZ3NcIiwgXCJvdXRsaW5lLXN5bmMuanNvblwiKX1gLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJDb2xsZWN0aW9uIGFscmVhZHkgY29uZmlndXJlZC5cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBTaW1wbGUgc3RkaW4gbGluZSByZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uKHByb21wdFRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHByb21wdFRleHQpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbmNlKFwiZGF0YVwiLCAoZGF0YSkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRpbi5wYXVzZSgpO1xuICAgICAgcmVzb2x2ZShkYXRhLnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCb290c3RyYXA6IGZldGNoIGRvY3VtZW50cyBmcm9tIGNvbGxlY3Rpb24sIGNyZWF0ZSBwYWdlcy5qc29uIGFuZCB3cml0ZSBtYXJrZG93biBmaWxlcy5cbiAqIE5vdzogZm9sZGVyLWJhc2VkIHN0cnVjdHVyZSBieSBpbmhlcml0YW5jZS4gRWFjaCBwYWdlIGdldHMgYSBkaXJlY3RvcnkgbmFtZWQgZnJvbSB0aGUgc2x1ZyxcbiAqIGFuZCB0aGUgcGFnZSBpdHNlbGYgaXMgc2F2ZWQgYXMgYGluZGV4Lm1kYCBpbnNpZGUgdGhhdCBkaXJlY3RvcnkuIENoaWxkcmVuIGJlY29tZSBzdWJkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcENvbGxlY3Rpb24ob3B0czoge1xuICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBjb2xsZWN0aW9uSWQsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRzO1xuICBjb25zb2xlLmxvZyhgQm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7ZHJ5UnVufSkuLi5gKTtcbiAgY29uc3QgZG9jcyA9IGF3YWl0IGxpc3REb2N1bWVudHNJbkNvbGxlY3Rpb24oY29sbGVjdGlvbklkKTtcbiAgY29uc29sZS5sb2coYEZldGNoZWQgJHtkb2NzLmxlbmd0aH0gZG9jdW1lbnRzIGZyb20gT3V0bGluZS5gKTtcblxuICAvLyAxKSBidWlsZCBmbGF0IG1hcCBvZiBub2RlcyB3aXRoIHJhd1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfT4oKTtcbiAgZm9yIChjb25zdCBkIG9mIGRvY3MpIHtcbiAgICBtYXAuc2V0KGQuaWQsIHtcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgZmlsZTogXCJcIixcbiAgICAgIGlkOiBkLmlkLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgcmF3OiBkLFxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8vIDIpIGF0dGFjaCBjaGlsZHJlbiB1c2luZyBwYXJlbnREb2N1bWVudElkIG9yIHBhcmVudElkXG4gIGNvbnN0IHJvb3RzOiAoUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfSlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgY29uc3QgcmF3ID0gbm9kZS5yYXcgfHwge307XG4gICAgY29uc3QgcGFyZW50SWQgPSByYXcucGFyZW50RG9jdW1lbnRJZCA/PyByYXcucGFyZW50SWQgPz8gbnVsbDtcbiAgICBpZiAocGFyZW50SWQgJiYgbWFwLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMykgYXNzaWduIGZvbGRlci1iYXNlZCBmaWxlIHBhdGhzIHJlY3Vyc2l2ZWx5XG4gIC8vIHBhdHRlcm46IDxzYXZlRGlyPi88YW5jZXN0b3Itc2x1Zy0xPi88YW5jZXN0b3Itc2x1Zy0yPi88dGhpcy1zbHVnPi9pbmRleC5tZFxuICAvLyBHZXQgdGhlIGNvbmZpZ3VyZWQgc2F2ZURpclxuICBjb25zdCB7IHNhdmVEaXIgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcblxuICBmdW5jdGlvbiBhc3NpZ25QYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHNsdWdpZnlUaXRsZShub2RlLnRpdGxlIHx8IFwidW50aXRsZWRcIik7XG4gICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHBhcmVudERpciwgc2x1Zyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgIG5vZGUuZmlsZSA9IGZpbGVQYXRoO1xuICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGFzc2lnblBhdGhzKGMsIGRpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCByIG9mIHJvb3RzKSB7XG4gICAgYXNzaWduUGF0aHMociwgc2F2ZURpcik7XG4gIH1cblxuICAvLyA0KSB3cml0ZSBmaWxlcyB0byBkaXNrXG4gIGZvciAoY29uc3QgbiBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG4uZmlsZTtcbiAgICBjb25zdCBjb250ZW50ID0gbi5yYXc/LnRleHQgPz8gYCMgJHtuLnRpdGxlfVxcblxcbmA7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50LCBcInV0ZjhcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2RyeS1ydW5dIHdvdWxkIHdyaXRlICR7ZmlsZVBhdGh9ICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyA1KSBzdHJpcCByYXcgYW5kIGJ1aWxkIG1hbmlmZXN0XG4gIGZ1bmN0aW9uIHN0cmlwKG46IGFueSk6IFBhZ2VFbnRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiBuLnRpdGxlLFxuICAgICAgZmlsZTogbi5maWxlLFxuICAgICAgaWQ6IG4uaWQsXG4gICAgICBjaGlsZHJlbjogKG4uY2hpbGRyZW4gfHwgW10pLm1hcChzdHJpcCksXG4gICAgfTtcbiAgfVxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QgPSB7IGNvbGxlY3Rpb25JZCwgcGFnZXM6IHJvb3RzLm1hcChzdHJpcCkgfTtcblxuICAvLyBzYXZlIG1hbmlmZXN0IGFuZCBjb25maWcgZmlsZXNcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHtcbiAgICBwYWdlc0ZpbGUsXG4gICAgY29uZmlnRmlsZSxcbiAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcbiAgaWYgKCFkcnlSdW4pIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICBwYWdlc0ZpbGUsXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMil9XFxuYCxcbiAgICAgIFwidXRmOFwiLFxuICAgICk7XG4gICAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHsgY29sbGVjdGlvbklkLCBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpciwgbWFwcGluZ3M6IFtdIH0sIG51bGwsIDIpfVxcbmAsXG4gICAgICAgIFwidXRmOFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdG9wID0gKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfTtcbiAgICBjb25zdCBleGlzdHNUb3AgPSB0b3AuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKTtcbiAgICBpZiAoIWV4aXN0c1RvcCkge1xuICAgICAgdG9wLmNvbGxlY3Rpb25zLnVuc2hpZnQoe1xuICAgICAgICBpZDogY29sbGVjdGlvbklkLFxuICAgICAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgICAgICAgcGFnZXNGaWxlLFxuICAgICAgICBjb25maWdGaWxlLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBzYXZlVG9wQ29uZmlnKHRvcCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkcnktcnVuXSB3b3VsZCBzYXZlIHBhZ2VzIHRvICR7cGFnZXNGaWxlfSBhbmQgY29uZmlnIHRvICR7Y29uZmlnRmlsZX1gLFxuICAgICk7XG4gIH1cbiAgY29uc29sZS5sb2coYEJvb3RzdHJhcCBjb21wbGV0ZTogd3JvdGUgJHtwYWdlc0ZpbGV9IGFuZCAke2NvbmZpZ0ZpbGV9YCk7XG59XG4iLAogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge1xuICBsb2FkVG9wQ29uZmlnLFxuICBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlLFxuICBsb2FkQ29sbGVjdGlvbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQge1xuICBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZSxcbiAgZ2V0TG9jYWxUaW1lc3RhbXBNcyxcbiAgc2FmZVdyaXRlRmlsZSxcbiAgc2x1Z2lmeVRpdGxlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZmV0Y2hEb2N1bWVudEluZm8sXG4gIHVwZGF0ZURvY3VtZW50LFxuICBjcmVhdGVEb2N1bWVudCxcbn0gZnJvbSBcIi4vb3V0bGluZUFwaVwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdCwgUGFnZUVudHJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBMb2FkIHBhZ2VzLmpzb24gZm9yIGEgY29sbGVjdGlvbiAoaWYgbWlzc2luZywgZXJyb3IvYXNrIHRvIGluaXQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUGFnZXNNYW5pZmVzdChcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1hbmlmZXN0PiB7XG4gIGNvbnN0IHsgcGFnZXNGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhwYWdlc0ZpbGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhZ2VzRmlsZX0gbm90IGZvdW5kLiBSdW4gaW5pdC9zZXR1cCB0byBjcmVhdGUgaXRgKTtcbiAgfVxuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShwYWdlc0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBNYW5pZmVzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQYWdlc01hbmlmZXN0KFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBkcnlSdW4gPSBmYWxzZSxcbikge1xuICBjb25zdCB7IHBhZ2VzRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoZHJ5UnVuKSB7XG4gICAgY29uc29sZS5sb2coYFtkcnktcnVuXSB3b3VsZCBwZXJzaXN0IG1hbmlmZXN0IHRvICR7cGFnZXNGaWxlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgcGFnZXNGaWxlLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gLFxuICAgIFwidXRmOFwiLFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZGVzdGluYXRpb24gZmlsZSBwYXRoIGZvciBhIGRvY3VtZW50IHVzaW5nIGNvbGxlY3Rpb24gY29uZmlnIG1hcHBpbmdzLlxuICpcbiAqIFJ1bGVzOlxuICogLSBtYXBwaW5nIHdpdGggaWQgZXhhY3QgbWF0Y2ggd2luc1xuICogLSBtYXBwaW5nIHdpdGggdGl0bGUgZXhhY3QgbWF0Y2ggbmV4dFxuICogLSBtYXBwaW5nLnBhdGggbWF5IGJlOlxuICogICAgLSBhIGZpbGUgcGF0aCAoZW5kaW5nIHdpdGggYC5tZGApIC0+IHNldCBub2RlLmZpbGUgdG8gdGhhdCBwYXRoXG4gKiAgICAtIGEgZGlyZWN0b3J5IHBhdGggKGVuZHMgd2l0aCBgL2Agb3Igbm8gZXh0ZW5zaW9uKSAtPiBwbGFjZSBub2RlIGluIHRoYXQgZGlyIGFzIGluZGV4Lm1kXG4gKiAtIGlmIG5vIG1hcHBpbmcsIGZhbGwgYmFjayB0byBpbmhlcml0ZWQgZm9sZGVyIGFwcHJvYWNoOlxuICogICAgcGFyZW50RGlyICsgc2x1Zy9pbmRleC5tZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXBwaW5nc1RvTWFuaWZlc3QoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdCxcbiAgY29sbGVjdGlvbkNvbmZpZzogYW55LFxuKSB7XG4gIGNvbnN0IHJ1bGVzID0gKGNvbGxlY3Rpb25Db25maWc/Lm1hcHBpbmdzIHx8IFtdKSBhcyB7XG4gICAgbWF0Y2g6IGFueTtcbiAgICBwYXRoOiBzdHJpbmc7XG4gIH1bXTtcblxuICBmdW5jdGlvbiBpc0RpclBhdGgocDogc3RyaW5nKSB7XG4gICAgLy8gdHJlYXQgdHJhaWxpbmcgc2xhc2ggYXMgZGlyZWN0b3J5IE9SIGxhY2sgb2YgLm1kIGV4dGVuc2lvbiBhcyBkaXJlY3RvcnlcbiAgICBpZiAoIXApIHJldHVybiBmYWxzZTtcbiAgICBpZiAocC5lbmRzV2l0aChcIi9cIikgfHwgcC5lbmRzV2l0aChwYXRoLnNlcCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBwYXRoLmV4dG5hbWUocCkudG9Mb3dlckNhc2UoKSAhPT0gXCIubWRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5VG9Ob2RlKG5vZGU6IGFueSwgcGFyZW50RGlyOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgLy8gdHJ5IGlkIG1hdGNoIHRoZW4gdGl0bGUgbWF0Y2hcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgICAgaWYgKHIubWF0Y2g/LmlkICYmIG5vZGUuaWQgPT09IHIubWF0Y2guaWQpIHtcbiAgICAgICAgY29uc3QgcCA9IHIucGF0aDtcbiAgICAgICAgaWYgKGlzRGlyUGF0aChwKSkge1xuICAgICAgICAgIGNvbnN0IGRpciA9IHAuZW5kc1dpdGgoXCIvXCIpID8gcCA6IHA7XG4gICAgICAgICAgbm9kZS5maWxlID0gcGF0aC5qb2luKGRpciwgXCJpbmRleC5tZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHtcbiAgICAgICAgaWYgKHIubWF0Y2g/LnRpdGxlICYmIG5vZGUudGl0bGUgPT09IHIubWF0Y2gudGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBwID0gci5wYXRoO1xuICAgICAgICAgIGlmIChpc0RpclBhdGgocCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHAuZW5kc1dpdGgoXCIvXCIpID8gcCA6IHA7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHN0aWxsIG5vdCBhc3NpZ25lZCwgaW5oZXJpdCBmcm9tIHBhcmVudERpciBieSB1c2luZyBzbHVnIC0+IGluZGV4Lm1kXG4gICAgaWYgKCFub2RlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHNsdWcgPSBzbHVnaWZ5VGl0bGUobm9kZS50aXRsZSB8fCBcInVudGl0bGVkXCIpO1xuICAgICAgY29uc3QgZGlyID0gcGFyZW50RGlyXG4gICAgICAgID8gcGF0aC5qb2luKHBhcmVudERpciwgc2x1ZylcbiAgICAgICAgOiBwYXRoLmpvaW4oY29sbGVjdGlvbkNvbmZpZz8uc2F2ZURpciB8fCBcImRvY3NcIiwgc2x1Zyk7XG4gICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub2RlLmZpbGUgaXMgYSBiYXJlIGZpbGVuYW1lIChubyBkaXJlY3RvcnkpID0+IHB1dCB1bmRlciBwYXJlbnREaXIgb3Igc2F2ZURpclxuICAgICAgY29uc3QgaGFzRGlyID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSkgJiYgcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSkgIT09IFwiLlwiO1xuICAgICAgaWYgKCFoYXNEaXIpIHtcbiAgICAgICAgY29uc3QgYmFzZURpciA9IHBhcmVudERpciB8fCBjb2xsZWN0aW9uQ29uZmlnPy5zYXZlRGlyIHx8IFwiZG9jc1wiO1xuICAgICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oYmFzZURpciwgbm9kZS5maWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIG1hcHBpbmcgcHJvdmlkZWQgYSBkaXJlY3RvcnktbGlrZSBwYXRoIChubyAubWQpIHdlIGFscmVhZHkgaGFuZGxlZDsgb3RoZXJ3aXNlIHBhdGggbWF5IGJlIHJlbGF0aXZlLCBrZWVwIGFzLWlzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGlzIG5vZGUncyBkaXIgdG8gcGFzcyB0byBjaGlsZHJlbiAoZGlyZWN0b3J5IGNvbnRhaW5pbmcgaW5kZXgubWQpXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgYXBwbHlUb05vZGUoYywgbm9kZURpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwIG9mIG1hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXBwbHlUb05vZGUocCBhcyBhbnksIG51bGwpO1xuICB9XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBDb21wYXJlIGNvbnRlbnQgaWdub3Jpbmcgd2hpdGVzcGFjZS9uZXdsaW5lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlKGEpID09PSBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShiKVxuICApO1xufVxuXG4vKipcbiAqIERlY2lkZSB3aGV0aGVyIHRvIHB1bGwgb3IgcHVzaCBvciBza2lwIGZvciBvbmUgcGFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNQYWdlKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBwYWdlOiBQYWdlRW50cnksXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICBvcHRzOiB7IG1vZGU6IFwicHVsbFwiIHwgXCJwdXNoXCIgfCBcInN5bmNcIjsgZHJ5UnVuPzogYm9vbGVhbiB9LFxuKSB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGFnZS5maWxlO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcbiAgY29uc3QgZmlsZUV4aXN0cyA9IGV4aXN0c1N5bmMoYWJzUGF0aCk7XG5cbiAgbGV0IGxvY2FsVHMgPSAwO1xuICBpZiAoZmlsZUV4aXN0cykge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFRzID0gYXdhaXQgZ2V0TG9jYWxUaW1lc3RhbXBNcyhhYnNQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvY2FsVHMgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGxldCByZW1vdGVEb2M6IGFueSA9IG51bGw7XG4gIGlmIChwYWdlLmlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbW90ZURvYyA9IGF3YWl0IGZldGNoRG9jdW1lbnRJbmZvKHBhZ2UuaWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHJlbW90ZSBpbmZvIGZvciAke3BhZ2UudGl0bGV9ICgke3BhZ2UuaWR9KTogJHtlcnJ9YCxcbiAgICAgICk7XG4gICAgICByZW1vdGVEb2MgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW90ZVRleHQgPSByZW1vdGVEb2M/LnRleHQgPz8gbnVsbDtcbiAgY29uc3QgcmVtb3RlVXBkYXRlZEF0ID0gcmVtb3RlRG9jPy51cGRhdGVkQXRcbiAgICA/IG5ldyBEYXRlKHJlbW90ZURvYy51cGRhdGVkQXQpLmdldFRpbWUoKVxuICAgIDogMDtcblxuICAvLyBlbnN1cmUgbG9jYWwgZmlsZSBleGlzdHMgd2hlbiBuZWVkZWQgLSBjcmVhdGUgcGFyZW50IGRpcnNcbiAgaWYgKCFmaWxlRXhpc3RzKSB7XG4gICAgaWYgKG9wdHMubW9kZSA9PT0gXCJwdWxsXCIgfHwgb3B0cy5tb2RlID09PSBcInN5bmNcIiB8fCBvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBjb25zdCBkYXRhVG9Xcml0ZSA9XG4gICAgICAgIHJlbW90ZVRleHQgIT0gbnVsbCA/IHJlbW90ZVRleHQgOiBgIyAke3BhZ2UudGl0bGV9XFxuXFxuYDtcbiAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgZGF0YVRvV3JpdGUsIG9wdHMuZHJ5UnVuIHx8IGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgcmVtb3RlIGlmIG1pc3NpbmdcbiAgaWYgKCFwYWdlLmlkKSB7XG4gICAgY29uc3QgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYWJzUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmIChvcHRzLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbZHJ5LXJ1bl1bQ1JFQVRFXSBXb3VsZCBjcmVhdGUgcmVtb3RlIGRvYyBmb3IgXCIke3BhZ2UudGl0bGV9XCIgaW4gY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KFxuICAgICAgICAgIHBhZ2UudGl0bGUsXG4gICAgICAgICAgbG9jYWxDb250ZW50LFxuICAgICAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgKTtcbiAgICAgICAgcGFnZS5pZCA9IGNyZWF0ZWQ/LmlkID8/IHBhZ2UuaWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbQ1JFQVRFXSBDcmVhdGVkIHJlbW90ZSBcIiR7cGFnZS50aXRsZX1cIiBpZD0ke3BhZ2UuaWR9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW0NSRUFURV0gRmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgZm9yICR7cGFnZS50aXRsZX06ICR7ZXJyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvY2FsQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGFic1BhdGgsIFwidXRmOFwiKTtcbiAgICBpZiAob3B0cy5tb2RlID09PSBcInB1bGxcIikge1xuICAgICAgaWYgKFxuICAgICAgICByZW1vdGVUZXh0ICE9IG51bGwgJiZcbiAgICAgICAgIWNvbnRlbnRzRXF1YWxJZ25vcmluZ1doaXRlc3BhY2UobG9jYWxDb250ZW50LCByZW1vdGVUZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbUFVMTF0gUmVtb3RlIGFwcGxpZWQgdG8gbG9jYWwgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgcmVtb3RlVGV4dCA/PyBcIlwiLCBvcHRzLmRyeVJ1biB8fCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVsbCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbW90ZVRleHQgPT0gbnVsbCB8fFxuICAgICAgICAhY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW2RyeS1ydW5dW1BVU0hdIFdvdWxkIHVwZGF0ZSByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlRG9jdW1lbnQocGFnZS5pZCwgcGFnZS50aXRsZSwgbG9jYWxDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbUFVTSF0gVXBkYXRlZCByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVzaCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN5bmM6IHRpbWVzdGFtcC1iYXNlZCBidXQgc2tpcCBpZiBvbmx5IHdoaXRlc3BhY2UgZGlmZmVyc1xuICAgICAgaWYgKHJlbW90ZVVwZGF0ZWRBdCA+IGxvY2FsVHMgKyA1MDApIHtcbiAgICAgICAgaWYgKCFjb250ZW50c0VxdWFsSWdub3JpbmdXaGl0ZXNwYWNlKGxvY2FsQ29udGVudCwgcmVtb3RlVGV4dCA/PyBcIlwiKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtQVUxMXSBSZW1vdGUgbmV3ZXIgLT4gb3ZlcndyaXRlIGxvY2FsIGZvciBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVGaWxlKGFic1BhdGgsIHJlbW90ZVRleHQgPz8gXCJcIiwgb3B0cy5kcnlSdW4gfHwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTS0lQXSBlcXVhbCBhZnRlciBub3JtYWxpemluZyAocmVtb3RlIG5ld2VyIHRpbWVzdGFtcCBidXQgY29udGVudCBzYW1lKSBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb2NhbFRzID4gcmVtb3RlVXBkYXRlZEF0ICsgNTAwKSB7XG4gICAgICAgIGlmICghY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQgPz8gXCJcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbUFVTSF0gTG9jYWwgbmV3ZXIgLT4gdXBkYXRlIHJlbW90ZSBmb3IgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIHVwZGF0ZSByZW1vdGUgJHtwYWdlLnRpdGxlfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVEb2N1bWVudChwYWdlLmlkLCBwYWdlLnRpdGxlLCBsb2NhbENvbnRlbnQpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgW1BVU0hdIFVwZGF0ZWQgcmVtb3RlIFwiJHtwYWdlLnRpdGxlfVwiIGlkPSR7cGFnZS5pZH1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1NLSVBdIGVxdWFsIGFmdGVyIG5vcm1hbGl6aW5nIChsb2NhbCBuZXdlciB0aW1lc3RhbXAgYnV0IGNvbnRlbnQgc2FtZSkgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU0tJUF0gTm8gY2hhbmdlcyBmb3IgXCIke3BhZ2UudGl0bGV9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZWN1cnNlIHRocm91Z2ggY2hpbGRyZW5cbiAgY29uc3QgbmV4dFBhcmVudElkID0gcGFnZS5pZCB8fCBwYXJlbnRJZDtcbiAgaWYgKHBhZ2UuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFnZS5jaGlsZHJlbikge1xuICAgICAgYXdhaXQgc3luY1BhZ2UoY29sbGVjdGlvbklkLCBtYW5pZmVzdCwgY2hpbGQsIG5leHRQYXJlbnRJZCwgb3B0cyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUnVuIHN5bmMgZm9yIGEgY29sbGVjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU3luYyhvcHRzOiB7XG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nO1xuICBtb2RlOiBcInB1bGxcIiB8IFwicHVzaFwiIHwgXCJzeW5jXCI7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IHsgY29sbGVjdGlvbklkLCBtb2RlLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0cztcbiAgY29uc29sZS5sb2coXG4gICAgYFN0YXJ0aW5nICR7bW9kZX0gZm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9uSWR9IChkcnlSdW49JHtkcnlSdW59KWAsXG4gICk7XG4gIGNvbnN0IHBhZ2VzTWFuaWZlc3QgPSBhd2FpdCBsb2FkUGFnZXNNYW5pZmVzdChjb2xsZWN0aW9uSWQpO1xuICBjb25zdCBjb2xsQ2ZnID0gKGF3YWl0IGxvYWRDb2xsZWN0aW9uQ29uZmlnKGNvbGxlY3Rpb25JZCkpIHx8IHtcbiAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICBtYXBwaW5nczogW10sXG4gIH07XG5cbiAgLy8gYXBwbHkgbWFwcGluZ3MgKHRoaXMgd2lsbCBzZXQgZm9sZGVyLWJhc2VkIGBmaWxlYCBmaWVsZHMpXG4gIGFwcGx5TWFwcGluZ3NUb01hbmlmZXN0KHBhZ2VzTWFuaWZlc3QsIGNvbGxDZmcpO1xuXG4gIC8vIGVuc3VyZSBsb2NhbCBmaWxlcy9mb2xkZXJzIGV4aXN0IGFuZCBub3JtYWxpemUgYW55IHJlbGF0aXZlIGZpbGVuYW1lc1xuICBhc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIC8vIGlmIG5vZGUuZmlsZSBpcyBhYnNlbnQsIGFwcGx5IGluaGVyaXRhbmNlIChhcHBseU1hcHBpbmdzVG9NYW5pZmVzdCBzaG91bGQgaGF2ZSBzZXQgaXQpXG4gICAgaWYgKCFub2RlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHNsdWcgPSBzbHVnaWZ5VGl0bGUobm9kZS50aXRsZSB8fCBcInVudGl0bGVkXCIpO1xuICAgICAgY29uc3QgZGlyID0gcGFyZW50RGlyXG4gICAgICAgID8gcGF0aC5qb2luKHBhcmVudERpciwgc2x1ZylcbiAgICAgICAgOiBwYXRoLmpvaW4oY29sbENmZy5zYXZlRGlyIHx8IFwiZG9jc1wiLCBzbHVnKTtcbiAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiaW5kZXgubWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vZGUuZmlsZSBpcyBiYXJlIGZpbGVuYW1lIHdpdGhvdXQgZGlyIC0+IHB1dCBpbnRvIHBhcmVudERpciBvciBzYXZlRGlyXG4gICAgICBjb25zdCBkaXJuYW1lT2ZGaWxlID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSk7XG4gICAgICBpZiAoIWRpcm5hbWVPZkZpbGUgfHwgZGlybmFtZU9mRmlsZSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29uc3QgYmFzZURpciA9IHBhcmVudERpciB8fCBjb2xsQ2ZnLnNhdmVEaXIgfHwgXCJkb2NzXCI7XG4gICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihiYXNlRGlyLCBub2RlLmZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBkaXJlY3RvcnkgaWYgbmVlZGVkIChub3Qgd3JpdGluZyBmaWxlIGNvbnRlbnRzIGhlcmUsIGp1c3QgZW5zdXJpbmcgc3RydWN0dXJlKVxuICAgIGNvbnN0IGRpclRvTWFrZSA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihkaXJUb01ha2UsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIGVuc3VyZSBkaXJlY3RvcnkgJHtkaXJUb01ha2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGF3YWl0IG5vcm1hbGl6ZVBhdGhzKGMsIG5vZGVEaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vcm1hbGl6ZSBmb3IgZWFjaCByb290XG4gIGZvciAoY29uc3Qgcm9vdCBvZiBwYWdlc01hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXdhaXQgbm9ybWFsaXplUGF0aHMocm9vdCBhcyBhbnksIG51bGwpO1xuICB9XG5cbiAgLy8gcnVuIHN5bmMgcmVjdXJzaW9uXG4gIGZvciAoY29uc3QgcCBvZiBwYWdlc01hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXdhaXQgc3luY1BhZ2UoY29sbGVjdGlvbklkLCBwYWdlc01hbmlmZXN0LCBwLCBudWxsLCB7IG1vZGUsIGRyeVJ1biB9KTtcbiAgfVxuXG4gIC8vIHBlcnNpc3QgbWFuaWZlc3QgKHdyaXRlIGFueSBjcmVhdGVkIGlkcyBiYWNrKVxuICBhd2FpdCBwZXJzaXN0UGFnZXNNYW5pZmVzdChjb2xsZWN0aW9uSWQsIHBhZ2VzTWFuaWZlc3QsIGRyeVJ1bik7XG4gIGNvbnNvbGUubG9nKFwiRG9uZS5cIik7XG59XG4iLAogICAgIiMhL3Vzci9iaW4vZW52IGJ1blxuXG4vKiBiaW4vY2xpLnRzXG4gICAtIFBhcnNlIENMSSBmbGFncyBmaXJzdCAoc28gLS1hcGkta2V5IGlzIGFwcGxpZWQgYmVmb3JlIG1vZHVsZXMgaW1wb3J0IGVudilcbiAgIC0gU3VwcG9ydCByZXBlYXRhYmxlIC0tY29sbGVjdGlvbiBmbGFnc1xuICAgLSBUaGVuIGR5bmFtaWNhbGx5IGltcG9ydCB0aGUgcmVzdCBvZiB0aGUgYXBwXG4qL1xuXG5jb25zdCByYXdBcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuXG4vLyBwYXJzZSBmbGFncyAocmVwZWF0YWJsZSAtLWNvbGxlY3Rpb24pXG5jb25zdCBmbGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiA9IHt9O1xuY29uc3QgcG9zaXRpb25hbHM6IHN0cmluZ1tdID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgY29uc3QgYSA9IHJhd0FyZ3NbaV07XG4gIGlmIChhID09PSBcIi0taGVscFwiIHx8IGEgPT09IFwiLWhcIikge1xuICAgIHBvc2l0aW9uYWxzLnB1c2goXCItLWhlbHBcIik7XG4gIH0gZWxzZSBpZiAoYS5zdGFydHNXaXRoKFwiLS1jb2xsZWN0aW9uPVwiKSB8fCBhLnN0YXJ0c1dpdGgoXCItLWNvbGxlY3Rpb246XCIpKSB7XG4gICAgY29uc3QgdmFsID0gYS5zcGxpdCgvWzo9XS8pWzFdIHx8IFwiXCI7XG4gICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgKGZsYWdzLmNvbGxlY3Rpb24gYXMgc3RyaW5nW10pLnB1c2godmFsKTtcbiAgfSBlbHNlIGlmIChhID09PSBcIi0tY29sbGVjdGlvblwiKSB7XG4gICAgLy8gc3VwcG9ydCBgLS1jb2xsZWN0aW9uIDx2YWx1ZT5gXG4gICAgY29uc3QgdmFsID0gcmF3QXJnc1tpICsgMV07XG4gICAgaWYgKHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgICAoZmxhZ3MuY29sbGVjdGlvbiBhcyBzdHJpbmdbXSkucHVzaCh2YWwpO1xuICAgICAgaSsrOyAvLyBjb25zdW1lIG5leHQgYXJnXG4gICAgfVxuICB9IGVsc2UgaWYgKGEuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgY29uc3QgW2ssIHZdID0gYS5yZXBsYWNlKC9eLS0vLCBcIlwiKS5zcGxpdChcIj1cIik7XG4gICAgZmxhZ3Nba10gPSB2ID09PSB1bmRlZmluZWQgPyB0cnVlIDogdjtcbiAgfSBlbHNlIHtcbiAgICBwb3NpdGlvbmFscy5wdXNoKGEpO1xuICB9XG59XG5cbi8vIElmIHVzZXIgcGFzc2VkIC0tYXBpLWtleSBvciAtLWJhc2UtdXJsLCBzZXQgdGhlbSBpbW1lZGlhdGVseSBzbyBkeW5hbWljIGltcG9ydHMgc2VlIHRoZW0uXG5pZiAoZmxhZ3NbXCJhcGkta2V5XCJdKSB7XG4gIC8vIGRvIE5PVCBsb2cgdGhlIGtleSB0byBhdm9pZCBhY2NpZGVudGFsIGxlYWthZ2UgaW4gbG9nc1xuICBwcm9jZXNzLmVudi5PVVRMSU5FX0FQSV9LRVkgPSBTdHJpbmcoZmxhZ3NbXCJhcGkta2V5XCJdKTtcbn1cbmlmIChmbGFnc1tcImJhc2UtdXJsXCJdKSB7XG4gIHByb2Nlc3MuZW52Lk9VVExJTkVfQkFTRV9VUkwgPSBTdHJpbmcoZmxhZ3NbXCJiYXNlLXVybFwiXSk7XG59XG5cbmlmIChwb3NpdGlvbmFscy5pbmNsdWRlcyhcIi0taGVscFwiKSB8fCBmbGFncy5oZWxwIHx8IGZsYWdzLmgpIHtcbiAgY29uc29sZS5sb2coYFxuVXNhZ2U6XG4gIE9VVExJTkVfQVBJX0tFWT0uLi4gYnVuIHJ1biBiaW4vY2xpLnRzIFtjb21tYW5kXSBbLS1jb2xsZWN0aW9uPUlEXS4uLiBbLS1kcnktcnVuXSBbLS1hcGkta2V5PVwiLi4uXCJdXG5cbkNvbW1hbmRzOlxuICBzZXR1cCAgICAgICAgICAgICAgICAgICAgLSBpbnRlcmFjdGl2ZSBzZXR1cDogbGlzdCBjb2xsZWN0aW9ucywgY2hvb3NlIG9uZVxuICBsaXN0LWNvbGxlY3Rpb25zICAgICAgICAgLSBwcmludCBjb2xsZWN0aW9uc1xuICBpbml0IC0tY29sbGVjdGlvbj1JRCAgICAgLSBib290c3RyYXAgcGFnZXMuanNvbiArIG1hcmtkb3duIChyZXBlYXRhYmxlKVxuICBwdWxsIC0tY29sbGVjdGlvbj1JRCAgICAgLSBwdWxsIHJlbW90ZSBjaGFuZ2VzIChyZXBlYXRhYmxlKVxuICBwdXNoIC0tY29sbGVjdGlvbj1JRCAgICAgLSBwdXNoIGxvY2FsIGNoYW5nZXMgKHJlcGVhdGFibGUpXG4gIHN5bmMgLS1jb2xsZWN0aW9uPUlEICAgICAtIGJpZGlyZWN0aW9uYWwgc3luYyAocmVwZWF0YWJsZSlcblxuRmxhZ3M6XG4gIC0tY29sbGVjdGlvbj1JRCAgICAgICAgICBSZXBlYXRhYmxlOyBydW4gY29tbWFuZCBhZ2FpbnN0IG11bHRpcGxlIGNvbGxlY3Rpb25zXG4gIC0tYXBpLWtleT1cIi4uLlwiICAgICAgICAgIFByb3ZpZGUgT3V0bGluZSBBUEkga2V5IChvdmVycmlkZXMgZW52IHZhcilcbiAgLS1iYXNlLXVybD1cIi4uLlwiICAgICAgICAgUHJvdmlkZSBPdXRsaW5lIGJhc2UgVVJMIChvdmVycmlkZXMgZW52IHZhcilcbiAgLS1kcnktcnVuICAgICAgICAgICAgICAgIFByZXZpZXcgb25seVxuICAtLWhlbHAsIC1oXG5FeGFtcGxlczpcbiAgT1VUTElORV9BUElfS0VZPS4uLiBidW54IEBkb2Nrc3RhdC9vdXRsaW5lLXN5bmMgLS1jb2xsZWN0aW9uPVwiaWQxXCIgLS1jb2xsZWN0aW9uPVwiaWQyXCIgc3luYyAtLWRyeS1ydW5cbiAgYnVuIHJ1biBiaW4vY2xpLnRzIHN5bmMgLS1hcGkta2V5PVwic2tfeHh4XCIgLS1jb2xsZWN0aW9uPVwiaWQxXCJcbmApO1xuICBwcm9jZXNzLmV4aXQoMCk7XG59XG5cbmNvbnN0IHsgbG9hZFRvcENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbGliL2NvbmZpZ1wiKTtcbmNvbnN0IHsgbGlzdENvbGxlY3Rpb25zUHJvbXB0LCBib290c3RyYXBDb2xsZWN0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXG4gIFwiLi4vbGliL2luaXRcIlxuKTtcbmNvbnN0IHsgcnVuU3luYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbGliL3N5bmNFbmdpbmVcIik7XG5cbmNvbnN0IGNtZCA9IHBvc2l0aW9uYWxzWzBdIHx8IFwic3luY1wiO1xuY29uc3QgRFJZX1JVTiA9IEJvb2xlYW4oZmxhZ3NbXCJkcnktcnVuXCJdKTtcbmNvbnN0IGNvbGxlY3Rpb25zRnJvbUNsaSA9IChmbGFncy5jb2xsZWN0aW9uIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcblxudHJ5IHtcbiAgY29uc3QgdG9wQ29uZmlnID0gKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfTtcblxuICBjb25zdCByZXNvbHZlVGFyZ2V0cyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKGNvbGxlY3Rpb25zRnJvbUNsaS5sZW5ndGggPiAwKSByZXR1cm4gY29sbGVjdGlvbnNGcm9tQ2xpO1xuICAgIGlmICh0b3BDb25maWcuY29sbGVjdGlvbnMgJiYgdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMubWFwKChjKSA9PiBjLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIGlmIChjbWQgPT09IFwibGlzdC1jb2xsZWN0aW9uc1wiKSB7XG4gICAgYXdhaXQgbGlzdENvbGxlY3Rpb25zUHJvbXB0KHsgZHJ5UnVuOiBEUllfUlVOLCBub25JbnRlcmFjdGl2ZTogZmFsc2UgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgaWYgKGNtZCA9PT0gXCJzZXR1cFwiKSB7XG4gICAgYXdhaXQgbGlzdENvbGxlY3Rpb25zUHJvbXB0KHsgZHJ5UnVuOiBEUllfUlVOLCBub25JbnRlcmFjdGl2ZTogZmFsc2UgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgaWYgKGNtZCA9PT0gXCJpbml0XCIpIHtcbiAgICBjb25zdCB0YXJnZXRzID0gcmVzb2x2ZVRhcmdldHMoKTtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluaXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbGxlY3Rpb24uIFByb3ZpZGUgLS1jb2xsZWN0aW9uIG9yIHJ1biBzZXR1cC5cIixcbiAgICAgICk7XG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uSWQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXG49PT4gYm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7RFJZX1JVTn0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBib290c3RyYXBDb2xsZWN0aW9uKHsgY29sbGVjdGlvbklkLCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwicHVsbFwiIHx8IGNtZCA9PT0gXCJwdXNoXCIgfHwgY21kID09PSBcInN5bmNcIikge1xuICAgIGNvbnN0IHRhcmdldHMgPSByZXNvbHZlVGFyZ2V0cygpO1xuICAgIGlmICghdGFyZ2V0cy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21tYW5kIFwiJHtjbWR9XCIgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbGxlY3Rpb24gaWQuIFByb3ZpZGUgd2l0aCAtLWNvbGxlY3Rpb249SUQgb3IgcnVuIHNldHVwLmAsXG4gICAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBjbWQgPT09IFwicHVsbFwiID8gXCJwdWxsXCIgOiBjbWQgPT09IFwicHVzaFwiID8gXCJwdXNoXCIgOiBcInN5bmNcIjtcbiAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb25JZCBvZiB0YXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuPT0+IFJ1bm5pbmcgJHttb2RlfSBmb3IgY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gKTtcbiAgICAgIGF3YWl0IHJ1blN5bmMoeyBjb2xsZWN0aW9uSWQsIG1vZGU6IG1vZGUgYXMgYW55LCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXCJVbmtub3duIGNvbW1hbmQ6XCIsIGNtZCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0gY2F0Y2ggKGVycjogYW55KSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJFUlJPUjpcIiwgZXJyPy5tZXNzYWdlIHx8IGVycik7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZXhwb3J0IHt9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7MlpBQUEsZ0NBQ0EscUJBQVMsZ0JBQ1QseUJBUUEsZUFBc0IsQ0FBZSxFQUFHLENBQ3RDLElBQUssRUFBVyxDQUFVLEVBQ3hCLE1BQU0sRUFBRyxNQUFNLEVBQVksQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUlsRCxlQUFzQixDQUFhLEVBQThCLENBQy9ELElBQUssRUFBVyxDQUFlLEVBQUcsT0FBTyxLQUN6QyxJQUFNLEVBQU0sTUFBTSxFQUFHLFNBQVMsRUFBaUIsTUFBTSxFQUNyRCxPQUFPLEtBQUssTUFBTSxDQUFHLEVBR3ZCLGVBQXNCLEVBQWEsQ0FBQyxFQUFnQixDQUNsRCxNQUFNLEVBQWdCLEVBQ3RCLE1BQU0sRUFBRyxVQUNQLEVBQ0EsR0FBRyxLQUFLLFVBQVUsRUFBSyxLQUFNLENBQUM7QUFBQSxFQUM5QixNQUNGLEVBR0YsZUFBc0IsQ0FBc0IsQ0FBQyxFQUkxQyxDQUNELElBQU0sRUFBWSxNQUFNLEVBQWMsRUFHdEMsSUFBSyxJQUFjLEVBQVUsWUFDM0IsTUFBTyxDQUNMLFVBQVcsRUFBSyxLQUFLLEVBQVksR0FBRyxjQUF5QixFQUM3RCxXQUFZLEVBQUssS0FBSyxFQUFZLEdBQUcsZUFBMEIsRUFDL0QsUUFBUyxNQUNYLEVBSUYsSUFBTSxFQUFtQixFQUFVLFlBQVksS0FDN0MsQ0FBQyxJQUFNLEVBQUUsS0FBTyxDQUNsQixFQUdBLElBQUssRUFDSCxNQUFPLENBQ0wsVUFBVyxFQUFLLEtBQUssRUFBWSxHQUFHLGNBQXlC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LGFBQXdCLElBQzVELEVBQ0EsTUFBTSxHQUFvQixDQUFFLGVBQWMsT0FBUSxDQUFRLENBQUMsRUFFN0QsUUFBUSxLQUFLLENBQUMsRUFHaEIsR0FBSSxJQUFRLFFBQVUsSUFBUSxRQUFVLElBQVEsT0FBUSxDQUN0RCxJQUFNLEVBQVUsRUFBZSxFQUMvQixJQUFLLEVBQVEsT0FDWCxNQUFNLElBQUksTUFDUixZQUFZLG9GQUNkLEVBQ0YsSUFBTSxFQUFPLElBQVEsT0FBUyxPQUFTLElBQVEsT0FBUyxPQUFTLE9BQ2pFLFFBQVcsS0FBZ0IsRUFDekIsUUFBUSxJQUFJO0FBQUEsY0FBaUIsb0JBQXVCLEdBQWMsRUFDbEUsTUFBTSxHQUFRLENBQUUsZUFBYyxLQUFNLEVBQWEsT0FBUSxDQUFRLENBQUMsRUFFcEUsUUFBUSxLQUFLLENBQUMsRUFHaEIsUUFBUSxNQUFNLG1CQUFvQixDQUFHLEVBQ3JDLFFBQVEsS0FBSyxDQUFDLEVBQ2QsTUFBTyxFQUFVLENBQ2pCLFFBQVEsTUFBTSxTQUFVLEdBQUssU0FBVyxDQUFHLEVBQzNDLFFBQVEsS0FBSyxDQUFDIiwKICAiZGVidWdJZCI6ICI3NTg0MDM4OEQwNDhENTM3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
39
|
+
//# debugId=E7F6B78036B50AF664756E2164756E21
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2xvZ2dlci50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi9jb25maWcudHMiLCAiLi4vbGliL291dGxpbmVBcGkudHMiLCAiLi4vbGliL3V0aWxzLnRzIiwgIi4uL2xpYi9pbml0LnRzIiwgIi4uL2xpYi9zeW5jRW5naW5lLnRzIiwgIi4uL2Jpbi9jbGkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSBcIkRFQlVHXCIgfCBcIklORk9cIiB8IFwiV0FSTlwiIHwgXCJFUlJPUlwiIHwgXCJOT05FXCI7XG5cbmNvbnN0IExFVkVMX09SREVSOiBSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4gPSB7XG4gIERFQlVHOiAwLFxuICBJTkZPOiAxLFxuICBXQVJOOiAyLFxuICBFUlJPUjogMyxcbiAgTk9ORTogNCxcbn07XG5cbmNvbnN0IEFOU0kgPSB7XG4gIHJlc2V0OiBcIlxceDFiWzBtXCIsXG4gIGJvbGQ6IFwiXFx4MWJbMW1cIixcbiAgZGltOiBcIlxceDFiWzJtXCIsXG4gIGRlYnVnOiBcIlxceDFiWzM2bVwiLCAvLyBjeWFuXG4gIGluZm86IFwiXFx4MWJbMzJtXCIsIC8vIGdyZWVuXG4gIHdhcm46IFwiXFx4MWJbMzNtXCIsIC8vIHllbGxvd1xuICBlcnJvcjogXCJcXHgxYlszMW1cIiwgLy8gcmVkXG4gIGdyYXk6IFwiXFx4MWJbOTBtXCIsXG59O1xuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSBtaW5MZXZlbDogTG9nTGV2ZWw7XG4gIHByaXZhdGUgY29sb3JzOiBib29sZWFuO1xuICBwcml2YXRlIHNob3dUaW1lc3RhbXA6IGJvb2xlYW47XG4gIHByaXZhdGUgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogbmV3IExvZ2dlcih7IGxldmVsOiAnREVCVUcnLCBjb2xvcnM6IHRydWUsIHRpbWVzdGFtcDogdHJ1ZSwgbmFtZTogJ2FwaScgfSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiB7XG4gICAgbGV2ZWw/OiBMb2dMZXZlbDtcbiAgICBjb2xvcnM/OiBib29sZWFuOyAvLyBhbGxvdyBmb3JjaW5nIG9uL29mZlxuICAgIHRpbWVzdGFtcD86IGJvb2xlYW47XG4gICAgbmFtZT86IHN0cmluZzsgLy8gb3B0aW9uYWwgbG9nZ2VyIG5hbWUgZS5nLiBcImFwaVwiXG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbCA9IFwiSU5GT1wiLFxuICAgICAgY29sb3JzID0gdHJ1ZSxcbiAgICAgIHRpbWVzdGFtcCA9IHRydWUsXG4gICAgICBuYW1lLFxuICAgIH0gPSBvcHRzID8/IHt9O1xuXG4gICAgdGhpcy5taW5MZXZlbCA9IGxldmVsO1xuICAgIHRoaXMuc2hvd1RpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgLy8gYXV0by1kZXRlY3QgaWYgd2Ugc2hvdWxkIGNvbG9yaXplOiByZXNwZWN0IE5PX0NPTE9SIGFuZCBub24tdHR5IChDSSlcbiAgICBjb25zdCBlbnZOb0NvbG9yID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgISFwcm9jZXNzLmVudi5OT19DT0xPUjtcbiAgICBjb25zdCBpc1RUWSA9XG4gICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgISFwcm9jZXNzLnN0ZG91dCAmJlxuICAgICAgISFwcm9jZXNzLnN0ZG91dC5pc1RUWTtcbiAgICB0aGlzLmNvbG9ycyA9IGNvbG9ycyAmJiAhZW52Tm9Db2xvciAmJiBpc1RUWTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkTG9nKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBMRVZFTF9PUkRFUltsZXZlbF0gPj0gMCAmJlxuICAgICAgTEVWRUxfT1JERVJbbGV2ZWxdID49IExFVkVMX09SREVSW3RoaXMubWluTGV2ZWxdICYmXG4gICAgICBMRVZFTF9PUkRFUlt0aGlzLm1pbkxldmVsXSA8IExFVkVMX09SREVSLk5PTkVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsZXZlbE1ldGEobGV2ZWw6IEV4Y2x1ZGU8TG9nTGV2ZWwsIFwiTk9ORVwiPikge1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJERUJVR1wiOlxuICAgICAgICByZXR1cm4geyB0YWc6IFwiREVCVUdcIiwgY29sb3I6IEFOU0kuZGVidWcsIGVtb2ppOiBcIvCfkJtcIiB9O1xuICAgICAgY2FzZSBcIklORk9cIjpcbiAgICAgICAgcmV0dXJuIHsgdGFnOiBcIklORk9cIiwgY29sb3I6IEFOU0kuaW5mbywgZW1vamk6IFwi4oS577iPXCIgfTtcbiAgICAgIGNhc2UgXCJXQVJOXCI6XG4gICAgICAgIHJldHVybiB7IHRhZzogXCJXQVJOXCIsIGNvbG9yOiBBTlNJLndhcm4sIGVtb2ppOiBcIuKaoO+4j1wiIH07XG4gICAgICBjYXNlIFwiRVJST1JcIjpcbiAgICAgICAgcmV0dXJuIHsgdGFnOiBcIkVSUk9SXCIsIGNvbG9yOiBBTlNJLmVycm9yLCBlbW9qaTogXCLinYxcIiB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGltZXN0YW1wKCkge1xuICAgIGlmICghdGhpcy5zaG93VGltZXN0YW1wKSByZXR1cm4gXCJcIjtcbiAgICAvLyBJU08tbGlrZSB3aXRoIG1zLCBvciBsZWF2ZSBzaG9ydCBsb2NhbCB0aW1lOlxuICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIHBhZExldmVsVGFnKHRhZzogc3RyaW5nKSB7XG4gICAgLy8ga2VlcCB3aWR0aCBjb25zaXN0ZW50XG4gICAgcmV0dXJuIHRhZy5wYWRFbmQoNSwgXCIgXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xvcml6ZSh0ZXh0OiBzdHJpbmcsIGNvbG9yQ29kZT86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jb2xvcnMgfHwgIWNvbG9yQ29kZSkgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIGAke2NvbG9yQ29kZX0ke3RleHR9JHtBTlNJLnJlc2V0fWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdChsZXZlbDogRXhjbHVkZTxMb2dMZXZlbCwgXCJOT05FXCI+LCBtc2c6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxldmVsTWV0YShsZXZlbCk7XG4gICAgY29uc3Qgd2hlbiA9IHRoaXMudGltZXN0YW1wKCk7XG4gICAgY29uc3QgbmFtZVBhcnQgPSB0aGlzLm5hbWUgPyBgWyR7dGhpcy5uYW1lfV0gYCA6IFwiXCI7XG4gICAgY29uc3QgbGV2ZWxUYWcgPSBgWyAke3RoaXMucGFkTGV2ZWxUYWcobWV0YS50YWcpfSBdYDtcbiAgICBjb25zdCBlbW9qaSA9IG1ldGEuZW1vamk7XG4gICAgaWYgKHRoaXMuY29sb3JzKSB7XG4gICAgICAvLyBDb2xvciBsZXZlbCB0YWcgYW5kIGRpbSB0aGUgdGltZXN0YW1wICsgbmFtZVxuICAgICAgY29uc3QgY29sb3JlZFRhZyA9IHRoaXMuY29sb3JpemUobGV2ZWxUYWcsIG1ldGEuY29sb3IpO1xuICAgICAgY29uc3QgZGltTWV0YSA9IHRoaXMuY29sb3JpemUod2hlbiA/IGAke3doZW59IGAgOiBcIlwiLCBBTlNJLmdyYXkpO1xuICAgICAgY29uc3QgZGltTmFtZSA9IHRoaXMuY29sb3JpemUobmFtZVBhcnQsIEFOU0kuZGltKTtcbiAgICAgIHJldHVybiBgJHtkaW1NZXRhfSR7ZGltTmFtZX0ke2NvbG9yZWRUYWd9ICR7ZW1vaml9ICR7bXNnfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt3aGVuID8gYCR7d2hlbn0gYCA6IFwiXCJ9JHtuYW1lUGFydH0ke2xldmVsVGFnfSAke2Vtb2ppfSAke21zZ31gO1xuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZShsZXZlbDogRXhjbHVkZTxMb2dMZXZlbCwgXCJOT05FXCI+LCBtc2c6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zaG91bGRMb2cobGV2ZWwpKSByZXR1cm47XG5cbiAgICBjb25zdCBvdXQgPSB0aGlzLmZvcm1hdChsZXZlbCwgbXNnKTtcblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJERUJVR1wiOlxuICAgICAgICByZXR1cm4gY29uc29sZS5kZWJ1ZyA/IGNvbnNvbGUuZGVidWcob3V0KSA6IGNvbnNvbGUubG9nKG91dCk7XG4gICAgICBjYXNlIFwiSU5GT1wiOlxuICAgICAgICByZXR1cm4gY29uc29sZS5pbmZvID8gY29uc29sZS5pbmZvKG91dCkgOiBjb25zb2xlLmxvZyhvdXQpO1xuICAgICAgY2FzZSBcIldBUk5cIjpcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybiA/IGNvbnNvbGUud2FybihvdXQpIDogY29uc29sZS5sb2cob3V0KTtcbiAgICAgIGNhc2UgXCJFUlJPUlwiOlxuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvciA/IGNvbnNvbGUuZXJyb3Iob3V0KSA6IGNvbnNvbGUubG9nKG91dCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobXNnOiBzdHJpbmcpIHtcbiAgICB0aGlzLndyaXRlKFwiREVCVUdcIiwgbXNnKTtcbiAgfVxuICBpbmZvKG1zZzogc3RyaW5nKSB7XG4gICAgdGhpcy53cml0ZShcIklORk9cIiwgbXNnKTtcbiAgfVxuICB3YXJuKG1zZzogc3RyaW5nKSB7XG4gICAgdGhpcy53cml0ZShcIldBUk5cIiwgbXNnKTtcbiAgfVxuICBlcnJvcihtc2c6IHN0cmluZykge1xuICAgIHRoaXMud3JpdGUoXCJFUlJPUlwiLCBtc2cpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIGNoaWxkIGxvZ2dlciBzaGFyaW5nIG9wdGlvbnMgYnV0IHdpdGggYSBuYW1lICh1c2VmdWwgZm9yIG1vZHVsZXMpICovXG4gIGNoaWxkKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHtcbiAgICAgIGxldmVsOiB0aGlzLm1pbkxldmVsLFxuICAgICAgY29sb3JzOiB0aGlzLmNvbG9ycyxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy5zaG93VGltZXN0YW1wLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgbWluaW11bSBsZXZlbCBhdCBydW50aW1lICovXG4gIHNldExldmVsKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHRoaXMubWluTGV2ZWwgPSBsZXZlbDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUb3BDb25maWcsIFRvcENvbGxlY3Rpb25Db25maWcsIENvbGxlY3Rpb25Db25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jpbi9jbGlcIjtcblxuZXhwb3J0IGNvbnN0IFRPUF9DT05GSUdfRklMRSA9IHBhdGguam9pbihcIm91dGxpbmUtc3luYy5qc29uXCIpO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcihkaXI6IHN0cmluZykge1xuICBsb2dnZXIuZGVidWcoYEVuc3VyaW5nIGNvbmZpZyBkaXI6ICR7ZGlyfWApO1xuICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGxvZ2dlci53YXJuKGBEaXIgKCR7ZGlyfSkgZG9lcyBub3QgZXhpc3QsIGNyZWF0aW5nLi4uYCk7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29uZmlnRGlycyhjZmc6IFRvcENvbmZpZykge1xuICBjb25zdCBjb2xsZWN0aW9ucyA9IGNmZy5jb2xsZWN0aW9ucztcbiAgY29uc29sZS5kZWJ1ZyhgRW5zdXJpbmcgY29uZmlnIGRpciBmb3IgJHtjb2xsZWN0aW9ucy5sZW5ndGh9IGNvbGxlY3Rpb24ocylgKTtcbiAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgY29uc3QgZGlyID0gY29sbGVjdGlvbi5jb25maWdEaXI7XG4gICAgbG9nZ2VyLmRlYnVnKGBFbnN1cmluZyBjb25maWcgZGlyOiAke2Rpcn1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYERpciAoJHtkaXJ9KSBkb2VzIG5vdCBleGlzdCwgY3JlYXRpbmcuLi5gKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVG9wQ29uZmlnKCk6IFByb21pc2U8VG9wQ29uZmlnIHwgbnVsbD4ge1xuICBsb2dnZXIuZGVidWcoYExvYWRpbmcgdG9wIGNvbmZpZyBmcm9tOiAke1RPUF9DT05GSUdfRklMRX1gKTtcbiAgaWYgKCFleGlzdHNTeW5jKFRPUF9DT05GSUdfRklMRSkpIHtcbiAgICBsb2dnZXIud2FybihcIlRvcCBjb25maWcgZmlsZSBub3QgZm91bmRcIik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoVE9QX0NPTkZJR19GSUxFLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVG9wQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvcENvbmZpZyhjZmc6IFRvcENvbmZpZykge1xuICBsb2dnZXIuZGVidWcoXCJTYXZpbmcgdG9wIGNvbmZpZ1wiKTtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlycyhjZmcpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgVE9QX0NPTkZJR19GSUxFLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KGNmZywgbnVsbCwgMil9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgcGFnZXNGaWxlOiBzdHJpbmc7XG4gIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgc2F2ZURpcjogc3RyaW5nO1xuICBjb25maWdEaXI6IHN0cmluZztcbn0+IHtcbiAgbG9nZ2VyLmRlYnVnKFwiR2V0dGluZyBDb2xsZWN0aW9uIGZpbGUgYmFzZVwiKTtcbiAgY29uc3QgdG9wQ29uZmlnID0gYXdhaXQgbG9hZFRvcENvbmZpZygpO1xuICBjb25zdCBDT05GSUdfRElSID0gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoXG4gICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uaWQgPT09IGNvbGxlY3Rpb25JZCxcbiAgKS5jb25maWdEaXI7XG5cbiAgLy8gSWYgbm8gdG9wIGNvbmZpZyBleGlzdHMsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICBsb2dnZXIud2FybihgTm8gVG9wIGNvbmZpZyBmb3VuZCBmb3IgJHtjb2xsZWN0aW9uSWR9LCByZXR1cm5pbmcgZGVmYXVsdGApO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICAgIGNvbmZpZ0RpcjogQ09ORklHX0RJUixcbiAgICB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgY29sbGVjdGlvbiBjb25maWd1cmF0aW9uXG4gIGNvbnN0IGNvbGxlY3Rpb25Db25maWcgPSB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZChcbiAgICAoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkLFxuICApO1xuXG4gIC8vIElmIG5vIHNwZWNpZmljIGNvbGxlY3Rpb24gY29uZmlnIGZvdW5kLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIWNvbGxlY3Rpb25Db25maWcpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBDb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjb2xsZWN0aW9uSWR9IG5vdCBmb3VuZCwgcmV0dXJuaW5nIGRlZmF1bHQgcGF0aHNgLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgICAgY29uZmlnRGlyOiBcIi5jb25maWdcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gVXNlIGN1c3RvbSBwYXRocyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBkZWZhdWx0c1xuICByZXR1cm4ge1xuICAgIHBhZ2VzRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcucGFnZXNGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgY29uZmlnRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcuY29uZmlnRmlsZSB8fFxuICAgICAgcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICBzYXZlRGlyOiBjb2xsZWN0aW9uQ29uZmlnLnNhdmVEaXIgfHwgXCJkb2NzXCIsXG4gICAgY29uZmlnRGlyOiBjb2xsZWN0aW9uQ29uZmlnLmNvbmZpZ0ZpbGUgfHwgXCIuY29uZmlnXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkNvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGxvZ2dlci5kZWJ1ZyhgTG9hZGluZyBjb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjb2xsZWN0aW9uSWR9YCk7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICBsb2dnZXIud2FybihgQ29sbGVjdGlvbiBjb25maWcgZmlsZSBmb3IgJHtjb2xsZWN0aW9uSWR9IG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGNvbmZpZ0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDb2xsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblRvcENvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRvcENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBUb3AgQ29sbGVjdGlvbiBDb25maWcgZm9yICR7Y29sbGVjdGlvbklkfWApO1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIFRvcCBDb25maWcgZm91bmQgZm9yICR7Y29sbGVjdGlvbklkfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKSB8fCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbGxlY3Rpb25Db25maWcoYzogQ29sbGVjdGlvbkNvbmZpZykge1xuICBsb2dnZXIuZGVidWcoYFNhdmluZyBDb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjLmNvbGxlY3Rpb25JZH1gKTtcbiAgY29uc3QgeyBjb25maWdGaWxlLCBjb25maWdEaXIgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoXG4gICAgYy5jb2xsZWN0aW9uSWQsXG4gICk7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0Rpcihjb25maWdEaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnRmlsZSwgYCR7SlNPTi5zdHJpbmdpZnkoYywgbnVsbCwgMil9XFxuYCwgXCJ1dGY4XCIpO1xufVxuIiwKICAgICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUb3BDb25maWcsIFRvcENvbGxlY3Rpb25Db25maWcsIENvbGxlY3Rpb25Db25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jpbi9jbGlcIjtcblxuZXhwb3J0IGNvbnN0IFRPUF9DT05GSUdfRklMRSA9IHBhdGguam9pbihcIm91dGxpbmUtc3luYy5qc29uXCIpO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcihkaXI6IHN0cmluZykge1xuICBsb2dnZXIuZGVidWcoYEVuc3VyaW5nIGNvbmZpZyBkaXI6ICR7ZGlyfWApO1xuICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGxvZ2dlci53YXJuKGBEaXIgKCR7ZGlyfSkgZG9lcyBub3QgZXhpc3QsIGNyZWF0aW5nLi4uYCk7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29uZmlnRGlycyhjZmc6IFRvcENvbmZpZykge1xuICBjb25zdCBjb2xsZWN0aW9ucyA9IGNmZy5jb2xsZWN0aW9ucztcbiAgY29uc29sZS5kZWJ1ZyhgRW5zdXJpbmcgY29uZmlnIGRpciBmb3IgJHtjb2xsZWN0aW9ucy5sZW5ndGh9IGNvbGxlY3Rpb24ocylgKTtcbiAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgY29uc3QgZGlyID0gY29sbGVjdGlvbi5jb25maWdEaXI7XG4gICAgbG9nZ2VyLmRlYnVnKGBFbnN1cmluZyBjb25maWcgZGlyOiAke2Rpcn1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYERpciAoJHtkaXJ9KSBkb2VzIG5vdCBleGlzdCwgY3JlYXRpbmcuLi5gKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVG9wQ29uZmlnKCk6IFByb21pc2U8VG9wQ29uZmlnIHwgbnVsbD4ge1xuICBsb2dnZXIuZGVidWcoYExvYWRpbmcgdG9wIGNvbmZpZyBmcm9tOiAke1RPUF9DT05GSUdfRklMRX1gKTtcbiAgaWYgKCFleGlzdHNTeW5jKFRPUF9DT05GSUdfRklMRSkpIHtcbiAgICBsb2dnZXIud2FybihcIlRvcCBjb25maWcgZmlsZSBub3QgZm91bmRcIik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoVE9QX0NPTkZJR19GSUxFLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVG9wQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvcENvbmZpZyhjZmc6IFRvcENvbmZpZykge1xuICBsb2dnZXIuZGVidWcoXCJTYXZpbmcgdG9wIGNvbmZpZ1wiKTtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlycyhjZmcpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgVE9QX0NPTkZJR19GSUxFLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KGNmZywgbnVsbCwgMil9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgcGFnZXNGaWxlOiBzdHJpbmc7XG4gIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgc2F2ZURpcjogc3RyaW5nO1xuICBjb25maWdEaXI6IHN0cmluZztcbn0+IHtcbiAgbG9nZ2VyLmRlYnVnKFwiR2V0dGluZyBDb2xsZWN0aW9uIGZpbGUgYmFzZVwiKTtcbiAgY29uc3QgdG9wQ29uZmlnID0gYXdhaXQgbG9hZFRvcENvbmZpZygpO1xuICBjb25zdCBDT05GSUdfRElSID0gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoXG4gICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uaWQgPT09IGNvbGxlY3Rpb25JZCxcbiAgKS5jb25maWdEaXI7XG5cbiAgLy8gSWYgbm8gdG9wIGNvbmZpZyBleGlzdHMsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICBsb2dnZXIud2FybihgTm8gVG9wIGNvbmZpZyBmb3VuZCBmb3IgJHtjb2xsZWN0aW9uSWR9LCByZXR1cm5pbmcgZGVmYXVsdGApO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICAgIGNvbmZpZ0RpcjogQ09ORklHX0RJUixcbiAgICB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgY29sbGVjdGlvbiBjb25maWd1cmF0aW9uXG4gIGNvbnN0IGNvbGxlY3Rpb25Db25maWcgPSB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZChcbiAgICAoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkLFxuICApO1xuXG4gIC8vIElmIG5vIHNwZWNpZmljIGNvbGxlY3Rpb24gY29uZmlnIGZvdW5kLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIWNvbGxlY3Rpb25Db25maWcpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBDb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjb2xsZWN0aW9uSWR9IG5vdCBmb3VuZCwgcmV0dXJuaW5nIGRlZmF1bHQgcGF0aHNgLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgICAgY29uZmlnRGlyOiBcIi5jb25maWdcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gVXNlIGN1c3RvbSBwYXRocyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBkZWZhdWx0c1xuICByZXR1cm4ge1xuICAgIHBhZ2VzRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcucGFnZXNGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgY29uZmlnRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcuY29uZmlnRmlsZSB8fFxuICAgICAgcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICBzYXZlRGlyOiBjb2xsZWN0aW9uQ29uZmlnLnNhdmVEaXIgfHwgXCJkb2NzXCIsXG4gICAgY29uZmlnRGlyOiBjb2xsZWN0aW9uQ29uZmlnLmNvbmZpZ0ZpbGUgfHwgXCIuY29uZmlnXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkNvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGxvZ2dlci5kZWJ1ZyhgTG9hZGluZyBjb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjb2xsZWN0aW9uSWR9YCk7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICBsb2dnZXIud2FybihgQ29sbGVjdGlvbiBjb25maWcgZmlsZSBmb3IgJHtjb2xsZWN0aW9uSWR9IG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGNvbmZpZ0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDb2xsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblRvcENvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRvcENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBUb3AgQ29sbGVjdGlvbiBDb25maWcgZm9yICR7Y29sbGVjdGlvbklkfWApO1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIFRvcCBDb25maWcgZm91bmQgZm9yICR7Y29sbGVjdGlvbklkfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKSB8fCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbGxlY3Rpb25Db25maWcoYzogQ29sbGVjdGlvbkNvbmZpZykge1xuICBsb2dnZXIuZGVidWcoYFNhdmluZyBDb2xsZWN0aW9uIGNvbmZpZyBmb3IgJHtjLmNvbGxlY3Rpb25JZH1gKTtcbiAgY29uc3QgeyBjb25maWdGaWxlLCBjb25maWdEaXIgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoXG4gICAgYy5jb2xsZWN0aW9uSWQsXG4gICk7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0Rpcihjb25maWdEaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnRmlsZSwgYCR7SlNPTi5zdHJpbmdpZnkoYywgbnVsbCwgMil9XFxuYCwgXCJ1dGY4XCIpO1xufVxuIiwKICAgICJpbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuY29uc3QgQkFTRV9VUkwgPSBwcm9jZXNzLmVudi5PVVRMSU5FX0JBU0VfVVJMIHx8IFwiaHR0cHM6Ly9hcHAuZ2V0b3V0bGluZS5jb21cIjtcbmNvbnN0IEFQSV9LRVkgPSBwcm9jZXNzLmVudi5PVVRMSU5FX0FQSV9LRVkgfHwgXCJcIjtcbmNvbnN0IEhFQURFUlMgPSB7XG4gIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtBUElfS0VZfWAsXG4gIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxufTtcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jpbi9jbGlcIjtcblxuLyoqXG4gKiBNYWtlIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBPdXRsaW5lIEFQSSB3aXRoIHNpbXBsZSByZXRyeS9iYWNrb2ZmIGxvZ2ljLlxuICovXG5hc3luYyBmdW5jdGlvbiBvdXRsaW5lUmVxdWVzdChcbiAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgYm9keTogYW55LFxuICByZXRyaWVzID0gMyxcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHVybCA9IGAke0JBU0VfVVJMfS9hcGkvJHtlbmRwb2ludH1gO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3V0bGluZSByZXF1ZXN0OiBQT1NUICR7dXJsfSAoYXR0ZW1wdCAke2F0dGVtcHQgKyAxfSlgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUGF5bG9hZCAodHJpbW1lZCk6ICR7SlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMil9YCk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBIRUFERVJTLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IGJhY2tvZmYgPSAxMDAwICogKGF0dGVtcHQgKyAxKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFJhdGUgbGltaXRlZCBieSBPdXRsaW5lIEFQSS4gQmFja2luZyBvZmYgJHtiYWNrb2ZmfW1zIChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9KS5gLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBqc29uOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIEpTT04gcmVzcG9uc2UgZnJvbSAke2VuZHBvaW50fTogJHtwYXJzZUVycn1gLFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBwYXJzZUVycjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgLy8gTG9nIHVzZWZ1bCBjb250ZXh0IGJ1dCBhdm9pZCBsZWFraW5nIHNlbnNpdGl2ZSBoZWFkZXJzL2tleXNcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBbT3V0bGluZUAke0JBU0VfVVJMfS9hcGkvJHtlbmRwb2ludH1dIEhUVFAgJHtyZXMuc3RhdHVzfSAtIHBheWxvYWQ9JHtKU09OLnN0cmluZ2lmeShib2R5KX0gcmVzcG9uc2U9JHtKU09OLnN0cmluZ2lmeShqc29uKX1gLFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE91dGxpbmUgQVBJIGVycm9yICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkoanNvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgT3V0bGluZSByZXNwb25zZSBmb3IgJHtlbmRwb2ludH0gKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0pOiAke0pTT04uc3RyaW5naWZ5KGpzb24pLnNsaWNlKDAsIDIwMCl9JHtKU09OLnN0cmluZ2lmeShqc29uKS5sZW5ndGggPiAyMDAgPyBcIi4uLlwiIDogXCJcIn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBsYXN0IGF0dGVtcHQgLT4gcmV0aHJvd1xuICAgICAgaWYgKGF0dGVtcHQgPT09IHJldHJpZXMgLSAxKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgUmVxdWVzdCB0byBPdXRsaW5lIGZhaWxlZCBhZnRlciAke3JldHJpZXN9IGF0dGVtcHRzOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja29mZiA9IDUwMCAqIChhdHRlbXB0ICsgMSk7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFJlcXVlc3QgZmFpbGVkIChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9KTogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfS4gUmV0cnlpbmcgYWZ0ZXIgJHtiYWNrb2ZmfW1zLi4uYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaG91bGQgYmUgdW5yZWFjaGFibGUsIGJ1dCBrZWVwIHRoZSBlcnJvciBmb3IgVHlwZVNjcmlwdFxuICB0aHJvdyBuZXcgRXJyb3IoXCJvdXRsaW5lUmVxdWVzdDogdW5yZWFjaGFibGVcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q29sbGVjdGlvbnNQYWdlZCgpOiBQcm9taXNlPFxuICB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W11cbj4ge1xuICBjb25zdCBvdXQ6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgY29uc3QgbGltaXQgPSAxMDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IG91dGxpbmVSZXF1ZXN0KFwiY29sbGVjdGlvbnMubGlzdFwiLCB7IG9mZnNldCwgbGltaXQgfSk7XG4gICAgY29uc3QgZGF0YSA9IGpzb24uZGF0YSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkgb3V0LnB1c2goeyBpZDogYy5pZCwgbmFtZTogYy5uYW1lIH0pO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IGxpbWl0KSBicmVhaztcbiAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBsaXN0Q29sbGVjdGlvbnNQYWdlZDogcmV0dXJuZWQgJHtvdXQubGVuZ3RofSBjb2xsZWN0aW9uc2ApO1xuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3VtZW50c0luQ29sbGVjdGlvbihcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IG91dDogYW55W10gPSBbXTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IGxpbWl0ID0gMTAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCBvdXRsaW5lUmVxdWVzdChcImRvY3VtZW50cy5saXN0XCIsIHtcbiAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGxpbWl0LFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBqc29uLmRhdGEgfHwgW107XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGEpIG91dC5wdXNoKGQpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IGxpbWl0KSBicmVhaztcbiAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFxuICAgIGBsaXN0RG9jdW1lbnRzSW5Db2xsZWN0aW9uKCR7Y29sbGVjdGlvbklkfSk6IHJldHVybmVkICR7b3V0Lmxlbmd0aH0gZG9jdW1lbnRzYCxcbiAgKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRG9jdW1lbnRJbmZvKGRvY3VtZW50SWQ6IHN0cmluZykge1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuaW5mb1wiLCB7IGlkOiBkb2N1bWVudElkIH0pO1xuICBsb2dnZXIuZGVidWcoYGZldGNoRG9jdW1lbnRJbmZvKCR7ZG9jdW1lbnRJZH0pIC0+ICR7anNvbiA/IFwib2tcIiA6IFwibnVsbFwifWApO1xuICByZXR1cm4ganNvbi5kYXRhID8/IG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEb2N1bWVudChcbiAgdGl0bGU6IHN0cmluZyxcbiAgdGV4dDogc3RyaW5nLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgcGFyZW50RG9jdW1lbnRJZDogc3RyaW5nIHwgbnVsbCxcbikge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgY29sbGVjdGlvbklkLFxuICAgIHBhcmVudERvY3VtZW50SWQ6IHBhcmVudERvY3VtZW50SWQgfHwgbnVsbCxcbiAgICBwdWJsaXNoOiB0cnVlLFxuICB9O1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuY3JlYXRlXCIsIHBheWxvYWQpO1xuICBsb2dnZXIuaW5mbyhcbiAgICBgQ3JlYXRlZCBkb2N1bWVudCBcIiR7dGl0bGV9XCIgaW4gY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH0gKGlkPSR7anNvbj8uaWQgPz8gXCJ1bmtub3duXCJ9KWAsXG4gICk7XG4gIHJldHVybiBqc29uLmRhdGE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEb2N1bWVudChcbiAgaWQ6IHN0cmluZyxcbiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGV4dDogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHBheWxvYWQ6IGFueSA9IHsgaWQsIHRleHQsIHB1Ymxpc2g6IHRydWUgfTtcbiAgaWYgKHRpdGxlKSBwYXlsb2FkLnRpdGxlID0gdGl0bGU7XG4gIGNvbnN0IGpzb24gPSBhd2FpdCBvdXRsaW5lUmVxdWVzdChcImRvY3VtZW50cy51cGRhdGVcIiwgcGF5bG9hZCk7XG4gIGxvZ2dlci5pbmZvKGBVcGRhdGVkIGRvY3VtZW50IGlkPSR7aWR9JHt0aXRsZSA/IGAgdGl0bGU9XCIke3RpdGxlfVwiYCA6IFwiXCJ9YCk7XG4gIHJldHVybiBqc29uLmRhdGE7XG59XG4iLAogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vYmluL2NsaVwiO1xuXG4vKipcbiAqIFJlbW92ZSBBTEwgd2hpdGVzcGFjZSAoc3BhY2UsIHRhYiwgbmV3bGluZSwgQ1IpIGZvciBjb21wYXJpc29uLlxuICogVGhpcyBtYWtlcyBkaWZmcyB0b2xlcmFudCB0byBmb3JtYXR0aW5nIGRpZmZlcmVuY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29udGVudElnbm9yZVdoaXRlc3BhY2Uoczogc3RyaW5nKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbHVnaWZ5VGl0bGUodGl0bGU6IHN0cmluZykge1xuICByZXR1cm4gdGl0bGVcbiAgICAudG9TdHJpbmcoKVxuICAgIC5ub3JtYWxpemUoXCJORktEXCIpXG4gICAgLnJlcGxhY2UoL1xccHtNfS9ndSwgXCJcIilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgIC5yZXBsYWNlKC8oXi18LSQpKy9nLCBcIlwiKVxuICAgIC5zbGljZSgwLCAxMjApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0VGltZXN0YW1wTXMoZmlsZVBhdGg6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcbiAgICBjb25zdCBvdXQgPSBzcGF3blN5bmMoXG4gICAgICBcImdpdFwiLFxuICAgICAgW1wibG9nXCIsIFwiLTFcIiwgXCItLWZvcm1hdD0lY3RcIiwgXCItLVwiLCByZXNvbHZlZF0sXG4gICAgICB7XG4gICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChvdXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBnaXQgbG9nIHJldHVybmVkIG5vbi16ZXJvIHN0YXR1cyBmb3IgJHtyZXNvbHZlZH06ICR7b3V0LnN0YXR1c31gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB0eHQgPSAob3V0LnN0ZG91dCB8fCBcIlwiKS50cmltKCk7XG4gICAgaWYgKCF0eHQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgZ2l0IGxvZyByZXR1cm5lZCBubyBvdXRwdXQgZm9yICR7cmVzb2x2ZWR9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VjID0gTnVtYmVyKHR4dCk7XG4gICAgaWYgKE51bWJlci5pc05hTihzZWMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYGdpdCBsb2cgb3V0cHV0IG5vdCBhIG51bWJlciBmb3IgJHtyZXNvbHZlZH06IFwiJHt0eHR9XCJgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc2VjICogMTAwMDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRHaXRUaW1lc3RhbXBNcyBlcnJvciBmb3IgJHtmaWxlUGF0aH06ICR7ZXJyfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMb2NhbFRpbWVzdGFtcE1zKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBnaXRUcyA9IGdldEdpdFRpbWVzdGFtcE1zKGZpbGVQYXRoKTtcbiAgaWYgKGdpdFRzKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBVc2luZyBnaXQgdGltZXN0YW1wIGZvciAke2ZpbGVQYXRofTogJHtnaXRUc31gKTtcbiAgICByZXR1cm4gZ2l0VHM7XG4gIH1cbiAgY29uc3Qgc3QgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgbG9nZ2VyLmRlYnVnKGBVc2luZyBGUyBtdGltZSBmb3IgJHtmaWxlUGF0aH06ICR7c3QubXRpbWVNc31gKTtcbiAgcmV0dXJuIHN0Lm10aW1lTXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlV3JpdGVGaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRyeVJ1biA9IGZhbHNlLFxuKSB7XG4gIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGJhayA9IGAke2ZpbGVQYXRofS5vdXRsaW5lLXN5bmMuYmFrLiR7RGF0ZS5ub3coKX1gO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShmaWxlUGF0aCwgYmFrKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYEJhY2tlZCB1cCBleGlzdGluZyBmaWxlIHRvICR7YmFrfWApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gYmFjayB1cCAke2ZpbGVQYXRofSB0byAke2Jha306ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBbZHJ5LXJ1bl0gd291bGQgYmFja3VwIGV4aXN0aW5nIGZpbGUgJHtmaWxlUGF0aH0gLT4gJHtiYWt9YCxcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBFbnN1cmVkIGRpcmVjdG9yeSAke3BhdGguZGlybmFtZShmaWxlUGF0aCl9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICR7cGF0aC5kaXJuYW1lKGZpbGVQYXRoKX06ICR7ZXJyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFtkcnktcnVuXSB3b3VsZCBlbnN1cmUgZGlyZWN0b3J5ICR7cGF0aC5kaXJuYW1lKGZpbGVQYXRoKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRyeVJ1bikge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIFwidXRmOFwiKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBXcm90ZSBmaWxlICR7ZmlsZVBhdGh9ICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHdyaXRlIGZpbGUgJHtmaWxlUGF0aH06ICR7ZXJyfWApO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgW2RyeS1ydW5dIHdvdWxkIHdyaXRlIGZpbGUgJHtmaWxlUGF0aH0gKCR7Y29udGVudC5sZW5ndGh9IGJ5dGVzKWAsXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBsaXN0Q29sbGVjdGlvbnNQYWdlZCwgbGlzdERvY3VtZW50c0luQ29sbGVjdGlvbiB9IGZyb20gXCIuL291dGxpbmVBcGlcIjtcbmltcG9ydCB7XG4gIGxvYWRUb3BDb25maWcsXG4gIHNhdmVUb3BDb25maWcsXG4gIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UsXG4gIHNhdmVDb2xsZWN0aW9uQ29uZmlnLFxuICBlbnN1cmVDb25maWdEaXIsXG4gIGVuc3VyZUNvbmZpZ0RpcnMsXG59IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHNsdWdpZnlUaXRsZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VFbnRyeSwgTWFuaWZlc3QgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jpbi9jbGlcIjtcblxuLyoqXG4gKiBQcm9tcHQgaGVscGVyIChzaW1wbGUpOiBwcmludHMgbnVtYmVyZWQgbGlzdCBhbmQgcmVhZHMgYSBsaW5lIGZyb20gc3RkaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q29sbGVjdGlvbnNQcm9tcHQob3B0czoge1xuICBkcnlSdW4/OiBib29sZWFuO1xuICBub25JbnRlcmFjdGl2ZT86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IGNvbHMgPSBhd2FpdCBsaXN0Q29sbGVjdGlvbnNQYWdlZCgpO1xuICBpZiAoIWNvbHMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJObyBjb2xsZWN0aW9ucyBmb3VuZCBmb3IgdGhpcyBBUEkga2V5LlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5pbmZvKFwiQ29sbGVjdGlvbnM6XCIpO1xuICBjb2xzLmZvckVhY2goKGMsIGkpID0+IGNvbnNvbGUuaW5mbyhgJHtpICsgMX0pICR7Yy5pZH1cXHQke2MubmFtZX1gKSk7XG4gIGlmIChvcHRzLm5vbkludGVyYWN0aXZlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgcXVlc3Rpb24oXG4gICAgXCJTZWxlY3QgYSBjb2xsZWN0aW9uIGJ5IG51bWJlciAob3IgcHJlc3MgRW50ZXIgdG8gY2FuY2VsKTogXCIsXG4gICk7XG4gIGNvbnN0IGlkeCA9IE51bWJlcihzZWxlY3Rpb24udHJpbSgpKTtcbiAgaWYgKCFpZHggfHwgaWR4IDwgMSB8fCBpZHggPiBjb2xzLmxlbmd0aCkge1xuICAgIGxvZ2dlci53YXJuKFwiQ2FuY2VsbGVkIGNvbGxlY3Rpb24gc2VsZWN0aW9uLlwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjaG9zZW4gPSBjb2xzW2lkeCAtIDFdO1xuICBsb2dnZXIuaW5mbyhgWW91IGNob3NlOiAke2Nob3Nlbi5uYW1lfSAoJHtjaG9zZW4uaWR9KWApO1xuXG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0RpcnMoKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfSk7XG4gIGNvbnN0IHRvcCA9IChhd2FpdCBsb2FkVG9wQ29uZmlnKCkpIHx8IHsgY29sbGVjdGlvbnM6IFtdIH07XG4gIGNvbnN0IGV4aXN0cyA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjaG9zZW4uaWQpO1xuXG4gIGxldCBjb25maWdEaXIgPSAoXG4gICAgYXdhaXQgcXVlc3Rpb24oXG4gICAgICBcIkVudGVyIGEgYmFzZSBmb2xkZXIgcGF0aCBmb3IgdGhlIGNvbGxlY3Rpb25zIGNvbmZpZyBmaWxlcyAob3IgcHJlc3MgZW50ZXIgZm9yIGRlZmF1bHQgYC5jb25maWdgKTogXCIsXG4gICAgKVxuICApLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIik7XG5cbiAgaWYgKGNvbmZpZ0Rpci50cmltKCkubGVuZ3RoIDw9IDEpIHtcbiAgICBjb25maWdEaXIgPSBcIi5jb25maWdcIjtcbiAgICBsb2dnZXIuZGVidWcoXCJVc2luZyBkZWZhdWx0IGNvbmZpZ0RpciBgLmNvbmZpZ2BcIik7XG4gIH1cblxuICBsZXQgc2F2ZURpciA9IChcbiAgICBhd2FpdCBxdWVzdGlvbihcbiAgICAgIFwiRW50ZXIgYSBiYXNlIGZvbGRlciBwYXRoIGZvciB0aGUgY29sbGVjdGlvbnMgbWFya2Rvd24gZmlsZXMgKG9yIHByZXNzIGVudGVyIGZvciBkZWZhdWx0IGBkb2NzYCk6IFwiLFxuICAgIClcbiAgKS5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpO1xuXG4gIGlmIChzYXZlRGlyLnRyaW0oKS5sZW5ndGggPD0gMSkge1xuICAgIHNhdmVEaXIgPSBcImRvY3NcIjtcbiAgICBsb2dnZXIuZGVidWcoXCJVc2luZyBkZWZhdWx0IHNhdmVEaXIgYGRvY3NgXCIpO1xuICB9XG5cbiAgaWYgKCFleGlzdHMpIHtcbiAgICB0b3AuY29sbGVjdGlvbnMudW5zaGlmdCh7XG4gICAgICBpZDogY2hvc2VuLmlkLFxuICAgICAgbmFtZTogY2hvc2VuLm5hbWUsXG4gICAgICBjb25maWdEaXI6IGNvbmZpZ0RpcixcbiAgICAgIHNhdmVEaXI6IHNhdmVEaXIsXG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihjb25maWdEaXIsIGAke2Nob3Nlbi5pZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7Y2hvc2VuLmlkfS5jb25maWcuanNvbmApLFxuICAgIH0pO1xuICAgIGF3YWl0IHNhdmVUb3BDb25maWcodG9wKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBBZGRlZCBjb2xsZWN0aW9uIHRvICR7cGF0aC5qb2luKFwiY29uZmlnc1wiLCBcIm91dGxpbmUtc3luYy5qc29uXCIpfWAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIud2FybihcIkNvbGxlY3Rpb24gYWxyZWFkeSBjb25maWd1cmVkLlwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFNpbXBsZSBzdGRpbiBsaW5lIHJlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb24ocHJvbXB0VGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocHJvbXB0VGV4dCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgICBwcm9jZXNzLnN0ZGluLm9uY2UoXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZGluLnBhdXNlKCk7XG4gICAgICByZXNvbHZlKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJvb3RzdHJhcDogZmV0Y2ggZG9jdW1lbnRzIGZyb20gY29sbGVjdGlvbiwgY3JlYXRlIHBhZ2VzLmpzb24gYW5kIHdyaXRlIG1hcmtkb3duIGZpbGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwQ29sbGVjdGlvbihvcHRzOiB7XG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xufSkge1xuICBjb25zdCB7IGNvbGxlY3Rpb25JZCwgZHJ5UnVuID0gZmFsc2UgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBCb290c3RyYXBwaW5nIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9uSWR9IChkcnlSdW49JHtkcnlSdW59KS4uLmApO1xuXG4gIGNvbnN0IGRvY3MgPSBhd2FpdCBsaXN0RG9jdW1lbnRzSW5Db2xsZWN0aW9uKGNvbGxlY3Rpb25JZCk7XG4gIGxvZ2dlci5pbmZvKGBGZXRjaGVkICR7ZG9jcy5sZW5ndGh9IGRvY3VtZW50cyBmcm9tIE91dGxpbmUuYCk7XG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgRmlyc3QgMyBkb2N1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoZG9jcy5zbGljZSgwLCAzKSwgbnVsbCwgMil9YCxcbiAgKTtcblxuICAvLyAxKSBidWlsZCBmbGF0IG1hcCBvZiBub2Rlc1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfT4oKTtcbiAgZm9yIChjb25zdCBkIG9mIGRvY3MpIHtcbiAgICBtYXAuc2V0KGQuaWQsIHtcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgZmlsZTogXCJcIixcbiAgICAgIGlkOiBkLmlkLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgcmF3OiBkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMikgYXR0YWNoIGNoaWxkcmVuXG4gIGNvbnN0IHJvb3RzOiAoUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfSlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgY29uc3QgcmF3ID0gbm9kZS5yYXcgfHwge307XG4gICAgY29uc3QgcGFyZW50SWQgPSByYXcucGFyZW50RG9jdW1lbnRJZCA/PyByYXcucGFyZW50SWQgPz8gbnVsbDtcbiAgICBpZiAocGFyZW50SWQgJiYgbWFwLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIG1hcC5nZXQocGFyZW50SWQpLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgQnVpbHQgZG9jdW1lbnQgdHJlZSB3aXRoICR7cm9vdHMubGVuZ3RofSByb290KHMpYCk7XG5cbiAgLy8gMykgYXNzaWduIHBhdGhzXG4gIGNvbnN0IHsgc2F2ZURpciB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBmdW5jdGlvbiBhc3NpZ25QYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHNsdWdpZnlUaXRsZShub2RlLnRpdGxlIHx8IFwidW50aXRsZWRcIik7XG4gICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHBhcmVudERpciwgc2x1Zyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcIlJFQURNRS5tZFwiKTtcbiAgICBub2RlLmZpbGUgPSBmaWxlUGF0aDtcbiAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBhc3NpZ25QYXRocyhjLCBkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHIgb2Ygcm9vdHMpIHtcbiAgICBhc3NpZ25QYXRocyhyLCBzYXZlRGlyKTtcbiAgfVxuXG4gIC8vIDQpIHdyaXRlIGZpbGVzXG4gIGZvciAoY29uc3QgbiBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG4uZmlsZTtcbiAgICBjb25zdCBjb250ZW50ID0gbi5yYXc/LnRleHQgPz8gYCMgJHtuLnRpdGxlfVxcblxcbmA7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50LCBcInV0ZjhcIik7XG4gICAgICBsb2dnZXIuZGVidWcoYFdyb3RlIGZpbGU6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFtkcnktcnVuXSB3b3VsZCB3cml0ZSAke2ZpbGVQYXRofSAoJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gNSkgYnVpbGQgbWFuaWZlc3RcbiAgZnVuY3Rpb24gc3RyaXAobjogYW55KTogUGFnZUVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IG4udGl0bGUsXG4gICAgICBmaWxlOiBuLmZpbGUsXG4gICAgICBpZDogbi5pZCxcbiAgICAgIGNoaWxkcmVuOiAobi5jaGlsZHJlbiB8fCBbXSkubWFwKHN0cmlwKSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0OiBNYW5pZmVzdCA9IHsgY29sbGVjdGlvbklkLCBwYWdlczogcm9vdHMubWFwKHN0cmlwKSB9O1xuXG4gIC8vIHNhdmUgbWFuaWZlc3QvY29uZmlnXG4gIGNvbnN0IHtcbiAgICBwYWdlc0ZpbGUsXG4gICAgY29uZmlnRmlsZSxcbiAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgICBjb25maWdEaXIsXG4gIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0Rpcihjb25maWdEaXIpO1xuICBpZiAoIWRyeVJ1bikge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIHBhZ2VzRmlsZSxcbiAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gLFxuICAgICAgXCJ1dGY4XCIsXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhgU2F2ZWQgbWFuaWZlc3Q6ICR7cGFnZXNGaWxlfWApO1xuXG4gICAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHsgY29sbGVjdGlvbklkLCBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpciwgbWFwcGluZ3M6IFtdIH0sIG51bGwsIDIpfVxcbmAsXG4gICAgICAgIFwidXRmOFwiLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBDcmVhdGVkIG5ldyBjb25maWc6ICR7Y29uZmlnRmlsZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3AgPSAoYXdhaXQgbG9hZFRvcENvbmZpZygpKSB8fCB7IGNvbGxlY3Rpb25zOiBbXSB9O1xuICAgIGNvbnN0IGV4aXN0c1RvcCA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQpO1xuICAgIGlmICghZXhpc3RzVG9wKSB7XG4gICAgICB0b3AuY29sbGVjdGlvbnMudW5zaGlmdCh7XG4gICAgICAgIGlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgIHNhdmVEaXI6IGNvbmZpZ3VyZWRTYXZlRGlyLFxuICAgICAgICBwYWdlc0ZpbGUsXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHNhdmVUb3BDb25maWcodG9wKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVXBkYXRlZCB0b3AgY29uZmlnIHdpdGggY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFtkcnktcnVuXSB3b3VsZCBzYXZlIHBhZ2VzIHRvICR7cGFnZXNGaWxlfSBhbmQgY29uZmlnIHRvICR7Y29uZmlnRmlsZX1gLFxuICAgICk7XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgQm9vdHN0cmFwIGNvbXBsZXRlOiB3cm90ZSAke3BhZ2VzRmlsZX0gYW5kICR7Y29uZmlnRmlsZX1gKTtcbn1cbiIsCiAgICAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIGxvYWRUb3BDb25maWcsXG4gIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UsXG4gIGxvYWRDb2xsZWN0aW9uQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlLFxuICBnZXRMb2NhbFRpbWVzdGFtcE1zLFxuICBzYWZlV3JpdGVGaWxlLFxuICBzbHVnaWZ5VGl0bGUsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBmZXRjaERvY3VtZW50SW5mbyxcbiAgdXBkYXRlRG9jdW1lbnQsXG4gIGNyZWF0ZURvY3VtZW50LFxufSBmcm9tIFwiLi9vdXRsaW5lQXBpXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0LCBQYWdlRW50cnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jpbi9jbGlcIjtcblxuLyoqXG4gKiBMb2FkIHBhZ2VzLmpzb24gZm9yIGEgY29sbGVjdGlvbiAoaWYgbWlzc2luZywgZXJyb3IvYXNrIHRvIGluaXQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUGFnZXNNYW5pZmVzdChcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1hbmlmZXN0PiB7XG4gIGNvbnN0IHsgcGFnZXNGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhwYWdlc0ZpbGUpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGAke3BhZ2VzRmlsZX0gbm90IGZvdW5kLiBSdW4gaW5pdC9zZXR1cCB0byBjcmVhdGUgaXRgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGFnZXNGaWxlfSBub3QgZm91bmQuIFJ1biBpbml0L3NldHVwIHRvIGNyZWF0ZSBpdGApO1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhZ2VzRmlsZSwgXCJ1dGY4XCIpO1xuICBsb2dnZXIuZGVidWcoYExvYWRlZCBwYWdlcyBtYW5pZmVzdCBmcm9tICR7cGFnZXNGaWxlfSAoJHtyYXcubGVuZ3RofSBieXRlcylgKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBNYW5pZmVzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQYWdlc01hbmlmZXN0KFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBkcnlSdW4gPSBmYWxzZSxcbikge1xuICBjb25zdCB7IHBhZ2VzRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoZHJ5UnVuKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbZHJ5LXJ1bl0gd291bGQgcGVyc2lzdCBtYW5pZmVzdCB0byAke3BhZ2VzRmlsZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIHBhZ2VzRmlsZSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMil9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbiAgbG9nZ2VyLmluZm8oYFBlcnNpc3RlZCBtYW5pZmVzdCB0byAke3BhZ2VzRmlsZX1gKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlc3RpbmF0aW9uIGZpbGUgcGF0aCBmb3IgYSBkb2N1bWVudCB1c2luZyBjb2xsZWN0aW9uIGNvbmZpZyBtYXBwaW5ncy5cbiAqXG4gKiBSdWxlczpcbiAqIC0gbWFwcGluZyB3aXRoIGlkIGV4YWN0IG1hdGNoIHdpbnNcbiAqIC0gbWFwcGluZyB3aXRoIHRpdGxlIGV4YWN0IG1hdGNoIG5leHRcbiAqIC0gbWFwcGluZy5wYXRoIG1heSBiZTpcbiAqICAgIC0gYSBmaWxlIHBhdGggKGVuZGluZyB3aXRoIGAubWRgKSAtPiBzZXQgbm9kZS5maWxlIHRvIHRoYXQgcGF0aFxuICogICAgLSBhIGRpcmVjdG9yeSBwYXRoIChlbmRzIHdpdGggYC9gIG9yIG5vIGV4dGVuc2lvbikgLT4gcGxhY2Ugbm9kZSBpbiB0aGF0IGRpciBhcyBSRUFETUUubWRcbiAqIC0gaWYgbm8gbWFwcGluZywgZmFsbCBiYWNrIHRvIGluaGVyaXRlZCBmb2xkZXIgYXBwcm9hY2g6XG4gKiAgICBwYXJlbnREaXIgKyBzbHVnL1JFQURNRS5tZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXBwaW5nc1RvTWFuaWZlc3QoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdCxcbiAgY29sbGVjdGlvbkNvbmZpZzogYW55LFxuKSB7XG4gIGNvbnN0IHJ1bGVzID0gKGNvbGxlY3Rpb25Db25maWc/Lm1hcHBpbmdzIHx8IFtdKSBhcyB7XG4gICAgbWF0Y2g6IGFueTtcbiAgICBwYXRoOiBzdHJpbmc7XG4gIH1bXTtcblxuICBmdW5jdGlvbiBpc0RpclBhdGgocDogc3RyaW5nKSB7XG4gICAgLy8gdHJlYXQgdHJhaWxpbmcgc2xhc2ggYXMgZGlyZWN0b3J5IE9SIGxhY2sgb2YgLm1kIGV4dGVuc2lvbiBhcyBkaXJlY3RvcnlcbiAgICBpZiAoIXApIHJldHVybiBmYWxzZTtcbiAgICBpZiAocC5lbmRzV2l0aChcIi9cIikgfHwgcC5lbmRzV2l0aChwYXRoLnNlcCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBwYXRoLmV4dG5hbWUocCkudG9Mb3dlckNhc2UoKSAhPT0gXCIubWRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5VG9Ob2RlKG5vZGU6IGFueSwgcGFyZW50RGlyOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgLy8gdHJ5IGlkIG1hdGNoIHRoZW4gdGl0bGUgbWF0Y2hcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgICAgaWYgKHIubWF0Y2g/LmlkICYmIG5vZGUuaWQgPT09IHIubWF0Y2guaWQpIHtcbiAgICAgICAgY29uc3QgcCA9IHIucGF0aDtcbiAgICAgICAgaWYgKGlzRGlyUGF0aChwKSkge1xuICAgICAgICAgIGNvbnN0IGRpciA9IHAuZW5kc1dpdGgoXCIvXCIpID8gcCA6IHA7XG4gICAgICAgICAgbm9kZS5maWxlID0gcGF0aC5qb2luKGRpciwgXCJSRUFETUUubWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5maWxlID0gcDtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBNYXBwaW5nIGFwcGxpZWQgYnkgaWQgZm9yIFwiJHtub2RlLnRpdGxlfVwiIC0+ICR7bm9kZS5maWxlfWAsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgICAgICBpZiAoci5tYXRjaD8udGl0bGUgJiYgbm9kZS50aXRsZSA9PT0gci5tYXRjaC50aXRsZSkge1xuICAgICAgICAgIGNvbnN0IHAgPSByLnBhdGg7XG4gICAgICAgICAgaWYgKGlzRGlyUGF0aChwKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gcC5lbmRzV2l0aChcIi9cIikgPyBwIDogcDtcbiAgICAgICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiUkVBRE1FLm1kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgTWFwcGluZyBhcHBsaWVkIGJ5IHRpdGxlIGZvciBcIiR7bm9kZS50aXRsZX1cIiAtPiAke25vZGUuZmlsZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBzdGlsbCBub3QgYXNzaWduZWQsIGluaGVyaXQgZnJvbSBwYXJlbnREaXIgYnkgdXNpbmcgc2x1ZyAtPiBSRUFETUUubWRcbiAgICBpZiAoIW5vZGUuZmlsZSkge1xuICAgICAgY29uc3Qgc2x1ZyA9IHNsdWdpZnlUaXRsZShub2RlLnRpdGxlIHx8IFwidW50aXRsZWRcIik7XG4gICAgICBjb25zdCBkaXIgPSBwYXJlbnREaXJcbiAgICAgICAgPyBwYXRoLmpvaW4ocGFyZW50RGlyLCBzbHVnKVxuICAgICAgICA6IHBhdGguam9pbihjb2xsZWN0aW9uQ29uZmlnPy5zYXZlRGlyIHx8IFwiZG9jc1wiLCBzbHVnKTtcbiAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiUkVBRE1FLm1kXCIpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBJbmhlcml0ZWQgcGF0aCBmb3IgXCIke25vZGUudGl0bGV9XCIgLT4gJHtub2RlLmZpbGV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vZGUuZmlsZSBpcyBhIGJhcmUgZmlsZW5hbWUgKG5vIGRpcmVjdG9yeSkgPT4gcHV0IHVuZGVyIHBhcmVudERpciBvciBzYXZlRGlyXG4gICAgICBjb25zdCBoYXNEaXIgPSBwYXRoLmRpcm5hbWUobm9kZS5maWxlKSAmJiBwYXRoLmRpcm5hbWUobm9kZS5maWxlKSAhPT0gXCIuXCI7XG4gICAgICBpZiAoIWhhc0Rpcikge1xuICAgICAgICBjb25zdCBiYXNlRGlyID0gcGFyZW50RGlyIHx8IGNvbGxlY3Rpb25Db25maWc/LnNhdmVEaXIgfHwgXCJkb2NzXCI7XG4gICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihiYXNlRGlyLCBub2RlLmZpbGUpO1xuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgYE5vcm1hbGl6ZWQgYmFyZSBmaWxlbmFtZSBmb3IgXCIke25vZGUudGl0bGV9XCIgLT4gJHtub2RlLmZpbGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1hcHBpbmcgbWF5IGJlIHJlbGF0aXZlOyBrZWVwIGFzLWlzXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVXNpbmcgbWFwcGVkIHBhdGggZm9yIFwiJHtub2RlLnRpdGxlfVwiIC0+ICR7bm9kZS5maWxlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgdGhpcyBub2RlJ3MgZGlyIHRvIHBhc3MgdG8gY2hpbGRyZW4gKGRpcmVjdG9yeSBjb250YWluaW5nIFJFQURNRS5tZClcbiAgICBjb25zdCBub2RlRGlyID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSk7XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBhcHBseVRvTm9kZShjLCBub2RlRGlyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHAgb2YgbWFuaWZlc3QucGFnZXMpIHtcbiAgICBhcHBseVRvTm9kZShwIGFzIGFueSwgbnVsbCk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBBcHBsaWVkIG1hcHBpbmdzIHRvIG1hbmlmZXN0IChydWxlcz0ke3J1bGVzLmxlbmd0aH0pYCk7XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBDb21wYXJlIGNvbnRlbnQgaWdub3Jpbmcgd2hpdGVzcGFjZS9uZXdsaW5lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlKGEpID09PSBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShiKVxuICApO1xufVxuXG4vKipcbiAqIERlY2lkZSB3aGV0aGVyIHRvIHB1bGwgb3IgcHVzaCBvciBza2lwIGZvciBvbmUgcGFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNQYWdlKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBwYWdlOiBQYWdlRW50cnksXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICBvcHRzOiB7IG1vZGU6IFwicHVsbFwiIHwgXCJwdXNoXCIgfCBcInN5bmNcIjsgZHJ5UnVuPzogYm9vbGVhbiB9LFxuKSB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGFnZS5maWxlO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcbiAgY29uc3QgZmlsZUV4aXN0cyA9IGV4aXN0c1N5bmMoYWJzUGF0aCk7XG5cbiAgbGV0IGxvY2FsVHMgPSAwO1xuICBpZiAoZmlsZUV4aXN0cykge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFRzID0gYXdhaXQgZ2V0TG9jYWxUaW1lc3RhbXBNcyhhYnNQYXRoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZ2V0IGxvY2FsIHRpbWVzdGFtcCBmb3IgJHthYnNQYXRofTogJHtlcnJ9YCk7XG4gICAgICBsb2NhbFRzID0gMDtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVtb3RlRG9jOiBhbnkgPSBudWxsO1xuICBpZiAocGFnZS5pZCkge1xuICAgIHRyeSB7XG4gICAgICByZW1vdGVEb2MgPSBhd2FpdCBmZXRjaERvY3VtZW50SW5mbyhwYWdlLmlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHJlbW90ZSBpbmZvIGZvciAke3BhZ2UudGl0bGV9ICgke3BhZ2UuaWR9KTogJHtlcnJ9YCxcbiAgICAgICk7XG4gICAgICByZW1vdGVEb2MgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW90ZVRleHQgPSByZW1vdGVEb2M/LnRleHQgPz8gbnVsbDtcbiAgY29uc3QgcmVtb3RlVXBkYXRlZEF0ID0gcmVtb3RlRG9jPy51cGRhdGVkQXRcbiAgICA/IG5ldyBEYXRlKHJlbW90ZURvYy51cGRhdGVkQXQpLmdldFRpbWUoKVxuICAgIDogMDtcblxuICBsb2dnZXIuZGVidWcoXG4gICAgYHN5bmNQYWdlKFwiJHtwYWdlLnRpdGxlfVwiKSBsb2NhbEV4aXN0cz0ke2ZpbGVFeGlzdHN9IGxvY2FsVHM9JHtsb2NhbFRzfSByZW1vdGVFeGlzdHM9JHshIXJlbW90ZURvY30gcmVtb3RlVXBkYXRlZEF0PSR7cmVtb3RlVXBkYXRlZEF0fWAsXG4gICk7XG5cbiAgLy8gZW5zdXJlIGxvY2FsIGZpbGUgZXhpc3RzIHdoZW4gbmVlZGVkIC0gY3JlYXRlIHBhcmVudCBkaXJzXG4gIGlmICghZmlsZUV4aXN0cykge1xuICAgIGlmIChvcHRzLm1vZGUgPT09IFwicHVsbFwiIHx8IG9wdHMubW9kZSA9PT0gXCJzeW5jXCIgfHwgb3B0cy5tb2RlID09PSBcInB1c2hcIikge1xuICAgICAgY29uc3QgZGF0YVRvV3JpdGUgPVxuICAgICAgICByZW1vdGVUZXh0ICE9IG51bGwgPyByZW1vdGVUZXh0IDogYCMgJHtwYWdlLnRpdGxlfVxcblxcbmA7XG4gICAgICBhd2FpdCBzYWZlV3JpdGVGaWxlKGFic1BhdGgsIGRhdGFUb1dyaXRlLCBvcHRzLmRyeVJ1biB8fCBmYWxzZSk7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtJTklUXSBFbnN1cmVkIGxvY2FsIGZpbGUgZm9yIFwiJHtwYWdlLnRpdGxlfVwiIC0+ICR7YWJzUGF0aH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgcmVtb3RlIGlmIG1pc3NpbmdcbiAgaWYgKCFwYWdlLmlkKSB7XG4gICAgY29uc3QgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYWJzUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmIChvcHRzLmRyeVJ1bikge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbZHJ5LXJ1bl1bQ1JFQVRFXSBXb3VsZCBjcmVhdGUgcmVtb3RlIGRvYyBmb3IgXCIke3BhZ2UudGl0bGV9XCIgaW4gY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KFxuICAgICAgICAgIHBhZ2UudGl0bGUsXG4gICAgICAgICAgbG9jYWxDb250ZW50LFxuICAgICAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgKTtcbiAgICAgICAgcGFnZS5pZCA9IGNyZWF0ZWQ/LmlkID8/IHBhZ2UuaWQ7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbQ1JFQVRFXSBDcmVhdGVkIHJlbW90ZSBcIiR7cGFnZS50aXRsZX1cIiBpZD0ke3BhZ2UuaWR9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBbQ1JFQVRFXSBGYWlsZWQgdG8gY3JlYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYWJzUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmIChvcHRzLm1vZGUgPT09IFwicHVsbFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbW90ZVRleHQgIT0gbnVsbCAmJlxuICAgICAgICAhY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQpXG4gICAgICApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtQVUxMXSBSZW1vdGUgYXBwbGllZCB0byBsb2NhbCBmb3IgXCIke3BhZ2UudGl0bGV9XCJgKTtcbiAgICAgICAgYXdhaXQgc2FmZVdyaXRlRmlsZShhYnNQYXRoLCByZW1vdGVUZXh0ID8/IFwiXCIsIG9wdHMuZHJ5UnVuIHx8IGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVsbCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbW90ZVRleHQgPT0gbnVsbCB8fFxuICAgICAgICAhY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW2RyeS1ydW5dW1BVU0hdIFdvdWxkIHVwZGF0ZSByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlRG9jdW1lbnQocGFnZS5pZCwgcGFnZS50aXRsZSwgbG9jYWxDb250ZW50KTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbUFVTSF0gVXBkYXRlZCByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgW1BVU0hdIEZhaWxlZCB0byB1cGRhdGUgcmVtb3RlIGZvciAke3BhZ2UudGl0bGV9OiAke2Vycn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVzaCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN5bmM6IHRpbWVzdGFtcC1iYXNlZCBidXQgc2tpcCBpZiBvbmx5IHdoaXRlc3BhY2UgZGlmZmVyc1xuICAgICAgaWYgKHJlbW90ZVVwZGF0ZWRBdCA+IGxvY2FsVHMgKyA1MDApIHtcbiAgICAgICAgaWYgKCFjb250ZW50c0VxdWFsSWdub3JpbmdXaGl0ZXNwYWNlKGxvY2FsQ29udGVudCwgcmVtb3RlVGV4dCA/PyBcIlwiKSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtQVUxMXSBSZW1vdGUgbmV3ZXIgLT4gb3ZlcndyaXRlIGxvY2FsIGZvciBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVGaWxlKGFic1BhdGgsIHJlbW90ZVRleHQgPz8gXCJcIiwgb3B0cy5kcnlSdW4gfHwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBbU0tJUF0gZXF1YWwgYWZ0ZXIgbm9ybWFsaXppbmcgKHJlbW90ZSBuZXdlciB0aW1lc3RhbXAgYnV0IGNvbnRlbnQgc2FtZSkgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobG9jYWxUcyA+IHJlbW90ZVVwZGF0ZWRBdCArIDUwMCkge1xuICAgICAgICBpZiAoIWNvbnRlbnRzRXF1YWxJZ25vcmluZ1doaXRlc3BhY2UobG9jYWxDb250ZW50LCByZW1vdGVUZXh0ID8/IFwiXCIpKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW1BVU0hdIExvY2FsIG5ld2VyIC0+IHVwZGF0ZSByZW1vdGUgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChvcHRzLmRyeVJ1bikge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtkcnktcnVuXSB3b3VsZCB1cGRhdGUgcmVtb3RlICR7cGFnZS50aXRsZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlRG9jdW1lbnQocGFnZS5pZCwgcGFnZS50aXRsZSwgbG9jYWxDb250ZW50KTtcbiAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgYFtQVVNIXSBVcGRhdGVkIHJlbW90ZSBcIiR7cGFnZS50aXRsZX1cIiBpZD0ke3BhZ2UuaWR9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtTS0lQXSBlcXVhbCBhZnRlciBub3JtYWxpemluZyAobG9jYWwgbmV3ZXIgdGltZXN0YW1wIGJ1dCBjb250ZW50IHNhbWUpIFwiJHtwYWdlLnRpdGxlfVwiYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtTS0lQXSBObyBjaGFuZ2VzIGZvciBcIiR7cGFnZS50aXRsZX1cImApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHJlY3Vyc2UgdGhyb3VnaCBjaGlsZHJlblxuICBjb25zdCBuZXh0UGFyZW50SWQgPSBwYWdlLmlkIHx8IHBhcmVudElkO1xuICBpZiAocGFnZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYWdlLmNoaWxkcmVuKSB7XG4gICAgICBhd2FpdCBzeW5jUGFnZShjb2xsZWN0aW9uSWQsIG1hbmlmZXN0LCBjaGlsZCwgbmV4dFBhcmVudElkLCBvcHRzKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gc3luYyBmb3IgYSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TeW5jKG9wdHM6IHtcbiAgY29sbGVjdGlvbklkOiBzdHJpbmc7XG4gIG1vZGU6IFwicHVsbFwiIHwgXCJwdXNoXCIgfCBcInN5bmNcIjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBjb2xsZWN0aW9uSWQsIG1vZGUsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRzO1xuICBsb2dnZXIuaW5mbyhcbiAgICBgU3RhcnRpbmcgJHttb2RlfSBmb3IgY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH0gKGRyeVJ1bj0ke2RyeVJ1bn0pYCxcbiAgKTtcblxuICBjb25zdCBwYWdlc01hbmlmZXN0ID0gYXdhaXQgbG9hZFBhZ2VzTWFuaWZlc3QoY29sbGVjdGlvbklkKTtcbiAgY29uc3QgY29sbENmZyA9IChhd2FpdCBsb2FkQ29sbGVjdGlvbkNvbmZpZyhjb2xsZWN0aW9uSWQpKSB8fCB7XG4gICAgc2F2ZURpcjogXCJkb2NzXCIsXG4gICAgbWFwcGluZ3M6IFtdLFxuICB9O1xuXG4gIC8vIGFwcGx5IG1hcHBpbmdzICh0aGlzIHdpbGwgc2V0IGZvbGRlci1iYXNlZCBgZmlsZWAgZmllbGRzKVxuICBhcHBseU1hcHBpbmdzVG9NYW5pZmVzdChwYWdlc01hbmlmZXN0LCBjb2xsQ2ZnKTtcblxuICAvLyBlbnN1cmUgbG9jYWwgZmlsZXMvZm9sZGVycyBleGlzdCBhbmQgbm9ybWFsaXplIGFueSByZWxhdGl2ZSBmaWxlbmFtZXNcbiAgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aHMobm9kZTogYW55LCBwYXJlbnREaXI6IHN0cmluZyB8IG51bGwpIHtcbiAgICAvLyBpZiBub2RlLmZpbGUgaXMgYWJzZW50LCBhcHBseSBpbmhlcml0YW5jZSAoYXBwbHlNYXBwaW5nc1RvTWFuaWZlc3Qgc2hvdWxkIGhhdmUgc2V0IGl0KVxuICAgIGlmICghbm9kZS5maWxlKSB7XG4gICAgICBjb25zdCBzbHVnID0gc2x1Z2lmeVRpdGxlKG5vZGUudGl0bGUgfHwgXCJ1bnRpdGxlZFwiKTtcbiAgICAgIGNvbnN0IGRpciA9IHBhcmVudERpclxuICAgICAgICA/IHBhdGguam9pbihwYXJlbnREaXIsIHNsdWcpXG4gICAgICAgIDogcGF0aC5qb2luKGNvbGxDZmcuc2F2ZURpciB8fCBcImRvY3NcIiwgc2x1Zyk7XG4gICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oZGlyLCBcIlJFQURNRS5tZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm9kZS5maWxlIGlzIGJhcmUgZmlsZW5hbWUgd2l0aG91dCBkaXIgLT4gcHV0IGludG8gcGFyZW50RGlyIG9yIHNhdmVEaXJcbiAgICAgIGNvbnN0IGRpcm5hbWVPZkZpbGUgPSBwYXRoLmRpcm5hbWUobm9kZS5maWxlKTtcbiAgICAgIGlmICghZGlybmFtZU9mRmlsZSB8fCBkaXJuYW1lT2ZGaWxlID09PSBcIi5cIikge1xuICAgICAgICBjb25zdCBiYXNlRGlyID0gcGFyZW50RGlyIHx8IGNvbGxDZmcuc2F2ZURpciB8fCBcImRvY3NcIjtcbiAgICAgICAgbm9kZS5maWxlID0gcGF0aC5qb2luKGJhc2VEaXIsIG5vZGUuZmlsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGRpcmVjdG9yeSBpZiBuZWVkZWQgKG5vdCB3cml0aW5nIGZpbGUgY29udGVudHMgaGVyZSwganVzdCBlbnN1cmluZyBzdHJ1Y3R1cmUpXG4gICAgY29uc3QgZGlyVG9NYWtlID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSk7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGRpclRvTWFrZSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRW5zdXJlZCBkaXJlY3RvcnkgJHtkaXJUb01ha2V9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBlbnN1cmUgZGlyZWN0b3J5ICR7ZGlyVG9NYWtlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW2RyeS1ydW5dIHdvdWxkIGVuc3VyZSBkaXJlY3RvcnkgJHtkaXJUb01ha2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGF3YWl0IG5vcm1hbGl6ZVBhdGhzKGMsIG5vZGVEaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vcm1hbGl6ZSBmb3IgZWFjaCByb290XG4gIGZvciAoY29uc3Qgcm9vdCBvZiBwYWdlc01hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXdhaXQgbm9ybWFsaXplUGF0aHMocm9vdCBhcyBhbnksIG51bGwpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIkNvbXBsZXRlZCBwYXRoIG5vcm1hbGl6YXRpb24gZm9yIG1hbmlmZXN0XCIpO1xuXG4gIC8vIHJ1biBzeW5jIHJlY3Vyc2lvblxuICBmb3IgKGNvbnN0IHAgb2YgcGFnZXNNYW5pZmVzdC5wYWdlcykge1xuICAgIGF3YWl0IHN5bmNQYWdlKGNvbGxlY3Rpb25JZCwgcGFnZXNNYW5pZmVzdCwgcCwgbnVsbCwgeyBtb2RlLCBkcnlSdW4gfSk7XG4gIH1cblxuICAvLyBwZXJzaXN0IG1hbmlmZXN0ICh3cml0ZSBhbnkgY3JlYXRlZCBpZHMgYmFjaylcbiAgYXdhaXQgcGVyc2lzdFBhZ2VzTWFuaWZlc3QoY29sbGVjdGlvbklkLCBwYWdlc01hbmlmZXN0LCBkcnlSdW4pO1xuICBsb2dnZXIuaW5mbyhcIkRvbmUuXCIpO1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cblxuLyogYmluL2NsaS50c1xuICAgLSBQYXJzZSBDTEkgZmxhZ3MgZmlyc3QgKHNvIC0tYXBpLWtleSBpcyBhcHBsaWVkIGJlZm9yZSBtb2R1bGVzIGltcG9ydCBlbnYpXG4gICAtIFN1cHBvcnQgcmVwZWF0YWJsZSAtLWNvbGxlY3Rpb24gZmxhZ3NcbiAgIC0gVGhlbiBkeW5hbWljYWxseSBpbXBvcnQgdGhlIHJlc3Qgb2YgdGhlIGFwcFxuKi9cblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4uL2xpYi9sb2dnZXJcIjtcblxuY29uc3QgcmF3QXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmxldCBERUJVRyA9IGZhbHNlO1xuXG4vLyBwYXJzZSBmbGFncyAocmVwZWF0YWJsZSAtLWNvbGxlY3Rpb24pXG5jb25zdCBmbGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiA9IHt9O1xuY29uc3QgcG9zaXRpb25hbHM6IHN0cmluZ1tdID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgY29uc3QgYSA9IHJhd0FyZ3NbaV07XG4gIGlmIChhID09PSBcIi0taGVscFwiIHx8IGEgPT09IFwiLWhcIikge1xuICAgIHBvc2l0aW9uYWxzLnB1c2goXCItLWhlbHBcIik7XG4gIH0gZWxzZSBpZiAoYSA9PT0gXCItLXZlcmJvc2VcIikge1xuICAgIHBvc2l0aW9uYWxzLnB1c2goXCItLXZlcmJvc2VcIik7XG4gIH0gZWxzZSBpZiAoYS5zdGFydHNXaXRoKFwiLS1jb2xsZWN0aW9uPVwiKSB8fCBhLnN0YXJ0c1dpdGgoXCItLWNvbGxlY3Rpb246XCIpKSB7XG4gICAgY29uc3QgdmFsID0gYS5zcGxpdCgvWzo9XS8pWzFdIHx8IFwiXCI7XG4gICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgKGZsYWdzLmNvbGxlY3Rpb24gYXMgc3RyaW5nW10pLnB1c2godmFsKTtcbiAgfSBlbHNlIGlmIChhID09PSBcIi0tY29sbGVjdGlvblwiKSB7XG4gICAgLy8gc3VwcG9ydCBgLS1jb2xsZWN0aW9uIDx2YWx1ZT5gXG4gICAgY29uc3QgdmFsID0gcmF3QXJnc1tpICsgMV07XG4gICAgaWYgKHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgICAoZmxhZ3MuY29sbGVjdGlvbiBhcyBzdHJpbmdbXSkucHVzaCh2YWwpO1xuICAgICAgaSsrOyAvLyBjb25zdW1lIG5leHQgYXJnXG4gICAgfVxuICB9IGVsc2UgaWYgKGEuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgY29uc3QgW2ssIHZdID0gYS5yZXBsYWNlKC9eLS0vLCBcIlwiKS5zcGxpdChcIj1cIik7XG4gICAgZmxhZ3Nba10gPSB2ID09PSB1bmRlZmluZWQgPyB0cnVlIDogdjtcbiAgfSBlbHNlIHtcbiAgICBwb3NpdGlvbmFscy5wdXNoKGEpO1xuICB9XG59XG5cbi8vIElmIHVzZXIgcGFzc2VkIC0tYXBpLWtleSBvciAtLWJhc2UtdXJsLCBzZXQgdGhlbSBpbW1lZGlhdGVseSBzbyBkeW5hbWljIGltcG9ydHMgc2VlIHRoZW0uXG5pZiAoZmxhZ3NbXCJhcGkta2V5XCJdKSB7XG4gIC8vIGRvIE5PVCBsb2cgdGhlIGtleSB0byBhdm9pZCBhY2NpZGVudGFsIGxlYWthZ2UgaW4gbG9nc1xuICBwcm9jZXNzLmVudi5PVVRMSU5FX0FQSV9LRVkgPSBTdHJpbmcoZmxhZ3NbXCJhcGkta2V5XCJdKTtcbn1cbmlmIChmbGFnc1tcImJhc2UtdXJsXCJdKSB7XG4gIHByb2Nlc3MuZW52Lk9VVExJTkVfQkFTRV9VUkwgPSBTdHJpbmcoZmxhZ3NbXCJiYXNlLXVybFwiXSk7XG59XG5cbmlmIChwb3NpdGlvbmFscy5pbmNsdWRlcyhcIi0tdmVyYm9zZVwiKSkge1xuICBERUJVRyA9IHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHtcbiAgbGV2ZWw6IERFQlVHID8gXCJERUJVR1wiIDogXCJJTkZPXCIsXG59KTtcblxuaWYgKHBvc2l0aW9uYWxzLmluY2x1ZGVzKFwiLS1oZWxwXCIpIHx8IGZsYWdzLmhlbHAgfHwgZmxhZ3MuaCkge1xuICBjb25zb2xlLmxvZyhgXG5Vc2FnZTpcbiAgT1VUTElORV9BUElfS0VZPS4uLiBidW4gcnVuIGJpbi9jbGkudHMgW2NvbW1hbmRdIFstLWNvbGxlY3Rpb249SURdLi4uIFstLWRyeS1ydW5dIFstLWFwaS1rZXk9XCIuLi5cIl1cblxuQ29tbWFuZHM6XG4gIHNldHVwICAgICAgICAgICAgICAgICAgICAtIGludGVyYWN0aXZlIHNldHVwOiBsaXN0IGNvbGxlY3Rpb25zLCBjaG9vc2Ugb25lXG4gIGxpc3QtY29sbGVjdGlvbnMgICAgICAgICAtIHByaW50IGNvbGxlY3Rpb25zXG4gIGluaXQgLS1jb2xsZWN0aW9uPUlEICAgICAtIGJvb3RzdHJhcCBwYWdlcy5qc29uICsgbWFya2Rvd24gKHJlcGVhdGFibGUpXG4gIHB1bGwgLS1jb2xsZWN0aW9uPUlEICAgICAtIHB1bGwgcmVtb3RlIGNoYW5nZXMgKHJlcGVhdGFibGUpXG4gIHB1c2ggLS1jb2xsZWN0aW9uPUlEICAgICAtIHB1c2ggbG9jYWwgY2hhbmdlcyAocmVwZWF0YWJsZSlcbiAgc3luYyAtLWNvbGxlY3Rpb249SUQgICAgIC0gYmlkaXJlY3Rpb25hbCBzeW5jIChyZXBlYXRhYmxlKVxuXG5GbGFnczpcbiAgLS1jb2xsZWN0aW9uPUlEICAgICAgICAgIFJlcGVhdGFibGU7IHJ1biBjb21tYW5kIGFnYWluc3QgbXVsdGlwbGUgY29sbGVjdGlvbnNcbiAgLS1hcGkta2V5PVwiLi4uXCIgICAgICAgICAgUHJvdmlkZSBPdXRsaW5lIEFQSSBrZXkgKG92ZXJyaWRlcyBlbnYgdmFyKVxuICAtLWJhc2UtdXJsPVwiLi4uXCIgICAgICAgICBQcm92aWRlIE91dGxpbmUgYmFzZSBVUkwgKG92ZXJyaWRlcyBlbnYgdmFyKVxuICAtLWRyeS1ydW4gICAgICAgICAgICAgICAgUHJldmlldyBvbmx5XG4gIC0taGVscCwgLWhcbkV4YW1wbGVzOlxuICBPVVRMSU5FX0FQSV9LRVk9Li4uIGJ1bnggQGRvY2tzdGF0L291dGxpbmUtc3luYyAtLWNvbGxlY3Rpb249XCJpZDFcIiAtLWNvbGxlY3Rpb249XCJpZDJcIiBzeW5jIC0tZHJ5LXJ1blxuICBidW4gcnVuIGJpbi9jbGkudHMgc3luYyAtLWFwaS1rZXk9XCJza194eHhcIiAtLWNvbGxlY3Rpb249XCJpZDFcIlxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc3QgeyBsb2FkVG9wQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9saWIvY29uZmlnXCIpO1xuY29uc3QgeyBsaXN0Q29sbGVjdGlvbnNQcm9tcHQsIGJvb3RzdHJhcENvbGxlY3Rpb24gfSA9IGF3YWl0IGltcG9ydChcbiAgXCIuLi9saWIvaW5pdFwiXG4pO1xuY29uc3QgeyBydW5TeW5jIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9saWIvc3luY0VuZ2luZVwiKTtcblxubG9nZ2VyLmRlYnVnKFwiUGFyc2luZyBwb3NpdGlvbmFsc1wiKTtcbmNvbnN0IGNtZCA9IHBvc2l0aW9uYWxzWzBdIHx8IFwic3luY1wiO1xuY29uc3QgRFJZX1JVTiA9IEJvb2xlYW4oZmxhZ3NbXCJkcnktcnVuXCJdKTtcbmNvbnN0IGNvbGxlY3Rpb25zRnJvbUNsaSA9IChmbGFncy5jb2xsZWN0aW9uIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbmxvZ2dlci5kZWJ1ZyhcbiAgYFBhcnNlZCBjbWQ9JHtjbWR9IERSWV9SVU49JHtEUllfUlVOfSBjb2xsZWN0aW9uc0Zyb21DbGk9JHtjb2xsZWN0aW9uc0Zyb21DbGl9YCxcbik7XG5cbnRyeSB7XG4gIGxvZ2dlci5kZWJ1ZyhcIkxvYWRpbmcgdG9wIGNvbmZpZ1wiKTtcbiAgY29uc3QgdG9wQ29uZmlnID0gKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfTtcbiAgbG9nZ2VyLmRlYnVnKGBMb2FkZWQ6ICR7SlNPTi5zdHJpbmdpZnkodG9wQ29uZmlnKX1gKTtcblxuICBjb25zdCByZXNvbHZlVGFyZ2V0cyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiUmVzb2x2aW5nIHRhcmdldHNcIik7XG4gICAgaWYgKGNvbGxlY3Rpb25zRnJvbUNsaS5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBGb3VuZCBDb2xsZWN0aW9uIGZyb20gY2xpOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25zRnJvbUNsaSl9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbnNGcm9tQ2xpO1xuICAgIH1cbiAgICBpZiAodG9wQ29uZmlnLmNvbGxlY3Rpb25zICYmIHRvcENvbmZpZy5jb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBGb3VuZCBjb2xsZWN0aW9ucyBpbiBUb3AgQ29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRvcENvbmZpZyl9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLm1hcCgoYykgPT4gYy5pZCk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFwiQ291bGRuJ3QgcmVzb2x2ZSB0YXJnZXRzXCIpO1xuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICBpZiAoY21kID09PSBcImxpc3QtY29sbGVjdGlvbnNcIikge1xuICAgIGNvbnNvbGUuZGVidWcoXCJMaXN0aW5nIGNvbGxlY3Rpb25zXCIpO1xuICAgIGF3YWl0IGxpc3RDb2xsZWN0aW9uc1Byb21wdCh7IGRyeVJ1bjogRFJZX1JVTiwgbm9uSW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwic2V0dXBcIikge1xuICAgIGNvbnNvbGUuZGVidWcoXCJSdW5uaW5nIHNldHVwXCIpO1xuICAgIGF3YWl0IGxpc3RDb2xsZWN0aW9uc1Byb21wdCh7IGRyeVJ1bjogRFJZX1JVTiwgbm9uSW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwiaW5pdFwiKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhcIlJ1bm5pbmcgaW5pdFwiKTtcbiAgICBjb25zdCB0YXJnZXRzID0gcmVzb2x2ZVRhcmdldHMoKTtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluaXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbGxlY3Rpb24uIFByb3ZpZGUgLS1jb2xsZWN0aW9uIG9yIHJ1biBzZXR1cC5cIixcbiAgICAgICk7XG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uSWQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXG49PT4gYm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7RFJZX1JVTn0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBib290c3RyYXBDb2xsZWN0aW9uKHsgY29sbGVjdGlvbklkLCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwicHVsbFwiIHx8IGNtZCA9PT0gXCJwdXNoXCIgfHwgY21kID09PSBcInN5bmNcIikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIlBhcnNpbmcgQ01EIChwdWxsL3B1c2gvc3luYylcIik7XG4gICAgY29uc3QgdGFyZ2V0cyA9IHJlc29sdmVUYXJnZXRzKCk7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW1hbmQgXCIke2NtZH1cIiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY29sbGVjdGlvbiBpZC4gUHJvdmlkZSB3aXRoIC0tY29sbGVjdGlvbj1JRCBvciBydW4gc2V0dXAuYCxcbiAgICAgICk7XG4gICAgY29uc3QgbW9kZSA9IGNtZCA9PT0gXCJwdWxsXCIgPyBcInB1bGxcIiA6IGNtZCA9PT0gXCJwdXNoXCIgPyBcInB1c2hcIiA6IFwic3luY1wiO1xuICAgIGZvciAoY29uc3QgY29sbGVjdGlvbklkIG9mIHRhcmdldHMpIHtcbiAgICAgIGF3YWl0IHJ1blN5bmMoeyBjb2xsZWN0aW9uSWQsIG1vZGU6IG1vZGUgYXMgYW55LCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGxvZ2dlci5lcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NtZH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgY29uc29sZS5lcnJvcihcIkVSUk9SOlwiLCBlcnI/Lm1lc3NhZ2UgfHwgZXJyKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7bUtBcUJPLE1BQU0sQ0FBTyxDQUNWLFNBQ0EsT0FDQSxjQUNBLEtBS1IsV0FBVyxDQUFDLEVBS1QsQ0FDRCxJQUNFLFFBQVEsT0FDUixTQUFTLEdBQ1QsWUFBWSxHQUNaLFFBQ0UsR0FBUSxDQUFDLEVBRWIsS0FBSyxTQUFXLEVBQ2hCLEtBQUssY0FBZ0IsRUFDckIsS0FBSyxLQUFPLEVBR1osSUFBTSxFQUFhLE9BQU8sVUFBWSxlQUFpQixRQUFRLElBQUksU0FDN0QsRUFDSixPQUFPLFVBQVksZUFDakIsUUFBUSxVQUNSLFFBQVEsT0FBTyxNQUNuQixLQUFLLE9BQVMsSUFBVyxHQUFjLEVBR2pDLFNBQVMsQ0FBQyxFQUFpQixDQUNqQyxPQUNFLEVBQVksSUFBVSxHQUN0QixFQUFZLElBQVUsRUFBWSxLQUFLLFdBQ3ZDLEVBQVksS0FBSyxVQUFZLEVBQVksS0FJckMsU0FBUyxDQUFDLEVBQWtDLENBQ2xELE9BQVEsT0FDRCxRQUNILE1BQU8sQ0FBRSxJQUFLLFFBQVMsTUFBTyxFQUFLLE1BQU8sTUFBTyxjQUFJLE1BQ2xELE9BQ0gsTUFBTyxDQUFFLElBQUssT0FBUSxNQUFPLEVBQUssS0FBTSxNQUFPLElBQUksTUFDaEQsT0FDSCxNQUFPLENBQUUsSUFBSyxP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USxPQUFRLENBQ2xCLFFBQVEsTUFBTSxjQUFjLEVBQzVCLElBQU0sRUFBVSxFQUFlLEVBQy9CLElBQUssRUFBUSxPQUNYLE1BQU0sSUFBSSxNQUNSLDJFQUNGLEVBQ0YsUUFBVyxLQUFnQixFQUN6QixRQUFRLElBQ047QUFBQSwrQkFBa0MsYUFBd0IsSUFDNUQsRUFDQSxNQUFNLEdBQW9CLENBQUUsZUFBYyxPQUFRLENBQVEsQ0FBQyxFQUU3RCxRQUFRLEtBQUssQ0FBQyxFQUdoQixHQUFJLElBQVEsUUFBVSxJQUFRLFFBQVUsSUFBUSxPQUFRLENBQ3RELEVBQU8sTUFBTSw4QkFBOEIsRUFDM0MsSUFBTSxFQUFVLEVBQWUsRUFDL0IsSUFBSyxFQUFRLE9BQ1gsTUFBTSxJQUFJLE1BQ1IsWUFBWSxvRkFDZCxFQUNGLElBQU0sRUFBTyxJQUFRLE9BQVMsT0FBUyxJQUFRLE9BQVMsT0FBUyxPQUNqRSxRQUFXLEtBQWdCLEVBQ3pCLE1BQU0sR0FBUSxDQUFFLGVBQWMsS0FBTSxFQUFhLE9BQVEsQ0FBUSxDQUFDLEVBRXBFLFFBQVEsS0FBSyxDQUFDLEVBR2hCLEVBQU8sTUFBTSxvQkFBb0IsR0FBSyxFQUN0QyxRQUFRLEtBQUssQ0FBQyxFQUNkLE1BQU8sRUFBVSxDQUNqQixRQUFRLE1BQU0sU0FBVSxHQUFLLFNBQVcsQ0FBRyxFQUMzQyxRQUFRLEtBQUssQ0FBQyIsCiAgImRlYnVnSWQiOiAiRTdGNkI3ODAzNkI1MEFGNjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|